mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-13 11:21:30 +00:00
Add led value and color commands
This commit is contained in:
parent
5d6a812730
commit
5b9ff3dc7c
15
keyboards/system76/launch_beta_1/rgb_matrix_kb.inc
Normal file
15
keyboards/system76/launch_beta_1/rgb_matrix_kb.inc
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
RGB_MATRIX_EFFECT(raw_rgb)
|
||||||
|
|
||||||
|
#if defined(RGB_MATRIX_CUSTOM_EFFECT_IMPLS)
|
||||||
|
uint8_t raw_rgb_r = 0;
|
||||||
|
uint8_t raw_rgb_g = 0;
|
||||||
|
uint8_t raw_rgb_b = 0;
|
||||||
|
|
||||||
|
static bool raw_rgb(effect_params_t* params) {
|
||||||
|
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
||||||
|
for (uint8_t i = led_min; i < led_max; i++) {
|
||||||
|
rgb_matrix_set_color(i, raw_rgb_r, raw_rgb_g, raw_rgb_b);
|
||||||
|
}
|
||||||
|
return led_max < DRIVER_LED_TOTAL;
|
||||||
|
}
|
||||||
|
#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
@ -32,6 +32,7 @@ NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here
|
|||||||
RAW_ENABLE = yes # Enable RAW HID commands (used by keyboard configurator)
|
RAW_ENABLE = yes # Enable RAW HID commands (used by keyboard configurator)
|
||||||
RGBLIGHT_ENABLE = no # Support for RGB backlight (conflicts with RGB_MATRIX)
|
RGBLIGHT_ENABLE = no # Support for RGB backlight (conflicts with RGB_MATRIX)
|
||||||
RGB_MATRIX_ENABLE = WS2812 # Support for RGB matrix
|
RGB_MATRIX_ENABLE = WS2812 # Support for RGB matrix
|
||||||
|
RGB_MATRIX_CUSTOM_KB = yes # Allow custom keyboard effect
|
||||||
USB_6KRO_ENABLE = no # 6key Rollover
|
USB_6KRO_ENABLE = no # 6key Rollover
|
||||||
|
|
||||||
# Add System76 EC command interface
|
# Add System76 EC command interface
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "dynamic_keymap.h"
|
#include "dynamic_keymap.h"
|
||||||
#include "raw_hid.h"
|
#include "raw_hid.h"
|
||||||
|
#include "rgb_matrix.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
enum Command {
|
enum Command {
|
||||||
@ -15,8 +16,18 @@ enum Command {
|
|||||||
CMD_KEYMAP_GET = 9,
|
CMD_KEYMAP_GET = 9,
|
||||||
// Set keyboard map index
|
// Set keyboard map index
|
||||||
CMD_KEYMAP_SET = 10,
|
CMD_KEYMAP_SET = 10,
|
||||||
|
// Get LED value by index
|
||||||
|
CMD_LED_GET_VALUE = 11,
|
||||||
|
// Set LED value by index
|
||||||
|
CMD_LED_SET_VALUE = 12,
|
||||||
|
// Get LED color by index
|
||||||
|
CMD_LED_GET_COLOR = 13,
|
||||||
|
// Set LED color by index
|
||||||
|
CMD_LED_SET_COLOR = 14,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define CMD_LED_INDEX_ALL 0xFF
|
||||||
|
|
||||||
static bool keymap_get(uint8_t layer, uint8_t output, uint8_t input, uint16_t *value) {
|
static bool keymap_get(uint8_t layer, uint8_t output, uint8_t input, uint16_t *value) {
|
||||||
if (layer < dynamic_keymap_get_layer_count()) {
|
if (layer < dynamic_keymap_get_layer_count()) {
|
||||||
if (output < MATRIX_ROWS) {
|
if (output < MATRIX_ROWS) {
|
||||||
@ -41,6 +52,33 @@ static bool keymap_set(uint8_t layer, uint8_t output, uint8_t input, uint16_t va
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(RGB_MATRIX_CUSTOM_KB)
|
||||||
|
extern uint8_t raw_rgb_r;
|
||||||
|
extern uint8_t raw_rgb_g;
|
||||||
|
extern uint8_t raw_rgb_b;
|
||||||
|
|
||||||
|
static uint8_t led_v = 255;
|
||||||
|
static uint8_t led_r = 0;
|
||||||
|
static uint8_t led_g = 0;
|
||||||
|
static uint8_t led_b = 0;
|
||||||
|
|
||||||
|
static uint8_t led_normalize(uint8_t component, uint8_t brightness) {
|
||||||
|
uint32_t x = (uint32_t)component;
|
||||||
|
x *= brightness; // Multiply by software brightness
|
||||||
|
x *= RGB_MATRIX_MAXIMUM_BRIGHTNESS; // Multiply by hardware brightness
|
||||||
|
x /= 255; // Divide by maximum software brightness
|
||||||
|
x /= 255; // Divide by maximum hardware brightness
|
||||||
|
return (uint8_t)x;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void led_update(void) {
|
||||||
|
raw_rgb_r = led_normalize(led_r, led_v);
|
||||||
|
raw_rgb_g = led_normalize(led_g, led_v);
|
||||||
|
raw_rgb_b = led_normalize(led_b, led_v);
|
||||||
|
rgb_matrix_mode(RGB_MATRIX_CUSTOM_raw_rgb);
|
||||||
|
}
|
||||||
|
#endif // defined(RGB_MATRIX_CUSTOM_KB)
|
||||||
|
|
||||||
void raw_hid_receive(uint8_t *data, uint8_t length) {
|
void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||||
// Error response by default, set to success by commands
|
// Error response by default, set to success by commands
|
||||||
data[1] = 1;
|
data[1] = 1;
|
||||||
@ -62,25 +100,70 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
|
|||||||
strncpy((char *)&data[2], QMK_VERSION, length - 2);
|
strncpy((char *)&data[2], QMK_VERSION, length - 2);
|
||||||
data[1] = 0;
|
data[1] = 0;
|
||||||
break;
|
break;
|
||||||
case CMD_KEYMAP_GET:
|
case CMD_KEYMAP_GET:
|
||||||
{
|
{
|
||||||
uint16_t value = 0;
|
uint16_t value = 0;
|
||||||
if (keymap_get(data[2], data[3], data[4], &value)) {
|
if (keymap_get(data[2], data[3], data[4], &value)) {
|
||||||
data[5] = (uint8_t)value;
|
data[5] = (uint8_t)value;
|
||||||
data[6] = (uint8_t)(value >> 8);
|
data[6] = (uint8_t)(value >> 8);
|
||||||
data[1] = 0;
|
data[1] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CMD_KEYMAP_SET:
|
case CMD_KEYMAP_SET:
|
||||||
{
|
{
|
||||||
uint16_t value =
|
uint16_t value =
|
||||||
((uint16_t)data[5]) |
|
((uint16_t)data[5]) |
|
||||||
(((uint16_t)data[6]) << 8);
|
(((uint16_t)data[6]) << 8);
|
||||||
if (keymap_set(data[2], data[3], data[4], value)) {
|
if (keymap_set(data[2], data[3], data[4], value)) {
|
||||||
data[1] = 0;
|
data[1] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
#if defined(RGB_MATRIX_CUSTOM_KB)
|
||||||
|
case CMD_LED_GET_VALUE:
|
||||||
|
{
|
||||||
|
//TODO: Getting single LEDs?
|
||||||
|
if (data[2] == CMD_LED_INDEX_ALL) {
|
||||||
|
data[3] = led_v;
|
||||||
|
data[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CMD_LED_SET_VALUE:
|
||||||
|
{
|
||||||
|
//TODO: Setting single LEDs?
|
||||||
|
if (data[2] == CMD_LED_INDEX_ALL) {
|
||||||
|
led_v = data[3];
|
||||||
|
led_update();
|
||||||
|
data[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CMD_LED_GET_COLOR:
|
||||||
|
{
|
||||||
|
//TODO: Getting single LEDs?
|
||||||
|
if (data[2] == CMD_LED_INDEX_ALL) {
|
||||||
|
data[3] = led_r;
|
||||||
|
data[4] = led_g;
|
||||||
|
data[5] = led_b;
|
||||||
|
data[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CMD_LED_SET_COLOR:
|
||||||
|
{
|
||||||
|
//TODO: Setting single LEDs?
|
||||||
|
if (data[2] == CMD_LED_INDEX_ALL) {
|
||||||
|
led_r = data[3];
|
||||||
|
led_g = data[4];
|
||||||
|
led_b = data[5];
|
||||||
|
led_update();
|
||||||
|
data[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif // defined(RGB_MATRIX_CUSTOM_KB)
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_hid_send(data, length);
|
raw_hid_send(data, length);
|
||||||
|
Loading…
Reference in New Issue
Block a user