diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp b/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp index 714befb3..f1f230ea 100644 --- a/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp @@ -16,7 +16,7 @@ @save :white_check_mark: @direct :white_check_mark: @effects :white_check_mark: - @detectors DetectSteelSeriesRival3,DetectSteelSeriesAerox3,DetectSteelSeriesAerox9 + @detectors DetectSteelSeriesRival3,DetectSteelSeriesAerox3,DetectSteelSeriesAerox5,DetectSteelSeriesAerox9 @comment \*-------------------------------------------------------------------*/ diff --git a/Controllers/SteelSeriesController/SteelSeriesAerox5Controller.cpp b/Controllers/SteelSeriesController/SteelSeriesAerox5Controller.cpp new file mode 100644 index 00000000..4207a7f7 --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesAerox5Controller.cpp @@ -0,0 +1,148 @@ +/*---------------------------------------------------------*\ +| SteelSeriesAerox5Controller.cpp | +| | +| Controller for the Steelseries Aerox5 Wired | +| | +| Bobby Quantum (BobbyQuantum) 19 May 2024 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-only | +\*---------------------------------------------------------*/ + +#include "SteelSeriesAerox5Controller.h" +#include "LogManager.h" + +SteelSeriesAerox5Controller::SteelSeriesAerox5Controller(hid_device* dev_handle, steelseries_type proto_type, const char* path) + : SteelSeriesMouseController(dev_handle, proto_type, path) +{ + SendInit(); +} + +SteelSeriesAerox5Controller::~SteelSeriesAerox5Controller() +{ + hid_close(dev); +} + +void SteelSeriesAerox5Controller::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_AEROX5_PACKET_SIZE] = { 0x00, 0x2D }; + + hid_send_feature_report(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE); +} + +std::string SteelSeriesAerox5Controller::GetFirmwareVersion() +{ + uint8_t result = 0; + const uint8_t CMD = 0x90; + const uint8_t sz = 16; + char version[sz + 1]; + + uint8_t buffer[STEELSERIES_AEROX5_PACKET_SIZE] = { 0x00, CMD, 0x00 }; + + hid_send_feature_report(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE); + do + { + result = hid_read_timeout(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE, STEELSERIES_AEROX5_TIMEOUT); + LOG_DEBUG("[%s] Reading version buffer: Bytes Read %d Buffer %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", STEELSERIES_AEROX5_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); + version[sz] = 0; + std::string tmp = std::string(version); + LOG_DEBUG("[%s] Version: %s as string %s", STEELSERIES_AEROX5_NAME, version, tmp.c_str()); + + return tmp; + } + else + { + LOG_DEBUG("[%s] Unable to get version: giving up!", STEELSERIES_AEROX5_NAME); + return ""; + } +} + +steelseries_mouse SteelSeriesAerox5Controller::GetMouse() +{ + return aerox_5; +} + +void SteelSeriesAerox5Controller::SetLightEffectAll(uint8_t /*effect*/) +{ + /*-----------------------------------------------------------------*\ + | Not used by this device | + \*-----------------------------------------------------------------*/ +} + +void SteelSeriesAerox5Controller::SetColor + ( + unsigned char zone_id, + unsigned char red, + unsigned char green, + unsigned char blue, + unsigned char brightness + ) +{ + uint8_t buffer[STEELSERIES_AEROX5_PACKET_SIZE] = { 0x00, 0x21, 0x01 }; + + uint8_t offset = 0x03; + + switch (zone_id) + { + case 0: + offset = 0x03; + break; + case 1: + buffer[2] = 0x02; + offset = 0x06; + break; + case 2: + buffer[2] = 0x04; + offset = 0x09; + break; + case 3: + buffer[1] = 0x26; + offset = 0x04; + break; + default: + return; + } + + buffer[offset] = red; + buffer[offset + 1] = green; + buffer[offset + 2] = blue; + + hid_write(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE); + std::this_thread::sleep_for(std::chrono::milliseconds(2)); + + if (brightness != current_brightness) + { + SetBrightness(brightness); + current_brightness = brightness; + } +} + +void SteelSeriesAerox5Controller::SetBrightness(uint8_t brightness) +{ + uint8_t buffer[3] = { 0x00, 0x23, brightness }; + + hid_write(dev, buffer, STEELSERIES_AEROX5_PACKET_SIZE); + + std::this_thread::sleep_for(std::chrono::milliseconds(2)); +} + +void SteelSeriesAerox5Controller::Save() +{ + uint8_t buffer2[3] = { 0x00, 0x11, 0x00 }; + + hid_write(dev, buffer2, STEELSERIES_AEROX5_PACKET_SIZE); +} diff --git a/Controllers/SteelSeriesController/SteelSeriesAerox5Controller.h b/Controllers/SteelSeriesController/SteelSeriesAerox5Controller.h new file mode 100644 index 00000000..ab658880 --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesAerox5Controller.h @@ -0,0 +1,60 @@ +/*---------------------------------------------------------*\ +| SteelSeriesAerox5Controller.h | +| | +| Controller for the Steelseries Aerox5 Wired | +| | +| Bobby Quantum (BobbyQuantum) 19 May 2024 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-only | +\*---------------------------------------------------------*/ + +#include +#include +#include +#include "RGBController.h" +#include "SteelSeriesGeneric.h" +#include "SteelSeriesMouseController.h" + +#pragma once + +#define STEELSERIES_AEROX5_NAME "SteelSeries Aerox 5" +#define STEELSERIES_AEROX5_PACKET_SIZE 65 +#define STEELSERIES_AEROX5_TIMEOUT 250 + +static const steelseries_mouse aerox_5 = +{ + { 0x04 }, + { + {"Front", 0 }, + {"Middle", 1 }, + {"Rear", 2 }, + {"Reactive", 3 }, + } +}; + + +class SteelSeriesAerox5Controller : public SteelSeriesMouseController +{ +public: + SteelSeriesAerox5Controller(hid_device *dev_handle, + steelseries_type proto_type, + const char *path); + ~SteelSeriesAerox5Controller(); + + 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 293b4582..816d7d95 100644 --- a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp @@ -3,6 +3,7 @@ #include "RGBController.h" #include "SteelSeriesGeneric.h" +#include "SteelSeriesAerox5Controller.h" #include "SteelSeriesAerox9Controller.h" #include "SteelSeriesArctis5Controller.h" #include "SteelSeriesApex8ZoneController.h" @@ -34,6 +35,7 @@ | Mouse product IDs | \*-----------------------------------------------------*/ #define STEELSERIES_AEROX_3_PID 0x1836 +#define STEELSERIES_AEROX_5_PID 0x1850 #define STEELSERIES_AEROX_9_PID 0x185A #define STEELSERIES_RIVAL_100_PID 0x1702 #define STEELSERIES_RIVAL_100_DOTA_PID 0x170C @@ -103,6 +105,18 @@ void DetectSteelSeriesAerox3(hid_device_info* info, const std::string& name) } } +void DetectSteelSeriesAerox5(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + if(dev) + { + SteelSeriesAerox5Controller* controller = new SteelSeriesAerox5Controller(dev, AEROX_3, info->path); + RGBController_SteelSeriesRival3* rgb_controller = new RGBController_SteelSeriesRival3(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + void DetectSteelSeriesAerox9(hid_device_info* info, const std::string& name) { hid_device* dev = hid_open_path(info->path); @@ -302,6 +316,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_IPU("SteelSeries Aerox 5 Wired", DetectSteelSeriesAerox5, STEELSERIES_VID, STEELSERIES_AEROX_5_PID, 3, 0xFFC0, 1 ); REGISTER_HID_DETECTOR_IPU("SteelSeries Aerox 9 Wired", DetectSteelSeriesAerox9, STEELSERIES_VID, STEELSERIES_AEROX_9_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 );