diff --git a/Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp b/Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp index aa87bc81..a96dc237 100644 --- a/Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp +++ b/Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp @@ -1,17 +1,21 @@ #include "Detector.h" #include "HyperXPulsefireFPSProController.h" #include "HyperXPulsefireSurgeController.h" +#include "HyperXPulsefireDartController.h" #include "RGBController.h" #include "RGBController_HyperXPulsefireFPSPro.h" #include "RGBController_HyperXPulsefireSurge.h" +#include "RGBController_HyperXPulsefireDart.h" #include /*-----------------------------------------------------*\ | HyperX mouse vendor IDs | \*-----------------------------------------------------*/ -#define HYPERX_VID 0x0951 -#define HYPERX_PULSEFIRE_SURGE_PID 0x16D3 -#define HYPERX_PULSEFIRE_FPS_PRO_PID 0x16D7 +#define HYPERX_VID 0x0951 +#define HYPERX_PULSEFIRE_SURGE_PID 0x16D3 +#define HYPERX_PULSEFIRE_FPS_PRO_PID 0x16D7 +#define HYPERX_PULSEFIRE_DART_WIRELESS_PID 0x16E1 +#define HYPERX_PULSEFIRE_DART_WIRED_PID 0x16E2 void DetectHyperXPulsefireSurgeControllers(hid_device_info* info, const std::string& name) { @@ -37,5 +41,19 @@ void DetectHyperXPulsefireFPSProControllers(hid_device_info* info, const std::st } } /* DetectHyperXPulsefireFPSProControllers() */ +void DetectHyperXPulsefireDartControllers(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + if( dev ) + { + HyperXPulsefireDartController* controller = new HyperXPulsefireDartController(dev, info->path); + RGBController_HyperXPulsefireDart* rgb_controller = new RGBController_HyperXPulsefireDart(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} /* DetectHyperXPulsefireDartControllers() */ + 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); diff --git a/Controllers/HyperXMouseController/HyperXPulsefireDartController.cpp b/Controllers/HyperXMouseController/HyperXPulsefireDartController.cpp new file mode 100644 index 00000000..8d452ac9 --- /dev/null +++ b/Controllers/HyperXMouseController/HyperXPulsefireDartController.cpp @@ -0,0 +1,84 @@ +/*-------------------------------------------*\ +| HyperXPulsefireDartController.cpp | +| | +| Driver for HyperX Pulsefire Dart | +| lighting controller | +| | +| Santeri Pikarinen (santeri3700) 12/26/2020 | +\*-------------------------------------------*/ + +#include "HyperXPulsefireDartController.h" + +#include + +HyperXPulsefireDartController::HyperXPulsefireDartController(hid_device* dev_handle, const char* path) +{ + dev = dev_handle; + location = path; +} + +HyperXPulsefireDartController::~HyperXPulsefireDartController() +{ + +} + +std::string HyperXPulsefireDartController::GetDeviceLocation() +{ + return("HID: " + location); +} + +std::string HyperXPulsefireDartController::GetSerialString() +{ + wchar_t serial_string[128]; + hid_get_serial_number_string(dev, serial_string, 128); + + std::wstring return_wstring = serial_string; + std::string return_string(return_wstring.begin(), return_wstring.end()); + + return(return_string); +} + +/*-------------------------------------------------------------------------------------------------*\ +| Private packet sending functions. | +\*-------------------------------------------------------------------------------------------------*/ + +void HyperXPulsefireDartController::SendDirect + ( + RGBColor color, + int led, + int mode, + int brightness, + int speed + ) +{ + unsigned char buf[64]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + + /*-----------------------------------------------------*\ + | 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[0x04] = RGBGetRValue(color); + buf[0x05] = RGBGetGValue(color); + buf[0x06] = RGBGetBValue(color); + + buf[0x07] = RGBGetRValue(color); + buf[0x08] = RGBGetGValue(color); + buf[0x09] = RGBGetBValue(color); + + buf[0x0a] = brightness; + buf[0x0b] = speed; + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_write(dev, (unsigned char *)buf, sizeof(buf)); +} diff --git a/Controllers/HyperXMouseController/HyperXPulsefireDartController.h b/Controllers/HyperXMouseController/HyperXPulsefireDartController.h new file mode 100644 index 00000000..345b5abe --- /dev/null +++ b/Controllers/HyperXMouseController/HyperXPulsefireDartController.h @@ -0,0 +1,57 @@ +/*-------------------------------------------*\ +| HyperXPulsefireDartController.h | +| | +| Definitions and types for HyperX | +| Pulsefire Dart lighting controller | +| | +| Santeri Pikarinen (santeri3700) 12/26/2020 | +\*-------------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +enum +{ + HYPERX_PULSEFIRE_DART_PACKET_ID_DIRECT = 0xd2, /* Direct control packet */ + + 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_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_LED_ALL = 0x20 +}; + +class HyperXPulsefireDartController +{ +public: + HyperXPulsefireDartController(hid_device* dev_handle, const char* path); + ~HyperXPulsefireDartController(); + + std::string GetDeviceLocation(); + std::string GetSerialString(); + + void SendDirect + ( + RGBColor color_data, + int led, + int mode, + int brightness, + int speed + ); + +private: + hid_device* dev; + std::string location; +}; diff --git a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.cpp b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.cpp new file mode 100644 index 00000000..c05653a4 --- /dev/null +++ b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.cpp @@ -0,0 +1,149 @@ +/*-------------------------------------------*\ +| RGBController_HyperXPulsefireDart.cpp | +| | +| Generic RGB Interface for HyperX | +| Pulsefire Dart | +| | +| Santeri Pikarinen (santeri3700) 12/26/2020 | +\*-------------------------------------------*/ + +#include "RGBController_HyperXPulsefireDart.h" + +RGBController_HyperXPulsefireDart::RGBController_HyperXPulsefireDart(HyperXPulsefireDartController* hyperx_ptr) +{ + hyperx = hyperx_ptr; + + name = "HyperX Pulsefire Dart Device"; + vendor = "HyperX"; + type = DEVICE_TYPE_MOUSE; + description = "HyperX Pulsefire Dart Device"; + location = hyperx->GetDeviceLocation(); + 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; + 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; + 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; + 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); + + SetupZones(); +} + +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; + scroll_zone.leds_min = 1; + scroll_zone.leds_max = 1; + scroll_zone.leds_count = 1; + scroll_zone.matrix_map = NULL; + zones.push_back(scroll_zone); + + led scroll_led; + scroll_led.name = "Scroll Wheel"; + scroll_led.value = HYPERX_PULSEFIRE_DART_LED_SCROLL; + leds.push_back(scroll_led); + + SetupColors(); +} + +void RGBController_HyperXPulsefireDart::ResizeZone(int /*zone*/, int /*new_size*/) +{ + +} + +void RGBController_HyperXPulsefireDart::DeviceUpdateLEDs() +{ + DeviceUpdateMode(); +} + +void RGBController_HyperXPulsefireDart::UpdateZoneLEDs(int zone) +{ + UpdateSingleLED(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); + } + else + { + hyperx->SendDirect(colors[led], HYPERX_PULSEFIRE_DART_LED_ALL, modes[active_mode].value, brightness, modes[active_mode].speed); + } +} + +void RGBController_HyperXPulsefireDart::SetCustomMode() +{ + active_mode = 0; +} + +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); + } + else + { + hyperx->SendDirect(colors[0], HYPERX_PULSEFIRE_DART_LED_ALL, modes[active_mode].value, brightness, modes[active_mode].speed); + } +} diff --git a/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.h b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.h new file mode 100644 index 00000000..dd61c8a6 --- /dev/null +++ b/Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.h @@ -0,0 +1,35 @@ +/*-------------------------------------------*\ +| RGBController_HyperXPulsefireDart.h | +| | +| Generic RGB Interface for HyperX | +| Pulsefire Dart | +| | +| Santeri Pikarinen (santeri3700) 12/26/2020 | +\*-------------------------------------------*/ + +#pragma once +#include + +#include "RGBController.h" +#include "HyperXPulsefireDartController.h" + +class RGBController_HyperXPulsefireDart : public RGBController +{ +public: + RGBController_HyperXPulsefireDart(HyperXPulsefireDartController* hyperx_ptr); + ~RGBController_HyperXPulsefireDart(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + HyperXPulsefireDartController* hyperx; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 80a4b4fa..67042266 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -226,8 +226,10 @@ HEADERS += Controllers/HyperXKeyboardController/RGBController_HyperXKeyboard.h \ Controllers/HyperXMouseController/HyperXPulsefireFPSProController.h \ Controllers/HyperXMouseController/HyperXPulsefireSurgeController.h \ + Controllers/HyperXMouseController/HyperXPulsefireDartController.h \ Controllers/HyperXMouseController/RGBController_HyperXPulsefireFPSPro.h \ Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.h \ + Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.h \ Controllers/HyperXMousematController/HyperXMousematController.h \ Controllers/HyperXMousematController/RGBController_HyperXMousemat.h \ Controllers/LEDStripController/LEDStripController.h \ @@ -456,8 +458,10 @@ SOURCES += Controllers/HyperXMouseController/HyperXMouseControllerDetect.cpp \ Controllers/HyperXMouseController/HyperXPulsefireFPSProController.cpp \ Controllers/HyperXMouseController/HyperXPulsefireSurgeController.cpp \ + Controllers/HyperXMouseController/HyperXPulsefireDartController.cpp \ Controllers/HyperXMouseController/RGBController_HyperXPulsefireFPSPro.cpp \ Controllers/HyperXMouseController/RGBController_HyperXPulsefireSurge.cpp \ + Controllers/HyperXMouseController/RGBController_HyperXPulsefireDart.cpp \ Controllers/HyperXMousematController/HyperXMousematController.cpp \ Controllers/HyperXMousematController/HyperXMousematControllerDetect.cpp \ Controllers/HyperXMousematController/RGBController_HyperXMousemat.cpp \