📄 gmarkview.cpp
字号:
/*for test mapping file*/
void CGmarkView::OnButtonTestmap()
{
// TODO: Add your control notification handler code here
m_Gps.m_tGpsData.Latitude = 12;
m_Gps.m_tGpsData.Longitude = 34;
m_Gps.m_tGpsData.SatCount = 8;
m_Gps.m_tGpsData.Status = 1;
OnGpsUpdate(0,0);
}
void CGmarkView::OnButtonLogon()
{
// TODO: Add your control notification handler code here
WORD wVersionRequested;
WSADATA wsaData;
int nRet;
if(m_Socket != INVALID_SOCKET) return;
wVersionRequested = MAKEWORD(2,2);
WSAStartup( wVersionRequested, &wsaData);
#ifndef _USE_UDP
m_Socket = socket(AF_INET, SOCK_STREAM, 0);
#else
m_Socket = socket(AF_INET, SOCK_DGRAM, 0); // use UDP
#endif
if( m_Socket == INVALID_SOCKET )
{
MessageBox(_T("INVALID_SOCKET is returned by socket()"));
return;
}
SOCKADDR_IN BaseSockAddr;
memset( &BaseSockAddr, 0, sizeof(BaseSockAddr) );
BaseSockAddr.sin_port = htons(PORT);
BaseSockAddr.sin_family = AF_INET;
BaseSockAddr.sin_addr.S_un.S_addr = inet_addr(gtConfData.szBaseIP);
// connect to server
#ifndef _USE_UDP
nRet = connect( m_Socket, (const struct sockaddr*)&BaseSockAddr, sizeof(BaseSockAddr) );
if( nRet == SOCKET_ERROR )
{
MessageBox(_T("SOCKET_ERROR is returned by connect()"));
return;
}
#endif
//to logon
char send_data[MAX_ROVERID+MAX_ROVERDESC+2];
memset( send_data, 0, sizeof(send_data) );
#ifndef _USE_UDP
strcpy( send_data, "LOG,");
strcat( send_data, gtConfData.szRoverID );
strcat( send_data, "," );
strcat( send_data, gtConfData.szRoverDesc );
#else
strcpy( send_data, "LOG,");
strcat( send_data, gtConfData.szRoverID );
strcat( send_data, "," );
strcat( send_data, gtConfData.szRoverDesc );
#endif
// send logon message to base
#ifndef _USE_UDP
nRet = send( m_Socket, send_data, strlen(send_data), 0 );
#else
nRet = sendto( m_Socket, send_data, strlen(send_data), 0,
(struct sockaddr*)&BaseSockAddr, sizeof(BaseSockAddr) );
#endif
if( nRet == SOCKET_ERROR )
{
MessageBox(_T("SOCKET_ERROR is returned by send()"));
return;
}
// specify a read socket thread
DWORD dwThreadID;
m_bCloseSocketFlg = FALSE;
if (hReadSocketThread = CreateThread (NULL, 0, ReadSocketThread, this , 0, &dwThreadID))
{
ResumeThread( hReadSocketThread );
// SetThreadPriority( hReadSocketThread, THREAD_PRIORITY_TIME_CRITICAL );
CeSetThreadPriority(hReadSocketThread, 0);
}
else
{
MessageBox(TEXT("Unable to create the read socket thread"), TEXT("Error"), MB_OK);
return;
}
SetDlgItemText(IDC_EDIT_STATUS_SOCK, _T("Connected to Center"));
// enable to send activation package
m_nActivateTimer = SetTimer( 2, SOCK_CON_ACTIVATE_INTERVAL, 0 );
GetDlgItem(IDC_BUTTON_LOGON)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_LOGOFF)->EnableWindow(TRUE);
/////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_SOCK, _T("Connected to Center"));
m_dlgOperate->GetDlgItem(IDC_BUTTON_LOGON)->EnableWindow(FALSE);
m_dlgOperate->GetDlgItem(IDC_BUTTON_LOGOFF)->EnableWindow(TRUE);
/////////
}
void CGmarkView::OnButtonLogoff()
{
// TODO: Add your control notification handler code here
// send logoff message to base
SOCKADDR_IN BaseSockAddr;
char send_data[MAX_ROVERID+MAX_ROVERDESC+2];
memset( send_data, 0, sizeof(send_data) );
memset( &BaseSockAddr, 0, sizeof(BaseSockAddr) );
BaseSockAddr.sin_port = htons(PORT);
BaseSockAddr.sin_family = AF_INET;
BaseSockAddr.sin_addr.S_un.S_addr = inet_addr(gtConfData.szBaseIP);
strcpy( send_data, "OFF,");
strcat( send_data, gtConfData.szRoverID );
strcat( send_data, "," );
strcat( send_data, gtConfData.szRoverDesc );
sendto( m_Socket, send_data, strlen(send_data), 0,
(struct sockaddr*)&BaseSockAddr, sizeof(BaseSockAddr) );
//
KillTimer( m_nActivateTimer ); // disable to send activate package.
m_bCloseSocketFlg = TRUE;
TerminateThread(hReadSocketThread,0);
CloseHandle(hReadSocketThread);
closesocket( m_Socket );
WSACleanup();
m_Socket = INVALID_SOCKET;
SetDlgItemText(IDC_EDIT_STATUS_SOCK, _T("Disconnected from Center"));
GetDlgItem(IDC_BUTTON_LOGON)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_LOGOFF)->EnableWindow(FALSE);
///////////
m_dlgOperate->SetDlgItemText(IDC_EDIT_STATUS_SOCK, _T("Disconnected from Center"));
m_dlgOperate->GetDlgItem(IDC_BUTTON_LOGON)->EnableWindow(TRUE);
m_dlgOperate->GetDlgItem(IDC_BUTTON_LOGOFF)->EnableWindow(FALSE);
///////////
}
BOOL CGmarkView::ReadConfig()
{
FILE * fp;
char sTemp[CONFIG_MAX_LINE+1];
int n;
BOOL nRet = FALSE;
memset( gtConfData.szRoverID, 0, sizeof(gtConfData.szRoverID));
memset( gtConfData.szRoverDesc, 0, sizeof(gtConfData.szRoverDesc));
memset( sTemp, 0, sizeof(sTemp));
#ifndef _WIN32_WCE_CEPC
fp = fopen("\\ResidentFlash\\config.txt","rt");
#else
fp = fopen("\\config.txt","rt");
#endif
if(fp == NULL)
{
// MessageBox(_T("Open configuration file failed"));
// return FALSE;
}
while(1)
{
n = getline(fp, gtConfData.szRoverID);
if( n<= 0 )
{
//MessageBox(_T("Read configuration file failed"));
//break;
}
n = getline(fp, gtConfData.szRoverDesc);
if( n<= 0 )
{
//MessageBox(_T("Read configuration file failed"));
//break;
}
n = getline(fp, sTemp); //read ip address of base station
if( n<= 0 || strlen(sTemp)>15)
{
//MessageBox(_T("Read configuration file failed"));
//break;
}
strcpy( gtConfData.szBaseIP, sTemp );
n = getline(fp, sTemp); //read original longitude
if( n<= 0 )
{
// MessageBox(_T("Read configuration file failed"));
// break;
}
gtConfData.dOrigLon = atof(sTemp);
n = getline(fp, sTemp); //read original latitude
if( n<= 0 )
{
//MessageBox(_T("Read configuration file failed"));
// break;
}
gtConfData.dOrigLat = atof(sTemp);
n = getline(fp, sTemp); //read start mode
if( n<= 0 )
{
// MessageBox(_T("Read configuration file failed"));
// break;
}
gtConfData.bAutoStart = atoi(sTemp);
n = getline(fp, sTemp); //read if display NEMA message
if( n<= 0 )
{
// MessageBox(_T("Read configuration file failed"));
// break;
}
gtConfData.bDispNEMA = atoi(sTemp);
n = getline(fp, sTemp); //read if display RTCM data
if( n<= 0 )
{
// MessageBox(_T("Read configuration file failed"));
// break;
}
gtConfData.bDispRTCM = atoi(sTemp);
nRet = TRUE;
break;
}
fclose(fp);
return nRet;
}
void CGmarkView::GmarkMessageBox(const char * buf)
{
int nLength=strlen((const char *)buf);
TCHAR *wszBuffer = new TCHAR[nLength+1];
memset(wszBuffer, 0, (nLength+1)*sizeof(TCHAR));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (const char *)buf, -1, wszBuffer, nLength);
MessageBox(wszBuffer);
delete wszBuffer;
}
int CGmarkView::getline(FILE *fp, char *szLine)
{
int len;
char *hp, *tp;
char buffer[CONFIG_MAX_LINE+1];
memset( buffer, 0, sizeof(buffer) );
if( fgets(buffer, CONFIG_MAX_LINE, fp) == NULL ) return 0;
hp = buffer;
while(*hp == ' ' || *hp == '\t') hp++;
tp = hp + strlen(hp) - 1;
while (tp >= hp && (*tp == ' ' || *tp == '\t' || *tp == '\n')) tp--;
*(tp+1) = '\0';
for(tp = buffer; *tp++ = *hp++;);
len = strlen(buffer);
strcpy( szLine, buffer );
return len;
}
void CGmarkView::WriteRTCM(char * RTCMBuf, int nBytes)
{
//save rtcm data
#ifdef _SAVE_RTCM
fwrite(RTCMBuf, 1, nBytes, fpRtcm);
#endif
/*****************check rtcm sum****************************/
/*
unsigned char sum;
int len = strlen(RTCMBuf);
char * recvmsg = new char[len];
memset( recvmsg, 0, sizeof(recvmsg));
if((unsigned char)RTCMBuf[0] != 0x8F)
{
m_dlgMonitor->UpdateRtcmData("0x8F head error ");
delete recvmsg;
return;
}
sum =0;
for(int i=1; i<len-1; i++)
{
sum = sum^(unsigned char)RTCMBuf[i];
recvmsg[i-1] = RTCMBuf[i];
}
if(sum != RTCMBuf[len-1])
{
m_dlgMonitor->UpdateRtcmData("check sum error ");
delete recvmsg;
return;
}
memset( RTCMBuf, 0, sizeof(RTCMBuf));
strcpy(RTCMBuf, recvmsg);
delete recvmsg;
*/
/******************end check*******************************/
/******************** //for test********************************/
/* TCHAR wBuff[GPS_MAX_NEMASIZE+1];
// Convert from MultiByte to UNICODE
mbstowcs(wBuff, (const char *)RTCMBuf, GPS_MAX_NEMASIZE);
SetDlgItemText( IDC_EDIT_RECV, wBuff );*/
//////////////////////
m_dlgMonitor->UpdateRtcmData((const char *)RTCMBuf);
//////////////////////
/******************************************************************/
m_Gps.WriteRTCM( RTCMBuf );
}
DWORD WINAPI ReadSocketThread(LPVOID lpvoid) //Read Socket Thread
{
int nBytes=0;
char sLog[MAX_LOGMSG_SIZE+1];
CGmarkView *pView = (CGmarkView *)lpvoid;
try
{
while(1)
{
if(pView->m_bCloseSocketFlg)
{
break;
}
// receive from socket
memset( pView->m_RTCMBuf, 0, sizeof(pView->m_RTCMBuf) );
pView->m_Log.Write("Just before recv()");
#ifndef _USE_UDP
nBytes = recv( pView->m_Socket, pView->m_RTCMBuf, sizeof(pView->m_RTCMBuf)-1, 0 );
#else
SOCKADDR_IN SockAddr;
int buflen;
memset( &SockAddr, 0, sizeof(SockAddr) );
SockAddr.sin_port = htons(PORT);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.S_un.S_addr = inet_addr(gtConfData.szBaseIP);
buflen = sizeof(SockAddr);
nBytes = recvfrom( pView->m_Socket, pView->m_RTCMBuf, sizeof(pView->m_RTCMBuf)-1, 0,
(struct sockaddr*)&SockAddr, &buflen );
// strcpy(pView->m_RTCMBuf, "12345678901234567890123456789012345678901234567890\
// 123456789012345678901234567890");//for test
// nBytes = strlen(pView->m_RTCMBuf);
#endif
memset( sLog, 0, sizeof(sLog) );
_snprintf( sLog, sizeof(sLog)-1, "%d bytes rtcm data received.", nBytes );
pView->m_Log.Write( sLog );
// check the result of recv()
if(nBytes>0)
{
//reply an ACK to server
#ifndef _USE_UDP
send( pView->m_Socket, "ACK", 3, 0 );
#else
sendto( pView->m_Socket, "ACK", 3, 0,
(const struct sockaddr*)&SockAddr, buflen);
#endif
pView->WriteRTCM( pView->m_RTCMBuf, nBytes );
memset( sLog, 0, sizeof(sLog) );
_snprintf( sLog, sizeof(sLog)-1, "%d bytes rtcm data writed.", nBytes );
pView->m_Log.Write( sLog );
}
else if(nBytes==0)
{
pView->m_Log.Write( "return 0 by recv()" );
break;
}
else if(nBytes==SOCKET_ERROR)
{
DWORD error = GetLastError();
memset( sLog, 0, sizeof(sLog) );
_snprintf( sLog, sizeof(sLog)-1, "%d returned by recv() and error code = %d.", nBytes, error );
pView->m_Log.Write( sLog );
break;
}
else
{
pView->m_Log.Write( "return else value by recv()" );
break;
}
// send activate package if need
if( pView->m_bNeedActivate )
{
send( pView->m_Socket, SOCK_CON_ACTIVEPACK, 1, 0 );
pView->m_Log.Write( "Activate package is sent" );
pView->m_bNeedActivate = FALSE;
}
}
}catch(...)
{
pView->m_Log.Write( "Exception is caught" );
}
pView->m_Log.Write( "ReadSocketThread will exit soon." );
//MessageBox(pView->m_hWnd,_T("ReadSocketThread will exit soon."),_T("Info"),MB_OK);
ExitThread(WM_QUIT);
return 0;
}
void CGmarkView::AddText2Edit(int idc, LPCTSTR text)
{
CString szText;
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT_GPSMSG);
GetDlgItemText(IDC_EDIT_GPSMSG, szText);
szText += text;
SetDlgItemText(IDC_EDIT_GPSMSG, szText);
int nCount = pEdit->GetLineCount();
if(szText.GetLength()>1000)
{
SetDlgItemText(IDC_EDIT_GPSMSG, text);
}
else if(nCount>5)
{
pEdit->LineScroll( (nCount - 6) );
}
}
void CGmarkView::OnButtonRtcmon()
{
// TODO: Add your control notification handler code here
m_Gps.SendCmd("$PASHS,RTC,REM,B");
m_Gps.SendCmd("$PASHQ,RTC,A");
}
void CGmarkView::OnButtonRtcmoff()
{
// TODO: Add your control notification handler code here
m_Gps.SendCmd("$PASHS,RTC,OFF");
m_Gps.SendCmd("$PASHQ,RTC,A");
}
void CGmarkView::CreateFilename(LPSTR filename, int type)
{
SYSTEMTIME st;
char sTemp[MAX_PATH+1];
memset( sTemp, 0, sizeof(sTemp) );
GetLocalTime(&st);
sprintf( sTemp, "%4d%2d%2d-%2d%2d",
st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute );
switch(type)
{
case FN_GPSDATA:
strcpy( filename, "\\Storage Card\\Gps" );
strcat( filename, gtConfData.szRoverID );
strcat( filename, "-");
strcat( filename, sTemp );
strcat( filename, ".txt");
break;
case FN_LOG:
strcpy( filename, "\\Storage Card\\Log" );
strcat( filename, gtConfData.szRoverID );
strcat( filename, "-");
strcat( filename, sTemp );
strcat( filename, ".txt");
break;
case FN_RAW:
strcpy( filename, "\\Storage Card\\Raw" );
strcat( filename, gtConfData.szRoverID );
strcat( filename, "-");
strcat( filename, sTemp );
strcat( filename, ".dat");
break;
}
}
LRESULT CGmarkView::AutoProcess(WPARAM w, LPARAM l)
{
BOOL bRet;
DWORD dwFlag = INTERNET_CONNECTION_PROXY;
int nCount = 0;
bRet = InternetGetConnectedState(&dwFlag,0);
if(!bRet)
{
do
{
OnButtonDial();
DWORD nWaitRet = WaitForSingleObject(m_hDialCompleteEvent, 20000);
if(nWaitRet == WAIT_OBJECT_0) break;
nCount++;
}while(nCount <= 2);
}
if(nCount > 2)
{
MessageBox(_T("Dial up to internet failed. Program will exit."));
AfxGetMainWnd()->PostMessage(WM_CLOSE);
return -1;
}
OnButtonConnect();
Sleep(1000);
OnButtonLogon();
return 0;
}
void CGmarkView::OnButtonPbnon2()
{
m_Gps.SendCmd("$PASHS,NME,PBN,A,ON,1");
}
void CGmarkView::OnButtonPbnoff()
{
m_Gps.SendCmd("$PASHS,NME,PBN,A,OFF");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -