From e7e311d9315530dac2dd6615e8fc7941c8848932 Mon Sep 17 00:00:00 2001 From: Santeri Pikarinen Date: Mon, 2 Aug 2021 01:15:07 +0000 Subject: [PATCH] HyperX Pulsefire Dart: Various fixes, feature additions and clean up * Fixed payload missing the Report ID (caused issues with Windows, issue #1069) * Fixed an invalid usage page value for wired mode * Fixed a potential memory leak when rescanning devices (issue #1007) * Fixed an issue where multiple color changes were sent too fast * Renamed "Trigger Fade" mode to the [standardized mode name](https://gitlab.com/CalcProgrammer1/OpenRGB/-/wikis/Common-Modes#common-openrgb-modes) "Reactive" * Added proper brightness control * Added manual saving functionality * Cleaned up some indentations --- .../HyperXMouseControllerDetect.cpp | 2 +- .../HyperXPulsefireDartController.cpp | 56 ++++++--- .../HyperXPulsefireDartController.h | 12 +- .../RGBController_HyperXPulsefireDart.cpp | 115 ++++++++++-------- .../RGBController_HyperXPulsefireDart.h | 1 + 5 files changed, 117 insertions(+), 69 deletions(-) diff --git a/Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp b/Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp index a96dc237..020f3858 100644 --- a/Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp +++ b/Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp @@ -56,4 +56,4 @@ void DetectHyperXPulsefireDartControllers(hid_device_info* info, const std::stri REGISTER_HID_DETECTOR_IP("HyperX Pulsefire Surge", DetectHyperXPulsefireSurgeControllers, HYPERX_VID, HYPERX_PULSEFIRE_SURGE_PID, 1, 0xFF01); REGISTER_HID_DETECTOR_IP("HyperX Pulsefire FPS Pro", DetectHyperXPulsefireFPSProControllers, HYPERX_VID, HYPERX_PULSEFIRE_FPS_PRO_PID, 1, 0xFF01); REGISTER_HID_DETECTOR_IP("HyperX Pulsefire Dart (Wireless)", DetectHyperXPulsefireDartControllers, HYPERX_VID, HYPERX_PULSEFIRE_DART_WIRELESS_PID, 2, 0xFF00); -REGISTER_HID_DETECTOR_IP("HyperX Pulsefire Dart (Wired)", DetectHyperXPulsefireDartControllers, HYPERX_VID, HYPERX_PULSEFIRE_DART_WIRED_PID, 1, 0xFF00); +REGISTER_HID_DETECTOR_IP("HyperX Pulsefire Dart (Wired)", DetectHyperXPulsefireDartControllers, HYPERX_VID, HYPERX_PULSEFIRE_DART_WIRED_PID, 1, 0xFF13); diff --git a/Controllers/HyperXMouseController/HyperXPulsefireDartController.cpp b/Controllers/HyperXMouseController/HyperXPulsefireDartController.cpp index aa256967..62e523f5 100644 --- a/Controllers/HyperXMouseController/HyperXPulsefireDartController.cpp +++ b/Controllers/HyperXMouseController/HyperXPulsefireDartController.cpp @@ -19,7 +19,7 @@ HyperXPulsefireDartController::HyperXPulsefireDartController(hid_device* dev_han HyperXPulsefireDartController::~HyperXPulsefireDartController() { - + hid_close(dev); } std::string HyperXPulsefireDartController::GetDeviceLocation() @@ -56,7 +56,7 @@ void HyperXPulsefireDartController::SendDirect int speed ) { - unsigned char buf[64]; + unsigned char buf[HYPERX_PULSEFIRE_DART_PACKET_SIZE]; /*-----------------------------------------------------*\ | Zero out buffer | @@ -66,24 +66,52 @@ void HyperXPulsefireDartController::SendDirect /*-----------------------------------------------------*\ | Set up Direct Mode packet | \*-----------------------------------------------------*/ - buf[0x00] = HYPERX_PULSEFIRE_DART_PACKET_ID_DIRECT; - buf[0x01] = led; - buf[0x02] = mode; - buf[0x03] = 0x08; // 8 bytes after buffer index 0x03 + buf[0x00] = 0x00; + buf[0x01] = HYPERX_PULSEFIRE_DART_PACKET_ID_DIRECT; + buf[0x02] = led; + buf[0x03] = mode; + buf[0x04] = 0x08; // 8 bytes after buffer index 0x04 - buf[0x04] = RGBGetRValue(color); - buf[0x05] = RGBGetGValue(color); - buf[0x06] = RGBGetBValue(color); + buf[0x05] = RGBGetRValue(color); + buf[0x06] = RGBGetGValue(color); + buf[0x07] = RGBGetBValue(color); - buf[0x07] = RGBGetRValue(color); - buf[0x08] = RGBGetGValue(color); - buf[0x09] = RGBGetBValue(color); + buf[0x08] = RGBGetRValue(color); + buf[0x09] = RGBGetGValue(color); + buf[0x0a] = RGBGetBValue(color); - buf[0x0a] = brightness; - buf[0x0b] = speed; + buf[0x0b] = brightness; + buf[0x0c] = speed; /*-----------------------------------------------------*\ | Send packet | \*-----------------------------------------------------*/ hid_write(dev, (unsigned char *)buf, sizeof(buf)); + std::this_thread::sleep_for(std::chrono::milliseconds(2)); +} + +void HyperXPulsefireDartController::Save() +{ + /*-----------------------------------------------------*\ + | Save current settings to the on-board memory | + \*-----------------------------------------------------*/ + unsigned char buf[HYPERX_PULSEFIRE_DART_PACKET_SIZE]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + + /*-----------------------------------------------------*\ + | Set up Save packet | + \*-----------------------------------------------------*/ + buf[0x00] = 0x00; + buf[0x01] = 0xde; + buf[0x02] = 0xff; + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_write(dev, (unsigned char *)buf, sizeof(buf)); + std::this_thread::sleep_for(std::chrono::milliseconds(2)); } diff --git a/Controllers/HyperXMouseController/HyperXPulsefireDartController.h b/Controllers/HyperXMouseController/HyperXPulsefireDartController.h index 345b5abe..d70538a1 100644 --- a/Controllers/HyperXMouseController/HyperXPulsefireDartController.h +++ b/Controllers/HyperXMouseController/HyperXPulsefireDartController.h @@ -17,19 +17,23 @@ enum { HYPERX_PULSEFIRE_DART_PACKET_ID_DIRECT = 0xd2, /* Direct control packet */ + HYPERX_PULSEFIRE_DART_PACKET_SIZE = 65, /* Report ID padding + 64 byte payload */ HYPERX_PULSEFIRE_DART_MODE_STATIC = 0x00, /* Static color mode */ HYPERX_PULSEFIRE_DART_MODE_CYCLE = 0x12, /* Spectrum cycle mode */ HYPERX_PULSEFIRE_DART_MODE_BREATHING = 0x20, /* Single color breathing mode */ - HYPERX_PULSEFIRE_DART_MODE_TRIGGER = 0x30, /* Trigger fade mode */ + HYPERX_PULSEFIRE_DART_MODE_REACTIVE = 0x30, /* Reactive/Trigger fade mode */ HYPERX_PULSEFIRE_DART_SPEED_MIN = 0x64, HYPERX_PULSEFIRE_DART_SPEED_MAX = 0x00, HYPERX_PULSEFIRE_DART_SPEED_MED = 0x32, HYPERX_PULSEFIRE_DART_SPEED_NONE = 0x00, /* For static color mode */ - HYPERX_PULSEFIRE_DART_LED_SCROLL = 0x00, - HYPERX_PULSEFIRE_DART_LED_LOGO = 0x10, + HYPERX_PULSEFIRE_DART_BRIGHTNESS_MIN = 0x00, + HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX = 0x64, + + HYPERX_PULSEFIRE_DART_LED_LOGO = 0x00, + HYPERX_PULSEFIRE_DART_LED_SCROLL = 0x10, HYPERX_PULSEFIRE_DART_LED_ALL = 0x20 }; @@ -51,6 +55,8 @@ public: int speed ); + void Save(); + private: hid_device* dev; std::string location; diff --git a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.cpp b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.cpp index c05653a4..c1535b7d 100644 --- a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.cpp +++ b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.cpp @@ -21,42 +21,54 @@ RGBController_HyperXPulsefireDart::RGBController_HyperXPulsefireDart(HyperXPulse serial = hyperx->GetSerialString(); mode Direct; - Direct.name = "Direct"; - Direct.value = HYPERX_PULSEFIRE_DART_MODE_STATIC; - Direct.speed = HYPERX_PULSEFIRE_DART_SPEED_NONE; - Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; - Direct.color_mode = MODE_COLORS_PER_LED | MODE_FLAG_HAS_BRIGHTNESS; + Direct.name = "Direct"; + Direct.value = HYPERX_PULSEFIRE_DART_MODE_STATIC; + Direct.speed = HYPERX_PULSEFIRE_DART_SPEED_NONE; + 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 = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MIN; + Direct.brightness_max = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX; + Direct.brightness = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX; modes.push_back(Direct); mode Breathing; - Breathing.name = "Breathing"; - Breathing.value = HYPERX_PULSEFIRE_DART_MODE_BREATHING; - Breathing.speed = HYPERX_PULSEFIRE_DART_SPEED_MED; - Breathing.speed_min = HYPERX_PULSEFIRE_DART_SPEED_MIN; - Breathing.speed_max = HYPERX_PULSEFIRE_DART_SPEED_MAX; - Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS; - Breathing.color_mode = MODE_COLORS_PER_LED; + Breathing.name = "Breathing"; + Breathing.value = HYPERX_PULSEFIRE_DART_MODE_BREATHING; + Breathing.speed = HYPERX_PULSEFIRE_DART_SPEED_MED; + Breathing.speed_min = HYPERX_PULSEFIRE_DART_SPEED_MIN; + Breathing.speed_max = HYPERX_PULSEFIRE_DART_SPEED_MAX; + Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE; + Breathing.color_mode = MODE_COLORS_PER_LED; + Breathing.brightness_min = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MIN; + Breathing.brightness_max = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX; + Breathing.brightness = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX; modes.push_back(Breathing); mode SpectrumCycle; - SpectrumCycle.name = "Spectrum Cycle"; - SpectrumCycle.value = HYPERX_PULSEFIRE_DART_MODE_CYCLE; - SpectrumCycle.speed = HYPERX_PULSEFIRE_DART_SPEED_MED; - SpectrumCycle.speed_min = HYPERX_PULSEFIRE_DART_SPEED_MIN; - SpectrumCycle.speed_max = HYPERX_PULSEFIRE_DART_SPEED_MAX; - SpectrumCycle.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS; - SpectrumCycle.color_mode = MODE_COLORS_NONE; + SpectrumCycle.name = "Spectrum Cycle"; + SpectrumCycle.value = HYPERX_PULSEFIRE_DART_MODE_CYCLE; + SpectrumCycle.speed = HYPERX_PULSEFIRE_DART_SPEED_MED; + SpectrumCycle.speed_min = HYPERX_PULSEFIRE_DART_SPEED_MIN; + SpectrumCycle.speed_max = HYPERX_PULSEFIRE_DART_SPEED_MAX; + SpectrumCycle.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE; + SpectrumCycle.color_mode = MODE_COLORS_NONE; + SpectrumCycle.brightness_min = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MIN; + SpectrumCycle.brightness_max = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX; + SpectrumCycle.brightness = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX; modes.push_back(SpectrumCycle); - mode TriggerFade; - TriggerFade.name = "Trigger Fade"; - TriggerFade.value = HYPERX_PULSEFIRE_DART_MODE_TRIGGER; - TriggerFade.speed = HYPERX_PULSEFIRE_DART_SPEED_MED; - TriggerFade.speed_min = HYPERX_PULSEFIRE_DART_SPEED_MIN; - TriggerFade.speed_max = HYPERX_PULSEFIRE_DART_SPEED_MAX; - TriggerFade.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS; - TriggerFade.color_mode = MODE_COLORS_PER_LED; - modes.push_back(TriggerFade); + mode Reactive; + Reactive.name = "Reactive"; + Reactive.value = HYPERX_PULSEFIRE_DART_MODE_REACTIVE; + Reactive.speed = HYPERX_PULSEFIRE_DART_SPEED_MED; + Reactive.speed_min = HYPERX_PULSEFIRE_DART_SPEED_MIN; + Reactive.speed_max = HYPERX_PULSEFIRE_DART_SPEED_MAX; + Reactive.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE; + Reactive.color_mode = MODE_COLORS_PER_LED; + Reactive.brightness_min = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MIN; + Reactive.brightness_max = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX; + Reactive.brightness = HYPERX_PULSEFIRE_DART_BRIGHTNESS_MAX; + modes.push_back(Reactive); SetupZones(); } @@ -68,20 +80,6 @@ RGBController_HyperXPulsefireDart::~RGBController_HyperXPulsefireDart() void RGBController_HyperXPulsefireDart::SetupZones() { - zone logo_zone; - logo_zone.name = "Logo"; - logo_zone.type = ZONE_TYPE_SINGLE; - logo_zone.leds_min = 1; - logo_zone.leds_max = 1; - logo_zone.leds_count = 1; - logo_zone.matrix_map = NULL; - zones.push_back(logo_zone); - - led logo_led; - logo_led.name = "Logo"; - logo_led.value = HYPERX_PULSEFIRE_DART_LED_LOGO; - leds.push_back(logo_led); - zone scroll_zone; scroll_zone.name = "Scroll Wheel"; scroll_zone.type = ZONE_TYPE_SINGLE; @@ -96,6 +94,20 @@ void RGBController_HyperXPulsefireDart::SetupZones() scroll_led.value = HYPERX_PULSEFIRE_DART_LED_SCROLL; leds.push_back(scroll_led); + zone logo_zone; + logo_zone.name = "Logo"; + logo_zone.type = ZONE_TYPE_SINGLE; + logo_zone.leds_min = 1; + logo_zone.leds_max = 1; + logo_zone.leds_count = 1; + logo_zone.matrix_map = NULL; + zones.push_back(logo_zone); + + led logo_led; + logo_led.name = "Logo"; + logo_led.value = HYPERX_PULSEFIRE_DART_LED_LOGO; + leds.push_back(logo_led); + SetupColors(); } @@ -116,15 +128,13 @@ void RGBController_HyperXPulsefireDart::UpdateZoneLEDs(int zone) void RGBController_HyperXPulsefireDart::UpdateSingleLED(int led) { - int brightness = 0x64; - if(modes[active_mode].color_mode == MODE_COLORS_PER_LED) { - hyperx->SendDirect(colors[led], leds[led].value, modes[active_mode].value, brightness, modes[active_mode].speed); + hyperx->SendDirect(colors[led], leds[led].value, modes[active_mode].value, modes[active_mode].brightness, modes[active_mode].speed); } else { - hyperx->SendDirect(colors[led], HYPERX_PULSEFIRE_DART_LED_ALL, modes[active_mode].value, brightness, modes[active_mode].speed); + hyperx->SendDirect(colors[led], HYPERX_PULSEFIRE_DART_LED_ALL, modes[active_mode].value, modes[active_mode].brightness, modes[active_mode].speed); } } @@ -135,15 +145,18 @@ void RGBController_HyperXPulsefireDart::SetCustomMode() void RGBController_HyperXPulsefireDart::DeviceUpdateMode() { - int brightness = 0x64; - if(modes[active_mode].color_mode == MODE_COLORS_PER_LED) { - hyperx->SendDirect(colors[0], HYPERX_PULSEFIRE_DART_LED_SCROLL, modes[active_mode].value, brightness, modes[active_mode].speed); - hyperx->SendDirect(colors[1], HYPERX_PULSEFIRE_DART_LED_LOGO, modes[active_mode].value, brightness, modes[active_mode].speed); + hyperx->SendDirect(colors[0], HYPERX_PULSEFIRE_DART_LED_SCROLL, modes[active_mode].value, modes[active_mode].brightness, modes[active_mode].speed); + hyperx->SendDirect(colors[1], HYPERX_PULSEFIRE_DART_LED_LOGO, modes[active_mode].value, modes[active_mode].brightness, modes[active_mode].speed); } else { - hyperx->SendDirect(colors[0], HYPERX_PULSEFIRE_DART_LED_ALL, modes[active_mode].value, brightness, modes[active_mode].speed); + hyperx->SendDirect(colors[0], HYPERX_PULSEFIRE_DART_LED_ALL, modes[active_mode].value, modes[active_mode].brightness, modes[active_mode].speed); } } + +void RGBController_HyperXPulsefireDart::DeviceSaveMode() +{ + hyperx->Save(); +} diff --git a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.h b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.h index dd61c8a6..a458fb6e 100644 --- a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.h +++ b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.h @@ -29,6 +29,7 @@ public: void SetCustomMode(); void DeviceUpdateMode(); + void DeviceSaveMode(); private: HyperXPulsefireDartController* hyperx;