New controller for SteelSeries QCK Mousemat

This commit is contained in:
edbgon 2021-05-22 22:00:03 +02:00 committed by Adam Honse
parent fd31b4db7d
commit a8e2feddbe
7 changed files with 294 additions and 0 deletions

View file

@ -680,6 +680,8 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="054c", ATTR{idProduct}=="0ba0", TAG+="uacces
# SteelSeries Apex M750 #
# SteelSeries Apex OG #
# SteelSeries Apex 350 #
# Mousemats: #
# SteelSeries QCK Prism Cloth #
#---------------------------------------------------------------#
SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1702", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="170c", TAG+="uaccess"
@ -710,6 +712,8 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="0616", TAG+="uacces
SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1202", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1206", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="150d", TAG+="uaccess"
#---------------------------------------------------------------#
# Tecknet Devices #
#---------------------------------------------------------------#

View file

@ -0,0 +1,98 @@
/*-----------------------------------------*\
| RGBController_SteelSeriesQCKMat.cpp |
| |
| Generic RGB Interface SteelSeriesQCK |
| Class |
| |
| Edbgon 22/05/2021 |
\*-----------------------------------------*/
#include "RGBController_SteelSeriesQCKMat.h"
RGBController_SteelSeriesQCKMat::RGBController_SteelSeriesQCKMat(SteelSeriesQCKMatController* qck_ptr)
{
qck = qck_ptr;
name = qck->GetDeviceName();
vendor = "SteelSeries";
type = DEVICE_TYPE_MOUSEMAT;
description = "SteelSeries QCK Mat Device";
location = qck->GetDeviceLocation();
serial = qck->GetSerialString();
mode Direct;
Direct.name = "Direct";
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
SetupZones();
}
RGBController_SteelSeriesQCKMat::~RGBController_SteelSeriesQCKMat()
{
delete qck;
}
void RGBController_SteelSeriesQCKMat::SetupZones()
{
/*---------------------------------------------------------*\
| QCK has two zones |
\*---------------------------------------------------------*/
zone mousemat_zone;
mousemat_zone.name = "Mousemat";
mousemat_zone.type = ZONE_TYPE_SINGLE;
mousemat_zone.leds_min = 2;
mousemat_zone.leds_max = 2;
mousemat_zone.leds_count = 2;
mousemat_zone.matrix_map = NULL;
zones.push_back(mousemat_zone);
led bot_led;
bot_led.name = "Mat Bottom LED";
leds.push_back(bot_led);
led top_led;
top_led.name = "Mat Top LED";
leds.push_back(top_led);
SetupColors();
}
void RGBController_SteelSeriesQCKMat::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_SteelSeriesQCKMat::DeviceUpdateLEDs()
{
qck->SetColors(colors);
}
void RGBController_SteelSeriesQCKMat::UpdateZoneLEDs(int /*zone*/)
{
/*---------------------------------------------------------*\
| Packet expects both LEDs |
\*---------------------------------------------------------*/
DeviceUpdateLEDs();
}
void RGBController_SteelSeriesQCKMat::UpdateSingleLED(int /*led*/)
{
/*---------------------------------------------------------*\
| Packet expects both LEDs |
\*---------------------------------------------------------*/
DeviceUpdateLEDs();
}
void RGBController_SteelSeriesQCKMat::SetCustomMode()
{
active_mode = 0;
}
void RGBController_SteelSeriesQCKMat::DeviceUpdateMode()
{
DeviceUpdateLEDs();
}

View file

@ -0,0 +1,34 @@
/*-----------------------------------------*\
| RGBController_SteelSeriesQCKMat.h |
| |
| Generic RGB Interface SteelSeriesQCK |
| Class |
| |
| Edbgon 22/05/2021 |
\*-----------------------------------------*/
#pragma once
#include "RGBController.h"
#include "SteelSeriesQCKMatController.h"
class RGBController_SteelSeriesQCKMat : public RGBController
{
public:
RGBController_SteelSeriesQCKMat(SteelSeriesQCKMatController* qck_ptr);
~RGBController_SteelSeriesQCKMat();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
SteelSeriesQCKMatController* qck;
};

View file

@ -1,6 +1,7 @@
#include "Detector.h"
#include "SteelSeriesRivalController.h"
#include "SteelSeriesSiberiaController.h"
#include "SteelSeriesQCKMatController.h"
#include "SteelSeriesApexController.h"
#include "SteelSeriesOldApexController.h"
#include "SteelSeriesApexMController.h"
@ -9,6 +10,7 @@
#include "RGBController.h"
#include "RGBController_SteelSeriesRival.h"
#include "RGBController_SteelSeriesSiberia.h"
#include "RGBController_SteelSeriesQCKMat.h"
#include "RGBController_SteelSeriesApex.h"
#include "RGBController_SteelSeriesOldApex.h"
#include "RGBController_SteelSeriesSensei.h"
@ -44,6 +46,10 @@
\*-----------------------------------------------------*/
#define STEELSERIES_SIBERIA_350_PID 0x1229
/*-----------------------------------------------------*\
| Mousemat product IDs |
\*-----------------------------------------------------*/
#define STEELSERIES_QCK_PRISM_CLOTH 0x150D
/*-----------------------------------------------------*\
| Keyboard product IDs |
\*-----------------------------------------------------*/
#define STEELSERIES_APEX_5_PID 0x161C
@ -115,6 +121,18 @@ void DetectSteelSeriesHeadset(hid_device_info* info, const std::string& name)
}
}
void DetectSteelSeriesMousemat(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
SteelSeriesQCKMatController* controller = new SteelSeriesQCKMatController(dev, info->path);
RGBController_SteelSeriesQCKMat* rgb_controller = new RGBController_SteelSeriesQCKMat(controller);
rgb_controller->name = name;
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
void DetectSteelSeriesRival100(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
@ -177,6 +195,10 @@ REGISTER_HID_DETECTOR_I("SteelSeries Sensei 310", Dete
\*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
REGISTER_HID_DETECTOR_I("SteelSeries Siberia 350", DetectSteelSeriesHeadset, STEELSERIES_VID, STEELSERIES_SIBERIA_350_PID, 3 );
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*\
| Mousemats |
\*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
REGISTER_HID_DETECTOR_I("SteelSeries QCK Prism Cloth", DetectSteelSeriesMousemat, STEELSERIES_VID, STEELSERIES_QCK_PRISM_CLOTH, 0 );
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*\
| Keyboards |
\*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
REGISTER_HID_DETECTOR_I("SteelSeries Apex 5", DetectSteelSeriesApex, STEELSERIES_VID, STEELSERIES_APEX_5_PID, 1 );

View file

@ -0,0 +1,99 @@
/*-----------------------------------------*\
| SteelSeriesQCKControllerMat.cpp |
| |
| Generic RGB Interface SteelSeriesQCK |
| Class |
| |
| Edbgon 22/05/2021 |
\*-----------------------------------------*/
#include "SteelSeriesQCKMatController.h"
#include <cstring>
SteelSeriesQCKMatController::SteelSeriesQCKMatController(hid_device* dev_handle, const char* path)
{
dev = dev_handle;
location = path;
}
SteelSeriesQCKMatController::~SteelSeriesQCKMatController()
{
hid_close(dev);
}
std::string SteelSeriesQCKMatController::GetDeviceLocation()
{
return("HID: " + location);
}
char* SteelSeriesQCKMatController::GetDeviceName()
{
return device_name;
}
std::string SteelSeriesQCKMatController::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);
}
void SteelSeriesQCKMatController::SetColors(std::vector<RGBColor> colors)
{
unsigned char buf[525];
unsigned char cbuf[65];
/*-----------------------------------------------------*\
| Zero out buffer |
\*-----------------------------------------------------*/
memset(buf, 0x00, sizeof(buf));
memset(cbuf, 0x00, sizeof(cbuf));
/*-----------------------------------------------------*\
| Set up Direct packet |
\*-----------------------------------------------------*/
buf[0x00] = 0x00;
buf[0x01] = 0x0E;
buf[0x03] = 0x02;
buf[0x08] = 0xFF;
buf[0x09] = 0x32;
buf[0x0A] = 0xC8;
buf[0x0E] = 0x01;
buf[0x14] = 0xFF;
buf[0x15] = 0x32;
buf[0x16] = 0xC8;
buf[0x19] = 0x01;
buf[0x1A] = 0x01;
buf[0x1C] = 0x01;
/*-----------------------------------------------------*\
| Fill in color data |
\*-----------------------------------------------------*/
buf[0x05] = RGBGetRValue(colors[0]);
buf[0x06] = RGBGetGValue(colors[0]);
buf[0x07] = RGBGetBValue(colors[0]);
buf[0x11] = RGBGetRValue(colors[1]);
buf[0x12] = RGBGetGValue(colors[1]);
buf[0x13] = RGBGetBValue(colors[1]);
/*-----------------------------------------------------*\
| Send packet |
\*-----------------------------------------------------*/
hid_send_feature_report(dev, buf, 525);
cbuf[0x01] = 0x0D;
hid_write(dev, cbuf, 65);
}

View file

@ -0,0 +1,33 @@
/*-----------------------------------------*\
| SteelSeriesQCKControllerMat.h |
| |
| Generic RGB Interface SteelSeriesQCK |
| Class |
| |
| Edbgon 22/05/2021 |
\*-----------------------------------------*/
#include "RGBController.h"
#include <string>
#include <hidapi/hidapi.h>
#pragma once
class SteelSeriesQCKMatController
{
public:
SteelSeriesQCKMatController(hid_device* dev_handle, const char* path);
~SteelSeriesQCKMatController();
std::string GetDeviceLocation();
char* GetDeviceName();
std::string GetSerialString();
void SetColors(std::vector<RGBColor> colors);
private:
char device_name[32];
hid_device* dev;
std::string location;
};

View file

@ -338,10 +338,12 @@ HEADERS +=
Controllers/SteelSeriesController/SteelSeriesRivalController.h \
Controllers/SteelSeriesController/SteelSeriesSenseiController.h \
Controllers/SteelSeriesController/SteelSeriesSiberiaController.h \
Controllers/SteelSeriesController/SteelSeriesQCKMatController.h \
Controllers/SteelSeriesController/RGBController_SteelSeriesApex.h \
Controllers/SteelSeriesController/RGBController_SteelSeriesOldApex.h \
Controllers/SteelSeriesController/RGBController_SteelSeriesRival.h \
Controllers/SteelSeriesController/RGBController_SteelSeriesSiberia.h \
Controllers/SteelSeriesController/RGBController_SteelSeriesQCKMat.h \
Controllers/SteelSeriesController/RGBController_SteelSeriesSensei.h \
Controllers/TecknetController/TecknetController.h \
Controllers/TecknetController/RGBController_Tecknet.h \
@ -621,12 +623,14 @@ SOURCES +=
Controllers/SteelSeriesController/SteelSeriesRivalController.cpp \
Controllers/SteelSeriesController/SteelSeriesSenseiController.cpp \
Controllers/SteelSeriesController/SteelSeriesSiberiaController.cpp \
Controllers/SteelSeriesController/SteelSeriesQCKMatController.cpp \
Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp \
Controllers/SteelSeriesController/RGBController_SteelSeriesApex.cpp \
Controllers/SteelSeriesController/RGBController_SteelSeriesOldApex.cpp \
Controllers/SteelSeriesController/RGBController_SteelSeriesRival.cpp \
Controllers/SteelSeriesController/RGBController_SteelSeriesSensei.cpp \
Controllers/SteelSeriesController/RGBController_SteelSeriesSiberia.cpp \
Controllers/SteelSeriesController/RGBController_SteelSeriesQCKMat.cpp \
Controllers/TecknetController/TecknetController.cpp \
Controllers/TecknetController/TecknetControllerDetect.cpp \
Controllers/TecknetController/RGBController_Tecknet.cpp \