📄 videocaptureview.cpp
字号:
m_Comm.SetDTREnable (FALSE);
m_Comm.SetRTSEnable (FALSE);
}
else
{
if(!ComOpen(m_CommPort))
{
CDlgComSet dlg;
IsCapturing=FALSE;
dlg.DoModal();
};
// ComStopRec=FALSE;
}
}
/***---------------------------------------------------------------------****
初始化串口控件
m_Comm接受雷达 速度 数据
****---------------------------------------------------------------------***/
BOOL CVideoCaptureView::ComOpen(BYTE Comm)
{
try
{
if(m_Comm.GetPortOpen())
m_Comm.SetPortOpen(FALSE);
m_Comm.SetDTREnable (FALSE);
m_Comm.SetRTSEnable (FALSE);
m_Comm.SetCommPort(Comm); //选择com1
// m_Comm. SetOutBufferSize(512)
m_Comm.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_Comm.SetOutBufferSize(512);
if( !m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE);//打开串口
else
{
CString errStr;
errStr.Format("打开串口Com%d失败",m_Comm.GetCommPort());
WriteLog(errStr);
ShowMessage(errStr);
return FALSE;
}
m_Comm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
m_Comm.SetDTREnable (TRUE);
m_Comm.SetRTSEnable (TRUE);
m_Comm.SetInputMode(1); //以二进制方式检到数据
m_Comm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Comm.SetInputLen(0); //设置当前接收区数据长度为0
m_Comm.GetInput();//先预读缓冲区以清除残留数据
//初始化雷达
InitRadar();
}
catch(...)
{
CString str;
str.Format("串口COM%d不存在,或被其他程序占用",Comm);
WriteLog(str);
ShowMessage(str);
return FALSE;
//exit(1);
}
return TRUE;
}
void CVideoCaptureView::OnUpdateCommOpen(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Comm.GetPortOpen());
}
//预留给 号牌自动识别
CString CVideoCaptureView::GetLicense(HDIB hDib)
{
return "";
}
//保存为AVI视频
void CVideoCaptureView::CaptureAVI(DWORD dwSize)
{
if(m_VC.IsRecording())
{
m_nNumBmp=m_nOldNumBmp;
m_VC.StopAVI();
GetDlgItem(IDC_BTNVIDEOCAP)->SetWindowText("手动抓拍视频(K)");
GetDlgItem(IDC_BTNIMAGECAP)->EnableWindow(TRUE);
GetDlgItem(IDC_BTNSHOWVEDIO)->EnableWindow(TRUE);
GetDlgItem(IDC_BTNVIDEOCAP)->SetFocus();
}
else
{
if(dwSize<=0)
ShowMessage("AVI尺寸必须>1M");
else
{
m_nThisBmpNum=1;
m_nOldNumBmp=m_nNumBmp;
m_nNumBmp=1;
/************************************************************************/
/* m_OldTargetSpeed=targetSpeed;
m_OldLockSpeed=lockSpeed;
m_OldFastSpeed=fastSpeed;
m_PoliceSpeed=policeSpeed; */
/************************************************************************/
CString str=Capture(m_OldTargetSpeed,m_OldLockSpeed,m_OldFastSpeed,m_iSpeed,false);
str=DataPath+"\\"+ m_VC.StartAVI(dwSize,m_nChanel) + "," + str;
if(str!="")
{
GetDlgItem(IDC_BTNVIDEOCAP)->SetWindowText("停止抓拍视频(K)");
GetDlgItem(IDC_BTNIMAGECAP)->EnableWindow(FALSE);
GetDlgItem(IDC_BTNSHOWVEDIO)->EnableWindow(FALSE);
GetDlgItem(IDC_BTNVIDEOCAP)->SetFocus();
COleDateTime tm=COleDateTime::GetCurrentTime();
CString date;
date.Format("%d-%d-%d %d:%d:%d",tm.GetYear(),tm.GetMonth(),tm.GetDay(),tm.GetHour(),tm.GetMinute(),tm.GetSecond());
CString stationname;
stationname=m_stationName;
CString sql,license;
license=GetLicense(m_hDib[thisBlockNum][m_nThisBmpNum-1][1]);
sql.Format("insert into record(XZQYDM,JQBH,WZSJ,WZDD,XLSD,MBSD,ZKSD,SDSD,XZSD,bmp,HPHM,SPBJ) values('%s','%s',CDate('%s'),'%s',%d,%d,%d,%d,%d,'%s','%s','1')",
m_szAddress,m_szMachineID,date,stationname,m_PoliceSpeed,m_OldTargetSpeed,m_OldFastSpeed,m_OldLockSpeed,m_iSpeed,str,license);
pConn->Execute(sql);
pcsDlg->UpdateData(FALSE);
InsertToList();
}
}
}
}
//自定义消息处理,当AVI文件超过大小限制时 触发
void CVideoCaptureView::AviIsStop(WPARAM wParam, LPARAM lParam)
{
m_nNumBmp=m_nOldNumBmp;
GetDlgItem(IDC_BTNVIDEOCAP)->SetWindowText("手动抓拍视频(K)");
GetDlgItem(IDC_BTNIMAGECAP)->EnableWindow(TRUE);
GetDlgItem(IDC_BTNSHOWVEDIO)->EnableWindow(TRUE);
}
/*-----------------------------------------------------------------------------------
在listCtrl上
显示一条纪录
-----------------------------------------------------------------------------------*/
void CVideoCaptureView::InsertToList()
{
CADODataset* pRst=new CADODataset();
pRst->SetConnection(pConn);
pRst->Open("SELECT * FROM record WHERE XH=(select max(XH) from record)");
if(pRst->IsEof()){
pRst->Close();
delete pRst;//->~CADODataset();
return;
}
CString str;
int nItem;
LONG nHPYS;
pRst->GetFieldValue("XH",str);
//当前的纪录 序号
m_uSelectRecord=atoi(str);
long ZDJC;
pRst->GetFieldValue("ZDJC",ZDJC);
if (!ZDJC) {
CListCtrl* pLC=(CListCtrl*)GetDlgItem(IDC_LIST_DATA);
if(pLC->GetItemCount()>1000)
pLC->DeleteItem(pLC->GetItemCount()-1);
nItem=pLC->InsertItem(0,str);
pRst->GetFieldValue("WZSJ",str);
pLC->SetItemText(nItem,3,str);
pRst->GetFieldValue("WZDD",str);
pLC->SetItemText(nItem,4,str);
pRst->GetFieldValue("MBSD",str);
pLC->SetItemText(nItem,1,str);
str.Format("%d",m_iSpeed);
pLC->SetItemText(nItem,5,str);
}else
{
nItem=m_ctlLIST_ZDJC.InsertItem(0,str);
pRst->GetFieldValue("HPHM",str);
m_ctlLIST_ZDJC.SetItemText(nItem,1,str);
CString XYHP=str;
pRst->GetFieldValue("HPYS",nHPYS);
switch(nHPYS) {
case 1:
str="黄色";
break;
case 2:
str="白色";
break;
case 3:
str="黑色";
break;
default:
str="蓝色";
}
m_ctlLIST_ZDJC.SetItemText(nItem,2,str);
pRst->GetFieldValue("WZSJ",str);
m_ctlLIST_ZDJC.SetItemText(nItem,3,str);
pRst->GetFieldValue("WZDD",str);
m_ctlLIST_ZDJC.SetItemText(nItem,4,str);
pRst->GetFieldValue("bmp",str);
str=DataPath + str;
m_ctlLIST_ZDJC.SetItemText(nItem,5,str);
pRst->GetFieldValue("HPTP",str);
str=DataPath + str;
m_ctlLIST_ZDJC.SetItemText(nItem,6,str);
pRst->GetFieldValue("XYHP",str);
CString sXYHP;
CString XYHPs;
CString sBKYY;
CString BKYYs;
XYHPs="";
BKYYs="";
if (str.GetLength()>0) {
CString tmpStr1,tmpStr2;
int iPos;
int iPos2;
tmpStr2=str;
iPos=tmpStr2.Find(";",0);
int iNum=0,iBKYY;
while (iPos+1>0) {
tmpStr1=tmpStr2.Left(iPos+1);
tmpStr2=tmpStr2.Mid(iPos+1);
iPos=tmpStr2.Find(";",0);
iPos2=tmpStr1.Find(",",0);
if (iPos2+1>0) {
sXYHP=tmpStr1.Left(iPos2);
XYHPs=XYHPs+","+sXYHP;
tmpStr1=tmpStr1.Mid(iPos2+1);
iBKYY=atoi(tmpStr1.GetBuffer(0));
sBKYY=Array_FindInBKYYList(iBKYY);
BKYYs=BKYYs+","+sBKYY;
}else{
sXYHP=tmpStr1;
iBKYY=-1;
}
}
tmpStr1=tmpStr2;
iPos2=tmpStr1.Find(",",0);
if (iPos2+1>0) {
sXYHP=tmpStr1.Left(iPos2);
XYHPs=XYHPs+","+sXYHP;
tmpStr1=tmpStr1.Mid(iPos2+1);
iBKYY=atoi(tmpStr1.GetBuffer(0));
sBKYY=Array_FindInBKYYList(iBKYY);
BKYYs=BKYYs+","+sBKYY;
}
if (XYHPs.GetLength()>0) {
XYHPs=XYHPs.Mid(1);
BKYYs=BKYYs.Mid(1);
m_ctlLIST_ZDJC.SetItemText(nItem,7,XYHPs);
m_ctlLIST_ZDJC.SetItemText(nItem,8,BKYYs);
}
}
m_ctlLIST_ZDJC.EnsureVisible(nItem,true);
m_ctlLIST_ZDJC.SetHotItem(nItem);
}
}
//解析雷达数据,定位速度起始位置
int CVideoCaptureView::FindRadarEnd(int length,int& RadarMode,int start)
{
//美国斯德克雷达
if(RadarStatus.radar==0)
{
int j=-1,k=-1,num=0;
for(int i=0;i<length;i++)
{
if(ComBuf[i]==0x0D)
{
if(num==0)
{
num++;
j=i;
}
else
{
k=i;
break;
}
}
}
if(k-j==4)
RadarStatus.mode=0;
else if(k-j==16)
RadarStatus.mode=1;
else return -1;
return k;//没找到结束标志0x0D;
}
//俄罗斯“火化雷达”
else if(RadarStatus.radar==1)
{
int j=-1,k=-1,num=0;
for(int i=start;i<length-15;i++) ///FF A1 启动
{
if (ComBuf[i]==0xFD && ComBuf[i+1]==0x8A && ComBuf[i+2]==0xFE && ComBuf[i+4] == 0xFE && ComBuf[i+6] == 0xFE)
if ((ComBuf[i+14]==0xFE && ComBuf[i+15]==0x50) || (i<length-17 && ComBuf[i+16]==0xFE && ComBuf[i+17]==0x50))
{
if(m_fInitRadar)
{
//模式
if(RadarStatus.mode!=0)
bufSend[1]=0x36;
else bufSend[1]=0x35;
RadarStatus.mode=0;
}
else
{
m_fSendDataToCom=FALSE;
KillTimer(WM_SENDRADARCTRL);
}
TRACE("雷达开始工作\n");
//雷达工作模式
return -1;
}
}
for(i=start;i<length-9;i++) //FE 3F 测速返回只值
if(ComBuf[i]==0xFD && ComBuf[i+1]==0x3F && ComBuf[i+2]==0xFE && ComBuf[i+3]==0x51)
{
if (i<length-11 && ComBuf[i+10]==0xFE && ComBuf[i+11]==0x50)
{
RadarStatus.mode=1;
//运动模式
// if(pcsDlg)
// pcsDlg->GetDlgItem(IDC_RADAR_MODE)->SetWindowText("模式B(运动模式)");
return i;
}
else if(ComBuf[i+8]==0xFE && ComBuf[i+9]==0x50)
{
RadarStatus.mode=0;//静止模式
// if(pcsDlg)
// pcsDlg->GetDlgItem(IDC_RADAR_MODE)->SetWindowText("模式A(静止模式)");
return i;
}
}
//雷达电源关闭后重起的
for(i=start;i<length-6;i++) //雷达开机 数据
if(ComBuf[i+1]==0xFE && ComBuf[i+2]==0x8A && ComBuf[i+3]==0xFE && ComBuf[i+5]==0xFE && ComBuf[i+6]==0x50)
{
m_iBufLength=0;
InitRadar();
return -1;
}
for(i=start;i<length-1;i++)
if(ComBuf[i]==0xFD)
{
switch(ComBuf[i+1])
{
case 0x35://静止模式
if(m_fInitRadar)
{
//距离
if(RadarStatus.distance>0)
bufSend[1]=0x3A;
else if(RadarStatus.distance<0)
bufSend[1]=0x3B;
else bufSend[1]=0x39;
RadarStatus.distance=1;
}
else
{
m_fSendDataToCom=FALSE;
KillTimer(WM_SENDRADARCTRL);
}
TRACE("静止方式\n");
m_iBufLength=0;
RadarStatus.mode=0;
UpdateRadarStatus();
return -1;
case 0x36://运动模式
if(m_fInitRadar)
{
//距离
if(RadarStatus.distance>0)
bufSend[1]=0x3A;
else if(RadarStatus.distance<0)
bufSend[1]=0x3B;
else bufSend[1]=0x39;
RadarStatus.distance=1;
}
else
{
m_fSendDataToCom=FALSE;
KillTimer(WM_SENDRADARCTRL);
}
TRACE("动态方式\n");
m_iBufLength=0;
RadarStatus.mode=1;
UpdateRadarStatus();
return -1;
case 0x39://平均距离
if(m_fInitRadar)
{
//位置
if(RadarStatus.position!=0)
bufSend[1]=0x53;
else bufSend[1]=0x43;
RadarStatus.position=1;
}
else
{
m_fSendDataToCom=FALSE;
KillTimer(WM_SENDRADARCTRL);
}
TRACE("距离平均值\n");
m_iBufLength=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -