Add support for SteelSeries Apex 3 ten-zone keyboard

This commit is contained in:
edbgon 2021-10-06 22:29:14 +02:00 committed by Adam Honse
parent 7bb745823d
commit 87234f4f44
8 changed files with 287 additions and 0 deletions

View file

@ -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"

View file

@ -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();
}

View file

@ -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;
};

View file

@ -0,0 +1,96 @@
/*-----------------------------------------*\
| SteelSeriesApexTZoneController.cpp |
| |
| Edbgon 06.10.21 |
\*-----------------------------------------*/
#include "SteelSeriesApexTZoneController.h"
#include <cstring>
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<RGBColor> 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));
}

View file

@ -0,0 +1,40 @@
/*-----------------------------------------*\
| SteelSeriesApexTZoneController.h |
| |
| Edbgon 06.10.21 |
\*-----------------------------------------*/
#include <string>
#include <hidapi/hidapi.h>
#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<RGBColor> colors, unsigned char brightness);
void Save();
private:
char device_name[32];
hid_device* dev;
std::string location;
steelseries_type proto;
};

View file

@ -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 <hidapi/hidapi.h>
@ -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 );

View file

@ -28,5 +28,6 @@ typedef enum
SENSEI = 0x08,
RIVAL_600 = 0x09,
RIVAL_3 = 0x0a,
APEX_TZONE = 0x0b,
} steelseries_type;

View file

@ -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 \