#include "gprs.h"
#include "usart.h"
#include "delay.h"
#include "stdio.h"
#include "string.h"
#include "iwdg.h"


void A9G_init(void)
{
	int i = 0;
//	for(i = 0;i<30;i++)//保证模组初始化完成能够收到ready
//	{
//		delay_ms(500);
//	}
	send_com((u8*)"AT+GPS=0\r\n",(u8 *)"OK");
}

//函数功能：发送AT命令
//参数1：发送的命令
//参数2：AT响应
//返回值：响应是否正确,0表示正确响应;1表示错误响应


u8 send_com(u8 *send,u8 *respond)
{
	u8 buffer[1000] = {0};//调用串口得到的数据进行
	char j = 0;
//	IWDG_Feed();				//发一次命令就喂狗
	printf("%s",send);	//MCU通过串口1发送数据
	while(1)
	{
		if(BUF_STA == 1)//如果串口接受到数据
		{
			delay_us(100);
			timeout++;
			if(timeout > 2000)
			{
				USART_RX_BUF[count] = '\0';	//转变成字符串的形式
				strcpy((char *)buffer,(const char *)USART_RX_BUF);//先获取串口当中的数据
				count = 0;									//计数清0
				BUF_STA = 0;								//接受数据结束
				USART_RX_STA = 1;						//数据接受完成标志置1
			}
		}
		if(USART_RX_STA == 1)//数据接收完成了
		{
			USART_RX_STA = 0;
//			while(0 == strlen((char *)buffer))//串口获取的字符串为空，没有获取模块的响应，重发上一条命令
//			{
//				printf("%s",send);
//				if(BUF_STA == 1)
//				{
//					delay_us(100);
//					timeout++;
//					if(timeout > 2000)
//					{
//						USART_RX_BUF[count] = '\0';	
//						strcpy((char *)buffer,(const char *)USART_RX_BUF);//先获取串口当中的数据
//						count = 0;									//计数清0
//						BUF_STA = 0;								//接受数据结束
//					}
//				}
//				delay_ms(500);
//			}
			//串口获取的数据是 COMMAND NO RESPONSE!  ---  建议单片机重启
//			while(0 == strstr((char *)buffer,"COMMAND NO RESPONSE!"))
//			{
//				
//			}
			//模块被重启啦，等待10秒之后在重新发命令
			if(NULL != strstr((char *)buffer,"Init..."))
			{
					for(j = 0;j<30;j++)
					{
						delay_ms(500);
					}
			}
			//AT+CIPSEND获取到了 ">" 之后发的命令都会无效的，因此直接退出该模式
			if(NULL != strstr((char *)buffer,"> "))
			{
				
			
			}
			if(NULL != strstr((char *)buffer,(char *)respond))
			{
					return 0;//返回的响应是需要的响应
			}
			else
			{
					return 1;//返回的响应不是想要的响应
			}
		}
	}
}

//函数功能
u8 send_num(int num,u8 *respond)
{
	printf("%d\r\n",num);	//MCU通过串口1发送数据
	while(1)
	{
		if(BUF_STA == 1)//如果串口接受到数据
		{
			delay_us(100);
			timeout++;
			if(timeout > 1000)
			{
				USART_RX_BUF[count] = '\0';	//转变成字符串的形式
				count = 0;									//计数清0
				BUF_STA = 0;								//接受数据结束
				USART_RX_STA = 1;						//数据接受完成标志置1
			}
		}
		if(USART_RX_STA == 1)//数据接受完成了
		{
			count = 0;//计数请0,开始下一次计数
			USART_RX_STA = 0;
			if(NULL != strstr((char *)USART_RX_BUF,(char *)respond))
			{
					return 0;//返回的响应是需要的响应
			}
			else
			{
					return 1;//返回的响应不是想要的响应
			}
		}
	}
}

//函数功能:联网
//返回值：返回错误码
//参数：无
u8 connect_internet(void)
{
	if(send_com((u8*)"AT\r\n",(u8 *)"OK"))//发送AT查询模块是否响应
	{
			return AT_ERROR;
	}
	if(send_com((u8*)"AT+CGATT=1\r\n",(u8 *)"OK"))//附着网络
	{
			return AT_CGATT_ERROR;
	}
	if(send_com((u8*)"AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n",(u8 *)"OK"))
	//这条指令响应的时间会比较长
	//需要调整好最大的响应时间
	{
			return AT_CGDCONT_ERROR;
	}
	//会比较慢
	if(send_com((u8*)"AT+CGACT=1,1\r\n",(u8 *)"OK"))//激活PDP
	{
			return AT_CGACT_ERROR;
	}
	delay_ms(500);
	delay_ms(500);
	return NO_ERROR;
}

//函数功能:连接服务器
//返回值：成功与否
//参数：IP:服务器IP；port:服务器端口
u8 socket_TCP(char *IP,char *port)
{
	char buffer[100] = {0};
	sprintf(buffer,"AT+CIPSTART=\"TCP\",\"%s\",%s\r\n",IP,port);
	if(send_com((u8*)buffer,(u8 *)"OK"))
	{
		return AT_CIPSTART_ERROR;
	}
	delay_ms(500);
	delay_ms(500);//联网等待一下时间
	return NO_ERROR;
}

//函数功能：发送数据给服务器 --- 发送的数据大小不能超过80个字节
//返回值：成功与否
//参数：data：发送的数据
u8 send_data(char *data)
{
	u8 num = 0;
	char buffer[100] = {0};
	num = strlen(data);
	sprintf(buffer,"AT+CIPSEND=%d,\"%s\"\r\n",num,data);
	if(send_com((u8*)buffer,(u8 *)"OK"))
	{
		//return AT_CIPSEND_ERROR;  ---  没有关闭回显的原因（导致收不到）
	}
	
	if(send_com((u8 *)"AT+CIPCLOSE\r\n",(u8 *)"OK"))
	{
		return AT_CIPCLOSE_ERROR;
	}
	return NO_ERROR;
}

//函数功能:开启透传,发送传输的数据
//返回值：成功与否
//参数：发送的数据
u8 UnvarnTran(u8 *data)
{
	int num = 0;
	int i = 0;
	u8 *p=data;
	if(send_com((u8*)"AT+CIPTMODE=1\r\n",(u8 *)"OK"))
	{
		return AT_CIPTMODE_ERROR;
	}
	num = strlen((char *)p);
	for(i=0;i<num;i++)
	{
		printf("%c",*p);
		p++;
	}
	//发送透传结束标志数据
	if(send_num(0x1a,(u8 *)"OK"))
	{
		return SEND_NUM_ERROR;
	}
	return NO_ERROR;
}

//函数功能：开启GPS功能,同时值传递返回GPS数据
//参数：无
//返回值：对应的错误码
//参数：获取gps数据的指针 ---  数组的长度一定要大于30个字节（这里不进行软件过滤）
u8 open_gps(u8 *gps)
{
	u8 buffer[1000] = {0};
	char i = 0,j=0;
	char count = 0;
	char *p = NULL;
	if(send_com((u8*)"AT+GPS=1\r\n",(u8 *)"OK"))//开启GPS
	{
			return AT_GPS_ERROR;
	}
	if(send_com((u8*)"AT+GPSRD=8\r\n",(u8 *)"OK"))//30秒输出一条NEMA信息
	{
			return AT_GPSRD_ERROR;
	}
	label:	
	strcpy((char *)buffer,(const char *)USART_RX_BUF);
	p = strstr((char *)buffer,(char *)"$GNRMC");
	for(i=0;i<2;i++)
	{
			p=strstr((char *)p,(char *)",");
			p++;
	}
	while( *p != 'V')//确定能够获取到有效定位
	{
		for(j=0;j<10;j++)
		{
			delay_ms(500);
		}
		goto label;
	}
	p=p+2;
	i = 0;
	while(count != 4)
	{
			gps[i]= *p;
			p++;
			i++;
			if(*p == ',')
			{
					count++;
			}
	}
	if(send_com((u8*)"AT+GPS=0\r\n",(u8 *)"OK"))//关闭GPS
	{
			return AT_GPS_ERROR;
	}
	count = 0; //USART_RX_BUF计数清零
	memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));
	return NO_ERROR;
}

//函数功能：开启AGPS功能
//参数：无
//返回值：对应的错误码
//A9模块不支持AGPS功能
//参数：返回AGPS的数据   ----  数组一定要大于30个字节（这里不做检验）
u8 open_agps(u8 *agps)
{
	u8 buffer[1000] = {0};
	char i = 0,j=0;
	char count = 0;
	char *p = NULL;
	if(0 !=connect_internet())//开启联网功能
	{
			return CONNECT_INTE_ERROR;
	}
	if(send_com((u8*)"AT+GPS=0\r\n",(u8 *)"OK"))//关闭GPS功能
	{
			return AT_GPS_ERROR;
	}
	//这一条指令响应会很慢，所以就先等10秒之后发送其他命令
	if(send_com((u8*)"AT+AGPS=1\r\n",(u8 *)"+AGPS:GPD OK"))//开启AGPS功能 --- 有一定几率会返回COMMAND NO RESPONSE!
	{
			//return AT_AGPS_ERROR; ---  由于在使用的时候串口收到的数据太频繁了，必定会进入
	}
	for(j=0;j<50;j++)
	{
			delay_ms(500);
			IWDG_ReloadCounter();
	}
//	if(send_com((u8*)"AT+GPSRD=3\r\n",(u8 *)"OK"))//30秒输出一条NEMA信息
//	{
//			//return AT_GPSRD_ERROR; --- 程序有时候跑到这里来了
//	}
	label:	
	strcpy((char *)buffer,(const char *)USART_RX_BUF);
	IWDG_ReloadCounter();
	p = strstr((char *)buffer,(char *)"$GNRMC");
	for(i=0;i<2;i++)
	{
			p=strstr((char *)p,(char *)",");
			p++;
	}
	while( *p != 'A')//确定能够获取到有效定位
	{
		for(j=0;j<10;j++)
		{
			delay_ms(500);
		}
		goto label;
	}
	p=p+2;
	i = 0;
	while(count != 4)
	{
			agps[i]= *p;
			p++;
			i++;
			if(*p == ',')
			{
					count++;
			}
	}
	if(send_com((u8*)"AT+GPS=0\r\n",(u8 *)"OK"))//关闭GPS
	{
			return AT_GPS_ERROR;
	}
	count = 0; //USART_RX_BUF计数清零
	memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));
	return NO_ERROR;
	

}

//函数功能：获取当前CSQ的值同时校验
//返回值：CSQ的值是否合格
u8 check_csq(void)
{
	char CSQ[10]={0};
	char buffer[30]={0};
	char *p=NULL;
	char num = 0;
	int i = 0;
	if(send_com((u8 *)"AT+CSQ\r\n",(u8 *)"+CSQ"))
	{
		return AT_CSQ_ERROR;
	}
	for(i=0;i<30;i++)
	{
		buffer[i]=USART_RX_BUF[i];
	}
	p = strstr((char *)buffer,(char *)":");
	p=p+2;
	memset(CSQ,0,sizeof(CSQ));
	while(*p !=',')
	{
		CSQ[i] = *p;
		num = num*10+*p-'0';
		i++;
		p++;
	}
	if(num<14)
	{
		return CSQ_CHECK_ERROR;
	}
	return NO_ERROR;
}

//函数功能：获取模组的IMEI码和SIM卡的CCID并且返回;  ---  规定了IMEI和CCID放在数组的开始
//返回值：成功与否
u8 get_gprs_message(u8* data)
{
	char *p=NULL;
	char buffer[50]={0};
	int i = 0,j=0;
	if(send_com((u8 *)"AT+EGMR=2,7\r\n",(u8 *)"+EGMR"))
	{
		return AT_EGMR_ERROR;
	}
	for(i=0;i<50;i++)
	{
		buffer[i]=USART_RX_BUF[i];
	}
	p = strstr((char *)buffer,(char *)"+EGMR:");
	while(*p!='\r' && *(p+1)!='\n')
	{
		data[j] = *p;
		j++;
		p++;
	}
	if(send_com((u8 *)"AT+CCID\r\n",(u8 *)"+CCID: "))
	{
		return AT_CCID_ERROR;
	}
	for(i=0;i<50;i++)
	{
		buffer[i]=USART_RX_BUF[i];
	}
	p = strstr((char *)buffer,(char *)"+CCID: ");
	while(*p!='\r' && *(p+1)!='\n')
	{
		data[j] = *p;
		j++;
		p++;
	}
	return NO_ERROR;
}

//函数功能：获取服务器发过来的数据（数据长度大于100字节）
void Getdata_Server(u8 *data)
{
		char *p = NULL;
		char i = 0;
		p = strstr((char *)USART_RX_BUF,(char *)"+CIPRCV");
		while(*p!='\r' && *(p+1) != '\n')
		{
			data[i]=*p;
			p++;
			i++;
		}
}







