From 35aad36e1b698d377a06a6c6591b0e36769b11a1 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sun, 14 May 2023 01:29:14 -0500 Subject: [PATCH] Add Direct mode support for AOC GK500 keyboard --- .../AOCKeyboardController.cpp | 147 +++++++++---- .../AOCKeyboardController.h | 29 ++- .../RGBController_AOCKeyboard.cpp | 197 ++++++++++++++---- 3 files changed, 288 insertions(+), 85 deletions(-) diff --git a/Controllers/AOCKeyboardController/AOCKeyboardController.cpp b/Controllers/AOCKeyboardController/AOCKeyboardController.cpp index abd3153c..d81b283d 100644 --- a/Controllers/AOCKeyboardController/AOCKeyboardController.cpp +++ b/Controllers/AOCKeyboardController/AOCKeyboardController.cpp @@ -47,24 +47,121 @@ std::string AOCKeyboardController::GetSerialString() return(return_string); } -/*-------------------------------------------------------------------------------------------------*\ -| Private packet sending functions. | -\*-------------------------------------------------------------------------------------------------*/ +void AOCKeyboardController::SetLightingConfig + ( + unsigned char mode, + unsigned char random, + unsigned char brightness, + unsigned char speed, + unsigned char direction, + RGBColor* color_data + ) +{ + SendStartPacket(); + std::this_thread::sleep_for(5ms); -void AOCKeyboardController::SendDirect + SendLightingConfigPacket(mode, random, brightness, speed, direction, color_data); + std::this_thread::sleep_for(5ms); + + SendEndPacket(); + std::this_thread::sleep_for(10ms); +} + +void AOCKeyboardController::SetCustom ( RGBColor* color_data ) { - SendPacket(AOC_KEYBOARD_MODE_STATIC, - AOC_KEYBOARD_SINGLE_COLOR, - AOC_KEYBOARD_BRIGHTNESS_HIGH, - AOC_KEYBOARD_SPEED_MEDIUM, - AOC_KEYBOARD_DIRECTION_CLOCKWISE, - color_data); + SendStartPacket(); + std::this_thread::sleep_for(5ms); + + SendCustomPacket(color_data); + std::this_thread::sleep_for(5ms); + + SendEndPacket(); + std::this_thread::sleep_for(5ms); } -void AOCKeyboardController::SendPacket +/*-------------------------------------------------------------------------------------------------*\ +| Private packet sending functions. | +\*-------------------------------------------------------------------------------------------------*/ + +void AOCKeyboardController::SendStartPacket() +{ + unsigned char buf[64]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + + /*-----------------------------------------------------*\ + | Set up start packet | + \*-----------------------------------------------------*/ + buf[0x00] = 0x09; + buf[0x01] = 0x21; + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_write(dev, buf, sizeof(buf)); +} + +void AOCKeyboardController::SendEndPacket() +{ + unsigned char buf[64]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + + /*-----------------------------------------------------*\ + | Set up end packet | + \*-----------------------------------------------------*/ + buf[0x00] = 0x09; + buf[0x01] = 0x22; + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_write(dev, buf, sizeof(buf)); +} + +void AOCKeyboardController::SendCustomPacket + ( + RGBColor* color_data + ) +{ + unsigned char buf[361]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + + /*-----------------------------------------------------*\ + | Set up custom lighting packet | + \*-----------------------------------------------------*/ + buf[0x00] = 0x20; + + /*-----------------------------------------------------*\ + | Copy in color data | + \*-----------------------------------------------------*/ + for(unsigned int color_idx = 0; color_idx < 120; color_idx++) + { + buf[color_idx + 1] = RGBGetRValue(color_data[color_idx]); + buf[color_idx + 121] = RGBGetGValue(color_data[color_idx]); + buf[color_idx + 241] = RGBGetBValue(color_data[color_idx]); + } + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + hid_send_feature_report(dev, buf, sizeof(buf)); +} + +void AOCKeyboardController::SendLightingConfigPacket ( unsigned char mode, unsigned char random, @@ -82,7 +179,7 @@ void AOCKeyboardController::SendPacket memset(buf, 0x00, sizeof(buf)); /*-----------------------------------------------------*\ - | Set up RGB configuration packet | + | Set up lighting configuration packet | \*-----------------------------------------------------*/ buf[0x00] = 0x14; buf[0x01] = 0x01; @@ -107,34 +204,8 @@ void AOCKeyboardController::SendPacket buf[115] = checksum & 0xFF; buf[116] = checksum >> 8; - - unsigned char buf3[] = -{ -0x09, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -}; - hid_write(dev, buf3, 64); - - - std::this_thread::sleep_for(10ms); - /*-----------------------------------------------------*\ | Send packet | \*-----------------------------------------------------*/ hid_send_feature_report(dev, buf, 117); - - std::this_thread::sleep_for(10ms); - - unsigned char buf2[] = -{ -0x09, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, -}; - hid_write(dev, buf2, 64); } diff --git a/Controllers/AOCKeyboardController/AOCKeyboardController.h b/Controllers/AOCKeyboardController/AOCKeyboardController.h index 5d4d52a0..bc5c349a 100644 --- a/Controllers/AOCKeyboardController/AOCKeyboardController.h +++ b/Controllers/AOCKeyboardController/AOCKeyboardController.h @@ -68,12 +68,7 @@ public: std::string GetDeviceLocation(); std::string GetSerialString(); - void SendDirect - ( - RGBColor* color_data - ); - - void SendPacket + void SetLightingConfig ( unsigned char mode, unsigned char random, @@ -83,8 +78,30 @@ public: RGBColor* color_data ); + void SetCustom + ( + RGBColor* color_data + ); private: hid_device* dev; std::string location; + + void SendStartPacket(); + void SendEndPacket(); + + void SendCustomPacket + ( + RGBColor* color_data + ); + + void SendLightingConfigPacket + ( + unsigned char mode, + unsigned char random, + unsigned char brightness, + unsigned char speed, + unsigned char direction, + RGBColor* color_data + ); }; diff --git a/Controllers/AOCKeyboardController/RGBController_AOCKeyboard.cpp b/Controllers/AOCKeyboardController/RGBController_AOCKeyboard.cpp index 91077916..88209130 100644 --- a/Controllers/AOCKeyboardController/RGBController_AOCKeyboard.cpp +++ b/Controllers/AOCKeyboardController/RGBController_AOCKeyboard.cpp @@ -7,17 +7,43 @@ \*-----------------------------------------*/ #include "RGBController_AOCKeyboard.h" +#include "KeyboardLayoutManager.h" -/**------------------------------------------------------------------*\ +/**--------------------------------------------------------------------*\ @name AOC Keyboard @category Keyboard @type USB @save :x: @direct :white_check_mark: - @effects :x: + @effects :white_check_mark: @detectors DetectAOCKeyboardControllers @comment -\*-------------------------------------------------------------------*/ +\*---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------*\ +| AOC Keyboard KLM Layout | +\*---------------------------------------------------------------------*/ +layout_values aoc_keyboard_offset_values = +{ + { + /* ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRSC SCLK PSBK */ + 90, 92, 77, 63, 79, 94, 81, 96, 82, 83, 98, 40, 55, 85, 100, 104, + /* BKTK 1 2 3 4 5 6 7 8 9 0 - = BSPC INS HOME PGUP NLCK NP/ NP* NP- */ + 75, 76, 91, 62, 48, 64, 50, 65, 66, 67, 97, 68, 84, 70, 59, 74, 89, 58, 73, 88, 103, + /* TAB Q W E R T Y U I O P [ ] \ DEL END PGDN NP7 NP8 NP9 NP+ */ + 60, 61, 47, 78, 33, 49, 35, 80, 51, 52, 53, 69, 99, 25, 44, 29, 14, 43, 28, 13, 102, + /* CPLK A S D F G H J K L ; " ENTR NP4 NP5 NP6 */ + 45, 46, 32, 93, 18, 34, 20, 95, 36, 37, 38, 54, 10, 57, 72, 87, + /* LSFT Z X C V B N M , . / RSFT ARWU NP1 NP2 NP3 NPEN */ + 30, 31, 17, 2, 3, 19, 5, 6, 21, 22, 23, 39, 11, 42, 27, 12, 101, + /* LCTL LWIN LALT SPC RALT RFNC RMNU RCTL ARWL ARWD ARWR NP0 NP. */ + 15, 0, 1, 4, 7, 8, 24, 9, 26, 41, 56, 71, 86 + }, + { + /* Add more regional layout fixes here */ + } +}; + RGBController_AOCKeyboard::RGBController_AOCKeyboard(AOCKeyboardController* controller_ptr) { @@ -33,11 +59,14 @@ RGBController_AOCKeyboard::RGBController_AOCKeyboard(AOCKeyboardController* cont mode Static; Static.name = "Static"; Static.value = AOC_KEYBOARD_MODE_STATIC; - Static.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS; - Static.color_mode = MODE_COLORS_PER_LED; + Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS; + Static.color_mode = MODE_COLORS_MODE_SPECIFIC; Static.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; Static.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; Static.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; + Static.colors_min = 1; + Static.colors_max = 1; + Static.colors.resize(1); modes.push_back(Static); mode SpectrumCycle; @@ -56,92 +85,113 @@ RGBController_AOCKeyboard::RGBController_AOCKeyboard(AOCKeyboardController* cont mode Breathing; Breathing.name = "Breathing"; Breathing.value = AOC_KEYBOARD_MODE_BREATHING; - Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; - Breathing.color_mode = MODE_COLORS_PER_LED; + Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC; Breathing.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; Breathing.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; Breathing.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; Breathing.speed_min = AOC_KEYBOARD_SPEED_SLOW; Breathing.speed_max = AOC_KEYBOARD_SPEED_FAST; Breathing.speed = AOC_KEYBOARD_SPEED_MEDIUM; + Breathing.colors_min = 1; + Breathing.colors_max = 1; + Breathing.colors.resize(1); modes.push_back(Breathing); mode React; React.name = "React"; React.value = AOC_KEYBOARD_MODE_REACT; - React.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; - React.color_mode = MODE_COLORS_PER_LED; + React.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + React.color_mode = MODE_COLORS_MODE_SPECIFIC; React.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; React.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; React.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; React.speed_min = AOC_KEYBOARD_SPEED_SLOW; React.speed_max = AOC_KEYBOARD_SPEED_FAST; React.speed = AOC_KEYBOARD_SPEED_MEDIUM; + React.colors_min = 1; + React.colors_max = 1; + React.colors.resize(1); modes.push_back(React); mode Ripple; Ripple.name = "Ripple"; Ripple.value = AOC_KEYBOARD_MODE_RIPPLE; - Ripple.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; - Ripple.color_mode = MODE_COLORS_PER_LED; + Ripple.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + Ripple.color_mode = MODE_COLORS_MODE_SPECIFIC; Ripple.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; Ripple.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; Ripple.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; Ripple.speed_min = AOC_KEYBOARD_SPEED_SLOW; Ripple.speed_max = AOC_KEYBOARD_SPEED_FAST; Ripple.speed = AOC_KEYBOARD_SPEED_MEDIUM; + Ripple.colors_min = 1; + Ripple.colors_max = 1; + Ripple.colors.resize(1); modes.push_back(Ripple); mode Radar; Radar.name = "Radar"; Radar.value = AOC_KEYBOARD_MODE_RADAR; - Radar.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR; - Radar.color_mode = MODE_COLORS_PER_LED; + Radar.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR; + Radar.color_mode = MODE_COLORS_MODE_SPECIFIC; Radar.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; Radar.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; Radar.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; Radar.speed_min = AOC_KEYBOARD_SPEED_SLOW; Radar.speed_max = AOC_KEYBOARD_SPEED_FAST; Radar.speed = AOC_KEYBOARD_SPEED_MEDIUM; + Radar.colors_min = 1; + Radar.colors_max = 1; + Radar.colors.resize(1); modes.push_back(Radar); mode Fireworks; Fireworks.name = "Fireworks"; Fireworks.value = AOC_KEYBOARD_MODE_FIREWORKS; - Fireworks.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; - Fireworks.color_mode = MODE_COLORS_PER_LED; + Fireworks.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + Fireworks.color_mode = MODE_COLORS_MODE_SPECIFIC; Fireworks.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; Fireworks.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; Fireworks.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; Fireworks.speed_min = AOC_KEYBOARD_SPEED_SLOW; Fireworks.speed_max = AOC_KEYBOARD_SPEED_FAST; Fireworks.speed = AOC_KEYBOARD_SPEED_MEDIUM; + Fireworks.colors_min = 1; + Fireworks.colors_max = 1; + Fireworks.colors.resize(1); modes.push_back(Fireworks); mode Blink; Blink.name = "Flashing"; Blink.value = AOC_KEYBOARD_MODE_BLINK; - Blink.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; - Blink.color_mode = MODE_COLORS_PER_LED; + Blink.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + Blink.color_mode = MODE_COLORS_MODE_SPECIFIC; Blink.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; Blink.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; Blink.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; Blink.speed_min = AOC_KEYBOARD_SPEED_SLOW; Blink.speed_max = AOC_KEYBOARD_SPEED_FAST; Blink.speed = AOC_KEYBOARD_SPEED_MEDIUM; + Blink.colors_min = 1; + Blink.colors_max = 1; + Blink.colors.resize(1); modes.push_back(Blink); mode Wave; Wave.name = "Wave"; Wave.value = AOC_KEYBOARD_MODE_WAVE; - Wave.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR; - Wave.color_mode = MODE_COLORS_PER_LED; + Wave.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR; + Wave.color_mode = MODE_COLORS_MODE_SPECIFIC; Wave.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; Wave.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; Wave.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; Wave.speed_min = AOC_KEYBOARD_SPEED_SLOW; Wave.speed_max = AOC_KEYBOARD_SPEED_FAST; Wave.speed = AOC_KEYBOARD_SPEED_MEDIUM; + Wave.colors_min = 1; + Wave.colors_max = 1; + Wave.colors.resize(1); modes.push_back(Wave); mode RainbowWave; @@ -160,29 +210,45 @@ RGBController_AOCKeyboard::RGBController_AOCKeyboard(AOCKeyboardController* cont mode ConcentricCircles; ConcentricCircles.name = "Concentric Circles"; ConcentricCircles.value = AOC_KEYBOARD_MODE_CONCENTRIC_CIRCLES; - ConcentricCircles.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR; - ConcentricCircles.color_mode = MODE_COLORS_PER_LED; + ConcentricCircles.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR; + ConcentricCircles.color_mode = MODE_COLORS_MODE_SPECIFIC; ConcentricCircles.brightness_min= AOC_KEYBOARD_BRIGHTNESS_OFF; ConcentricCircles.brightness_max= AOC_KEYBOARD_BRIGHTNESS_HIGH; ConcentricCircles.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; ConcentricCircles.speed_min = AOC_KEYBOARD_SPEED_SLOW; ConcentricCircles.speed_max = AOC_KEYBOARD_SPEED_FAST; ConcentricCircles.speed = AOC_KEYBOARD_SPEED_MEDIUM; + ConcentricCircles.colors_min = 1; + ConcentricCircles.colors_max = 1; + ConcentricCircles.colors.resize(1); modes.push_back(ConcentricCircles); mode WWave; WWave.name = "W Wave"; WWave.value = AOC_KEYBOARD_MODE_W_WAVE; - WWave.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; - WWave.color_mode = MODE_COLORS_PER_LED; + WWave.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED; + WWave.color_mode = MODE_COLORS_MODE_SPECIFIC; WWave.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; WWave.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; WWave.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; WWave.speed_min = AOC_KEYBOARD_SPEED_SLOW; WWave.speed_max = AOC_KEYBOARD_SPEED_FAST; WWave.speed = AOC_KEYBOARD_SPEED_MEDIUM; + WWave.colors_min = 1; + WWave.colors_max = 1; + WWave.colors.resize(1); modes.push_back(WWave); + mode Direct; + Direct.name = "Direct"; + Direct.value = AOC_KEYBOARD_MODE_CUSTOM; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS; + Direct.color_mode = MODE_COLORS_PER_LED; + Direct.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF; + Direct.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH; + Direct.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH; + modes.push_back(Direct); + SetupZones(); }; @@ -193,18 +259,47 @@ RGBController_AOCKeyboard::~RGBController_AOCKeyboard() void RGBController_AOCKeyboard::SetupZones() { - zone keyboard_zone; - keyboard_zone.name = "Keyboard"; - keyboard_zone.type = ZONE_TYPE_SINGLE; - keyboard_zone.leds_min = 1; - keyboard_zone.leds_max = 1; - keyboard_zone.leds_count = 1; - keyboard_zone.matrix_map = NULL; - zones.push_back(keyboard_zone); + /*---------------------------------------------------------*\ + | Create the keyboard zone usiung Keyboard Layout Manager | + \*---------------------------------------------------------*/ + zone new_zone; + new_zone.name = ZONE_EN_KEYBOARD; + new_zone.type = ZONE_TYPE_MATRIX; + + KeyboardLayoutManager new_kb(KEYBOARD_LAYOUT_ANSI_QWERTY, KEYBOARD_SIZE_FULL, aoc_keyboard_offset_values); + + matrix_map_type * new_map = new matrix_map_type; + new_zone.matrix_map = new_map; + new_zone.matrix_map->height = new_kb.GetRowCount(); + new_zone.matrix_map->width = new_kb.GetColumnCount(); + + new_zone.matrix_map->map = new unsigned int[new_map->height * new_map->width]; + new_zone.leds_count = new_kb.GetKeyCount(); + new_zone.leds_min = new_zone.leds_count; + new_zone.leds_max = new_zone.leds_count; + + /*---------------------------------------------------------*\ + | Matrix map still uses declared zone rows and columns | + | as the packet structure depends on the matrix map | + \*---------------------------------------------------------*/ + new_kb.GetKeyMap(new_map->map, KEYBOARD_MAP_FILL_TYPE_COUNT, new_map->height, new_map->width); + + /*---------------------------------------------------------*\ + | Create LEDs for the Matrix zone | + | Place keys in the layout to populate the matrix | + \*---------------------------------------------------------*/ + for(size_t led_idx = 0; led_idx < new_zone.leds_count; led_idx++) + { + led new_led; + + new_led.name = new_kb.GetKeyNameAt(led_idx); + new_led.value = new_kb.GetKeyValueAt(led_idx); + leds.push_back(new_led); + } + + zones.push_back(new_zone); + - led keyboard_led; - keyboard_led.name = "Keyboard"; - leds.push_back(keyboard_led); SetupColors(); } @@ -218,7 +313,21 @@ void RGBController_AOCKeyboard::ResizeZone(int /*zone*/, int /*new_size*/) void RGBController_AOCKeyboard::DeviceUpdateLEDs() { - DeviceUpdateMode(); + if(modes[active_mode].value == AOC_KEYBOARD_MODE_CUSTOM) + { + RGBColor color_buf[120]; + + for(unsigned int led_idx = 0; led_idx < leds.size(); led_idx++) + { + color_buf[leds[led_idx].value] = colors[led_idx]; + } + + controller->SetCustom(&color_buf[0]); + } + else + { + DeviceUpdateMode(); + } } void RGBController_AOCKeyboard::UpdateZoneLEDs(int /*zone*/) @@ -235,6 +344,7 @@ void RGBController_AOCKeyboard::DeviceUpdateMode() { unsigned char aoc_direction = AOC_KEYBOARD_DIRECTION_CLOCKWISE; unsigned char aoc_random = AOC_KEYBOARD_SINGLE_COLOR; + RGBColor* aoc_colors = &colors[0]; if(modes[active_mode].direction == MODE_DIRECTION_LEFT) { @@ -246,10 +356,15 @@ void RGBController_AOCKeyboard::DeviceUpdateMode() aoc_random = AOC_KEYBOARD_RANDOM; } - controller->SendPacket(modes[active_mode].value, - aoc_random, - modes[active_mode].brightness, - modes[active_mode].speed, - aoc_direction, - &colors[0]); + if(modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC) + { + aoc_colors = &modes[active_mode].colors[0]; + } + + controller->SetLightingConfig(modes[active_mode].value, + aoc_random, + modes[active_mode].brightness, + modes[active_mode].speed, + aoc_direction, + aoc_colors); }