From bd4858888ae9f2e3c2fb6d1844f73ca7792957c1 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Wed, 29 May 2013 18:08:32 +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 | 2 + .../UsbUtility/UsbUtil/Videocard_SV2000E.cpp | 59 ++++++++++++++---- .../UsbUtility/UsbUtil/Videocard_SV2000E.h | 9 +++ .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 5 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 207360 -> 214528 bytes 5 files changed, 62 insertions(+), 13 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 a84ee13..63beaa3 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 @@ -395,6 +395,8 @@ BEGIN 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 END IDD_SO7_UTIL_SETUP_CONFIGURE DIALOGEX 0, 0, 476, 451 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 91a639c..cf6900d 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 @@ -17,6 +17,8 @@ static const long HueDefault = 5000; static const long SharpnessDefault = 4; static BYTE g_DataBuffer[640*480*2]; +static BYTE g_DataBuffer_NAV[640*480*2]; + // CVideocard_SV2000E dialog IMPLEMENT_DYNAMIC(CVideocard_SV2000E, CDialog) @@ -52,6 +54,7 @@ BEGIN_MESSAGE_MAP(CVideocard_SV2000E, CDialog) ON_BN_CLICKED(IDOK, &CVideocard_SV2000E::OnBnClickedOk) ON_BN_CLICKED(IDC_RADIO_SV2000E_CHANNEL1, &CVideocard_SV2000E::OnBnClickedRadioSv2000eChannel1) ON_BN_CLICKED(IDC_RADIO_SV2000E_CHANNEL2, &CVideocard_SV2000E::OnBnClickedRadioSv2000eChannel2) + ON_CBN_SELCHANGE(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER, &CVideocard_SV2000E::OnCbnSelchangeComboSv2000eSelectDevNumber) END_MESSAGE_MAP() @@ -82,8 +85,9 @@ BOOL CVideocard_SV2000E::OnInitDialog() } ((CButton *)GetDlgItem(IDC_RADIO_SV2000E_RGB))->SetCheck(TRUE); ((CButton *)GetDlgItem(IDC_RADIO_SV2000E_GRAY))->SetCheck(FALSE); - + bInitSdk=123; m_Channel=1; + m_OpenDevNo=0; ((CButton *)GetDlgItem(IDC_RADIO_SV2000E_CHANNEL1))->SetCheck(TRUE); ((CButton *)GetDlgItem(IDC_RADIO_SV2000E_CHANNEL2))->SetCheck(FALSE); @@ -92,6 +96,7 @@ BOOL CVideocard_SV2000E::OnInitDialog() //=================================================== void CVideocard_SV2000E::OnBnClickedOk() { + bInitSdk=DXInitialize(); LoadVideocard(); SetTimer(1,50,NULL); GetDlgItem(IDOK)->EnableWindow(false); @@ -101,6 +106,7 @@ void CVideocard_SV2000E::OnBnClickedCancel() { KillTimer(1); UnloadVideocard(); + DXUninitialize(); CDialog::OnCancel(); } //=================================================== @@ -130,7 +136,7 @@ void CVideocard_SV2000E::OnBnClickedCheckSv2000eMirrorVertically() //=================================================== void CVideocard_SV2000E::OnBnClickedButtonSv2000eSavefile() { - CString CTmpString; + CString CTmpString; CString PathName; CString path_and_fileName; @@ -159,11 +165,16 @@ void CVideocard_SV2000E::OnBnClickedRadioSv2000eChannel2() m_Channel=2; LoadVideocard(); } +//=================================================== +void CVideocard_SV2000E::OnCbnSelchangeComboSv2000eSelectDevNumber() +{ + m_OpenDevNo=((CComboBox *)GetDlgItem(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER))->GetCurSel(); + CloseDevice(); + OpenDevice(m_OpenDevNo); +} //======================================= BOOL CVideocard_SV2000E::LoadVideocard() { - unsigned int bInitSdk=DXInitialize(); - DEVICE_TAG devTags[100]; unsigned num = 100; DXEnumVideoCodecs(devTags, num); @@ -173,13 +184,29 @@ BOOL CVideocard_SV2000E::LoadVideocard() //DXEnumSoundDevices(devTags, num); m_nDevNum = DXGetDeviceCount(); - m_device= DXOpenDevice(0, NULL); + CString csTmp=_T(""); + ((CComboBox *)GetDlgItem(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER))->ResetContent(); + for(int i=0;iInsertString(i,csTmp); + } + ((CComboBox *)GetDlgItem(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER))->SetCurSel(0); + m_OpenDevNo=0; + OpenDevice(m_OpenDevNo); if((bInitSdk!=0)||(m_nDevNum<1)||(m_device==NULL)) { ::AfxMessageBox(_T("SV2000E卡初始化失败!")); return FALSE; } + return TRUE; +} +//======================================= +void CVideocard_SV2000E::OpenDevice(unsigned int _DevNo) +{ + m_device= DXOpenDevice(_DevNo, NULL); + unsigned standard(VideoStandard_PAL_D); unsigned colorspace(cs_yuy2);//cs_rgb24 unsigned width(640);//640 @@ -203,11 +230,12 @@ BOOL CVideocard_SV2000E::LoadVideocard() m_status=DXSetRawVideoCallback(m_device, SVAPrcVidCapCallBack, this); m_status=DXStartRawVideoCallback(m_device,SVAPrcVidCapCallBack,this); - return true; - - return TRUE; -} - +}; +//======================================= +void CVideocard_SV2000E::CloseDevice() +{ + UnloadVideocard(); +}; //======================================= BOOL CVideocard_SV2000E::UnloadVideocard() { @@ -217,7 +245,6 @@ BOOL CVideocard_SV2000E::UnloadVideocard() m_status=DXSetRawVideoCallback(m_device, NULL, NULL); m_status=DXDeviceStop(m_device); DXCloseDevice(m_device); - DXUninitialize(); } return TRUE; } @@ -475,6 +502,16 @@ unsigned CALLBACK SVAPrcVidCapCallBack(unsigned char* buffer, unsigned colorSpac memcpy(g_DataBuffer,(BYTE*)buffer,width*height*2); return 0; } +//==================================SV2000E===================================== +unsigned CALLBACK SVAPrcVidCapCallBackNav(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context) +{ + UNREFERENCED_PARAMETER(colorSpace); + UNREFERENCED_PARAMETER(context); + UNREFERENCED_PARAMETER(bytesWidth); + memcpy(g_DataBuffer_NAV,(BYTE*)buffer,width*height*2); + return 0; +}; + 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 d4b6aae..ba59aa0 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 @@ -3,6 +3,8 @@ // CVideocard_SV2000E dialog unsigned CALLBACK SVAPrcVidCapCallBack(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context); +unsigned CALLBACK SVAPrcVidCapCallBackNav(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context); + class CVideocard_SV2000E : public CDialog { DECLARE_DYNAMIC(CVideocard_SV2000E) @@ -30,6 +32,8 @@ public: protected: unsigned int m_status; device_handle m_device; + device_handle m_device_Nav; + int m_nDevNum; DWORD m_dwCard; Image_Buffer m_ImageBuffer; @@ -38,12 +42,17 @@ protected: BOOL m_bSaveFile; CString m_SaveFile; unsigned int m_Channel; + unsigned int bInitSdk; + unsigned int m_OpenDevNo; public: BOOL LoadVideocard(); BOOL UnloadVideocard(); + void OpenDevice(unsigned int _DevNo); + void CloseDevice(); void ConvertVideoSubType(const Image_Buffer& _ImageBuffer, BYTE *pSrcData,ConvertColorType _type,BOOL _bMirror); BOOL SaveBitmapToFile(const CBitmap& bitmap, CString lpFileName); afx_msg void OnBnClickedRadioSv2000eChannel1(); afx_msg void OnBnClickedRadioSv2000eChannel2(); + afx_msg void OnCbnSelchangeComboSv2000eSelectDevNumber(); }; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index d33410b..332fda5 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -665,9 +665,10 @@ #define IDC_RADIO_TC4000_CHANNEL2 1567 #define IDC_RADIO_TC4000_CHANNEL3 1568 #define IDC_RADIO_TC4000_CHANNEL4 1569 -#define IDC_RADIO1 1570 #define IDC_RADIO_SV2000E_CHANNEL1 1570 #define IDC_RADIO_SV2000E_CHANNEL2 1571 +#define IDC_COMBO_SV200E 1573 +#define IDC_COMBO_SV2000E_SELECT_DEV_NUMBER 1573 // Next default values for new objects // @@ -675,7 +676,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 166 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1572 +#define _APS_NEXT_CONTROL_VALUE 1574 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif 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 44cbfda2340d155592dac313768d1ed5219830f2..fc6fbf0f40ba934a1820314b5ff52c6c33c35d5e 100644 GIT binary patch delta 12783 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 delta 7027 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