From 9ef689299f6870d650316a8d7607719264f314aa Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Wed, 29 May 2013 20:07:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9ESV200E=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=8D=A1=E5=A4=9A=E8=AE=BE=E5=A4=87=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 28 ++-- .../UsbUtility/UsbUtil/Videocard_SV2000E.cpp | 146 ++++++++++++++---- .../UsbUtility/UsbUtil/Videocard_SV2000E.h | 7 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 214528 -> 212480 bytes 4 files changed, 132 insertions(+), 49 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index 63beaa3..d84739a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc @@ -381,22 +381,22 @@ BEGIN CONTROL "",IDC_STATIC_SDK3000_PICTURE,"Static",SS_BLACKFRAME | NOT WS_VISIBLE,228,296,68,16 END -IDD_SO7_VIDEOCARD_SV2000E DIALOGEX 0, 0, 488, 316 +IDD_SO7_VIDEOCARD_SV2000E DIALOGEX 0, 0, 910, 317 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "SV2000视频卡" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CONTROL "彩色图像",IDC_RADIO_SV2000E_RGB,"Button",BS_AUTORADIOBUTTON | WS_GROUP,435,37,48,10 - CONTROL "黑白图像",IDC_RADIO_SV2000E_GRAY,"Button",BS_AUTORADIOBUTTON,435,58,48,10 - CONTROL "垂直镜像",IDC_CHECK_SV2000E_MIRROR_VERTICALLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,435,85,48,10 - PUSHBUTTON "保存图片",IDC_BUTTON_SV2000E_SAVEFILE,435,115,50,14 - DEFPUSHBUTTON "开始",IDOK,372,298,50,14 - PUSHBUTTON "退出",IDCANCEL,435,298,50,14 - GROUPBOX "通道选择",IDC_STATIC,439,140,42,61 - CONTROL "1",IDC_RADIO_SV2000E_CHANNEL1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,450,160,23,10 - CONTROL "2",IDC_RADIO_SV2000E_CHANNEL2,"Button",BS_AUTORADIOBUTTON,450,182,26,10 - GROUPBOX "设备选择",IDC_STATIC,438,207,42,61 - COMBOBOX IDC_COMBO_SV2000E_SELECT_DEV_NUMBER,443,222,31,35,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CONTROL "彩色图像",IDC_RADIO_SV2000E_RGB,"Button",BS_AUTORADIOBUTTON | WS_GROUP,861,38,48,10 + CONTROL "黑白图像",IDC_RADIO_SV2000E_GRAY,"Button",BS_AUTORADIOBUTTON,861,59,48,10 + CONTROL "垂直镜像",IDC_CHECK_SV2000E_MIRROR_VERTICALLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,861,86,48,10 + PUSHBUTTON "保存图片",IDC_BUTTON_SV2000E_SAVEFILE,859,116,50,14 + DEFPUSHBUTTON "开始",IDOK,793,300,50,14 + PUSHBUTTON "退出",IDCANCEL,854,300,50,14 + GROUPBOX "通道选择",IDC_STATIC,864,142,42,61 + CONTROL "1",IDC_RADIO_SV2000E_CHANNEL1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,876,161,23,10 + CONTROL "2",IDC_RADIO_SV2000E_CHANNEL2,"Button",BS_AUTORADIOBUTTON,876,183,26,10 + GROUPBOX "设备选择",IDC_STATIC,863,208,42,61 + COMBOBOX IDC_COMBO_SV2000E_SELECT_DEV_NUMBER,868,223,31,35,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP END IDD_SO7_UTIL_SETUP_CONFIGURE DIALOGEX 0, 0, 476, 451 @@ -597,8 +597,10 @@ BEGIN IDD_SO7_VIDEOCARD_SV2000E, DIALOG BEGIN LEFTMARGIN, 1 - RIGHTMARGIN, 485 + RIGHTMARGIN, 909 VERTGUIDE, 435 + VERTGUIDE, 853 + BOTTOMMARGIN, 314 END IDD_SO7_UTIL_SETUP_CONFIGURE, DIALOG diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.cpp index cf6900d..4eb6ddf 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.cpp @@ -105,7 +105,8 @@ void CVideocard_SV2000E::OnBnClickedOk() void CVideocard_SV2000E::OnBnClickedCancel() { KillTimer(1); - UnloadVideocard(); + UnloadVideocard(m_device); + UnloadVideocard(m_device_Nav); DXUninitialize(); CDialog::OnCancel(); } @@ -153,24 +154,66 @@ void CVideocard_SV2000E::OnBnClickedButtonSv2000eSavefile() } //=================================================== void CVideocard_SV2000E::OnBnClickedRadioSv2000eChannel1() -{ - UnloadVideocard(); +{ m_Channel=1; - LoadVideocard(); + if (m_OpenDevNo==0) + { + CloseDevice(m_device); + CloseDevice(m_device_Nav); + OpenDevice(0,m_device); + } + else if (m_OpenDevNo==1) + { + CloseDevice(m_device); + CloseDevice(m_device_Nav); + OpenDevice(1,m_device_Nav); + } + else + { + UnloadVideocard(m_device); + UnloadVideocard(m_device_Nav); + LoadVideocard(); + } } //=================================================== void CVideocard_SV2000E::OnBnClickedRadioSv2000eChannel2() { - UnloadVideocard(); m_Channel=2; - LoadVideocard(); + if (m_OpenDevNo==0) + { + CloseDevice(m_device); + CloseDevice(m_device_Nav); + OpenDevice(0,m_device); + } + else if (m_OpenDevNo==1) + { + CloseDevice(m_device); + CloseDevice(m_device_Nav); + OpenDevice(1,m_device_Nav); + } + else + { + UnloadVideocard(m_device); + UnloadVideocard(m_device_Nav); + LoadVideocard(); + } } //=================================================== void CVideocard_SV2000E::OnCbnSelchangeComboSv2000eSelectDevNumber() { m_OpenDevNo=((CComboBox *)GetDlgItem(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER))->GetCurSel(); - CloseDevice(); - OpenDevice(m_OpenDevNo); + if (m_OpenDevNo==2)//both + { + CloseDevice(m_device); + OpenDevice(0,m_device); + OpenDevice(1,m_device_Nav); + } + else + { + CloseDevice(m_device); + CloseDevice(m_device_Nav); + OpenDevice(m_OpenDevNo,m_device); + } } //======================================= BOOL CVideocard_SV2000E::LoadVideocard() @@ -191,9 +234,13 @@ BOOL CVideocard_SV2000E::LoadVideocard() csTmp.Format(_T("%d"),i+1); ((CComboBox *)GetDlgItem(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER))->InsertString(i,csTmp); } + if (m_nDevNum>1) + { + ((CComboBox *)GetDlgItem(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER))->InsertString(m_nDevNum,_T("Both")); + } ((CComboBox *)GetDlgItem(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER))->SetCurSel(0); m_OpenDevNo=0; - OpenDevice(m_OpenDevNo); + OpenDevice(m_OpenDevNo,m_device); if((bInitSdk!=0)||(m_nDevNum<1)||(m_device==NULL)) { ::AfxMessageBox(_T("SV2000E卡初始化失败!")); @@ -203,48 +250,56 @@ BOOL CVideocard_SV2000E::LoadVideocard() return TRUE; } //======================================= -void CVideocard_SV2000E::OpenDevice(unsigned int _DevNo) +void CVideocard_SV2000E::OpenDevice(unsigned int _DevNo,device_handle &_OpenedDevice) { - m_device= DXOpenDevice(_DevNo, NULL); + _OpenedDevice= DXOpenDevice(_DevNo, NULL); unsigned standard(VideoStandard_PAL_D); unsigned colorspace(cs_yuy2);//cs_rgb24 unsigned width(640);//640 unsigned height(480);//480 float framerate(25); - m_status=DXSetVideoPara(m_device,standard,colorspace,width,height,framerate); + m_status=DXSetVideoPara(_OpenedDevice,standard,colorspace,width,height,framerate); - DXDeviceRun(m_device); + DXDeviceRun(_OpenedDevice); m_dwCard=2; - m_status=DXSetVideoSource(m_device, m_Channel); + m_status=DXSetVideoSource(_OpenedDevice, m_Channel); //==============================消除隔行========================================= - m_status=DXSetVideoPara(m_device,standard,colorspace,width,height,framerate); + m_status=DXSetVideoPara(_OpenedDevice,standard,colorspace,width,height,framerate); //================================================================================ - m_status=DXSetDisplayPara( m_device, BRIGHTNESS, 5000,2); - m_status=DXSetDisplayPara( m_device, SATURATION, 5000,2); - m_status=DXSetDisplayPara( m_device, CONTRAST, 5000,2); - m_status=DXSetDisplayPara( m_device, HUE, 5000,2); - m_status=DXSetDisplayPara( m_device, SHARPNESS, 4,2); + m_status=DXSetDisplayPara( _OpenedDevice, BRIGHTNESS, 5000,2); + m_status=DXSetDisplayPara( _OpenedDevice, SATURATION, 5000,2); + m_status=DXSetDisplayPara( _OpenedDevice, CONTRAST, 5000,2); + m_status=DXSetDisplayPara( _OpenedDevice, HUE, 5000,2); + m_status=DXSetDisplayPara( _OpenedDevice, SHARPNESS, 4,2); + if (_DevNo==0) + { + m_status=DXSetRawVideoCallback(_OpenedDevice, SVAPrcVidCapCallBack, this); + m_status=DXStartRawVideoCallback(_OpenedDevice,SVAPrcVidCapCallBack,this); + } + else + { + m_status=DXSetRawVideoCallback(_OpenedDevice, SVAPrcVidCapCallBackNav, this); + m_status=DXStartRawVideoCallback(_OpenedDevice,SVAPrcVidCapCallBackNav,this); + } - m_status=DXSetRawVideoCallback(m_device, SVAPrcVidCapCallBack, this); - m_status=DXStartRawVideoCallback(m_device,SVAPrcVidCapCallBack,this); }; //======================================= -void CVideocard_SV2000E::CloseDevice() +void CVideocard_SV2000E::CloseDevice(device_handle _Device) { - UnloadVideocard(); + UnloadVideocard(_Device); }; //======================================= -BOOL CVideocard_SV2000E::UnloadVideocard() +BOOL CVideocard_SV2000E::UnloadVideocard(device_handle _Device) { - if (m_device) + if (_Device) { - m_status=DXStopRawVideoCallback(m_device); - m_status=DXSetRawVideoCallback(m_device, NULL, NULL); - m_status=DXDeviceStop(m_device); - DXCloseDevice(m_device); + m_status=DXStopRawVideoCallback(_Device); + m_status=DXSetRawVideoCallback(_Device, NULL, NULL); + m_status=DXDeviceStop(_Device); + DXCloseDevice(_Device); } return TRUE; } @@ -437,7 +492,17 @@ void CVideocard_SV2000E::OnPaint() int nMode; CDC* pMemDC = new CDC; CBitmap pBitBmp; - ConvertVideoSubType(m_ImageBuffer,g_DataBuffer,m_ConvertColorType,m_bMirror); + CBitmap pBitBmpNav; + if (m_OpenDevNo==1) + { + ConvertVideoSubType(m_ImageBuffer,g_DataBuffer_NAV,m_ConvertColorType,m_bMirror); + } + else + { + ConvertVideoSubType(m_ImageBuffer,g_DataBuffer,m_ConvertColorType,m_bMirror); + } + + BYTE *pData = (BYTE *)m_ImageBuffer.ScanLine; BITMAPINFO bmpInfo; bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); @@ -454,6 +519,13 @@ void CVideocard_SV2000E::OnPaint() pBitBmp.CreateCompatibleBitmap(dc,640,480); SetDIBits(dc->m_hDC,pBitBmp,0,480,pData,&bmpInfo,DIB_RGB_COLORS); + if (m_OpenDevNo==2)//both + { + ConvertVideoSubType(m_ImageBuffer_Nav,g_DataBuffer_NAV,m_ConvertColorType,m_bMirror); + BYTE *pDataNav = (BYTE *)m_ImageBuffer_Nav.ScanLine; + pBitBmpNav.CreateCompatibleBitmap(dc,640,480); + SetDIBits(dc->m_hDC,pBitBmpNav,0,480,pDataNav,&bmpInfo,DIB_RGB_COLORS); + } if (m_bSaveFile) { SaveBitmapToFile(pBitBmp,m_SaveFile); @@ -469,8 +541,16 @@ void CVideocard_SV2000E::OnPaint() } CBitmap* pOldBitmap = pMemDC->SelectObject(&pBitBmp); nMode = pMemDC->SetBkMode(TRANSPARENT); - - dc->BitBlt(0, 0, 640, 480, pMemDC,0,0, SRCCOPY); + if (m_OpenDevNo==2)//both + { + dc->BitBlt(0, 0, 640, 480, pMemDC,0,0, SRCCOPY); + pMemDC->SelectObject(&pBitBmpNav); + dc->BitBlt(645, 0, 640, 480, pMemDC,0,0, SRCCOPY); + } + else + { + dc->BitBlt(0, 0, 640, 480, pMemDC,0,0, SRCCOPY); + } pMemDC->SetBkMode(nMode); pMemDC->SelectObject(pOldBitmap); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.h index ba59aa0..28edb8a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.h @@ -37,6 +37,7 @@ protected: int m_nDevNum; DWORD m_dwCard; Image_Buffer m_ImageBuffer; + Image_Buffer m_ImageBuffer_Nav; ConvertColorType m_ConvertColorType; BOOL m_bMirror; BOOL m_bSaveFile; @@ -46,9 +47,9 @@ protected: unsigned int m_OpenDevNo; public: BOOL LoadVideocard(); - BOOL UnloadVideocard(); - void OpenDevice(unsigned int _DevNo); - void CloseDevice(); + BOOL UnloadVideocard(device_handle _Device); + void OpenDevice(unsigned int _DevNo,device_handle &_OpenedDevice); + void CloseDevice(device_handle _Device); void ConvertVideoSubType(const Image_Buffer& _ImageBuffer, BYTE *pSrcData,ConvertColorType _type,BOOL _bMirror); BOOL SaveBitmapToFile(const CBitmap& bitmap, CString lpFileName); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index fc6fbf0f40ba934a1820314b5ff52c6c33c35d5e..bf47e022e32c32bedb3716310ee1612e84d2495a 100644 GIT binary patch delta 5709 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 B!yW(t delta 6033 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