diff --git a/60-openrgb.rules b/60-openrgb.rules index b2e32118..a1f845d6 100644 --- a/60-openrgb.rules +++ b/60-openrgb.rules @@ -743,6 +743,7 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="054c", ATTR{idProduct}=="0ba0", TAG+="uacces # Headsets: # # SteelSeries Siberia 350 # # Keyboards: # +# SteelSeries Apex 3 # # SteelSeries Apex 5 # # SteelSeries Apex 7 # # SteelSeries Apex 7 TKL # @@ -786,6 +787,7 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1612", TAG+="uacces SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1618", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1610", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1614", TAG+="uaccess" +SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="161a", TAG+="uaccess", TAG+="Apex3" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="0616", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1202", TAG+="uaccess" SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1206", TAG+="uaccess" diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.cpp b/Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.cpp new file mode 100644 index 00000000..44d316e5 --- /dev/null +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.cpp @@ -0,0 +1,96 @@ +/*-----------------------------------------*\ +| RGBController_SteelSeriesApexTZone.cpp | +| | +| Edbgon 06.10.21 | +\*-----------------------------------------*/ + +#include "RGBController_SteelSeriesApexTZone.h" + +RGBController_SteelSeriesApexTZone::RGBController_SteelSeriesApexTZone(SteelSeriesApexTZoneController* apex_tzone_ptr) +{ + ApexTZone = apex_tzone_ptr; + + name = ApexTZone->GetDeviceName(); + vendor = "SteelSeries"; + type = DEVICE_TYPE_KEYBOARD; + description = "SteelSeries Apex 3 device"; + location = ApexTZone->GetDeviceLocation(); + serial = ApexTZone->GetSerialString(); + + mode direct; + direct.name = "Direct"; + direct.value = 0; + 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 = 0x64; + direct.brightness = 0x64; + modes.push_back(direct); + + SetupZones(); +} + +RGBController_SteelSeriesApexTZone::~RGBController_SteelSeriesApexTZone() +{ + delete ApexTZone; +} + + +void RGBController_SteelSeriesApexTZone::DeviceSaveMode() +{ + ApexTZone->Save(); +} + +void RGBController_SteelSeriesApexTZone::SetupZones() +{ + for (int i = 1; i <= 10; i++) + { + zone curr_zone; + curr_zone.name = "Zone " + std::to_string(i); + curr_zone.type = ZONE_TYPE_LINEAR; + curr_zone.leds_min = 1; + curr_zone.leds_max = 1; + curr_zone.leds_count = 1; + curr_zone.matrix_map = NULL; + zones.push_back(curr_zone); + + led zone_led; + zone_led.name = "Zone " + std::to_string(i); + leds.push_back(zone_led); + } + + SetupColors(); +} + +void RGBController_SteelSeriesApexTZone::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_SteelSeriesApexTZone::DeviceUpdateLEDs() +{ + ApexTZone->SetColor(colors, modes[active_mode].brightness); +} + +void RGBController_SteelSeriesApexTZone::UpdateZoneLEDs(int /*zone*/) +{ + DeviceUpdateLEDs(); +} + + +void RGBController_SteelSeriesApexTZone::UpdateSingleLED(int /*led*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_SteelSeriesApexTZone::SetCustomMode() +{ + active_mode = 0; +} + +void RGBController_SteelSeriesApexTZone::DeviceUpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.h b/Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.h new file mode 100644 index 00000000..ea235adb --- /dev/null +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.h @@ -0,0 +1,32 @@ +/*-----------------------------------------*\ +| RGBController_SteelSeriesApexTZone.h | +| | +| Edbgon 06.10.21 | +\*-----------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "SteelSeriesApexTZoneController.h" + +class RGBController_SteelSeriesApexTZone : public RGBController +{ +public: + RGBController_SteelSeriesApexTZone(SteelSeriesApexTZoneController* apex_tzone_ptr); + ~RGBController_SteelSeriesApexTZone(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + void DeviceSaveMode(); + +private: + SteelSeriesApexTZoneController* ApexTZone; +}; diff --git a/Controllers/SteelSeriesController/SteelSeriesApexTZoneController.cpp b/Controllers/SteelSeriesController/SteelSeriesApexTZoneController.cpp new file mode 100644 index 00000000..087f4b19 --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesApexTZoneController.cpp @@ -0,0 +1,96 @@ +/*-----------------------------------------*\ +| SteelSeriesApexTZoneController.cpp | +| | +| Edbgon 06.10.21 | +\*-----------------------------------------*/ + + +#include "SteelSeriesApexTZoneController.h" +#include + +SteelSeriesApexTZoneController::SteelSeriesApexTZoneController + ( + hid_device* dev_handle, + steelseries_type proto_type, + const char* path + ) +{ + dev = dev_handle; + location = path; + proto = proto_type; +} + +SteelSeriesApexTZoneController::~SteelSeriesApexTZoneController() +{ + hid_close(dev); +} + +std::string SteelSeriesApexTZoneController::GetDeviceLocation() +{ + return("HID: " + location); +} + +char* SteelSeriesApexTZoneController::GetDeviceName() +{ + return device_name; +} + +std::string SteelSeriesApexTZoneController::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 SteelSeriesApexTZoneController::GetKeyboardType() +{ + return proto; +} + +void SteelSeriesApexTZoneController::Save() +{ + unsigned char buf[33] = { 0x00 }; + memset(buf, 0x00, sizeof(buf)); + buf[0x01] = 0x06; + buf[0x03] = 0x08; + hid_write(dev, buf, sizeof(buf)); + + memset(buf, 0x00, sizeof(buf)); + buf[0x01] = 0x09; + hid_write(dev, buf, sizeof(buf)); +} + +void SteelSeriesApexTZoneController::SetColor(std::vector colors, unsigned char brightness) +{ + unsigned char buf[33] = { 0x00 }; + + /*-----------------------------------------------------*\ + | Zero out buffer, set up packet and send | + \*-----------------------------------------------------*/ + + memset(buf, 0x00, sizeof(buf)); + buf[0x01] = 0x0A; + buf[0x03] = brightness; + hid_write(dev, buf, sizeof(buf)); + + memset(buf, 0x00, sizeof(buf)); + buf[0x01] = 0x0B; + + for(int i = 0; i < 10; i++) + { + buf[(3*i)+3] = RGBGetRValue(colors[i]);; + buf[(3*i)+4] = RGBGetGValue(colors[i]);; + buf[(3*i)+5] = RGBGetBValue(colors[i]);; + } + + hid_write(dev, buf, sizeof(buf)); +} diff --git a/Controllers/SteelSeriesController/SteelSeriesApexTZoneController.h b/Controllers/SteelSeriesController/SteelSeriesApexTZoneController.h new file mode 100644 index 00000000..986533f8 --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesApexTZoneController.h @@ -0,0 +1,40 @@ +/*-----------------------------------------*\ +| SteelSeriesApexTZoneController.h | +| | +| Edbgon 06.10.21 | +\*-----------------------------------------*/ + +#include +#include + +#include "SteelSeriesGeneric.h" +#include "SteelSeriesApexBaseController.h" + +#pragma once + +class SteelSeriesApexTZoneController +{ +public: + SteelSeriesApexTZoneController + ( + hid_device* dev_handle, + steelseries_type proto_type, + const char* path + ); + + ~SteelSeriesApexTZoneController(); + + std::string GetDeviceLocation(); + char* GetDeviceName(); + std::string GetSerialString(); + steelseries_type GetKeyboardType(); + + void SetColor(std::vector colors, unsigned char brightness); + void Save(); + +private: + char device_name[32]; + hid_device* dev; + std::string location; + steelseries_type proto; +}; diff --git a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp index 72045f50..2e8f5b89 100644 --- a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp @@ -4,6 +4,7 @@ #include "SteelSeriesSiberiaController.h" #include "SteelSeriesQCKMatController.h" #include "SteelSeriesApexController.h" +#include "SteelSeriesApexTZoneController.h" #include "SteelSeriesOldApexController.h" #include "SteelSeriesApexMController.h" #include "SteelSeriesSenseiController.h" @@ -14,6 +15,7 @@ #include "RGBController_SteelSeriesSiberia.h" #include "RGBController_SteelSeriesQCKMat.h" #include "RGBController_SteelSeriesApex.h" +#include "RGBController_SteelSeriesApexTZone.h" #include "RGBController_SteelSeriesOldApex.h" #include "RGBController_SteelSeriesSensei.h" #include @@ -63,6 +65,7 @@ /*-----------------------------------------------------*\ | Keyboard product IDs | \*-----------------------------------------------------*/ +#define STEELSERIES_APEX_3_PID 0x161A #define STEELSERIES_APEX_5_PID 0x161C #define STEELSERIES_APEX_7_PID 0x1612 #define STEELSERIES_APEX_7_TKL_PID 0x1618 @@ -72,6 +75,18 @@ #define STEELSERIES_APEX_OG_PID 0x1202 #define STEELSERIES_APEX_350_PID 0x1206 +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; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + void DetectSteelSeriesApex(hid_device_info* info, const std::string& name) { hid_device* dev = hid_open_path(info->path); @@ -258,6 +273,7 @@ REGISTER_HID_DETECTOR_I("SteelSeries QCK Prism Cloth 4XL", Det /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*\ | Keyboards | \*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +REGISTER_HID_DETECTOR_I("SteelSeries Apex 3", DetectSteelSeriesApexTZone, STEELSERIES_VID, STEELSERIES_APEX_3_PID, 3 ); REGISTER_HID_DETECTOR_I("SteelSeries Apex 5", DetectSteelSeriesApex, STEELSERIES_VID, STEELSERIES_APEX_5_PID, 1 ); REGISTER_HID_DETECTOR_I("SteelSeries Apex 7", DetectSteelSeriesApex, STEELSERIES_VID, STEELSERIES_APEX_7_PID, 1 ); REGISTER_HID_DETECTOR_I("SteelSeries Apex 7 TKL", DetectSteelSeriesApexTKL, STEELSERIES_VID, STEELSERIES_APEX_7_TKL_PID, 1 ); diff --git a/Controllers/SteelSeriesController/SteelSeriesGeneric.h b/Controllers/SteelSeriesController/SteelSeriesGeneric.h index 247b8021..36829812 100644 --- a/Controllers/SteelSeriesController/SteelSeriesGeneric.h +++ b/Controllers/SteelSeriesController/SteelSeriesGeneric.h @@ -28,5 +28,6 @@ typedef enum SENSEI = 0x08, RIVAL_600 = 0x09, RIVAL_3 = 0x0a, + APEX_TZONE = 0x0b, } steelseries_type; diff --git a/OpenRGB.pro b/OpenRGB.pro index 67dd44f6..900310d8 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -429,6 +429,7 @@ HEADERS += Controllers/SteelSeriesController/color32.h \ Controllers/SteelSeriesController/SteelSeriesApexBaseController.h \ Controllers/SteelSeriesController/SteelSeriesApexController.h \ + Controllers/SteelSeriesController/SteelSeriesApexTZoneController.h \ Controllers/SteelSeriesController/SteelSeriesApexMController.h \ Controllers/SteelSeriesController/SteelSeriesGeneric.h \ Controllers/SteelSeriesController/SteelSeriesOldApexController.h \ @@ -438,6 +439,7 @@ HEADERS += Controllers/SteelSeriesController/SteelSeriesSiberiaController.h \ Controllers/SteelSeriesController/SteelSeriesQCKMatController.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesApex.h \ + Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesOldApex.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesRival.h \ Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.h \ @@ -835,6 +837,7 @@ SOURCES += Controllers/SonyDS4Controller/SonyDS4ControllerDetect.cpp \ Controllers/SonyDS4Controller/RGBController_SonyDS4.cpp \ Controllers/SteelSeriesController/SteelSeriesApexController.cpp \ + Controllers/SteelSeriesController/SteelSeriesApexTZoneController.cpp \ Controllers/SteelSeriesController/SteelSeriesApexMController.cpp \ Controllers/SteelSeriesController/SteelSeriesOldApexController.cpp \ Controllers/SteelSeriesController/SteelSeriesRivalController.cpp \ @@ -844,6 +847,7 @@ SOURCES += Controllers/SteelSeriesController/SteelSeriesQCKMatController.cpp \ Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesApex.cpp \ + Controllers/SteelSeriesController/RGBController_SteelSeriesApexTZone.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesOldApex.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesRival.cpp \ Controllers/SteelSeriesController/RGBController_SteelSeriesRival3.cpp \