From 492152d50608799dbe502a25d29b31b7d43e368a Mon Sep 17 00:00:00 2001 From: zedamota Date: Fri, 4 Mar 2011 19:26:11 +0000 Subject: [PATCH] OP GCS/HID - 3rd try, sorry guys git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2963 ebee16cc-31ac-478f-84a7-5cbb03baadba --- .../src/plugins/rawhid/usbmonitor.h | 4 +- .../src/plugins/rawhid/usbmonitor_win.cpp | 73 ++++++++++++------- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/rawhid/usbmonitor.h b/ground/openpilotgcs/src/plugins/rawhid/usbmonitor.h index e332122c3..503410dc2 100644 --- a/ground/openpilotgcs/src/plugins/rawhid/usbmonitor.h +++ b/ground/openpilotgcs/src/plugins/rawhid/usbmonitor.h @@ -39,6 +39,7 @@ struct USBPortInfo { QString serialNumber; // As a string as it can be anything, really... QString manufacturer; QString product; + QString devicePath; //only has meaning on windows int UsagePage; int vendorID; ///< Vendor ID. int productID; ///< Product ID @@ -144,6 +145,7 @@ private: USBPortInfo makePortInfo(struct udev_device *dev); #elif defined (Q_OS_WIN32) GUID guid_hid; + QList knowndevices; void setUpNotifications(); /*! * Get specific property from registry. @@ -155,7 +157,7 @@ private: * \return property string. */ static QString getDeviceProperty(HDEVINFO devInfo, PSP_DEVINFO_DATA devData, DWORD property); - static bool infoFromHandle(const GUID & guid,USBPortInfo & info,HDEVINFO & devInfo); + static int infoFromHandle(const GUID & guid,USBPortInfo & info,HDEVINFO & devInfo,DWORD & index); static void enumerateDevicesWin( const GUID & guidDev, QList* infoList ); bool matchAndDispatchChangedDevice(const QString & deviceID, const GUID & guid, WPARAM wParam); #ifdef QT_GUI_LIB diff --git a/ground/openpilotgcs/src/plugins/rawhid/usbmonitor_win.cpp b/ground/openpilotgcs/src/plugins/rawhid/usbmonitor_win.cpp index 1b472e1f0..320f0db6a 100644 --- a/ground/openpilotgcs/src/plugins/rawhid/usbmonitor_win.cpp +++ b/ground/openpilotgcs/src/plugins/rawhid/usbmonitor_win.cpp @@ -154,7 +154,7 @@ bool USBMonitor::matchAndDispatchChangedDevice(const QString & deviceID, const G { SP_DEVINFO_DATA spDevInfoData; spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); - for(int i=0; SetupDiEnumDeviceInfo(devInfo, i, &spDevInfoData); i++) + for(DWORD i=0; SetupDiEnumDeviceInfo(devInfo, i, &spDevInfoData); i++) { DWORD nSize=0 ; TCHAR buf[MAX_PATH]; @@ -162,17 +162,32 @@ bool USBMonitor::matchAndDispatchChangedDevice(const QString & deviceID, const G deviceID.contains(TCHARToQString(buf))) // we found a match { USBPortInfo info; - - /*rv = true; - USBPortInfo info; - info.productID = info.vendorID = 0; - getDeviceDetailsWin( &info, devInfo, &spDevInfoData, wParam );*/ - infoFromHandle(guid,info,devInfo); - + info.devicePath=deviceID; if( wParam == DBT_DEVICEARRIVAL ) + { + if(infoFromHandle(guid,info,devInfo,i)==0) + break; + knowndevices.append(info); emit deviceDiscovered(info); + break; + + } else if( wParam == DBT_DEVICEREMOVECOMPLETE ) + { + for(int x=0;x USBMonitor::availableDevices() enumerateDevicesWin(guid_hid, &ports); return ports; } + void USBMonitor::enumerateDevicesWin( const GUID & guid, QList* infoList ) { HDEVINFO devInfo; @@ -211,41 +227,46 @@ void USBMonitor::enumerateDevicesWin( const GUID & guid, QList* inf SP_DEVINFO_DATA devInfoData; devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); - for(int i = 0; SetupDiEnumDeviceInfo(devInfo, i, &devInfoData); i++) + for(DWORD i = 0; SetupDiEnumDeviceInfo(devInfo, i, &devInfoData); i++) { - if(infoFromHandle(guid,info,devInfo)) + if(infoFromHandle(guid,info,devInfo,i)!=0) infoList->append(info); } + SetupDiDestroyDeviceInfoList(devInfo); } } -bool USBMonitor::infoFromHandle(const GUID & guid,USBPortInfo & info,HDEVINFO & devInfo) + +int USBMonitor::infoFromHandle(const GUID & guid,USBPortInfo & info,HDEVINFO & devInfo,DWORD & index) { + //qDebug()<<"index0="<DevicePath); free(details); - return false; + return 2; } - + //qDebug()<<"index4="<DevicePath).toUpper().replace("#", "\\"); attrib.Size = sizeof(HIDD_ATTRIBUTES); ret = HidD_GetAttributes(h, &attrib); info.vendorID=attrib.VendorID; @@ -278,15 +299,16 @@ bool USBMonitor::infoFromHandle(const GUID & guid,USBPortInfo & info,HDEVINFO & if (!ret || !HidD_GetPreparsedData(h, &hid_data)) { CloseHandle(h); - return false; + return 2; } - + //qDebug()<<"index5="<