📄 drv_gps.c
字号:
** 函数名称: GPS_NMEA_GSA_Interpreter
** 功能描述: GPS NMEA格式RMC包解释函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPS_NMEA_GSA_Interpreter(INT8U rx,INT8U *prx_counter) reentrant
{
}
/*********************************************************************************************************
** 函数名称: GPS_NMEA_ASV_Interpreter
** 功能描述: GPS NMEA格式RMC包解释函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPS_NMEA_ASV_Interpreter(INT8U rx,INT8U *prx_counter) reentrant
{
}
/*********************************************************************************************************
** 函数名称: GPS_NMEA_TypeCheck
** 功能描述: GPS NMEA格式类型检查函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT8U GPS_MOTO_TypeCheck(INT8U rx,INT8U *prx_counter) reentrant
{
INT8U cnt;
static INT8U type_flag;
INT8U i;
INT8U flag;
cnt = *prx_counter - GPS_MOTO_TYPE_SEG_OFFSET;
if(!cnt)
type_flag = 0xFF;
else if(cnt > 5)
{
*prx_counter = 0;
return 0;
}
flag = 0x01;
checksum ^= rx;
if(!cnt)
{
for(i=0;i<8;flag<<=1,i++)
{
if(rx != GPS_MOTO_Type[i][cnt])
type_flag &= (~flag);
}
}
else
{
for(i=0;i<8;flag<<=1,i++)
{
if(rx != GPS_MOTO_Type[i][1])
type_flag &= (~flag);
}
flag = 0x01;
if(type_flag)
{
for(i=0;i<8;flag<<=1,i++)
{
if(type_flag & flag)
return i+1;
}
}
else
*prx_counter = 0;
}
return 0;
}
/*********************************************************************************************************
** 函数名称: Task_GPS_Interpreter
** 功能描述: GPS包处理函数
** 输 入: void *pData
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Task_GPS_Interpreter(void *pData) reentrant
{
static INT8U rx_counter = 0;
static INT8U gps_pack_format = NULL;
static INT8U gps_pack_type = NULL;
INT8U rx;
INT8U *ptr;
INT8U err;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
cpu_sr = 0; /* Prevent compiler warning */
#endif
do
{
ptr = (INT8U *)OSQPend(GPS_RX_Q,0,&err);
rx = *(ptr+POINTER_LENGTH);
Memery_Release(ptr,&err);
rx_counter = 0;
gps_pack_format = NULL;
gps_pack_type = NULL;
switch(rx)
{
case '$' : gps_pack_format = GPS_NMEA_FORMAT;
checksum = 0;
break;
case '@' : gps_pack_format = GPS_MOTO_FORMAT;
break;
default : break;
}
do
{
ptr = (INT8U *)OSQPend(GPS_RX_Q,0/*OS_TICKS_PER_SEC/2*/,&err);
rx = *(ptr+POINTER_LENGTH);
Memery_Release(ptr,&err);
if(err == OS_NO_ERR)
{
rx_counter ++;
if(gps_pack_format == GPS_NMEA_FORMAT)
{
if(!gps_pack_type)
{
gps_pack_type = GPS_NMEA_TypeCheck(rx,&rx_counter);
if(gps_pack_type)
current_state = GPS_NMEA_TYPE_SEG;
}
else
{
if((rx == ASCII_CR)||(rx == ASCII_LF))
{
seg_offset = 0;
checksum = 0;
current_state = GPS_NMEA_TYPE_SEG;
OSTaskResume(TASK_GPS_PRIO);
}
else
{
switch(gps_pack_type)
{
case GPS_NMEA_GLL : GPS_NMEA_GLL_Interpreter(rx,&rx_counter);
break;
case GPS_NMEA_GGA : GPS_NMEA_GAA_Interpreter(rx,&rx_counter);
break;
case GPS_NMEA_VTG : GPS_NMEA_VTG_Interpreter(rx,&rx_counter);
break;
case GPS_NMEA_RMC : GPS_NMEA_RMC_Interpreter(rx,&rx_counter);
break;
case GPS_NMEA_GSA : GPS_NMEA_GSA_Interpreter(rx,&rx_counter);
break;
case GPS_NMEA_ASV : GPS_NMEA_ASV_Interpreter(rx,&rx_counter);
break;
default : break;
}
}
}
}
else if(gps_pack_format == GPS_MOTO_FORMAT)
{
if(rx_counter>= GPS_MOTO_TYPE_SEG_OFFSET)
{
if(!gps_pack_type)
{
gps_pack_type = GPS_MOTO_TypeCheck(rx,&rx_counter);
if(gps_pack_type)
current_state = GPS_MOTO_TYPE_SEG;
}
else
{
if((rx == ASCII_CR)||(rx == ASCII_LF))
{
seg_offset = 0;
checksum = 0;
current_state = GPS_NMEA_TYPE_SEG;
OSTaskResume(TASK_GPS_PRIO);
}
else
{
switch(gps_pack_type)
{
case GPS_MOTO_Ea : GPS_MOTO_Ea_Interpreter(rx,&rx_counter);
break;
default : break;
}
}
}
}
}
}
else if(err == OS_TIMEOUT)
{
rx_counter = 0;
}
}
while(rx_counter);
}while(1);
return;
}
/*********************************************************************************************************
End Of File
**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -