diff --git a/Controllers/RoccatController/RGBController_RoccatBurstProAir.cpp b/Controllers/RoccatController/RGBController_RoccatBurstProAir.cpp new file mode 100644 index 00000000..dd36a7b6 --- /dev/null +++ b/Controllers/RoccatController/RGBController_RoccatBurstProAir.cpp @@ -0,0 +1,144 @@ +/*-----------------------------------------*\ +| RGBController_RoccatBurstProAir.cpp | +| | +| Generic RGB Interface for OpenRGB | +| | +| | +| Morgan Guimard (morg) 6/16/2022 | +\*-----------------------------------------*/ + +#include "RGBController_RoccatBurstProAir.h" + +/**------------------------------------------------------------------*\ + @name Roccat Burst Pro Air + @category Mouse + @type USB + @save :warning: + @direct :white_check_mark: + @effects :white_check_mark: + @detectors DetectRoccatBurstProAirCoreControllers + @comment +\*-------------------------------------------------------------------*/ + +RGBController_RoccatBurstProAir::RGBController_RoccatBurstProAir(RoccatBurstProAirController* controller_ptr) +{ + controller = controller_ptr; + + name = "Roccat Burst Pro Air"; + vendor = "Roccat"; + type = DEVICE_TYPE_MOUSE; + description = "Roccat Burst Pro Air Mouse"; + + mode Direct; + Direct.name = "Direct"; + Direct.value = ROCCAT_BURST_PRO_AIR_DIRECT_MODE_VALUE; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS; + Direct.color_mode = MODE_COLORS_PER_LED; + Direct.brightness = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX; + Direct.brightness_min = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MIN; + Direct.brightness_max = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX; + modes.push_back(Direct); + + mode Blink; + Blink.name = "Blink"; + Blink.value = ROCCAT_BURST_PRO_AIR_BLINK_MODE_VALUE; + Blink.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + Blink.color_mode = MODE_COLORS_PER_LED; + Blink.brightness = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX; + Blink.brightness_min = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MIN; + Blink.brightness_max = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX; + Blink.speed = ROCCAT_BURST_PRO_AIR_SPEED_MIN; + Blink.speed_min = ROCCAT_BURST_PRO_AIR_SPEED_MIN; + Blink.speed_max = ROCCAT_BURST_PRO_AIR_SPEED_MAX; + modes.push_back(Blink); + + mode Breath; + Breath.name = "Breathing"; + Breath.value = ROCCAT_BURST_PRO_AIR_BREATH_MODE_VALUE; + Breath.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + Breath.color_mode = MODE_COLORS_PER_LED; + Breath.brightness = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX; + Breath.brightness_min = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MIN; + Breath.brightness_max = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX; + Breath.speed = ROCCAT_BURST_PRO_AIR_SPEED_MIN; + Breath.speed_min = ROCCAT_BURST_PRO_AIR_SPEED_MIN; + Breath.speed_max = ROCCAT_BURST_PRO_AIR_SPEED_MAX; + modes.push_back(Breath); + + mode Wave; + Wave.name = "Wave"; + Wave.value = ROCCAT_BURST_PRO_AIR_WAVE_MODE_VALUE; + Wave.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + Wave.color_mode = MODE_COLORS_PER_LED; + Wave.brightness = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX; + Wave.brightness_min = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MIN; + Wave.brightness_max = ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX; + Wave.speed = ROCCAT_BURST_PRO_AIR_SPEED_MIN; + Wave.speed_min = ROCCAT_BURST_PRO_AIR_SPEED_MIN; + Wave.speed_max = ROCCAT_BURST_PRO_AIR_SPEED_MAX; + modes.push_back(Wave); + + SetupZones(); +} + +RGBController_RoccatBurstProAir::~RGBController_RoccatBurstProAir() +{ + delete controller; +} + +void RGBController_RoccatBurstProAir::SetupZones() +{ + zone new_zone; + new_zone.name = "Mouse"; + new_zone.type = ZONE_TYPE_LINEAR; + new_zone.leds_min = ROCCAT_BURST_PRO_AIR_PRO_NUMBER_OF_LEDS; + new_zone.leds_max = ROCCAT_BURST_PRO_AIR_PRO_NUMBER_OF_LEDS; + new_zone.leds_count = ROCCAT_BURST_PRO_AIR_PRO_NUMBER_OF_LEDS; + new_zone.matrix_map = NULL; + zones.push_back(new_zone); + + std::string led_names[ROCCAT_BURST_PRO_AIR_PRO_NUMBER_OF_LEDS] = + { + "Scroll Wheel", + "Logo", + "Left button", + "Right button" + }; + + for(unsigned int i = 0; i < ROCCAT_BURST_PRO_AIR_PRO_NUMBER_OF_LEDS; i++) + { + led new_led; + new_led.name = led_names[i]; + leds.push_back(new_led); + } + + SetupColors(); +} + +void RGBController_RoccatBurstProAir::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_RoccatBurstProAir::DeviceUpdateLEDs() +{ + UpdateZoneLEDs(0); +} + +void RGBController_RoccatBurstProAir::UpdateZoneLEDs(int /*zone_idx*/) +{ + controller->SetColors(colors); +} + +void RGBController_RoccatBurstProAir::UpdateSingleLED(int /*led_idx*/) +{ + UpdateZoneLEDs(0); +} + +void RGBController_RoccatBurstProAir::DeviceUpdateMode() +{ + const mode& active = modes[active_mode]; + controller->SetModeValues(active.value, active.speed, active.brightness); +} diff --git a/Controllers/RoccatController/RGBController_RoccatBurstProAir.h b/Controllers/RoccatController/RGBController_RoccatBurstProAir.h new file mode 100644 index 00000000..ab84a93c --- /dev/null +++ b/Controllers/RoccatController/RGBController_RoccatBurstProAir.h @@ -0,0 +1,29 @@ +/*-----------------------------------------*\ +| RGBController_RoccatBurstProAir.h | +| | +| Generic RGB Interface for Roccat Burst | +| Pro Air Mouse controller | +| | +| Morgan Guimard (morg) 6/16/2022 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "RoccatBurstProAirController.h" + +class RGBController_RoccatBurstProAir : public RGBController +{ +public: + RGBController_RoccatBurstProAir(RoccatBurstProAirController* controller_ptr); + ~RGBController_RoccatBurstProAir(); + + void SetupZones(); + void ResizeZone(int zone, int new_size); + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + void DeviceUpdateMode(); + +private: + RoccatBurstProAirController* controller; +}; diff --git a/Controllers/RoccatController/RoccatBurstProAirController.cpp b/Controllers/RoccatController/RoccatBurstProAirController.cpp new file mode 100644 index 00000000..7a1090d5 --- /dev/null +++ b/Controllers/RoccatController/RoccatBurstProAirController.cpp @@ -0,0 +1,96 @@ +/*-------------------------------------------------------------------*\ +| RoccatBurstProAirController.cpp | +| | +| Driver for Roccat Burst Pro Air Mouse | +| | +| Morgan Guimard (morg) 6/16/2022 | +\*-------------------------------------------------------------------*/ + +#include "RoccatBurstProAirController.h" + +#include + +RoccatBurstProAirController::RoccatBurstProAirController(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()); + } +} + +RoccatBurstProAirController::~RoccatBurstProAirController() +{ + hid_close(dev); +} + +std::string RoccatBurstProAirController::GetFirmwareVersion() +{ + return version; +} + +std::string RoccatBurstProAirController::GetSerialString() +{ + return serial_number; +} + +std::string RoccatBurstProAirController::GetDeviceLocation() +{ + return("HID: " + location); +} + +void RoccatBurstProAirController::SetColors(std::vector colors) +{ + unsigned char usb_buf[ROCCAT_BURST_PRO_AIR_REPORT_SIZE]; + memset(usb_buf, 0x00, ROCCAT_BURST_PRO_AIR_REPORT_SIZE); + + usb_buf[0] = ROCCAT_BURST_PRO_AIR_REPORT_ID; + + usb_buf[1] = 0x01; + usb_buf[2] = 0x4C; + usb_buf[3] = 0x06; + usb_buf[4] = 0x14; + + for(unsigned char i = 0; i < colors.size(); i++) + { + usb_buf[5 + 5 * i] = i + 1; + usb_buf[6 + 5 * i] = 0xFF; + usb_buf[7 + 5 * i] = RGBGetRValue(colors[i]); + usb_buf[8 + 5 * i] = RGBGetGValue(colors[i]); + usb_buf[9 + 5 * i] = RGBGetBValue(colors[i]); + } + + hid_send_feature_report(dev, usb_buf, ROCCAT_BURST_PRO_AIR_REPORT_SIZE); +} + +void RoccatBurstProAirController::SetModeValues(unsigned char mode_value, unsigned char speed, unsigned char brightness) +{ + unsigned char usb_buf[ROCCAT_BURST_PRO_AIR_REPORT_SIZE]; + memset(usb_buf, 0x00, ROCCAT_BURST_PRO_AIR_REPORT_SIZE); + + usb_buf[0] = ROCCAT_BURST_PRO_AIR_REPORT_ID; + + usb_buf[1] = 0x01; + usb_buf[2] = 0x4C; + usb_buf[3] = 0x06; + usb_buf[4] = 0x06; + + usb_buf[5] = mode_value; + usb_buf[6] = speed; + usb_buf[7] = brightness; + + usb_buf[8] = 0x0F; + + hid_send_feature_report(dev, usb_buf, ROCCAT_BURST_PRO_AIR_REPORT_SIZE); +} diff --git a/Controllers/RoccatController/RoccatBurstProAirController.h b/Controllers/RoccatController/RoccatBurstProAirController.h new file mode 100644 index 00000000..fa3e9093 --- /dev/null +++ b/Controllers/RoccatController/RoccatBurstProAirController.h @@ -0,0 +1,52 @@ +/*-------------------------------------------------------------------*\ +| RoccatBurstProAirController.h | +| | +| Driver for Roccat Burst Pro Air Mouse | +| | +| Morgan Guimard (morg) 6/16/2022 | +\*-------------------------------------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include + +#define ROCCAT_BURST_PRO_AIR_REPORT_ID 0x06 +#define ROCCAT_BURST_PRO_AIR_REPORT_SIZE 30 +#define ROCCAT_BURST_PRO_AIR_PRO_NUMBER_OF_LEDS 4 + +enum +{ + ROCCAT_BURST_PRO_AIR_DIRECT_MODE_VALUE = 0x01, + ROCCAT_BURST_PRO_AIR_BLINK_MODE_VALUE = 0x02, + ROCCAT_BURST_PRO_AIR_BREATH_MODE_VALUE = 0x03, + ROCCAT_BURST_PRO_AIR_WAVE_MODE_VALUE = 0x04 +}; + +enum +{ + ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MIN = 0x00, + ROCCAT_BURST_PRO_AIR_BRIGHTNESS_MAX = 0xFF, + ROCCAT_BURST_PRO_AIR_SPEED_MIN = 0x00, + ROCCAT_BURST_PRO_AIR_SPEED_MAX = 0x0B +}; + +class RoccatBurstProAirController +{ +public: + RoccatBurstProAirController(hid_device* dev_handle, const hid_device_info& info); + ~RoccatBurstProAirController(); + + std::string GetSerialString(); + std::string GetDeviceLocation(); + std::string GetFirmwareVersion(); + + void SetColors(std::vector colors); + void SetModeValues(unsigned char mode_value, unsigned char speed, unsigned char brightness); + +private: + hid_device* dev; + std::string location; + std::string serial_number; + std::string version; +}; diff --git a/Controllers/RoccatController/RoccatControllerDetect.cpp b/Controllers/RoccatController/RoccatControllerDetect.cpp index 972d2c18..22ca6387 100644 --- a/Controllers/RoccatController/RoccatControllerDetect.cpp +++ b/Controllers/RoccatController/RoccatControllerDetect.cpp @@ -1,5 +1,6 @@ #include "Detector.h" #include "RoccatBurstController.h" +#include "RoccatBurstProAirController.h" #include "RoccatKoneAimoController.h" #include "RoccatSenseAimoController.h" #include "RoccatVulcanKeyboardController.h" @@ -7,6 +8,7 @@ #include "RoccatEloController.h" #include "RGBController.h" #include "RGBController_RoccatBurst.h" +#include "RGBController_RoccatBurstProAir.h"" #include "RGBController_RoccatHordeAimo.h" #include "RGBController_RoccatKoneAimo.h" #include "RGBController_RoccatSenseAimo.h" @@ -31,6 +33,7 @@ #define ROCCAT_ELO_PID 0x3A34 #define ROCCAT_SENSE_AIMO_MID_PID 0x343A #define ROCCAT_SENSE_AIMO_XXL_PID 0x343B +#define ROCCAT_BURST_PRO_AIR_PID 0x2CA6 void DetectRoccatMouseControllers(hid_device_info* info, const std::string& name) { @@ -165,6 +168,19 @@ void DetectRoccatBurstProControllers(hid_device_info* info, const std::string& n } } +void DetectRoccatBurstProAirControllers(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + RoccatBurstProAirController * controller = new RoccatBurstProAirController(dev, *info); + RGBController_RoccatBurstProAir * rgb_controller = new RGBController_RoccatBurstProAir(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + void DetectRoccatKovaControllers(hid_device_info* info, const std::string& name) { hid_device* dev = hid_open_path(info->path); @@ -219,3 +235,5 @@ REGISTER_HID_DETECTOR_IPU("Roccat Kova", DetectRoccatKovaCont REGISTER_HID_DETECTOR_IPU("Roccat Elo 7.1", DetectRoccatEloControllers, ROCCAT_VID, ROCCAT_ELO_PID, 3, 0x0C, 1 ); REGISTER_HID_DETECTOR_IPU("Roccat Sense Aimo Mid", DetectRoccatSenseAimoControllers, ROCCAT_VID, ROCCAT_SENSE_AIMO_MID_PID, 0, 0xFF01, 1 ); REGISTER_HID_DETECTOR_IPU("Roccat Sense Aimo XXL", DetectRoccatSenseAimoControllers, ROCCAT_VID, ROCCAT_SENSE_AIMO_XXL_PID, 0, 0xFF01, 1 ); +REGISTER_HID_DETECTOR_IPU("Roccat Burst Pro Air", DetectRoccatBurstProAirControllers, ROCCAT_VID, ROCCAT_BURST_PRO_AIR_PID, 0, 0x01, 2); + diff --git a/OpenRGB.pro b/OpenRGB.pro index 440764e4..a84673ae 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -716,6 +716,7 @@ HEADERS += Controllers/RedSquareKeyroxController/RGBController_RedSquareKeyroxTKLClassic.h \ Controllers/RoccatController/RGBController_RoccatBurst.h \ Controllers/RoccatController/RGBController_RoccatElo.h \ + Controllers/RoccatController/RGBController_RoccatBurstProAir.h \ Controllers/RoccatController/RGBController_RoccatHordeAimo.h \ Controllers/RoccatController/RGBController_RoccatKoneAimo.h \ Controllers/RoccatController/RGBController_RoccatKova.h \ @@ -723,6 +724,7 @@ HEADERS += Controllers/RoccatController/RGBController_RoccatVulcanKeyboard.h \ Controllers/RoccatController/RoccatBurstController.h \ Controllers/RoccatController/RoccatEloController.h \ + Controllers/RoccatController/RoccatBurstProAirController.h \ Controllers/RoccatController/RoccatHordeAimoController.h \ Controllers/RoccatController/RoccatKoneAimoController.h \ Controllers/RoccatController/RoccatKovaController.h \ @@ -1451,6 +1453,7 @@ SOURCES += Controllers/RedSquareKeyroxController/RGBController_RedSquareKeyroxTKLClassic.cpp \ Controllers/RoccatController/RGBController_RoccatBurst.cpp \ Controllers/RoccatController/RGBController_RoccatElo.cpp \ + Controllers/RoccatController/RGBController_RoccatBurstProAir.cpp \ Controllers/RoccatController/RGBController_RoccatHordeAimo.cpp \ Controllers/RoccatController/RGBController_RoccatKoneAimo.cpp \ Controllers/RoccatController/RGBController_RoccatKova.cpp \ @@ -1458,6 +1461,7 @@ SOURCES += Controllers/RoccatController/RGBController_RoccatVulcanKeyboard.cpp \ Controllers/RoccatController/RoccatBurstController.cpp \ Controllers/RoccatController/RoccatEloController.cpp \ + Controllers/RoccatController/RoccatBurstProAirController.cpp \ Controllers/RoccatController/RoccatHordeAimoController.cpp \ Controllers/RoccatController/RoccatKoneAimoController.cpp \ Controllers/RoccatController/RoccatKovaController.cpp \