From 19ef8afe7032b9988f0ad43c53a5ec75af6c04a6 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 2 Jun 2020 14:10:20 +1000 Subject: [PATCH] Updated controller to use HIDAPI instead of LIBUSB & added code to pass back info from the USB device --- .../CMMP750Controller.cpp | 33 ++++++--------- .../CMMP750Controller.h | 20 ++++----- .../CoolerMasterControllerDetect.cpp | 41 +++++++++++-------- .../RGBController_CMMP750Controller.cpp | 2 +- 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/Controllers/CoolerMasterController/CMMP750Controller.cpp b/Controllers/CoolerMasterController/CMMP750Controller.cpp index 50d3d95f..049c2b7f 100644 --- a/Controllers/CoolerMasterController/CMMP750Controller.cpp +++ b/Controllers/CoolerMasterController/CMMP750Controller.cpp @@ -8,24 +8,21 @@ \*-------------------------------------------------------------------*/ #include "CMMP750Controller.h" -#include -#include -#include -CMMP750Controller::CMMP750Controller(libusb_device_handle* dev_handle, unsigned int _inAddr, unsigned int _outAddr, int _interface) +CMMP750Controller::CMMP750Controller(hid_device* dev_handle, wchar_t *_vendor, wchar_t *_device_name, char *_path) { + int tmp_size = wcslen(_vendor); + dev = dev_handle; - inAddr = _inAddr; - outAddr = _outAddr; - interface = _interface; - libusb_device* device = libusb_get_device(dev); - int bus = libusb_get_bus_number(device); - int bus_addr = libusb_get_device_address(device); - int port = libusb_get_port_number(device); - location = "Bus: " + std::to_string(bus) + " Addr: " + std::to_string(bus_addr) + " Port: " + std::to_string(port); + for (int i=0; ( i #include -#include +#include #pragma once #define CM_COLOUR_MODE_DATA_SIZE (sizeof(colour_mode_data) / sizeof(colour_mode_data[0])) #define CM_INTERRUPT_TIMEOUT 250 +#define CM_DEVICE_NAME_SIZE (sizeof(device_name) / sizeof(device_name[ 0 ])) +#define CM_SERIAL_SIZE (sizeof(serial) / sizeof(serial[ 0 ])) +#define HID_MAX_STR 255 enum { @@ -53,10 +56,10 @@ static unsigned char colour_mode_data[][6] = static unsigned char speed_mode_data[][9] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },/* Static */ - { 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0, 0xFF },/* Blinking */ - { 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0, 0xFF },/* Breathing */ - { 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0, 0xFF },/* Colour Cycle */ - { 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0, 0xFF } /* Colour Breath */ + { 0xFF, 0xE0, 0xC0, 0xA0, 0x80, 0x60, 0x40, 0x20, 0x00 },/* Blinking */ + { 0xFF, 0xE0, 0xC0, 0xA0, 0x80, 0x60, 0x40, 0x20, 0x00 },/* Breathing */ + { 0xFF, 0xE0, 0xC0, 0xA0, 0x80, 0x60, 0x40, 0x20, 0x00 },/* Colour Cycle */ + { 0xFF, 0xE0, 0xC0, 0xA0, 0x80, 0x60, 0x40, 0x20, 0x00 } /* Colour Breath */ }; enum @@ -75,7 +78,7 @@ enum class CMMP750Controller { public: - CMMP750Controller(libusb_device_handle *dev_handle, unsigned int _inAddr, unsigned int _outAddr, int _interface); + CMMP750Controller(hid_device* dev_handle, wchar_t *_vendor, wchar_t *_device_name, char *_path); ~CMMP750Controller(); char* GetDeviceName(); @@ -89,10 +92,7 @@ private: char device_name[32]; char serial[32]; std::string location; - libusb_device_handle* dev; - unsigned char inAddr; - unsigned char outAddr; - int interface; + hid_device* dev; unsigned char current_mode; unsigned char current_speed; diff --git a/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp b/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp index 5814bc8b..32dcff2e 100644 --- a/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp +++ b/Controllers/CoolerMasterController/CoolerMasterControllerDetect.cpp @@ -1,8 +1,7 @@ #include "CMMP750Controller.h" #include "RGBController.h" #include "RGBController_CMMP750Controller.h" -#include -#include +#include #define COOLERMASTER_VID 0x2516 @@ -31,27 +30,37 @@ static const unsigned int cm_pids[][4] = void DetectCoolerMasterControllers(std::vector& rgb_controllers) { - libusb_context * context; - libusb_init(&context); + hid_device_info* info; + hid_device* dev = NULL; for(int cm_pid_idx = 0; cm_pid_idx < COOLERMASTER_NUM_DEVICES; cm_pid_idx++) { //Look for the passed in cm_pids - libusb_device_handle * dev = libusb_open_device_with_vid_pid(context, COOLERMASTER_VID, cm_pids[cm_pid_idx][CM_PID]); + hid_init(); + info = hid_enumerate(0x0, 0x0); + + while(info) + { + if((info->vendor_id == COOLERMASTER_VID) + &&(info->product_id == cm_pids[cm_pid_idx][CM_PID]) + &&(info->interface_number == cm_pids[cm_pid_idx][CM_INTERFACE])) + { + dev = hid_open_path(info->path); + break; + } + else + { + info = info->next; + } + } if(dev) { - int status = libusb_detach_kernel_driver(dev, cm_pids[cm_pid_idx][CM_INTERFACE]); - status = libusb_claim_interface(dev, cm_pids[cm_pid_idx][CM_INTERFACE]); - - if(status == 0) - { - // Success: Device has been claimed - CMMP750Controller* controller = new CMMP750Controller(dev, cm_pids[cm_pid_idx][CM_INADDR], cm_pids[cm_pid_idx][CM_OUTADDR], cm_pids[cm_pid_idx][CM_INTERFACE]); - RGBController_CMMP750Controller* rgb_controller = new RGBController_CMMP750Controller(controller); - rgb_controllers.push_back(rgb_controller); - } + CMMP750Controller* controller = new CMMP750Controller(dev, info->manufacturer_string, info->product_string, info->path); + RGBController_CMMP750Controller* rgb_controller = new RGBController_CMMP750Controller(controller); + rgb_controllers.push_back(rgb_controller); } - } + hid_free_enumeration(info); + } } diff --git a/RGBController/RGBController_CMMP750Controller.cpp b/RGBController/RGBController_CMMP750Controller.cpp index a20dacfc..2cc26d50 100644 --- a/RGBController/RGBController_CMMP750Controller.cpp +++ b/RGBController/RGBController_CMMP750Controller.cpp @@ -15,7 +15,7 @@ RGBController_CMMP750Controller::RGBController_CMMP750Controller(CMMP750Controll name = cmmp750->GetDeviceName(); type = DEVICE_TYPE_MOUSEMAT; - description = "Cooler Master Mousepad 750"; + description = cmmp750->GetDeviceName(); version = "1.0"; serial = ""; location = cmmp750->GetLocation();