Changed detector to allow for usage / usage page detection

* Small correction to packet bytes in CMARGBcontroller.h to allow packet
to send 0x00 at first byte
* Rearranged modes in RGBController_CMARGBController.cpp to have single
colour modes first
This commit is contained in:
Chris 2020-11-01 21:03:25 +11:00 committed by Adam Honse
parent 547a35307e
commit 154f5afa44
4 changed files with 48 additions and 31 deletions

View file

@ -153,9 +153,16 @@ void CMARGBController::SendUpdate()
buffer[CM_ARGB_FUNCTION_BYTE] = boolPassthru ? 0x02 : 0x01;
hid_write(dev, buffer, buffer_size);
hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT);
//hid_read_timeout(dev, buffer, buffer_size, CM_ARGB_INTERRUPT_TIMEOUT);
if ( boolARGB_header & !boolPassthru )
if ( boolPassthru )
{
//If setting pass thru mode send the init packet again
hid_write(dev, buffer, buffer_size);
hid_write(dev, buffer, buffer_size);
hid_write(dev, buffer, buffer_size);
}
else if ( boolARGB_header )
{
buffer[CM_ARGB_COMMAND_BYTE] = 0x0b; //ARGB sends 0x0b (1011) RGB sends 0x04 (0100)
buffer[CM_ARGB_FUNCTION_BYTE] = (false) ? 0x01 : 0x02; //This controls custom mode TODO

View file

@ -25,18 +25,17 @@
#define CM_ARGB_HEADER_DATA_SIZE (sizeof(argb_header_data) / sizeof(argb_headers) )
#define CM_ARGB_INTERRUPT_TIMEOUT 250
#define CM_ARGB_DEVICE_NAME_SIZE (sizeof(device_name) / sizeof(device_name[ 0 ]))
//#define CM_ARGB_SERIAL_SIZE (sizeof(serial) / sizeof(serial[ 0 ]))
#define HID_MAX_STR 255
enum
{
CM_ARGB_REPORT_BYTE = 0,
CM_ARGB_COMMAND_BYTE = 1,
CM_ARGB_FUNCTION_BYTE = 2,
CM_ARGB_ZONE_BYTE = 3,
CM_ARGB_MODE_BYTE = 4,
CM_ARGB_COLOUR_INDEX_BYTE = 5,
CM_ARGB_SPEED_BYTE = 6
CM_ARGB_REPORT_BYTE = 1,
CM_ARGB_COMMAND_BYTE = 2,
CM_ARGB_FUNCTION_BYTE = 3,
CM_ARGB_ZONE_BYTE = 4,
CM_ARGB_MODE_BYTE = 5,
CM_ARGB_COLOUR_INDEX_BYTE = 6,
CM_ARGB_SPEED_BYTE = 7
};
struct argb_headers

View file

@ -14,17 +14,20 @@
#define COOLERMASTER_NUM_DEVICES (sizeof(cm_pids) / sizeof(cm_pids[ 0 ]))
enum
struct coolermaster_device
{
CM_PID = 0,
CM_INTERFACE = 1
unsigned int product_id;
unsigned short interface;
unsigned int usage_page;
unsigned int usage;
device_type type;
};
static const unsigned int cm_pids[][4] =
{ // PID, Interface Type
{ COOLERMASTER_MP750_XL_PID, 0x00, DEVICE_TYPE_MOUSEMAT }, //Coolermaster MP750 (Extra Large)
{ COOLERMASTER_MP750_MEDIUM_PID, 0x00, DEVICE_TYPE_MOUSEMAT }, //Coolermaster MP750 (Medium)
{ COOLERMASTER_ARGB_PID, 0x00, DEVICE_TYPE_LEDSTRIP } //Coolermaster ARGB Controller
static const coolermaster_device cm_pids[] =
{ // PID, Interface, Usage_Page, Usage, Device_Type
{ COOLERMASTER_MP750_XL_PID, 0x00, 0xFF00, 0x01, DEVICE_TYPE_MOUSEMAT }, //Coolermaster MP750 (Extra Large)
{ COOLERMASTER_MP750_MEDIUM_PID, 0x00, 0xFF00, 0x01, DEVICE_TYPE_MOUSEMAT }, //Coolermaster MP750 (Medium)
{ COOLERMASTER_ARGB_PID, 0x00, 0xFF00, 0x01, DEVICE_TYPE_LEDSTRIP } //Coolermaster ARGB Controller
};
/******************************************************************************************\
@ -46,14 +49,22 @@ void DetectCoolerMasterControllers(std::vector<RGBController*>& rgb_controllers)
while(info)
{
hid_device* dev = NULL;
device_type dev_type;
if(info->vendor_id == COOLERMASTER_VID)
{
for(unsigned int cm_pid_idx = 0; cm_pid_idx < COOLERMASTER_NUM_DEVICES; cm_pid_idx++)
{
if((info->product_id == cm_pids[cm_pid_idx][CM_PID])
&&(info->interface_number == cm_pids[cm_pid_idx][CM_INTERFACE]))
if((info->product_id == cm_pids[cm_pid_idx].product_id)
#ifdef USE_HID_USAGE
&&(info->usage == cm_pids[cm_pid_idx].usage) //Usage and usage page required to get the correct interface
&&(info->usage_page == cm_pids[cm_pid_idx].usage_page))
#else
&&(info->interface_number == cm_pids[cm_pid_idx].interface))
#endif //USE_HID_USAGE
{
dev = hid_open_path(info->path);
dev = hid_open_path(info->path);
dev_type = cm_pids[cm_pid_idx].type;
break;
}
}

View file

@ -27,16 +27,6 @@ RGBController_CMARGBController::RGBController_CMARGBController(CMARGBController
Off.color_mode = MODE_COLORS_NONE;
modes.push_back(Off);
mode Spectrum;
Spectrum.name = "Spectrum";
Spectrum.value = CM_ARGB_MODE_SPECTRUM;
Spectrum.flags = MODE_FLAG_HAS_SPEED;
Spectrum.speed_min = CM_ARGB_SPEED_SLOWEST;
Spectrum.speed_max = CM_ARGB_SPEED_FASTEST;
Spectrum.color_mode = MODE_COLORS_NONE;
Spectrum.speed = speed;
modes.push_back(Spectrum);
mode Reload;
Reload.name = "Reload";
Reload.value = CM_ARGB_MODE_RELOAD;
@ -99,6 +89,16 @@ RGBController_CMARGBController::RGBController_CMARGBController(CMARGBController
Demo.speed = speed;
modes.push_back(Demo);
mode Spectrum;
Spectrum.name = "Spectrum";
Spectrum.value = CM_ARGB_MODE_SPECTRUM;
Spectrum.flags = MODE_FLAG_HAS_SPEED;
Spectrum.speed_min = CM_ARGB_SPEED_SLOWEST;
Spectrum.speed_max = CM_ARGB_SPEED_FASTEST;
Spectrum.color_mode = MODE_COLORS_NONE;
Spectrum.speed = speed;
modes.push_back(Spectrum);
mode FillFlow;
FillFlow.name = "Fill Flow";
FillFlow.value = CM_ARGB_MODE_FILLFLOW;