From ca054abbcf61b3e7c8477fd36d4f995418ad8c6c Mon Sep 17 00:00:00 2001 From: as3210 Date: Sat, 20 Jan 2024 08:24:57 +0000 Subject: [PATCH] Improve cherry code, e.g. for full size 10.0N RGB --- .../CherryKeyboardController.cpp | 26 +- .../CherryKeyboardController.h | 28 ++ .../CherryKeyboardControllerDetect.cpp | 30 +- .../RGBController_CherryKeyboard.cpp | 416 +++++++++++------- .../RGBController_CherryKeyboard.h | 4 +- 5 files changed, 307 insertions(+), 197 deletions(-) diff --git a/Controllers/CherryKeyboardController/CherryKeyboardController.cpp b/Controllers/CherryKeyboardController/CherryKeyboardController.cpp index d9f36b74..690d5d5b 100644 --- a/Controllers/CherryKeyboardController/CherryKeyboardController.cpp +++ b/Controllers/CherryKeyboardController/CherryKeyboardController.cpp @@ -95,18 +95,19 @@ void CherryKeyboardController::SendKeyboardModeEx unsigned char blue ) { - unsigned char parameter_data[8]; + unsigned char parameter_data[9]; - 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; + parameter_data[0] = 0x0; + parameter_data[1] = mode; + parameter_data[2] = brightness; + parameter_data[3] = speed; + parameter_data[4] = direction; + parameter_data[5] = random_flag; + parameter_data[6] = red; + parameter_data[7] = green; + parameter_data[8] = blue; - SendKeyboardParameter(0, 8, parameter_data); + SendKeyboardParameter(0, 9, parameter_data); } /*-------------------------------------------------------------------------------------------------*\ @@ -237,17 +238,18 @@ void CherryKeyboardController::SendKeyboardParameter memset(usb_buf, 0x00, sizeof(usb_buf)); /*-----------------------------------------------------*\ - | Set up Keyboard Parameter (0x06) packet | + | Set up Keyboard Parameter (0x08) packet | \*-----------------------------------------------------*/ usb_buf[0x00] = 0x04; usb_buf[0x03] = CHERRY_KB_COMMAND_SET_PARAMETER; usb_buf[0x04] = parameter_size; usb_buf[0x05] = parameter; + usb_buf[0x07] = 0x55; /*-----------------------------------------------------*\ | Copy in data bytes | \*-----------------------------------------------------*/ - memcpy(&usb_buf[0x09], parameter_data, parameter_size); + memcpy(&usb_buf[0x08], parameter_data, parameter_size); /*-----------------------------------------------------*\ | Compute Checksum | diff --git a/Controllers/CherryKeyboardController/CherryKeyboardController.h b/Controllers/CherryKeyboardController/CherryKeyboardController.h index b1212abb..e7ca4b5d 100644 --- a/Controllers/CherryKeyboardController/CherryKeyboardController.h +++ b/Controllers/CherryKeyboardController/CherryKeyboardController.h @@ -17,6 +17,34 @@ #define CHERRY_KB_PACKET_SIZE 64 #define CHERRY_KB_MAX_PACKET_SIZE ( 0x36 )/* max packet size for color*/ /* update packets */ + +/*-----------------------------------------------------*\ +| Cherry keyboard product IDs | +\*-----------------------------------------------------*/ +#define MX_BOARD_3_0S_FL_NBL_PID 0x0077 +#define MX_BOARD_3_0S_FL_RGB_PID 0x0079 +#define MX_BOARD_3_0S_FL_RGB_KOR_PID 0x0083 +#define MX_1_0_FL_BL_PID 0x00AB +#define MX_BOARD_1_0_TKL_RGB_PID 0x00AC +#define MX_BOARD_8_0_TKL_RGB_PID 0x00B7 +#define MX_BOARD_10_0_FL_RGB_PID 0x00BB +#define G80_3000_TKL_NBL_PID 0x00C3 +#define MX_BOARD_2_0S_FL_RGB_PID 0x00C4 +#define G80_3000_TKL_RGB_PID 0x00C5 +#define MV_BOARD_3_0FL_RGB_PID 0x00C7 +#define CCF_MX_8_0_TKL_BL_PID 0x00C9 +#define CCF_MX_1_0_TKL_BL_PID 0x00CA +#define CCF_MX_1_0_TKL_NBL_PID 0x00CB +#define G80_3000_TKL_NBL_KOR_PID 0x00CD +#define MX_BOARD_2_0S_FL_NBL_PID 0x00CE +#define MX_1_0_FL_NBL_PID 0x00D2 +#define MX_1_0_FL_RGB_PID 0x00D3 +#define G80_3000N_TKL_RGB_PID 0x00DD +#define G80_3000N_FL_RGB_PID 0x00DE +#define MX_BOARD_10_0N_FL_RGB_PID 0x00DF +#define MX_BOARD_2_0S_FL_RGB_DE_PID 0x01A6 + + enum { CHERRY_KB_COMMAND_BEGIN = 0x01, /* Begin packet command */ diff --git a/Controllers/CherryKeyboardController/CherryKeyboardControllerDetect.cpp b/Controllers/CherryKeyboardController/CherryKeyboardControllerDetect.cpp index ca632601..140f088b 100644 --- a/Controllers/CherryKeyboardController/CherryKeyboardControllerDetect.cpp +++ b/Controllers/CherryKeyboardController/CherryKeyboardControllerDetect.cpp @@ -6,32 +6,10 @@ #include /*-----------------------------------------------------*\ -| Keyboard product IDs | +| Cherry keyboard VID and usage page | \*-----------------------------------------------------*/ #define CHERRY_KEYBOARD_VID 0x046A #define CHERRY_KEYBOARD_USAGE_PAGE 0xFF1C -#define MX_BOARD_3_0S_FL_NBL_PID 0x0077 -#define MX_BOARD_3_0S_FL_RGB_PID 0x0079 -#define MX_BOARD_3_0S_FL_RGB_KOR_PID 0x0083 -#define MX_1_0_FL_BL_PID 0x00AB -#define MX_BOARD_1_0_TKL_RGB_PID 0x00AC -#define MX_BOARD_8_0_TKL_RGB_PID 0x00B7 -#define MX_BOARD_10_0_FL_RGB_PID 0x00BB -#define G80_3000_TKL_NBL_PID 0x00C3 -#define MX_BOARD_2_0S_FL_RGB_PID 0x00C4 -#define G80_3000_TKL_RGB_PID 0x00C5 -#define MV_BOARD_3_0FL_RGB_PID 0x00C7 -#define CCF_MX_8_0_TKL_BL_PID 0x00C9 -#define CCF_MX_1_0_TKL_BL_PID 0x00CA -#define CCF_MX_1_0_TKL_NBL_PID 0x00CB -#define G30_3000_TKL_NBL_KOR_PID 0x00CD -#define MX_BOARD_2_0S_FL_NBL_PID 0x00CE -#define MX_1_0_FL_NBL_PID 0x00D2 -#define MX_1_0_FL_RGB_PID 0x00D3 -#define G80_3000N_TKL_RGB_PID 0x00DD -#define G30_3000N_FL_RGB_PID 0x00DE -#define MX_BOARD_10_0N_FL_RGB_PID 0x00DF -#define MX_BOARD_2_0S_FL_RGB_DE_PID 0x01A6 /******************************************************************************************\ * * @@ -47,7 +25,7 @@ void DetectCherryKeyboards(hid_device_info* info, const std::string& name) if( dev ) { CherryKeyboardController* controller = new CherryKeyboardController(dev, info->path); - RGBController_CherryKeyboard* rgb_controller = new RGBController_CherryKeyboard(controller); + RGBController_CherryKeyboard* rgb_controller = new RGBController_CherryKeyboard(controller, info->product_id); rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); } @@ -70,11 +48,11 @@ REGISTER_HID_DETECTOR_IP("Cherry Keyboard MV BOARD 3.0 FL RGB", DetectCh REGISTER_HID_DETECTOR_IP("Cherry Keyboard CCF MX 8.0 TKL BL", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, CCF_MX_8_0_TKL_BL_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("Cherry Keyboard CCF MX 1.0 TKL BL", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, CCF_MX_1_0_TKL_BL_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("Cherry Keyboard CCF MX 1.0 TKL NBL", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, CCF_MX_1_0_TKL_NBL_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); -REGISTER_HID_DETECTOR_IP("Cherry Keyboard G80-3000 TKL NBL KOREAN", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, G30_3000_TKL_NBL_KOR_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); +REGISTER_HID_DETECTOR_IP("Cherry Keyboard G80-3000 TKL NBL KOREAN", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, G80_3000_TKL_NBL_KOR_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("Cherry Keyboard MX BOARD 2.0S FL NBL", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, MX_BOARD_2_0S_FL_NBL_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("Cherry Keyboard MX 1.0 FL NBL", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, MX_1_0_FL_NBL_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("Cherry Keyboard MX 1.0 FL RGB", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, MX_1_0_FL_RGB_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("Cherry Keyboard G80-3000N TKL RGB", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, G80_3000N_TKL_RGB_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); -REGISTER_HID_DETECTOR_IP("Cherry Keyboard G80-3000N FL RGB", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, G30_3000N_FL_RGB_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); +REGISTER_HID_DETECTOR_IP("Cherry Keyboard G80-3000N FL RGB", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, G80_3000N_FL_RGB_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("Cherry Keyboard MX BOARD 10.0N FL RGB", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, MX_BOARD_10_0N_FL_RGB_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); REGISTER_HID_DETECTOR_IP("Cherry Keyboard MX BOARD 2.0S FL RGB DE", DetectCherryKeyboards, CHERRY_KEYBOARD_VID, MX_BOARD_2_0S_FL_RGB_DE_PID , 1, CHERRY_KEYBOARD_USAGE_PAGE); diff --git a/Controllers/CherryKeyboardController/RGBController_CherryKeyboard.cpp b/Controllers/CherryKeyboardController/RGBController_CherryKeyboard.cpp index 61eb9d7b..68694f88 100644 --- a/Controllers/CherryKeyboardController/RGBController_CherryKeyboard.cpp +++ b/Controllers/CherryKeyboardController/RGBController_CherryKeyboard.cpp @@ -11,14 +11,20 @@ //0xFFFFFFFF indicates an unused entry in matrix #define NA 0xFFFFFFFF +#define CHERRY_MATRIX_MAP_HEIGHT 6 +#define CHERRY_MATRIX_MAP_WIDTH 21 +#define CHERRY_MATRIX_CELL_COUNT ( CHERRY_MATRIX_MAP_HEIGHT * CHERRY_MATRIX_MAP_WIDTH ) -static unsigned int matrix_map[6][23] = - { { 0, NA, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96, NA, NA, NA, NA, NA, NA }, - { 1, 7, 13, 19, 25, 31, 37, 43, 49, 55, 61, 67, 73, 79, 85, 91, 97, NA, NA, NA, NA, NA, NA }, - { 2, 8, 14, 20, 26, 32, 38, 44, 50, 56, 62, 68, 74, NA, 86, 92, 98, NA, NA, NA, NA, NA, NA }, - { 3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, NA, NA, NA, NA, NA, NA, NA, NA, NA }, - { 4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 64, 70, NA, 82, NA, 94, NA, NA, NA, NA, NA, NA, NA }, - { 5, 11, 17, NA, NA, NA, 41, NA, NA, NA, 65, 71, 77, 83, 89, 95, 101, NA, NA, NA, NA, NA, NA } }; +/* The total byte count for all colors is 'number of matrix cells' times '3 color components' */ +#define CUSTOM_COLOR_ARRAY_BYTE_COUNT ( CHERRY_MATRIX_CELL_COUNT * 3 ) + +static unsigned int matrix_map[CHERRY_MATRIX_MAP_HEIGHT][CHERRY_MATRIX_MAP_WIDTH] = + { { 0, NA, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96, 102, 108, 114, 120 }, + { 1, 7, 13, 19, 25, 31, 37, 43, 49, 55, 61, 67, 73, 79, 85, 91, 97, 103, 109, 115, 121 }, + { 2, 8, 14, 20, 26, 32, 38, 44, 50, 56, 62, 68, 74, NA, 86, 92, 98, 104, 110, 116, NA }, + { 3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, NA, NA, NA, 105, 111, 117, 122 }, + { 4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 64, 70, NA, 82, NA, 94, NA, 106, 112, 118, NA }, + { 5, 11, 17, NA, NA, NA, 41, NA, NA, NA, 65, 71, 77, 83, 89, 95, 101, 113, NA, 119, 124 } }; /**------------------------------------------------------------------*\ @name Cherry Keyboard @@ -31,7 +37,7 @@ static unsigned int matrix_map[6][23] = @comment \*-------------------------------------------------------------------*/ -RGBController_CherryKeyboard::RGBController_CherryKeyboard(CherryKeyboardController* controller_ptr) +RGBController_CherryKeyboard::RGBController_CherryKeyboard(CherryKeyboardController* controller_ptr, uint16_t product_id) { controller = controller_ptr; @@ -43,202 +49,259 @@ RGBController_CherryKeyboard::RGBController_CherryKeyboard(CherryKeyboardControl serial = controller->GetSerialString(); mode Custom; - Custom.name = "Custom"; - Custom.value = CHERRY_KB_MODE_CUSTOM; - Custom.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Custom.color_mode = MODE_COLORS_PER_LED; + Custom.name = "Custom"; + Custom.value = CHERRY_KB_MODE_CUSTOM; + Custom.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Custom.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Custom.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Custom.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Custom.color_mode = MODE_COLORS_PER_LED; modes.push_back(Custom); mode Wave; - Wave.name = "Wave"; - Wave.value = CHERRY_KB_MODE_WAVE; - Wave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Wave.speed_min = CHERRY_KB_SPEED_SLOWEST; - Wave.speed_max = CHERRY_KB_SPEED_FASTEST; - Wave.speed = CHERRY_KB_SPEED_NORMAL; - Wave.colors_min = 1; - Wave.colors_max = 1; - Wave.color_mode = MODE_COLORS_MODE_SPECIFIC; + Wave.name = "Wave"; + Wave.value = CHERRY_KB_MODE_WAVE; + Wave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Wave.speed_min = CHERRY_KB_SPEED_SLOWEST; + Wave.speed_max = CHERRY_KB_SPEED_FASTEST; + Wave.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Wave.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Wave.colors_min = 1; + Wave.colors_max = 1; + Wave.speed = CHERRY_KB_SPEED_NORMAL; + Wave.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Wave.color_mode = MODE_COLORS_MODE_SPECIFIC; Wave.colors.resize(1); modes.push_back(Wave); mode Spectrum; - Spectrum.name = "Spectrum"; - Spectrum.value = CHERRY_KB_MODE_SPECTRUM; - Spectrum.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE; - Spectrum.speed_min = CHERRY_KB_SPEED_SLOWEST; - Spectrum.speed_max = CHERRY_KB_SPEED_FASTEST; - Spectrum.speed = CHERRY_KB_SPEED_NORMAL; - Spectrum.color_mode = MODE_COLORS_NONE; + Spectrum.name = "Spectrum"; + Spectrum.value = CHERRY_KB_MODE_SPECTRUM; + Spectrum.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_AUTOMATIC_SAVE; + Spectrum.speed_min = CHERRY_KB_SPEED_SLOWEST; + Spectrum.speed_max = CHERRY_KB_SPEED_FASTEST; + Spectrum.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Spectrum.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Spectrum.speed = CHERRY_KB_SPEED_NORMAL; + Spectrum.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Spectrum.color_mode = MODE_COLORS_NONE; Spectrum.colors.resize(1); modes.push_back(Spectrum); mode Breathing; - Breathing.name = "Breathing"; - Breathing.value = CHERRY_KB_MODE_BREATHING; - Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Breathing.speed_min = CHERRY_KB_SPEED_SLOWEST; - Breathing.speed_max = CHERRY_KB_SPEED_FASTEST; - Breathing.speed = CHERRY_KB_SPEED_NORMAL; - Breathing.colors_min = 1; - Breathing.colors_max = 1; - Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC; + Breathing.name = "Breathing"; + Breathing.value = CHERRY_KB_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Breathing.speed_min = CHERRY_KB_SPEED_SLOWEST; + Breathing.speed_max = CHERRY_KB_SPEED_FASTEST; + Breathing.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Breathing.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Breathing.colors_min = 1; + Breathing.colors_max = 1; + Breathing.speed = CHERRY_KB_SPEED_NORMAL; + Breathing.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC; Breathing.colors.resize(1); modes.push_back(Breathing); mode Static; - Static.name = "Static"; - Static.value = CHERRY_KB_MODE_STATIC; - Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Static.colors_min = 1; - Static.colors_max = 1; - Static.color_mode = MODE_COLORS_MODE_SPECIFIC; + Static.name = "Static"; + Static.value = CHERRY_KB_MODE_STATIC; + Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_AUTOMATIC_SAVE; + Static.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Static.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Static.colors_min = 1; + Static.colors_max = 1; + Static.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Static.color_mode = MODE_COLORS_MODE_SPECIFIC; Static.colors.resize(1); modes.push_back(Static); mode Radar; - Radar.name = "Radar"; - Radar.value = CHERRY_KB_MODE_RADAR; - Radar.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Radar.speed_min = CHERRY_KB_SPEED_SLOWEST; - Radar.speed_max = CHERRY_KB_SPEED_FASTEST; - Radar.speed = CHERRY_KB_SPEED_NORMAL; - Radar.colors_min = 1; - Radar.colors_max = 1; - Radar.color_mode = MODE_COLORS_MODE_SPECIFIC; + Radar.name = "Radar"; + Radar.value = CHERRY_KB_MODE_RADAR; + Radar.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Radar.speed_min = CHERRY_KB_SPEED_SLOWEST; + Radar.speed_max = CHERRY_KB_SPEED_FASTEST; + Radar.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Radar.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Radar.colors_min = 1; + Radar.colors_max = 1; + Radar.speed = CHERRY_KB_SPEED_NORMAL; + Radar.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Radar.color_mode = MODE_COLORS_MODE_SPECIFIC; Radar.colors.resize(1); - modes.push_back(Radar); + if(hasUnofficialModeSupport(product_id)) + modes.push_back(Radar); mode Vortex; - Vortex.name = "Vortex"; - Vortex.value = CHERRY_KB_MODE_VORTEX; - Vortex.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Vortex.speed_min = CHERRY_KB_SPEED_SLOWEST; - Vortex.speed_max = CHERRY_KB_SPEED_FASTEST; - Vortex.speed = CHERRY_KB_SPEED_NORMAL; - Vortex.colors_min = 1; - Vortex.colors_max = 1; - Vortex.color_mode = MODE_COLORS_MODE_SPECIFIC; + Vortex.name = "Vortex"; + Vortex.value = CHERRY_KB_MODE_VORTEX; + Vortex.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Vortex.speed_min = CHERRY_KB_SPEED_SLOWEST; + Vortex.speed_max = CHERRY_KB_SPEED_FASTEST; + Vortex.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Vortex.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Vortex.colors_min = 1; + Vortex.colors_max = 1; + Vortex.speed = CHERRY_KB_SPEED_NORMAL; + Vortex.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Vortex.color_mode = MODE_COLORS_MODE_SPECIFIC; Vortex.colors.resize(1); - modes.push_back(Vortex); + if(hasUnofficialModeSupport(product_id)) + modes.push_back(Vortex); mode Fire; - Fire.name = "Fire"; - Fire.value = CHERRY_KB_MODE_FIRE; - Fire.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Fire.speed_min = CHERRY_KB_SPEED_SLOWEST; - Fire.speed_max = CHERRY_KB_SPEED_FASTEST; - Fire.speed = CHERRY_KB_SPEED_NORMAL; - Fire.colors_min = 1; - Fire.colors_max = 1; - Fire.color_mode = MODE_COLORS_MODE_SPECIFIC; + Fire.name = "Fire"; + Fire.value = CHERRY_KB_MODE_FIRE; + Fire.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Fire.speed_min = CHERRY_KB_SPEED_SLOWEST; + Fire.speed_max = CHERRY_KB_SPEED_FASTEST; + Fire.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Fire.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Fire.colors_min = 1; + Fire.colors_max = 1; + Fire.speed = CHERRY_KB_SPEED_NORMAL; + Fire.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Fire.color_mode = MODE_COLORS_MODE_SPECIFIC; Fire.colors.resize(1); - modes.push_back(Fire); + if(hasUnofficialModeSupport(product_id)) + modes.push_back(Fire); mode Stars; - Stars.name = "Stars"; - Stars.value = CHERRY_KB_MODE_STARS; - Stars.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Stars.speed_min = CHERRY_KB_SPEED_SLOWEST; - Stars.speed_max = CHERRY_KB_SPEED_FASTEST; - Stars.speed = CHERRY_KB_SPEED_NORMAL; - Stars.color_mode = MODE_COLORS_MODE_SPECIFIC; + Stars.name = "Stars"; + Stars.value = CHERRY_KB_MODE_STARS; + Stars.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Stars.speed_min = CHERRY_KB_SPEED_SLOWEST; + Stars.speed_max = CHERRY_KB_SPEED_FASTEST; + Stars.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Stars.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Stars.speed = CHERRY_KB_SPEED_NORMAL; + Stars.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Stars.color_mode = MODE_COLORS_MODE_SPECIFIC; Stars.colors.resize(1); - modes.push_back(Stars); + if(hasUnofficialModeSupport(product_id)) + modes.push_back(Stars); mode Rain; - Rain.name = "Rain"; - Rain.value = CHERRY_KB_MODE_RAIN; - Rain.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Rain.speed_min = CHERRY_KB_SPEED_SLOWEST; - Rain.speed_max = CHERRY_KB_SPEED_FASTEST; - Rain.speed = CHERRY_KB_SPEED_NORMAL; - Rain.colors_min = 1; - Rain.colors_max = 1; - Rain.color_mode = MODE_COLORS_MODE_SPECIFIC; + Rain.name = "Rain"; + Rain.value = CHERRY_KB_MODE_RAIN; + Rain.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Rain.speed_min = CHERRY_KB_SPEED_SLOWEST; + Rain.speed_max = CHERRY_KB_SPEED_FASTEST; + Rain.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Rain.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Rain.colors_min = 1; + Rain.colors_max = 1; + Rain.speed = CHERRY_KB_SPEED_NORMAL; + Rain.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Rain.color_mode = MODE_COLORS_MODE_SPECIFIC; Rain.colors.resize(1); - modes.push_back(Rain); + if(hasUnofficialModeSupport(product_id)) + modes.push_back(Rain); mode Rolling; - Rolling.name = "Rolling"; - Rolling.value = CHERRY_KB_MODE_ROLLING; - Rolling.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE; - Rolling.speed_min = CHERRY_KB_SPEED_SLOWEST; - Rolling.speed_max = CHERRY_KB_SPEED_FASTEST; - Rolling.speed = CHERRY_KB_SPEED_NORMAL; - Rolling.color_mode = MODE_COLORS_NONE; + Rolling.name = "Rolling"; + Rolling.value = CHERRY_KB_MODE_ROLLING; + Rolling.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_AUTOMATIC_SAVE; + Rolling.speed_min = CHERRY_KB_SPEED_SLOWEST; + Rolling.speed_max = CHERRY_KB_SPEED_FASTEST; + Rolling.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Rolling.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Rolling.speed = CHERRY_KB_SPEED_NORMAL; + Rolling.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Rolling.color_mode = MODE_COLORS_NONE; modes.push_back(Rolling); mode Curve; - Curve.name = "Curve"; - Curve.value = CHERRY_KB_MODE_CURVE; - Curve.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Curve.speed_min = CHERRY_KB_SPEED_SLOWEST; - Curve.speed_max = CHERRY_KB_SPEED_FASTEST; - Curve.speed = CHERRY_KB_SPEED_NORMAL; - Curve.colors_min = 1; - Curve.colors_max = 1; - Curve.color_mode = MODE_COLORS_MODE_SPECIFIC; + Curve.name = "Curve"; + Curve.value = CHERRY_KB_MODE_CURVE; + Curve.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Curve.speed_min = CHERRY_KB_SPEED_SLOWEST; + Curve.speed_max = CHERRY_KB_SPEED_FASTEST; + Curve.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Curve.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Curve.colors_min = 1; + Curve.colors_max = 1; + Curve.speed = CHERRY_KB_SPEED_NORMAL; + Curve.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Curve.color_mode = MODE_COLORS_MODE_SPECIFIC; Curve.colors.resize(1); modes.push_back(Curve); mode WaveMid; - WaveMid.name = "Wave Mid"; - WaveMid.value = CHERRY_KB_MODE_WAVE_MID; - WaveMid.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - WaveMid.speed_min = CHERRY_KB_SPEED_SLOWEST; - WaveMid.speed_max = CHERRY_KB_SPEED_FASTEST; - WaveMid.speed = CHERRY_KB_SPEED_NORMAL; - WaveMid.color_mode = MODE_COLORS_NONE; + WaveMid.name = "Wave Mid"; + WaveMid.value = CHERRY_KB_MODE_WAVE_MID; + WaveMid.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + WaveMid.speed_min = CHERRY_KB_SPEED_SLOWEST; + WaveMid.speed_max = CHERRY_KB_SPEED_FASTEST; + WaveMid.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + WaveMid.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + WaveMid.speed = CHERRY_KB_SPEED_NORMAL; + WaveMid.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + WaveMid.color_mode = MODE_COLORS_NONE; WaveMid.colors.resize(1); - modes.push_back(WaveMid); + if(hasUnofficialModeSupport(product_id)) + modes.push_back(WaveMid); mode Scan; - Scan.name = "Scan"; - Scan.value = CHERRY_KB_MODE_SCAN; - Scan.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Scan.colors_min = 1; - Scan.colors_max = 1; - Scan.color_mode = MODE_COLORS_MODE_SPECIFIC; + Scan.name = "Scan"; + Scan.value = CHERRY_KB_MODE_SCAN; + Scan.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Scan.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Scan.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Scan.colors_min = 1; + Scan.colors_max = 1; + Scan.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Scan.color_mode = MODE_COLORS_MODE_SPECIFIC; Scan.colors.resize(1); modes.push_back(Scan); mode Radiation; - Radiation.name = "Radiation"; - Radiation.value = CHERRY_KB_MODE_RADIATION; - Radiation.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Radiation.speed_min = CHERRY_KB_SPEED_SLOWEST; - Radiation.speed_max = CHERRY_KB_SPEED_FASTEST; - Radiation.speed = CHERRY_KB_SPEED_NORMAL; - Radiation.colors_min = 1; - Radiation.colors_max = 1; - Radiation.color_mode = MODE_COLORS_MODE_SPECIFIC; + Radiation.name = "Radiation"; + Radiation.value = CHERRY_KB_MODE_RADIATION; + Radiation.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Radiation.speed_min = CHERRY_KB_SPEED_SLOWEST; + Radiation.speed_max = CHERRY_KB_SPEED_FASTEST; + Radiation.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Radiation.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Radiation.colors_min = 1; + Radiation.colors_max = 1; + Radiation.speed = CHERRY_KB_SPEED_NORMAL; + Radiation.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Radiation.color_mode = MODE_COLORS_MODE_SPECIFIC; Radiation.colors.resize(1); modes.push_back(Radiation); mode Ripples; - Ripples.name = "Ripples"; - Ripples.value = CHERRY_KB_MODE_RIPPLES; - Ripples.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - Ripples.speed_min = CHERRY_KB_SPEED_SLOWEST; - Ripples.speed_max = CHERRY_KB_SPEED_FASTEST; - Ripples.speed = CHERRY_KB_SPEED_NORMAL; - Ripples.colors_min = 1; - Ripples.colors_max = 1; - Ripples.color_mode = MODE_COLORS_MODE_SPECIFIC; + Ripples.name = "Ripples"; + Ripples.value = CHERRY_KB_MODE_RIPPLES; + Ripples.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Ripples.speed_min = CHERRY_KB_SPEED_SLOWEST; + Ripples.speed_max = CHERRY_KB_SPEED_FASTEST; + Ripples.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + Ripples.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + Ripples.colors_min = 1; + Ripples.colors_max = 1; + Ripples.speed = CHERRY_KB_SPEED_NORMAL; + Ripples.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + Ripples.color_mode = MODE_COLORS_MODE_SPECIFIC; Ripples.colors.resize(1); modes.push_back(Ripples); mode SingleKey; - SingleKey.name = "Single Key"; - SingleKey.value = CHERRY_KB_MODE_SINGLE_KEY; - SingleKey.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; - SingleKey.speed_min = CHERRY_KB_SPEED_SLOWEST; - SingleKey.speed_max = CHERRY_KB_SPEED_FASTEST; - SingleKey.speed = CHERRY_KB_SPEED_NORMAL; - SingleKey.colors_min = 1; - SingleKey.colors_max = 1; - SingleKey.color_mode = MODE_COLORS_MODE_SPECIFIC; + SingleKey.name = "Single Key"; + SingleKey.value = CHERRY_KB_MODE_SINGLE_KEY; + SingleKey.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + SingleKey.speed_min = CHERRY_KB_SPEED_SLOWEST; + SingleKey.speed_max = CHERRY_KB_SPEED_FASTEST; + SingleKey.brightness_min = CHERRY_KB_BRIGHTNESS_LOWEST; + SingleKey.brightness_max = CHERRY_KB_BRIGHTNESS_HIGHEST; + SingleKey.colors_min = 1; + SingleKey.colors_max = 1; + SingleKey.speed = CHERRY_KB_SPEED_NORMAL; + SingleKey.brightness = CHERRY_KB_BRIGHTNESS_HIGHEST; + SingleKey.color_mode = MODE_COLORS_MODE_SPECIFIC; SingleKey.colors.resize(1); modes.push_back(SingleKey); @@ -267,17 +330,17 @@ void RGBController_CherryKeyboard::SetupZones() new_zone.name = "Keyboard"; new_zone.type = ZONE_TYPE_MATRIX; - new_zone.leds_min = 126; - new_zone.leds_max = 126; - new_zone.leds_count = 126; + new_zone.leds_min = CHERRY_MATRIX_CELL_COUNT; + new_zone.leds_max = CHERRY_MATRIX_CELL_COUNT; + new_zone.leds_count = CHERRY_MATRIX_CELL_COUNT; new_zone.matrix_map = new matrix_map_type; - new_zone.matrix_map->height = 6; - new_zone.matrix_map->width = 23; + new_zone.matrix_map->height = CHERRY_MATRIX_MAP_HEIGHT; + new_zone.matrix_map->width = CHERRY_MATRIX_MAP_WIDTH; new_zone.matrix_map->map = (unsigned int *)&matrix_map; zones.push_back(new_zone); - for(int led_idx = 0; led_idx < 126; led_idx++) + for(int led_idx = 0; led_idx < CHERRY_MATRIX_CELL_COUNT; led_idx++) { led new_led; @@ -299,9 +362,9 @@ void RGBController_CherryKeyboard::ResizeZone(int /*zone*/, int /*new_size*/) void RGBController_CherryKeyboard::DeviceUpdateLEDs() { - unsigned char color_data[7*CHERRY_KB_MAX_PACKET_SIZE]; + unsigned char color_data[CUSTOM_COLOR_ARRAY_BYTE_COUNT]; - for(int led_idx = 0; led_idx < 126; led_idx++) + for(int led_idx = 0; led_idx < CHERRY_MATRIX_CELL_COUNT; led_idx++) { color_data[(3 * led_idx) + 0] = RGBGetRValue(colors[led_idx]); color_data[(3 * led_idx) + 1] = RGBGetGValue(colors[led_idx]); @@ -311,7 +374,7 @@ void RGBController_CherryKeyboard::DeviceUpdateLEDs() controller->SetKeyboardColors ( color_data, - CHERRY_KB_MAX_PACKET_SIZE * 7 + CUSTOM_COLOR_ARRAY_BYTE_COUNT ); } @@ -347,7 +410,7 @@ void RGBController_CherryKeyboard::DeviceUpdateMode() controller->SendKeyboardModeEx ( modes[active_mode].value, - CHERRY_KB_BRIGHTNESS_HIGHEST, + modes[active_mode].brightness, modes[active_mode].speed, 0, random, @@ -356,3 +419,40 @@ void RGBController_CherryKeyboard::DeviceUpdateMode() blu ); } + +bool RGBController_CherryKeyboard::hasUnofficialModeSupport(const uint16_t product_id) +{ + switch(product_id) + { + // no backlight: Why are they even listed here? (no lights, no macros) + case MX_BOARD_3_0S_FL_NBL_PID: + case G80_3000_TKL_NBL_PID: + case MX_1_0_FL_NBL_PID: + case G80_3000_TKL_NBL_KOR_PID: + case CCF_MX_1_0_TKL_NBL_PID: + // white backlight keyboards: very doubtful if any of those RGB modes match + case CCF_MX_8_0_TKL_BL_PID: + case CCF_MX_1_0_TKL_BL_PID: + case MX_1_0_FL_BL_PID: + return false; + // RGB keyboards known for not supporting unofficial modes + case MX_BOARD_3_0S_FL_RGB_PID: + case MX_BOARD_3_0S_FL_RGB_KOR_PID: + case MX_BOARD_2_0S_FL_RGB_PID: + case MX_BOARD_2_0S_FL_NBL_PID: + case MX_BOARD_2_0S_FL_RGB_DE_PID: + case MV_BOARD_3_0FL_RGB_PID: + return false; + // RGB keyboards which (probably) support unofficial modes + case MX_BOARD_1_0_TKL_RGB_PID: // unknown + case MX_BOARD_8_0_TKL_RGB_PID: // unknown + case MX_BOARD_10_0_FL_RGB_PID: // unknown (probably yes, related to 10.0N) + case G80_3000_TKL_RGB_PID: // unknown + case MX_1_0_FL_RGB_PID: // unkown + case G80_3000N_TKL_RGB_PID: // yes + case G80_3000N_FL_RGB_PID: // firmware v0102: YES, firmware v0103: NO + case MX_BOARD_10_0N_FL_RGB_PID: // yes + default: + return true; + } +} diff --git a/Controllers/CherryKeyboardController/RGBController_CherryKeyboard.h b/Controllers/CherryKeyboardController/RGBController_CherryKeyboard.h index 79f1b4f8..94381a55 100644 --- a/Controllers/CherryKeyboardController/RGBController_CherryKeyboard.h +++ b/Controllers/CherryKeyboardController/RGBController_CherryKeyboard.h @@ -14,7 +14,7 @@ class RGBController_CherryKeyboard : public RGBController { public: - RGBController_CherryKeyboard(CherryKeyboardController* controller_ptr); + RGBController_CherryKeyboard(CherryKeyboardController* controller_ptr, uint16_t product_id); ~RGBController_CherryKeyboard(); void SetupZones(); @@ -30,4 +30,6 @@ public: private: CherryKeyboardController* controller; + + static bool hasUnofficialModeSupport(uint16_t product_id); };