summaryrefslogtreecommitdiff
path: root/quantum/rgb_matrix
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/rgb_matrix')
-rw-r--r--quantum/rgb_matrix/animations/pixel_flow_anim.h49
-rw-r--r--quantum/rgb_matrix/animations/pixel_fractal_anim.h4
-rw-r--r--quantum/rgb_matrix/animations/rgb_matrix_effects.inc1
-rw-r--r--quantum/rgb_matrix/rgb_matrix.c10
-rw-r--r--quantum/rgb_matrix/rgb_matrix.h5
-rw-r--r--quantum/rgb_matrix/rgb_matrix_drivers.c63
6 files changed, 128 insertions, 4 deletions
diff --git a/quantum/rgb_matrix/animations/pixel_flow_anim.h b/quantum/rgb_matrix/animations/pixel_flow_anim.h
new file mode 100644
index 0000000000..312c87628c
--- /dev/null
+++ b/quantum/rgb_matrix/animations/pixel_flow_anim.h
@@ -0,0 +1,49 @@
+// Copyright 2022 @filterpaper
+// SPDX-License-Identifier: GPL-2.0+
+
+#ifdef ENABLE_RGB_MATRIX_PIXEL_FLOW
+RGB_MATRIX_EFFECT(PIXEL_FLOW)
+# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
+
+static bool PIXEL_FLOW(effect_params_t* params) {
+ // LED state array
+ static RGB led[DRIVER_LED_TOTAL];
+
+ static uint32_t wait_timer = 0;
+ if (wait_timer > g_rgb_timer) {
+ return false;
+ }
+
+ inline uint32_t interval(void) { return 3000 / scale16by8(qadd8(rgb_matrix_config.speed, 16), 16); }
+
+ if (params->init) {
+ // Clear LEDs and fill the state array
+ rgb_matrix_set_color_all(0, 0, 0);
+ for (uint8_t j = 0; j < DRIVER_LED_TOTAL; ++j) {
+ led[j] = (random8() & 2) ? (RGB){0, 0, 0} : hsv_to_rgb((HSV){random8(), qadd8(random8() >> 1, 127), rgb_matrix_config.hsv.v});
+ }
+ }
+
+ RGB_MATRIX_USE_LIMITS(led_min, led_max);
+ // Light LEDs based on state array
+ for (uint8_t i = led_min; i < led_max; ++i) {
+ RGB_MATRIX_TEST_LED_FLAGS();
+ rgb_matrix_set_color(i, led[i].r, led[i].g, led[i].b);
+ }
+
+ if (!rgb_matrix_check_finished_leds(led_max)) {
+ // Shift LED state forward
+ for (uint8_t j = 0; j < led_max - 1; ++j) {
+ led[j] = led[j + 1];
+ }
+ // Fill last LED
+ led[led_max - 1] = (random8() & 2) ? (RGB){0, 0, 0} : hsv_to_rgb((HSV){random8(), qadd8(random8() >> 1, 127), rgb_matrix_config.hsv.v});
+ // Set pulse timer
+ wait_timer = g_rgb_timer + interval();
+ }
+
+ return rgb_matrix_check_finished_leds(led_max);
+}
+
+# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
+#endif // ENABLE_RGB_MATRIX_PIXEL_FLOW
diff --git a/quantum/rgb_matrix/animations/pixel_fractal_anim.h b/quantum/rgb_matrix/animations/pixel_fractal_anim.h
index 8e25ec402c..35187b92de 100644
--- a/quantum/rgb_matrix/animations/pixel_fractal_anim.h
+++ b/quantum/rgb_matrix/animations/pixel_fractal_anim.h
@@ -31,6 +31,10 @@ static bool PIXEL_FRACTAL(effect_params_t* params) {
inline uint32_t interval(void) { return 3000 / scale16by8(qadd8(rgb_matrix_config.speed, 16), 16); }
+ if (params->init) {
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+
RGB rgb = rgb_matrix_hsv_to_rgb(rgb_matrix_config.hsv);
for (uint8_t h = 0; h < MATRIX_ROWS; ++h) {
for (uint8_t l = 0; l < MID_COL - 1; ++l) { // Light and move left columns outwards
diff --git a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc
index 27ce347235..ac7bac428d 100644
--- a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc
+++ b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc
@@ -27,6 +27,7 @@
#include "hue_pendulum_anim.h"
#include "hue_wave_anim.h"
#include "pixel_rain_anim.h"
+#include "pixel_flow_anim.h"
#include "pixel_fractal_anim.h"
#include "typing_heatmap_anim.h"
#include "digital_rain_anim.h"
diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c
index 51e9554e2d..5a4556f097 100644
--- a/quantum/rgb_matrix/rgb_matrix.c
+++ b/quantum/rgb_matrix/rgb_matrix.c
@@ -164,6 +164,16 @@ void eeconfig_debug_rgb_matrix(void) {
dprintf("rgb_matrix_config.flags = %d\n", rgb_matrix_config.flags);
}
+void rgb_matrix_reload_from_eeprom(void) {
+ rgb_matrix_disable_noeeprom();
+ /* Reset back to what we have in eeprom */
+ eeconfig_init_rgb_matrix();
+ eeconfig_debug_rgb_matrix(); // display current eeprom values
+ if (rgb_matrix_config.enable) {
+ rgb_matrix_mode_noeeprom(rgb_matrix_config.mode);
+ }
+}
+
__attribute__((weak)) uint8_t rgb_matrix_map_row_column_to_led_kb(uint8_t row, uint8_t column, uint8_t *led_i) { return 0; }
uint8_t rgb_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *led_i) {
diff --git a/quantum/rgb_matrix/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h
index a804d99abc..359d507a4d 100644
--- a/quantum/rgb_matrix/rgb_matrix.h
+++ b/quantum/rgb_matrix/rgb_matrix.h
@@ -32,6 +32,8 @@
# include "is31fl3737.h"
#elif defined(IS31FL3741)
# include "is31fl3741.h"
+#elif defined(IS31FLCOMMON)
+# include "is31flcommon.h"
#elif defined(CKLED2001)
# include "ckled2001.h"
#elif defined(AW20216)
@@ -136,6 +138,8 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max);
void rgb_matrix_init(void);
+void rgb_matrix_reload_from_eeprom(void);
+
void rgb_matrix_set_suspend_state(bool state);
bool rgb_matrix_get_suspend_state(void);
void rgb_matrix_toggle(void);
@@ -182,6 +186,7 @@ void rgb_matrix_set_flags(led_flags_t flags);
#ifndef RGBLIGHT_ENABLE
# define eeconfig_update_rgblight_current eeconfig_update_rgb_matrix
+# define rgblight_reload_from_eeprom rgb_matrix_reload_from_eeprom
# define rgblight_toggle rgb_matrix_toggle
# define rgblight_toggle_noeeprom rgb_matrix_toggle_noeeprom
# define rgblight_enable rgb_matrix_enable
diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c
index 130ca47a63..27fa7369bf 100644
--- a/quantum/rgb_matrix/rgb_matrix_drivers.c
+++ b/quantum/rgb_matrix/rgb_matrix_drivers.c
@@ -23,7 +23,7 @@
* be here if shared between boards.
*/
-#if defined(IS31FL3731) || defined(IS31FL3733) || defined(IS31FL3737) || defined(IS31FL3741) || defined(CKLED2001)
+#if defined(IS31FL3731) || defined(IS31FL3733) || defined(IS31FL3737) || defined(IS31FL3741) || defined(IS31FLCOMMON) || defined(CKLED2001)
# include "i2c_master.h"
// TODO: Remove this at some later date
@@ -81,6 +81,18 @@ static void init(void) {
# elif defined(IS31FL3741)
IS31FL3741_init(DRIVER_ADDR_1);
+# elif defined(IS31FLCOMMON)
+ IS31FL_common_init(DRIVER_ADDR_1, ISSI_SSR_1);
+# if defined(DRIVER_ADDR_2)
+ IS31FL_common_init(DRIVER_ADDR_2, ISSI_SSR_2);
+# if defined(DRIVER_ADDR_3)
+ IS31FL_common_init(DRIVER_ADDR_3, ISSI_SSR_3);
+# if defined(DRIVER_ADDR_4)
+ IS31FL_common_init(DRIVER_ADDR_4, ISSI_SSR_4);
+# endif
+# endif
+# endif
+
# elif defined(CKLED2001)
CKLED2001_init(DRIVER_ADDR_1);
# if defined(DRIVER_ADDR_2)
@@ -106,6 +118,8 @@ static void init(void) {
IS31FL3737_set_led_control_register(index, enabled, enabled, enabled);
# elif defined(IS31FL3741)
IS31FL3741_set_led_control_register(index, enabled, enabled, enabled);
+# elif defined(IS31FLCOMMON)
+ IS31FL_RGB_set_scaling_buffer(index, enabled, enabled, enabled);
# elif defined(CKLED2001)
CKLED2001_set_led_control_register(index, enabled, enabled, enabled);
# endif
@@ -145,6 +159,21 @@ static void init(void) {
# elif defined(IS31FL3741)
IS31FL3741_update_led_control_registers(DRIVER_ADDR_1, 0);
+# elif defined(IS31FLCOMMON)
+# ifdef ISSI_MANUAL_SCALING
+ IS31FL_set_manual_scaling_buffer();
+# endif
+ IS31FL_common_update_scaling_register(DRIVER_ADDR_1, 0);
+# if defined(DRIVER_ADDR_2)
+ IS31FL_common_update_scaling_register(DRIVER_ADDR_2, 1);
+# if defined(DRIVER_ADDR_3)
+ IS31FL_common_update_scaling_register(DRIVER_ADDR_3, 2);
+# if defined(DRIVER_ADDR_4)
+ IS31FL_common_update_scaling_register(DRIVER_ADDR_4, 3);
+# endif
+# endif
+# endif
+
# elif defined(CKLED2001)
CKLED2001_update_led_control_registers(DRIVER_ADDR_1, 0);
# if defined(DRIVER_ADDR_2)
@@ -231,6 +260,27 @@ const rgb_matrix_driver_t rgb_matrix_driver = {
.set_color_all = IS31FL3741_set_color_all,
};
+# elif defined(IS31FLCOMMON)
+static void flush(void) {
+ IS31FL_common_update_pwm_register(DRIVER_ADDR_1, 0);
+# if defined(DRIVER_ADDR_2)
+ IS31FL_common_update_pwm_register(DRIVER_ADDR_2, 1);
+# if defined(DRIVER_ADDR_3)
+ IS31FL_common_update_pwm_register(DRIVER_ADDR_3, 2);
+# if defined(DRIVER_ADDR_4)
+ IS31FL_common_update_pwm_register(DRIVER_ADDR_4, 3);
+# endif
+# endif
+# endif
+}
+
+const rgb_matrix_driver_t rgb_matrix_driver = {
+ .init = init,
+ .flush = flush,
+ .set_color = IS31FL_RGB_set_color,
+ .set_color_all = IS31FL_RGB_set_color_all,
+};
+
# elif defined(CKLED2001)
static void flush(void) {
CKLED2001_update_pwm_buffers(DRIVER_ADDR_1, 0);
@@ -299,10 +349,15 @@ static void flush(void) {
static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) {
# if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
- if (!is_keyboard_left() && (i >= k_rgb_matrix_split[0])) {
- i -= k_rgb_matrix_split[0];
- } else if (is_keyboard_left() && (i >= k_rgb_matrix_split[0]))
+ if (!is_keyboard_left()) {
+ if (i >= k_rgb_matrix_split[0]) {
+ i -= k_rgb_matrix_split[0];
+ } else {
+ return;
+ }
+ } else if (i >= k_rgb_matrix_split[0]) {
return;
+ }
# endif
rgb_matrix_ws2812_array[i].r = r;