gps_parse.c
来自「gps 协议解析(凯立德内部用)包含LINUX版」· C语言 代码 · 共 797 行 · 第 1/2 页
C
797 行
#endif
hCOM = INVALID_HANDLE_VALUE;
*(gps_param.GPS_Status) = 1;
#ifdef NAVI_GPS_LOG
if ( NULL == GPS_Log_Fpt )
{
#ifdef NAVI_OUTPUT_DEBUG_LOCAL
GPS_Log_Fpt = fopen(GPS_LogFilePath,"ab");
#else
char file_name[256];
#ifdef LGM_GPSEMU_DATA
{
char GPSLogName[32];
win_hmi_GetSystemTimeString(GPSLogName);
sprintf(file_name, "%s/%s", SysENV_Ptr->MapMediaFilePath,GPSLogName);
}
#else
if(GPS_Log_Fpt == NULL)
{
char strTime[100];
CXSYS_SYSTEM_TIME time;
CXSYS_GetDateTime(&time);
cnv_hmi_SprintfA(strTime,
"%d%02d%02d_%02d%02d%02d",
time.Year,
time.Month,
time.Day,
time.Hour,
time.Minute,
time.Second);
cnv_hmi_SprintfA(file_name,"%s%s%s%s.LOG",SysENV_Ptr->MapMediaFilePath,CONST_FILEDIRECTORY,GPS_LOG_FILE_NAME,strTime);
}
//sprintf(file_name, "%s/%s", SysENV_Ptr->MapMediaFilePath, GPS_LOG_FILE_NAME);
#endif
GPS_Log_Fpt = fopen(file_name,"abc");
#endif
}
#endif
#ifdef NAVI_GYRSHANGYANG_TEST
GYR_OpenLogFile();
#endif
while (!StopGPSSample)
{
// ============ 重新打开端口============================
if(iStatus == 1)
{
if(hCOM != INVALID_HANDLE_VALUE)
{
CloseHandle(hCOM);
hCOM = INVALID_HANDLE_VALUE;
}
g_iGPS_AlertInorge = 1; //2007-01-22
#ifdef LGM_GPSEMU
hCOM = InitGPSEMU();
#else
hCOM = Init_GPS();
#endif
g_iGPS_AlertType = (hCOM == INVALID_HANDLE_VALUE ? 0 : 1);
g_iGPS_AlertInorge = 0; //2007-01-22
if(hCOM != INVALID_HANDLE_VALUE)
{
iStatus = 0;
*(gps_param.GPS_Status) = 1;
//add by jiangmin,20060314
gps_param.RawPosition->ValidateDataStatus = 1; // GPS有效
gps_param.RawPosition->ValidateDataStatus |= 0x08; // 初始时GPS输入不可靠
//end add
#ifdef NAVI_GPS_LOG
if ( NULL != GPS_Log_Fpt )
{
fwrite("Com Open Succeed\r\n",1,20,GPS_Log_Fpt);
fflush(GPS_Log_Fpt);
}
#endif
}
else
{
#ifdef NAVI_GPS_LOG
if ( NULL != GPS_Log_Fpt )
{
fwrite("Com Open Failed\r\n",1,20,GPS_Log_Fpt);
fflush(GPS_Log_Fpt);
}
#endif
*(gps_param.GPS_Status) = 2;
CXSYS_Sleep(5000);
continue;
}
}
// ================================================
// 20060526 DMedia要求使用中断方式访问他们的GPS端口,否则会丢失数据
//#ifdef NAVI_VERSION_DMEDIA
#if (defined NAVI_VERSION_DMEDIA) || (defined NAVI_VERSION_INTERMIT_GPSPORT)
lLen = cnv_GPS_Read_LineEx(hCOM,GPS_Read_Buffer,LENGTH_GPS_READ_BUFFER);
#else
lLen = cnv_GPS_Read_Line(hCOM,GPS_Read_Buffer,LENGTH_GPS_READ_BUFFER);
#endif
if(lLen > 0)
{
#ifdef NAVI_VERSION_SHANGYANG_TY
if(s_hThreadEvent)
{
if(WaitForSingleObject(s_hThreadEvent,INFINITE) == WAIT_OBJECT_0)
{
ResetEvent(s_hThreadEvent);
}
}
#endif
#ifdef NAVI_GPS_LOG
if ( NULL != GPS_Log_Fpt )
{
fwrite(GPS_Read_Buffer,1,lLen,GPS_Log_Fpt);
fflush(GPS_Log_Fpt);
}
#endif
// 解析GPS信号
// 20060526 DMedia要求使用中断方式访问他们的GPS端口,否则会丢失数据
//#ifdef NAVI_VERSION_DMEDIA
#if (defined NAVI_VERSION_DMEDIA) || (defined NAVI_VERSION_INTERMIT_GPSPORT)
pLineBuff = GPS_Read_Buffer;
while(1)
{
memset(strLine,0,MAX_LENGTHOFLINE);
pLineBuff = GetLineFromBuffer(pLineBuff,strLine,MAX_LENGTHOFLINE,&iLineLen);
if(iLineLen > 0) // 一行数据长度大于0
{
g_i_ReadingGPSData = 0;
// 解析一行数据
GPS_Signal_ArrivedEx(strLine,iLineLen);
}
else // 如果行数据检索失败,则跳出循环
{
break;
}
if(*pLineBuff == 0) // 如果到了数据末尾,则跳出循环
{
break;
}
}
#else
// 解析一行数据
GPS_Signal_ArrivedEx(GPS_Read_Buffer,lLen);
#endif // #ifdef NAVI_VERSION_DMEDIA
#ifdef NAVI_VERSION_SHANGYANG_TY
if(s_hThreadEvent)
SetEvent(s_hThreadEvent);
#endif
}
else // 设备可能出现问题
{
CXSYS_Sleep(3000);
#ifndef NAVI_VERSION_240x292_YULONG
iStatus = 1;
#endif
continue;
}
if ( 0 != StopGPSSample) break;
}
if ( hCOM != INVALID_HANDLE_VALUE )
CloseHandle(hCOM);
hCOM = INVALID_HANDLE_VALUE;
#ifdef NAVI_GPS_LOG
if (GPS_Log_Fpt)
fclose(GPS_Log_Fpt);
GPS_Log_Fpt = NULL;
#endif
GPS_Thread = 0;
return 0;
}
DWORD m_dwThreadId = 0;
void CXSYS_Startup_GPS_Sampler_LGM(NAVI_LOC_PARAMETERS *RawPostion,short *GPS_Status)
{
DWORD dwThrdParam = 1;
memset(&satellite_pos,0,sizeof(GPS_SATELLITE_STATE));
gps_param.GPS_Status = GPS_Status;
gps_param.RawPosition = RawPostion;
StopGPSSample = 0;
GPS_Thread = CreateThread(
NULL, // no security attributes
0, // use default stack size
GPS_Sample_Thread_Func_LGM, // thread function
&dwThrdParam, // argument to thread function
0, // use default creation flags
&m_dwThreadId); // returns the thread identifier
}
#ifdef NAVI_BTGPS_EX
void CXSYS_Init_GPSStatus(NAVI_LOC_PARAMETERS *RawPostion,short *GPS_Status)
{
memset(&satellite_pos,0,sizeof(GPS_SATELLITE_STATE));
gps_param.GPS_Status = GPS_Status;
gps_param.RawPosition = RawPostion;
}
#endif
extern void GYR_CloseLog();
void CXSYS_Shutdown_GPS_Sampler_LGM()
{
DWORD ExitCode;
StopGPSSample = 1;
if(GPS_Thread == 0)
{
return ;
}
// 20060526 DMedia要求使用中断方式访问他们的GPS端口,否则会丢失数据
//#ifdef NAVI_VERSION_DMEDIA
#if (defined NAVI_VERSION_DMEDIA) || (defined NAVI_VERSION_INTERMIT_GPSPORT)
SetCommMask(hCOM, 0);
#endif
GetExitCodeThread(GPS_Thread, &ExitCode);
if (ExitCode == STILL_ACTIVE)
TerminateThread(GPS_Thread, 1);
CloseHandle(GPS_Thread);
if ( hCOM != INVALID_HANDLE_VALUE )
CloseHandle(hCOM);
hCOM = INVALID_HANDLE_VALUE;
GPS_Thread = 0;
#ifdef NAVI_GYRSHANGYANG_TEST
GYR_CloseLog();
#endif
//gqs.2006.09.04 宇龙..
//打开串口之前向MtapiServerWindow窗口发送一个串口3关闭消息
#ifdef NAVI_VERSION_240x292_YULONG
//2关闭..
if(g_i_CloseGPS_YuLong)
{
win_hmi_SendMessage_Com3_State(2);
}
#endif
g_iGPS_AlertType = 0;
return;
}
GPS_SATELLITE_STATE *CXSYS_GetGpsSatelliteState_LGM()
{
return &satellite_pos;
}
// 尚杨陀螺数据解析
#ifdef NAVI_VERSION_SHANGYANG_TY
HANDLE GYR_Thread = 0;
DWORD m_dwGYRThreadId = 0;
short s_i_GYRStop = 0;
long GYR_CreateSyncEvent()
{
s_hThreadEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
if(s_hThreadEvent == NULL) return 0;
return 1;
}
long GYR_DeleteSyncEvent()
{
if(s_hThreadEvent)
CloseHandle(s_hThreadEvent);
s_hThreadEvent = 0;
return 1;
}
DWORD WINAPI GYR_Sample_Thread_Func_LGM(void *in_Param)
{
long lAngle = 0;
long lDistance = 0;
unsigned long ulTime = 0;
BOOL blRet;
// 初始化陀螺信号
while(!InitGyrSpd())
{
CXSYS_Sleep(2000);
}
GYR_CreateSyncEvent();
while (!s_i_GYRStop)
{
// Angle表示自上一次读取到这一次读取之间汽车转过的角度,*Angle > 0表示顺时针旋转,*Angle < 0表示逆时针旋转,单位:0.001度
// *Distance表示自上一次读取到这一次读取之间汽车经过的距离,*Distance> 0表示汽车前进的距离,*Distance< 0表示汽车后退的距离,单位:0.1米
// Time表示当前时间,以供单位,单位:1 / (3.6864 * 10e6) s
blRet = GetGyrSpdValue(&lAngle,&lDistance,&ulTime);
if(blRet)
{
if(WaitForSingleObject(s_hThreadEvent,INFINITE) == WAIT_OBJECT_0)
{
ResetEvent(s_hThreadEvent);
gps_param.RawPosition->ValidateDataStatus |= 0x02; // 陀螺信息有效
gps_param.RawPosition->ValidateDataStatus |= 0x04; // 速度信息有效
gps_param.RawPosition->ValidateDataStatus |= 0x08; // GPS信息不可靠
gps_param.RawPosition->DriveSpeed = lDistance;
gps_param.RawPosition->GyroSpeed = lAngle; //guay modify 2006-11-7
// 由于不知道时间是什么单位,因此没有处理
//gps_param.RawPosition->GPSTime = (long)ulTime;
// 只要有陀螺数据,就刷新屏幕
#ifdef NAVI_GPS_LOG
if ( NULL != GPS_Log_Fpt )
{
char strTmp[64];
sprintf(strTmp,"$GYR%03d,%04d,%04d\r\n",lAngle,lDistance,(long)ulTime);
fwrite(strTmp,1,strlen(strTmp),GPS_Log_Fpt);
fflush(GPS_Log_Fpt);
}
#endif
CXSYS_Invoke_ND_Controller();
SetEvent(s_hThreadEvent);
// 200 ms刷新一次陀螺信息
}
CXSYS_Sleep(200);
}
else
{
CXSYS_Sleep(100);
}
}
return 0;
}
void CXSYS_Startup_GYR_Sampler()
{
DWORD dwThrdParam = 1;
GYR_Thread = CreateThread(
NULL, // no security attributes
0, // use default stack size
GYR_Sample_Thread_Func_LGM, // thread function
&dwThrdParam, // argument to thread function
0, // use default creation flags
&m_dwGYRThreadId); // returns the thread identifier
}
void CXSYS_Shutdown_GYR_Sampler_LGM()
{
DWORD ExitCode;
s_i_GYRStop = 1;
if(GYR_Thread == 0)
{
return ;
}
GetExitCodeThread(GYR_Thread, &ExitCode);
if (ExitCode == STILL_ACTIVE)
TerminateThread(GYR_Thread, 1);
CloseHandle(GYR_Thread);
GYR_DeleteSyncEvent();
// 关闭陀螺信号
CloseGyrSpd();
#ifdef NAVI_GPS_LOG
if ( NULL != GPS_Log_Fpt )
{
fwrite("Gyr Thread Shut Down !\r\n",1,32,GPS_Log_Fpt);
fflush(GPS_Log_Fpt);
}
#endif
GYR_Thread = 0;
return;
}
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?