vialrgb: support direct LED control

This commit is contained in:
Ilya Zhuravlev 2021-07-09 22:11:50 -04:00
parent b20bf26c6b
commit 83d13b44c2
5 changed files with 83 additions and 1 deletions

View file

@ -35,3 +35,4 @@
#include "rgb_matrix_animations/solid_reactive_nexus.h"
#include "rgb_matrix_animations/splash_anim.h"
#include "rgb_matrix_animations/solid_splash_anim.h"
#include "rgb_matrix_animations/vialrgb_direct_anim.h"

View file

@ -0,0 +1,18 @@
#if defined(VIALRGB_ENABLE) && !defined(VIALRGB_NO_DIRECT)
#define RGB_MATRIX_EFFECT_VIALRGB_DIRECT
RGB_MATRIX_EFFECT(VIALRGB_DIRECT)
# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
extern HSV g_direct_mode_colors[DRIVER_LED_TOTAL];
bool VIALRGB_DIRECT(effect_params_t* params) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
for (uint8_t i = led_min; i < led_max; i++) {
RGB rgb = rgb_matrix_hsv_to_rgb(g_direct_mode_colors[i]);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
return led_max < DRIVER_LED_TOTAL;
}
# endif
#endif

View file

@ -17,6 +17,8 @@ typedef struct {
#define SUPPORTED_MODES_LENGTH (sizeof(supported_modes)/sizeof(*supported_modes))
HSV g_direct_mode_colors[DRIVER_LED_TOTAL];
static void get_supported(uint8_t *args, uint8_t length) {
/* retrieve supported effects (VialRGB IDs) with ID > gt */
uint16_t gt;
@ -69,6 +71,41 @@ static void set_mode(uint16_t mode) {
}
}
static void get_matrix_pos_for_led(uint16_t led, uint8_t *output) {
/* reset initially so if we cannot locate the led, it's considered not part of kb matrix */
output[0] = output[1] = 0xFF;
/* this is kinda O(n^2) but what can you do */
for (size_t row = 0; row < MATRIX_ROWS; ++row)
for (size_t col = 0; col < MATRIX_COLS; ++col)
if (g_led_config.matrix_co[row][col] == led) {
output[0] = row;
output[1] = col;
return;
}
}
static void fast_set_leds(uint8_t *args, size_t length) {
/* Set multiple leds HSV, first 2 bytes are index of the first led, then number of leds, followed by HSV for the leds */
/* we have 32-2-2-1=27 total bytes available, so can set up to 9 leds per packet */
if (length < 3) return;
uint16_t first_index = args[0] | (args[1] << 8);
uint8_t num_leds = args[2];
length -= 3;
args += 3;
if (num_leds * 3 > length) return;
for (size_t i = 0; i < num_leds; ++i) {
if (i + first_index >= DRIVER_LED_TOTAL)
break;
g_direct_mode_colors[i + first_index].h = args[i * 3 + 0];
g_direct_mode_colors[i + first_index].s = args[i * 3 + 1];
uint8_t val = args[i * 3 + 2];
g_direct_mode_colors[i + first_index].v = (val > RGB_MATRIX_MAXIMUM_BRIGHTNESS) ? RGB_MATRIX_MAXIMUM_BRIGHTNESS : val;
}
}
void vialrgb_get_value(uint8_t *data, uint8_t length) {
if (length != VIAL_RAW_EPSIZE) return;
@ -95,6 +132,23 @@ void vialrgb_get_value(uint8_t *data, uint8_t length) {
get_supported(args, length - 2);
break;
}
case vialrgb_get_number_leds: {
args[0] = DRIVER_LED_TOTAL & 0xFF;
args[1] = DRIVER_LED_TOTAL >> 8;
break;
}
case vialrgb_get_led_info: {
uint16_t led = (args[0] & 0xFF) | (args[1] >> 8);
if (led >= DRIVER_LED_TOTAL) return;
// x, y
args[0] = g_led_config.point[led].x;
args[1] = g_led_config.point[led].y;
// flags
args[2] = g_led_config.flags[led];
// position in keyboard matrix (if it's keyboard LED, otherwise 0xFF)
get_matrix_pos_for_led(led, &args[3]);
break;
}
}
}
@ -112,6 +166,10 @@ void vialrgb_set_value(uint8_t *data, uint8_t length) {
rgb_matrix_sethsv_noeeprom(args[3], args[4], args[5]);
break;
}
case vialrgb_direct_fastset: {
fast_set_leds(args, length);
break;
}
}
}

View file

@ -8,12 +8,15 @@
even though they likely wouldn't be enabled together with vialrgb */
enum {
vialrgb_set_mode = 0x41,
vialrgb_direct_fastset = 0x42,
};
enum {
vialrgb_get_info = 0x40,
vialrgb_get_mode = 0x41,
vialrgb_get_supported = 0x42,
vialrgb_get_number_leds = 0x43,
vialrgb_get_led_info = 0x44,
};
void vialrgb_get_value(uint8_t *data, uint8_t length);

View file

@ -49,7 +49,9 @@ enum {
static const PROGMEM vialrgb_supported_mode_t supported_modes[] = {
{ VIALRGB_EFFECT_OFF, 0 },
// { VIALRGB_EFFECT_DIRECT, 0 }, TODO
#ifdef RGB_MATRIX_EFFECT_VIALRGB_DIRECT
{ VIALRGB_EFFECT_DIRECT, RGB_MATRIX_VIALRGB_DIRECT },
#endif
#ifdef RGB_MATRIX_EFFECT_SOLID_COLOR
{ VIALRGB_EFFECT_SOLID_COLOR, RGB_MATRIX_SOLID_COLOR },
#endif