📄 nmeaparserdlg.cpp
字号:
// NMEAParserDemoDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Parser.h"
#include "NmeaParser.h"
#include "NMEAParserDlg.h"
#define NMEA_SEND_TIMER 100
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//// UART SETTING
#define UART_SET_PARITY_NONE (0<<3)
#define UART_SET_PARITY_ODD (4<<3)
#define UART_SET_PARITY_EVEN (5<<3)
#define UART_SET_STOPBIT_ONE (0<<2)
#define UART_SET_STOPBIT_TWO (1<<2)
#define UART_SET_FRMLEN_5BIT 0
#define UART_SET_FRMLEN_6BIT 1
#define UART_SET_FRMLEN_7BIT 2
#define UART_SET_FRMLEN_8BIT 3
#define MAX_BAUD_RATE 230000
// IO_CTL code
#define IOCTL_GPS_CH0_SETBAUDRATE 0x1000
#define IOCTL_GPS_CH1_SETBAUDRATE 0x1001
//#define IOCTL_GPS_CH0_RXDATA 0x2000
#define IOCTL_GPS_CH1_TXDATA 0x2000
#define IOCTL_GPS_CH0_CLEAR_RXBUFF 0x3000
#define IOCTL_GPS_GET_RXEVENTHANDLE 0x4000
typedef struct {
DWORD baudrate;
BYTE bitsetcode;
} Uart_Config_t;
/////////////////////////////////////////////////////////////////////////////
// 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()
/////////////////////////////////////////////////////////////////////////////
// CNMEAParserDemoDlg dialog
HWND hCommWnd;
CNMEAParserDemoDlg::CNMEAParserDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNMEAParserDemoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CNMEAParserDemoDlg)
m_iBaudRate = -1;
m_strReceive = _T("");
m_strSend = _T("");
m_iSerialPort = 0;
m_iSerialPort2 = 1;
m_iSerialPort3 = 2;
m_iSerialPort4 = 3;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
g_errCnt = 0; //051101hj
g_nCnt =0; //051101hj
hCommWnd = NULL;
}
void CNMEAParserDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNMEAParserDemoDlg)
DDX_Control(pDX, IDC_PRG_SPEED, m_cSpeed);
DDX_Control(pDX, IDC_FILE_LOAD, m_cProgress);
DDX_Control(pDX, IDC_SLIDER_SPEED, m_SendSpeed);
DDX_Control(pDX, IDC_SERIAL_PORT, m_cSerialPort);
DDX_Control(pDX, IDC_SEND, m_EditSend);
DDX_Control(pDX, IDC_RECEIVE, m_EditReceive);
DDX_Control(pDX, IDC_BAUD_RATE, m_cBaudRate);
DDX_Control(pDX, IDC_SAT_VIEW, m_SatView);
DDX_Control(pDX, IDC_SNR0, m_ctrlSNR0);
DDX_Control(pDX, IDC_SNR1, m_ctrlSNR1);
DDX_Control(pDX, IDC_SNR2, m_ctrlSNR2);
DDX_Control(pDX, IDC_SNR3, m_ctrlSNR3);
DDX_Control(pDX, IDC_SNR4, m_ctrlSNR4);
DDX_Control(pDX, IDC_SNR5, m_ctrlSNR5);
DDX_Control(pDX, IDC_SNR6, m_ctrlSNR6);
DDX_Control(pDX, IDC_SNR7, m_ctrlSNR7);
DDX_Control(pDX, IDC_SNR8, m_ctrlSNR8);
DDX_Control(pDX, IDC_SNR9, m_ctrlSNR9);
DDX_Control(pDX, IDC_SNR10, m_ctrlSNR10);
DDX_Control(pDX, IDC_SNR11, m_ctrlSNR11);
DDX_CBIndex(pDX, IDC_BAUD_RATE, m_iBaudRate);
DDX_Text(pDX, IDC_RECEIVE, m_strReceive);
DDX_Text(pDX, IDC_SEND, m_strSend);
DDX_CBIndex(pDX, IDC_SERIAL_PORT, m_iSerialPort);
DDX_CBIndex(pDX, IDC_SERIAL_PORT2, m_iSerialPort2);
DDX_CBIndex(pDX, IDC_SERIAL_PORT3, m_iSerialPort3);
DDX_CBIndex(pDX, IDC_SERIAL_PORT4, m_iSerialPort4);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNMEAParserDemoDlg, CDialog)
//{{AFX_MSG_MAP(CNMEAParserDemoDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_PORT_OPEN, OnPortOpen)
ON_BN_CLICKED(IDC_PORT_CLOSE, OnPortClose)
ON_BN_CLICKED(IDC_FILE_OPEN, OnFileOpen)
ON_BN_CLICKED(IDC_SEND_DATA, OnSendData)
ON_BN_CLICKED(IDC_SEND_DATA_CLEAR, OnSendDataClear)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_SPEED, OnReleasedcaptureSliderSpeed)
ON_MESSAGE(WM_COMM_READ , OnCommunication) //眠啊
ON_CBN_SELCHANGE(IDC_SERIAL_PORT, OnSelchangeSerialPort)
ON_CBN_SELCHANGE(IDC_BAUD_RATE, OnSelchangeBaudRate)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BTN_PAUSE, OnBtnPause)
ON_BN_CLICKED(IDC_BTN_STOP, OnBtnStop)
ON_BN_CLICKED(IDC_CHK_REPEAT, OnChkRepeat)
ON_BN_CLICKED(IDC_BTN_STEP, OnBtnStep)
ON_BN_CLICKED(IDC_BTN_UP, OnBtnUp)
ON_BN_CLICKED(IDC_BTN_DOWN, OnBtnDown)
ON_BN_CLICKED(IDC_CHECK_YEAR, OnCheckYear)
ON_BN_CLICKED(IDC_PORT_OPEN2, OnPortOpen2)
ON_BN_CLICKED(IDC_PORT_OPEN3, OnPortOpen3)
ON_BN_CLICKED(IDC_PORT_OPEN4, OnPortOpen4)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNMEAParserDemoDlg message handlers
DWORD CPULoadThread(LPVOID lpParameter);
BOOL CNMEAParserDemoDlg::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);
// 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
// cglee m_Sio.InitComm(1, 4800, NOPARITY, 8, ONESTOPBIT, FALSE);
gRxMegaBuf = (BYTE*)malloc( READMAXSIZE);
InitSnrRange();
InitSnrPos();
m_n3DFix = 0;
m_nSoundCnt = 0;
m_nSoundTick = 0;
m_bRepeat = FALSE;
hCommWnd = m_hWnd;
m_SendSpeed.SetRange(1, 100, TRUE);
m_SendSpeed.SetPos(3);
m_nTimerSpeed = 3;
InitNmeaData();
m_cSpeed.SetRange(0,150);
m_cSpeed.SetPos(0);
// cglee m_pGraph = new CGraph(SCATTER_GRAPH);
// cglee m_gPrevDataSet.SetPosition(0,0);
m_dwDataCount = 0;
m_bSimYear = TRUE;
m_NMEAParser.m_pCommPort = m_CommPort;
return TRUE; // return TRUE unless you set the focus to a control
}
void CNMEAParserDemoDlg::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 CNMEAParserDemoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
// cglee 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);
}
#if 0 // cglee
else
{
CWnd* graphFrame = (CWnd*)GetDlgItem(IDC_STATIC_DRAW);
CDC* pDC = graphFrame->GetDC();
m_pGraph->DrawGraph(pDC);
ReleaseDC(pDC);
}
#endif
CDialog::OnPaint();
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CNMEAParserDemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void CNMEAParserDemoDlg::OnTimer(UINT nIDEvent)
{
if ( nIDEvent == NMEA_SEND_TIMER ) {
SendNmeaData();
UpdateText();
}
CDialog::OnTimer(nIDEvent);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
BOOL CNMEAParserDemoDlg::CreateGpsLog(byte * pLogBuf, TCHAR *lFileName, int wCnt) //051031hj
{
TCHAR strPath[128]={0,};
CTime t = CTime::GetCurrentTime();
_stprintf(strPath,_T("\\Storage Card\\%s%02d%02d.txt"),lFileName,t.GetHour(),t.GetMinute());
HANDLE m_hFile = ::CreateFile(strPath,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);
if(!m_hFile || m_hFile == INVALID_HANDLE_VALUE)
return FALSE;
//WRITE
SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN);
DWORD dwWriteBytes = 0;
if(!WriteFile(m_hFile, pLogBuf, wCnt, &dwWriteBytes, NULL))
{
CloseHandle(m_hFile);
return FALSE;
}
CloseHandle(m_hFile);
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void CNMEAParserDemoDlg::UpdateText()
{
CString str; // used for formatting strings
CString str2;
//
// Update NMEA sentence count
//
str.Format(_T("Rx:%X"), m_NMEAParser.m_dwCommandCount);
SetDlgItemText(IDC_NMEA_RX_COUNT, str);
str.Format(_T("Crc:%X"), m_NMEAParser.m_dwCrcCount);
SetDlgItemText(IDC_CRC_ERROR_COUNT, str);
str.Format(_T("Err:%X"), m_NMEAParser.m_dwErrorCount);
SetDlgItemText(IDC_BUF_ERROR_COUNT, str);
// str.Format(_T("Etc:%X"), m_NMEAParser.m_dwCommandEtc);
// SetDlgItemText(IDC_ETC_COUNT, str);
//
// GGA Lat/Lon/Alt
//
str.Format(_T("Lat:%.04f"), m_NMEAParser.m_dGGALatitude);
SetDlgItemText(IDC_LAT, str);
str.Format(_T("Lon:%.04f"), m_NMEAParser.m_dGGALongitude);
SetDlgItemText(IDC_LON, str);
str.Format(_T("Alt:%.04f"), m_NMEAParser.m_dGGAAltitude);
SetDlgItemText(IDC_ALT, str);
//
// GGA GPS Quality
//
switch(m_NMEAParser.m_btGGAGPSQuality)
{
case 0 : str = _T("Not Avail"); break;
case 1 : str = _T("SPS mode"); break;
case 2 : str = _T("DGPS mode"); break;
case 3 : str = _T("PPS mode"); break;
default : str = _T("Unknown"); break;
}
SetDlgItemText(IDC_GPS_QUAL, str);
//
// GSA Fix mode and Dops
//
#if 0 //cglee
switch(m_NMEAParser.m_btGSAMode)
{
case 'M' : str = _T("(Manual)"); break;
case 'A' : str = _T("(Automatic)"); break;
default : str = _T("(?)"); break;
}
SetDlgItemText(IDC_GSA_MODE,str);
#endif
switch(m_NMEAParser.m_btGSAFixMode)
{
case 1 : str = _T("Not Avail"); break;
case 2 : str = _T("2D Fix"); break;
case 3 : str = _T("3D Fix"); break;
default : str = _T("Unknown"); break;
}
SetDlgItemText(IDC_FIX_MODE, str);
str.Format(_T("VDOP:%.02f"), m_NMEAParser.m_dGSAVDOP);
SetDlgItemText(IDC_VDOP, str);
str.Format(_T("HDOP:%.02f"), m_NMEAParser.m_dGSAHDOP);
SetDlgItemText(IDC_HDOP, str);
str.Format(_T("PDOP:%.02f"), m_NMEAParser.m_dGSAPDOP);
SetDlgItemText(IDC_PDOP, str);
str = _T("");
str.Format(_T("%4d/%2d/%2d"), m_NMEAParser.m_wRMCYear, m_NMEAParser.m_btRMCMonth,m_NMEAParser.m_btRMCDay);
SetDlgItemText(IDC_STATIC_DATE, str);
str = _T("");
str.Format(_T("%2d:%2d:%2d"), (m_NMEAParser.m_btGGAHour+9)%24, m_NMEAParser.m_btGGAMinute,m_NMEAParser.m_btGGASecond);
SetDlgItemText(IDC_TIME, str);
// Speed
str = _T("");
str.Format(_T("%.02fKm/h"), m_NMEAParser.m_dRMCGroundSpeed*1.852);
SetDlgItemText(IDC_SPEED, str);
m_cSpeed.SetPos(int(m_NMEAParser.m_dRMCGroundSpeed*1.852));
// Course
str = _T("");
str.Format(_T("%.02f"), m_NMEAParser.m_dRMCCourse);
SetDlgItemText(IDC_COMPASS, str);
//
// GSA satellites used in solution
//
str = _T("");
for(int i = 0; i < 12; i++)
{
// cglee str2.Format(_T("%02d "), m_NMEAParser.m_wGSASatsInSolution[i]);
str2.Format(_T("%02d "), m_NMEAParser.m_GSVSatInfo[i].m_wPRN);
str += str2;
}
SetDlgItemText(IDC_SATS_USED_IN_SOL, str);
m_NMEAParser.m_nInViewAverage = 0.0;
m_NMEAParser.m_nWorkAverage = 0.0;
m_NMEAParser.m_nUsedCount = 0;
m_NMEAParser.m_nGoodSat = 0;
for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
{
if ( m_NMEAParser.m_GSVSatInfo[i].m_bUsedInSolution ) {
SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, m_NMEAParser.m_btGSAFixMode );
m_NMEAParser.m_nWorkAverage += m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality;
m_NMEAParser.m_nUsedCount ++;
if ( m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality > 36.00 ) m_NMEAParser.m_nGoodSat++;
}
else {
SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, 0 );
}
// Average
m_NMEAParser.m_nInViewAverage += m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality;
#if 0
if ( IsUsedInSolution(m_NMEAParser.m_GSVSatInfo[i].m_wPRN) )
SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, m_NMEAParser.m_btGSAFixMode );
else if ( m_NMEAParser.m_btGSAFixMode == 3 ) // 3D Fix
SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, 0 );
else
SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, m_NMEAParser.m_btGSAFixMode );
#endif
}
if ( m_NMEAParser.m_wGSVTotalNumSatsInView ) {
m_NMEAParser.m_nInViewAverage = m_NMEAParser.m_nInViewAverage / (double)m_NMEAParser.m_wGSVTotalNumSatsInView;
str = _T("");
str.Format(_T("Veiw:%02d[%.02f]"), m_NMEAParser.m_wGSVTotalNumSatsInView,m_NMEAParser.m_nInViewAverage);
SetDlgItemText(IDC_SATS_IN_VIEW, str);
}
if ( m_NMEAParser.m_nWorkAverage ) {
m_NMEAParser.m_nWorkAverage = m_NMEAParser.m_nWorkAverage / (double)m_NMEAParser.m_nUsedCount;
str = _T("");
str.Format(_T("Work:%02d[%.02f]"), m_NMEAParser.m_nUsedCount, m_NMEAParser.m_nWorkAverage);
SetDlgItemText(IDC_AVERAGE, str);
}
// str2.Format(_T("%02d "), m_NMEAParser.m_wGSASatsInSolution[i]);
// str2.Format(_T("%02d "), m_NMEAParser.m_GSVSatInfo[i].m_wPRN);
// switch(m_NMEAParser.m_btGSAFixMode)
for(; i < 12; i++)
{
SetSnr(i, 0,0);
}
#if 0 // cglee
str = _T("");
for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
{
str2.Format(_T("%02d "), m_NMEAParser.m_GSVSatInfo[i].m_wPRN);
str += str2;
}
SetDlgItemText(IDC_GSV_PRN, str);
#endif
#if 0 // cglee
str = _T("");
for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
{
str2.Format(_T("%03d "), m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality);
str += str2;
}
SetDlgItemText(IDC_GSV_SNR, str);
str = _T("");
for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
{
str2.Format(_T("%03d "), m_NMEAParser.m_GSVSatInfo[i].m_wAzimuth);
str += str2;
}
SetDlgItemText(IDC_GSV_AZ, str);
str = _T("");
for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
{
str2.Format(_T("%03d "), m_NMEAParser.m_GSVSatInfo[i].m_wElevation);
str += str2;
}
SetDlgItemText(IDC_GSV_ELV, str);
#endif
// cglee
m_SatView.DrawSatellites(m_NMEAParser.m_GSVSatInfo );
}
///////////////////////////////////////////////////////////////////////////////
HANDLE CNMEAParserDemoDlg::OpenGPSUart( DWORD baudrate, BYTE fbitcode )
{
return NULL;
}
int CNMEAParserDemoDlg::ColdReset(void)
{
return 0;
}
void CNMEAParserDemoDlg::InitSnrRange(void)
{
int nRange = 60;
m_ctrlSNR0.SetRange(0, nRange);
m_ctrlSNR1.SetRange(0, nRange);
m_ctrlSNR2.SetRange(0, nRange);
m_ctrlSNR3.SetRange(0, nRange);
m_ctrlSNR4.SetRange(0, nRange);
m_ctrlSNR5.SetRange(0, nRange);
m_ctrlSNR6.SetRange(0, nRange);
m_ctrlSNR7.SetRange(0, nRange);
m_ctrlSNR8.SetRange(0, nRange);
m_ctrlSNR9.SetRange(0, nRange);
m_ctrlSNR10.SetRange(0, nRange);
m_ctrlSNR11.SetRange(0, nRange);
}
void CNMEAParserDemoDlg::InitSnrPos(void)
{
m_ctrlSNR0.SetPos(0);
m_ctrlSNR1.SetPos(0);
m_ctrlSNR2.SetPos(0);
m_ctrlSNR3.SetPos(0);
m_ctrlSNR4.SetPos(0);
m_ctrlSNR5.SetPos(0);
m_ctrlSNR6.SetPos(0);
m_ctrlSNR7.SetPos(0);
m_ctrlSNR8.SetPos(0);
m_ctrlSNR9.SetPos(0);
m_ctrlSNR10.SetPos(0);
m_ctrlSNR11.SetPos(0);
}
void CNMEAParserDemoDlg::SetSnr(int index, int snr_val, int mode)
{
CMacProgressCtrl *pSnr=NULL;
switch ( index ) {
case 0 : pSnr = &m_ctrlSNR0; break;
case 1 : pSnr = &m_ctrlSNR1; break;
case 2 : pSnr = &m_ctrlSNR2; break;
case 3 : pSnr = &m_ctrlSNR3; break;
case 4 : pSnr = &m_ctrlSNR4; break;
case 5 : pSnr = &m_ctrlSNR5; break;
case 6 : pSnr = &m_ctrlSNR6; break;
case 7 : pSnr = &m_ctrlSNR7; break;
case 8 : pSnr = &m_ctrlSNR8; break;
case 9 : pSnr = &m_ctrlSNR9; break;
case 10 : pSnr = &m_ctrlSNR10; break;
case 11 : pSnr = &m_ctrlSNR11; break;
default : pSnr=NULL;
}
if ( pSnr == NULL ) {
TRACE("\r\nSNR Index Error %d", index);
return;
}
#if 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -