gmarkView.cpp
上传用户:pumpssky
上传日期:2007-12-07
资源大小:110k
文件大小:27k
源码类别:

MacOS编程

开发平台:

C/C++

  1. // gmarkView.cpp : implementation of the CGmarkView class
  2. //
  3. #include "stdafx.h"
  4. #include "gmark.h"
  5. #include "gmarkDoc.h"
  6. #include "gmarkView.h"
  7. #include "serial.h"
  8. #include "define.h"
  9. #include "ras.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. #ifndef _WIN32_WCE_CEPC
  16. HRASCONN hRasConn = NULL;
  17. const UINT WM_RASEVENT = WM_RASDIALEVENT;
  18. #else
  19. HANDLE hRasConn = NULL;
  20. const UINT WM_RASEVENT = WM_USER;
  21. #endif
  22. HANDLE hReadSocketThread;
  23. #ifdef _SAVE_RTCM
  24. FILE *fpRtcm;
  25. #endif
  26. #ifdef _SAVE_GPSDATA
  27. FILE *fpGps; //save the GPS result data
  28. #endif
  29. CONF_DATA gtConfData;
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CGmarkView
  32. IMPLEMENT_DYNCREATE(CGmarkView, CFormView)
  33. BEGIN_MESSAGE_MAP(CGmarkView, CFormView)
  34. //{{AFX_MSG_MAP(CGmarkView)
  35. ON_BN_CLICKED(IDC_BUTTON_DIAL, OnButtonDial)
  36. ON_BN_CLICKED(IDC_BUTTON_HANGUP, OnButtonHangup)
  37. ON_REGISTERED_MESSAGE(WM_RASEVENT, OnRasDialEvent)
  38. ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose)
  39. ON_BN_CLICKED(IDC_BUTTON_INIT, OnButtonInit)
  40. ON_BN_CLICKED(IDC_BUTTON_CONNECT, OnButtonConnect)
  41. ON_WM_TIMER()
  42. ON_BN_CLICKED(IDC_BUTTON_GGAOFF, OnButtonGgaoff)
  43. ON_BN_CLICKED(IDC_BUTTON_GGA2S, OnButtonGga2s)
  44. ON_WM_CLOSE()
  45. ON_BN_CLICKED(IDC_BUTTON_TESTMAP, OnButtonTestmap)
  46. ON_BN_CLICKED(IDC_BUTTON_LOGON, OnButtonLogon)
  47. ON_BN_CLICKED(IDC_BUTTON_LOGOFF, OnButtonLogoff)
  48. ON_BN_CLICKED(IDC_BUTTON_RTCMON, OnButtonRtcmon)
  49. ON_BN_CLICKED(IDC_BUTTON_RTCMOFF, OnButtonRtcmoff)
  50. ON_BN_CLICKED(IDC_BUTTON_PBNON2, OnButtonPbnon2)
  51. ON_MESSAGE(WM_GPSRECEIVED, OnGpsReceived)
  52. ON_MESSAGE(WM_GPSUPDATE, OnGpsUpdate)
  53. ON_MESSAGE(WM_AUTOPROCESS, AutoProcess)
  54. ON_BN_CLICKED(IDC_BUTTON_PBNOFF, OnButtonPbnoff)
  55. //}}AFX_MSG_MAP
  56. END_MESSAGE_MAP()
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CGmarkView construction/destruction
  59. CGmarkView::CGmarkView()
  60. : CFormView(CGmarkView::IDD)
  61. {
  62. //{{AFX_DATA_INIT(CGmarkView)
  63. //}}AFX_DATA_INIT
  64. // TODO: add construction code here
  65. memset( gtConfData.szBaseIP, 0, sizeof(gtConfData.szBaseIP) );
  66. memset( gtConfData.szRoverID, 0, sizeof(gtConfData.szRoverID) );
  67. memset( gtConfData.szRoverDesc, 0, sizeof(gtConfData.szRoverDesc) );
  68. memset( m_RTCMBuf, 0, sizeof(m_RTCMBuf) );
  69. m_bCloseSocketFlg = FALSE;
  70. m_Socket = INVALID_SOCKET;
  71. m_bNeedActivate = FALSE;
  72. m_hDialCompleteEvent = CreateEvent(0, FALSE, FALSE, 0);
  73. }
  74. CGmarkView::~CGmarkView()
  75. {
  76. }
  77. void CGmarkView::DoDataExchange(CDataExchange* pDX)
  78. {
  79. CFormView::DoDataExchange(pDX);
  80. //{{AFX_DATA_MAP(CGmarkView)
  81. DDX_Control(pDX, IDC_TAB_MAIN, m_tabMain);
  82. //}}AFX_DATA_MAP
  83. }
  84. BOOL CGmarkView::PreCreateWindow(CREATESTRUCT& cs)
  85. {
  86. // TODO: Modify the Window class or styles here by modifying
  87. //  the CREATESTRUCT cs
  88. return CFormView::PreCreateWindow(cs);
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CGmarkView diagnostics
  92. #ifdef _DEBUG
  93. void CGmarkView::AssertValid() const
  94. {
  95. CFormView::AssertValid();
  96. }
  97. void CGmarkView::Dump(CDumpContext& dc) const
  98. {
  99. CFormView::Dump(dc);
  100. }
  101. CGmarkDoc* CGmarkView::GetDocument() // non-debug version is inline
  102. {
  103. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGmarkDoc)));
  104. return (CGmarkDoc*)m_pDocument;
  105. }
  106. #endif //_DEBUG
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CGmarkView message handlers
  109. void CGmarkView::OnButtonDial() 
  110. {
  111. // TODO: Add your control notification handler code here
  112. #ifndef _WIN32_WCE_CEPC
  113. RASDIALPARAMS RasDialParams;
  114. DWORD dwNotifierType = 0xFFFFFFFF;
  115. HWND hwnd;
  116. int iRet=0;
  117. RasDialParams.dwSize  = sizeof(RASDIALPARAMS);
  118. wcscpy( RasDialParams.szEntryName, _T("GPRS57600") ); 
  119. wcscpy( RasDialParams.szPhoneNumber, _T("") ); 
  120. wcscpy( RasDialParams.szCallbackNumber, _T("") ); 
  121. wcscpy( RasDialParams.szUserName, _T("") ); 
  122. wcscpy( RasDialParams.szPassword, _T("") ); 
  123. wcscpy( RasDialParams.szDomain, _T("") ); 
  124. hwnd = this->m_hWnd;
  125. iRet = RasDial( NULL,
  126. NULL,
  127. &RasDialParams,
  128. dwNotifierType,
  129. hwnd,
  130. &hRasConn
  131. );
  132. if(iRet != 0)
  133. {
  134. MessageBox(_T("Failed to connect to CMNET"));
  135. }
  136. #endif
  137. }
  138. void CGmarkView::OnButtonHangup() 
  139. {
  140. // TODO: Add your control notification handler code here
  141. #ifndef _WIN32_WCE_CEPC
  142. if (hRasConn != NULL)
  143. {
  144. RasHangUp(hRasConn);
  145. hRasConn = NULL;
  146. // ::Sleep(2000);
  147. RASCONNSTATUS rStatus;
  148. while( RasGetConnectStatus(hRasConn, &rStatus) != ERROR_INVALID_HANDLE )
  149. ::Sleep(0); 
  150. }
  151. #endif
  152. }
  153. LRESULT CGmarkView::OnRasDialEvent(WPARAM wp, LPARAM lp)
  154. {
  155. #ifndef _WIN32_WCE_CEPC
  156. RASCONNSTATE rasstate= (RASCONNSTATE)wp;
  157. CEdit *edtInfo = (CEdit *)GetDlgItem(IDC_EDIT_STATUS_DIAL);
  158. switch(rasstate)
  159. {
  160. case RASCS_OpenPort:
  161. edtInfo->SetWindowText(_T("To open COM port乧乧"));
  162. /////////////////////
  163. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("To open COM port乧乧"));
  164. /////////////////////
  165. break;
  166. case RASCS_PortOpened:
  167. edtInfo->SetWindowText(_T("Port opened."));
  168. /////////////////////
  169. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Port opened."));
  170. /////////////////////
  171. break;
  172. case RASCS_ConnectDevice:
  173. edtInfo->SetWindowText(_T("To connect device乧乧"));
  174. /////////////////////
  175. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("To connect device乧乧"));
  176. /////////////////////
  177. break;
  178. case RASCS_DeviceConnected:
  179. edtInfo->SetWindowText(_T("Device connected."));
  180. /////////////////////
  181. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Device connected."));
  182. /////////////////////
  183. break;
  184. case RASCS_Authenticate:
  185. edtInfo->SetWindowText(_T("To verify user and password乧乧"));
  186. /////////////////////
  187. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("To verify user and password乧乧"));
  188. /////////////////////
  189. break;
  190. case RASCS_Authenticated:
  191. edtInfo->SetWindowText(_T("Verification passed"));
  192. /////////////////////
  193. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Verification passed"));
  194. /////////////////////
  195. break;
  196. case RASCS_Connected:
  197. edtInfo->SetWindowText(_T("Connected"));
  198. /////////////////////
  199. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Connected"));
  200. /////////////////////
  201. SetEvent(m_hDialCompleteEvent);
  202. break;
  203. case RASCS_Disconnected:
  204. edtInfo->SetWindowText(_T("Disconnected"));
  205. hRasConn=NULL;
  206. /////////////////////
  207. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_DIAL, _T("Disconnected"));
  208. /////////////////////
  209. break;
  210. default:
  211. return (LRESULT)0;
  212. }
  213. #endif
  214. return (LRESULT)0;
  215. void CGmarkView::OnInitialUpdate() 
  216. {
  217. CFormView::OnInitialUpdate();
  218. // TODO: Add your specialized code here and/or call the base class
  219. // read the configuration
  220. char filename[MAX_PATH+1];
  221. // read the configuration file
  222. if( !ReadConfig() )
  223. {
  224. AfxGetMainWnd()->PostMessage(WM_CLOSE);
  225. return;
  226. }
  227. // Initialize gps module
  228. m_Gps.SetOrigPosition( gtConfData.dOrigLon, gtConfData.dOrigLat );
  229. //set view handle to gps
  230. m_Gps.SetViewHandle( m_hWnd );
  231. //set view window object
  232. m_Gps.SetViewWnd(this);
  233. //Initialize the share memory 
  234. m_hMap = CreateFileMapping( INVALID_HANDLE_VALUE, 
  235. NULL, 
  236. PAGE_READWRITE | SEC_COMMIT, 
  237. 0, 
  238. sizeof(GPS_DATA),
  239. MAP_FILENAME );
  240. if (m_hMap != NULL)
  241. {
  242. m_lpMapBuf = (LPBYTE)MapViewOfFile(m_hMap, FILE_MAP_WRITE, 0, 0, 0);
  243. if (m_lpMapBuf == NULL)
  244. {
  245. CloseHandle(m_hMap);
  246. m_hMap = NULL;
  247. }
  248. }
  249. // Open the log file
  250. memset( filename, 0, sizeof(filename) );
  251. CreateFilename(filename, FN_LOG);
  252. m_Log.Open(filename);
  253. m_Gps.m_pLog = &m_Log; //for test
  254. // open a file to save rtcm data
  255. #ifdef _SAVE_RTCM
  256. fpRtcm = fopen("\Storage Card\rtcm.dat", "wb");
  257. #endif
  258. // Open a file to save gps data
  259. #ifdef _SAVE_GPSDATA
  260. memset( filename, 0, sizeof(filename) );
  261. CreateFilename(filename, FN_GPSDATA);
  262. fpGps = fopen(filename, "wtc");
  263. #endif
  264. // complet the main tab control
  265. RECT rect;
  266. m_tabMain.InitDialogs();
  267. m_tabMain.InsertItem(0, _T("Monitor"));
  268. m_tabMain.InsertItem(1, _T("Operate"));
  269. m_tabMain.InsertItem(2, _T("Setup"));
  270. m_tabMain.InsertItem(3, _T("Advance"));
  271. GetWindowRect(&rect);
  272. m_tabMain.SetWindowPos(&CWnd::wndTopMost, 0, 0, 
  273. rect.right-rect.left, rect.bottom-rect.top, 0);
  274. m_tabMain.ActivateTabDialogs();
  275. m_dlgMonitor = m_tabMain.GetMonitorDlg();
  276. m_dlgOperate = m_tabMain.GetOperateDlg();
  277. m_dlgSetup   = m_tabMain.GetSetupDlg  ();
  278. m_dlgAdvance = m_tabMain.GetAdvanceDlg();
  279. if(gtConfData.bAutoStart) 
  280. {
  281. PostMessage(WM_AUTOPROCESS, 0, 0);
  282. }
  283. //set gps to dialogs
  284. m_dlgAdvance->SetGps(&m_Gps);
  285. }
  286. void CGmarkView::OnGpsReceived(WPARAM w, LPARAM l)
  287. {
  288. //set busy flag
  289. m_Gps.m_bGpsMsgBusy = TRUE;
  290. unsigned char * buf = (unsigned char *)l;
  291. int nBytes = (int)w;
  292. /*TCHAR wBuff[GPS_MAX_NEMASIZE+1];
  293. // Convert from MultiByte to UNICODE
  294.     mbstowcs(wBuff, (const char *)buf, GPS_MAX_NEMASIZE);
  295.     // Display the received data
  296. AddText2Edit( IDC_EDIT_GPSMSG, wBuff );*/
  297. ////////////////////
  298. m_dlgMonitor->UpdateGpsMsg((const char *)buf);
  299. ////////////////////
  300. #if 1
  301. // compose gps message into a complete record
  302. m_Gps.CompleteMsg(buf, nBytes);
  303. #else
  304. ProcessMsg(buf, nBytes);
  305. #endif
  306. // write received message to file
  307. #ifdef _SAVE_GPSDATA
  308. #ifdef _SAVE_GPSMSG
  309. fprintf(fpGps, "%s", buf);
  310. #endif
  311. #endif
  312. if(buf)
  313. {
  314. delete buf;
  315. buf = NULL;
  316. }
  317. //Create gps data
  318. m_Gps.CreateGPSData();
  319. //reset busy flag
  320. m_Gps.m_bGpsMsgBusy = FALSE;
  321. }
  322. void CGmarkView::OnGpsUpdate(WPARAM w, LPARAM l)
  323. {
  324. /* char szTemp[100];
  325. UpdateData(false);
  326. m_nStatus = m_Gps.m_tGpsData.Status;
  327. m_nSatNum = m_Gps.m_tGpsData.SatCount;
  328. memset( szTemp, 0, sizeof(szTemp) );
  329. sprintf(szTemp, "%f", m_Gps.m_tGpsData.Longitude);
  330. m_szLon = szTemp;
  331. memset( szTemp, 0, sizeof(szTemp) );
  332. sprintf(szTemp, "%f", m_Gps.m_tGpsData.Latitude);
  333. m_szLat = szTemp;
  334. memset( szTemp, 0, sizeof(szTemp) );
  335. sprintf(szTemp, "%f", m_Gps.m_tGpsData.X);
  336. m_szX = szTemp;
  337. memset( szTemp, 0, sizeof(szTemp) );
  338. sprintf(szTemp, "%f", m_Gps.m_tGpsData.Y);
  339. m_szY = szTemp;
  340. //refresh the gps status message
  341. if( m_nStatus > 0 )
  342. {
  343. m_szGpsStatus = _T("Normal");
  344. UpdateData(false);
  345. }
  346. UpdateData(false);
  347. */
  348. // write gps result data to file
  349. #ifdef _SAVE_GPSDATA
  350. if( m_Gps.m_tGpsData.Status > 0 )
  351. {
  352. fprintf( fpGps,
  353.  ":%f,%f,%d,%dn=%f,%fn",
  354.  m_Gps.m_tGpsData.Longitude, 
  355.  m_Gps.m_tGpsData.Latitude, 
  356.  m_Gps.m_tGpsData.SatCount, 
  357.  m_Gps.m_tGpsData.Status, 
  358.  m_Gps.m_tGpsData.X, 
  359.  m_Gps.m_tGpsData.Y);
  360. fflush(fpGps);
  361. }
  362. #endif
  363. // write gps data into the mapfile in shareable memory
  364. MapGpsData();
  365. /////////////////////
  366. m_dlgMonitor->UpdateGpsData( &m_Gps.m_tGpsData );
  367. /////////////////////
  368. }
  369. void CGmarkView::OnButtonClose() 
  370. {
  371. // TODO: Add your control notification handler code here
  372. if(m_Gps.Close() == RET_NG) 
  373. {
  374. MessageBox(_T("Close GPS port A or B failed!"));
  375. return;
  376. }
  377. // kill the timer
  378. KillTimer( m_nMonitorTimer );
  379. /////////////////////
  380. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_COMM, _T("Gps port closed"));
  381. m_dlgOperate->GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);
  382. m_dlgOperate->GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);
  383. /////////////////////
  384. }
  385. void CGmarkView::OnButtonInit() 
  386. {
  387. // TODO: Add your control notification handler code here
  388. m_Gps.Initialize( 4800 );
  389. }
  390. void CGmarkView::OnButtonConnect() 
  391. {
  392. // TODO: Add your control notification handler code here
  393. // connect gps
  394. if(m_Gps.Connect() == RET_NG) return;
  395. // start timer to monitor if gps receiving is normal
  396. m_nMonitorTimer = SetTimer( 1, GPS_CON_MONITOR_INTERVAL, 0 );
  397. /////////////////////
  398. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_COMM, _T("Gps port opened"));
  399. m_dlgOperate->GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(FALSE);
  400. m_dlgOperate->GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(TRUE);
  401. /////////////////////
  402. }
  403. void CGmarkView::OnTimer(UINT nIDEvent) 
  404. {
  405. // TODO: Add your message handler code here and/or call default
  406. static BOOL bGpsWarn = FALSE;
  407. switch( nIDEvent )
  408. {
  409. case 1: //m_nMonitorTimer
  410. if( m_Gps.m_tGpsData.Status == 0 )
  411. {
  412. if( bGpsWarn )
  413. {
  414. // m_szGpsStatus = _T("No Position Data");
  415. // UpdateData(false);
  416. }
  417. else
  418. {
  419. bGpsWarn = TRUE;
  420. }
  421. }
  422. else
  423. {
  424. bGpsWarn = FALSE;
  425. }
  426. break;
  427. case 2: //m_nActivate --  to activate the GPRS connection
  428. // m_bNeedActivate = TRUE;
  429. break;
  430. }
  431. CFormView::OnTimer(nIDEvent);
  432. }
  433. void CGmarkView::OnButtonGgaoff() 
  434. {
  435. // TODO: Add your control notification handler code here
  436. m_Gps.SendCmd("$PASHS,NME,GGA,A,OFF");
  437. }
  438. void CGmarkView::OnButtonGga2s() 
  439. {
  440. // TODO: Add your control notification handler code here
  441. m_Gps.SendCmd("$PASHS,NME,GGA,A,ON,2");
  442. }
  443. void CGmarkView::MapGpsData()
  444. {
  445. memcpy(m_lpMapBuf, &(m_Gps.m_tGpsData), sizeof(m_Gps.m_tGpsData));
  446. }
  447. void CGmarkView::OnClose() 
  448. {
  449. // TODO: Add your message handler code here and/or call default
  450. if (m_lpMapBuf != NULL)
  451. {
  452. UnmapViewOfFile(m_lpMapBuf);
  453. m_lpMapBuf = NULL;
  454. }
  455. if (m_hMap != NULL)
  456. {
  457. CloseHandle(m_hMap);
  458. m_hMap = NULL;
  459. }
  460. // Close the log file
  461. m_Log.Close();
  462. #ifdef _SAVE_RTCM
  463. fclose(fpRtcm);
  464. #endif
  465. #ifdef _SAVE_GPSDATA
  466. fclose(fpGps);
  467. #endif
  468. CFormView::OnClose();
  469. }
  470. /*for test mapping file*/
  471. void CGmarkView::OnButtonTestmap() 
  472. {
  473. // TODO: Add your control notification handler code here
  474. m_Gps.m_tGpsData.Latitude = 12;
  475. m_Gps.m_tGpsData.Longitude = 34;
  476. m_Gps.m_tGpsData.SatCount = 8;
  477. m_Gps.m_tGpsData.Status = 1;
  478. OnGpsUpdate(0,0);
  479. }
  480. void CGmarkView::OnButtonLogon() 
  481. {
  482. // TODO: Add your control notification handler code here
  483. WORD wVersionRequested;
  484. WSADATA wsaData;
  485. int nRet;
  486. if(m_Socket != INVALID_SOCKET) return;
  487. wVersionRequested = MAKEWORD(2,2);
  488. WSAStartup( wVersionRequested, &wsaData);
  489. #ifndef _USE_UDP
  490. m_Socket = socket(AF_INET, SOCK_STREAM, 0);
  491. #else
  492. m_Socket = socket(AF_INET, SOCK_DGRAM, 0); // use UDP
  493. #endif
  494. if( m_Socket == INVALID_SOCKET )
  495. {
  496. MessageBox(_T("INVALID_SOCKET is returned by socket()"));
  497. return;
  498. }
  499. SOCKADDR_IN BaseSockAddr;
  500. memset( &BaseSockAddr, 0, sizeof(BaseSockAddr) );
  501. BaseSockAddr.sin_port = htons(PORT);
  502. BaseSockAddr.sin_family = AF_INET;
  503. BaseSockAddr.sin_addr.S_un.S_addr = inet_addr(gtConfData.szBaseIP);
  504. // connect to server
  505. #ifndef _USE_UDP
  506. nRet = connect( m_Socket, (const struct sockaddr*)&BaseSockAddr, sizeof(BaseSockAddr) );
  507. if( nRet == SOCKET_ERROR )
  508. {
  509. MessageBox(_T("SOCKET_ERROR is returned by connect()"));
  510. return;
  511. }
  512. #endif
  513. //to logon
  514. char send_data[MAX_ROVERID+MAX_ROVERDESC+2];
  515. memset( send_data, 0, sizeof(send_data) );
  516. #ifndef _USE_UDP
  517. strcpy( send_data, "LOG,");
  518. strcat( send_data, gtConfData.szRoverID );
  519. strcat( send_data, "," );
  520. strcat( send_data, gtConfData.szRoverDesc );
  521. #else
  522. strcpy( send_data, "LOG,");
  523. strcat( send_data, gtConfData.szRoverID );
  524. strcat( send_data, "," );
  525. strcat( send_data, gtConfData.szRoverDesc );
  526. #endif
  527. // send logon message to base
  528. #ifndef _USE_UDP
  529. nRet = send( m_Socket, send_data, strlen(send_data), 0 );
  530. #else
  531. nRet = sendto( m_Socket, send_data, strlen(send_data), 0,
  532.    (struct sockaddr*)&BaseSockAddr, sizeof(BaseSockAddr) );
  533. #endif
  534. if( nRet == SOCKET_ERROR )
  535. {
  536. MessageBox(_T("SOCKET_ERROR is returned by send()"));
  537. return;
  538. }
  539. // specify a read socket thread
  540. DWORD dwThreadID;
  541. m_bCloseSocketFlg = FALSE;
  542. if (hReadSocketThread = CreateThread (NULL, 0, ReadSocketThread, this , 0, &dwThreadID))
  543. {
  544. ResumeThread( hReadSocketThread );
  545. // SetThreadPriority( hReadSocketThread, THREAD_PRIORITY_TIME_CRITICAL );
  546. CeSetThreadPriority(hReadSocketThread, 0);
  547. }
  548. else
  549. {
  550.    MessageBox(TEXT("Unable to create the read socket thread"), TEXT("Error"), MB_OK);
  551.    return;
  552. }
  553. SetDlgItemText(IDC_EDIT_STATUS_SOCK, _T("Connected to Center"));
  554. // enable to send activation package
  555. m_nActivateTimer = SetTimer( 2, SOCK_CON_ACTIVATE_INTERVAL, 0 );
  556. GetDlgItem(IDC_BUTTON_LOGON)->EnableWindow(FALSE);
  557. GetDlgItem(IDC_BUTTON_LOGOFF)->EnableWindow(TRUE);
  558. /////////
  559. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_SOCK, _T("Connected to Center"));
  560. m_dlgOperate->GetDlgItem(IDC_BUTTON_LOGON)->EnableWindow(FALSE);
  561. m_dlgOperate->GetDlgItem(IDC_BUTTON_LOGOFF)->EnableWindow(TRUE);
  562. /////////
  563. }
  564. void CGmarkView::OnButtonLogoff() 
  565. {
  566. // TODO: Add your control notification handler code here
  567. // send logoff message to base
  568. SOCKADDR_IN BaseSockAddr;
  569. char send_data[MAX_ROVERID+MAX_ROVERDESC+2];
  570. memset( send_data, 0, sizeof(send_data) );
  571. memset( &BaseSockAddr, 0, sizeof(BaseSockAddr) );
  572. BaseSockAddr.sin_port = htons(PORT);
  573. BaseSockAddr.sin_family = AF_INET;
  574. BaseSockAddr.sin_addr.S_un.S_addr = inet_addr(gtConfData.szBaseIP);
  575. strcpy( send_data, "OFF,");
  576. strcat( send_data, gtConfData.szRoverID );
  577. strcat( send_data, "," );
  578. strcat( send_data, gtConfData.szRoverDesc );
  579. sendto( m_Socket, send_data, strlen(send_data), 0,
  580. (struct sockaddr*)&BaseSockAddr, sizeof(BaseSockAddr) );
  581. //
  582. KillTimer( m_nActivateTimer ); // disable to send activate package.
  583. m_bCloseSocketFlg = TRUE;
  584.     TerminateThread(hReadSocketThread,0);
  585.     CloseHandle(hReadSocketThread);
  586. closesocket( m_Socket );
  587. WSACleanup();
  588. m_Socket = INVALID_SOCKET;
  589. SetDlgItemText(IDC_EDIT_STATUS_SOCK, _T("Disconnected from Center"));
  590. GetDlgItem(IDC_BUTTON_LOGON)->EnableWindow(TRUE);
  591. GetDlgItem(IDC_BUTTON_LOGOFF)->EnableWindow(FALSE);
  592. ///////////
  593. m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_SOCK, _T("Disconnected from Center"));
  594. m_dlgOperate->GetDlgItem(IDC_BUTTON_LOGON)->EnableWindow(TRUE);
  595. m_dlgOperate->GetDlgItem(IDC_BUTTON_LOGOFF)->EnableWindow(FALSE);
  596. ///////////
  597. }
  598. BOOL CGmarkView::ReadConfig()
  599. {
  600. FILE * fp;
  601. char sTemp[CONFIG_MAX_LINE+1];
  602. int n;
  603. BOOL nRet = FALSE;
  604. memset( gtConfData.szRoverID, 0, sizeof(gtConfData.szRoverID));
  605. memset( gtConfData.szRoverDesc, 0, sizeof(gtConfData.szRoverDesc));
  606. memset( sTemp, 0, sizeof(sTemp));
  607. #ifndef _WIN32_WCE_CEPC
  608. fp = fopen("\ResidentFlash\config.txt","rt");
  609. #else
  610. fp = fopen("\config.txt","rt");
  611. #endif
  612. if(fp == NULL)
  613. {
  614. // MessageBox(_T("Open configuration file failed"));
  615. // return FALSE;
  616. }
  617. while(1)
  618. {
  619. n = getline(fp, gtConfData.szRoverID);
  620. if( n<= 0 )
  621. {
  622. //MessageBox(_T("Read configuration file failed"));
  623. //break;
  624. }
  625. n = getline(fp, gtConfData.szRoverDesc);
  626. if( n<= 0 )
  627. {
  628. //MessageBox(_T("Read configuration file failed"));
  629. //break;
  630. }
  631. n = getline(fp, sTemp); //read ip address of base station
  632. if( n<= 0 || strlen(sTemp)>15)
  633. {
  634. //MessageBox(_T("Read configuration file failed"));
  635. //break;
  636. }
  637. strcpy( gtConfData.szBaseIP, sTemp );
  638. n = getline(fp, sTemp); //read original longitude
  639. if( n<= 0 )
  640. {
  641. // MessageBox(_T("Read configuration file failed"));
  642. // break;
  643. }
  644. gtConfData.dOrigLon = atof(sTemp);
  645. n = getline(fp, sTemp); //read original latitude
  646. if( n<= 0 )
  647. {
  648. //MessageBox(_T("Read configuration file failed"));
  649. // break;
  650. }
  651. gtConfData.dOrigLat = atof(sTemp);
  652. n = getline(fp, sTemp); //read start mode
  653. if( n<= 0 )
  654. {
  655. // MessageBox(_T("Read configuration file failed"));
  656. // break;
  657. }
  658. gtConfData.bAutoStart = atoi(sTemp);
  659. n = getline(fp, sTemp); //read if display NEMA message
  660. if( n<= 0 )
  661. {
  662. // MessageBox(_T("Read configuration file failed"));
  663. // break;
  664. }
  665. gtConfData.bDispNEMA = atoi(sTemp);
  666. n = getline(fp, sTemp); //read if display RTCM data
  667. if( n<= 0 )
  668. {
  669. // MessageBox(_T("Read configuration file failed"));
  670. // break;
  671. }
  672. gtConfData.bDispRTCM = atoi(sTemp);
  673. nRet = TRUE;
  674. break;
  675. }
  676. fclose(fp);
  677. return nRet;
  678. }
  679. void CGmarkView::GmarkMessageBox(const char * buf)
  680. {
  681. int nLength=strlen((const char *)buf);
  682. TCHAR *wszBuffer = new TCHAR[nLength+1];
  683. memset(wszBuffer, 0, (nLength+1)*sizeof(TCHAR));
  684. MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (const char *)buf, -1, wszBuffer, nLength);
  685. MessageBox(wszBuffer);
  686. delete wszBuffer;
  687. }
  688. int CGmarkView::getline(FILE *fp, char *szLine)
  689. {
  690. int len;
  691. char *hp, *tp;
  692. char buffer[CONFIG_MAX_LINE+1];
  693. memset( buffer, 0, sizeof(buffer) );
  694. if( fgets(buffer, CONFIG_MAX_LINE, fp) == NULL ) return 0;
  695. hp = buffer;
  696. while(*hp == ' ' || *hp == 't') hp++;
  697. tp = hp + strlen(hp) - 1;
  698. while (tp >= hp && (*tp == ' ' || *tp == 't' || *tp == 'n')) tp--;
  699. *(tp+1) = '';
  700. for(tp = buffer; *tp++ = *hp++;);
  701. len = strlen(buffer);
  702. strcpy( szLine, buffer );
  703. return len;
  704. }
  705. void CGmarkView::WriteRTCM(char * RTCMBuf, int nBytes)
  706. {
  707. //save rtcm data 
  708. #ifdef _SAVE_RTCM
  709. fwrite(RTCMBuf, 1, nBytes, fpRtcm);
  710. #endif
  711. /*****************check rtcm sum****************************/
  712. /*
  713. unsigned char sum;
  714. int len = strlen(RTCMBuf);
  715. char * recvmsg = new char[len];
  716. memset( recvmsg, 0, sizeof(recvmsg));
  717. if((unsigned char)RTCMBuf[0] != 0x8F)
  718. {
  719. m_dlgMonitor->UpdateRtcmData("0x8F head error ");
  720. delete recvmsg;
  721. return;
  722. }
  723. sum =0;
  724. for(int i=1; i<len-1; i++)
  725. {
  726. sum = sum^(unsigned char)RTCMBuf[i];
  727. recvmsg[i-1] = RTCMBuf[i];
  728. }
  729. if(sum != RTCMBuf[len-1])
  730. {
  731. m_dlgMonitor->UpdateRtcmData("check sum error ");
  732. delete recvmsg;
  733. return;
  734. }
  735. memset( RTCMBuf, 0, sizeof(RTCMBuf));
  736. strcpy(RTCMBuf, recvmsg);
  737. delete recvmsg;
  738. */
  739. /******************end check*******************************/
  740. /******************** //for test********************************/
  741. /* TCHAR wBuff[GPS_MAX_NEMASIZE+1];
  742. // Convert from MultiByte to UNICODE
  743.     mbstowcs(wBuff, (const char *)RTCMBuf, GPS_MAX_NEMASIZE);
  744. SetDlgItemText( IDC_EDIT_RECV, wBuff );*/
  745. //////////////////////
  746. m_dlgMonitor->UpdateRtcmData((const char *)RTCMBuf);
  747. //////////////////////
  748. /******************************************************************/
  749. m_Gps.WriteRTCM( RTCMBuf );
  750. }
  751. DWORD WINAPI ReadSocketThread(LPVOID lpvoid)  //Read Socket Thread
  752. {
  753. int nBytes=0;
  754. char sLog[MAX_LOGMSG_SIZE+1];
  755. CGmarkView *pView = (CGmarkView *)lpvoid;
  756. try
  757. {
  758. while(1)
  759. {
  760. if(pView->m_bCloseSocketFlg)
  761. {
  762. break;
  763. }
  764. // receive from socket
  765. memset( pView->m_RTCMBuf, 0, sizeof(pView->m_RTCMBuf) );
  766. pView->m_Log.Write("Just before recv()");
  767. #ifndef _USE_UDP
  768. nBytes = recv( pView->m_Socket, pView->m_RTCMBuf, sizeof(pView->m_RTCMBuf)-1, 0 );
  769. #else
  770. SOCKADDR_IN SockAddr;
  771. int buflen;
  772. memset( &SockAddr, 0, sizeof(SockAddr) );
  773. SockAddr.sin_port = htons(PORT);
  774. SockAddr.sin_family = AF_INET;
  775. SockAddr.sin_addr.S_un.S_addr = inet_addr(gtConfData.szBaseIP);
  776. buflen = sizeof(SockAddr);
  777. nBytes = recvfrom( pView->m_Socket, pView->m_RTCMBuf, sizeof(pView->m_RTCMBuf)-1, 0,
  778.    (struct sockaddr*)&SockAddr, &buflen );
  779. // strcpy(pView->m_RTCMBuf, "12345678901234567890123456789012345678901234567890
  780. //   123456789012345678901234567890");//for test
  781. // nBytes = strlen(pView->m_RTCMBuf);
  782. #endif
  783. memset( sLog, 0, sizeof(sLog) );
  784. _snprintf( sLog, sizeof(sLog)-1, "%d bytes rtcm data received.", nBytes );
  785. pView->m_Log.Write( sLog );
  786. // check the result of recv()
  787. if(nBytes>0)
  788. {
  789. //reply an ACK to server
  790. #ifndef _USE_UDP
  791. send( pView->m_Socket, "ACK", 3, 0 );
  792. #else
  793. sendto( pView->m_Socket, "ACK", 3, 0,
  794. (const struct sockaddr*)&SockAddr, buflen);
  795. #endif
  796. pView->WriteRTCM( pView->m_RTCMBuf, nBytes );
  797. memset( sLog, 0, sizeof(sLog) );
  798. _snprintf( sLog, sizeof(sLog)-1, "%d bytes rtcm data writed.", nBytes );
  799. pView->m_Log.Write( sLog );
  800. }
  801. else if(nBytes==0)
  802. {
  803. pView->m_Log.Write( "return 0 by recv()" );
  804. break;
  805. }
  806. else if(nBytes==SOCKET_ERROR)
  807. {
  808. DWORD error = GetLastError();
  809. memset( sLog, 0, sizeof(sLog) );
  810. _snprintf( sLog, sizeof(sLog)-1, "%d returned by recv() and error code = %d.", nBytes, error );
  811. pView->m_Log.Write( sLog );
  812. break;
  813. }
  814. else
  815. {
  816. pView->m_Log.Write( "return else value by recv()" );
  817. break;
  818. }
  819. // send activate package if need
  820. if( pView->m_bNeedActivate )
  821. {
  822. send( pView->m_Socket, SOCK_CON_ACTIVEPACK, 1, 0 );
  823. pView->m_Log.Write( "Activate package is sent" );
  824. pView->m_bNeedActivate = FALSE;
  825. }
  826. }
  827. }catch(...)
  828. {
  829. pView->m_Log.Write( "Exception is caught" );
  830. }
  831. pView->m_Log.Write( "ReadSocketThread will exit soon." );
  832. //MessageBox(pView->m_hWnd,_T("ReadSocketThread will exit soon."),_T("Info"),MB_OK); 
  833. ExitThread(WM_QUIT);
  834. return 0;
  835. }
  836. void CGmarkView::AddText2Edit(int idc, LPCTSTR text)
  837. {
  838.     CString szText;
  839. CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT_GPSMSG);
  840. GetDlgItemText(IDC_EDIT_GPSMSG, szText);
  841. szText += text;
  842. SetDlgItemText(IDC_EDIT_GPSMSG, szText);
  843. int nCount = pEdit->GetLineCount();
  844. if(szText.GetLength()>1000)
  845. {
  846. SetDlgItemText(IDC_EDIT_GPSMSG, text);
  847. }
  848. else if(nCount>5) 
  849. {
  850. pEdit->LineScroll( (nCount - 6) );
  851. }
  852. }
  853. void CGmarkView::OnButtonRtcmon() 
  854. {
  855. // TODO: Add your control notification handler code here
  856. m_Gps.SendCmd("$PASHS,RTC,REM,B");
  857. m_Gps.SendCmd("$PASHQ,RTC,A");
  858. }
  859. void CGmarkView::OnButtonRtcmoff() 
  860. {
  861. // TODO: Add your control notification handler code here
  862. m_Gps.SendCmd("$PASHS,RTC,OFF");
  863. m_Gps.SendCmd("$PASHQ,RTC,A");
  864. }
  865. void CGmarkView::CreateFilename(LPSTR filename, int type)
  866. {
  867. SYSTEMTIME st;
  868. char sTemp[MAX_PATH+1];
  869. memset( sTemp, 0, sizeof(sTemp) );
  870. GetLocalTime(&st);
  871. sprintf( sTemp, "%4d%2d%2d-%2d%2d",
  872.  st.wYear, st.wMonth, st.wDay, 
  873.  st.wHour, st.wMinute );
  874. switch(type)
  875. {
  876. case FN_GPSDATA:
  877. strcpy( filename, "\Storage Card\Gps" );
  878. strcat( filename, gtConfData.szRoverID );
  879. strcat( filename, "-");
  880. strcat( filename, sTemp );
  881. strcat( filename, ".txt");
  882. break;
  883. case FN_LOG:
  884. strcpy( filename, "\Storage Card\Log" );
  885. strcat( filename, gtConfData.szRoverID );
  886. strcat( filename, "-");
  887. strcat( filename, sTemp );
  888. strcat( filename, ".txt");
  889. break;
  890. case FN_RAW:
  891. strcpy( filename, "\Storage Card\Raw" );
  892. strcat( filename, gtConfData.szRoverID );
  893. strcat( filename, "-");
  894. strcat( filename, sTemp );
  895. strcat( filename, ".dat");
  896. break;
  897. }
  898. }
  899. LRESULT CGmarkView::AutoProcess(WPARAM w, LPARAM l)
  900. {
  901. BOOL bRet;
  902. DWORD dwFlag = INTERNET_CONNECTION_PROXY;
  903. int nCount = 0;
  904. bRet = InternetGetConnectedState(&dwFlag,0);
  905. if(!bRet) 
  906. {
  907. do
  908. {
  909. OnButtonDial();
  910. DWORD nWaitRet = WaitForSingleObject(m_hDialCompleteEvent, 20000);
  911. if(nWaitRet == WAIT_OBJECT_0) break;
  912. nCount++;
  913. }while(nCount <= 2);
  914. }
  915. if(nCount > 2) 
  916. {
  917. MessageBox(_T("Dial up to internet failed. Program will exit."));
  918. AfxGetMainWnd()->PostMessage(WM_CLOSE);
  919. return -1;
  920. }
  921. OnButtonConnect();
  922. Sleep(1000);
  923. OnButtonLogon();
  924. return 0;
  925. }
  926. void CGmarkView::OnButtonPbnon2()
  927. {
  928. m_Gps.SendCmd("$PASHS,NME,PBN,A,ON,1");
  929. }
  930. void CGmarkView::OnButtonPbnoff()
  931. {
  932. m_Gps.SendCmd("$PASHS,NME,PBN,A,OFF");
  933. }