diff --git a/60-openrgb.rules b/60-openrgb.rules index 56d45842..6603f4f8 100644 --- a/60-openrgb.rules +++ b/60-openrgb.rules @@ -792,6 +792,7 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="054c", ATTR{idProduct}=="0ba0", TAG+="uacces # SteelSeries Rival Sensei 310 # # Headsets: # # SteelSeries Siberia 350 # +# SteelSeries Arctis 5 # # Keyboards: # # SteelSeries Apex 3 # # SteelSeries Apex 5 # @@ -831,6 +832,7 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1824", TAG+="uacces SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="184c", TAG+="uaccess", TAG+="Rival3" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1229", TAG+="uaccess" +SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="12aa", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="161c", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1612", TAG+="uaccess" diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.cpp b/Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.cpp new file mode 100644 index 00000000..3057cfce --- /dev/null +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.cpp @@ -0,0 +1,98 @@ +/*-----------------------------------------*\ +| RGBController_SteelSeriesArctis5.cpp | +| | +| Generic RGB Interface SteelSeriesArctis5 | +| Class | +| | +| Morgan Guimard 3/04/2022 | +\*-----------------------------------------*/ + +#include "RGBController_SteelSeriesArctis5.h" + +RGBController_SteelSeriesArctis5::RGBController_SteelSeriesArctis5(SteelSeriesArctis5Controller* controller_ptr) +{ + controller = controller_ptr; + name = "SteelSeries Arctis 5 headset"; + vendor = "SteelSeries"; + type = DEVICE_TYPE_HEADSET; + description = name; + location = controller->GetDeviceLocation(); + serial = controller->GetSerialString(); + version = controller->GetFirmwareVersion(); + + mode Direct; + Direct.name = "Direct"; + Direct.value = 0x00; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + + modes.push_back(Direct); + + SetupZones(); +} + +RGBController_SteelSeriesArctis5::~RGBController_SteelSeriesArctis5() +{ + delete controller; +} + +void RGBController_SteelSeriesArctis5::SetupZones() +{ + const std::string zone_names[2] = + { + "Left" , "Right" + }; + + for(const std::string& zone_name : zone_names) + { + zone zone; + zone.name = zone_name; + zone.type = ZONE_TYPE_SINGLE; + zone.leds_min = 1; + zone.leds_max = 1; + zone.leds_count = 1; + zone.matrix_map = NULL; + zones.push_back(zone); + + led mouse_led; + mouse_led.name = zone_name; + leds.push_back(mouse_led); + } + + SetupColors(); +} + +void RGBController_SteelSeriesArctis5::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_SteelSeriesArctis5::DeviceUpdateLEDs() +{ + for(unsigned int i = 0; i < zones.size(); i++) + { + UpdateZoneLEDs(i); + } +} + +void RGBController_SteelSeriesArctis5::UpdateZoneLEDs(int zone) +{ + controller->SetColor(zone, colors[zone]); +} + +void RGBController_SteelSeriesArctis5::UpdateSingleLED(int led) +{ + UpdateZoneLEDs(led); +} + +void RGBController_SteelSeriesArctis5::SetCustomMode() +{ + active_mode = 0; +} + +void RGBController_SteelSeriesArctis5::DeviceUpdateMode() +{ + +} diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.h b/Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.h new file mode 100644 index 00000000..b631954d --- /dev/null +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.h @@ -0,0 +1,31 @@ +/*-----------------------------------------*\ +| RGBController_SteelSeriesArctis5.h | +| | +| Generic RGB Interface SteelSeriesArctis5 | +| Class | +| | +| Morgan Guimard 3/04/2022 | +\*-----------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "SteelSeriesArctis5Controller.h" + +class RGBController_SteelSeriesArctis5 : public RGBController +{ +public: + RGBController_SteelSeriesArctis5(SteelSeriesArctis5Controller* controller_ptr); + ~RGBController_SteelSeriesArctis5(); + + void SetupZones(); + void ResizeZone(int zone, int new_size); + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + SteelSeriesArctis5Controller* controller; +}; diff --git a/Controllers/SteelSeriesController/SteelSeriesArctis5Controller.cpp b/Controllers/SteelSeriesController/SteelSeriesArctis5Controller.cpp new file mode 100644 index 00000000..67b64253 --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesArctis5Controller.cpp @@ -0,0 +1,142 @@ +/*-----------------------------------------*\ +| SteelSeriesArctis5Controller.h | +| | +| Definitions and types for SteelSeries | +| Arctis 5 lighting controller | +| | +| Morgan Guimard 3/4/2022 | +\*-----------------------------------------*/ + +#include "SteelSeriesArctis5Controller.h" +#include + +SteelSeriesArctis5Controller::SteelSeriesArctis5Controller(hid_device* dev_handle, const hid_device_info& info) +{ + dev = dev_handle; + location = info.path; + version = ""; + + wchar_t serial_string[128]; + int ret = hid_get_serial_number_string(dev, serial_string, 128); + + if(ret != 0) + { + serial_number = ""; + } + else + { + std::wstring return_wstring = serial_string; + serial_number = std::string(return_wstring.begin(), return_wstring.end()); + } +} + +SteelSeriesArctis5Controller::~SteelSeriesArctis5Controller() +{ + hid_close(dev); +} + +std::string SteelSeriesArctis5Controller::GetDeviceLocation() +{ + return("HID: " + location); +} + +std::string SteelSeriesArctis5Controller::GetSerialString() +{ + return(serial_number); +} + +std::string SteelSeriesArctis5Controller::GetFirmwareVersion() +{ + return(version); +} + +void SteelSeriesArctis5Controller::SetColor(unsigned char zone_id, RGBColor color) +{ + unsigned char usb_buf[ARCTIS_5_REPORT_SIZE]; + + /*----------------------------------------------*\ + | Two packets are sent before a color change | + \*----------------------------------------------*/ + memset(usb_buf, 0x00, ARCTIS_5_REPORT_SIZE); + + usb_buf[0x00] = ARCTIS_5_REPORT_ID; + usb_buf[0x01] = 0x81; + usb_buf[0x02] = 0x43; + usb_buf[0x03] = 0x01; + usb_buf[0x04] = 0x22; + + hid_write(dev, usb_buf, ARCTIS_5_REPORT_SIZE); + + usb_buf[0x04] = 0x23; + + hid_write(dev, usb_buf, ARCTIS_5_REPORT_SIZE); + + /*----------------------------------------------*\ + | First packet: send color | + \*----------------------------------------------*/ + memset(usb_buf, 0x00, ARCTIS_5_REPORT_SIZE); + + usb_buf[0x00] = ARCTIS_5_REPORT_ID; + usb_buf[0x01] = 0x8A; + usb_buf[0x02] = 0x42; + + usb_buf[0x04] = 0x20; + usb_buf[0x05] = 0x41; + + usb_buf[0x07] = RGBGetRValue(color); + usb_buf[0x08] = RGBGetGValue(color); + usb_buf[0x09] = RGBGetBValue(color); + + usb_buf[0x0A] = 0xFF; + usb_buf[0x0B] = 0x32; + usb_buf[0x0C] = 0xC8; + usb_buf[0x0D] = 0xC8; + + hid_write(dev, usb_buf, ARCTIS_5_REPORT_SIZE); + + /*-----------------------------------------*\ + | Second packet: apply to zone | + \*-----------------------------------------*/ + memset(usb_buf, 0x00, ARCTIS_5_REPORT_SIZE); + + usb_buf[0x00] = ARCTIS_5_REPORT_ID; + usb_buf[0x01] = 0x8A; + usb_buf[0x02] = 0x42; + + usb_buf[0x04] = 0x20; + usb_buf[0x05] = 0x41; + usb_buf[0x06] = 0x08; + usb_buf[0x07] = zone_id; + usb_buf[0x08] = 0x01; + + hid_write(dev, usb_buf, ARCTIS_5_REPORT_SIZE); + + /*-----------------------------------------*\ + | Thrid packet: apply to zone | + \*-----------------------------------------*/ + memset(usb_buf, 0x00, ARCTIS_5_REPORT_SIZE); + + usb_buf[0x00] = ARCTIS_5_REPORT_ID; + usb_buf[0x01] = 0x8A; + usb_buf[0x02] = 0x42; + + usb_buf[0x04] = 0x20; + usb_buf[0x05] = 0x60; + usb_buf[0x06] = zone_id; + + hid_write(dev, usb_buf, ARCTIS_5_REPORT_SIZE); + + /*-----------------------------------------*\ + | Last packet: apply | + \*-----------------------------------------*/ + memset(usb_buf, 0x00, ARCTIS_5_REPORT_SIZE); + + usb_buf[0x00] = ARCTIS_5_REPORT_ID; + usb_buf[0x01] = 0x8A; + usb_buf[0x02] = 0x42; + + usb_buf[0x04] = 0x20; + usb_buf[0x05] = 0x05; + + hid_write(dev, usb_buf, ARCTIS_5_REPORT_SIZE); +} diff --git a/Controllers/SteelSeriesController/SteelSeriesArctis5Controller.h b/Controllers/SteelSeriesController/SteelSeriesArctis5Controller.h new file mode 100644 index 00000000..6734d0fa --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesArctis5Controller.h @@ -0,0 +1,36 @@ +/*-----------------------------------------*\ +| SteelSeriesArctis5Controller.h | +| | +| Definitions and types for SteelSeries | +| Arctis 5 lighting controller | +| | +| Morgan Guimard 3/4/2022 | +\*-----------------------------------------*/ +#pragma once + +#define ARCTIS_5_REPORT_SIZE 37 +#define ARCTIS_5_REPORT_ID 0x06 + +#include "RGBController.h" +#include +#include + +class SteelSeriesArctis5Controller +{ +public: + SteelSeriesArctis5Controller(hid_device* dev_handle, const hid_device_info& info); + + ~SteelSeriesArctis5Controller(); + + std::string GetDeviceLocation(); + std::string GetSerialString(); + std::string GetFirmwareVersion(); + void SetColor(unsigned char zone_id, RGBColor color); + +private: + std::string location; + std::string serial_number; + std::string version; + + hid_device* dev; +}; diff --git a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp index f97321e2..64c05cbc 100644 --- a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp @@ -9,6 +9,7 @@ #include "SteelSeriesApexMController.h" #include "SteelSeriesSenseiController.h" #include "SteelSeriesGeneric.h" +#include "SteelSeriesArctis5Controller.h" #include "RGBController.h" #include "RGBController_SteelSeriesRival.h" #include "RGBController_SteelSeriesRival3.h" @@ -18,6 +19,7 @@ #include "RGBController_SteelSeriesApexTZone.h" #include "RGBController_SteelSeriesOldApex.h" #include "RGBController_SteelSeriesSensei.h" +#include "RGBController_SteelSeriesArctis5.h" #include /*-----------------------------------------------------*\ @@ -57,6 +59,7 @@ | Headset product IDs | \*-----------------------------------------------------*/ #define STEELSERIES_SIBERIA_350_PID 0x1229 +#define STEELSERIES_ARCTIS_5_PID 0x12AA /*-----------------------------------------------------*\ | Mousemat product IDs | \*-----------------------------------------------------*/ @@ -247,6 +250,19 @@ void DetectSteelSeriesSensei(hid_device_info* info, const std::string& name) } } +void DetectSteelSeriesArctis5(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + SteelSeriesArctis5Controller* controller = new SteelSeriesArctis5Controller(dev, *info); + RGBController_SteelSeriesArctis5* rgb_controller = new RGBController_SteelSeriesArctis5(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*\ | Mice | \*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -280,6 +296,7 @@ REGISTER_HID_DETECTOR_I("SteelSeries Sensei 310", Dete | Headsets | \*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ REGISTER_HID_DETECTOR_I("SteelSeries Siberia 350", DetectSteelSeriesHeadset, STEELSERIES_VID, STEELSERIES_SIBERIA_350_PID, 3 ); +REGISTER_HID_DETECTOR_I("SteelSeries Arctis 5", DetectSteelSeriesArctis5, STEELSERIES_VID, STEELSERIES_ARCTIS_5_PID, 5 ); /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*\ | Mousemats | \*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ diff --git a/OpenRGB.pro b/OpenRGB.pro index 9295d704..7b119d4c 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -479,6 +479,7 @@ HEADERS += Controllers/SteelSeriesController/SteelSeriesApexController.h \ Controllers/SteelSeriesController/SteelSeriesApexTZoneController.h \ Controllers/SteelSeriesController/SteelSeriesApexMController.h \ + Controllers/SteelSeriesController/SteelSeriesArctis5Controller.h \ Controllers/SteelSeriesController/SteelSeriesGeneric.h \ Controllers/SteelSeriesController/SteelSeriesOldApexController.h \ Controllers/SteelSeriesController/SteelSeriesRivalController.h \ @@ -488,6 +489,7 @@ HEADERS += Controllers/SteelSeriesController/SteelSeriesQCKMatController.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesApex.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.h \ + Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesOldApex.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesRival.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.h \ @@ -943,6 +945,7 @@ SOURCES += Controllers/SteelSeriesController/SteelSeriesApexController.cpp \ Controllers/SteelSeriesController/SteelSeriesApexTZoneController.cpp \ Controllers/SteelSeriesController/SteelSeriesApexMController.cpp \ + Controllers/SteelSeriesController/SteelSeriesArctis5Controller.cpp \ Controllers/SteelSeriesController/SteelSeriesOldApexController.cpp \ Controllers/SteelSeriesController/SteelSeriesRivalController.cpp \ Controllers/SteelSeriesController/SteelSeriesRival3Controller.cpp \ @@ -952,6 +955,7 @@ SOURCES += Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesApex.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.cpp \ + Controllers/SteelSeriesController/RGBController_SteelSeriesArctis5.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesOldApex.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesRival.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp \