📄 gps.cpp
字号:
#include "stdafx.h"
#include <stdio.h>
#include "GPS.h"
DWORD WINAPI GPS::WorkProc(LPVOID lpParam)
{
GPS *pThis=(GPS *)lpParam;
memset(pThis->buf,0,256);
if(pThis->pSerial != NULL)
{
MSG msg;
pThis->pSerial->ClearBuffers();
while(1)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;
}
pThis->pSerial->ReadLine(pThis->buf,256);
#ifdef _DEBUG
printf("%s\n",pThis->buf);
#endif
if(pThis->parse())
{
}
}
}
return 0L;
}
char *GPS::match(char *str,char *patten)
{
while(*str != 0 && *patten != 0 && *str == *patten)
{
str++;
patten++;
}
if(*patten == 0)
return str+1;
else
return NULL;
}
char *GPS::next_fld(char *str)
{
char *ts=str;
while(*ts != ',' && *ts != 0)
ts++;
*ts='\0';
return str;
}
BOOL GPS::parse() //GPRMC电文
{
char *fld;
fld=match(buf,"$GPRMC");
if(fld != NULL)
{
//GPS电文
//printf("%s\n",buf);
//时间戳
fld=next_fld(fld);
if(*fld != 0)
{
sscanf(fld,"%2d%2d%2d.%4d",&hh,&mm,&ss,&ms);
}
fld+=(strlen(fld)+1);
//定位状态
fld=next_fld(fld);
if(*fld == 'A')
code=1;
else
code=0;
fld+=(strlen(fld)+1);
//纬度
fld=next_fld(fld);
if(*fld != 0)
{
int d,m,mm;
sscanf(fld,"%2d%2d.%4d",&d,&m,&mm);
latitude=(float)d+(float)m/60.0+(float)mm/600000.0;
}
fld+=(strlen(fld)+1);
//南北半球标志
fld=next_fld(fld);
if(*fld == 'S')
latitude=-latitude;
fld+=(strlen(fld)+1);
//经度
fld=next_fld(fld);
if(*fld != 0)
{
int d,m,mm;
sscanf(fld,"%3d%2d.%4d",&d,&m,&mm);
longitude=(float)d+(float)m/60.0+(float)mm/600000.0;
}
fld+=(strlen(fld)+1);
//东西半球标志
fld=next_fld(fld);
if(*fld == 'W')
longitude=-longitude;
fld+=(strlen(fld)+1);
//对地运动速度
fld=next_fld(fld);
if(*fld != 0)
velocity=atof(fld);
else
velocity=0.0;
fld+=(strlen(fld)+1);
//对地运动方向
fld=next_fld(fld);
if(*fld != 0)
direction=atof(fld);
else
direction=0.0;
fld+=(strlen(fld)+1);
//GPRMC不能给出高度信息
height=0.0;
if(pEventProc != NULL)
pEventProc(code,hh,mm,ss,ms,longitude,latitude,height,velocity,direction,lpUserPtr);
return TRUE;
}
return FALSE;
}
/*
BOOL GPS::parse() //GPGGA电文
{
char *fld;
fld=match(buf,"$GPGGA");
if(fld != NULL)
{
//时间戳
fld=next_fld(fld);
if(*fld != 0)
{
sscanf(fld,"%2d%2d%2d.%4d",&hh,&mm,&ss,&ms);
}
fld+=(strlen(fld)+1);
//纬度
fld=next_fld(fld);
if(*fld != 0)
{
int d,m,mm;
sscanf(fld,"%2d%2d.%4d",&d,&m,&mm);
latitude=(float)d+(float)m/60.0+(float)mm/600000.0;
}
fld+=(strlen(fld)+1);
//南北半球标志
fld=next_fld(fld);
if(*fld == 'S')
latitude=-latitude;
fld+=(strlen(fld)+1);
//经度
fld=next_fld(fld);
if(*fld != 0)
{
int d,m,mm;
sscanf(fld,"%3d%2d.%4d",&d,&m,&mm);
longitude=(float)d+(float)m/60.0+(float)mm/600000.0;
}
fld+=(strlen(fld)+1);
//东西半球标志
fld=next_fld(fld);
if(*fld == 'W')
longitude=-longitude;
fld+=(strlen(fld)+1);
//定位有效性及格式
fld=next_fld(fld);
if(*fld != 0)
code=atoi(fld);
fld+=(strlen(fld)+1);
//捕捉卫星数量
fld=next_fld(fld);
if(*fld != 0)
satnum=atoi(fld);
fld+=(strlen(fld)+1);
//估计误差
fld=next_fld(fld);
if(*fld != 0)
dis=atof(fld);
fld+=(strlen(fld)+1);
//海拔高度
fld=next_fld(fld);
if(*fld != 0)
height=atof(fld);
fld+=(strlen(fld)+1);
//高度单位
fld=next_fld(fld);
fld+=(strlen(fld)+1);
//GPGGA电文不能给出速度信息
velocity=0.0;
direction=0.0;
if(pEventProc != NULL)
pEventProc(code,hh,mm,ss,ms,longitude,latitude,height,velocity,direction,lpUserPtr);
return TRUE;
}
return FALSE;
}
*/
GPS::GPS()
{
pSerial=NULL;
code=0;
hWorkthread=NULL;
pEventProc=NULL;
}
GPS::~GPS()
{
if(pSerial != NULL)
delete pSerial;
}
BOOL GPS::OpenDevice(TCHAR *strPort,int nBaudRate)
{
pSerial=Serial::OpenSerial(strPort,nBaudRate);
char ch;
int retry=100;
BOOL found=FALSE;
if(pSerial != NULL)
{
while(!found && retry)
{
if(!pSerial->ReadByte(&ch))
break;
else if(ch == '$')
found=TRUE;
retry--;
}
if(!found)
{
delete pSerial;
pSerial=NULL;
}
}
return (pSerial != NULL);
}
void GPS::CloseDevice()
{
if(pSerial != NULL)
{
Stop();
delete pSerial;
pSerial=NULL;
}
}
BOOL GPS::Run()
{
if(pSerial == NULL)
return FALSE;
hWorkthread=CreateThread(NULL,0,WorkProc,this,0,&dwWorkthread);
return (hWorkthread != NULL);
}
void GPS::Stop()
{
if(hWorkthread != NULL)
{
PostThreadMessage(dwWorkthread,WM_QUIT,0,0);
WaitForSingleObject(hWorkthread,5000);
hWorkthread=NULL;
}
}
BOOL GPS::IsLocationValid()
{
return (code != 0);
}
double GPS::GetTimestamp()
{
return 0;
}
double GPS::GetLongitude()
{
return longitude;
}
double GPS::GetLatitude()
{
return latitude;
}
double GPS::GetHeight()
{
return height;
}
void GPS::set_EventProc(LPGpsEventProc proc,LPVOID userptr)
{
lpUserPtr=userptr;
pEventProc=proc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -