/******************************************************************************
版权所有：	
文件名称：	gprs_aux.c
文件版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
功能说明：	GPRS辅助串口处理
其它说明：
修改记录：
*/
#ifdef FUN_GPRS

#ifdef LINUX_KERNEL_APP
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/delay.h>
#include <linux/syscalls.h>
#endif
#include  "head.h"
#include "gprs_proxy.h"

#include "gh_vs.h"


extern struct gprs_info g_gprs_info;
static int g_gprs_proxy1_fd = -1;  //GPRS代理设备句柄

int g_aux_csq = -1;
#define GPRS_PROXY_DEV			"/dev/gprs_proxy1"

/******************************************************************************
函数名称：	gprs_proxy1_open
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	打开GPRS代理设备.						
参数说明：	
						无
返回值：  	打开成功返回0，失败返回负数。
修改记录：	
*/
int gprs_proxy1_open(void)
{
	int fd = 0;
	
	fd = sys_open(GPRS_PROXY_DEV, O_RDWR | O_NONBLOCK, 0);
	if(fd < 0)
	{
		printk("open %s error!\n", GPRS_PROXY_DEV);
		return -1;
	}	
	
	g_gprs_proxy1_fd = fd;

	return 0;	
}

/******************************************************************************
函数名称：	gprs_proxy1_write
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	GPRS代理设备发送函数.						
参数说明：	
						无
返回值：  	成功返回发送的字节数，失败返回负数。
修改记录：	
*/
int gprs_proxy1_write(const unsigned char * buf, int count)
{
	int ret = 0;
	
	if(g_gprs_proxy1_fd >= 0)
	{
		ret= sys_write(g_gprs_proxy1_fd, buf, count); 	
	}
	return ret;
}

/******************************************************************************
函数名称：	gprs_proxy1_read
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	GPRS代理设备接收函数.						
参数说明：	
						无
返回值：  	成功返回读取的字节数，失败返回负数。
修改记录：	
*/
int gprs_proxy1_read(unsigned char * buf, int count)
{
	int ret = 0;
	
	if(g_gprs_proxy1_fd >= 0)
	{
		ret= sys_read(g_gprs_proxy1_fd, buf, count); 	
	}
	
	return ret;
}

/******************************************************************************
函数名称：	gprs_proxy1_close
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	关闭GPRS代理设备.						
参数说明：	
						无
返回值：  	无。
修改记录：	
*/
void gprs_proxy1_close(void)
{
	if(g_gprs_proxy1_fd >= 0)
	{
		sys_close(g_gprs_proxy1_fd);
		g_gprs_proxy1_fd = -1;		
	}
	
}

/******************************************************************************
函数名称：	gprs_proxy1_get_reset
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	获取复位标志.						
参数说明：	
						无
返回值：  	返回0,不需要复位;返回1, 需要复位
修改记录：	
*/
 int gprs_proxy1_get_reset(void)
{
	int ret = 0;
	int arg = 0;
	
	if(g_gprs_proxy1_fd >= 0)
	{
		ret= sys_ioctl(g_gprs_proxy1_fd, GPRS_PROXY_GET_RESET, (uint32_t)&arg);	
		if(ret == 0)
		{
			ret = arg;
		}
		
	}
	
	return ret;	
}

/******************************************************************************
函数名称：	gprs_aux_send_hw_reset
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2015-07-31
函数说明：	gprs第二个串口应用处理.						
参数说明：	
						无
返回值：  	成功返回0,失败返回-1。
修改记录：	
*/
int gprs_aux_send_hw_reset(void)
{
	BYTE srcbuf[16];
	BYTE dstbuf[UART_FRAME_LEN];
	BYTE *pd=srcbuf;	

	*pd++ = HMI_CMD_GPRS;
	*pd++ = HMI_GPRS_CMD_RESET;


	(void)protocol_packet(srcbuf, 2,  MAIN_BOARD, GPRS_BOARD, dstbuf);	

	//添加到缓存区
	//Add_Uart_Frame(GPRS_BOARD, (int)dstbuf[1] + 6, dstbuf);	
	
	 
	return 0;				
}

/******************************************************************************
函数名称：	gprs_aux_send_at_csq
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2015-07-31
函数说明：	发送AT+CSQ命令.						
参数说明：	
						无
返回值：  	成功返回0,失败返回-1。
修改记录：	
*/
int gprs_aux_send_at_csq(void)
{
	int len=0;
	char *pat="AT+CSQ\r\n";
	BYTE srcbuf[32];
	BYTE dstbuf[UART_FRAME_LEN];
	BYTE *pd=srcbuf;		

	len = strlen(pat);
	
	*pd++ = HMI_CMD_GPRS;
	*pd++ = HMI_GPRS_CMD_AT_CSQ;
	memcpy(pd, pat, len);

	(void)protocol_packet(srcbuf, len+2,  MAIN_BOARD, GPRS_BOARD, dstbuf);	

	//添加到缓存区
	//Add_Uart_Frame(GPRS_BOARD, (int)dstbuf[1] + 6, dstbuf);	

	return 0;
}

/******************************************************************************
函数名称：	gprs_aux_at_csq_result
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2015-07-31
函数说明：	AT+CSQ命令返回结果.						
参数说明：	
					
返回值：  	成功返回0,失败返回-1。
修改记录：	
*/
int gprs_aux_at_csq_result(unsigned char *data, int len)
{
	unsigned char buf[128];
	char *p;

	memset(buf, 0, sizeof(buf));

	memcpy(buf, data+6, (int)data[1] - 2);

	//printk("%s\n", buf);

	p = strstr((char *)buf, "+CSQ: ");
	if(p)
	{
#ifndef CPU_FUXI
		g_aux_csq= simple_strtol(p+6, NULL, 10);
#endif		
	}
	
//	printk("g_aux_csq =%d\n", g_aux_csq );
	return 0;
}

/******************************************************************************
函数名称：	GPRS_Board_Recv
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2015-07-31
函数说明：	gprs第二个串口应用处理.						
参数说明：	
						无
返回值：  	成功返回0,失败返回-1。
修改记录：	
*/
void GPRS_Board_Proc(int len, unsigned char *para)
{

	if((int)para[4]!=DRV_CMD_GPRS)
	{
		return;
	}
	switch((int)para[5])
	{
	case HMI_GPRS_CMD_RESET:
		//printk("HMI_GPRS_CMD_RESET\n");
		break;
	case HMI_GPRS_CMD_AT_CSQ:
		//printk("HMI_GPRS_CMD_AT_CSQ\n");
		gprs_aux_at_csq_result(para, len);		
		break;
	default:
		break;

	}

}
/******************************************************************************
函数名称：	gprs_proxy1_init
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	gprs第二个串口应用处理初始化.						
参数说明：	
						无
返回值：  	成功返回0,失败返回-1。
修改记录：	
*/
int gprs_aux_init(void)
{
	int ret = 0;

	ret=gprs_proxy1_open();
	if(ret!=0)
	{
		printk("gprs_proxy1_open error!\r\n ");
		return -1;
	}

	return 0;
}

/******************************************************************************
函数名称：	gprs_proxy1_init
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	gprs第二个串口应用处理反初始化.						
参数说明：	
						无
返回值：  	成功返回0,失败返回-1。
修改记录：	
*/
int gprs_aux_exit(void)
{

	gprs_proxy1_close();
	return 0;

}

/******************************************************************************
函数名称：	gprs_aux_comm_app
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2015-07-31
函数说明：	gprs第二个串口应用处理.						
参数说明：	
						无
返回值：  	成功返回0,失败返回-1。
修改记录：	
*/
extern int is_down_program(void);
static int sendcmdtflag = 0;
int gprs_comm_app(void)
{
	int ret = 0;
	static uint32_t us0=0;
	static int resetflag = 0;
	
	if(is_down_program())
	{
		return 0;
	}
	
	//发送复位命令
	ret=gprs_proxy1_get_reset();
	if(ret)
	{	
		gprs_aux_send_hw_reset();	
		
		us0 = ustimer_get_origin();
		resetflag = 1;
	}


	if(resetflag)
	{
		if(ustimer_get_duration(us0)<6*USTIMER_SEC)
		{
			return 0;
		}

		resetflag = 0;
	}

	if(sendcmdtflag==0)
	{
		//发送AT+CSQ命令
		gprs_aux_send_at_csq();
		us0 = ustimer_get_origin();
		sendcmdtflag = 1;
	}

	if(ustimer_get_duration(us0)>5*USTIMER_SEC)
	{
		sendcmdtflag = 0;	
	}
	
		 
	
	

	return 0;			
}

/******************************************************************************
函数名称：	gprs_proxy1_send_at_data
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	发送AT指令数据.						
参数说明：	
						无
返回值：  	无。
修改记录：	
*/
void gprs_proxy1_send_at_data(void)
{
	int ret = 0;
	unsigned char at_data[256];

	//获取复位标志
	ret = gprs_proxy1_get_reset();
	//需要复位	
	if(ret == 1)
	{
		//发送复位报文
		
		return;
	}

	ret = gprs_proxy1_read(at_data, sizeof(at_data));	
	
	if(ret > 0)
	{
		//发送AT命令数据				
		//
		// ...
		// ...
		//
			
	}
			 	
}

/******************************************************************************
函数名称：	gprs_proxy1_recv_at_data
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-04
函数说明：	接收数据.						
参数说明：	
						无 
返回值：  	无。
修改记录：	
*/
void gprs_proxy1_recv_at_data(unsigned char *data)
{
	int ret = 0;

	ret = gprs_proxy1_write(data, sizeof(data));	

			 	
}
 

#endif