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

📄 videocaptureview.cpp

📁 电子监控的网络编程实例
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -