diff --git a/Controllers/RoccatController/RGBController_RoccatElo.cpp b/Controllers/RoccatController/RGBController_RoccatElo.cpp new file mode 100644 index 00000000..ff4bceff --- /dev/null +++ b/Controllers/RoccatController/RGBController_RoccatElo.cpp @@ -0,0 +1,85 @@ +#include "RGBController_RoccatElo.h" + +#include +#include + +/**------------------------------------------------------------------*\ + @name Roccat Elo 7.1 + @category Headset + @type USB + @save :x: + @direct :white_check_mark: + @effects :x: + @detectors DetectRoccatEloControllers + @comment +\*-------------------------------------------------------------------*/ + +RGBController_RoccatElo::RGBController_RoccatElo(RoccatEloController* controller_ptr) +{ + controller = controller_ptr; + name = "Roccat Elo 7.1"; + vendor = "Roccat"; + type = DEVICE_TYPE_HEADSET; + description = name; + location = controller->GetDeviceLocation(); + serial = controller->GetSerialString(); + version = ""; + + 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_RoccatElo::~RGBController_RoccatElo() +{ + delete controller; +} + +void RGBController_RoccatElo::SetupZones() +{ + zone new_zone; + + new_zone.name = "Headset"; + new_zone.type = ZONE_TYPE_LINEAR; + new_zone.leds_min = ROCCAT_ELO_LEDS_COUNT; + new_zone.leds_max = ROCCAT_ELO_LEDS_COUNT; + new_zone.leds_count = ROCCAT_ELO_LEDS_COUNT; + new_zone.matrix_map = nullptr; + + zones.emplace_back(new_zone); + + leds.resize(new_zone.leds_count); + + SetupColors(); +} + +void RGBController_RoccatElo::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_RoccatElo::DeviceUpdateLEDs() +{ + controller->SendDirect(colors[0]); +} + +void RGBController_RoccatElo::UpdateZoneLEDs(int /*zone*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_RoccatElo::UpdateSingleLED(int /*led*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_RoccatElo::DeviceUpdateMode() +{ + +} diff --git a/Controllers/RoccatController/RGBController_RoccatElo.h b/Controllers/RoccatController/RGBController_RoccatElo.h new file mode 100644 index 00000000..77871b3e --- /dev/null +++ b/Controllers/RoccatController/RGBController_RoccatElo.h @@ -0,0 +1,23 @@ +#pragma once + +#include "RGBController.h" +#include "RoccatEloController.h" + +class RGBController_RoccatElo : public RGBController +{ +public: + RGBController_RoccatElo(RoccatEloController* controller_ptr); + ~RGBController_RoccatElo(); + + void SetupZones(); + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void DeviceUpdateMode(); + +private: + RoccatEloController* controller; +}; diff --git a/Controllers/RoccatController/RoccatControllerDetect.cpp b/Controllers/RoccatController/RoccatControllerDetect.cpp index 5ebc3a05..1667388b 100644 --- a/Controllers/RoccatController/RoccatControllerDetect.cpp +++ b/Controllers/RoccatController/RoccatControllerDetect.cpp @@ -11,12 +11,14 @@ #include "RoccatKoneAimoController.h" #include "RoccatVulcanAimoController.h" #include "RoccatKovaController.h" +#include "RoccatEloController.h" #include "RGBController.h" #include "RGBController_RoccatBurst.h" #include "RGBController_RoccatHordeAimo.h" #include "RGBController_RoccatKoneAimo.h" #include "RGBController_RoccatVulcanAimo.h" #include "RGBController_RoccatKova.h" +#include "RGBController_RoccatElo.h" #include #include @@ -29,6 +31,7 @@ #define ROCCAT_BURST_CORE_PID 0x2DE6 #define ROCCAT_BURST_PRO_PID 0x2DE1 #define ROCCAT_KOVA_PID 0x2CEE +#define ROCCAT_ELO_PID 0x3A34 void DetectRoccatMouseControllers(hid_device_info* info, const std::string& name) { @@ -142,7 +145,7 @@ void DetectRoccatBurstCoreControllers(hid_device_info* info, const std::string& { RoccatBurstController * controller = new RoccatBurstController(dev, *info); RGBController_RoccatBurst * rgb_controller = new RGBController_RoccatBurst(controller, ROCCAT_BURST_CORE_NUMBER_OF_LEDS); - rgb_controller->name = name; + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -155,7 +158,7 @@ void DetectRoccatBurstProControllers(hid_device_info* info, const std::string& n { RoccatBurstController * controller = new RoccatBurstController(dev, *info); RGBController_RoccatBurst * rgb_controller = new RGBController_RoccatBurst(controller, ROCCAT_BURST_PRO_NUMBER_OF_LEDS); - rgb_controller->name = name; + rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } } @@ -173,12 +176,26 @@ void DetectRoccatKovaControllers(hid_device_info* info, const std::string& name) } } +void DetectRoccatEloControllers(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + RoccatEloController * controller = new RoccatEloController(dev, *info); + RGBController_RoccatElo * rgb_controller = new RGBController_RoccatElo(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + REGISTER_PRE_DETECTION_HOOK(ResetRoccatVulcanAimoControllersPaths); REGISTER_HID_DETECTOR_IPU("Roccat Kone Aimo", DetectRoccatMouseControllers, ROCCAT_VID, ROCCAT_KONE_AIMO_PID, 0, 0x0B, 0 ); REGISTER_HID_DETECTOR_IPU("Roccat Kone Aimo 16K", DetectRoccatMouseControllers, ROCCAT_VID, ROCCAT_KONE_AIMO_16K_PID, 0, 0x0B, 0 ); REGISTER_HID_DETECTOR_IP ("Roccat Vulcan 120-Series Aimo", DetectRoccatVulcanAimoControllers, ROCCAT_VID, ROCCAT_VULCAN_120_AIMO_PID, 1, 11); -REGISTER_HID_DETECTOR_IPU("Roccat Horde Aimo", DetectRoccatHordeAimoKeyboardControllers, ROCCAT_VID, ROCCAT_HORDE_AIMO_PID, 1, 0x0B, 0); -REGISTER_HID_DETECTOR_IPU("Roccat Burst Core", DetectRoccatBurstCoreControllers, ROCCAT_VID, ROCCAT_BURST_CORE_PID, 3, 0xFF01, 1); -REGISTER_HID_DETECTOR_IPU("Roccat Burst Pro", DetectRoccatBurstProControllers, ROCCAT_VID, ROCCAT_BURST_PRO_PID, 3, 0xFF01, 1); -REGISTER_HID_DETECTOR_IPU("Roccat Kova", DetectRoccatKovaControllers, ROCCAT_VID, ROCCAT_KOVA_PID, 0, 0x0B, 0); +REGISTER_HID_DETECTOR_IPU("Roccat Horde Aimo", DetectRoccatHordeAimoKeyboardControllers, ROCCAT_VID, ROCCAT_HORDE_AIMO_PID, 1, 0x0B, 0 ); +REGISTER_HID_DETECTOR_IPU("Roccat Burst Core", DetectRoccatBurstCoreControllers, ROCCAT_VID, ROCCAT_BURST_CORE_PID, 3, 0xFF01, 1 ); +REGISTER_HID_DETECTOR_IPU("Roccat Burst Pro", DetectRoccatBurstProControllers, ROCCAT_VID, ROCCAT_BURST_PRO_PID, 3, 0xFF01, 1 ); +REGISTER_HID_DETECTOR_IPU("Roccat Kova", DetectRoccatKovaControllers, ROCCAT_VID, ROCCAT_KOVA_PID, 0, 0x0B, 0 ); +REGISTER_HID_DETECTOR_IPU("Roccat Elo 7.1", DetectRoccatEloControllers, ROCCAT_VID, ROCCAT_ELO_PID, 3, 0x0C, 1 ); diff --git a/Controllers/RoccatController/RoccatEloController.cpp b/Controllers/RoccatController/RoccatEloController.cpp new file mode 100644 index 00000000..f674da38 --- /dev/null +++ b/Controllers/RoccatController/RoccatEloController.cpp @@ -0,0 +1,86 @@ +#include "RoccatEloController.h" +#include +#include + +RoccatEloController::RoccatEloController(hid_device* dev_handle, const hid_device_info& info) +{ + dev = dev_handle; + location = info.path; + version = ""; + + wchar_t serial_string[128]; + int ret = hid_get_serial_number_string(dev, serial_string, 128); + + if(ret != 0) + { + serial_number = ""; + } + else + { + std::wstring return_wstring = serial_string; + serial_number = std::string(return_wstring.begin(), return_wstring.end()); + } + + SendInit(); +} + +RoccatEloController::~RoccatEloController() +{ + hid_close(dev); +} + +std::string RoccatEloController::GetDeviceLocation() +{ + return("HID: " + location); +} + +std::string RoccatEloController::GetSerialString() +{ + return(serial_number); +} + +void RoccatEloController::SendInit() +{ + unsigned char usb_buf[ROCCAT_ELO_REPORT_SIZE]; + + memset(usb_buf, 0x00, ROCCAT_ELO_REPORT_SIZE); + + usb_buf[0x00] = ROCCAT_ELO_REPORT_ID; + usb_buf[0x01] = 0x01; + + hid_write(dev, usb_buf, ROCCAT_ELO_REPORT_SIZE); + + usb_buf[0x01] = 0x02; + + hid_write(dev, usb_buf, ROCCAT_ELO_REPORT_SIZE); + + usb_buf[0x01] = 0x03; + usb_buf[0x03] = 0x01; + + hid_write(dev, usb_buf, ROCCAT_ELO_REPORT_SIZE); + + SendDirect(0); + + memset(usb_buf, 0x00, ROCCAT_ELO_REPORT_SIZE); + + usb_buf[0x00] = ROCCAT_ELO_REPORT_ID; + usb_buf[0x01] = 0x01; + + hid_write(dev, usb_buf, ROCCAT_ELO_REPORT_SIZE); +} + +void RoccatEloController::SendDirect(RGBColor color) +{ + unsigned char usb_buf[ROCCAT_ELO_REPORT_SIZE]; + + memset(usb_buf, 0x00, ROCCAT_ELO_REPORT_SIZE); + + usb_buf[0x00] = ROCCAT_ELO_REPORT_ID; + usb_buf[0x01] = 0x04; + usb_buf[0x04] = RGBGetRValue(color); + usb_buf[0x05] = RGBGetGValue(color); + usb_buf[0x06] = RGBGetBValue(color); + + hid_write(dev, usb_buf, ROCCAT_ELO_REPORT_SIZE); +} + diff --git a/Controllers/RoccatController/RoccatEloController.h b/Controllers/RoccatController/RoccatEloController.h new file mode 100644 index 00000000..576e8a10 --- /dev/null +++ b/Controllers/RoccatController/RoccatEloController.h @@ -0,0 +1,29 @@ +#pragma once + +#include "RGBController.h" +#include +#include + +#define ROCCAT_ELO_REPORT_SIZE 16 +#define ROCCAT_ELO_LEDS_COUNT 1 +#define ROCCAT_ELO_REPORT_ID 0xFF + +class RoccatEloController +{ +public: + RoccatEloController(hid_device* dev_handle, const hid_device_info& info); + ~RoccatEloController(); + + std::string GetSerialString(); + std::string GetDeviceLocation(); + + void SendDirect(RGBColor color); + +private: + hid_device* dev; + std::string location; + std::string serial_number; + std::string version; + + void SendInit(); +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 11a517ea..62045865 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -180,6 +180,8 @@ contains(QMAKE_PLATFORM, freebsd) { HEADERS += \ Colors.h \ + Controllers/RoccatController/RGBController_RoccatElo.h \ + Controllers/RoccatController/RoccatEloController.h \ dependencies/ColorWheel/ColorWheel.h \ dependencies/Swatches/swatches.h \ dependencies/json/json.hpp \ @@ -667,6 +669,8 @@ contains(QMAKE_PLATFORM, freebsd) { } SOURCES += \ + Controllers/RoccatController/RGBController_RoccatElo.cpp \ + Controllers/RoccatController/RoccatEloController.cpp \ dependencies/Swatches/swatches.cpp \ dependencies/dmiinfo.cpp \ dependencies/ColorWheel/ColorWheel.cpp \