?? readgpsdlg.cpp
字號:
// ReadGPSDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ReadGPS.h"
#include "ReadGPSDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "math.h"
#define TIMER_GPS 112
#define MAX_LIVETIME 1000
#define COM_PORT_NAME "COM5"
#define TIME_ADJ (28*3600)
#define BMP_SATELLITE_W 145
#define BMP_SATELLITE_H 145
#define BMP_SATELLITE_R 64
#define PI 3.1415926
// 地球子午線(南極到北極的連線)長度39940.67公里,緯度一度合110.94公里,一分合1.849公里,一秒合30.8米,不同緯度的間距是一樣的。
// 地球赤道圈長度40075.36公里,北京和烏魯木齊地區(qū)在北緯40度左右,緯度圈長為40075*sin(90-40),因此這里的經(jīng)度一度合85.276公里,一分合1.42公里,一秒合23.69米。
#define RADIUS_EARTH 6370000 // 6.37*1000,000
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReadGPSDlg dialog
CReadGPSDlg::CReadGPSDlg(CWnd* pParent /*=NULL*/)
: CDialog(CReadGPSDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CReadGPSDlg)
m_CurLatitude = 0.0;
m_CurLongitude = 0.0;
m_CurDate = _T("");
m_CurTime = _T("");
m_Date2 = _T("");
m_Date1 = _T("");
m_Distant1 = 0.0;
m_Distant2 = 0.0;
m_Latitude2 = 0.0;
m_Latitude1 = 0.0;
m_Longitude1 = 0.0;
m_Longitude2 = 0.0;
m_Time1 = _T("");
m_Time2 = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_BufPos=0;
m_DCnt=0;
#ifdef M_DEBUG
m_TestCnt=0;
#endif
for(int i=0;i<MAX_SATELLITE;i++)
{
m_Satellite[i].m_LiveTime=0;
m_Satellite[i].xpos=0;
m_Satellite[i].ypos=0;
}
#ifdef M_DEBUG
m_Satellite[1].m_LiveTime=20;
m_Satellite[4].m_LiveTime=20;
m_Satellite[7].m_LiveTime=20;
m_Satellite[12].m_LiveTime=20;
int nAngle1,nAngle2;
nAngle1=45;
nAngle2=0;
if(nAngle1<=90&&nAngle2<360)
{
m_Satellite[1].m_LiveTime=MAX_LIVETIME;
m_Satellite[1].xpos=(int)(BMP_SATELLITE_W/2-15+(nAngle1*BMP_SATELLITE_R/90)*cos((nAngle2+90)*2*PI/360)+0.5);
m_Satellite[1].ypos=(int)(BMP_SATELLITE_H/2-15-(nAngle1*BMP_SATELLITE_R/90)*sin((nAngle2+90)*2*PI/360)+0.5);
}
nAngle1=45;
nAngle2=90;
if(nAngle1<=90&&nAngle2<360)
{
m_Satellite[4].m_LiveTime=MAX_LIVETIME;
m_Satellite[4].xpos=(int)(BMP_SATELLITE_W/2-15+(nAngle1*BMP_SATELLITE_R/90)*cos((nAngle2+90)*2*PI/360)+0.5);
m_Satellite[4].ypos=(int)(BMP_SATELLITE_H/2-15-(nAngle1*BMP_SATELLITE_R/90)*sin((nAngle2+90)*2*PI/360)+0.5);
}
nAngle1=45;
nAngle2=180;
if(nAngle1<=90&&nAngle2<360)
{
m_Satellite[7].m_LiveTime=MAX_LIVETIME;
m_Satellite[7].xpos=(int)(BMP_SATELLITE_W/2-15+(nAngle1*BMP_SATELLITE_R/90)*cos((nAngle2+90)*2*PI/360)+0.5);
m_Satellite[7].ypos=(int)(BMP_SATELLITE_H/2-15-(nAngle1*BMP_SATELLITE_R/90)*sin((nAngle2+90)*2*PI/360)+0.5);
}
nAngle1=45;
nAngle2=270;
if(nAngle1<=90&&nAngle2<360)
{
m_Satellite[12].m_LiveTime=MAX_LIVETIME;
m_Satellite[12].xpos=(int)(BMP_SATELLITE_W/2-15+(nAngle1*BMP_SATELLITE_R/90+0.5)*cos((nAngle2+90)*2*PI/360)+0.5);
m_Satellite[12].ypos=(int)(BMP_SATELLITE_H/2-15-(nAngle1*BMP_SATELLITE_R/90+0.5)*sin((nAngle2+90)*2*PI/360)+0.5);
}
#endif
m_hIconSatellite=AfxGetApp()->LoadIcon(IDI_SATELLITE);
m_hIconPosition=AfxGetApp()->LoadIcon(IDI_POSITION);
#ifdef FILE_LOG_TEST
if(m_LogFile.Open("PositionLogFile.txt",CFile::modeWrite,NULL)==NULL)
{
if(m_LogFile.Open("PositionLogFile.txt",CFile::modeCreate|CFile::modeWrite,NULL)==NULL)
{
MessageBox("文件打開失敗!");
m_LogFile.m_hFile=NULL;
}
}
else
{
m_LogFile.SeekToEnd();
char tt[200];
sprintf(tt,"-------------%s-------------\r\n",__TIME__);
m_LogFile.Write(tt,strlen(tt));
}
#endif
#ifdef DATA_LOG_TEST
if(m_DataLogFile.Open("DataLogFile.txt",CFile::modeWrite,NULL)==NULL)
{
if(m_DataLogFile.Open("DataLogFile.txt",CFile::modeCreate|CFile::modeWrite,NULL)==NULL)
{
MessageBox("文件打開失敗!");
m_DataLogFile.m_hFile=NULL;
}
}
else
{
m_DataLogFile.SeekToEnd();
char tt[200];
sprintf(tt,"-------------%s-------------\r\n",__TIME__);
m_DataLogFile.Write(tt,strlen(tt));
}
#endif
m_dwTime1=0;
m_dwTime2=0;
m_dwTime=0;
m_dwDate1=0;
m_dwDate2=0;
m_dwDate=0;
}
void CReadGPSDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReadGPSDlg)
DDX_Text(pDX, IDC_CUR_LATITUDE, m_CurLatitude);
DDX_Text(pDX, IDC_CUR_LONGITUDE, m_CurLongitude);
DDX_Text(pDX, IDC_CUR_DATE, m_CurDate);
DDX_Text(pDX, IDC_CUR_TIME, m_CurTime);
DDX_Text(pDX, IDC_DATE2, m_Date2);
DDX_Text(pDX, IDC_DATE1, m_Date1);
DDX_Text(pDX, IDC_DISTANT1, m_Distant1);
DDX_Text(pDX, IDC_DISTANT2, m_Distant2);
DDX_Text(pDX, IDC_LATITUDE2, m_Latitude2);
DDX_Text(pDX, IDC_LATITUDE1, m_Latitude1);
DDX_Text(pDX, IDC_LONGITUDE1, m_Longitude1);
DDX_Text(pDX, IDC_LONGITUDE2, m_Longitude2);
DDX_Text(pDX, IDC_TIME1, m_Time1);
DDX_Text(pDX, IDC_TIME2, m_Time2);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CReadGPSDlg, CDialog)
//{{AFX_MSG_MAP(CReadGPSDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_WM_DRAWITEM()
ON_BN_CLICKED(IDC_SAVE_POSITON, OnSavePositon)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_SET_REF1, OnSetRef1)
ON_BN_CLICKED(IDC_SET_REF2, OnSetRef2)
ON_BN_CLICKED(IDC_COMPUTE_REF1, OnComputeRef1)
ON_BN_CLICKED(IDC_COMPUTE_REF2, OnComputeRef2)
ON_BN_CLICKED(IDC_TEST, OnTest)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReadGPSDlg message handlers
BOOL CReadGPSDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
if(m_ComPort.Open(COM_PORT_NAME)!=ERROR_SUCCESS)
{
MessageBox("串口打開失敗!");
exit(0);
}
m_ComPort.Setup(CComPort::EBaud4800,CComPort::EData8,CComPort::EParNone,CComPort::EStop1);
SetTimer(TIMER_GPS,100,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CReadGPSDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CReadGPSDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CReadGPSDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CReadGPSDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent==TIMER_GPS)
{
int i;
for(i=0;i<MAX_SATELLITE;i++)
{
if(m_Satellite[i].m_LiveTime>0)
m_Satellite[i].m_LiveTime--;
}
#ifdef M_DEBUG
m_TestCnt++;
if(m_TestCnt>=40)
{
m_TestCnt=0;
if(m_BufPos<BUFFER_LENGTH-100)
{
strcpy(&m_Buffer[m_BufPos],"09.432,W,001.9,336.9,170698,013.6,E*6E");
m_BufPos+=strlen("09.432,W,001.9,336.9,170698,013.6,E*6E");
}
}
else if(m_TestCnt==20)
{
// m_TestCnt=0;
if(m_BufPos<BUFFER_LENGTH-100)
{
strcpy(&m_Buffer[m_BufPos],"$GPRMC,204700,A,3403.868,N,117");
m_BufPos+=strlen("$GPRMC,204700,A,3403.868,N,117");
}
}
#else
DWORD nLen;
// m_ComPort.Read(&m_Buffer[m_BufPos],BUFFER_LENGTH-m_BufPos,&nLen,0,200);
m_ComPort.Read(&m_Buffer[m_BufPos],BUFFER_LENGTH-m_BufPos,&nLen,0,0);
#ifdef DATA_LOG_TEST
if(nLen>0)
m_DataLogFile.Write(&m_Buffer[m_BufPos],nLen);
#endif
m_BufPos+=nLen;
m_Buffer[m_BufPos]=0;
#endif
PositionUpdate();
}
CDialog::OnTimer(nIDEvent);
}
void CReadGPSDlg::PositionUpdate()
{
int i;
int xHour,xMin,xSec;
int xYear,xMonth,xDay;
DWORD xTime;
double xJindu,xWeidu;
BOOL bNorth,bEast;
char m_ShowStr[128];
// $GPRMC,161135.000,V,2446.5222,N,12100.1590,E,,,161204,,*19
MAINLOOP:
// 查找"$GPRMC,"
while(m_BufPos>70)
{
i=0;
if( m_Buffer[i]=='$' &&
m_Buffer[i+1]=='G' &&
m_Buffer[i+2]=='P')
{
TRACE("%s\n",m_Buffer);
if( m_Buffer[i+3]=='R' &&
m_Buffer[i+4]=='M' &&
m_Buffer[i+5]=='C' &&
m_Buffer[i+6]==',')
{
if(m_BufPos-i>61)
{
if( m_Buffer[i+17]==',' &&
m_Buffer[i+18]=='A' &&
m_Buffer[i+19]==',')
{
goto CONNECT;
}
//*
else if(m_Buffer[i+17]==',' &&
m_Buffer[i+18]=='V' &&
m_Buffer[i+19]==',')
{
// goto NOT_CONNECT;
goto CONNECT;
}
//*/
else
{
goto DATA_ERR;
}
}
// 繼續(xù)等待數(shù)據(jù)
return ;
}
else if(m_Buffer[i+3]=='G' &&
m_Buffer[i+4]=='G' &&
m_Buffer[i+5]=='A' &&
m_Buffer[i+6]==',')
{
// TRACE("%s\n",m_Buffer);
// GPGGA,213912.000,2446.5222,N,12100.1590,E,0,00,,,M,,M,,*45
if(m_BufPos-i>61)
{
if( m_Buffer[i+13]=='.' &&
m_Buffer[i+17]==',' &&
m_Buffer[i+22]=='.' &&
m_Buffer[i+27]==',' &&
m_Buffer[i+29]==',' &&
m_Buffer[i+35]=='.' &&
m_Buffer[i+40]==',' &&
m_Buffer[i+42]==',')
{
goto CONNECT_GGA;
}
else
{
goto DATA_ERR;
}
}
// 繼續(xù)等待數(shù)據(jù)
return ;
}
else if(m_Buffer[i+3]=='G' &&
m_Buffer[i+4]=='S' &&
m_Buffer[i+5]=='V' &&
m_Buffer[i+6]==',')
{
// TRACE("%s\n",m_Buffer);
// $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
if(m_BufPos-i>20)
{
if( m_Buffer[i+7]>='0' && m_Buffer[i+7]<='9' &&
m_Buffer[i+8]==',' &&
m_Buffer[i+9]>='0' && m_Buffer[i+9]<='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' &&
m_Buffer[i+13]==',' )
{
goto CONNECT_GSV;
}
else
{
goto DATA_ERR;
}
}
// 繼續(xù)等待數(shù)據(jù)
return ;
}
}
for(i=0;i<m_BufPos;i++)
{
m_Buffer[i]=m_Buffer[i+1];
}
m_BufPos--;
}
return ;
CONNECT:
// 正常數(shù)據(jù)
// $GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E
// TRACE("%s\n",m_Buffer);
xHour=0;
i=6;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -