vialrgb: support direct LED control
This commit is contained in:
parent
b20bf26c6b
commit
83d13b44c2
5 changed files with 83 additions and 1 deletions
|
@ -35,3 +35,4 @@
|
||||||
#include "rgb_matrix_animations/solid_reactive_nexus.h"
|
#include "rgb_matrix_animations/solid_reactive_nexus.h"
|
||||||
#include "rgb_matrix_animations/splash_anim.h"
|
#include "rgb_matrix_animations/splash_anim.h"
|
||||||
#include "rgb_matrix_animations/solid_splash_anim.h"
|
#include "rgb_matrix_animations/solid_splash_anim.h"
|
||||||
|
#include "rgb_matrix_animations/vialrgb_direct_anim.h"
|
||||||
|
|
18
quantum/rgb_matrix_animations/vialrgb_direct_anim.h
Normal file
18
quantum/rgb_matrix_animations/vialrgb_direct_anim.h
Normal 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
|
|
@ -17,6 +17,8 @@ typedef struct {
|
||||||
|
|
||||||
#define SUPPORTED_MODES_LENGTH (sizeof(supported_modes)/sizeof(*supported_modes))
|
#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) {
|
static void get_supported(uint8_t *args, uint8_t length) {
|
||||||
/* retrieve supported effects (VialRGB IDs) with ID > gt */
|
/* retrieve supported effects (VialRGB IDs) with ID > gt */
|
||||||
uint16_t 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) {
|
void vialrgb_get_value(uint8_t *data, uint8_t length) {
|
||||||
if (length != VIAL_RAW_EPSIZE) return;
|
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);
|
get_supported(args, length - 2);
|
||||||
break;
|
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]);
|
rgb_matrix_sethsv_noeeprom(args[3], args[4], args[5]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case vialrgb_direct_fastset: {
|
||||||
|
fast_set_leds(args, length);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,15 @@
|
||||||
even though they likely wouldn't be enabled together with vialrgb */
|
even though they likely wouldn't be enabled together with vialrgb */
|
||||||
enum {
|
enum {
|
||||||
vialrgb_set_mode = 0x41,
|
vialrgb_set_mode = 0x41,
|
||||||
|
vialrgb_direct_fastset = 0x42,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
vialrgb_get_info = 0x40,
|
vialrgb_get_info = 0x40,
|
||||||
vialrgb_get_mode = 0x41,
|
vialrgb_get_mode = 0x41,
|
||||||
vialrgb_get_supported = 0x42,
|
vialrgb_get_supported = 0x42,
|
||||||
|
vialrgb_get_number_leds = 0x43,
|
||||||
|
vialrgb_get_led_info = 0x44,
|
||||||
};
|
};
|
||||||
|
|
||||||
void vialrgb_get_value(uint8_t *data, uint8_t length);
|
void vialrgb_get_value(uint8_t *data, uint8_t length);
|
||||||
|
|
|
@ -49,7 +49,9 @@ enum {
|
||||||
|
|
||||||
static const PROGMEM vialrgb_supported_mode_t supported_modes[] = {
|
static const PROGMEM vialrgb_supported_mode_t supported_modes[] = {
|
||||||
{ VIALRGB_EFFECT_OFF, 0 },
|
{ 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
|
#ifdef RGB_MATRIX_EFFECT_SOLID_COLOR
|
||||||
{ VIALRGB_EFFECT_SOLID_COLOR, RGB_MATRIX_SOLID_COLOR },
|
{ VIALRGB_EFFECT_SOLID_COLOR, RGB_MATRIX_SOLID_COLOR },
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue