📄 gpstestview.cpp
字号:
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 + -