📄 gpstestview.cpp
字号:
void CGpsTestView::OnButtonPathstop()
{
// TODO: Add your command handler code here
if (m_bIsRuning)
{
m_bIsRuning = FALSE;
ExitPathThread();
if (nTimerSendSms != -1)
{
KillTimer(nTimerSendSms);
nTimerSendSms = -1;
}
if (nTimerFlash != -1)
{
KillTimer(nTimerFlash);
nTimerFlash = -1;
}
nCurrentPointNum = 0;
m_bRecvQJ = FALSE;
//----------------此函数有问题-------------------
ErasePathLine();
// MessageBox("模拟结束...\r\n", "提示信息", MB_ICONWARNING);
}
}
//-----------------------------------------------
DWORD WINAPI CGpsTestView::PathRunThreadEntry(LPVOID lpParam)
{
CGpsTestView *view = (CGpsTestView *)lpParam;
view->PathThreadProc();
return 0;
}
//-----------------------------------------------
int CGpsTestView::PathThreadProc()
{
BOOL bDirection = TRUE;
BOOL bCheckEnd = FALSE;
DWORD dwStart = GetTickCount();
int nMax = m_smsRunArray.GetUpperBound();
nCurrentPointNum = 0;
CarAlarm();
while (TRUE)
{
if (GetTickCount() - dwStart >= 30000)
{
dwStart = GetTickCount();
if (bDirection)
{
nCurrentPointNum++;
if (!bCheckEnd)
CheckStatus(nCurrentPointNum);
if (nCurrentPointNum == nMax)
{
bDirection = FALSE;
bCheckEnd = TRUE;
}
}
else
{
nCurrentPointNum--;
if (nCurrentPointNum == 0)
bDirection = TRUE;
}
int nAlarm = CarAlarm();
}
if (m_dwBStart != 0)
{
if (GetTickCount() - m_dwBStart >= 120000)
{
m_dwBStart = GetTickCount();
if (!m_bRecvQJ)
{
int nRet = SendReplaySms("00000000", "BJ", TRUE);
if (nRet != 0)
{
MessageBox("发送报警信息错误...\r\n", "警告信息", MB_ICONWARNING);
}
}
}
}
Sleep(1);
}
return 0;
}
//-----------------------------------------------
int CGpsTestView::ExitPathThread()
{
TerminateThread(m_hPathThread, -1);
CloseHandle(m_hPathThread);
m_hPathThread = NULL;
m_dwPathThread = 0;
return 0;
}
//-----------------------------------------------
int CGpsTestView::StrtoHex(CString str)
{
int n;
char cTemp[100], chTemp;
n = 0;
ZeroMemory(cTemp,sizeof(cTemp));
sprintf(cTemp, "%s", str);
for (UINT i=0; i < strlen(cTemp); i++)
{
chTemp = Char2Hex(cTemp[i]);
n = n*16 + chTemp;
}
return n;
}
//-----------------------------------------------
int CGpsTestView::SendReplaySms(CString strSN, CString strCmdWord, BOOL bAlarm, int nCount/* =-1 */, int nInterval/* =0 */)
{
CString str;
CString strContent;
CString strPara1, strPara2, strPara3, strStatus;
sms_content *cont;
COleDateTime cDate;
strPara1 = _T("");
strContent = "*," + strSN + "," + strCmdWord;
if (nCount != -1)
strPara1.Format(",%.4x,%.4x", nCount, 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;
cont = m_smsRunArray.GetAt(nCurrentPointNum);
strPara3.Format(",%.8x,%.8x,%.4x,%.4x,", cont->nLatitude, cont->nLongitude, cont->nSpeed, cont->nCourse);
strContent += strPara3;
strStatus = cont->strStatus;
if (bAlarm)
{
str = strStatus.Left(8);
str += m_strAlarmStatus;
strContent += str;
}
else
strContent += strStatus;
GetCenterNum();
// ASSERT(m_pMotoG18->CheckCommIsOpen() == 1);
short n = m_pMotoG18->SendSms(m_strCenterNum, strContent, 5);
if (n != 0)
{
MessageBox("短信发送失败!\r\n", "错误提示", MB_ICONWARNING);
return -1;
}
return 0;
}
//-----------------------------------------------
void CGpsTestView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch (nIDEvent)
{
case TIMER_SENDSMS:
{
SendSms();
}
break;
case TIMER_FLASH:
{
if (!m_bDrowPoint)
{
EraseFlashPoint();
m_bDrowPoint = TRUE;
}
else
{
PointFlash(nCurrentPointNum);
m_bDrowPoint = FALSE;
}
}
break;
case TIMER_CHECKCAR:
{
int i;
CCar *car;
CString strMsg;
for(i=0; i<=m_carArray.GetUpperBound(); i++)
{
if (static_cast<CCar *>(m_carArray.GetAt(i))->m_bAlarm)
{
car = m_carArray.GetAt(i);
DWORD dwtime;
dwtime = GetTickCount();
if (!car->m_bAlwaysAlarm)
{
car->dwBJtime = dwtime;
car->m_bAlwaysAlarm = TRUE;
strMsg = CreateMessage(car, "00000000", "BJ", TRUE);
int nRet = SendCarData(car->m_strPhoneNum, strMsg);
}
}
if (static_cast<CCar *>(m_carArray.GetAt(i))->m_bAlwaysAlarm)
{
car = m_carArray.GetAt(i);
DWORD dwAtime;
dwAtime = GetTickCount();
if ((dwAtime - car->dwBJtime) > 30000)
{
car->dwBJtime = dwAtime;
strMsg = CreateMessage(car, "00000000", "BJ", TRUE);
int nRet = SendCarData(car->m_strPhoneNum, strMsg);
car->m_bAlarm = FALSE;
car->m_bAlwaysAlarm = FALSE;
car->m_strStatus = "000000000000";
}
}
if (static_cast<CCar *>(m_carArray.GetAt(i))->m_bUnderWatch)
{
car = m_carArray.GetAt(i);
DWORD dwCurrentTime;
dwCurrentTime = GetTickCount();
if (car->nLeftCount > 0)
{
if ((dwCurrentTime-car->dwStart) > (DWORD)(car->nInterval*1000))
{
if (car->nLeftCount != 65535)
car->nLeftCount--;
car->dwStart = dwCurrentTime;
int nRet = SendDwData(car);
}
}
}
}
}
break;
}
CView::OnTimer(nIDEvent);
}
//-----------------------------------------------
int CGpsTestView::SendSms()
{
UINT nCount, nInterval;
int nSendResult;
GetSmsContent();
nCount = atoi(m_strDwCount);
nInterval = atoi(m_strDwInterval);
if (nCount == 0)
{
KillTimer(nTimerSendSms);
nTimerSendSms = -1;
}
else if (nCount == 65535)
{
nSendResult = SendReplaySms(m_strDwSN, m_strCmdWord, FALSE, nCount, nInterval);
if (nSendResult != 0)
{
KillTimer(nTimerSendSms);
nTimerSendSms = -1;
MessageBox("回复定位信息错误...\r\n", "警告信息", MB_ICONWARNING);
return -1;
}
}
else
{
nCount--;
nSendResult = SendReplaySms(m_strDwSN, m_strCmdWord, FALSE, nCount, nInterval);
if (nSendResult != 0)
{
KillTimer(nTimerSendSms);
nTimerSendSms = -1;
MessageBox("回复定位信息错误...\r\n", "警告信息", MB_ICONWARNING);
return -1;
}
m_strDwCount.Format("%d", nCount);
SetSmsContent();
}
return 0;
}
//-----------------------------------------------
int CGpsTestView::CheckStatus(int nPointNum)
{
int nAStatus, nBStatus;
CString str;
CString strStatus;
sms_content *cont;
GetAlarmStatus();
nAStatus = StrtoHex(m_strAlarmStatus);
cont = m_smsRunArray.GetAt(nPointNum);
strStatus = cont->strStatus;
str = strStatus.Right(4);
nBStatus = StrtoHex(str);
m_strAlarmStatus.Format("%.4x", nAStatus|nBStatus);
// SetAlarmStatus();
return 0;
}
//-----------------------------------------------
int CGpsTestView::CarAlarm()
{
// GetAlarmStatus();
if (strcmp(m_strAlarmStatus, "0000") == 0)
{
m_strAstatus = m_strAlarmStatus;
m_bRecvQJ = TRUE;
return -1;
}
if (strcmp(m_strAlarmStatus, m_strAstatus) != 0)
{
m_strAstatus = m_strAlarmStatus;
m_dwBStart = GetTickCount();
m_bRecvQJ = FALSE;
int nRet = SendReplaySms("00000000", "BJ", TRUE);
if (nRet != 0)
{
MessageBox("发送报警信息错误...\r\n", "警告信息", MB_ICONWARNING);
return -2;
}
}
return 0;
}
//-----------------------------------------------
int CGpsTestView::CreatePathLine()
{
CMapXFeature newobj;
CMapXPoints pts;
CMapXLayer lyr;
CMapXPoint pt;
VARIANT vtPt;
double x=0.0, y=0.0;
if(!newobj.CreateDispatch(newobj.GetClsid()))
{
TRACE0("Failed to create Feature object");
return -1;
}
if(!pts.CreateDispatch(pts.GetClsid()))
{
TRACE0("Failed to create Points collection");
return -1;
}
if(!pt.CreateDispatch(pt.GetClsid()))
{
TRACE0("Failed to create Point object");
return -1;
}
try
{
sms_content *cont;
newobj.Attach(m_ctrlMapX.GetDispatch());
newobj.SetType(miFeatureTypeLine);
// Use the map's default symbol style
newobj.SetStyle(m_ctrlMapX.GetDefaultStyle());
for (int i=0; i<m_smsRunArray.GetSize(); i++)
{
cont = m_smsRunArray.GetAt(i);
x = ((double)cont->nLongitude) / 600000;
y = ((double)cont->nLatitude) / 600000;
pt.Set(x, y);
pts.Add(pt);
}
vtPt.vt = VT_DISPATCH;
vtPt.pdispVal = pts.m_lpDispatch;
newobj = m_ctrlMapX.GetFeatureFactory().CreateLine(vtPt);
//newobj.GetParts().Add(pts);
lyr = m_ctrlMapX.GetLayers().Item("Point Layer");
ft = lyr.AddFeature(newobj);
// lyr.SetKeyField("State");
// ft.SetKeyValue("running");
// ft.Update(TRUE);
//lyr.Refresh();
// obj will be the newly added object
} catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
} catch (COleException *e) {
e->ReportError();
e->Delete();
}
return 0;
}
//-----------------------------------------------
void CGpsTestView::ErasePathLine()
{
// CMapXFeature ft;
CMapXLayer lyr;
sms_content *contbef;
try
{
lyr = m_ctrlMapX.GetLayers().Item("Point Layer");
lyr.DeleteFeature(ft.GetFeatureID());
lyr.Refresh();
EraseFlashPoint();
for (int i=0; i<m_smsRunArray.GetSize(); i++)
{
contbef = m_smsRunArray.GetAt(i);
ASSERT(contbef);
delete contbef;
}
m_smsRunArray.RemoveAll();
} catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
} catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
//-----------------------------------------------
void CGpsTestView::PointFlash(int nPointNum)
{
sms_content *cont;
CMapXFeature ft;
CMapXPoint pt;
CMapXLayer lyr;
CMapXStyle style;
double x, y;
if(!pt.CreateDispatch(pt.GetClsid()))
{
TRACE0("Failed to create Point object");
return;
}
if(!style.CreateDispatch(style.GetClsid()))
{
TRACE0("Failed to create Style object");
return;
}
try
{
cont = m_smsRunArray.GetAt(nPointNum);
x = ((double)cont->nLongitude) / 600000;
y = ((double)cont->nLatitude) / 600000;
pt.Set(x, y);
lyr = m_ctrlMapX.GetLayers().Item("Flash Layer");
style = lyr.GetStyle();
VARIANT vart,sty;
vart.vt = VT_DISPATCH;
vart.pdispVal = pt;
sty.vt = VT_DISPATCH;
sty.pdispVal = style;
ft = m_ctrlMapX.GetFeatureFactory().CreateSymbol(vart,sty);
ft = lyr.AddFeature(ft);
// lyr.SetKeyField("State");
// ft.SetKeyValue("BMW-V");
// ft.Update(TRUE);
} catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
} catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
//-----------------------------------------------
void CGpsTestView::EraseFlashPoint()
{
// CMapXFeature ft;
CMapXFeatures fts;
CMapXLayer lyr;
long i;
try
{
lyr = m_ctrlMapX.GetLayers().Item("Flash Layer");
fts = lyr.AllFeatures();
for (i=fts.GetCount(); i>0; i--)
{
//ft = fts.Item(i);
lyr.DeleteFeature(fts.Item(i).GetFeatureID());
}
lyr.Refresh();
} catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
} catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -