⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmarkview.cpp

📁 这个程序包含了wince串口、GPS信号处理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -