mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2025-12-24 07:47:49 -05:00
372 lines
18 KiB
C++
372 lines
18 KiB
C++
/*---------------------------------------------------------*\
|
|
| RGBController_AOCKeyboard.cpp |
|
|
| |
|
|
| RGBController for AOC keyboard |
|
|
| |
|
|
| Adam Honse (CalcProgrammer1) 10 May 2023 |
|
|
| |
|
|
| This file is part of the OpenRGB project |
|
|
| SPDX-License-Identifier: GPL-2.0-only |
|
|
\*---------------------------------------------------------*/
|
|
|
|
#include "RGBController_AOCKeyboard.h"
|
|
#include "KeyboardLayoutManager.h"
|
|
|
|
/**--------------------------------------------------------------------*\
|
|
@name AOC Keyboard
|
|
@category Keyboard
|
|
@type USB
|
|
@save :x:
|
|
@direct :white_check_mark:
|
|
@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, 0, 10, 57, 72, 87,
|
|
/* LSFT \ Z X C V B N M , . / RSFT ARWU NP1 NP2 NP3 NPEN */
|
|
30, 0, 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)
|
|
{
|
|
controller = controller_ptr;
|
|
|
|
name = "AOC Keyboard Device";
|
|
vendor = "AOC";
|
|
type = DEVICE_TYPE_KEYBOARD;
|
|
description = "AOC Keyboard Device";
|
|
location = controller->GetDeviceLocation();
|
|
serial = controller->GetSerialString();
|
|
|
|
mode Static;
|
|
Static.name = "Static";
|
|
Static.value = AOC_KEYBOARD_MODE_STATIC;
|
|
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;
|
|
SpectrumCycle.name = "Spectrum Cycle";
|
|
SpectrumCycle.value = AOC_KEYBOARD_MODE_STATIC;
|
|
SpectrumCycle.flags = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
|
|
SpectrumCycle.color_mode = MODE_COLORS_RANDOM;
|
|
SpectrumCycle.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF;
|
|
SpectrumCycle.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH;
|
|
SpectrumCycle.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH;
|
|
SpectrumCycle.speed_min = AOC_KEYBOARD_SPEED_SLOW;
|
|
SpectrumCycle.speed_max = AOC_KEYBOARD_SPEED_FAST;
|
|
SpectrumCycle.speed = AOC_KEYBOARD_SPEED_MEDIUM;
|
|
modes.push_back(SpectrumCycle);
|
|
|
|
mode Breathing;
|
|
Breathing.name = "Breathing";
|
|
Breathing.value = AOC_KEYBOARD_MODE_BREATHING;
|
|
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_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_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_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_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_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_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;
|
|
RainbowWave.name = "Rainbow Wave";
|
|
RainbowWave.value = AOC_KEYBOARD_MODE_WAVE;
|
|
RainbowWave.flags = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
|
|
RainbowWave.color_mode = MODE_COLORS_RANDOM;
|
|
RainbowWave.brightness_min = AOC_KEYBOARD_BRIGHTNESS_OFF;
|
|
RainbowWave.brightness_max = AOC_KEYBOARD_BRIGHTNESS_HIGH;
|
|
RainbowWave.brightness = AOC_KEYBOARD_BRIGHTNESS_HIGH;
|
|
RainbowWave.speed_min = AOC_KEYBOARD_SPEED_SLOW;
|
|
RainbowWave.speed_max = AOC_KEYBOARD_SPEED_FAST;
|
|
RainbowWave.speed = AOC_KEYBOARD_SPEED_MEDIUM;
|
|
modes.push_back(RainbowWave);
|
|
|
|
mode ConcentricCircles;
|
|
ConcentricCircles.name = "Concentric Circles";
|
|
ConcentricCircles.value = AOC_KEYBOARD_MODE_CONCENTRIC_CIRCLES;
|
|
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_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();
|
|
};
|
|
|
|
RGBController_AOCKeyboard::~RGBController_AOCKeyboard()
|
|
{
|
|
delete controller;
|
|
}
|
|
|
|
void RGBController_AOCKeyboard::SetupZones()
|
|
{
|
|
/*---------------------------------------------------------*\
|
|
| 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(unsigned int 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);
|
|
|
|
SetupColors();
|
|
}
|
|
|
|
void RGBController_AOCKeyboard::ResizeZone(int /*zone*/, int /*new_size*/)
|
|
{
|
|
/*---------------------------------------------------------*\
|
|
| This device does not support resizing zones |
|
|
\*---------------------------------------------------------*/
|
|
}
|
|
|
|
void RGBController_AOCKeyboard::DeviceUpdateLEDs()
|
|
{
|
|
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*/)
|
|
{
|
|
DeviceUpdateLEDs();
|
|
}
|
|
|
|
void RGBController_AOCKeyboard::UpdateSingleLED(int /*led*/)
|
|
{
|
|
DeviceUpdateLEDs();
|
|
}
|
|
|
|
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)
|
|
{
|
|
aoc_direction = AOC_KEYBOARD_DIRECTION_COUNTERCLOCKWISE;
|
|
}
|
|
|
|
if(modes[active_mode].color_mode == MODE_COLORS_RANDOM)
|
|
{
|
|
aoc_random = AOC_KEYBOARD_RANDOM;
|
|
}
|
|
|
|
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);
|
|
}
|