Clean up Redragon K556 code and add speed and color control

This commit is contained in:
Adam Honse
2020-03-29 14:54:39 -05:00
parent e39617a665
commit 556fb634bb
3 changed files with 213 additions and 46 deletions

View File

@@ -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 |
\*-----------------------------------------------------*/

View File

@@ -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
);
};

View File

@@ -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
);
}