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

📄 gpstestview.cpp

📁 广宇GPS系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	int cliport;
	int serport;
	char cliIp[MIDDLE_STRING];
	char cSeIP[MIDDLE_STRING];
	ZeroMemory(cliIp, MIDDLE_STRING);
	ZeroMemory(cSeIP, MIDDLE_STRING);
	cliport = atoi(m_strServerPort);
	serport = atoi(m_strLocalPort);
	strncpy(cliIp, m_strServer, MIDDLE_STRING-1);
	strncpy(cSeIP, m_strLocal, MIDDLE_STRING-1);

	ClientSocket = udpCliSocket.InitClient(cliIp, cliport);
	ServerSocket = udpSerSocket.InitServer(cSeIP, serport);
//	ASSERT(ClientSocket);
//	ASSERT(ServerSocket);
	if (!m_bCarIsRuning)
	{
		m_bCarIsRuning = TRUE;
		m_hCarThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CarRunThreadEntry, this, 0, &m_dwCarThread);
		if (m_hCarThread == NULL)
			return;

		nTimerCheckCar = SetTimer(TIMER_CHECKCAR, 500, NULL);
	}
}

//-----------------------------------------------
void CGpsTestView::OnButtonUnsimulite() 
{
	// TODO: Add your command handler code here
	if (m_bCarIsRuning)
	{
		m_bCarIsRuning = FALSE;
		if (nTimerCheckCar != -1)
		{
			KillTimer(nTimerCheckCar);
			nTimerCheckCar = -1;
		}
		ExitCarThread();
		MessageBox("多车辆模拟结束...\r\n", "提示信息", MB_ICONINFORMATION);
	}
}

//-----------------------------------------------
int CGpsTestView::CreateCarArray()
{
	int i;
	CCar *car;
	for(i=0; i<=m_carArray.GetUpperBound(); i++)
	{
		car = m_carArray.GetAt(i);
		ASSERT(car);
		delete car;
	}
	m_carArray.RemoveAll();
	
	int index;
	int	nCarNum;
	CString strNum;
	GetCarInfo();
	for (i=0; i<m_nCarNum; i++)
	{
		car = new CCar(m_strCarPhoneNum);
		car->UpDateCar();
		m_carArray.Add(car);

		strNum = m_strCarPhoneNum.Right(5);
		index = m_strCarPhoneNum.Find(strNum);
		m_strCarPhoneNum.Delete(index,5);
		nCarNum = atoi(strNum);
		nCarNum++;
		strNum.Format("%.5d", nCarNum);
		m_strCarPhoneNum += strNum;
	}

	return 0;
}

//-----------------------------------------------
DWORD WINAPI CGpsTestView::CarRunThreadEntry(LPVOID lpParam)
{
	CGpsTestView *view = (CGpsTestView *)lpParam;
	view->CarThreadProc();
	return 0;
}

//-----------------------------------------------
int CGpsTestView::CarThreadProc()
{
	int i;
	char buf[512];
	char *pSend;
	int pl,sl;

	DWORD dwStart = GetTickCount();
	while (TRUE) 
	{
		sl = sizeof(udpSerSocket.server);
		memset(buf, 0x0, 256);
 		pl = udpSerSocket.SocketRecv(ServerSocket, buf, 256, (struct sockaddr *)&udpSerSocket.server, sl);
		if (pl>0)
		{
			pSend = new char[pl];
			memcpy(pSend, buf, pl);
			TRACE0(&buf);
			::PostMessage(this->GetSafeHwnd(), WM_RECVDATA, (WPARAM)pSend, (LPARAM)pl);
		}
		
		if (GetTickCount() - dwStart >= 30000)
		{
			dwStart = GetTickCount();
			for (i=0; i<=m_carArray.GetUpperBound(); i++)
			{
				//------更新车辆队列的数据-------	
				static_cast<CCar*>(m_carArray.GetAt(i))->UpDateCar();
			}
		}	
		Sleep(1);
	}

	return 0;
}

//-----------------------------------------------
int CGpsTestView::ExitCarThread()
{
	TerminateThread(m_hCarThread, -1);
	CloseHandle(m_hCarThread);
	m_hCarThread = NULL;
	m_dwCarThread = 0;

	udpSerSocket.TerminateSocket(ServerSocket);
	udpCliSocket.TerminateSocket(ClientSocket);
	
	return 0;
}

//-----------------------------------------------
int CGpsTestView::AnalyseUdpData(WPARAM wParam, LPARAM lParam)
{
	int nBufLen;
	char *pDataBuf, *temp;
	nBufLen = static_cast<int>(lParam);
	pDataBuf = (char *)wParam;
	temp = pDataBuf;
	
//	WORD wPacketLen;
	char cMobileNum[MIDDLE_STRING];
	char cMessage[128];
	char *colon;
	int  nMobileLen, nMessageLen;
	
//	memcpy(&wPacketLen, pDataBuf, 2);
		//	pDataBuf += 2;
		//	
		//	if (nBufLen != wPacketLen + 2)
		//		return -1;
		
	if ((*pDataBuf != '#')|| *(temp+nBufLen-1) != '#')
		return -1;
	pDataBuf++;
	ZeroMemory(cMobileNum, MIDDLE_STRING);
	ZeroMemory(cMessage, 128);
	colon = strchr(pDataBuf, ':');
	nMobileLen = colon - pDataBuf;
	memcpy(cMobileNum, pDataBuf, nMobileLen);
// 	cMobileNum[nMobileLen] = 0;
	pDataBuf = colon + 1;
	
	//	nMessageLen = wPacketLen - nMobileLen - 1;
	nMessageLen = nBufLen - nMobileLen - 3;

	memcpy(cMessage, pDataBuf, nMessageLen);
// 	cMessage[nMessageLen] = 0;
	DealWithUdpData(cMobileNum, cMessage);
	delete [] temp;
	
	return 0;
}

//-----------------------------------------------
int	CGpsTestView::DealWithUdpData(char *cMobileNum, char *cMessage)
{
	CString strMobileNum;
	CString strMessage;
	strMobileNum = cMobileNum;
	strMessage = cMessage;

	int i;
	int index;
	CCar *car;
	for (i=0; i<=m_carArray.GetUpperBound(); i++)
	{
		if (strMobileNum == static_cast<CCar *>(m_carArray.GetAt(i))->m_strPhoneNum)
		{
			car = m_carArray.GetAt(i);
			index = i;
			break;
		}
	}

	sms_info  *info = new sms_info;
	ZeroMemory(info, sizeof(sms_info));
	AnalyseSms(info, strMessage);
	CString strHeader	= info->header;
	CString strSmsSn	= info->smssn;
	CString strCmdWord	= info->cmdword;
	CString strYMD      = info->y_m_d;
	CString strHMS      = info->h_m_s;
	CString strPara1    = info->cmdpara1;
	CString strPara2    = info->cmdpara2;	
	
	if (strCmdWord == "DW")
	{
		int nCount	  = StrtoHex(strPara1);
		int nInterval = StrtoHex(strPara2);
		
		if (nCount == 65535)
			car->nLeftCount = nCount;
		else
			car->nLeftCount = --nCount;
		car->m_strSn = strSmsSn;
		car->m_strCmdWord = strCmdWord;
		car->nInterval = nInterval;
		car->m_bUnderWatch = TRUE;
		car->dwStart = GetTickCount();
		
		SendDwData(car);
//		m_carArray.SetAt(index, car);
	}
	else if (strCmdWord == "TD")
	{
		car->m_bUnderWatch = FALSE;
//		m_carArray.SetAt(index, car);
		CString strMsg;
		strMsg = CreateMessage(car, strSmsSn, strCmdWord, FALSE);
		int nRet = SendCarData(strMobileNum, strMsg);
	}
	else if (strCmdWord == "QJ")
	{
		car->m_bAlarm = FALSE;
		car->m_bAlwaysAlarm = FALSE;
		car->m_strStatus = "000000000000";
//		m_carArray.SetAt(index, car);
		CString strMsg;
		strMsg = CreateMessage(car, strSmsSn, strCmdWord, TRUE);
		int nRet = SendCarData(strMobileNum, strMsg);
	}
	
	delete info;
	info = NULL;

	return 0;
}

//-----------------------------------------------
int CGpsTestView::FillUdpPacket(char *destbuff, LPCTSTR strMobileNum, LPCTSTR strMessage)
{
	WORD wPacketLen;
	char cPacket[256];
	char *pEnd;
	
	cPacket[0] = '#';
	pEnd = cPacket + 1;
	// 暂时没有验证码
	cPacket[1] = ':';
	pEnd++;
	//	pEnd = cPacket + 2;
	wPacketLen = strlen(strMobileNum);
	
	memcpy(pEnd, strMobileNum, wPacketLen);
	pEnd += wPacketLen;
	
	*pEnd++ = ':';
	wPacketLen++;
	
	wPacketLen += strlen(strMessage);
	memcpy(pEnd, strMessage, strlen(strMessage));
	
//	memcpy(cPacket, &wPacketLen, 2);
	wPacketLen += 2;

	cPacket[wPacketLen-1] = '#';
	

	memcpy(destbuff, cPacket, wPacketLen);
	return wPacketLen;
}

//-----------------------------------------------
int CGpsTestView::SendUdpData(char *buf, int len)
{
	int pl,sl;
	sl = sizeof(udpCliSocket.client);
	pl = udpCliSocket.SocketSend(ClientSocket, buf, len, (struct sockaddr *)&udpCliSocket.client, sl);
	return pl;
}

//-----------------------------------------------
int CGpsTestView::SendCarData(CString strMobileNum, CString strMessage)
{
	int len;
	char destbuff[256];
	
	memset(destbuff, 0x0, sizeof(destbuff));
	len = FillUdpPacket(destbuff, strMobileNum, strMessage);
	int nSendLen = SendUdpData(destbuff, len);

	return nSendLen;
}

//-----------------------------------------------
CString CGpsTestView::CreateMessage(CCar *car, CString strSN, CString strCmdWord, BOOL bAlarm)
{
	CString strContent;
	CString strPara1, strPara2, strPara3, strStatus;
	COleDateTime cDate;
	
	strPara1 = _T("");
	strContent = "*," + strSN + "," + strCmdWord;
	if (!bAlarm)
	{
		strPara1.Format(",%.4x,%.4x", car->nLeftCount, car->nInterval);
	}		
	strContent += strPara1;
	
	cDate = COleDateTime::GetCurrentTime();
	strPara2.Format(",A,%.2x%.2x%.2x,%.2x%.2x%.2x", 
		cDate.GetYear()-2000, cDate.GetMonth(),cDate.GetDay(), 
		cDate.GetHour(), cDate.GetMinute(), cDate.GetSecond());
	strContent += strPara2;
	
	strPara3.Format(",%.8x,%.8x,%.4x,%.4x,", car->nLatitude, car->nLongitude, car->nSpeed*100, car->nCourse);
	strContent += strPara3;
	
	strStatus = car->m_strStatus;
	strContent += strStatus;


	return strContent;
}

//-----------------------------------------------
int CGpsTestView::SendDwData(CCar *car)
{
	CString strMsg;
	strMsg = CreateMessage(car, car->m_strSn, car->m_strCmdWord, FALSE);
	int nRet = SendCarData(car->m_strPhoneNum, strMsg);

	return nRet;
}

//-----------------------------------------------
void CGpsTestView::OnKeyDownMap(short FAR* KeyCode, short Shift) 
{
	switch(*KeyCode) 
	{
	case VK_BACK:
		if (!m_bBackSpaceDown && m_ctrlMapX.GetCurrentTool() == miAddPolylineTool)
			m_bBackSpaceDown = TRUE;
		break;
	}
}

//-----------------------------------------------
void CGpsTestView::OnMouseMoveMap(short Button, short Shift, float X, float Y) 
{
	double MapX,MapY;
	
	// 在状态栏显示坐标
	m_ctrlMapX.ConvertCoord(&X, &Y, &MapX, &MapY, miScreenToMap);
	CString str;
	str.Format("%f, %f",MapX,MapY);
	((CMainFrame *)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(1,str);
}

//-----------------------------------------------
void CGpsTestView::OnClickMap()
{
	long nCurrentTool = m_ctrlMapX.GetCurrentTool();
//	if (m_bRButtonClick && (nCurrentTool == miAddPolylineTool))
//	{
//		int cRet;
//		CStatusSelect  statusDlg;
//		statusDlg.m_strSmsStatus = "010000000200";
//		cRet = statusDlg.DoModal();
//		if (cRet == IDOK)
//			return;
//	}
	return;
}

//-----------------------------------------------
void CGpsTestView::OnDblClickMap()
{
	long nCurrentTool = m_ctrlMapX.GetCurrentTool();
	if (m_bRButtonClick || nCurrentTool != miArrowTool)
		return;
	
	//float fScreenX, fScreenY;
	CSendSms sendDlg;
	sendDlg.m_nLongitude = (float)MapX;
	sendDlg.m_nLatitude = (float)MapY;
    if (sendDlg.DoModal() != IDOK)
		return;

	if (m_pMotoG18->CheckCommIsOpen() != 1)
	{
		MessageBox("请先启动工作模块!\r\n", "错误提示", MB_ICONWARNING);
		return;
	}

	GetCenterNum();
	short n = m_pMotoG18->SendSms(m_strCenterNum, sendDlg.m_strSmsDisplay, 3);
	if (n != 0)
	{
		MessageBox("短信发送失败!\r\n", "错误提示", MB_ICONWARNING);
		return;
	}

	MessageBox("短信发送成功!\r\n", "提示信息", MB_ICONINFORMATION);
	return;		
}

//-----------------------------------------------
void CGpsTestView::OnMouseDownMap(short Button, short Shift, float X, float Y)
{
	m_bRButtonClick = Button==2 ? TRUE:FALSE;
	m_ctrlMapX.ConvertCoord(&X, &Y, &MapX, &MapY, miScreenToMap);
	return;
}

//-----------------------------------------------
void CGpsTestView::OnAddFeatureToolUsed(short ToolNum, long Flags, LPDISPATCH Points, BOOL bShift, BOOL bCtrl, BOOL FAR* EnableDefault)
{
	CString str;
	str.Format("Tool=%d, [%f,%f]\n", ToolNum, MapX, MapY);
	TRACE(str);

	if (bCtrl)
	{
		int cRet;
		CStatusSelect  statusDlg;
		statusDlg.m_strSmsStatus = "000000000000";
		cRet = statusDlg.DoModal();
		if (cRet == IDOK)
			m_strStatus = statusDlg.m_strSmsStatus;
	}
	else
	{
		m_strStatus = "000000000000";
	}

	sms_content *smscont;
	smscont = new sms_content;
	memset(smscont, 0, sizeof(sms_content));
	if (!m_bBackSpaceDown)
	{
		smscont->nLongitude = (long)(MapX*600000);
		smscont->nLatitude  = (long)(MapY*600000);
		strncpy(smscont->strStatus, m_strStatus, MIDDLE_STRING-1);
	}
	else
	{
		delete smscont;
		smscont = NULL;
	}

	if (Flags == miPolyToolBegin)
	{
		if (!m_bContinue)
		{
			int i;
			sms_content *cont;
			for (i=0; i<=m_smsArray.GetUpperBound(); i++)
			{
				cont = m_smsArray.GetAt(i);
				ASSERT(cont);
				delete cont;
			}
			m_smsArray.RemoveAll();

			smscont->nSpeed = 0;
			smscont->nCourse = 0;
			m_smsArray.Add(smscont);
		}
		else
		{
			delete smscont;
			smscont = NULL;
		}

		dFirstX = MapX;
		dFirstY = MapY;
		m_ctrlMapX.ConvertCoord(&fFirstx, &fFirsty, &MapX, &MapY, miMapToScreen);
	}
	else if (Flags == miPolyToolEndEscaped)
	{
		delete smscont;
		smscont = NULL;

		int i;
		sms_content *cont;
		for (i=0; i<=m_smsArray.GetUpperBound(); i++)
		{
			cont = m_smsArray.GetAt(i);
			ASSERT(cont);
			delete cont;
		}	
		m_smsArray.RemoveAll();
		m_bBackSpaceDown = FALSE;
	}
	else if (Flags == miPolyToolInProgress)
	{
		if (m_bBackSpaceDown)
		{
			sms_content *cont;
			int nNum = m_smsArray.GetSize();
			ASSERT(nNum >= 1);
			cont = m_smsArray.GetAt(nNum-1);
			delete cont;
			cont = NULL;
			m_smsArray.RemoveAt(nNum-1);
			m_bBackSpaceDown = FALSE;
		}
		else
		{
			double dDistanceTot = 0.0;
			double dCourse = 0.0;
			double dsinValue;
			float  x,y,X,Y;
			try
			{		
				m_ctrlMapX.SetMapUnit(miUnitKilometer);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -