/*
* Copyright (c) 2008,深圳达驰通信软件开发部
* All rights reserved.
*
* 文件名:GpsDataProcess.c
*
* 版本号:V1.0
*
* 创建日期:2008年09月23日
*
* 摘 要:GPS数据处理
*
* 作 者:梁少敏
*
*
* 修改人:
*
* 修改日期:
*
* 修改摘要:
*/
#define _GPSDATAPROCESS_C_
#include "global.h"
#include "AllModule.h"
#include "GpsCommand.h"
/********************************************
*函数名称: GpsProcess
*功能描述: Gps数据处理
*输入: 无
*输出: 无
*返回值: 无
*全局变量: 无
*调用函数: 无
*作者 日期 描述
*梁少敏 2008年01月14日 原创
*xxxxxx xxxx年xx月xx日 修改xx功能
*******************************************/
void GpsProcess(void)
{
if(GpsPowerReset == ENABLE) //lsm20090518
{
GpsPowerReset = DISABLE;
ResetGpsPower(); //电源重启
}
if(GpsInitState == FALSE)
{
//FIO0SET = (0x01 << 1); //开启GPS电源
VICIntEnClr |= (0x01 << 0x07); //使能UART0中断
GpsInitState = InitGps(); //对GPS进行初始化
VICIntEnable |= (0x01 << 0x07); //使能UART0中断
GpsDriftFilterInit = ENABLE; //lsm20090520
}
//漂移抑制初始化//lsm20090520
#if(STATIC_DRIFT_FILTER_EN)
if((GpsDriftFilterInit == ENABLE)
&& (GpsInfo.ui32_GpsDataValidFlag == TRUE))
{
DriftFilterInit(); //lsm20090520
}
#endif
if(Serial1ComRcv.uc_flag == COM_COMPLETE_RCV) //收到一个完整的数据包
{
VICIntEnClr |= 0x01 << 0x07; //关闭UART10中断
//硬件触发打印调试信息
if(HARDWARE_PUBLIC_DEBUG == HARDWARE_DEBUG_OPEN)
{
Uart0Send(Serial1ComRcv.uc_buf,Serial1ComRcv.uc_len);
}
//数据处理
AnalyseGpsData(&Serial1ComRcv); //GPS接收的数据解析
memset(Serial1ComRcv.uc_buf,NULL,GPS_LENTH); //清空接收缓冲
Serial1ComRcv.uc_flag = COM_PORT_FREE; //置串口空闲
Serial1ComRcv.uc_len = 0;
VICIntEnable |= 0x01 << 0x07; //使能UART10中断
}
}
/********************************************
*函数名称: ResetGpsPower
*功能描述: 重启GPS电源
*输入: 无
*输出: 无
*返回值: 无
*全局变量: 无
*调用函数: 无
*作者 日期 描述
*梁少敏 2008年01月14日 原创
*xxxxxx xxxx年xx月xx日 修改xx功能
*******************************************/
void ResetGpsPower(void)
{
//lsm20090518
FIO0SET = (0x01 << 1); //关断IRL5013
DelayNms(600);
WatchDog();
DelayNms(600);
FIO0CLR = (0x01 << 1); //IRL5013导通
}
/********************************************
*函数名称: InitGps
*功能描述: 初始化Gps
*输入: 无
*输出: 无
*返回值: 无
*全局变量: 无
*调用函数: 无
*作者 日期 描述
*梁少敏 2008年01月14日 原创
*xxxxxx xxxx年xx月xx日 修改xx功能
*******************************************/
UINT32 InitGps(void)
{
UINT8 i;
UINT8 uc_TempArray[40];
DelayNms(200); //在前面刚上电,需让GPS里的单片机工作稳定再初始化。
for(i = 0; i < GPS_MAX_COMMAND; i++) //初始化GPS发送数据的命令
{
memset(uc_TempArray,NULL,sizeof(uc_TempArray)); //缓冲清空
strcpy((char*)uc_TempArray,(char*)uc_initGpsCommand[i]);
Uart1Send(uc_TempArray,strlen((char*)uc_TempArray));
DelayNms(30);
}
#if(ANT_CHECK_EN) //如果使能天线检测
memcpy(uc_TempArray,ANT_CHECK_OPEN,sizeof(ANT_CHECK_OPEN));
Uart1Send(uc_TempArray,sizeof(ANT_CHECK_OPEN));
#else
memcpy(uc_TempArray,ANT_CHECK_CLOSE,sizeof(ANT_CHECK_CLOSE));
Uart1Send(uc_TempArray,sizeof(ANT_CHECK_CLOSE));
#endif
memset(&GpsInfo,NULL,sizeof(GpsInfo)); //各标识、参数初始化
return (TRUE);
}
/********************************************
*函数名称: DriftFilterInit
*功能描述: GPS漂移抑制初始化
*输入: 无
*输出: 无
*返回值: 无
*全局变量: 无
*调用函数: 无
*作者 日期 描述
*梁少敏 2008年01月14日 原创
*xxxxxx xxxx年xx月xx日 修改xx功能
*******************************************/
void DriftFilterInit(void)
{
UINT8 uc_TempArray[50]; //初始化的指令最长44字节
//lsm20090520
if(TimerCount12En == DISABLE)
{
TimerCount12En = ENABLE; //使能计数器
}
else if(TimerCount12 == INTERVAL_30_SEC)
{
memset(uc_TempArray,NULL,sizeof(uc_TempArray)); //缓冲清空
memcpy(uc_TempArray,STATIC_DRIFT_FILTER_PEDE,sizeof(STATIC_DRIFT_FILTER_PEDE));
Uart1Send(uc_TempArray,sizeof(STATIC_DRIFT_FILTER_PEDE));
//硬件触发打印调试信息
if(HARDWARE_PUBLIC_DEBUG == HARDWARE_DEBUG_OPEN) //lsm20090522
{
Uart0Send((UINT8 *)">Drift filter command is send!\r\n<",33);
}
}
else if(TimerCount12 == INTERVAL_60_SEC)
{
memset(uc_TempArray,NULL,sizeof(uc_TempArray)); //缓冲清空
memcpy(uc_TempArray,STATIC_DRIFT_FILTER_AUTO,sizeof(STATIC_DRIFT_FILTER_AUTO));
Uart1Send(uc_TempArray,sizeof(STATIC_DRIFT_FILTER_AUTO));
GpsDriftFilterInit = DISABLE;
TimerCount12En = DISABLE; //使能计数器
TimerCount12 = 0;
}
}
/********************************************
*函数名称: AnalyseGpsData
*功能描述: 解析GPS接收器的数据
*输入: 无
*输出: 无
*返回值: 无
*全局变量: 无
*调用函数: 无
*作者 日期 描述
*梁少敏 2008年01月14日 原创
*xxxxxx xxxx年xx月xx日 修改xx功能
*******************************************/
void AnalyseGpsData(GPSUARTDRIVER *RcvData)
{
UINT8 i;
UINT8 uc_VerifyByte = 0; //校验字节
UINT8 uc_CheckResult = 0;
UINT8 *uc_ProHead = NULL;
UINT8 *uc_TargetAddr = NULL;
UINT32 u32_len = 0;
GPSUARTDRIVER *AnalyseInfo = NULL;
#ifdef GPS_GPRS_DEPTH_DEBUG
UINT8 num_temp = 0;
#endif
AnalyseInfo = RcvData;
if(AnalyseInfo == NULL)
{
return;
}
for(i = 0; i < GPS_MAX_COMMAND + 4; i++) //GSV命令有4行语句,需加3,还有如果有天线信息需加1
{
uc_ProHead = (UINT8 *)strstr((char *)(AnalyseInfo->uc_buf), (char *)"$");
if(uc_ProHead == NULL) //防止指针出错
{
return;
}
//查找回车字符,一个命令结束处均带有一个回车字符
uc_TargetAddr = (UINT8 *)strstr((char *)uc_ProHead, (char *)COMMAND_END);
if(uc_TargetAddr == NULL) //防止指针出错
{
return;
}
u32_len = uc_TargetAddr - uc_ProHead; //协议数据长度
//把两位字节校验结果还原成一字节的校验值
uc_VerifyByte = *(uc_ProHead + u32_len - 2); //高字节
if((*(uc_ProHead + u32_len - 2) >= 0x30)
&& (*(uc_ProHead + u32_len - 2) <= 0x39)) //高字节还原
{
uc_VerifyByte = (uc_VerifyByte - 0x30) << 4;
}
else
{
uc_VerifyByte = (uc_VerifyByte - 0x37) << 4;
}
if((*(uc_ProHead + u32_len - 1) >= 0x30)
&& (*(uc_ProHead + u32_len - 1) <= 0x39)) //低字节还原
{
uc_VerifyByte = uc_VerifyByte + (*(uc_ProHead + u32_len - 1) - 0x30);
}
else
{
uc_VerifyByte = uc_VerifyByte + (*(uc_ProHead + u32_len - 1) - 0x37);
}
//全异或校验
uc_CheckResult = AllXorCheckout((uc_ProHead + 1),(u32_len - 4));
if(uc_CheckResult == uc_VerifyByte)
{
#ifdef GPS_DEBUG_EN
// Uart0Send((UINT8 *)"AllXorCheckout:Successful!\r\n",28);
#endif
//解析协议数据,除头(1字节)、尾(3字节)
AnalyseNmeaPro((uc_ProHead + 1),(u32_len - 4));
}
memset(uc_ProHead,' ',(u32_len + 2)); //清空已解析完的数据,包含"\r\n"
}
memset(AnalyseInfo->uc_buf,NULL,GPS_LENTH);
}
/********************************************
*函数名称: AnalyseNmeaPro
*功能描述: 解析NMEA协议数据
*输入: 无
*输出: 无
*返回值: 无
*全局变量: 无
*调用函数: 无
*作者 日期 描述
*梁少敏 2008年01月14日 原创
*xxxxxx xxxx年xx月xx日 修改xx功能
*******************************************/
void AnalyseNmeaPro(UINT8 *uc_tempHead,UINT32 u32_lenth)
{
UINT8 i;
UINT8 uc_tempNullNum = 0;