diff --git a/Controllers/RoccatController/RGBController_RoccatHordeAimo.cpp b/Controllers/RoccatController/RGBController_RoccatHordeAimo.cpp new file mode 100644 index 00000000..8fac689f --- /dev/null +++ b/Controllers/RoccatController/RGBController_RoccatHordeAimo.cpp @@ -0,0 +1,87 @@ +/*-----------------------------------------*\ +| RGBController_RoccatHordeAimo.cpp | +| | +| Generic RGB Interface for OpenRGB | +| | +| | +| Morgan Guimard (morg) 2/24/2022 | +\*-----------------------------------------*/ + +#include "RGBController_RoccatHordeAimo.h" + +RGBController_RoccatHordeAimo::RGBController_RoccatHordeAimo(RoccatHordeAimoController* controller_ptr) +{ + controller = controller_ptr; + + name = "Roccat Horde Aimo"; + vendor = "Roccat"; + type = DEVICE_TYPE_KEYBOARD; + description = "Roccat Horde Aimo Keyboard"; + + mode Direct; + Direct.name = "Direct"; + Direct.value = 0; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Direct); + + SetupZones(); +} + +RGBController_RoccatHordeAimo::~RGBController_RoccatHordeAimo() +{ + delete controller; +} + +void RGBController_RoccatHordeAimo::SetupZones() +{ + zone new_zone; + new_zone.name = "Keyboard"; + new_zone.type = ZONE_TYPE_LINEAR; + new_zone.leds_min = NUMBER_OF_LEDS; + new_zone.leds_max = NUMBER_OF_LEDS; + new_zone.leds_count = NUMBER_OF_LEDS; + new_zone.matrix_map = NULL; + zones.push_back(new_zone); + + for(unsigned int i = 0; i < NUMBER_OF_LEDS; i++) + { + led new_led; + new_led.name = "LED " + std::to_string(i + 1); + leds.push_back(new_led); + } + + SetupColors(); +} + +void RGBController_RoccatHordeAimo::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_RoccatHordeAimo::DeviceUpdateLEDs() +{ + UpdateZoneLEDs(0); +} + +void RGBController_RoccatHordeAimo::UpdateZoneLEDs(int /*zone_idx*/) +{ + controller->SetColors(colors); +} + +void RGBController_RoccatHordeAimo::UpdateSingleLED(int /*led_idx*/) +{ + UpdateZoneLEDs(0); +} + +void RGBController_RoccatHordeAimo::SetCustomMode() +{ + active_mode = 0; +} + +void RGBController_RoccatHordeAimo::DeviceUpdateMode() +{ + +} diff --git a/Controllers/RoccatController/RGBController_RoccatHordeAimo.h b/Controllers/RoccatController/RGBController_RoccatHordeAimo.h new file mode 100644 index 00000000..98fff55b --- /dev/null +++ b/Controllers/RoccatController/RGBController_RoccatHordeAimo.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| RGBController_RoccatHordeAimo.h | +| | +| Generic RGB Interface for Roccat Horde | +| Aimo Keyboard controller | +| | +| Morgan Guimard (morg) 2/24/2022 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "RoccatHordeAimoController.h" + +class RGBController_RoccatHordeAimo : public RGBController +{ +public: + RGBController_RoccatHordeAimo(RoccatHordeAimoController* controller_ptr); + ~RGBController_RoccatHordeAimo(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + RoccatHordeAimoController* controller; +}; diff --git a/Controllers/RoccatController/RoccatControllerDetect.cpp b/Controllers/RoccatController/RoccatControllerDetect.cpp index 90d56e45..5376f84f 100644 --- a/Controllers/RoccatController/RoccatControllerDetect.cpp +++ b/Controllers/RoccatController/RoccatControllerDetect.cpp @@ -10,6 +10,7 @@ #include "RoccatKoneAimoController.h" #include "RoccatVulcanAimoController.h" #include "RGBController.h" +#include "RGBController_RoccatHordeAimo.h" #include "RGBController_RoccatKoneAimo.h" #include "RGBController_RoccatVulcanAimo.h" #include @@ -19,6 +20,7 @@ #define ROCCAT_KONE_AIMO_PID 0x2E27 #define ROCCAT_KONE_AIMO_16K_PID 0x2E2C #define ROCCAT_VULCAN_120_AIMO_PID 0x3098 +#define ROCCAT_HORDE_AIMO_PID 0x303E void DetectRoccatMouseControllers(hid_device_info* info, const std::string& name) { @@ -46,6 +48,20 @@ void DetectRoccatKeyboardControllers(hid_device_info* info, const std::string& n } } -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 Aimo", DetectRoccatKeyboardControllers, ROCCAT_VID, ROCCAT_VULCAN_120_AIMO_PID, 3, 1); +void DetectRoccatHordeAimoKeyboardControllers(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + RoccatHordeAimoController * controller = new RoccatHordeAimoController(dev, *info); + RGBController_RoccatHordeAimo * rgb_controller = new RGBController_RoccatHordeAimo(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + +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 Aimo", DetectRoccatKeyboardControllers, ROCCAT_VID, ROCCAT_VULCAN_120_AIMO_PID, 3, 1); +REGISTER_HID_DETECTOR_IPU("Roccat Horde Aimo", DetectRoccatHordeAimoKeyboardControllers, ROCCAT_VID, ROCCAT_HORDE_AIMO_PID, 1, 0x0B, 0); diff --git a/Controllers/RoccatController/RoccatHordeAimoController.cpp b/Controllers/RoccatController/RoccatHordeAimoController.cpp new file mode 100644 index 00000000..1d91b9f7 --- /dev/null +++ b/Controllers/RoccatController/RoccatHordeAimoController.cpp @@ -0,0 +1,99 @@ +/*-------------------------------------------------------------------*\ +| RoccatHordeAimoController.cpp | +| | +| Driver for Roccat Horde Aimo Keyboard | +| | +| Morgan Guimard (morg) 2/24/2022 | +| | +\*-------------------------------------------------------------------*/ + +#include "RoccatHordeAimoController.h" + +#include + +RoccatHordeAimoController::RoccatHordeAimoController(hid_device* dev_handle, const hid_device_info& info) +{ + dev = dev_handle; + version = ""; + location = info.path; + + 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()); + } + + InitialPacket(); +} + +RoccatHordeAimoController::~RoccatHordeAimoController() +{ + hid_close(dev); +} + +void RoccatHordeAimoController::InitialPacket() +{ + unsigned char usb_buf[8]; + + memset(usb_buf, 0x00,8); + + usb_buf[0x00] = 0x13; + usb_buf[0x01] = 0x08; + usb_buf[0x02] = 0x01; + + hid_send_feature_report(dev, usb_buf, 8); +} + +std::string RoccatHordeAimoController::GetFirmwareVersion() +{ + return version; +} + +std::string RoccatHordeAimoController::GetSerialString() +{ + return serial_number; +} + +std::string RoccatHordeAimoController::GetDeviceLocation() +{ + return("HID: " + location); +} + +void RoccatHordeAimoController::SetColors(std::vector colors) +{ + unsigned char usb_buf[WRITE_PACKET_LENGTH]; + + usb_buf[0x00] = REPORT_ID; + usb_buf[0x01] = WRITE_PACKET_LENGTH; + usb_buf[0x02] = 0xFF; + usb_buf[0x03] = 0xFF; + + for(unsigned int i = 0; i < 6; i++) + { + usb_buf[0x04 + (i * 3)] = RGBGetRValue(colors[i]); + usb_buf[0x05 + (i * 3)] = RGBGetGValue(colors[i]); + usb_buf[0x06 + (i * 3)] = RGBGetBValue(colors[i]); + } + + int crc = 0; + + for(unsigned int i = 0; i < WRITE_PACKET_LENGTH - 2; i++) + { + crc += usb_buf[i]; + } + + usb_buf[22] = crc; + usb_buf[23] = crc >> 8; + + hid_send_feature_report(dev, usb_buf, WRITE_PACKET_LENGTH); + + unsigned char usb_read_buf[READ_PACKET_LENGTH]; + hid_get_feature_report(dev, usb_read_buf, READ_PACKET_LENGTH); +} diff --git a/Controllers/RoccatController/RoccatHordeAimoController.h b/Controllers/RoccatController/RoccatHordeAimoController.h new file mode 100644 index 00000000..0cb37750 --- /dev/null +++ b/Controllers/RoccatController/RoccatHordeAimoController.h @@ -0,0 +1,39 @@ +/*-------------------------------------------------------------------*\ +| RoccatHordeAimoController.h | +| | +| Driver for Roccat Horde Aimo Keyboard | +| | +| Morgan Guimard (morg) 2/24/2022 | +| | +\*-------------------------------------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include + +#define WRITE_PACKET_LENGTH 24 +#define READ_PACKET_LENGTH 3 +#define REPORT_ID 0x18 +#define NUMBER_OF_LEDS 6 + +class RoccatHordeAimoController +{ +public: + RoccatHordeAimoController(hid_device* dev_handle, const hid_device_info& info); + ~RoccatHordeAimoController(); + + std::string GetSerialString(); + std::string GetDeviceLocation(); + std::string GetFirmwareVersion(); + + void SetColors(std::vector colors); + +private: + hid_device* dev; + std::string location; + std::string serial_number; + std::string version; + + void InitialPacket(); +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 3d07162d..b2da81ac 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -452,8 +452,10 @@ HEADERS += Controllers/RazerController/RGBController_RazerKraken.h \ Controllers/RedragonController/RedragonM711Controller.h \ Controllers/RedragonController/RGBController_RedragonM711.h \ + Controllers/RoccatController/RGBController_RoccatHordeAimo.h \ Controllers/RoccatController/RGBController_RoccatKoneAimo.h \ Controllers/RoccatController/RGBController_RoccatVulcanAimo.h \ + Controllers/RoccatController/RoccatHordeAimoController.h \ Controllers/RoccatController/RoccatKoneAimoController.h \ Controllers/RoccatController/RoccatVulcanAimoController.h \ Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.h \ @@ -909,8 +911,10 @@ SOURCES += Controllers/RedragonController/RedragonM711Controller.cpp \ Controllers/RedragonController/RedragonControllerDetect.cpp \ Controllers/RedragonController/RGBController_RedragonM711.cpp \ + Controllers/RoccatController/RGBController_RoccatHordeAimo.cpp \ Controllers/RoccatController/RGBController_RoccatKoneAimo.cpp \ Controllers/RoccatController/RGBController_RoccatVulcanAimo.cpp \ + Controllers/RoccatController/RoccatHordeAimoController.cpp \ Controllers/RoccatController/RoccatKoneAimoController.cpp \ Controllers/RoccatController/RoccatVulcanAimoController.cpp \ Controllers/RoccatController/RoccatControllerDetect.cpp \