diff --git a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp index 73bc4fe4..7e0fbc3c 100644 --- a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp @@ -1,4 +1,5 @@ #include "SteelSeriesRivalController.h" +#include "SteelSeriesGeneric.h" #include "RGBController.h" #include "RGBController_SteelSeriesRival.h" #include @@ -12,6 +13,8 @@ #define STEELSERIES_RIVAL_100_DOTA_PID 0x170c #define STEELSERIES_RIVAL_105_PID 0x1814 #define STEELSERIES_RIVAL_110_PID 0x1729 +#define STEELSERIES_RIVAL_300_PID 0x1384 + typedef struct { @@ -19,6 +22,7 @@ typedef struct unsigned short usb_pid; unsigned char usb_interface; device_type type; + steelseries_type proto_type; const char * name; } steelseries_device; @@ -26,13 +30,14 @@ typedef struct static const steelseries_device device_list[] = { - /*-------------------------------------------------------------------------------------------------------------------------*\ - | Mice | - \*-------------------------------------------------------------------------------------------------------------------------*/ - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_100_PID, 0, DEVICE_TYPE_MOUSE, "SteelSeries Rival 100" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_100_DOTA_PID, 0, DEVICE_TYPE_MOUSE, "SteelSeries Rival 100 DotA 2 Edition" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_105_PID, 0, DEVICE_TYPE_MOUSE, "SteelSeries Rival 105" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_110_PID, 0, DEVICE_TYPE_MOUSE, "SteelSeries Rival 110" }, + /*-------------------------------------------------------------------------------------------------------------------------------------*\ + | Mice | + \*-------------------------------------------------------------------------------------------------------------------------------------*/ + { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_100_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 100" }, + { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_100_DOTA_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 100 DotA 2 Edition" }, + { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_105_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 105" }, + { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_110_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 110" }, + { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_300_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300" }, }; /******************************************************************************************\ @@ -79,15 +84,21 @@ void DetectSteelSeriesControllers(std::vector& rgb_controllers) case DEVICE_TYPE_KEYBOARD: /* Not yet supported */ break; + case DEVICE_TYPE_HEADSET: /* Not yet supported */ + break; + case DEVICE_TYPE_MOUSE: - SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev); + { + SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, device_list[device_idx].proto_type); RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); rgb_controller->name = device_list[device_idx].name; rgb_controllers.push_back(rgb_controller); + } break; + case DEVICE_TYPE_MOUSEMAT: /* Not yet supported */ break; diff --git a/Controllers/SteelSeriesController/SteelSeriesGeneric.h b/Controllers/SteelSeriesController/SteelSeriesGeneric.h new file mode 100644 index 00000000..40b8ae9c --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesGeneric.h @@ -0,0 +1,23 @@ +/*-----------------------------------------*\ +| SteelSeriesGeneric.h | +| | +| Definitions and types for the SteelSeries| +| Devices. | +| | +| B Horn (bahorn) 17/5/2020 | +\*-----------------------------------------*/ + +#include +#include + +#pragma once + +/* Allows us to handle variation in the protocol. + * Defined in a single enum so we can keep the device_list struct the same + * for every possible device. */ +typedef enum +{ + RIVAL_100 = 0x00, + RIVAL_300 = 0x01 +} steelseries_type; + diff --git a/Controllers/SteelSeriesController/SteelSeriesRivalController.cpp b/Controllers/SteelSeriesController/SteelSeriesRivalController.cpp index cbca270d..e5c72c4d 100644 --- a/Controllers/SteelSeriesController/SteelSeriesRivalController.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesRivalController.cpp @@ -27,9 +27,14 @@ static void send_usb_msg(hid_device* dev, char * data_pkt, unsigned int size) delete usb_pkt; } -SteelSeriesRivalController::SteelSeriesRivalController(hid_device* dev_handle) +SteelSeriesRivalController::SteelSeriesRivalController + ( + hid_device* dev_handle, + steelseries_type proto_type + ) { dev = dev_handle; + proto = proto_type; } SteelSeriesRivalController::~SteelSeriesRivalController() @@ -42,6 +47,11 @@ char* SteelSeriesRivalController::GetDeviceName() return device_name; } +steelseries_type SteelSeriesRivalController::GetMouseType() +{ + return proto; +} + /* Saves to the internal configuration */ void SteelSeriesRivalController::Save() { @@ -54,30 +64,38 @@ void SteelSeriesRivalController::Save() void SteelSeriesRivalController::SetLightEffect ( - unsigned char effect + unsigned char zone_id, + unsigned char effect ) { char usb_buf[9]; memset(usb_buf, 0x00, sizeof(usb_buf)); usb_buf[0x00] = 0x07; - usb_buf[0x01] = 0x00; + usb_buf[0x01] = zone_id; /* Device ID, needs to be zero for the 100 + series */ usb_buf[0x02] = effect; send_usb_msg(dev, usb_buf, 9); } void SteelSeriesRivalController::SetColor ( - unsigned char red, - unsigned char green, - unsigned char blue + unsigned char zone_id, + unsigned char red, + unsigned char green, + unsigned char blue ) { char usb_buf[9]; memset(usb_buf, 0x00, sizeof(usb_buf)); - - usb_buf[0x00] = 0x05; - usb_buf[0x01] = 0x00; + switch (proto) { + case RIVAL_100: + usb_buf[0x00] = 0x05; + usb_buf[0x01] = 0x00; + case RIVAL_300: + usb_buf[0x00] = 0x08; + usb_buf[0x01] = zone_id; + } usb_buf[0x02] = red; usb_buf[0x03] = green; usb_buf[0x04] = blue; diff --git a/Controllers/SteelSeriesController/SteelSeriesRivalController.h b/Controllers/SteelSeriesController/SteelSeriesRivalController.h index aa09a53f..6a9d5ea9 100644 --- a/Controllers/SteelSeriesController/SteelSeriesRivalController.h +++ b/Controllers/SteelSeriesController/SteelSeriesRivalController.h @@ -10,8 +10,9 @@ #include #include -#pragma once +#include "SteelSeriesGeneric.h" +#pragma once /* Mode, we then use these to set actual effect based on speed. */ enum @@ -29,26 +30,39 @@ enum STEELSERIES_RIVAL_EFFECT_PULSATE_MAX = 0x04 }; - class SteelSeriesRivalController { public: - SteelSeriesRivalController(hid_device* dev_handle); + SteelSeriesRivalController + ( + hid_device* dev_handle, + steelseries_type proto_type + ); + ~SteelSeriesRivalController(); char* GetDeviceName(); + steelseries_type GetMouseType(); + void Save(); - void SetLightEffect(unsigned char effect); + + void SetLightEffect + ( + unsigned char zone_id, + unsigned char effect + ); + void SetColor ( - unsigned char red, - unsigned char green, - unsigned char blue + unsigned char zone_id, + unsigned char red, + unsigned char green, + unsigned char blue ); private: char device_name[32]; hid_device* dev; - + steelseries_type proto; }; diff --git a/RGBController/RGBController_SteelSeriesRival.cpp b/RGBController/RGBController_SteelSeriesRival.cpp index 6d3c03f8..1078482d 100644 --- a/RGBController/RGBController_SteelSeriesRival.cpp +++ b/RGBController/RGBController_SteelSeriesRival.cpp @@ -67,7 +67,7 @@ void RGBController_SteelSeriesRival::DeviceUpdateLEDs() unsigned char red = RGBGetRValue(colors[0]); unsigned char grn = RGBGetGValue(colors[0]); unsigned char blu = RGBGetBValue(colors[0]); - rival->SetColor(red, grn, blu); + rival->SetColor(0, red, grn, blu); } void RGBController_SteelSeriesRival::UpdateZoneLEDs(int zone) @@ -76,9 +76,10 @@ void RGBController_SteelSeriesRival::UpdateZoneLEDs(int zone) unsigned char red = RGBGetRValue(color); unsigned char grn = RGBGetGValue(color); unsigned char blu = RGBGetBValue(color); + if(zone == 0) { - rival->SetColor(red, grn, blu); + rival->SetColor(0, red, grn, blu); } } @@ -97,10 +98,10 @@ void RGBController_SteelSeriesRival::UpdateMode() switch (modes[active_mode].value) { case STEELSERIES_RIVAL_STATIC: - rival->SetLightEffect(STEELSERIES_RIVAL_EFFECT_STATIC); + rival->SetLightEffect(0, STEELSERIES_RIVAL_EFFECT_STATIC); break; case STEELSERIES_RIVAL_PULSATE: - rival->SetLightEffect(modes[active_mode].speed); + rival->SetLightEffect(0, modes[active_mode].speed); break; }