From a961bf87b41521255e095a99652b0f8adcb287a8 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 10 Jun 2022 01:32:16 +1000 Subject: [PATCH] Initial commit for the Steelseries Aerox 3 mouse to resolve #2492 + Adding STEELSERIES_AEROX_3_PID and registering detector + Adding Abstract SteelSeriesMouseController class to accomodate new mouse + Adding SteelSeriesAerox3Controller class * Rewrote SteelSeriesRival3Controller to align with abstract class * Adjusted RGBController_SteelSeriesRival3 class to align with both mice --- .../RGBController_SteelSeriesRival3.cpp | 94 ++++++------- .../RGBController_SteelSeriesRival3.h | 5 +- .../SteelSeriesAerox3Controller.cpp | 125 ++++++++++++++++++ .../SteelSeriesAerox3Controller.h | 55 ++++++++ .../SteelSeriesControllerDetect.cpp | 98 ++++++++------ .../SteelSeriesGeneric.h | 1 + .../SteelSeriesMouseController.cpp | 61 +++++++++ .../SteelSeriesMouseController.h | 80 +++++++++++ .../SteelSeriesRival3Controller.cpp | 21 ++- .../SteelSeriesRival3Controller.h | 52 ++++---- OpenRGB.pro | 10 +- 11 files changed, 480 insertions(+), 122 deletions(-) create mode 100644 Controllers/SteelSeriesController/SteelSeriesAerox3Controller.cpp create mode 100644 Controllers/SteelSeriesController/SteelSeriesAerox3Controller.h create mode 100644 Controllers/SteelSeriesController/SteelSeriesMouseController.cpp create mode 100644 Controllers/SteelSeriesController/SteelSeriesMouseController.h diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp b/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp index 157d1ba8..4761998d 100644 --- a/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp @@ -9,20 +9,6 @@ #include "RGBController_SteelSeriesRival3.h" -typedef struct -{ - const char* name; - const int value; -} steelseries_rival_led_info; - -static const steelseries_rival_led_info rival_3_leds[]= -{ - {"Front", 0x01}, - {"Middle", 0x02}, - {"Rear", 0x03}, - {"Logo", 0x04} -}; - /**------------------------------------------------------------------*\ @name Steel Series Rival 3 @category Mouse @@ -34,49 +20,45 @@ static const steelseries_rival_led_info rival_3_leds[]= @comment \*-------------------------------------------------------------------*/ -RGBController_SteelSeriesRival3::RGBController_SteelSeriesRival3(SteelSeriesRival3Controller* rival_ptr) +RGBController_SteelSeriesRival3::RGBController_SteelSeriesRival3(SteelSeriesMouseController *controller_ptr) { - rival = rival_ptr; + controller = controller_ptr; - name = rival->GetDeviceName(); - vendor = "SteelSeries"; - type = DEVICE_TYPE_MOUSE; - description = "SteelSeries Rival 3 Device"; - location = rival->GetDeviceLocation(); - serial = rival->GetSerialString(); - version = rival->GetFirmwareVersion(); + name = controller->GetDeviceName(); + vendor = "SteelSeries"; + type = DEVICE_TYPE_MOUSE; + description = "SteelSeries Mouse Device"; + location = controller->GetDeviceLocation(); + serial = controller->GetSerialString(); + version = controller->GetFirmwareVersion(); mode Direct; Direct.name = "Direct"; - Direct.value = STEELSERIES_RIVAL_3_EFFECT_DIRECT; + Direct.value = STEELSERIES_MOUSE_EFFECT_DIRECT; Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE; Direct.color_mode = MODE_COLORS_PER_LED; Direct.brightness_min = 0x00; - Direct.brightness_max = STEELSERIES_RIVAL_3_BRIGHTNESS_MAX; - Direct.brightness = STEELSERIES_RIVAL_3_BRIGHTNESS_MAX; - modes.push_back(Direct); + Direct.brightness_max = STEELSERIES_MOUSE_BRIGHTNESS_MAX; + Direct.brightness = STEELSERIES_MOUSE_BRIGHTNESS_MAX; mode Breathing; Breathing.name = "Breathing"; - Breathing.value = STEELSERIES_RIVAL_3_EFFECT_BREATHING_MIN; + Breathing.value = STEELSERIES_MOUSE_EFFECT_BREATHING_MIN; Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE; Breathing.color_mode = MODE_COLORS_PER_LED; Breathing.speed_min = 0; Breathing.speed_max = 2; Breathing.speed = 1; - modes.push_back(Breathing); mode SpectrumCycle; SpectrumCycle.name = "Spectrum Cycle"; - SpectrumCycle.value = STEELSERIES_RIVAL_3_EFFECT_SPECTRUM_CYCLE; + SpectrumCycle.value = STEELSERIES_MOUSE_EFFECT_SPECTRUM_CYCLE; SpectrumCycle.flags = MODE_FLAG_MANUAL_SAVE; - modes.push_back(SpectrumCycle); mode RainbowBreathing; RainbowBreathing.name = "Rainbow Breathing"; - RainbowBreathing.value = STEELSERIES_RIVAL_3_EFFECT_RAINBOW_BREATHING; + RainbowBreathing.value = STEELSERIES_MOUSE_EFFECT_RAINBOW_BREATHING; RainbowBreathing.flags = MODE_FLAG_MANUAL_SAVE; - modes.push_back(RainbowBreathing); /*------------------------------------------------------------------------*\ | This is a pretty cool mode where it flashes random colors. | @@ -93,30 +75,53 @@ RGBController_SteelSeriesRival3::RGBController_SteelSeriesRival3(SteelSeriesRiva /* mode Disco; Disco.name = "Disco"; - Disco.value = STEELSERIES_RIVAL_3_EFFECT_DISCO; + Disco.value = STEELSERIES_MOUSE_EFFECT_DISCO; Disco.flags = MODE_FLAG_MANUAL_SAVE; modes.push_back(Disco); */ + steelseries_mouse mouse = controller->GetMouse(); + + for(const uint8_t i: mouse.modes) + { + switch(i) + { + case STEELSERIES_MOUSE_EFFECT_SPECTRUM_CYCLE: + modes.push_back(SpectrumCycle); + break; + case STEELSERIES_MOUSE_EFFECT_BREATHING_MIN: + modes.push_back(Breathing); + break; + case STEELSERIES_MOUSE_EFFECT_DIRECT: + modes.push_back(Direct); + break; + case STEELSERIES_MOUSE_EFFECT_RAINBOW_BREATHING: + modes.push_back(RainbowBreathing); + break; + } + } + SetupZones(); } void RGBController_SteelSeriesRival3::DeviceSaveMode() { - rival->Save(); + controller->Save(); } RGBController_SteelSeriesRival3::~RGBController_SteelSeriesRival3() { - delete rival; + delete controller; } void RGBController_SteelSeriesRival3::SetupZones() { - for(const steelseries_rival_led_info led_info: rival_3_leds) + steelseries_mouse mouse = controller->GetMouse(); + + for(const led_info info: mouse.leds) { zone zone; - zone.name = led_info.name; + zone.name = info.name; zone.type = ZONE_TYPE_SINGLE; zone.leds_min = 1; zone.leds_max = 1; @@ -125,8 +130,8 @@ void RGBController_SteelSeriesRival3::SetupZones() zones.push_back(zone); led mouse_led; - mouse_led.name = led_info.name; - mouse_led.value = led_info.value; + mouse_led.name = info.name; + mouse_led.value = info.value; leds.push_back(mouse_led); } SetupColors(); @@ -150,10 +155,7 @@ void RGBController_SteelSeriesRival3::DeviceUpdateLEDs() void RGBController_SteelSeriesRival3::UpdateZoneLEDs(int zone) { - /*--------------------------------------------------*\ - | Subtracting one as the zone and led indexes differ | - \*--------------------------------------------------*/ - UpdateSingleLED(zones[zone].leds[0].value - 1); + UpdateSingleLED(zone); } void RGBController_SteelSeriesRival3::UpdateSingleLED(int led) @@ -161,7 +163,7 @@ void RGBController_SteelSeriesRival3::UpdateSingleLED(int led) unsigned char red = RGBGetRValue(colors[led]); unsigned char grn = RGBGetGValue(colors[led]); unsigned char blu = RGBGetBValue(colors[led]); - rival->SetColor(leds[led].value, red, grn, blu, modes[active_mode].brightness); + controller->SetColor(leds[led].value, red, grn, blu, modes[active_mode].brightness); } void RGBController_SteelSeriesRival3::SetCustomMode() @@ -171,5 +173,5 @@ void RGBController_SteelSeriesRival3::SetCustomMode() void RGBController_SteelSeriesRival3::DeviceUpdateMode() { - rival->SetLightEffectAll(modes[active_mode].value - modes[active_mode].speed); + controller->SetLightEffectAll(modes[active_mode].value - modes[active_mode].speed); } diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.h b/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.h index 8d25c432..93bde891 100644 --- a/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.h +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.h @@ -10,12 +10,13 @@ #pragma once #include "RGBController.h" +#include "SteelSeriesAerox3Controller.h" #include "SteelSeriesRival3Controller.h" class RGBController_SteelSeriesRival3 : public RGBController { public: - RGBController_SteelSeriesRival3(SteelSeriesRival3Controller* rival_ptr); + RGBController_SteelSeriesRival3(SteelSeriesMouseController* controller_ptr); ~RGBController_SteelSeriesRival3(); void SetupZones(); @@ -32,5 +33,5 @@ public: private: - SteelSeriesRival3Controller* rival; + SteelSeriesMouseController* controller; }; diff --git a/Controllers/SteelSeriesController/SteelSeriesAerox3Controller.cpp b/Controllers/SteelSeriesController/SteelSeriesAerox3Controller.cpp new file mode 100644 index 00000000..0a40a96a --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesAerox3Controller.cpp @@ -0,0 +1,125 @@ +/*-------------------------------------------------------------------*\ +| SteelSeriesAerox3Controller.cpp | +| | +| OpenRGB controller driver for the Steelseries Aerox3 Wired | +| | +| Chris M (Dr_No) 9th June 2022 | +\*-------------------------------------------------------------------*/ + +#include "SteelSeriesAerox3Controller.h" +#include "LogManager.h" + +SteelSeriesAerox3Controller::SteelSeriesAerox3Controller(hid_device* dev_handle, steelseries_type proto_type, const char* path) + : SteelSeriesMouseController(dev_handle, proto_type, path) +{ + SendInit(); +} + +SteelSeriesAerox3Controller::~SteelSeriesAerox3Controller() +{ + hid_close(dev); +} + +void SteelSeriesAerox3Controller::SendInit() +{ + /*-----------------------------------------------------------------*\ + | This sets sensitivity and allows software mode?? max 5 uint8 | + | buffer[2] = Count eg. 0 thru 5 | + | buffer[4] to [8] = dpi / 50 range = 0x04 - 0xC7 eg. 400 = 0x08 | + \*-----------------------------------------------------------------*/ + uint8_t buffer[STEELSERIES_AEORX3_PACKET_SIZE] = { 0x00, 0x2D }; + + hid_send_feature_report(dev, buffer, STEELSERIES_AEORX3_PACKET_SIZE); +} + +std::string SteelSeriesAerox3Controller::GetFirmwareVersion() +{ + uint8_t result = 0; + const uint8_t CMD = 0x90; + const uint8_t sz = 16; + char version[sz]; + + uint8_t buffer[STEELSERIES_AEORX3_PACKET_SIZE] = { 0x00, CMD, 0x00 }; + + hid_send_feature_report(dev, buffer, STEELSERIES_AEORX3_PACKET_SIZE); + do + { + result = hid_read_timeout(dev, buffer, STEELSERIES_AEORX3_PACKET_SIZE, STEELSERIES_AEORX3_TIMEOUT); + LOG_DEBUG("[%s] Reading version buffer: Bytes Read %d Buffer %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", device_name, result, + buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9], buffer[10]); + } while(result > 0 && buffer[0] != CMD); + + if(buffer[0] == CMD) + { + /*-----------------------------------------------------------------*\ + | Read the version from the second character | + \*-----------------------------------------------------------------*/ + memcpy(version, &buffer[1], sz); + std::string tmp = std::string(version); + LOG_DEBUG("[%s] Version: %s as string %s", device_name, version, tmp.c_str()); + + return tmp; + } + else + { + LOG_DEBUG("[%s] Unable to get version: giving up!", device_name); + return ""; + } +} + +steelseries_mouse SteelSeriesAerox3Controller::GetMouse() +{ + return aerox_3; +} + +void SteelSeriesAerox3Controller::SetLightEffectAll(uint8_t effect) +{ + /*-----------------------------------------------------------------*\ + | Not used by this device | + \*-----------------------------------------------------------------*/ +} + +void SteelSeriesAerox3Controller::SetColor + ( + unsigned char zone_id, + unsigned char red, + unsigned char green, + unsigned char blue, + unsigned char brightness + ) +{ + uint8_t buffer[STEELSERIES_AEORX3_PACKET_SIZE] = { 0x00, 0x21 }; + + buffer[0x02] = 1 << zone_id; + uint8_t offset = 3 + zone_id * 3; + + buffer[offset] = red; + buffer[offset + 1] = green; + buffer[offset + 2] = blue; + + hid_write(dev, buffer, STEELSERIES_AEORX3_PACKET_SIZE); + + if(brightness != current_brightness) + { + SetBrightness(brightness); + current_brightness = brightness; + } +} + +void SteelSeriesAerox3Controller::SetBrightness(uint8_t brightness) +{ + uint8_t buffer[STEELSERIES_AEORX3_PACKET_SIZE] = { 0x00, 0x23, brightness }; + + hid_write(dev, buffer, STEELSERIES_AEORX3_PACKET_SIZE); +} + +void SteelSeriesAerox3Controller::Save() +{ + /*---------------------------------------------------------------------------------*\ + | Save packet was not confirmed as working but packet is verified as correct. | + | https://github.com/flozz/rivalcfg/blob/master/rivalcfg/devices/aerox3.py#L141 | + \*---------------------------------------------------------------------------------*/ + uint8_t buffer2[STEELSERIES_AEORX3_PACKET_SIZE] = { 0x00, 0x11, 0x00 }; + + hid_write(dev, buffer2, STEELSERIES_AEORX3_PACKET_SIZE); +} diff --git a/Controllers/SteelSeriesController/SteelSeriesAerox3Controller.h b/Controllers/SteelSeriesController/SteelSeriesAerox3Controller.h new file mode 100644 index 00000000..667fe1fb --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesAerox3Controller.h @@ -0,0 +1,55 @@ +/*-------------------------------------------------------------------*\ +| SteelSeriesAerox3Controller.h | +| | +| OpenRGB controller driver for the Steelseries Aerox3 Wired | +| | +| Chris M (Dr_No) 9th June 2022 | +\*-------------------------------------------------------------------*/ + +#include +#include +#include + +#include "RGBController.h" +#include "SteelSeriesGeneric.h" +#include "SteelSeriesMouseController.h" + +#pragma once + +#define STEELSERIES_AEORX3_PACKET_SIZE 65 +#define STEELSERIES_AEORX3_TIMEOUT 250 + +static const steelseries_mouse aerox_3 = +{ + { 0x04 }, + { + {"Front", 0 }, + {"Middle", 1 }, + {"Rear", 2 }, + } +}; + +class SteelSeriesAerox3Controller: public SteelSeriesMouseController +{ +public: + SteelSeriesAerox3Controller(hid_device* dev_handle, steelseries_type proto_type, const char* path); + ~SteelSeriesAerox3Controller(); + + std::string GetFirmwareVersion(); + steelseries_mouse GetMouse(); + + void Save() override; + void SetLightEffectAll(uint8_t effect); + void SetColor + ( + unsigned char zone_id, + unsigned char red, + unsigned char green, + unsigned char blue, + unsigned char brightness + ); +private: + void SendInit(); + void SetBrightness(uint8_t brightness); + uint8_t current_brightness; +}; diff --git a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp index 1f00fdba..a0f3dceb 100644 --- a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp @@ -29,6 +29,7 @@ /*-----------------------------------------------------*\ | Mouse product IDs | \*-----------------------------------------------------*/ +#define STEELSERIES_AEROX_3_PID 0x1836 #define STEELSERIES_RIVAL_100_PID 0x1702 #define STEELSERIES_RIVAL_100_DOTA_PID 0x170c #define STEELSERIES_RIVAL_105_PID 0x1814 @@ -82,14 +83,26 @@ #define STEELSERIES_APEX_OG_PID 0x1202 #define STEELSERIES_APEX_350_PID 0x1206 +void DetectSteelSeriesAerox3(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + if(dev) + { + SteelSeriesAerox3Controller* controller = new SteelSeriesAerox3Controller(dev, AEROX_3, info->path); + RGBController_SteelSeriesRival3* rgb_controller = new RGBController_SteelSeriesRival3(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + void DetectSteelSeriesApexTZone(hid_device_info* info, const std::string& name) { hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesApexTZoneController* controller = new SteelSeriesApexTZoneController(dev, APEX_TZONE, info->path); - RGBController_SteelSeriesApexTZone* rgb_controller = new RGBController_SteelSeriesApexTZone(controller); - rgb_controller->name = name; + SteelSeriesApexTZoneController* controller = new SteelSeriesApexTZoneController(dev, APEX_TZONE, info->path); + RGBController_SteelSeriesApexTZone* rgb_controller = new RGBController_SteelSeriesApexTZone(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -99,9 +112,9 @@ void DetectSteelSeriesApex(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesApexController* controller = new SteelSeriesApexController(dev, APEX, info->path); - RGBController_SteelSeriesApex* rgb_controller = new RGBController_SteelSeriesApex(controller); - rgb_controller->name = name; + SteelSeriesApexController* controller = new SteelSeriesApexController(dev, APEX, info->path); + RGBController_SteelSeriesApex* rgb_controller = new RGBController_SteelSeriesApex(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -111,9 +124,9 @@ void DetectSteelSeriesApexTKL(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesApexController* controller = new SteelSeriesApexController(dev, APEX_TKL, info->path); - RGBController_SteelSeriesApex* rgb_controller = new RGBController_SteelSeriesApex(controller); - rgb_controller->name = name; + SteelSeriesApexController* controller = new SteelSeriesApexController(dev, APEX_TKL, info->path); + RGBController_SteelSeriesApex* rgb_controller = new RGBController_SteelSeriesApex(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -123,9 +136,9 @@ void DetectSteelSeriesApexM(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesApexMController* controller = new SteelSeriesApexMController(dev, APEX_M, info->path); - RGBController_SteelSeriesApex* rgb_controller = new RGBController_SteelSeriesApex(controller); - rgb_controller->name = name; + SteelSeriesApexMController* controller = new SteelSeriesApexMController(dev, APEX_M, info->path); + RGBController_SteelSeriesApex* rgb_controller = new RGBController_SteelSeriesApex(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -135,9 +148,9 @@ void DetectSteelSeriesApexOld(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesOldApexController* controller = new SteelSeriesOldApexController(dev, APEX_OLD, info->path); - RGBController_SteelSeriesOldApex* rgb_controller = new RGBController_SteelSeriesOldApex(controller); - rgb_controller->name = name; + SteelSeriesOldApexController* controller = new SteelSeriesOldApexController(dev, APEX_OLD, info->path); + RGBController_SteelSeriesOldApex* rgb_controller = new RGBController_SteelSeriesOldApex(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -147,9 +160,9 @@ void DetectSteelSeriesHeadset(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesSiberiaController* controller = new SteelSeriesSiberiaController(dev, info->path); - RGBController_SteelSeriesSiberia* rgb_controller = new RGBController_SteelSeriesSiberia(controller); - rgb_controller->name = name; + SteelSeriesSiberiaController* controller = new SteelSeriesSiberiaController(dev, info->path); + RGBController_SteelSeriesSiberia* rgb_controller = new RGBController_SteelSeriesSiberia(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -159,9 +172,9 @@ void DetectSteelSeriesMousemat(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesQCKMatController* controller = new SteelSeriesQCKMatController(dev, info->path); - RGBController_SteelSeriesQCKMat* rgb_controller = new RGBController_SteelSeriesQCKMat(controller); - rgb_controller->name = name; + SteelSeriesQCKMatController* controller = new SteelSeriesQCKMatController(dev, info->path); + RGBController_SteelSeriesQCKMat* rgb_controller = new RGBController_SteelSeriesQCKMat(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -171,9 +184,9 @@ void DetectSteelSeriesRival100(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_100, info->path); - RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); - rgb_controller->name = name; + SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_100, info->path); + RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -183,9 +196,9 @@ void DetectSteelSeriesRival300(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_300, info->path); - RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); - rgb_controller->name = name; + SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_300, info->path); + RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -195,9 +208,9 @@ void DetectSteelSeriesRival600(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_600, info->path); - RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); - rgb_controller->name = name; + SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_600, info->path); + RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -208,9 +221,9 @@ void DetectSteelSeriesRival650(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_650, info->path); - RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); - rgb_controller->name = name; + SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_650, info->path); + RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -220,9 +233,9 @@ void DetectSteelSeriesRival700(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_700, info->path); - RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); - rgb_controller->name = name; + SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, RIVAL_700, info->path); + RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -233,9 +246,9 @@ void DetectSteelSeriesRival3(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesRival3Controller* controller = new SteelSeriesRival3Controller(dev, RIVAL_3, info->path); - RGBController_SteelSeriesRival3* rgb_controller = new RGBController_SteelSeriesRival3(controller); - rgb_controller->name = name; + SteelSeriesRival3Controller* controller = new SteelSeriesRival3Controller(dev, RIVAL_3, info->path); + RGBController_SteelSeriesRival3* rgb_controller = new RGBController_SteelSeriesRival3(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -245,9 +258,9 @@ void DetectSteelSeriesSensei(hid_device_info* info, const std::string& name) hid_device* dev = hid_open_path(info->path); if(dev) { - SteelSeriesSenseiController* controller = new SteelSeriesSenseiController(dev, SENSEI, info->path); - RGBController_SteelSeriesSensei* rgb_controller = new RGBController_SteelSeriesSensei(controller); - rgb_controller->name = name; + SteelSeriesSenseiController* controller = new SteelSeriesSenseiController(dev, SENSEI, info->path); + RGBController_SteelSeriesSensei* rgb_controller = new RGBController_SteelSeriesSensei(controller); + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -268,6 +281,7 @@ void DetectSteelSeriesArctis5(hid_device_info* info, const std::string& name) /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------*\ | Mice | \*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +REGISTER_HID_DETECTOR_IPU("SteelSeries Aerox 3 Wired", DetectSteelSeriesAerox3, STEELSERIES_VID, STEELSERIES_AEROX_3_PID, 3, 0xFFC0, 1 ); REGISTER_HID_DETECTOR_I("SteelSeries Rival 100", DetectSteelSeriesRival100, STEELSERIES_VID, STEELSERIES_RIVAL_100_PID, 0 ); REGISTER_HID_DETECTOR_I("SteelSeries Rival 100 DotA 2 Edition", DetectSteelSeriesRival100, STEELSERIES_VID, STEELSERIES_RIVAL_100_DOTA_PID, 0 ); REGISTER_HID_DETECTOR_I("SteelSeries Rival 105", DetectSteelSeriesRival100, STEELSERIES_VID, STEELSERIES_RIVAL_105_PID, 0 ); diff --git a/Controllers/SteelSeriesController/SteelSeriesGeneric.h b/Controllers/SteelSeriesController/SteelSeriesGeneric.h index cd7dcb4d..62f8a9e9 100644 --- a/Controllers/SteelSeriesController/SteelSeriesGeneric.h +++ b/Controllers/SteelSeriesController/SteelSeriesGeneric.h @@ -30,5 +30,6 @@ typedef enum RIVAL_3 = 0x0a, APEX_TZONE = 0x0b, RIVAL_700 = 0x0c, + AEROX_3 = 0x0d, } steelseries_type; diff --git a/Controllers/SteelSeriesController/SteelSeriesMouseController.cpp b/Controllers/SteelSeriesController/SteelSeriesMouseController.cpp new file mode 100644 index 00000000..71dd57f1 --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesMouseController.cpp @@ -0,0 +1,61 @@ +/*-------------------------------------------------------------------*\ +| SteelSeriesMouseController.cpp | +| | +| OpenRGB abstract driver for SteelSeries Mice | +| | +| Chris M (Dr_No) 9th June 2022 | +\*-------------------------------------------------------------------*/ + +#include +#include "SteelSeriesMouseController.h" + +SteelSeriesMouseController::SteelSeriesMouseController(hid_device* dev_handle, steelseries_type proto_type, const char* path) +{ + dev = dev_handle; + location = path; + proto = proto_type; +} + +SteelSeriesMouseController::~SteelSeriesMouseController() +{ + +} + +std::string SteelSeriesMouseController::GetDeviceLocation() +{ + return("HID: " + location); +} + +char* SteelSeriesMouseController::GetDeviceName() +{ + return device_name; +} + +std::string SteelSeriesMouseController::GetSerialString() +{ + wchar_t serial_string[128]; + int ret = hid_get_serial_number_string(dev, serial_string, 128); + + if (ret != 0) + { + return(""); + } + + std::wstring return_wstring = serial_string; + std::string return_string(return_wstring.begin(), return_wstring.end()); + + return(return_string); +} + +steelseries_type SteelSeriesMouseController::GetMouseType() +{ + return proto; +} + +void SteelSeriesMouseController::Save() +{ + const uint8_t SAVE_BUFFER_SIZE = 10; + uint8_t usb_buf[SAVE_BUFFER_SIZE] = { 0x00, 0x09 }; + + hid_write(dev, usb_buf, SAVE_BUFFER_SIZE); +} diff --git a/Controllers/SteelSeriesController/SteelSeriesMouseController.h b/Controllers/SteelSeriesController/SteelSeriesMouseController.h new file mode 100644 index 00000000..715dd959 --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesMouseController.h @@ -0,0 +1,80 @@ +/*-------------------------------------------------------------------*\ +| SteelSeriesMouseController.h | +| | +| OpenRGB abstract driver for SteelSeries Mice | +| | +| Chris M (Dr_No) 9th June 2022 | +\*-------------------------------------------------------------------*/ + +#include +#include +#include +#include "SteelSeriesGeneric.h" + +#pragma once + +#define STEELSERIES_MOUSE_BRIGHTNESS_MAX 0x64 + +/*-----------------------------------------------------------*\ +| Theses are the specific values that get sent to set a mode | +\*-----------------------------------------------------------*/ +enum +{ + STEELSERIES_MOUSE_EFFECT_SPECTRUM_CYCLE = 0x00, + STEELSERIES_MOUSE_EFFECT_BREATHING_MAX = 0x01, + STEELSERIES_MOUSE_EFFECT_BREATHING_MID = 0x02, + STEELSERIES_MOUSE_EFFECT_BREATHING_MIN = 0x03, + STEELSERIES_MOUSE_EFFECT_DIRECT = 0x04, + STEELSERIES_MOUSE_EFFECT_RAINBOW_BREATHING = 0x05, + STEELSERIES_MOUSE_EFFECT_DISCO = 0x06 +}; + +typedef struct +{ + const char* name; + const int value; +} led_info; + +typedef struct +{ + std::vector modes; + std::vector leds; +} steelseries_mouse; + +class SteelSeriesMouseController +{ +public: + SteelSeriesMouseController(hid_device* dev_handle, steelseries_type proto_type, const char* path); + ~SteelSeriesMouseController(); + + std::string GetDeviceLocation(); + char* GetDeviceName(); + std::string GetSerialString(); + steelseries_type GetMouseType(); + + /*-----------------------------------------------------------------*\ + | Save has a common function but can be overridden | + \*-----------------------------------------------------------------*/ + virtual void Save(); + + virtual steelseries_mouse GetMouse() = 0; + virtual std::string GetFirmwareVersion() = 0; + virtual void SetLightEffectAll(uint8_t effect) = 0; + virtual void SetColor + ( + unsigned char zone_id, + unsigned char red, + unsigned char green, + unsigned char blue, + unsigned char brightness + ) = 0; + +protected: + char device_name[32]; + hid_device* dev; + std::string location; + steelseries_type proto; + +private: + +}; diff --git a/Controllers/SteelSeriesController/SteelSeriesRival3Controller.cpp b/Controllers/SteelSeriesController/SteelSeriesRival3Controller.cpp index abce4f1a..1a49955b 100644 --- a/Controllers/SteelSeriesController/SteelSeriesRival3Controller.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesRival3Controller.cpp @@ -17,11 +17,11 @@ SteelSeriesRival3Controller::SteelSeriesRival3Controller hid_device* dev_handle, steelseries_type proto_type, const char* path - ) + ) : SteelSeriesMouseController(dev_handle, proto_type, path) { - dev = dev_handle; - location = path; - proto = proto_type; + //dev = dev_handle; + //location = path; + //proto = proto_type; } SteelSeriesRival3Controller::~SteelSeriesRival3Controller() @@ -29,6 +29,7 @@ SteelSeriesRival3Controller::~SteelSeriesRival3Controller() hid_close(dev); } +/* std::string SteelSeriesRival3Controller::GetDeviceLocation() { return("HID: " + location); @@ -43,7 +44,7 @@ std::string SteelSeriesRival3Controller::GetSerialString() { wchar_t serial_string[128]; int ret = hid_get_serial_number_string(dev, serial_string, 128); - + if (ret != 0) { return(""); @@ -54,6 +55,7 @@ std::string SteelSeriesRival3Controller::GetSerialString() return(return_string); } +*/ std::string SteelSeriesRival3Controller::GetFirmwareVersion() { @@ -69,6 +71,12 @@ std::string SteelSeriesRival3Controller::GetFirmwareVersion() return return_string; } +steelseries_mouse SteelSeriesRival3Controller::GetMouse() +{ + return rival_3; +} + +/* steelseries_type SteelSeriesRival3Controller::GetMouseType() { return proto; @@ -78,9 +86,10 @@ void SteelSeriesRival3Controller::Save() { const uint8_t SAVE_BUFFER_SIZE = 10; uint8_t usb_buf[SAVE_BUFFER_SIZE] = { 0x00, 0x09 }; - + hid_write(dev, usb_buf, SAVE_BUFFER_SIZE); } +*/ void SteelSeriesRival3Controller::SetLightEffectAll(uint8_t effect) { diff --git a/Controllers/SteelSeriesController/SteelSeriesRival3Controller.h b/Controllers/SteelSeriesController/SteelSeriesRival3Controller.h index 13436d6c..c3eb8713 100644 --- a/Controllers/SteelSeriesController/SteelSeriesRival3Controller.h +++ b/Controllers/SteelSeriesController/SteelSeriesRival3Controller.h @@ -11,26 +11,32 @@ #include #include "SteelSeriesGeneric.h" +#include "SteelSeriesMouseController.h" #pragma once -#define STEELSERIES_RIVAL_3_BRIGHTNESS_MAX 0x64 +//#define STEELSERIES_RIVAL_3_BRIGHTNESS_MAX 0x64 -/*-----------------------------------------------------------*\ -| Theses are the specific values that get sent to set a mode | -\*-----------------------------------------------------------*/ -enum +/*static const steelseries_mouse_led_info rival_3_leds[]= { - STEELSERIES_RIVAL_3_EFFECT_SPECTRUM_CYCLE = 0x00, - STEELSERIES_RIVAL_3_EFFECT_BREATHING_MAX = 0x01, - STEELSERIES_RIVAL_3_EFFECT_BREATHING_MID = 0x02, - STEELSERIES_RIVAL_3_EFFECT_BREATHING_MIN = 0x03, - STEELSERIES_RIVAL_3_EFFECT_DIRECT = 0x04, - STEELSERIES_RIVAL_3_EFFECT_RAINBOW_BREATHING = 0x05, - STEELSERIES_RIVAL_3_EFFECT_DISCO = 0x06 + {"Front", 0x01}, + {"Middle", 0x02}, + {"Rear", 0x03}, + {"Logo", 0x04} +};*/ + +static const steelseries_mouse rival_3 = +{ + { 0x04, 0x03, 0x00, 0x05 }, + { + {"Front", 0x01}, + {"Middle", 0x02}, + {"Rear", 0x03}, + {"Logo", 0x04} + } }; -class SteelSeriesRival3Controller +class SteelSeriesRival3Controller: public SteelSeriesMouseController { public: SteelSeriesRival3Controller @@ -42,14 +48,14 @@ public: ~SteelSeriesRival3Controller(); - std::string GetDeviceLocation(); - char* GetDeviceName(); - std::string GetSerialString(); + //std::string GetDeviceLocation(); + //char* GetDeviceName(); + //std::string GetSerialString(); std::string GetFirmwareVersion(); + steelseries_mouse GetMouse(); + //steelseries_type GetMouseType(); - steelseries_type GetMouseType(); - - void Save(); + //void Save(); void SetLightEffectAll(uint8_t effect); @@ -63,8 +69,8 @@ public: ); private: - char device_name[32]; - hid_device* dev; - std::string location; - steelseries_type proto; + //char device_name[32]; + //hid_device* dev; + //std::string location; + //steelseries_type proto; }; diff --git a/OpenRGB.pro b/OpenRGB.pro index 38adf03b..e82b4f80 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -525,12 +525,14 @@ HEADERS += Controllers/SonyDS4Controller/SonyDS4Controller.h \ Controllers/SonyDS4Controller/RGBController_SonyDS4.h \ Controllers/SteelSeriesController/color32.h \ + Controllers/SteelSeriesController/SteelSeriesAerox3Controller.h \ Controllers/SteelSeriesController/SteelSeriesApexBaseController.h \ Controllers/SteelSeriesController/SteelSeriesApexController.h \ - Controllers/SteelSeriesController/SteelSeriesApexTZoneController.h \ Controllers/SteelSeriesController/SteelSeriesApexMController.h \ + Controllers/SteelSeriesController/SteelSeriesApexTZoneController.h \ Controllers/SteelSeriesController/SteelSeriesArctis5Controller.h \ Controllers/SteelSeriesController/SteelSeriesGeneric.h \ + Controllers/SteelSeriesController/SteelSeriesMouseController.h \ Controllers/SteelSeriesController/SteelSeriesOldApexController.h \ Controllers/SteelSeriesController/SteelSeriesRivalController.h \ Controllers/SteelSeriesController/SteelSeriesRival3Controller.h \ @@ -1048,17 +1050,19 @@ SOURCES += Controllers/SonyDS4Controller/SonyDS4Controller.cpp \ Controllers/SonyDS4Controller/SonyDS4ControllerDetect.cpp \ Controllers/SonyDS4Controller/RGBController_SonyDS4.cpp \ + Controllers/SteelSeriesController/SteelSeriesAerox3Controller.cpp \ Controllers/SteelSeriesController/SteelSeriesApexController.cpp \ - Controllers/SteelSeriesController/SteelSeriesApexTZoneController.cpp \ Controllers/SteelSeriesController/SteelSeriesApexMController.cpp \ + Controllers/SteelSeriesController/SteelSeriesApexTZoneController.cpp \ Controllers/SteelSeriesController/SteelSeriesArctis5Controller.cpp \ + Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp \ + Controllers/SteelSeriesController/SteelSeriesMouseController.cpp \ Controllers/SteelSeriesController/SteelSeriesOldApexController.cpp \ Controllers/SteelSeriesController/SteelSeriesRivalController.cpp \ Controllers/SteelSeriesController/SteelSeriesRival3Controller.cpp \ Controllers/SteelSeriesController/SteelSeriesSenseiController.cpp \ Controllers/SteelSeriesController/SteelSeriesSiberiaController.cpp \ Controllers/SteelSeriesController/SteelSeriesQCKMatController.cpp \ - Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesApex.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.cpp \