📄 readgpsdlg.cpp
字号:
// $GPRMC,161135.000,V,2446.5222,N,12100.1590,E,,,161204,,*19
// 检查时间数据,eg:204700,A,
if( m_Buffer[i+1]<'0'||m_Buffer[i+1]>'9' ||
m_Buffer[i+2]<'0'||m_Buffer[i+2]>'9' ||
m_Buffer[i+3]<'0'||m_Buffer[i+3]>'9' ||
m_Buffer[i+4]<'0'||m_Buffer[i+4]>'9' ||
m_Buffer[i+5]<'0'||m_Buffer[i+5]>'9' ||
m_Buffer[i+6]<'0'||m_Buffer[i+6]>'9' ||
m_Buffer[i+7]!='.' ||
m_Buffer[i+8]<'0'||m_Buffer[i+8]>'9' ||
m_Buffer[i+9]<'0'||m_Buffer[i+9]>'9' ||
m_Buffer[i+10]<'0'||m_Buffer[i+10]>'9' ||
m_Buffer[i+11]!=',' ||
m_Buffer[i+12]!='A'&&m_Buffer[i+12]!='V' ||
m_Buffer[i+13]!=',' ||
// 检查纬度数据,eg:3403.868,N,
m_Buffer[i+14]<'0'||m_Buffer[i+14]>'9' ||
m_Buffer[i+15]<'0'||m_Buffer[i+15]>'9' ||
m_Buffer[i+16]<'0'||m_Buffer[i+16]>'9' ||
m_Buffer[i+17]<'0'||m_Buffer[i+17]>'9' ||
m_Buffer[i+18]!='.' ||
m_Buffer[i+19]<'0'||m_Buffer[i+19]>'9' ||
m_Buffer[i+20]<'0'||m_Buffer[i+20]>'9' ||
m_Buffer[i+21]<'0'||m_Buffer[i+21]>'9' ||
m_Buffer[i+22]<'0'||m_Buffer[i+22]>'9' ||
m_Buffer[i+23]!=',' ||
m_Buffer[i+24]!='N'&&m_Buffer[i+24]!='S' ||
m_Buffer[i+25]!=',' ||
// 检查经度数据,eg:11709.432,W,
m_Buffer[i+26]<'0'||m_Buffer[i+26]>'9' ||
m_Buffer[i+27]<'0'||m_Buffer[i+27]>'9' ||
m_Buffer[i+28]<'0'||m_Buffer[i+28]>'9' ||
m_Buffer[i+29]<'0'||m_Buffer[i+29]>'9' ||
m_Buffer[i+30]<'0'||m_Buffer[i+30]>'9' ||
m_Buffer[i+31]!='.' ||
m_Buffer[i+32]<'0'||m_Buffer[i+32]>'9' ||
m_Buffer[i+33]<'0'||m_Buffer[i+33]>'9' ||
m_Buffer[i+34]<'0'||m_Buffer[i+34]>'9' ||
m_Buffer[i+35]<'0'||m_Buffer[i+35]>'9' ||
m_Buffer[i+36]!=',' ||
m_Buffer[i+37]!='W'&&m_Buffer[i+37]!='E' ||
m_Buffer[i+38]!=',')
// 检查其它数据,eg:001.9,336.9,170698,013.6,E*6E
goto DATA_ERR;
xHour=(m_Buffer[i+1]-'0')*10+(m_Buffer[i+2]-'0');
xMin =(m_Buffer[i+3]-'0')*10+(m_Buffer[i+4]-'0');
xSec =(m_Buffer[i+5]-'0')*10+(m_Buffer[i+6]-'0');
bNorth=(m_Buffer[i+24]=='N');
bEast =(m_Buffer[i+37]=='E');
xJindu= (m_Buffer[i+26]-'0')*10000+
(m_Buffer[i+27]-'0')*1000+
(m_Buffer[i+28]-'0')*100+
(m_Buffer[i+29]-'0')*10+
(m_Buffer[i+30]-'0')+
(m_Buffer[i+32]-'0')*0.1+
(m_Buffer[i+33]-'0')*0.01+
(m_Buffer[i+34]-'0')*0.001+
(m_Buffer[i+35]-'0')*0.0001;
xWeidu= (m_Buffer[i+14]-'0')*1000+
(m_Buffer[i+15]-'0')*100+
(m_Buffer[i+16]-'0')*10+
(m_Buffer[i+17]-'0')+
(m_Buffer[i+19]-'0')*0.1+
(m_Buffer[i+20]-'0')*0.01+
(m_Buffer[i+21]-'0')*0.001+
(m_Buffer[i+22]-'0')*0.0001;
// int xYear,xMonth,xDay;
i=45;
while(m_Buffer[i]!=',') i++;
i++;
while(m_Buffer[i]!=',') i++;
i++;
if( m_Buffer[i+0]<'0'||m_Buffer[i+0]>'9' ||
m_Buffer[i+1]<'0'||m_Buffer[i+1]>'9' ||
m_Buffer[i+2]<'0'||m_Buffer[i+2]>'9' ||
m_Buffer[i+3]<'0'||m_Buffer[i+3]>'9' ||
m_Buffer[i+4]<'0'||m_Buffer[i+4]>'9' ||
m_Buffer[i+5]<'0'||m_Buffer[i+5]>'9')
goto DATA_ERR;
xYear =(m_Buffer[i+4]-'0')*10+m_Buffer[i+5]-'0';
xMonth=(m_Buffer[i+2]-'0')*10+m_Buffer[i+3]-'0';
xDay =(m_Buffer[i+0]-'0')*10+m_Buffer[i+1]-'0';
// if(xJindu!=m_Longitude||xWeidu!=m_Latitude) MessageBeep(0);
xJindu/=100;
xWeidu/=100;
if(xJindu!=m_Longitude) {m_Longitude=xJindu;m_CurLongitude=xJindu;}
if(xWeidu!=m_Latitude) {m_Latitude=xWeidu;m_CurLatitude=xWeidu;}
// if(xJindu!=m_Longitude||xWeidu!=m_Latitude)
// 按时区调整时间
m_dwDate=(xYear*16+xMonth)*32+xDay;
xTime=(xHour*60+xMin)*60+xSec+TIME_ADJ;
m_dwDate+=xTime/86400;
xTime=xTime%86400;
xHour=xTime/3600;
xMin=(xTime%3600)/60;
xSec=xTime%60;
m_dwTime=xHour*3600+xMin*60+xSec;
xYear=m_dwDate/512;
xMonth=(m_dwDate%512)/32;
xDay=m_dwDate%32;
m_CurTime.Format("%02d:%02d:%02d",xHour,xMin,xSec);
m_CurDate.Format("20%02d-%02d-%02d",xYear,xMonth,xDay);
UpdateData(FALSE);
// 显示位置
m_PositionX=(int)(xJindu);
m_PositionY=(int)(xWeidu);
if(bNorth) m_PositionY*=-1;
if(!bEast) m_PositionX*=-1;
sprintf(m_ShowStr,"[%04d]时间 %02d-%02d-%02d %02d:%02d:%02d %s经%5.3f° %s纬%4.3f°",m_DCnt++,xYear,xMonth,xDay,xHour,xMin,xSec,bEast?"东":"西",xJindu,bNorth?"北":"南",xWeidu);
// TRACE("%s\n",m_ShowStr);
/*
if(m_PositionList.GetCount()<8)
m_PositionList.AddString(m_ShowStr);
else
{
m_PositionList.DeleteString(0);
m_PositionList.AddString(m_ShowStr);
}
*/
GetDlgItem(IDC_MAP)->Invalidate();
memcpy(m_Buffer,&m_Buffer[26],m_BufPos-26);
m_BufPos-=26;
goto MAINLOOP;
CONNECT_GGA:
// 正常数据
// $GPGGA,213912.000,2446.5222,N,12100.1590,E,0,00,,,M,,M,,*45
// TRACE("%s\n",m_Buffer);
xHour=0;
i=6;
// $GPRMC,161135.000,V,2446.5222,N,12100.1590,E,,,161204,,*19
// 检查时间数据,eg:204700,A,
if( m_Buffer[i+1]<'0'||m_Buffer[i+1]>'9' ||
m_Buffer[i+2]<'0'||m_Buffer[i+2]>'9' ||
m_Buffer[i+3]<'0'||m_Buffer[i+3]>'9' ||
m_Buffer[i+4]<'0'||m_Buffer[i+4]>'9' ||
m_Buffer[i+5]<'0'||m_Buffer[i+5]>'9' ||
m_Buffer[i+6]<'0'||m_Buffer[i+6]>'9' ||
m_Buffer[i+7]!='.' ||
m_Buffer[i+8]<'0'||m_Buffer[i+8]>'9' ||
m_Buffer[i+9]<'0'||m_Buffer[i+9]>'9' ||
m_Buffer[i+10]<'0'||m_Buffer[i+10]>'9' ||
m_Buffer[i+11]!=',' ||
// 检查纬度数据,eg:3403.868,N,
m_Buffer[i+12]<'0'||m_Buffer[i+12]>'9' ||
m_Buffer[i+13]<'0'||m_Buffer[i+13]>'9' ||
m_Buffer[i+14]<'0'||m_Buffer[i+14]>'9' ||
m_Buffer[i+15]<'0'||m_Buffer[i+15]>'9' ||
m_Buffer[i+16]!='.' ||
m_Buffer[i+17]<'0'||m_Buffer[i+17]>'9' ||
m_Buffer[i+18]<'0'||m_Buffer[i+18]>'9' ||
m_Buffer[i+19]<'0'||m_Buffer[i+19]>'9' ||
m_Buffer[i+20]<'0'||m_Buffer[i+20]>'9' ||
m_Buffer[i+21]!=',' ||
m_Buffer[i+22]!='N'&&m_Buffer[i+22]!='S' ||
m_Buffer[i+23]!=',' ||
// 检查经度数据,eg:11709.432,W,
m_Buffer[i+24]<'0'||m_Buffer[i+24]>'9' ||
m_Buffer[i+25]<'0'||m_Buffer[i+25]>'9' ||
m_Buffer[i+26]<'0'||m_Buffer[i+26]>'9' ||
m_Buffer[i+27]<'0'||m_Buffer[i+27]>'9' ||
m_Buffer[i+28]<'0'||m_Buffer[i+28]>'9' ||
m_Buffer[i+29]!='.' ||
m_Buffer[i+30]<'0'||m_Buffer[i+30]>'9' ||
m_Buffer[i+31]<'0'||m_Buffer[i+31]>'9' ||
m_Buffer[i+32]<'0'||m_Buffer[i+32]>'9' ||
m_Buffer[i+33]<'0'||m_Buffer[i+33]>'9' ||
m_Buffer[i+34]!=',' ||
m_Buffer[i+35]!='W'&&m_Buffer[i+35]!='E' ||
m_Buffer[i+36]!=',')
// 检查其它数据,eg:001.9,336.9,170698,013.6,E*6E
goto DATA_ERR;
xHour=(m_Buffer[i+1]-'0')*10+(m_Buffer[i+2]-'0');
xMin =(m_Buffer[i+3]-'0')*10+(m_Buffer[i+4]-'0');
xSec =(m_Buffer[i+5]-'0')*10+(m_Buffer[i+6]-'0');
bNorth=(m_Buffer[i+22]=='N');
bEast =(m_Buffer[i+35]=='E');
xJindu= (m_Buffer[i+24]-'0')*10000+
(m_Buffer[i+25]-'0')*1000+
(m_Buffer[i+26]-'0')*100+
(m_Buffer[i+27]-'0')*10+
(m_Buffer[i+28]-'0')+
(m_Buffer[i+30]-'0')*0.1+
(m_Buffer[i+31]-'0')*0.01+
(m_Buffer[i+32]-'0')*0.001+
(m_Buffer[i+33]-'0')*0.0001;
xWeidu= (m_Buffer[i+12]-'0')*1000+
(m_Buffer[i+13]-'0')*100+
(m_Buffer[i+14]-'0')*10+
(m_Buffer[i+15]-'0')+
(m_Buffer[i+17]-'0')*0.1+
(m_Buffer[i+18]-'0')*0.01+
(m_Buffer[i+19]-'0')*0.001+
(m_Buffer[i+20]-'0')*0.0001;
// if(xJindu!=m_Longitude||xWeidu!=m_Latitude) MessageBeep(MB_ICONEXCLAMATION);
xJindu/=100;
xWeidu/=100;
if(xJindu!=m_Longitude) {m_Longitude=xJindu;m_CurLongitude=xJindu;}
if(xWeidu!=m_Latitude) {m_Latitude=xWeidu;m_CurLatitude=xWeidu;}
// if(xJindu!=m_Longitude||xWeidu!=m_Latitude)
// 按时区调整时间
xTime=((xHour*60+xMin)*60+xSec+TIME_ADJ)%86400;
xHour=xTime/3600;
xMin=(xTime%3600)/60;
xSec=xTime%60;
m_CurTime.Format("%02d:%02d:%02d",xHour,xMin,xSec);
UpdateData(FALSE);
// 显示位置
m_PositionX=(int)(xJindu);
m_PositionY=(int)(xWeidu);
if(bNorth) m_PositionY*=-1;
if(!bEast) m_PositionX*=-1;
sprintf(m_ShowStr,"[%04d]时间 %02d:%02d:%02d %s经%5.3f° %s纬%4.3f°",m_DCnt++,xHour,xMin,xSec,bEast?"东":"西",xJindu,bNorth?"北":"南",xWeidu);
// TRACE("%s\n",m_ShowStr);
/*
if(m_PositionList.GetCount()<8)
m_PositionList.AddString(m_ShowStr);
else
{
m_PositionList.DeleteString(0);
m_PositionList.AddString(m_ShowStr);
}
*/
GetDlgItem(IDC_MAP)->Invalidate();
memcpy(m_Buffer,&m_Buffer[42],m_BufPos-42);
m_BufPos-=42;
goto MAINLOOP;
CONNECT_GSV:
// $GPGSV, 3,1,09,03,77,217,00, 19,48,207,00, 23,47,284,00, 16,43,028,00 *72
// $GPGSV, 3,1,09, 03,77,217,00,
// 19,48,207,00,
// 23,47,284,00,
// 16,43,028,00 *72
i=13;
int nSatelliteID;
int nAngle1,nAngle2;
do
{
if( m_Buffer[i+1]<'0'||m_Buffer[i+1]>'9' ||
m_Buffer[i+2]<'0'||m_Buffer[i+2]>'9' ||
m_Buffer[i+3]!=',' ||
m_Buffer[i+4]<'0'||m_Buffer[i+4]>'9' ||
m_Buffer[i+5]<'0'||m_Buffer[i+5]>'9' ||
m_Buffer[i+6]!=',' ||
m_Buffer[i+7]<'0'||m_Buffer[i+7]>'9' ||
m_Buffer[i+8]<'0'||m_Buffer[i+8]>'9' ||
m_Buffer[i+9]<'0'||m_Buffer[i+9]>'9' ||
m_Buffer[i+5]<'0'||m_Buffer[i+10]>'9' ||
m_Buffer[i+10]!=',' ||
m_Buffer[i+11]<'0'||m_Buffer[i+11]>'9' ||
m_Buffer[i+12]<'0'||m_Buffer[i+12]>'9')
goto DATA_ERR;
//
nSatelliteID=(m_Buffer[i+1]-'0')*10+m_Buffer[i+2]-'0';
if(nSatelliteID<MAX_SATELLITE)
{
nAngle1=(m_Buffer[i+4]-'0')*10+m_Buffer[i+5]-'0';
nAngle2=(m_Buffer[i+7]-'0')*100+(m_Buffer[i+8]-'0')*10+m_Buffer[i+9]-'0';
if(nAngle1<=90&&nAngle2<360)
{
m_Satellite[nSatelliteID].m_LiveTime=MAX_LIVETIME;
m_Satellite[nSatelliteID].xpos=(int)(BMP_SATELLITE_W/2+(nAngle1*BMP_SATELLITE_R/90)*cos((nAngle2+90)*2*PI/360));
m_Satellite[nSatelliteID].ypos=(int)(BMP_SATELLITE_H/2-(nAngle1*BMP_SATELLITE_R/90)*sin((nAngle2+90)*2*PI/360));
GetDlgItem(IDC_SATELLITE)->Invalidate();
}
}
i+=13;
}while(m_Buffer[i]==',');
memcpy(m_Buffer,&m_Buffer[28],m_BufPos-28);
m_BufPos-=28;
goto MAINLOOP;
DATA_ERR:
memcpy(m_Buffer,&m_Buffer[6],m_BufPos-=6);
m_BufPos-=6;
goto MAINLOOP;
return ;
}
void CReadGPSDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(nIDCtl==IDC_MAP)
{
CDC *pDC = new CDC();
pDC->Attach(lpDrawItemStruct->hDC);
CRect rect;
::GetClientRect(lpDrawItemStruct->hwndItem,&rect);
CBitmap bmp;
bmp.LoadBitmap(IDB_MAP);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBmp;
BITMAP bm;
bmp.GetBitmap(&bm);
pOldBmp=(CBitmap*)memDC.SelectObject(&bmp);
pDC->BitBlt(0,0,rect.Width()<bm.bmWidth?rect.Width():bm.bmWidth,rect.Height()<bm.bmHeight?rect.Height():bm.bmHeight,&memDC,0,0,SRCCOPY);
bmp.DeleteObject();
int x,y;
// m_PositionX=120;
// m_PositionY=24;
x=(m_PositionX+180)*680/360-16;
y=(m_PositionY+90)*341/180-16;
pDC->DrawIcon(x,y,m_hIconPosition);
// pDC->BitBlt(100,100,28,28,&memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBmp);
delete pDC;
}
else if(nIDCtl==IDC_SATELLITE)
{
CDC *pDC = new CDC();
pDC->Attach(lpDrawItemStruct->hDC);
CRect rect;
::GetClientRect(lpDrawItemStruct->hwndItem,&rect);
CBitmap bmp;
bmp.LoadBitmap(IDB_SATELLITE);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBmp;
BITMAP bm;
bmp.GetBitmap(&bm);
pOldBmp=(CBitmap*)memDC.SelectObject(&bmp);
pDC->BitBlt(0,0,rect.Width()<bm.bmWidth?rect.Width():bm.bmWidth,rect.Height()<bm.bmHeight?rect.Height():bm.bmHeight,&memDC,0,0,SRCCOPY);
bmp.DeleteObject();
int i,x,y;
CString str;
for(i=0;i<32;i++)
{
if(m_Satellite[i].m_LiveTime>0)
{
x=m_Satellite[i].xpos;
y=m_Satellite[i].ypos;
pDC->DrawIcon(x,y,m_hIconSatellite);
// pDC->BitBlt((m_Satellite[i].xpos+180)*680/180,(m_Satellite[i].ypos+90)*341/90,28,28,&memDC,0,0,SRCCOPY);
str.Format("%d",i);
rect.left=x+1;
rect.right=x+32;
rect.top=y+9;
rect.bottom=y+32+9;
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
// pDC->SetTextAlign(TA_BOTTOM);
pDC->DrawText(str,&rect,DT_CENTER);
}
}
memDC.SelectObject(pOldBmp);
delete pDC;
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
double GetDistance(double longitude1,double latitude1,double longitude2,double latitude2)
{
// RADIUS_EARTH:地球半径
double a,b,c,dlongitude,dlatitude,dis;
if(longitude1<0) longitude1=360-longitude1;
if(longitude2<0) longitude2=360-longitude2;
dlongitude=fabs(longitude1-longitude2);
if(dlongitude<1.0e-9) dlongitude=0;
if(dlongitude>180) dlongitude-=180;
dlatitude=latitude1-latitude2;
dlatitude=fabs(dlatitude);
if(dlatitude<1.0e-9) dlatitude=0;
b=sin((90-fabs(latitude1))*2*PI/360)*RADIUS_EARTH;
b=2*b*sin(dlongitude*PI/360);
c=sin((90-fabs(latitude2))*2*PI/360)*RADIUS_EARTH;
c=2*c*sin(dlongitude*PI/360);
a=sin(dlatitude*PI/360)*RADIUS_EARTH*2;
dis=sqrt(a*a+b*c);
dis=RADIUS_EARTH*2*asin(dis/2/RADIUS_EARTH);
return dis;
}
double GetPrecisionEW(double latitude)
{
// 0.0001度时的东西方向经度,南北方向经度不变
double precision=sin((90-fabs(latitude))*2*PI/360)*RADIUS_EARTH*0.0001*2*PI/360;
TRACE("%f\n",precision);
return precision;
}
void CReadGPSDlg::OnSavePositon()
{
// double dis;
// dis=GetDistance(121.001590,24.465222,121.001590,24.465222);
// TRACE("%f\n",dis);
// GetPrecision(0);
// GetPrecision(60);
char tt[200];
sprintf(tt,"TIME:%s,%f,%f\r\n",__TIME__,m_Longitude,m_Latitude);
m_LogFile.Write(tt,strlen(tt));
}
// #define RADIUS_EARTH 6370000 // 6.37*1000,000
// 2446.5222,12100.1590
BOOL CReadGPSDlg::DestroyWindow()
{
#ifdef FILE_LOG_TEST
if(m_LogFile.m_hFile!=CFile::hFileNull) m_LogFile.Close();
#endif
#ifdef DATA_LOG_TEST
if(m_DataLogFile.m_hFile!=CFile::hFileNull) m_DataLogFile.Close();
#endif
return CDialog::DestroyWindow();
}
void CReadGPSDlg::OnClose()
{
#ifdef FILE_LOG_TEST
if(m_LogFile.m_hFile!=CFile::hFileNull) m_LogFile.Close();
#endif
#ifdef DATA_LOG_TEST
if(m_DataLogFile.m_hFile!=CFile::hFileNull) m_DataLogFile.Close();
#endif
CDialog::OnClose();
}
void CReadGPSDlg::OnSetRef1()
{
UpdateData();
m_Longitude1=m_CurLongitude;
m_Latitude1 =m_CurLatitude;
m_dwTime1=m_dwTime;
m_dwDate1=m_dwDate;
m_Time1.Format("%02d:%02d:%02d",m_dwTime1/3600,(m_dwTime1%3600)/60,m_dwTime1%60);
m_Date1.Format("20%02d-%02d-%02d",m_dwDate1/512,(m_dwDate1%512)/32,m_dwDate1%32);
UpdateData(FALSE);
}
void CReadGPSDlg::OnSetRef2()
{
UpdateData();
m_Longitude2=m_CurLongitude;
m_Latitude2 =m_CurLatitude;
m_dwTime2=m_dwTime;
m_dwDate2=m_dwDate;
m_Time2.Format("%02d:%02d:%02d",m_dwTime2/3600,(m_dwTime2%3600)/60,m_dwTime2%60);
m_Date2.Format("20%02d-%02d-%02d",m_dwDate2/512,(m_dwDate2%512)/32,m_dwDate2%32);
UpdateData(FALSE);
}
void CReadGPSDlg::OnComputeRef1()
{
UpdateData();
m_Distant1=GetDistance(m_CurLongitude,m_CurLatitude,m_Longitude1,m_Latitude1);
UpdateData(FALSE);
}
void CReadGPSDlg::OnComputeRef2()
{
UpdateData();
m_Distant2=GetDistance(m_CurLongitude,m_CurLatitude,m_Longitude2,m_Latitude2);
UpdateData(FALSE);
}
void CReadGPSDlg::OnTest()
{
// 3403.868
// dis=GetDistance(121.001590,24.465222,121.001590,24.465222);
double dis;
dis=GetDistance(121.001590,24.465222,121.001591,24.465222);
TRACE("%f\n",dis);
dis=GetDistance(121.001590,24.465222,121.001590,24.465223);
TRACE("%f\n",dis);
dis=GetDistance(121.001590,24.465222,121.001591,24.465223);
TRACE("%f\n",dis);
// 0.101195
// 0.111177
// 0.150336
// TRACE("%f\n",sqrt(0.101195*0.101195+0.111177*0.111177));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -