diff --git a/99-openrgb.rules b/99-openrgb.rules index f3e0bfabc..2e536359e 100644 --- a/99-openrgb.rules +++ b/99-openrgb.rules @@ -191,6 +191,8 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="048d", ATTR{idProduct}=="8297", GROUP="plugd # SteelSeries Rival 300 CS:GO Hyperbeast Edition # # SteelSeries Rival 300 Dota 2 Edition # # SteelSeries Rival 300 HP Omen Edition # +# Headsets: # +# SteelSeries Siberia 350 # #---------------------------------------------------------------# SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1702", GROUP="plugdev", MODE="0666", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="170c", GROUP="plugdev", MODE="0666", TAG+="uaccess" @@ -203,6 +205,7 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1716", GROUP="plugd SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="171a", GROUP="plugdev", MODE="0666", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1392", GROUP="plugdev", MODE="0666", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1718", GROUP="plugdev", MODE="0666", TAG+="uaccess" +SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1229", GROUP="plugdev", MODE="0666", TAG+="uaccess" #---------------------------------------------------------------# diff --git a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp index ab465c747..4c2778990 100644 --- a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp @@ -1,14 +1,19 @@ #include "SteelSeriesRivalController.h" +#include "SteelSeriesSiberiaController.h" #include "SteelSeriesGeneric.h" #include "RGBController.h" #include "RGBController_SteelSeriesRival.h" +#include "RGBController_SteelSeriesSiberia.h" #include #include +/*-----------------------------------------------------*\ +| Vendor ID | +\*-----------------------------------------------------*/ +#define STEELSERIES_VID 0x1038 /*-----------------------------------------------------*\ | Mouse product IDs | \*-----------------------------------------------------*/ -#define STEELSERIES_RIVAL_VID 0x1038 #define STEELSERIES_RIVAL_100_PID 0x1702 #define STEELSERIES_RIVAL_100_DOTA_PID 0x170c #define STEELSERIES_RIVAL_105_PID 0x1814 @@ -21,6 +26,10 @@ #define STEELSERIES_RIVAL_300_DOTA_PID 0x1392 #define STEELSERIES_RIVAL_300_HP_PID 0x1718 #define STEELSERIES_RIVAL_300_BLACKOPS_PID 0x1710 +/*-----------------------------------------------------*\ +| Headset product IDs | +\*-----------------------------------------------------*/ +#define STEELSERIES_SIBERIA_350_PID 0x1229 typedef struct { @@ -36,28 +45,32 @@ typedef struct static const steelseries_device device_list[] = { - /*-------------------------------------------------------------------------------------------------------------------------------------------------------------*\ - | 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" }, - { STEELSERIES_RIVAL_VID, ACER_PREDATOR_RIVAL_300_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "Acer Predator Gaming Mouse (Rival 300)" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_300_CSGO_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 CS:GO Fade Edition" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_300_CSGO_STM32_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 CS:GO Fade Edition (stm32)" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_300_CSGO_HYPERBEAST_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 CS:GO Hyperbeast Edition" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_300_DOTA_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 Dota 2 Edition" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_300_HP_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 HP Omen Edition" }, - { STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_300_BLACKOPS_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 Black Ops Edition" }, + /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*\ + | Mice | + \*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + { STEELSERIES_VID, STEELSERIES_RIVAL_100_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 100" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_100_DOTA_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 100 DotA 2 Edition" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_105_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 105" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_110_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 110" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_300_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300" }, + { STEELSERIES_VID, ACER_PREDATOR_RIVAL_300_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "Acer Predator Gaming Mouse (Rival 300)" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_300_CSGO_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 CS:GO Fade Edition" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_300_CSGO_STM32_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 CS:GO Fade Edition (stm32)" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_300_CSGO_HYPERBEAST_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 CS:GO Hyperbeast Edition" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_300_DOTA_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 Dota 2 Edition" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_300_HP_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 HP Omen Edition" }, + { STEELSERIES_VID, STEELSERIES_RIVAL_300_BLACKOPS_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300 Black Ops Edition" }, + /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*\ + | Headsets | + \*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + { STEELSERIES_VID, STEELSERIES_SIBERIA_350_PID, 3, DEVICE_TYPE_HEADSET, SIBERIA_350, "SteelSeries Siberia 350" }, }; /******************************************************************************************\ * * * DetectSteelSeriesControllers * * * -* Tests the USB address to find a SteelSeries Rival Mouse * +* Tests the USB address to find a SteelSeries Rival Mouse or Headset * * * \******************************************************************************************/ @@ -99,7 +112,13 @@ void DetectSteelSeriesControllers(std::vector& rgb_controllers) break; case DEVICE_TYPE_HEADSET: - /* Not yet supported */ + { + SteelSeriesSiberiaController* controller = new SteelSeriesSiberiaController(dev); + + RGBController_SteelSeriesSiberia* rgb_controller = new RGBController_SteelSeriesSiberia(controller); + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } break; case DEVICE_TYPE_MOUSE: diff --git a/Controllers/SteelSeriesController/SteelSeriesGeneric.h b/Controllers/SteelSeriesController/SteelSeriesGeneric.h index 40b8ae9ce..176d465a9 100644 --- a/Controllers/SteelSeriesController/SteelSeriesGeneric.h +++ b/Controllers/SteelSeriesController/SteelSeriesGeneric.h @@ -17,7 +17,8 @@ * for every possible device. */ typedef enum { - RIVAL_100 = 0x00, - RIVAL_300 = 0x01 + RIVAL_100 = 0x00, + RIVAL_300 = 0x01, + SIBERIA_350 = 0x03, } steelseries_type; diff --git a/Controllers/SteelSeriesController/SteelSeriesSiberiaController.cpp b/Controllers/SteelSeriesController/SteelSeriesSiberiaController.cpp new file mode 100644 index 000000000..bb3edaf2a --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesSiberiaController.cpp @@ -0,0 +1,92 @@ +/*-----------------------------------------*\ +| SteelSeriesSiberiaController.cpp | +| | +| Definitions and types for SteelSeries | +| Siberia lighting controller | +| | +| E Karlsson (pilophae) 18/6/2020 | +| +\*-----------------------------------------*/ + +#include "SteelSeriesSiberiaController.h" +#include + +static void send_usb_msg(hid_device* dev, char * data_pkt, unsigned int size) +{ + char* usb_pkt = new char[16]; + memset(usb_pkt, 0x00, sizeof(usb_pkt)); + + // Report number + usb_pkt[0] = 0x01; + // Magic + usb_pkt[1] = 0x00; + // Command + usb_pkt[2] = data_pkt[0]; + // Payload length + usb_pkt[3] = size - 1; + + for(unsigned int i = 0; i < (size - 1); i++) + { + usb_pkt[4 + i] = data_pkt[1 + i]; + } + + hid_write(dev, (unsigned char *)usb_pkt, 16); + + delete[] usb_pkt; +} + +SteelSeriesSiberiaController::SteelSeriesSiberiaController + ( + hid_device* dev_handle + ) +{ + dev = dev_handle; +} + +SteelSeriesSiberiaController::~SteelSeriesSiberiaController() +{ +} + +char* SteelSeriesSiberiaController::GetDeviceName() +{ + return device_name; +} + +void SteelSeriesSiberiaController::SetColor + ( + unsigned char red, + unsigned char green, + unsigned char blue + ) +{ + char usb_buf[4]; + memset(usb_buf, 0x00, sizeof(usb_buf)); + + // Command 1 + usb_buf[0] = 0x95; + usb_buf[1] = 0x80; + usb_buf[2] = 0xbf; + send_usb_msg(dev, usb_buf, 3); + + // Command 2 + memset(usb_buf, 0x00, sizeof(usb_buf)); + usb_buf[0] = 0x80; + usb_buf[1] = 0x52; + usb_buf[2] = 0x20; + send_usb_msg(dev, usb_buf, 3); + + // Command 3 (Set color) + memset(usb_buf, 0x00, sizeof(usb_buf)); + usb_buf[0] = 0x83; + usb_buf[1] = red; + usb_buf[2] = green; + usb_buf[3] = blue; + send_usb_msg(dev, usb_buf, 4); + + // Command 4 + memset(usb_buf, 0x00, sizeof(usb_buf)); + usb_buf[0] = 0x93; + usb_buf[1] = 0x03; + usb_buf[2] = 0x80; + send_usb_msg(dev, usb_buf, 3); +} diff --git a/Controllers/SteelSeriesController/SteelSeriesSiberiaController.h b/Controllers/SteelSeriesController/SteelSeriesSiberiaController.h new file mode 100644 index 000000000..a7a959d4d --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesSiberiaController.h @@ -0,0 +1,37 @@ +/*-----------------------------------------*\ +| SteelSeriesSiberiaController.h | +| | +| Definitions and types for SteelSeries | +| Siberia lighting controller | +| | +| E Karlsson (pilophae) 18/6/2020 | +\*-----------------------------------------*/ + +#include +#include + +#pragma once + +class SteelSeriesSiberiaController +{ +public: + SteelSeriesSiberiaController + ( + hid_device* dev_handle + ); + + ~SteelSeriesSiberiaController(); + + char* GetDeviceName(); + + void SetColor + ( + unsigned char red, + unsigned char green, + unsigned char blue + ); + +private: + char device_name[32]; + hid_device* dev; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 89ca97738..e75264ae1 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -141,6 +141,7 @@ HEADERS += \ Controllers/RedragonController/RedragonK556Controller.h \ Controllers/RedragonController/RedragonM711Controller.h \ Controllers/SteelSeriesController/SteelSeriesRivalController.h \ + Controllers/SteelSeriesController/SteelSeriesSiberiaController.h \ Controllers/ThermaltakeRiingController/ThermaltakeRiingController.h \ RGBController/RGBController.h \ RGBController/RGBController_AMDWraithPrism.h \ @@ -181,6 +182,7 @@ HEADERS += \ RGBController/RGBController_RGBFusion2USB.h \ RGBController/RGBController_RGBFusionGPU.h \ RGBController/RGBController_SteelSeriesRival.h \ + RGBController/RGBController_SteelSeriesSiberia.h \ RGBController/RGBController_ThermaltakeRiing.h \ SOURCES += \ @@ -275,6 +277,7 @@ SOURCES += \ Controllers/RedragonController/RedragonM711Controller.cpp \ Controllers/RedragonController/RedragonControllerDetect.cpp \ Controllers/SteelSeriesController/SteelSeriesRivalController.cpp \ + Controllers/SteelSeriesController/SteelSeriesSiberiaController.cpp \ Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp \ Controllers/ThermaltakeRiingController/ThermaltakeRiingController.cpp \ Controllers/ThermaltakeRiingController/ThermaltakeRiingControllerDetect.cpp \ @@ -318,6 +321,7 @@ SOURCES += \ RGBController/RGBController_RGBFusion2USB.cpp \ RGBController/RGBController_RGBFusionGPU.cpp \ RGBController/RGBController_SteelSeriesRival.cpp \ + RGBController/RGBController_SteelSeriesSiberia.cpp \ RGBController/RGBController_ThermaltakeRiing.cpp \ RESOURCES += \ diff --git a/RGBController/RGBController_SteelSeriesSiberia.cpp b/RGBController/RGBController_SteelSeriesSiberia.cpp new file mode 100644 index 000000000..cda16f333 --- /dev/null +++ b/RGBController/RGBController_SteelSeriesSiberia.cpp @@ -0,0 +1,87 @@ +/*-----------------------------------------*\ +| RGBController_SteelSeriesSiberia.cpp | +| | +| Generic RGB Interface SteelSeriesSiberia | +| Class | +| | +| E Karlsson (pilophae) 18/06/2020 | +\*-----------------------------------------*/ + +#include "RGBController_SteelSeriesSiberia.h" + +RGBController_SteelSeriesSiberia::RGBController_SteelSeriesSiberia(SteelSeriesSiberiaController* siberia_ptr) +{ + siberia = siberia_ptr; + + name = siberia_ptr->GetDeviceName(); + type = DEVICE_TYPE_HEADSET; + description = "SteelSeries Siberia Device"; + + mode Static; + Static.name = "Static"; + Static.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Static.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Static); + + SetupZones(); +} + +void RGBController_SteelSeriesSiberia::SetupZones() +{ + /* Siberia 350 only has one Zone */ + zone earpiece_zone; + earpiece_zone.name = "Headset"; + earpiece_zone.type = ZONE_TYPE_SINGLE; + earpiece_zone.leds_min = 1; + earpiece_zone.leds_max = 1; + earpiece_zone.leds_count = 1; + earpiece_zone.matrix_map = NULL; + zones.push_back(earpiece_zone); + + led earpiece_led; + earpiece_led.name = "Headset LED"; + leds.push_back(earpiece_led); + + SetupColors(); +} + +void RGBController_SteelSeriesSiberia::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_SteelSeriesSiberia::DeviceUpdateLEDs() +{ + unsigned char red = RGBGetRValue(colors[0]); + unsigned char grn = RGBGetGValue(colors[0]); + unsigned char blu = RGBGetBValue(colors[0]); + siberia->SetColor(red, grn, blu); +} + +void RGBController_SteelSeriesSiberia::UpdateZoneLEDs(int zone) +{ + RGBColor color = colors[zone]; + unsigned char red = RGBGetRValue(color); + unsigned char grn = RGBGetGValue(color); + unsigned char blu = RGBGetBValue(color); + siberia->SetColor(red, grn, blu); +} + +void RGBController_SteelSeriesSiberia::UpdateSingleLED(int led) +{ + /* Each zone only has a single LED, so we can use the LED ID to reference + * the existing zone code. */ + UpdateZoneLEDs(led); +} + +void RGBController_SteelSeriesSiberia::SetCustomMode() +{ + active_mode = 0; +} + +void RGBController_SteelSeriesSiberia::UpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/RGBController/RGBController_SteelSeriesSiberia.h b/RGBController/RGBController_SteelSeriesSiberia.h new file mode 100644 index 000000000..367baeaf2 --- /dev/null +++ b/RGBController/RGBController_SteelSeriesSiberia.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| RGBController_SteelSeriesSiberia.h | +| | +| Generic RGB Interface SteelSeriesSiberia | +| Class | +| | +| E Karlsson (pilophae) 18/06/2020 | +\*-----------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "SteelSeriesSiberiaController.h" + +class RGBController_SteelSeriesSiberia : public RGBController +{ +public: + RGBController_SteelSeriesSiberia(SteelSeriesSiberiaController* siberia_ptr); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void UpdateMode(); + +private: + SteelSeriesSiberiaController* siberia; +};