www.pudn.com > GPS ToolKit Pro.rar > GTKTestPanelDlg.cpp


// GTKTestPanelDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "GTKTestPanel.h" 
#include "GTKTestPanelDlg.h" 
#include "comdef.h" 
#include  
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define NUM_SNR_BARS 12 
 
using namespace std; 
///////////////////////////////////////////////////////////////////////////// 
// CGTKTestPanelDlg dialog 
 
CGTKTestPanelDlg::CGTKTestPanelDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CGTKTestPanelDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CGTKTestPanelDlg) 
	m_degLabel = _T(""); 
	m_minLabel = _T(""); 
	m_secLabel = _T(""); 
	m_altitude = _T(""); 
	m_lat = _T(""); 
	m_lon = _T(""); 
	m_speed = _T(""); 
	m_fixStatus = _T(""); 
	m_fixQuality = _T(""); 
	m_fixDateTime = _T(""); 
	m_DGPSRefStation = _T(""); 
	m_geoidHeight = _T(""); 
	m_numSatellites = _T(""); 
	m_timeSinceLastDGPSUpdate = _T(""); 
	m_trueCourse = _T(""); 
	m_magVar = _T(""); 
	m_strOpMode = _T(""); 
	m_strHDOP = _T(""); 
	m_strPDOP = _T(""); 
	m_strVDOP = _T(""); 
	m_origWptID = _T(""); 
	m_destWptID = _T(""); 
	m_arrivedAtDest = _T(""); 
	m_destWptLat = _T(""); 
	m_destWptLon = _T(""); 
	m_rangeToDest = _T(""); 
	m_trueBearingToDest = _T(""); 
	m_destClosingVelocity = _T(""); 
	m_crossTrackError = _T(""); 
	m_origToDestTrueBearing = _T(""); 
	m_origToDestMagBearing = _T(""); 
	m_routeName = _T(""); 
	m_txtFileName = _T(""); 
	m_dblTimeScale = 0.0; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CGTKTestPanelDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CGTKTestPanelDlg) 
	DDX_Control(pDX, IDC_BUTTON_CLOSE, m_cmdClose); 
	DDX_Control(pDX, IDC_BUTTON_OPEN, m_cmdOpen); 
	DDX_Control(pDX, IDC_BUTTON_OPENFILE, m_cmdOpenFile); 
	DDX_Control(pDX, IDC_EDIT_TIMESCALE, m_editTimeScale); 
	DDX_Control(pDX, IDC_EDIT_FILENAME, m_editFileName); 
	DDX_Control(pDX, IDC_COMBO_ALTUNITS, m_comboAltUnits); 
	DDX_Control(pDX, IDC_COMBO_SPEEDUNITS, m_comboSpeedUnits); 
	DDX_Control(pDX, IDC_COMBO_LATLONFORMAT, m_comboLatLonFormat); 
	DDX_Control(pDX, IDC_COMBO_DISTUNITS, m_comboDistUnits); 
	DDX_Control(pDX, IDC_LISTVIEW_ROUTE, m_routeWptList); 
	DDX_Control(pDX, IDC_STATIC_SATPICTURE, m_satPicture); 
	DDX_Control(pDX, IDC_LIST_RAWDATA, m_rawDataListBox); 
	DDX_Control(pDX, IDC_COMBO_BAUD, m_baudRateCombo); 
	DDX_Control(pDX, IDC_COMBO_PORT, m_portNameCombo); 
	DDX_Text(pDX, IDC_EDIT_DEGLABEL, m_degLabel); 
	DDX_Text(pDX, IDC_EDIT_MINLABEL, m_minLabel); 
	DDX_Text(pDX, IDC_EDIT_SECLABEL, m_secLabel); 
	DDX_Text(pDX, IDC_EDIT_ALT, m_altitude); 
	DDX_Text(pDX, IDC_EDIT_LAT, m_lat); 
	DDX_Text(pDX, IDC_EDIT_LON, m_lon); 
	DDX_Text(pDX, IDC_EDIT_SPEED, m_speed); 
	DDX_Text(pDX, IDC_EDIT_FIXSTATUS, m_fixStatus); 
	DDX_Text(pDX, IDC_EDIT_FIXQUALITY, m_fixQuality); 
	DDX_Text(pDX, IDC_EDIT_DATETIME, m_fixDateTime); 
	DDX_Text(pDX, IDC_EDIT_DGPSREFSTATION, m_DGPSRefStation); 
	DDX_Text(pDX, IDC_EDIT_GEOIDHEIGHT, m_geoidHeight); 
	DDX_Text(pDX, IDC_EDIT_NUMSATELLITES, m_numSatellites); 
	DDX_Text(pDX, IDC_EDIT_TIMESINCEDGPSUPDATE, m_timeSinceLastDGPSUpdate); 
	DDX_Text(pDX, IDC_EDIT_TRUECOURSE, m_trueCourse); 
	DDX_Text(pDX, IDC_EDIT_MAGVAR, m_magVar); 
	DDX_Text(pDX, IDC_EDIT_OPMODE, m_strOpMode); 
	DDX_Text(pDX, IDC_EDIT_HDOP, m_strHDOP); 
	DDX_Text(pDX, IDC_EDIT_PDOP, m_strPDOP); 
	DDX_Text(pDX, IDC_EDIT_VDOP, m_strVDOP); 
	DDX_Text(pDX, IDC_EDIT_ORIGINWPT, m_origWptID); 
	DDX_Text(pDX, IDC_EDIT_DESTWPT, m_destWptID); 
	DDX_Text(pDX, IDC_EDIT_ARRIVED, m_arrivedAtDest); 
	DDX_Text(pDX, IDC_EDIT_DESTWPTLAT, m_destWptLat); 
	DDX_Text(pDX, IDC_EDIT_DESTWPTLON, m_destWptLon); 
	DDX_Text(pDX, IDC_EDIT_RANGETODEST, m_rangeToDest); 
	DDX_Text(pDX, IDC_EDIT_TRUEBEARINGTODEST, m_trueBearingToDest); 
	DDX_Text(pDX, IDC_EDIT_DESTCLOSINGVELOCITY, m_destClosingVelocity); 
	DDX_Text(pDX, IDC_EDIT_CROSSTRACKERROR, m_crossTrackError); 
	DDX_Text(pDX, IDC_EDIT_ORIGTODESTTRUEBEARING, m_origToDestTrueBearing); 
	DDX_Text(pDX, IDC_EDIT_ORIGTODESTMAGBEARING, m_origToDestMagBearing); 
	DDX_Text(pDX, IDC_EDITROUTENAME, m_routeName); 
	DDX_Text(pDX, IDC_EDIT_FILENAME, m_txtFileName); 
	DDX_Text(pDX, IDC_EDIT_TIMESCALE, m_dblTimeScale); 
	DDX_Control(pDX, IDC_GPSTOOLKIT, m_myGPSToolKit); 
	//}}AFX_DATA_MAP 
 
	DDX_Control(pDX, IDC_SNRBAR, m_snrBar[0]); 
	DDX_Control(pDX, IDC_SNRBAR2, m_snrBar[1]); 
	DDX_Control(pDX, IDC_SNRBAR3, m_snrBar[2]); 
	DDX_Control(pDX, IDC_SNRBAR4, m_snrBar[3]); 
	DDX_Control(pDX, IDC_SNRBAR5, m_snrBar[4]); 
	DDX_Control(pDX, IDC_SNRBAR6, m_snrBar[5]); 
	DDX_Control(pDX, IDC_SNRBAR7, m_snrBar[6]); 
	DDX_Control(pDX, IDC_SNRBAR8, m_snrBar[7]); 
	DDX_Control(pDX, IDC_SNRBAR9, m_snrBar[8]); 
	DDX_Control(pDX, IDC_SNRBAR10, m_snrBar[9]); 
	DDX_Control(pDX, IDC_SNRBAR11, m_snrBar[10]); 
	DDX_Control(pDX, IDC_SNRBAR12, m_snrBar[11]); 
 
	DDX_Control(pDX, IDC_SNRBARPRN, m_snrBarPrn[0]); 
	DDX_Control(pDX, IDC_SNRBARPRN2, m_snrBarPrn[1]); 
	DDX_Control(pDX, IDC_SNRBARPRN3, m_snrBarPrn[2]); 
	DDX_Control(pDX, IDC_SNRBARPRN4, m_snrBarPrn[3]); 
	DDX_Control(pDX, IDC_SNRBARPRN5, m_snrBarPrn[4]); 
	DDX_Control(pDX, IDC_SNRBARPRN6, m_snrBarPrn[5]); 
	DDX_Control(pDX, IDC_SNRBARPRN7, m_snrBarPrn[6]); 
	DDX_Control(pDX, IDC_SNRBARPRN8, m_snrBarPrn[7]); 
	DDX_Control(pDX, IDC_SNRBARPRN9, m_snrBarPrn[8]); 
	DDX_Control(pDX, IDC_SNRBARPRN10, m_snrBarPrn[9]); 
	DDX_Control(pDX, IDC_SNRBARPRN11, m_snrBarPrn[10]); 
	DDX_Control(pDX, IDC_SNRBARPRN12, m_snrBarPrn[11]); 
} 
 
BEGIN_MESSAGE_MAP(CGTKTestPanelDlg, CDialog) 
	//{{AFX_MSG_MAP(CGTKTestPanelDlg) 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonOpen) 
	ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose) 
	ON_EN_CHANGE(IDC_EDIT_DEGLABEL, OnChangeEditDeglabel) 
	ON_EN_CHANGE(IDC_EDIT_MINLABEL, OnChangeEditMinlabel) 
	ON_EN_CHANGE(IDC_EDIT_SECLABEL, OnChangeEditSeclabel) 
	ON_CBN_SELCHANGE(IDC_COMBO_BAUD, OnSelchangeComboBaud) 
	ON_CBN_SELCHANGE(IDC_COMBO_ALTUNITS, OnSelchangeComboAltunits) 
	ON_CBN_SELCHANGE(IDC_COMBO_SPEEDUNITS, OnSelchangeComboSpeedunits) 
	ON_BN_CLICKED(IDC_RADIO_DEG, OnRadioDeg) 
	ON_BN_CLICKED(IDC_RADIO_DEGMIN, OnRadioDegmin) 
	ON_BN_CLICKED(IDC_RADIO_DEGMINSEC, OnRadioDegminsec) 
	ON_CBN_SELCHANGE(IDC_COMBO_DISTUNITS, OnSelchangeComboDistunits) 
	ON_CBN_SELCHANGE(IDC_COMBO_LATLONFORMAT, OnSelchangeComboLatlonformat) 
	ON_BN_CLICKED(IDC_BUTTON_OPENFILE, OnButtonOpenfile) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
BEGIN_EVENTSINK_MAP(CGTKTestPanelDlg, CDialog) 
    //{{AFX_EVENTSINK_MAP(CGTKTestPanelDlg) 
	ON_EVENT(CGTKTestPanelDlg, IDC_GPSTOOLKIT, 3 /* FixUpdate */, OnFixUpdateGpstoolkit, VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT) 
	ON_EVENT(CGTKTestPanelDlg, IDC_GPSTOOLKIT, 1 /* RawDataReceived */, OnRawDataReceivedGpstoolkit, VTS_VARIANT VTS_VARIANT) 
	ON_EVENT(CGTKTestPanelDlg, IDC_GPSTOOLKIT, 5 /* SatelliteUpdate */, OnSatelliteUpdateGpstoolkit, VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT) 
	ON_EVENT(CGTKTestPanelDlg, IDC_GPSTOOLKIT, 4 /* NavUpdate */, OnNavUpdateGpstoolkit, VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT) 
	ON_EVENT(CGTKTestPanelDlg, IDC_GPSTOOLKIT, 7 /* FileComplete */, OnFileCompleteGpstoolkit, VTS_NONE) 
	//}}AFX_EVENTSINK_MAP 
END_EVENTSINK_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGTKTestPanelDlg message handlers 
 
BOOL CGTKTestPanelDlg::OnInitDialog() 
{ 
	_variant_t workVariant; 
 
	CDialog::OnInitDialog(); 
 
	// 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 
	//Initialize UI 
	m_portNameCombo.SetCurSel(0);	// COM1 
	m_baudRateCombo.SetCurSel(0);	// 4800 
	m_dblTimeScale = 1.; 
	 
	// Set degree label edit box 
	workVariant = m_myGPSToolKit.GetDegLabel(); 
	m_degLabel = (char *)(_bstr_t)workVariant; 
	 
	// Set minute label edit box 
	workVariant = m_myGPSToolKit.GetMinLabel(); 
	m_minLabel = (char *)(_bstr_t)workVariant; 
 
	// Set second label edit box 
	workVariant = m_myGPSToolKit.GetSecLabel(); 
	m_secLabel = (char *)(_bstr_t)workVariant; 
 
	// Set alt units combo 
	workVariant = m_myGPSToolKit.GetAltitudeUnits(); 
	m_comboAltUnits.SetCurSel((short)workVariant); 
	switch((short)workVariant) 
	{ 
		case 0: 
			m_altUnitsLabel = "m"; 
			break; 
 
		case 1: 
			m_altUnitsLabel = "ft"; 
			break; 
	} 
	 
 
	// Set speed units combo 
	workVariant = m_myGPSToolKit.GetSpeedUnits(); 
	m_comboSpeedUnits.SetCurSel((short)workVariant); 
	switch((short)workVariant) 
	{ 
		case 0: 
			m_speedUnitsLabel = "mph"; 
			break; 
 
		case 1: 
			m_speedUnitsLabel = "kph"; 
			break; 
 
		case 2: 
			m_speedUnitsLabel = "knots"; 
			break; 
	} 
 
	// Set dist units combo 
	workVariant = m_myGPSToolKit.GetDistUnits(); 
	m_comboDistUnits.SetCurSel((short)workVariant); 
	switch((short)workVariant) 
	{ 
		case 0: 
			m_distUnitsLabel = "m"; 
			break; 
 
		case 1: 
			m_distUnitsLabel = "ft"; 
			break; 
 
		case 2: 
			m_distUnitsLabel = "miles"; 
			break; 
 
		case 3: 
			m_distUnitsLabel = "nm"; 
	} 
 
	// Set lat/lon format combo 
	workVariant = m_myGPSToolKit.GetLatLonFormat(); 
	m_comboLatLonFormat.SetCurSel((short)workVariant); 
	 
	// Add columns to route wpt listview 
	m_routeWptList.InsertColumn(0, "Wpt", LVCFMT_LEFT, 51); 
	m_routeWptList.InsertColumn(1, "Lat", LVCFMT_LEFT, 70); 
	m_routeWptList.InsertColumn(2, "Lon", LVCFMT_LEFT, 70); 
 
	UpdateData(FALSE); 
 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
// 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 CGTKTestPanelDlg::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 CGTKTestPanelDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CGTKTestPanelDlg::OnButtonOpen()  
{ 
	CString strComboBox; 
 
	m_portNameCombo.GetWindowText(strComboBox); 
 
	_variant_t vtComPort((LPCSTR)strComboBox); 
	m_myGPSToolKit.Open(vtComPort); 
 
	// Disable controls 
	m_portNameCombo.EnableWindow(FALSE); 
	m_editFileName.EnableWindow(FALSE); 
	m_editTimeScale.EnableWindow(FALSE); 
	m_cmdOpen.EnableWindow(FALSE); 
	m_cmdOpenFile.EnableWindow(FALSE); 
 
	UpdateData(FALSE);	 
} 
 
void CGTKTestPanelDlg::OnButtonClose()  
{ 
	m_myGPSToolKit.Close(); 
 
	// Enable controls 
	m_portNameCombo.EnableWindow(TRUE); 
	m_editFileName.EnableWindow(TRUE); 
	m_editTimeScale.EnableWindow(TRUE); 
	m_cmdOpen.EnableWindow(TRUE); 
	m_cmdOpenFile.EnableWindow(TRUE); 
 
	UpdateData(FALSE); 
} 
 
void CGTKTestPanelDlg::OnChangeEditDeglabel()  
{ 
	UpdateData(TRUE); 
	 
	_variant_t vtDegLabel(m_degLabel); 
	m_myGPSToolKit.SetDegLabel(vtDegLabel); 
} 
 
void CGTKTestPanelDlg::OnChangeEditMinlabel()  
{ 
	UpdateData(TRUE); 
	 
	_variant_t vtMinLabel(m_minLabel); 
	m_myGPSToolKit.SetMinLabel(vtMinLabel);	 
} 
 
void CGTKTestPanelDlg::OnChangeEditSeclabel()  
{ 
	UpdateData(TRUE); 
	 
	_variant_t vtSecLabel(m_secLabel); 
	m_myGPSToolKit.SetSecLabel(vtSecLabel); 
} 
 
void CGTKTestPanelDlg::OnSelchangeComboBaud()  
{ 
	UpdateData(TRUE); 
 
	CString strComboBox; 
	m_baudRateCombo.GetWindowText(strComboBox); 
 
	_variant_t vtBaudRate(strComboBox); 
	m_myGPSToolKit.SetBaudRate(vtBaudRate);	 
} 
 
void CGTKTestPanelDlg::OnSelchangeComboAltunits()  
{ 
	UpdateData(TRUE); 
 
	_variant_t vtAltUnits((short)m_comboAltUnits.GetCurSel()); 
	m_myGPSToolKit.SetAltitudeUnits(vtAltUnits); 
 
	switch((short)vtAltUnits) 
	{ 
		case 0: 
			m_altUnitsLabel = "m"; 
			break; 
 
		case 1: 
			m_altUnitsLabel = "ft"; 
			break; 
	} 
} 
 
void CGTKTestPanelDlg::OnSelchangeComboSpeedunits()  
{ 
	UpdateData(TRUE); 
 
	_variant_t vtSpeedUnits((short)m_comboSpeedUnits.GetCurSel()); 
	m_myGPSToolKit.SetSpeedUnits(vtSpeedUnits); 
	 
	switch((short)vtSpeedUnits) 
	{ 
		case 0: 
			m_speedUnitsLabel = "mph"; 
			break; 
 
		case 1: 
			m_speedUnitsLabel = "kph"; 
			break; 
 
		case 2: 
			m_speedUnitsLabel = "knots"; 
			break; 
	} 
} 
 
void CGTKTestPanelDlg::OnFixUpdateGpstoolkit(const VARIANT FAR& FixGood, const VARIANT FAR& FixDateTime, const VARIANT FAR& Latitude, const VARIANT FAR& Longitude, const VARIANT FAR& Altitude, const VARIANT FAR& Speed, const VARIANT FAR& TrueCourse)  
{ 
	_bstr_t workBSTR_T; 
	_variant_t workVT; 
 
	// Latitude and Longitude 
	workBSTR_T = Latitude; 
	m_lat = (BSTR)workBSTR_T; 
 
	workBSTR_T = Longitude; 
	m_lon = (BSTR)workBSTR_T; 
	 
	// Altitude 
	if(Altitude.vt == VT_EMPTY) 
	{ 
		m_altitude = ""; 
	} 
	else 
	{ 
		workVT = Altitude; 
		char altStr[80]; 
		sprintf(altStr, "%.1lf", (double)workVT); 
		m_altitude = CString(altStr) + " " + m_altUnitsLabel; 
	} 
	 
	// Speed 
	if(Speed.vt == VT_EMPTY) 
	{ 
		m_speed = ""; 
	} 
	else 
	{ 
		workVT = Speed; 
		char speedStr[80]; 
		sprintf(speedStr, "%.1lf", (double)workVT); 
		m_speed = CString(speedStr) + " " + m_speedUnitsLabel; 
	} 
 
	// True course 
	workBSTR_T = TrueCourse; 
	m_trueCourse = (BSTR)workBSTR_T; 
 
	// Mag variation 
	workBSTR_T = m_myGPSToolKit.GetMagVariation(); 
	m_magVar = (BSTR)workBSTR_T; 
 
	// Fix date and time 
	COleDateTime workDateTime(FixDateTime); 
	m_fixDateTime = workDateTime.Format(); 
 
	// Fix status 
	workVT = FixGood; 
	if((bool)workVT) 
	{ 
		m_fixStatus = "Valid"; 
	} 
	else 
	{ 
		m_fixStatus = "Invalid"; 
	} 
 
	// Fix quality 
	workVT = m_myGPSToolKit.GetFixQuality(); 
	switch((short)workVT) 
	{ 
		case 0: 
			m_fixQuality = "Invalid Fix"; 
			break; 
 
		case 1: 
			m_fixQuality = "GPS Fix"; 
			break; 
 
		case 2: 
			m_fixQuality = "DGPS Fix"; 
			break; 
 
		default: 
			char fixQualityNum[10]; 
			itoa((short)workVT, fixQualityNum, 10); 
			m_fixQuality = "Other ("; 
			m_fixQuality += fixQualityNum; 
			m_fixQuality += ")"; 
	} 
 
	// Num satellites 
	workBSTR_T = m_myGPSToolKit.GetNumSatellitesInFix(); 
	m_numSatellites = (BSTR)workBSTR_T; 
 
	// Geoid height above WGS84 ellipsoid 
	workVT = m_myGPSToolKit.GetGeoidHeightAboveWGS84Ellipsoid(); 
	if(workVT.vt == VT_EMPTY) 
	{ 
		m_geoidHeight = ""; 
	} 
	else 
	{ 
		char geoidHeightStr[80]; 
		sprintf(geoidHeightStr, "%.1lf", (double)workVT); 
		m_geoidHeight = CString(geoidHeightStr) + " " + m_altUnitsLabel; 
	} 
 
	// DGPS ref station ID 
	workBSTR_T = m_myGPSToolKit.GetDGPSRefStationID(); 
	m_DGPSRefStation = (BSTR)workBSTR_T; 
 
	// Time since last DGPS update 
	workBSTR_T = m_myGPSToolKit.GetTimeSinceLastDGPSUpdate(); 
	m_timeSinceLastDGPSUpdate = (BSTR)workBSTR_T; 
 
	UpdateData(FALSE);	 
} 
 
void CGTKTestPanelDlg::OnRawDataReceivedGpstoolkit(const VARIANT FAR& RawData, const VARIANT FAR& NumBytesRead)  
{ 
	// Convert the variant string to a CString 
	_bstr_t btRawData(RawData); 
	CString rawDataString((BSTR)btRawData); 
 
	// Add to Raw Data list box 
	m_rawDataListBox.AddString(rawDataString); 
	m_rawDataListBox.SetCurSel(m_rawDataListBox.GetCount() - 1); 
} 
 
void CGTKTestPanelDlg::OnRadioDeg()  
{ 
	UpdateData(TRUE); 
 
	_variant_t workVT((short)0); 
	m_myGPSToolKit.SetLatLonFormat(workVT); 
} 
 
void CGTKTestPanelDlg::OnRadioDegmin()  
{ 
	UpdateData(TRUE); 
 
	_variant_t workVT((short)1); 
	m_myGPSToolKit.SetLatLonFormat(workVT); 
} 
 
void CGTKTestPanelDlg::OnRadioDegminsec()  
{ 
	UpdateData(TRUE); 
 
	_variant_t workVT((short)2); 
	m_myGPSToolKit.SetLatLonFormat(workVT); 
} 
 
void CGTKTestPanelDlg::OnSatelliteUpdateGpstoolkit(const VARIANT FAR& AutomaticOperation, const VARIANT FAR& OperationMode, const VARIANT FAR& NumSatellitesInView, const VARIANT FAR& HDOP, const VARIANT FAR& PDOP, const VARIANT FAR& VDOP, const VARIANT FAR& FixSatellitePRNs, const VARIANT FAR& SatelliteInViewPRNs)  
{ 
	vector vecFixSatellitePRNs, vecSatelliteInViewPRNs, vecAz, vecEl, vecSNR; 
 
	// unpack SAFEARRAY data and repackage as STL vector 
	long arrayUBound; 
	VARIANT variantData; 
 
	// Fix satellites 
	SAFEARRAY *psa = FixSatellitePRNs.parray; 
	SafeArrayGetUBound(psa, 1, &arrayUBound); 
	 
	for(long i = 0; i <= arrayUBound; i++) 
	{ 
		SafeArrayGetElement(psa, &i, &variantData); 
		vecFixSatellitePRNs.push_back(variantData.iVal); 
	} 
 
	// Satellites in view 
	psa = SatelliteInViewPRNs.parray; 
	SafeArrayGetUBound(psa, 1, &arrayUBound); 
	 
	_variant_t vtAz, vtEl, vtSnr; 
	for(i = 0; i <= arrayUBound; i++) 
	{ 
		SafeArrayGetElement(psa, &i, &variantData); 
		vecSatelliteInViewPRNs.push_back(variantData.iVal); 
		m_snrBarPrn[i].m_prn = variantData.iVal; 
 
		// Determine if this is a fix satellite or just a satellite in view 
		m_snrBarPrn[i].bIsFixSat = false; 
		for(short j = 0; j < vecFixSatellitePRNs.size(); j++) 
		{ 
			if(vecFixSatellitePRNs[j] == vecSatelliteInViewPRNs[i]) 
			{ 
				m_snrBarPrn[i].bIsFixSat = true; 
				break; 
			} 
		} 
 
		m_myGPSToolKit.GetSatelliteInfo(_variant_t(vecSatelliteInViewPRNs[i]),  
			&vtAz, &vtEl, &vtSnr); 
 
		vecAz.push_back((short)vtAz); 
		vecEl.push_back((short)vtEl); 
		vecSNR.push_back((short)vtSnr); 
	} 
 
	m_satPicture.DrawSatellites(vecFixSatellitePRNs, vecSatelliteInViewPRNs, vecAz, vecEl); 
	 
	for(i = 0; i < NUM_SNR_BARS; i++) 
	{ 
		m_snrBarPrn[i].DrawSnrBarPRN(); 
		m_snrBar[i].SetPos(vecSNR[i]); 
	} 
 
	// Clear unused SNR bars and PRNs 
	for(i = vecSatelliteInViewPRNs.size(); i < NUM_SNR_BARS; i++) 
	{ 
		m_snrBarPrn[i].m_prn = -1; 
		m_snrBarPrn[i].DrawSnrBarPRN(); 
		m_snrBar[i].SetPos(0); 
	} 
 
	// Display HDOP, PDOP, VDOP, and operation mode 
	_variant_t vtAutoMode(AutomaticOperation); 
	_variant_t vtOpMode(OperationMode); 
	_variant_t vtHDOP(HDOP); 
	_variant_t vtPDOP(PDOP); 
	_variant_t vtVDOP(VDOP); 
	CString strAutoMode, strOpMode, seperator; 
 
	// Operation mode 
	if(vtAutoMode.vt == VT_EMPTY) 
	{ 
		strAutoMode = ""; 
	} 
	else if((bool)vtAutoMode) 
	{ 
		strAutoMode = "Auto"; 
	} 
	else 
	{ 
		strAutoMode = "Manual"; 
	} 
 
	switch((short)vtOpMode) 
	{ 
		case 1: 
			strOpMode = "Fix NA"; 
			break; 
		case 2: 
			strOpMode = "2D"; 
			break; 
		case 3: 
			strOpMode = "3D"; 
			break; 
		default: 
			strOpMode = ""; 
	} 
 
	if(strAutoMode == "" && strOpMode == "") 
	{ 
		seperator = ""; 
	} 
	else 
	{ 
		seperator = " / "; 
	} 
 
	m_strOpMode = strAutoMode + seperator + strOpMode; 
 
	char lpszWork[80]; 
	// HDOP 
	if(vtHDOP.vt != VT_EMPTY) 
	{ 
		sprintf(lpszWork, "%.1lf", (double)vtHDOP); 
		m_strHDOP = CString(lpszWork); 
	} 
 
	// PDOP 
	if(vtPDOP.vt != VT_EMPTY) 
	{ 
		sprintf(lpszWork, "%.1lf", (double)vtPDOP); 
		m_strPDOP = CString(lpszWork); 
	} 
 
	// VDOP 
	if(vtVDOP.vt != VT_EMPTY) 
	{ 
		sprintf(lpszWork, "%.1lf", (double)vtVDOP); 
		m_strVDOP = CString(lpszWork); 
	} 
 
	UpdateData(FALSE); 
} 
 
void CGTKTestPanelDlg::OnSelchangeComboDistunits()  
{ 
	UpdateData(TRUE); 
 
	_variant_t vtDistUnits((short)m_comboDistUnits.GetCurSel()); 
	m_myGPSToolKit.SetDistUnits(vtDistUnits); 
	 
	switch((short)vtDistUnits) 
	{ 
		case 0: 
			m_distUnitsLabel = "m"; 
			break; 
 
		case 1: 
			m_distUnitsLabel = "ft"; 
			break; 
 
		case 2: 
			m_distUnitsLabel = "miles"; 
			break; 
 
		case 3: 
			m_distUnitsLabel = "nm"; 
	}	 
} 
 
void CGTKTestPanelDlg::OnSelchangeComboLatlonformat()  
{ 
	UpdateData(TRUE); 
 
	_variant_t vtLatLonFormat((short)m_comboLatLonFormat.GetCurSel()); 
	m_myGPSToolKit.SetLatLonFormat(vtLatLonFormat); 
} 
 
void CGTKTestPanelDlg::OnNavUpdateGpstoolkit(const VARIANT FAR& OriginWptID, const VARIANT FAR& DestWptID, const VARIANT FAR& DestWptLatitude, const VARIANT FAR& DestWptLongitude, const VARIANT FAR& TrueBearingToDest, const VARIANT FAR& RangeToDest, const VARIANT FAR& CrossTrackError, const VARIANT FAR& DestClosingVelocity, const VARIANT FAR& DestArrivalAlarm, const VARIANT FAR& RouteName, const VARIANT FAR& WptsInRoute)  
{ 
	_bstr_t workBSTR_T; 
	_variant_t workVT; 
 
	// WPT IDs (names) 
	workBSTR_T = OriginWptID; 
	m_origWptID = (BSTR)workBSTR_T; 
	workBSTR_T = DestWptID; 
	m_destWptID = (BSTR)workBSTR_T; 
 
	// Arrival flag 
	workVT = DestArrivalAlarm; 
	if(workVT.vt == VT_EMPTY) 
	{ 
		m_arrivedAtDest = ""; 
	} 
	else if((bool)workVT) 
	{ 
		m_arrivedAtDest = "True"; 
	} 
	else 
	{ 
		m_arrivedAtDest = "False"; 
	} 
 
	// Dest Latitude and Longitude 
	workBSTR_T = DestWptLatitude; 
	m_destWptLat = (BSTR)workBSTR_T; 
	workBSTR_T = DestWptLongitude; 
	m_destWptLon = (BSTR)workBSTR_T; 
 
	// Range to Dest 
	if(RangeToDest.vt == VT_EMPTY) 
	{ 
		m_rangeToDest = ""; 
	} 
	else 
	{ 
		workVT = RangeToDest; 
		char rangeStr[80]; 
		sprintf(rangeStr, "%.2lf", (double)workVT); 
		m_rangeToDest = CString(rangeStr) + " " + m_distUnitsLabel; 
	} 
 
	// True Bearing to Dest 
	workBSTR_T = TrueBearingToDest; 
	m_trueBearingToDest = (BSTR)workBSTR_T; 
	 
	// Closing Velocity 
	if(DestClosingVelocity.vt == VT_EMPTY) 
	{ 
		m_destClosingVelocity = ""; 
	} 
	else 
	{ 
		workVT = DestClosingVelocity; 
		char closingVelStr[80]; 
		sprintf(closingVelStr, "%.1lf", (double)workVT); 
		m_destClosingVelocity = CString(closingVelStr) + " " + m_speedUnitsLabel; 
	} 
 
	// Cross Track Error 
	workBSTR_T = CrossTrackError; 
	m_crossTrackError = (BSTR)workBSTR_T; 
 
	// Orig to Dest Bearings 
	workBSTR_T = m_myGPSToolKit.GetOrigToDestTrueBearing(); 
	m_origToDestTrueBearing = (BSTR)workBSTR_T; 
	workBSTR_T = m_myGPSToolKit.GetOrigToDestMagBearing(); 
	m_origToDestMagBearing = (BSTR)workBSTR_T; 
 
	// Route name 
	workBSTR_T = RouteName; 
	m_routeName = (BSTR)workBSTR_T; 
 
	// Route Box 
 
	// unpack SAFEARRAY data 
	CString strWptName; 
	long arrayUBound; 
	VARIANT variantData; 
	_variant_t wptLat, wptLon; 
 
	SAFEARRAY *psa = WptsInRoute.parray; 
	SafeArrayGetUBound(psa, 1, &arrayUBound); 
 
	for(long i = 0; i <= arrayUBound; i++) 
	{ 
		SafeArrayGetElement(psa, &i, &variantData); 
		m_myGPSToolKit.GetWptLocation(variantData, &wptLat, &wptLon); 
		strWptName = (LPCSTR)(_bstr_t)variantData; 
 
		if(i < m_routeWptList.GetItemCount()) 
		{ 
			m_routeWptList.SetItemText(i, 0, strWptName); 
		} 
		else 
		{ 
			m_routeWptList.InsertItem(i, strWptName); 
		} 
 
		m_routeWptList.SetItemText(i, 1, (LPCSTR)(_bstr_t)wptLat); 
		m_routeWptList.SetItemText(i, 2, (LPCSTR)(_bstr_t)wptLon); 
	} 
 
    while(m_routeWptList.GetItemCount() > arrayUBound + 1) 
	{ 
		m_routeWptList.DeleteItem(m_routeWptList.GetItemCount()-1); 
	} 
     
	UpdateData(FALSE);	 
} 
 
void CGTKTestPanelDlg::OnButtonOpenfile()  
{ 
	UpdateData(TRUE); 
	CString strButtonCaption; 
	m_cmdOpenFile.GetWindowText(strButtonCaption); 
 
	if(strButtonCaption == "Open File") 
	{ 
		_variant_t vtFileName(m_txtFileName); 
		_variant_t vtTimeScale(m_dblTimeScale); 
		 
		m_myGPSToolKit.OpenFile(vtFileName, vtTimeScale); 
		 
		// Disable controls 
		m_portNameCombo.EnableWindow(FALSE); 
		m_baudRateCombo.EnableWindow(FALSE); 
		m_editFileName.EnableWindow(FALSE); 
		m_editTimeScale.EnableWindow(FALSE); 
		m_cmdOpen.EnableWindow(FALSE); 
		m_cmdClose.EnableWindow(FALSE); 
		 
		m_cmdOpenFile.SetWindowText("Cancel"); 
	} 
	else 
	{ 
		m_myGPSToolKit.Close(); 
 
		// Enable controls 
		m_portNameCombo.EnableWindow(TRUE); 
		m_baudRateCombo.EnableWindow(TRUE); 
		m_editFileName.EnableWindow(TRUE); 
		m_editTimeScale.EnableWindow(TRUE); 
		m_cmdOpen.EnableWindow(TRUE); 
		m_cmdClose.EnableWindow(TRUE); 
		 
		m_cmdOpenFile.SetWindowText("Open File"); 
	} 
 
	UpdateData(FALSE); 
} 
 
void CGTKTestPanelDlg::OnFileCompleteGpstoolkit()  
{ 
	// Enable controls 
	m_portNameCombo.EnableWindow(TRUE); 
	m_baudRateCombo.EnableWindow(TRUE); 
	m_editFileName.EnableWindow(TRUE); 
	m_editTimeScale.EnableWindow(TRUE); 
	m_cmdOpen.EnableWindow(TRUE); 
	m_cmdClose.EnableWindow(TRUE); 
	 
	m_cmdOpenFile.SetWindowText("Open File"); 
}