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

📄 gmarkview.cpp

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