📄 gmarkview.cpp
字号:
// gmarkView.cpp : implementation of the CGmarkView class
//
#include "stdafx.h"
#include "gmark.h"
#include "gmarkDoc.h"
#include "gmarkView.h"
#include "serial.h"
#include "define.h"
#include "ras.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifndef _WIN32_WCE_CEPC
HRASCONN hRasConn = NULL;
const UINT WM_RASEVENT = WM_RASDIALEVENT;
#else
HANDLE hRasConn = NULL;
const UINT WM_RASEVENT = WM_USER;
#endif
HANDLE hReadSocketThread;
#ifdef _SAVE_RTCM
FILE *fpRtcm;
#endif
#ifdef _SAVE_GPSDATA
FILE *fpGps; //save the GPS result data
#endif
CONF_DATA gtConfData;
/////////////////////////////////////////////////////////////////////////////
// CGmarkView
IMPLEMENT_DYNCREATE(CGmarkView, CFormView)
BEGIN_MESSAGE_MAP(CGmarkView, CFormView)
//{{AFX_MSG_MAP(CGmarkView)
ON_BN_CLICKED(IDC_BUTTON_DIAL, OnButtonDial)
ON_BN_CLICKED(IDC_BUTTON_HANGUP, OnButtonHangup)
ON_REGISTERED_MESSAGE(WM_RASEVENT, OnRasDialEvent)
ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose)
ON_BN_CLICKED(IDC_BUTTON_INIT, OnButtonInit)
ON_BN_CLICKED(IDC_BUTTON_CONNECT, OnButtonConnect)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON_GGAOFF, OnButtonGgaoff)
ON_BN_CLICKED(IDC_BUTTON_GGA2S, OnButtonGga2s)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON_TESTMAP, OnButtonTestmap)
ON_BN_CLICKED(IDC_BUTTON_LOGON, OnButtonLogon)
ON_BN_CLICKED(IDC_BUTTON_LOGOFF, OnButtonLogoff)
ON_BN_CLICKED(IDC_BUTTON_RTCMON, OnButtonRtcmon)
ON_BN_CLICKED(IDC_BUTTON_RTCMOFF, OnButtonRtcmoff)
ON_BN_CLICKED(IDC_BUTTON_PBNON2, OnButtonPbnon2)
ON_MESSAGE(WM_GPSRECEIVED, OnGpsReceived)
ON_MESSAGE(WM_GPSUPDATE, OnGpsUpdate)
ON_MESSAGE(WM_AUTOPROCESS, AutoProcess)
ON_BN_CLICKED(IDC_BUTTON_PBNOFF, OnButtonPbnoff)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGmarkView construction/destruction
CGmarkView::CGmarkView()
: CFormView(CGmarkView::IDD)
{
//{{AFX_DATA_INIT(CGmarkView)
//}}AFX_DATA_INIT
// TODO: add construction code here
memset( gtConfData.szBaseIP, 0, sizeof(gtConfData.szBaseIP) );
memset( gtConfData.szRoverID, 0, sizeof(gtConfData.szRoverID) );
memset( gtConfData.szRoverDesc, 0, sizeof(gtConfData.szRoverDesc) );
memset( m_RTCMBuf, 0, sizeof(m_RTCMBuf) );
m_bCloseSocketFlg = FALSE;
m_Socket = INVALID_SOCKET;
m_bNeedActivate = FALSE;
m_hDialCompleteEvent = CreateEvent(0, FALSE, FALSE, 0);
}
CGmarkView::~CGmarkView()
{
}
void CGmarkView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGmarkView)
DDX_Control(pDX, IDC_TAB_MAIN, m_tabMain);
//}}AFX_DATA_MAP
}
BOOL CGmarkView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGmarkView diagnostics
#ifdef _DEBUG
void CGmarkView::AssertValid() const
{
CFormView::AssertValid();
}
void CGmarkView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CGmarkDoc* CGmarkView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGmarkDoc)));
return (CGmarkDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGmarkView message handlers
void CGmarkView::OnButtonDial()
{
// TODO: Add your control notification handler code here
#ifndef _WIN32_WCE_CEPC
RASDIALPARAMS RasDialParams;
DWORD dwNotifierType = 0xFFFFFFFF;
HWND hwnd;
int iRet=0;
RasDialParams.dwSize = sizeof(RASDIALPARAMS);
wcscpy( RasDialParams.szEntryName, _T("GPRS57600") );
wcscpy( RasDialParams.szPhoneNumber, _T("") );
wcscpy( RasDialParams.szCallbackNumber, _T("") );
wcscpy( RasDialParams.szUserName, _T("") );
wcscpy( RasDialParams.szPassword, _T("") );
wcscpy( RasDialParams.szDomain, _T("") );
hwnd = this->m_hWnd;
iRet = RasDial( NULL,
NULL,
&RasDialParams,
dwNotifierType,
hwnd,
&hRasConn
);
if(iRet != 0)
{
MessageBox(_T("Failed to connect to CMNET"));
}
#endif
}
void CGmarkView::OnButtonHangup()
{
// TODO: Add your control notification handler code here
#ifndef _WIN32_WCE_CEPC
if (hRasConn != NULL)
{
RasHangUp(hRasConn);
hRasConn = NULL;
// ::Sleep(2000);
RASCONNSTATUS rStatus;
while( RasGetConnectStatus(hRasConn, &rStatus) != ERROR_INVALID_HANDLE )
{
::Sleep(0);
}
}
#endif
}
LRESULT CGmarkView::OnRasDialEvent(WPARAM wp, LPARAM lp)
{
#ifndef _WIN32_WCE_CEPC
RASCONNSTATE rasstate= (RASCONNSTATE)wp;
CEdit *edtInfo = (CEdit *)GetDlgItem(IDC_EDIT_STATUS_DIAL);
switch(rasstate)
{
case RASCS_OpenPort:
edtInfo->SetWindowText(_T("To open COM port乧乧"));
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("To open COM port乧乧"));
/////////////////////
break;
case RASCS_PortOpened:
edtInfo->SetWindowText(_T("Port opened."));
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Port opened."));
/////////////////////
break;
case RASCS_ConnectDevice:
edtInfo->SetWindowText(_T("To connect device乧乧"));
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("To connect device乧乧"));
/////////////////////
break;
case RASCS_DeviceConnected:
edtInfo->SetWindowText(_T("Device connected."));
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Device connected."));
/////////////////////
break;
case RASCS_Authenticate:
edtInfo->SetWindowText(_T("To verify user and password乧乧"));
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("To verify user and password乧乧"));
/////////////////////
break;
case RASCS_Authenticated:
edtInfo->SetWindowText(_T("Verification passed"));
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Verification passed"));
/////////////////////
break;
case RASCS_Connected:
edtInfo->SetWindowText(_T("Connected"));
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Connected"));
/////////////////////
SetEvent(m_hDialCompleteEvent);
break;
case RASCS_Disconnected:
edtInfo->SetWindowText(_T("Disconnected"));
hRasConn=NULL;
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Disconnected"));
/////////////////////
break;
default:
return (LRESULT)0;
}
#endif
return (LRESULT)0;
}
void CGmarkView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
// read the configuration
char filename[MAX_PATH+1];
// read the configuration file
if( !ReadConfig() )
{
AfxGetMainWnd()->PostMessage(WM_CLOSE);
return;
}
// Initialize gps module
m_Gps.SetOrigPosition( gtConfData.dOrigLon, gtConfData.dOrigLat );
//set view handle to gps
m_Gps.SetViewHandle( m_hWnd );
//set view window object
m_Gps.SetViewWnd(this);
//Initialize the share memory
m_hMap = CreateFileMapping( INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE | SEC_COMMIT,
0,
sizeof(GPS_DATA),
MAP_FILENAME );
if (m_hMap != NULL)
{
m_lpMapBuf = (LPBYTE)MapViewOfFile(m_hMap, FILE_MAP_WRITE, 0, 0, 0);
if (m_lpMapBuf == NULL)
{
CloseHandle(m_hMap);
m_hMap = NULL;
}
}
// Open the log file
memset( filename, 0, sizeof(filename) );
CreateFilename(filename, FN_LOG);
m_Log.Open(filename);
m_Gps.m_pLog = &m_Log; //for test
// open a file to save rtcm data
#ifdef _SAVE_RTCM
fpRtcm = fopen("\\Storage Card\\rtcm.dat", "wb");
#endif
// Open a file to save gps data
#ifdef _SAVE_GPSDATA
memset( filename, 0, sizeof(filename) );
CreateFilename(filename, FN_GPSDATA);
fpGps = fopen(filename, "wtc");
#endif
// complet the main tab control
RECT rect;
m_tabMain.InitDialogs();
m_tabMain.InsertItem(0, _T("Monitor"));
m_tabMain.InsertItem(1, _T("Operate"));
m_tabMain.InsertItem(2, _T("Setup"));
m_tabMain.InsertItem(3, _T("Advance"));
GetWindowRect(&rect);
m_tabMain.SetWindowPos(&CWnd::wndTopMost, 0, 0,
rect.right-rect.left, rect.bottom-rect.top, 0);
m_tabMain.ActivateTabDialogs();
m_dlgMonitor = m_tabMain.GetMonitorDlg();
m_dlgOperate = m_tabMain.GetOperateDlg();
m_dlgSetup = m_tabMain.GetSetupDlg ();
m_dlgAdvance = m_tabMain.GetAdvanceDlg();
if(gtConfData.bAutoStart)
{
PostMessage(WM_AUTOPROCESS, 0, 0);
}
//set gps to dialogs
m_dlgAdvance->SetGps(&m_Gps);
}
void CGmarkView::OnGpsReceived(WPARAM w, LPARAM l)
{
//set busy flag
m_Gps.m_bGpsMsgBusy = TRUE;
unsigned char * buf = (unsigned char *)l;
int nBytes = (int)w;
/*TCHAR wBuff[GPS_MAX_NEMASIZE+1];
// Convert from MultiByte to UNICODE
mbstowcs(wBuff, (const char *)buf, GPS_MAX_NEMASIZE);
// Display the received data
AddText2Edit( IDC_EDIT_GPSMSG, wBuff );*/
////////////////////
m_dlgMonitor->UpdateGpsMsg((const char *)buf);
////////////////////
#if 1
// compose gps message into a complete record
m_Gps.CompleteMsg(buf, nBytes);
#else
ProcessMsg(buf, nBytes);
#endif
// write received message to file
#ifdef _SAVE_GPSDATA
#ifdef _SAVE_GPSMSG
fprintf(fpGps, "%s", buf);
#endif
#endif
if(buf)
{
delete buf;
buf = NULL;
}
//Create gps data
m_Gps.CreateGPSData();
//reset busy flag
m_Gps.m_bGpsMsgBusy = FALSE;
}
void CGmarkView::OnGpsUpdate(WPARAM w, LPARAM l)
{
/* char szTemp[100];
UpdateData(false);
m_nStatus = m_Gps.m_tGpsData.Status;
m_nSatNum = m_Gps.m_tGpsData.SatCount;
memset( szTemp, 0, sizeof(szTemp) );
sprintf(szTemp, "%f", m_Gps.m_tGpsData.Longitude);
m_szLon = szTemp;
memset( szTemp, 0, sizeof(szTemp) );
sprintf(szTemp, "%f", m_Gps.m_tGpsData.Latitude);
m_szLat = szTemp;
memset( szTemp, 0, sizeof(szTemp) );
sprintf(szTemp, "%f", m_Gps.m_tGpsData.X);
m_szX = szTemp;
memset( szTemp, 0, sizeof(szTemp) );
sprintf(szTemp, "%f", m_Gps.m_tGpsData.Y);
m_szY = szTemp;
//refresh the gps status message
if( m_nStatus > 0 )
{
m_szGpsStatus = _T("Normal");
UpdateData(false);
}
UpdateData(false);
*/
// write gps result data to file
#ifdef _SAVE_GPSDATA
if( m_Gps.m_tGpsData.Status > 0 )
{
fprintf( fpGps,
":%f,%f,%d,%d\n=%f,%f\n",
m_Gps.m_tGpsData.Longitude,
m_Gps.m_tGpsData.Latitude,
m_Gps.m_tGpsData.SatCount,
m_Gps.m_tGpsData.Status,
m_Gps.m_tGpsData.X,
m_Gps.m_tGpsData.Y);
fflush(fpGps);
}
#endif
// write gps data into the mapfile in shareable memory
MapGpsData();
/////////////////////
m_dlgMonitor->UpdateGpsData( &m_Gps.m_tGpsData );
/////////////////////
}
void CGmarkView::OnButtonClose()
{
// TODO: Add your control notification handler code here
if(m_Gps.Close() == RET_NG)
{
MessageBox(_T("Close GPS port A or B failed!"));
return;
}
// kill the timer
KillTimer( m_nMonitorTimer );
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_COMM, _T("Gps port closed"));
m_dlgOperate->GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);
m_dlgOperate->GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);
/////////////////////
}
void CGmarkView::OnButtonInit()
{
// TODO: Add your control notification handler code here
m_Gps.Initialize( 4800 );
}
void CGmarkView::OnButtonConnect()
{
// TODO: Add your control notification handler code here
// connect gps
if(m_Gps.Connect() == RET_NG) return;
// start timer to monitor if gps receiving is normal
m_nMonitorTimer = SetTimer( 1, GPS_CON_MONITOR_INTERVAL, 0 );
/////////////////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_COMM, _T("Gps port opened"));
m_dlgOperate->GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(FALSE);
m_dlgOperate->GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(TRUE);
/////////////////////
}
void CGmarkView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
static BOOL bGpsWarn = FALSE;
switch( nIDEvent )
{
case 1: //m_nMonitorTimer
if( m_Gps.m_tGpsData.Status == 0 )
{
if( bGpsWarn )
{
// m_szGpsStatus = _T("No Position Data");
// UpdateData(false);
}
else
{
bGpsWarn = TRUE;
}
}
else
{
bGpsWarn = FALSE;
}
break;
case 2: //m_nActivate -- to activate the GPRS connection
// m_bNeedActivate = TRUE;
break;
}
CFormView::OnTimer(nIDEvent);
}
void CGmarkView::OnButtonGgaoff()
{
// TODO: Add your control notification handler code here
m_Gps.SendCmd("$PASHS,NME,GGA,A,OFF");
}
void CGmarkView::OnButtonGga2s()
{
// TODO: Add your control notification handler code here
m_Gps.SendCmd("$PASHS,NME,GGA,A,ON,2");
}
void CGmarkView::MapGpsData()
{
memcpy(m_lpMapBuf, &(m_Gps.m_tGpsData), sizeof(m_Gps.m_tGpsData));
}
void CGmarkView::OnClose()
{
// TODO: Add your message handler code here and/or call default
if (m_lpMapBuf != NULL)
{
UnmapViewOfFile(m_lpMapBuf);
m_lpMapBuf = NULL;
}
if (m_hMap != NULL)
{
CloseHandle(m_hMap);
m_hMap = NULL;
}
// Close the log file
m_Log.Close();
#ifdef _SAVE_RTCM
fclose(fpRtcm);
#endif
#ifdef _SAVE_GPSDATA
fclose(fpGps);
#endif
CFormView::OnClose();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -