#include "ESP8266.h"
#include "usart.h"	
#include <string.h>
#include "delay.h"       
#include "led.h"       
#include "key.h"
#include "Timer.h"
#include "ADS129x.h"
#include "Cyton_Esp12Data.h"

#include "myQueue.h"
#include "cyton_cmd_pub.h"



_WIFI_Info *WIFI_Info ; //WIFI数据结构

//TCP传输需要手动设置 WIFI名称 密码  IP地址 端口
u8 M8266_CWJAP[60]="AT+CWJAP=\"OPPORENO\",\"12345678\"\r\n";		//连接AP ssid: xxx  密码：xxx
//u8 M8266_CIPSTART[60]="AT+CIPSTART=\"TCP\",\"192.168.43.1\",10500\r\n";
u8 M8266_SAVETRANSLINK[60] = "AT+SAVETRANSLINK=1,\"192.168.0.166\",8083,\"TCP\"\r\n";//保存配网信息
	


//匿名发送数据格式	
//AA AA F1 21(4*8+1=33) ... test CHECK	//4+32+1+1=38字节  8通道数据
//38次采样1帧 队列长度1444字节
u8 Wifi_Sendbuf_Init(void)
{
		u16 i;
	
		WIFI_Info->datalength = ADS129X_USE_CANNLE * 3  + 9;//一次采样要发送的数据长度 39
		memset(WIFI_Info->sendbuf, 0, WIFI_SEND_LENGTH);//清零
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
		//匿名上位机协议
		for(i=0;i<ADS129x_info.Ads129x_Write_Num;i++) //一包N次采样
		{		
					//帧头
					WIFI_Info->sendbuf[0 + WIFI_Info->datalength*i] = 0xA0;
					//WIFI_Info->sendbuf[1 + WIFI_Info->datalength*i] = 0xFF;
					//WIFI_Info->sendbuf[2 + WIFI_Info->datalength*i] = 0xF1;
					//WIFI_Info->sendbuf[3 + WIFI_Info->datalength*i] = ADS129X_USE_CANNLE*4 +1;	//有效数据长度 32 +1 = 33
		}	
		
		
		return 1;
		
}


//发送指令，并判断指定字符串是否缓冲区中
//返回-1 没有指定的串
//0-125 字符串在数组中的位置
s16 ESP8266_SendCmd(u8* cmd, u8* result, u16 timeOut)
{		
		s16 res = -1;
	
		if (NULL == strstr(USART2_RX_BUF, "+IPD,")) {
	  		ESP8266_CLEAR();//清空缓冲区
		}
		
		USARTx_Send(ESP8266_UART,(uint8_t*) cmd, strlen(cmd));
		while(timeOut > 0) {
			timeOut --;
			delay_ms(1);	
			res = Str_search(ESP8266_RX_BUF, ESP8266_RX_LEN, result);//查询字符串
			if (res > 0) {
				ESP8266_DEBUG("ESP8266 rsp:%s \r\n",ESP8266_RX_BUF);	
				return res;
			}
		}
		
		return res;
}

s16 ESP8266_SendData(u8* cmd, int iLen)
{		
		s16 res;
	
    	USARTx_Send(ESP8266_UART,(uint8_t*) cmd, iLen);
		return res;
}

//IO初始化
void ESP8266_IO_Init(void)
{
 
	 GPIO_InitTypeDef  GPIO_InitStructure;
		
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB端口时钟
		
		//B6
	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;				 
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;		 //IO口速度为2MHz
	 GPIO_Init(GPIOB, &GPIO_InitStructure);			

		
	 ESP8266_PWOEROFF;
	 //ESP8266_RST=1; //复位
}



u8 ESP8266_SET_FLAG=0;

//设置检测
void ESP8266_SET(void)
{
		u16 ret=0;
		if (KEYPWR == 0)//按键按下
		{
				LED_2=LED_ON;
				while( KEYPWR == 0)
				{
						delay_ms(10);
						ret++;
						if ( ret > 300 )//3s
						{
								LED_2=LED_OFF;
								ESP8266_SET_FLAG=1;//设置蓝牙
								while( KEYPWR == 0);
										
								return ;//退出函数
						}
				}
				LED_2=LED_OFF;
		}
}



void ESP8266_Config(void)
{
		ESP8266_Goto_Cmd();//进入AT指令模式
		
		ESP8266_DEBUG("设置工作模式：STA \r\n");
		while(1)
		{
				if(ESP8266_SendCmd(CWMODE, "OK", 500) >= 0)//模块工作模式 设置AP模式
						break;
				else
						LED2=!LED2;				
		}
		
		ESP8266_DEBUG("设置工作模式：单链接 \r\n");
		while(1)
		{
				if(ESP8266_SendCmd(CIPMUX, "OK", 500) >= 0)//设置单链接模式，用于透传，开机默认单链接
						break;
				else
						LED2=!LED2;				
		}
		ESP8266_DEBUG("\r\n等待连接WIFI\r\n");
		while(1)
		{
				if(ESP8266_SendCmd(M8266_CWJAP, "OK", 1500) >= 0)//连接AP WIFI热点SSID和密码
						break;
				else
				{
						LED2=!LED2;	
						ESP8266_DEBUG("等待 ");
				}
		}
		
		ESP8266_DEBUG("\r\n查看IP地址");
		while(1)
		{
				if(ESP8266_SendCmd(CIFSR, "OK", 500) >= 0)//查询连接
						break;
				else
				{
						LED2=!LED2;	
						ESP8266_DEBUG("等待 ");
				}					
		}
		
		ESP8266_DEBUG("\r\n建立TCP连接 \r\n");
		while(1)
		{
				if(ESP8266_SendCmd(M8266_SAVETRANSLINK, "OK", 500) >= 0)//建立TCP连接
						break;
				else
				{
						LED2=!LED2;		
						ESP8266_DEBUG("失败");
				}					
		}
				
		ESP8266_DEBUG("\r\n设置波特率透传 \r\n");
		while(1)
		{
				if(ESP8266_SendCmd(ESP_USARTDEF, "OK", 500) >= 0)//设置波特率 及流控
						break;
				else
						LED2=!LED2;				
		}
		
		ESP8266_uart_init(ESP_BAUD); //初始化	
		ESP8266_out_Cmd();//退出指令模式
		
		LED1=LED_OFF;	
		LED2=LED_OFF;			
		ESP8266_DEBUG("设置成功\r\n");
}

//进入AT指令模式
void ESP8266_Goto_Cmd(void)
{		
		delay_ms(500);
		ESP8266_PWOEROFF;
		delay_ms(500);
		ESP8266_PWOERON;

//		ESP8266_RST=0;
//		delay_ms(500);
//		ESP8266_RST=1;
//		delay_ms(500);

		ESP8266_DEBUG("进入AT指令模式\r\n");
		ESP8266_DEBUG("默认波特率 %d\r\n",ESP_BAUD);
		ESP8266_uart_init(ESP_BAUD);
		ESP8266_SendCmd("+++", "OK", 1200);//退出透传
		if(ESP8266_SendCmd(AT, "OK", 500) >= 0) //模块有效性检查
		{
				ESP8266_DEBUG("WIFI初始化成功\r\n");
				return;
		}
		while(1)
		{				
				ESP8266_DEBUG("当前波特率 115200\r\n");
				ESP8266_uart_init(115200);
				ESP8266_SendCmd("+++", "OK", 1200);//退出透传
				if(ESP8266_SendCmd(AT, "OK", 500) >= 0) //模块有效性检查
				{
						break;
				}
				else
						LED2=!LED2;		
				
				ESP8266_DEBUG("当前波特率 460800\r\n");
				ESP8266_uart_init(460800);
				ESP8266_SendCmd("+++", "OK", 1200);//退出透传
				if(ESP8266_SendCmd(AT, "OK", 500) >= 0) //模块有效性检查
				{
						break;
				}
				else
						LED2=!LED2;	
				
				ESP8266_DEBUG("当前波特率 921600\r\n");
				ESP8266_uart_init(921600);
				ESP8266_SendCmd("+++", "OK", 1200);//退出透传
				if(ESP8266_SendCmd(AT, "OK", 500) >= 0) //模块有效性检查
				{
						break;
				}
				else
						LED2=!LED2;					
		}
		//ESP8266_SendCmd(RST, "OK", 500) ;//复位
		//USART_ITConfig(ESP8266_UART, USART_IT_RXNE, DISABLE);//串口接收中断	
}
//进入透传模式
void ESP8266_out_Cmd(void)
{
		ESP8266_DEBUG("退出AT指令模式\r\n");

		ESP8266_SendCmd(RST, "OK", 500) ;//复位
		USART_ITConfig(ESP8266_UART, USART_IT_RXNE, DISABLE);//串口接收中断	
}


void ESP8266_Config_Http_connectTcp(void);

#define toNet32(A)   ((( (unsigned int)(A) & 0xff000000) >> 24)|(( (unsigned int)(A) & 0x00ff0000) >> 8)|(( (unsigned int)(A) & 0x0000ff00) << 8)|(( (unsigned int)(A) & 0x000000ff) << 24)) 

int g_iHz = 0;

void Cyton_UartPraseLoop()
{
	//ESP8266_RX_BUF, ESP8266_RX_LEN,//
	CYTON_CMD_INFO_T *pstCmdInfo = NULL;
	char *pszIndex = ESP8266_RX_BUF;
	int iLen = ESP8266_RX_LEN;

	while (iLen > 0) {
		if (iLen >= sizeof(CYTON_CMD_INFO_T)) {
			pstCmdInfo = (CYTON_CMD_INFO_T *) pszIndex;
			if (CYTON_CMD_HEAD == toNet32(pstCmdInfo->uiHead)) {
				ESP8266_DEBUG("Fine cmd %08x\r\n", toNet32(pstCmdInfo->iType));
				ESP8266_DEBUG("Fine p1 %08x\r\n", toNet32(pstCmdInfo->uiParam1));
				ESP8266_DEBUG("Fine p2 %08x\r\n", toNet32(pstCmdInfo->uiParam2));
				if (toNet32(pstCmdInfo->iType) == CYTON_CMD_HZ) {
					g_iHz = toNet32(pstCmdInfo->uiParam1);
					ESP8266_DEBUG("g_iHz %d\r\n", g_iHz);
				} else if (toNet32(pstCmdInfo->iType) == CYTON_CMD_START) {
					ESP8266_DEBUG("Start collector %d Hz\r\n", g_iHz);
					//CytonProcess_TimerCollStart(g_iHz);
					ADS129x_ReInit(1, 1);	
					CytonEsp12_SetStreamStat(1);
				} else if (toNet32(pstCmdInfo->iType) == CYTON_CMD_STOP) {
					ESP8266_DEBUG("Stop collector\r\n");
					CytonEsp12_SetStreamStat(0);
					ADS129x_Stop();	
					//CytonProcess_TimerCollStop();
				}

				ESP8266_CLEAR();
			} 
		} else {
			break;
		}

		pszIndex ++;
		iLen --;
	}

	//ESP8266_CLEAR();
}

void ESP8266_Init(void)
{
		ESP8266_PWOERON;
		delay_s(2);
		ESP8266_DEBUG("进入AT指令模式1111\r\n");
		ESP8266_DEBUG("默认波特率 %d\r\n",ESP_BAUD);
		ESP8266_uart_init(ESP_BAUD);
		delay_s(2);

		//while (0) {
			//Cyton_UartPraseLoop();
			//CytonProcess_Loop();
			//delay_ms(2);
		//}		
}

//串口配网
void Set_WIFI(void)
{
		u8 u_recbuf[200];
		u16 u_reclen;
	
		Main_printf("开启AT配网\r\n");
		USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//串口接受中断

		LED1=LED_OFF;
		LED2=LED_OFF;	
	
		Main_printf("网络及IP设置\r\n\r\n");	
		Main_printf("AT配网，有效内容不要超60字节,例:\r\n\r\n");
		Main_printf("设置名称密码 : AT+CWJAP_DEF=\"OPPORENO\",\"12345678\"\r\n");
		Main_printf("设置TCP连接  : AT+SAVETRANSLINK=1,\"192.168.0.166\",8083,\"TCP\"\r\n");
		Main_printf("退出设置     : AT+OVER\r\n\r\n");
	
		while(1)
		{	
				if(USART_RX_STA & 0x8000)//接收到数据
				{
						//搬运数据
						u_reclen=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
						memcpy(u_recbuf,USART_RX_BUF,u_reclen);//复制内容
						USART_RX_STA=0;
						if(u_recbuf[0]=='A' && u_recbuf[1]=='T' && u_recbuf[2]=='+')//AT指令
						{
								if(	u_recbuf[3]=='C' && u_recbuf[4]=='W' && u_recbuf[5]=='J'  && u_recbuf[6]=='A' 
									&& u_recbuf[7]=='P' &&  u_recbuf[8]=='_' && u_recbuf[9]=='D' && u_recbuf[10]=='E'
									&& u_recbuf[11]=='F' && u_recbuf[12]=='=') //设置名称
								{
										Main_printf("设置名称密码指令:");
										memset(M8266_CWJAP, 0, 60);
										memcpy(M8266_CWJAP,u_recbuf,u_reclen);//复制内容
										M8266_CWJAP[u_reclen] = 0x0d;
										M8266_CWJAP[u_reclen+1] = 0x0a;
										ESP8266_DEBUG("%s\r\n",M8266_CWJAP);
								}

								else	if(	u_recbuf[3]=='S' && u_recbuf[4]=='A' && u_recbuf[5]=='V'  && u_recbuf[6]=='E' 
									&& u_recbuf[7]=='T' &&  u_recbuf[8]=='R' && u_recbuf[9]=='A' && u_recbuf[10]=='N'
									&& u_recbuf[11]=='S' &&  u_recbuf[12]=='L' && u_recbuf[13]=='I' && u_recbuf[14]=='N'
									&& u_recbuf[15]=='K' && u_recbuf[16]=='=') //设置名称
								{
										Main_printf("设置IP端口指令:");
										memset(M8266_SAVETRANSLINK, 0, 60);
										memcpy(M8266_SAVETRANSLINK,u_recbuf,u_reclen);//复制内容
										M8266_SAVETRANSLINK[u_reclen] = 0x0d;
										M8266_SAVETRANSLINK[u_reclen+1] = 0x0a;
										ESP8266_DEBUG("%s\r\n",M8266_SAVETRANSLINK);
								}
								else if(u_recbuf[3]=='O' && u_recbuf[4]=='V' && u_recbuf[5]=='E'  && u_recbuf[6]=='R') //设置完成
								{
										Main_printf("请等待设置完成\r\n");
										break;
								}
								else 
								{
										Main_printf("错误的指令\r\n");
								}
						}
				}
				else
				{
						delay_ms(10);   
				}		
		}
		USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//关闭串口接受中断

		//要设置的参数
		Main_printf("要设置名称密码:	%s",M8266_CWJAP);
		Main_printf("要设置TCP连接:	%s\r\n",M8266_SAVETRANSLINK);
		
		ESP8266_Config(); //设置开机自动透传
		LED1=LED_OFF;
		LED2=LED_OFF;
			
}


void ESP8266_Config_Http_connectTcp(void)
{
		ESP8266_Goto_Cmd();//进入AT指令模式

		
		ESP8266_DEBUG("select version:\r\n");
		while(1)
		{
				if(ESP8266_SendCmd("AT+GMR\r\n", "OK", 500) >= 0)//设置单链接模式，用于透传，开机默认单链接
						break;
				else
						LED2=!LED2;				
		}

		ESP8266_DEBUG("设置工作模式：AP \r\n");
		while(1)
		{
				/*Soft ap*/
				if(ESP8266_SendCmd("AT+CWMODE_DEF=2\r\n", "OK", 500) >= 0)//模块工作模式 设置AP模式
						break;
				else
						LED2=!LED2;				
		}

		ESP8266_DEBUG("Set Wifi Openbci open\r\n");
		while(1)
		{
				/*Soft ap*/
				if(ESP8266_SendCmd("AT+CWSAP_DEF=\"Openbci_1234\","",5,0\r\n", "OK", 500) >= 0)//模块工作模式 设置AP模式
						break;
				else
						LED2=!LED2;				
		}

		ESP8266_DEBUG("Set Wifi ip 192.168.4.1\r\n");
		while(1)
		{
				/*Soft ap*/
				if(ESP8266_SendCmd("AT+CIPAP_DEF=\"192.168.4.1\",\"192.168.4.1\",\"255.255.255.0\"\r\n", "OK", 500) >= 0)//模块工作模式 设置AP模式
						break;
				else
						LED2=!LED2;				
		}

		ESP8266_DEBUG("Set Wifi dhcp\r\n");
		while(1)
		{
				/*Soft ap*/
				if(ESP8266_SendCmd("AT+CWDHCP_DEF=0,1\r\n", "OK", 500) >= 0)//模块工作模式 设置AP模式
						break;
				else
						LED2=!LED2;				
		}

		
		ESP8266_Goto_Cmd();//进入AT指令模式

		ESP8266_DEBUG("设置工作模式：非透传\r\n");
		while(1)
		{
				if(ESP8266_SendCmd("AT+CIPMODE=0\r\n", "OK", 500) >= 0)//设置单链接模式，用于透传，开机默认单链接
						break;
				else
						LED2=!LED2;				
		}

		
		ESP8266_DEBUG("设置工作模式：多链接 \r\n");
		while(1)
		{
				if(ESP8266_SendCmd("AT+CIPMUX=1\r\n", "OK", 500) >= 0)//设置单链接模式，用于透传，开机默认单链接
						break;
				else
						LED2=!LED2;				
		}

		ESP8266_DEBUG("设置工作模式：80\r\n");
		while(1)
		{
				if(ESP8266_SendCmd("AT+CIPSERVER=1,80\r\n", "OK", 500) >= 0)//设置单链接模式，用于透传，开机默认单链接
						break;
				else
						LED2=!LED2;				
		}
		

		ESP8266_DEBUG("\r\n等待连接WIFI\r\n");
		//CytonProcess_TimerCollStart();
		while(1)
		{
			delay_ms(10);
			//if (USART2_RX_LEN > 35)
			//	ESP8266_DEBUG("ESP8266 rsp (%d):%s \r\n",USART2_RX_LEN, ESP8266_RX_BUF);

			if (USART2_RX_LEN == 20) {
				//ESP8266_DEBUG("Start connect 1234\r\n");
				/* ID MUST 0-4 */
				//ESP8266_SendCmd("AT+CIPSTART=4,\"TCP\",\"192.168.4.2\",1234\r\n", "OK", 5000);
					
			}

			Ctron_Esp12Data_Loop();
			//ESP8266_CLEAR();//清空缓冲区
			CytonProcess_Loop();
			
				//if(ESP8266_SendCmd(M8266_CWJAP, "OK", 1500) >= 0)//连接AP WIFI热点SSID和密码
				//	LED2=!LED2;	
						//break;
				//else
				//{
						//LED2=!LED2;	
						//ESP8266_DEBUG("等待 ");
				//}
				
		}
		
		ESP8266_DEBUG("\r\n查看IP地址");
		while(1)
		{
				if(ESP8266_SendCmd(CIFSR, "OK", 500) >= 0)//查询连接
						break;
				else
				{
						LED2=!LED2;	
						ESP8266_DEBUG("等待 ");
				}					
		}
		
		ESP8266_DEBUG("\r\n建立TCP连接 \r\n");
		while(1)
		{
				if(ESP8266_SendCmd(M8266_SAVETRANSLINK, "OK", 500) >= 0)//建立TCP连接
						break;
				else
				{
						LED2=!LED2;		
						ESP8266_DEBUG("失败");
				}					
		}
				
		ESP8266_DEBUG("\r\n设置波特率透传 \r\n");
		while(1)
		{
				if(ESP8266_SendCmd(ESP_USARTDEF, "OK", 500) >= 0)//设置波特率 及流控
						break;
				else
						LED2=!LED2;				
		}
		
		ESP8266_uart_init(ESP_BAUD); //初始化	
		ESP8266_out_Cmd();//退出指令模式
		
		LED1=LED_OFF;	
		LED2=LED_OFF;			
		ESP8266_DEBUG("设置成功\r\n");
}
