/*************************** (C) COPYRIGHT 2017 CXHY ****************************
 * 文件名  ：gsm_uart.c
 * 描  述  ：GSM控制串口（串口3）
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/04/26 
*********************************************************************************/
#include "delay.h"
#include "usart1.h"
#include "stdarg.h"	 	 
#include "stdio.h"	
#include "stdlib.h"  	 
#include "string.h"		
#include "gsm_uart.h"
#include "gsm_uart_conf.h"
#include "usart3.h"
#include "at_proc.h"
#include "tcp_protocol.h"

//串口发送缓存区 	
__align(8) uint8_t  GPRS_TX_BUF[GPRS_MAX_SEND_LEN]; 		//发送缓冲,最大GPRS_MAX_SEND_LEN字节
uint8_t  GPRS_RX_BUF[GPRS_MAX_RECV_LEN]; 								//接收缓冲,最大GPRS_MAX_RECV_LEN字节

uint8_t GPRS_DATA_BUF[GPRS_MAX_SEND_LEN];								//GPRS数据处理缓冲,最大GPRS_MAX_SEND_LEN字节
uint8_t GPRS_RECV_DATA_BUF[GPRS_MAX_RECV_LEN];

_gsm_msg gsm_msg;
uint8_t signal;

uint16_t total_send_length = 0;													//发送数据总长度
uint16_t ackedBytes = 0;																//收到数据总长度
uint16_t unackedbytes = 0;															//未收到数据总长度

uint8_t receiveDataMark = 0;

uint8_t GSM_ReceiveType = 0;														// GSM模块接收到的数据类型（0为AT命令应答，1为TCP数据）

uint16_t GPRS_RX_STA;   																//接收数据状态
uint16_t GPRS_RX_Cnt = 0;
uint16_t recDataLen = 0;

/*
***********************************************************************
*	函 数 名: GSM_Uart_Init
*	功能说明: GSM控制串口初始化
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
void GSM_GPRS_Uart_Init(void)
{
	USART3_Init(115200);							//外部需实现些函数
}

/*
***********************************************************************
*	函 数 名: GSM_GPRS_SendOne
*	功能说明: 向GSM串口发送一次数据
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
void GSM_GPRS_SendOne(uint8_t pDataBuf[], uint16_t len)
{
	UART3_Send_One(len);						//外部需实现些函数
}

/*
***********************************************************************
*	函 数 名: GSM_GPRS_SendByteData
*	功能说明: 向GSM串口输出一字节数据
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
void GSM_GPRS_SendByteData(uint8_t cmd)
{
	while(DMA1_Channel2->CNDTR != 0);			//等待通道7传输完成   
	USART3->DR = (uint32_t)cmd;
}

/*
***********************************************************************
*	函 数 名: GSM_GPRS_printf
*	功能说明: GSM串口输出命令
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
void GSM_GPRS_printf(char* fmt, ...)  
{  
	va_list ap;
	va_start(ap, fmt);
	vsprintf((char*)GPRS_TX_BUF, fmt, ap);
	va_end(ap);
//	while(DMA1_Channel2->CNDTR!=0);	//等待通道7传输完成   
	GSM_GPRS_SendOne(GPRS_TX_BUF, strlen((const char*)GPRS_TX_BUF)); 	//通过dma发送出去
}  


void show_buf1(uint8_t num[], uint8_t n)
{
    uint8_t i;
		printf("\r\n");
    for(i=0; i<n; i++)
		{
      printf("%x ",num[i]);
		}
		printf("\r\n");
}
/*
***********************************************************************
*	函 数 名: GSM_GPRS_ReceiveData
*	功能说明: GSM串口接收数据
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
void GSM_GPRS_ReceiveData(uint8_t rxData)
{
	static uint8_t i = 0;
	static uint8_t len = 0;
	static uint8_t receiveStatus = 0;

	if(GPRS_RX_Cnt < GPRS_MAX_RECV_LEN)										//还可以接收数据
	{
		GPRS_RX_BUF[GPRS_RX_Cnt++] = rxData;								//记录接收到的值	
		
		if(GSM_ReceiveType == 0)		//接收到GSM模块的数据为AT命令应答数据
		{
			if(GPRS_RX_BUF[GPRS_RX_Cnt - 1] == '\n')
			{
				i++;
				if(GPRS_RX_Cnt >= 4)
				{
					GPRS_RX_BUF[GPRS_RX_Cnt] = 0;					//在接收到的数据后面增加字符串结束符'\0'
					
					AT_Protocol(GPRS_RX_BUF, GPRS_RX_Cnt);		//进行AT指令应答解析
				}
				GPRS_RX_Cnt = 0;
			}
			
			if((sendAtCmdNo == AT_CMD_QISEND) && (GPRS_RX_BUF[GPRS_RX_Cnt - 1] == '>'))
			{
				GPRS_RX_BUF[GPRS_RX_Cnt] = 0;							//在接收到的数据后面增加字符串结束符'\0'	
				AT_Protocol(GPRS_RX_BUF, GPRS_RX_Cnt);		//进行AT指令应答解析
				GPRS_RX_Cnt = 0;
			}
		}else{											//接收到模块的URC上报数据
			if(GPRS_RX_Cnt >= recDataLen)
			{
// 				show_buf1(GPRS_RX_BUF, GPRS_RX_Cnt);
				GPRS_RX_BUF[GPRS_RX_Cnt] = 0;							//在接收到的数据后面增加字符串结束符'\0'	
				
				TCP_Protocol(GPRS_RX_BUF, GPRS_RX_Cnt);
				GPRS_RX_Cnt = 0;
				GSM_ReceiveType = 0;
			}
		}
	}else{
		GPRS_RX_Cnt = 0;
		GSM_ReceiveType = 0;
		receiveStatus = 0x00;
		printf("\r\nData out\r\n");
	}
}


/******************** (C) COPYRIGHT 2017 CXHY *****END OF FILE*******************/ 

