#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 "myQueue.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+1)*4 +3;//一次采样要发送的数据长度 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] = 0xAA;
					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;
	
	  ESP8266_CLEAR();//清空缓冲区
    USARTx_Send(ESP8266_UART,(uint8_t*) cmd, strlen(cmd));
		delay_ms(timeOut);
		//ESP8266_DEBUG("ESP8266 rsp:%s \r\n",ESP8266_RX_BUF);		
		res = Str_search(ESP8266_RX_BUF,ESP8266_RX_LEN,result);//查询字符串
		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_Init(void)
{
		//ESP8266_PWOEROFF;
		//delay_ms(200);
		ESP8266_PWOERON;
		delay_s(2);

//		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");
				ESP8266_SendCmd(RST, "OK", 500) ;//复位
				USART_ITConfig(ESP8266_UART, USART_IT_RXNE, DISABLE);//串口接收中断	
				return;
		}
		else
		{
				ESP8266_DEBUG("无响应，按照默认参数设置\r\n");
				ESP8266_Config();//设置WIFI
		}
}

//串口配网
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;
			
}
