From 556fb634bbada79d8718ccab19e1f98417bda570 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sun, 29 Mar 2020 14:54:39 -0500 Subject: [PATCH] Clean up Redragon K556 code and add speed and color control --- .../RedragonK556Controller.cpp | 60 ++++++++-- .../RedragonK556Controller.h | 105 +++++++++++++++--- RGBController/RGBController_RedragonK556.cpp | 94 +++++++++++++--- 3 files changed, 213 insertions(+), 46 deletions(-) diff --git a/Controllers/RedragonController/RedragonK556Controller.cpp b/Controllers/RedragonController/RedragonK556Controller.cpp index c21188d9f..bd34ca8ac 100644 --- a/Controllers/RedragonController/RedragonK556Controller.cpp +++ b/Controllers/RedragonController/RedragonK556Controller.cpp @@ -39,6 +39,40 @@ void RedragonK556Controller::SetKeyboardColors } } +void RedragonK556Controller::SendKeyboardMode + ( + unsigned char mode + ) +{ + SendKeyboardParameter(REDRAGON_K556_PARAMETER_MODE, 1, &mode); +} + +void RedragonK556Controller::SendKeyboardModeEx + ( + unsigned char mode, + unsigned char brightness, + unsigned char speed, + unsigned char direction, + unsigned char random_flag, + unsigned char red, + unsigned char green, + unsigned char blue + ) +{ + unsigned char parameter_data[8]; + + parameter_data[0] = mode; + parameter_data[1] = brightness; + parameter_data[2] = speed; + parameter_data[3] = direction; + parameter_data[4] = random_flag; + parameter_data[5] = red; + parameter_data[6] = green; + parameter_data[7] = blue; + + SendKeyboardParameter(0, 8, parameter_data); +} + /*-------------------------------------------------------------------------------------------------*\ | Private packet sending functions. | \*-------------------------------------------------------------------------------------------------*/ @@ -74,9 +108,9 @@ void RedragonK556Controller::SendKeyboardBegin() | fixed | \*-----------------------------------------------------*/ usb_buf[0x00] = 0x04; - usb_buf[0x01] = 0x01; + usb_buf[0x01] = REDRAGON_K556_COMMAND_BEGIN; usb_buf[0x02] = 0x00; - usb_buf[0x03] = 0x01; + usb_buf[0x03] = REDRAGON_K556_COMMAND_BEGIN; /*-----------------------------------------------------*\ | Send packet | @@ -100,9 +134,9 @@ void RedragonK556Controller::SendKeyboardEnd() | fixed | \*-----------------------------------------------------*/ usb_buf[0x00] = 0x04; - usb_buf[0x01] = 0x02; + usb_buf[0x01] = REDRAGON_K556_COMMAND_END; usb_buf[0x02] = 0x00; - usb_buf[0x03] = 0x02; + usb_buf[0x03] = REDRAGON_K556_COMMAND_END; /*-----------------------------------------------------*\ | Send packet | @@ -152,9 +186,11 @@ void RedragonK556Controller::SendKeyboardData hid_read(dev, (unsigned char *)usb_buf, 64); } -void RedragonK556Controller::SendKeyboardMode +void RedragonK556Controller::SendKeyboardParameter ( - unsigned char mode + unsigned char parameter, + unsigned char parameter_size, + unsigned char* parameter_data ) { char usb_buf[64]; @@ -168,11 +204,15 @@ void RedragonK556Controller::SendKeyboardMode | Set up Keyboard Parameter (0x06) packet | \*-----------------------------------------------------*/ usb_buf[0x00] = 0x04; - usb_buf[0x03] = 0x06; - usb_buf[0x04] = 0x01; + usb_buf[0x03] = REDRAGON_K556_COMMAND_SET_PARAMETER; + usb_buf[0x04] = parameter_size; + usb_buf[0x05] = parameter; + + /*-----------------------------------------------------*\ + | Copy in data bytes | + \*-----------------------------------------------------*/ + memcpy(&usb_buf[0x08], parameter_data, parameter_size); - usb_buf[0x08] = mode; - /*-----------------------------------------------------*\ | Compute Checksum | \*-----------------------------------------------------*/ diff --git a/Controllers/RedragonController/RedragonK556Controller.h b/Controllers/RedragonController/RedragonK556Controller.h index 1b9c91b44..aebe447a4 100644 --- a/Controllers/RedragonController/RedragonK556Controller.h +++ b/Controllers/RedragonController/RedragonK556Controller.h @@ -16,27 +16,77 @@ #define REDRAGON_K556_MAX_PACKET_SIZE ( 0x36 ) /* max packet size for color*/ /* update packets */ +enum +{ + REDRAGON_K556_COMMAND_BEGIN = 0x01, /* Begin packet command */ + REDRAGON_K556_COMMAND_END = 0x02, /* End packet command */ + REDRAGON_K556_COMMAND_SET_PARAMETER = 0x06, /* Set parameter command */ + REDRAGON_K556_COMMAND_READ_CUSTOM_COLOR_DATA = 0x10, /* Read custom color data */ + REDRAGON_K556_COMMAND_WRITE_CUSTOM_COLOR_DATA = 0x11, /* Write custom color data */ +}; enum { - REDRAGON_K556_MODE_COLOR_WAVE_SHORT = 0x01, /* "Go with the stream" */ - REDRAGON_K556_MODE_COLOR_WAVE_LONG = 0x02, /* "Clouds fly" */ - REDRAGON_K556_MODE_COLOR_WHEEL = 0x03, /* "Winding paths" */ - REDRAGON_K556_MODE_SPECTRUM_CYCLE = 0x04, /* "The trial of light" */ - REDRAGON_K556_MODE_BREATHING = 0x05, /* "Breathing" */ - REDRAGON_K556_MODE_STATIC = 0x06, /* "Normally on" */ - REDRAGON_K556_MODE_REACTIVE = 0x07, /* "Pass without trace" */ - REDRAGON_K556_MODE_REACTIVE_RIPPLE = 0x08, /* "Ripple graff" */ - REDRAGON_K556_MODE_REACTIVE_LINE = 0x09, /* "Fast run without trace" */ - REDRAGON_K556_MODE_STARLIGHT_FAST = 0x0A, /* "Swift action" */ - REDRAGON_K556_MODE_BLOOMING = 0x0B, /* "Flowers blooming" */ - REDRAGON_K556_MODE_RAINBOW_WAVE_VERTICAL = 0x0C, /* "Snow winter jasmine" */ - REDRAGON_K556_MODE_HURRICANE = 0x0D, /* "Hurricane" */ - REDRAGON_K556_MODE_ACCUMULATE = 0x0E, /* "Accumulate" */ - REDRAGON_K556_MODE_STARLIGHT_SLOW = 0x0F, /* "Digital times" */ - REDRAGON_K556_MODE_VISOR = 0x10, /* "Both ways" */ - REDRAGON_K556_MODE_RAINBOW_WAVE_CIRCLE = 0x12, /* "Fast and the Furious" */ - REDRAGON_K556_MODE_CUSTOM = 0x14, /* "Coastal" */ + REDRAGON_K556_PARAMETER_MODE = 0x00, /* Mode parameter */ + REDRAGON_K556_PARAMETER_BRIGHTNESS = 0x01, /* Brightness parameter */ + REDRAGON_K556_PARAMETER_SPEED = 0x02, /* Speed parameter */ + REDRAGON_K556_PARAMETER_DIRECTION = 0x03, /* Direction parameter */ + REDRAGON_K556_PARAMETER_RANDOM_COLOR_FLAG = 0x04, /* Random color parameter */ + REDRAGON_K556_PARAMETER_MODE_COLOR = 0x05, /* Mode color (RGB) */ + REDRAGON_K556_PARAMETER_POLLING_RATE = 0x0F, /* Polling rate */ + REDRAGON_K556_PARAMETER_SURMOUNT_MODE_COLOR = 0x11, /* Surmount mode color */ +}; + +enum +{ + REDRAGON_K556_MODE_COLOR_WAVE_SHORT = 0x01, /* "Go with the stream" */ + REDRAGON_K556_MODE_COLOR_WAVE_LONG = 0x02, /* "Clouds fly" */ + REDRAGON_K556_MODE_COLOR_WHEEL = 0x03, /* "Winding paths" */ + REDRAGON_K556_MODE_SPECTRUM_CYCLE = 0x04, /* "The trial of light" */ + REDRAGON_K556_MODE_BREATHING = 0x05, /* "Breathing" */ + REDRAGON_K556_MODE_STATIC = 0x06, /* "Normally on" */ + REDRAGON_K556_MODE_REACTIVE = 0x07, /* "Pass without trace" */ + REDRAGON_K556_MODE_REACTIVE_RIPPLE = 0x08, /* "Ripple graff" */ + REDRAGON_K556_MODE_REACTIVE_LINE = 0x09, /* "Fast run without trace" */ + REDRAGON_K556_MODE_STARLIGHT_FAST = 0x0A, /* "Swift action" */ + REDRAGON_K556_MODE_BLOOMING = 0x0B, /* "Flowers blooming" */ + REDRAGON_K556_MODE_RAINBOW_WAVE_VERTICAL = 0x0C, /* "Snow winter jasmine" */ + REDRAGON_K556_MODE_HURRICANE = 0x0D, /* "Hurricane" */ + REDRAGON_K556_MODE_ACCUMULATE = 0x0E, /* "Accumulate" */ + REDRAGON_K556_MODE_STARLIGHT_SLOW = 0x0F, /* "Digital times" */ + REDRAGON_K556_MODE_VISOR = 0x10, /* "Both ways" */ + REDRAGON_K556_MODE_SURMOUNT = 0x11, /* "Surmount" */ + REDRAGON_K556_MODE_RAINBOW_WAVE_CIRCLE = 0x12, /* "Fast and the Furious" */ + REDRAGON_K556_MODE_CUSTOM = 0x14, /* "Coastal" */ +}; + +enum +{ + REDRAGON_K556_BRIGHTNESS_LOWEST = 0x00, /* Lowest brightness (off) */ + REDRAGON_K556_BRIGHTNESS_HIGHEST = 0x05, /* Highest brightness */ +}; + +enum +{ + REDRAGON_K556_SPEED_SLOWEST = 0x05, /* Slowest speed setting */ + REDRAGON_K556_SPEED_NORMAL = 0x03, /* Normal speed setting */ + REDRAGON_K556_SPEED_FASTEST = 0x00, /* Fastest speed setting */ +}; + +enum +{ + REDRAGON_K556_SURMOUNT_MODE_COLOR_RED = 0x01, /* Red surmount color */ + REDRAGON_K556_SURMOUNT_MODE_COLOR_YELLOW = 0x02, /* Yellow surmount color */ + REDRAGON_K556_SURMOUNT_MODE_COLOR_GREEN = 0x03, /* Green surmount color */ + REDRAGON_K556_SURMOUNT_MODE_COLOR_BLUE = 0x04, /* Blue surmount color */ +}; + +enum +{ + REDRAGON_K556_POLLING_RATE_125HZ = 0x00, /* 125Hz polling rate */ + REDRAGON_K556_POLLING_RATE_250HZ = 0x01, /* 250Hz polling rate */ + REDRAGON_K556_POLLING_RATE_500HZ = 0x02, /* 500Hz polling rate */ + REDRAGON_K556_POLLING_RATE_1000HZ = 0x03, /* 1000Hz polling rate */ }; class RedragonK556Controller @@ -58,6 +108,18 @@ public: unsigned char mode ); + void SendKeyboardModeEx + ( + unsigned char mode, + unsigned char brightness, + unsigned char speed, + unsigned char direction, + unsigned char random_flag, + unsigned char red, + unsigned char green, + unsigned char blue + ); + void SendKeyboardData ( unsigned char * data, @@ -74,4 +136,11 @@ private: ( char usb_buf[64] ); + + void SendKeyboardParameter + ( + unsigned char parameter, + unsigned char parameter_size, + unsigned char* parameter_data + ); }; diff --git a/RGBController/RGBController_RedragonK556.cpp b/RGBController/RGBController_RedragonK556.cpp index 51d934845..628ad2208 100644 --- a/RGBController/RGBController_RedragonK556.cpp +++ b/RGBController/RGBController_RedragonK556.cpp @@ -27,7 +27,10 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r mode ColorWave; ColorWave.name = "Color Wave"; ColorWave.value = REDRAGON_K556_MODE_COLOR_WAVE_LONG; - ColorWave.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + ColorWave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + ColorWave.speed_min = REDRAGON_K556_SPEED_SLOWEST; + ColorWave.speed_max = REDRAGON_K556_SPEED_FASTEST; + ColorWave.speed = REDRAGON_K556_SPEED_NORMAL; ColorWave.colors_min = 1; ColorWave.colors_max = 1; ColorWave.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -37,7 +40,10 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r mode ColorWheel; ColorWheel.name = "Color Wheel"; ColorWheel.value = REDRAGON_K556_MODE_COLOR_WHEEL; - ColorWheel.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + ColorWheel.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + ColorWheel.speed_min = REDRAGON_K556_SPEED_SLOWEST; + ColorWheel.speed_max = REDRAGON_K556_SPEED_FASTEST; + ColorWheel.speed = REDRAGON_K556_SPEED_NORMAL; ColorWheel.colors_min = 1; ColorWheel.colors_max = 1; ColorWheel.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -47,14 +53,20 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r mode SpectrumCycle; SpectrumCycle.name = "Spectrum Cycle"; SpectrumCycle.value = REDRAGON_K556_MODE_SPECTRUM_CYCLE; - SpectrumCycle.flags = 0; + SpectrumCycle.flags = MODE_FLAG_HAS_SPEED; + SpectrumCycle.speed_min = REDRAGON_K556_SPEED_SLOWEST; + SpectrumCycle.speed_max = REDRAGON_K556_SPEED_FASTEST; + SpectrumCycle.speed = REDRAGON_K556_SPEED_NORMAL; SpectrumCycle.color_mode = MODE_COLORS_NONE; modes.push_back(SpectrumCycle); mode Breathing; Breathing.name = "Breathing"; Breathing.value = REDRAGON_K556_MODE_BREATHING; - Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + Breathing.speed_min = REDRAGON_K556_SPEED_SLOWEST; + Breathing.speed_max = REDRAGON_K556_SPEED_FASTEST; + Breathing.speed = REDRAGON_K556_SPEED_NORMAL; Breathing.colors_min = 1; Breathing.colors_max = 1; Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -62,9 +74,12 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r modes.push_back(Breathing); mode Hurricane; - Hurricane.name = "Hurricane"; - Hurricane.value = REDRAGON_K556_MODE_HURRICANE; - Hurricane.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Hurricane.name = "Hurricane"; + Hurricane.value = REDRAGON_K556_MODE_HURRICANE; + Hurricane.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + Hurricane.speed_min = REDRAGON_K556_SPEED_SLOWEST; + Hurricane.speed_max = REDRAGON_K556_SPEED_FASTEST; + Hurricane.speed = REDRAGON_K556_SPEED_NORMAL; Hurricane.colors_min = 1; Hurricane.colors_max = 1; Hurricane.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -74,7 +89,10 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r mode Accumulate; Accumulate.name = "Accumulate"; Accumulate.value = REDRAGON_K556_MODE_ACCUMULATE; - Accumulate.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Accumulate.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + Accumulate.speed_min = REDRAGON_K556_SPEED_SLOWEST; + Accumulate.speed_max = REDRAGON_K556_SPEED_FASTEST; + Accumulate.speed = REDRAGON_K556_SPEED_NORMAL; Accumulate.colors_min = 1; Accumulate.colors_max = 1; Accumulate.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -84,7 +102,10 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r mode Starlight; Starlight.name = "Starlight"; Starlight.value = REDRAGON_K556_MODE_STARLIGHT_FAST; - Starlight.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Starlight.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + Starlight.speed_min = REDRAGON_K556_SPEED_SLOWEST; + Starlight.speed_max = REDRAGON_K556_SPEED_FASTEST; + Starlight.speed = REDRAGON_K556_SPEED_NORMAL; Starlight.colors_min = 1; Starlight.colors_max = 1; Starlight.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -94,7 +115,10 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r mode Visor; Visor.name = "Visor"; Visor.value = REDRAGON_K556_MODE_VISOR; - Visor.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Visor.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + Visor.speed_min = REDRAGON_K556_SPEED_SLOWEST; + Visor.speed_max = REDRAGON_K556_SPEED_FASTEST; + Visor.speed = REDRAGON_K556_SPEED_NORMAL; Visor.colors_min = 1; Visor.colors_max = 1; Visor.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -112,23 +136,29 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r modes.push_back(Static); mode RainbowCircle; - RainbowCircle.name = "Rainbow Circle"; - RainbowCircle.value = REDRAGON_K556_MODE_RAINBOW_WAVE_CIRCLE; - RainbowCircle.flags = 0; + RainbowCircle.name = "Rainbow Circle"; + RainbowCircle.value = REDRAGON_K556_MODE_RAINBOW_WAVE_CIRCLE; + RainbowCircle.flags = 0; RainbowCircle.color_mode = MODE_COLORS_NONE; modes.push_back(RainbowCircle); mode Blooming; Blooming.name = "Blooming"; Blooming.value = REDRAGON_K556_MODE_BLOOMING; - Blooming.flags = 0; + Blooming.flags = MODE_FLAG_HAS_SPEED; + Blooming.speed_min = REDRAGON_K556_SPEED_SLOWEST; + Blooming.speed_max = REDRAGON_K556_SPEED_FASTEST; + Blooming.speed = REDRAGON_K556_SPEED_NORMAL; Blooming.color_mode = MODE_COLORS_NONE; modes.push_back(Blooming); mode Reactive; Reactive.name = "Reactive"; Reactive.value = REDRAGON_K556_MODE_REACTIVE; - Reactive.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + Reactive.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + Reactive.speed_min = REDRAGON_K556_SPEED_SLOWEST; + Reactive.speed_max = REDRAGON_K556_SPEED_FASTEST; + Reactive.speed = REDRAGON_K556_SPEED_NORMAL; Reactive.colors_min = 1; Reactive.colors_max = 1; Reactive.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -138,7 +168,10 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r mode ReactiveRipple; ReactiveRipple.name = "Reactive Ripple"; ReactiveRipple.value = REDRAGON_K556_MODE_REACTIVE_RIPPLE; - ReactiveRipple.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + ReactiveRipple.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + ReactiveRipple.speed_min = REDRAGON_K556_SPEED_SLOWEST; + ReactiveRipple.speed_max = REDRAGON_K556_SPEED_FASTEST; + ReactiveRipple.speed = REDRAGON_K556_SPEED_NORMAL; ReactiveRipple.colors_min = 1; ReactiveRipple.colors_max = 1; ReactiveRipple.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -148,7 +181,10 @@ RGBController_RedragonK556::RGBController_RedragonK556(RedragonK556Controller* r mode ReactiveLine; ReactiveLine.name = "Reactive Line"; ReactiveLine.value = REDRAGON_K556_MODE_REACTIVE_LINE; - ReactiveLine.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + ReactiveLine.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR; + ReactiveLine.speed_min = REDRAGON_K556_SPEED_SLOWEST; + ReactiveLine.speed_max = REDRAGON_K556_SPEED_FASTEST; + ReactiveLine.speed = REDRAGON_K556_SPEED_NORMAL; ReactiveLine.colors_min = 1; ReactiveLine.colors_max = 1; ReactiveLine.color_mode = MODE_COLORS_MODE_SPECIFIC; @@ -225,5 +261,27 @@ void RGBController_RedragonK556::SetCustomMode() void RGBController_RedragonK556::UpdateMode() { - redragon->SendKeyboardMode(modes[active_mode].value); + unsigned char red = 0x00; + unsigned char grn = 0x00; + unsigned char blu = 0x00; + unsigned char random = (modes[active_mode].color_mode == MODE_COLORS_RANDOM); + + if(modes[active_mode].colors.size() > 0) + { + red = RGBGetRValue(modes[active_mode].colors[0]); + grn = RGBGetGValue(modes[active_mode].colors[0]); + blu = RGBGetBValue(modes[active_mode].colors[0]); + } + + redragon->SendKeyboardModeEx + ( + modes[active_mode].value, + REDRAGON_K556_BRIGHTNESS_HIGHEST, + modes[active_mode].speed, + 0, + random, + red, + grn, + blu + ); }