diff --git a/keyboards/system76/launch_beta_1/rgb_matrix_kb.inc b/keyboards/system76/launch_beta_1/rgb_matrix_kb.inc new file mode 100644 index 00000000000..7d179fd1c32 --- /dev/null +++ b/keyboards/system76/launch_beta_1/rgb_matrix_kb.inc @@ -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 diff --git a/keyboards/system76/launch_beta_1/rules.mk b/keyboards/system76/launch_beta_1/rules.mk index 85774a90d48..b035fea7a16 100644 --- a/keyboards/system76/launch_beta_1/rules.mk +++ b/keyboards/system76/launch_beta_1/rules.mk @@ -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) RGBLIGHT_ENABLE = no # Support for RGB backlight (conflicts with 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 # Add System76 EC command interface diff --git a/keyboards/system76/system76_ec.c b/keyboards/system76/system76_ec.c index e9c2949dba0..bc565aa4077 100644 --- a/keyboards/system76/system76_ec.c +++ b/keyboards/system76/system76_ec.c @@ -2,6 +2,7 @@ #include "dynamic_keymap.h" #include "raw_hid.h" +#include "rgb_matrix.h" #include "version.h" enum Command { @@ -15,8 +16,18 @@ enum Command { CMD_KEYMAP_GET = 9, // Set keyboard map index 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) { if (layer < dynamic_keymap_get_layer_count()) { 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; } +#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) { // Error response by default, set to success by commands 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); data[1] = 0; break; - case CMD_KEYMAP_GET: - { - uint16_t value = 0; - if (keymap_get(data[2], data[3], data[4], &value)) { - data[5] = (uint8_t)value; - data[6] = (uint8_t)(value >> 8); - data[1] = 0; - } - } - break; + case CMD_KEYMAP_GET: + { + uint16_t value = 0; + if (keymap_get(data[2], data[3], data[4], &value)) { + data[5] = (uint8_t)value; + data[6] = (uint8_t)(value >> 8); + data[1] = 0; + } + } + break; case CMD_KEYMAP_SET: { - uint16_t value = + uint16_t value = ((uint16_t)data[5]) | (((uint16_t)data[6]) << 8); - if (keymap_set(data[2], data[3], data[4], value)) { - data[1] = 0; - } + if (keymap_set(data[2], data[3], data[4], value)) { + 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);