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 + -
显示快捷键?