diff --git a/60-openrgb.rules b/60-openrgb.rules index e8113fe4..e70bd20b 100644 --- a/60-openrgb.rules +++ b/60-openrgb.rules @@ -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 # #---------------------------------------------------------------# diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesQCKMat.cpp b/Controllers/SteelSeriesController/RGBController_SteelSeriesQCKMat.cpp new file mode 100644 index 00000000..c3960d9e --- /dev/null +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesQCKMat.cpp @@ -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(); +} diff --git a/Controllers/SteelSeriesController/RGBController_SteelSeriesQCKMat.h b/Controllers/SteelSeriesController/RGBController_SteelSeriesQCKMat.h new file mode 100644 index 00000000..d27d9d44 --- /dev/null +++ b/Controllers/SteelSeriesController/RGBController_SteelSeriesQCKMat.h @@ -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; +}; diff --git a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp index 7bc32929..81947b47 100644 --- a/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp +++ b/Controllers/SteelSeriesController/SteelSeriesControllerDetect.cpp @@ -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 ); diff --git a/Controllers/SteelSeriesController/SteelSeriesQCKMatController.cpp b/Controllers/SteelSeriesController/SteelSeriesQCKMatController.cpp new file mode 100644 index 00000000..ea69cc79 --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesQCKMatController.cpp @@ -0,0 +1,99 @@ +/*-----------------------------------------*\ +| SteelSeriesQCKControllerMat.cpp | +| | +| Generic RGB Interface SteelSeriesQCK | +| Class | +| | +| Edbgon 22/05/2021 | +\*-----------------------------------------*/ + +#include "SteelSeriesQCKMatController.h" +#include + +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 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); +} diff --git a/Controllers/SteelSeriesController/SteelSeriesQCKMatController.h b/Controllers/SteelSeriesController/SteelSeriesQCKMatController.h new file mode 100644 index 00000000..d1b5c74a --- /dev/null +++ b/Controllers/SteelSeriesController/SteelSeriesQCKMatController.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| SteelSeriesQCKControllerMat.h | +| | +| Generic RGB Interface SteelSeriesQCK | +| Class | +| | +| Edbgon 22/05/2021 | +\*-----------------------------------------*/ + +#include "RGBController.h" +#include +#include + +#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 colors); + +private: + char device_name[32]; + hid_device* dev; + std::string location; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 0bdb0416..d392fea3 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -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 \