From 1d5ed0b24aaac2b845bf48dacf6520fe108aaf3c Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 8 Jul 2021 22:38:45 -0400 Subject: [PATCH] vialrgb: convert between vialrgb id and qmk id for modes --- .../rgb_matrix_animations/alpha_mods_anim.h | 1 + .../rgb_matrix_animations/solid_color_anim.h | 1 + quantum/vialrgb.c | 105 +++++++++++++++++- quantum/vialrgb.h | 1 + 4 files changed, 105 insertions(+), 3 deletions(-) diff --git a/quantum/rgb_matrix_animations/alpha_mods_anim.h b/quantum/rgb_matrix_animations/alpha_mods_anim.h index 426d88ef35..730b07128c 100644 --- a/quantum/rgb_matrix_animations/alpha_mods_anim.h +++ b/quantum/rgb_matrix_animations/alpha_mods_anim.h @@ -1,4 +1,5 @@ #ifndef DISABLE_RGB_MATRIX_ALPHAS_MODS +#define RGB_MATRIX_EFFECT_ALPHAS_MODS RGB_MATRIX_EFFECT(ALPHAS_MODS) # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS diff --git a/quantum/rgb_matrix_animations/solid_color_anim.h b/quantum/rgb_matrix_animations/solid_color_anim.h index 79d63cf133..0c6b92eb1f 100644 --- a/quantum/rgb_matrix_animations/solid_color_anim.h +++ b/quantum/rgb_matrix_animations/solid_color_anim.h @@ -1,3 +1,4 @@ +#define RGB_MATRIX_EFFECT_SOLID_COLOR RGB_MATRIX_EFFECT(SOLID_COLOR) #ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS diff --git a/quantum/vialrgb.c b/quantum/vialrgb.c index 37fc4ea1a5..5bec65282e 100644 --- a/quantum/vialrgb.c +++ b/quantum/vialrgb.c @@ -1,12 +1,107 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Based on https://github.com/qmk/qmk_firmware/pull/13036 */ #include "vialrgb.h" #include +#include #include "rgb_matrix.h" #include "vial.h" -/* Based on https://github.com/qmk/qmk_firmware/pull/13036 */ +/* Note - never reorder or remove these, only add new animations at the end */ +enum { + VIALRGB_EFFECT_OFF = 0, + VIALRGB_EFFECT_DIRECT, + VIALRGB_EFFECT_SOLID_COLOR, + VIALRGB_EFFECT_ALPHAS_MODS, + VIALRGB_EFFECT_GRADIENT_UP_DOWN_ANIM, + VIALRGB_EFFECT_GRADIENT_LEFT_RIGHT_ANIM, + VIALRGB_EFFECT_BREATHING_ANIM, + VIALRGB_EFFECT_COLORBAND_SAT_ANIM, + VIALRGB_EFFECT_COLORBAND_VAL_ANIM, + VIALRGB_EFFECT_COLORBAND_PINWHEEL_SAT_ANIM, + VIALRGB_EFFECT_COLORBAND_PINWHEEL_VAL_ANIM, + VIALRGB_EFFECT_COLORBAND_SPIRAL_SAT_ANIM, + VIALRGB_EFFECT_COLORBAND_SPIRAL_VAL_ANIM, + VIALRGB_EFFECT_CYCLE_ALL_ANIM, + VIALRGB_EFFECT_CYCLE_LEFT_RIGHT_ANIM, + VIALRGB_EFFECT_CYCLE_UP_DOWN_ANIM, + VIALRGB_EFFECT_RAINBOW_MOVING_CHEVRON_ANIM, + VIALRGB_EFFECT_CYCLE_OUT_IN_ANIM, + VIALRGB_EFFECT_CYCLE_OUT_IN_DUAL_ANIM, + VIALRGB_EFFECT_CYCLE_PINWHEEL_ANIM, + VIALRGB_EFFECT_CYCLE_SPIRAL_ANIM, + VIALRGB_EFFECT_DUAL_BEACON_ANIM, + VIALRGB_EFFECT_RAINBOW_BEACON_ANIM, + VIALRGB_EFFECT_RAINBOW_PINWHEELS_ANIM, + VIALRGB_EFFECT_RAINDROPS_ANIM, + VIALRGB_EFFECT_JELLYBEAN_RAINDROPS_ANIM, + VIALRGB_EFFECT_HUE_BREATHING_ANIM, + VIALRGB_EFFECT_HUE_PENDULUM_ANIM, + VIALRGB_EFFECT_HUE_WAVE_ANIM, + VIALRGB_EFFECT_TYPING_HEATMAP_ANIM, + VIALRGB_EFFECT_DIGITAL_RAIN_ANIM, + VIALRGB_EFFECT_SOLID_REACTIVE_SIMPLE_ANIM, + VIALRGB_EFFECT_SOLID_REACTIVE_ANIM, + VIALRGB_EFFECT_SOLID_REACTIVE_WIDE, + VIALRGB_EFFECT_SOLID_REACTIVE_CROSS, + VIALRGB_EFFECT_SOLID_REACTIVE_NEXUS, + VIALRGB_EFFECT_SPLASH_ANIM, + VIALRGB_EFFECT_SOLID_SPLASH_ANIM, +}; + +typedef struct { + uint16_t vialrgb_id; + uint16_t qmk_id; +} vialrgb_supported_mode_t; + +static const PROGMEM vialrgb_supported_mode_t supported_modes[] = { + { VIALRGB_EFFECT_OFF, 0 }, + // { VIALRGB_EFFECT_DIRECT, 0 }, TODO +#ifdef RGB_MATRIX_EFFECT_SOLID_COLOR + { VIALRGB_EFFECT_SOLID_COLOR, RGB_MATRIX_SOLID_COLOR }, +#endif +#ifdef RGB_MATRIX_EFFECT_ALPHAS_MODS + { VIALRGB_EFFECT_ALPHAS_MODS, RGB_MATRIX_ALPHAS_MODS }, +#endif +}; + +#define SUPPORTED_MODES_LENGTH (sizeof(supported_modes)/sizeof(*supported_modes)) + +static void get_supported(uint8_t *args, uint8_t length) { + /* retrieve supported effects (VialRGB IDs) with ID > gt */ + uint16_t gt; + memcpy(>, args, sizeof(gt)); + memset(args, 0xFF, length); + for (size_t i = 0; i < SUPPORTED_MODES_LENGTH; ++i) { + uint16_t id = pgm_read_word(&supported_modes[i].vialrgb_id); + if (id > gt && length >= sizeof(id)) { + memcpy(args, &id, sizeof(id)); + length -= sizeof(id); + args += sizeof(id); + } + } +} + +static uint16_t qmk_id_to_vialrgb_id(uint16_t id) { + for (size_t i = 0; i < SUPPORTED_MODES_LENGTH; ++i) { + uint16_t qmk_id = pgm_read_word(&supported_modes[i].qmk_id); + uint16_t vialrgb_id = pgm_read_word(&supported_modes[i].vialrgb_id); + if (qmk_id == id) + return vialrgb_id; + } + return 0; +} + +static uint16_t vialrgb_id_to_qmk_id(uint16_t id) { + for (size_t i = 0; i < SUPPORTED_MODES_LENGTH; ++i) { + uint16_t qmk_id = pgm_read_word(&supported_modes[i].qmk_id); + uint16_t vialrgb_id = pgm_read_word(&supported_modes[i].vialrgb_id); + if (vialrgb_id == id) + return qmk_id; + } + return 0; +} void vialrgb_get_value(uint8_t *data, uint8_t length) { if (length != VIAL_RAW_EPSIZE) return; @@ -21,13 +116,17 @@ void vialrgb_get_value(uint8_t *data, uint8_t length) { args[2] = RGB_MATRIX_MAXIMUM_BRIGHTNESS; break; case vialrgb_get_mode: { - args[0] = rgb_matrix_get_mode(); + args[0] = qmk_id_to_vialrgb_id(rgb_matrix_get_mode()); args[1] = rgb_matrix_get_speed(); args[2] = rgb_matrix_get_hue(); args[3] = rgb_matrix_get_sat(); args[4] = rgb_matrix_get_val(); break; } + case vialrgb_get_supported: { + get_supported(args, length - 2); + break; + } } } @@ -39,7 +138,7 @@ void vialrgb_set_value(uint8_t *data, uint8_t length) { uint8_t *args = &data[2]; switch (cmd) { case vialrgb_set_mode: { - rgb_matrix_mode_noeeprom(args[0]); + rgb_matrix_mode_noeeprom(vialrgb_id_to_qmk_id(args[0])); rgb_matrix_set_speed_noeeprom(args[1]); rgb_matrix_sethsv_noeeprom(args[2], args[3], args[4]); break; diff --git a/quantum/vialrgb.h b/quantum/vialrgb.h index f06eb316c6..170d110c34 100644 --- a/quantum/vialrgb.h +++ b/quantum/vialrgb.h @@ -13,6 +13,7 @@ enum { enum { vialrgb_get_info = 0x40, vialrgb_get_mode = 0x41, + vialrgb_get_supported = 0x42, }; void vialrgb_get_value(uint8_t *data, uint8_t length);