Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Core] Add Pixel Flow RGB matrix effect #15829

Merged
merged 3 commits into from
Feb 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/feature_rgb_matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,7 @@ enum rgb_matrix_effects {
RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left
RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right
RGB_MATRIX_PIXEL_FRACTAL, // Single hue fractal filled keys pulsing horizontally out to edges
RGB_MATRIX_PIXEL_FLOW, // Pulsing RGB flow along LED wiring with random hues
RGB_MATRIX_PIXEL_RAIN, // Randomly light keys with random hues
#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM!
Expand Down Expand Up @@ -510,6 +511,7 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|`#define ENABLE_RGB_MATRIX_HUE_PENDULUM` |Enables `RGB_MATRIX_HUE_PENDULUM` |
|`#define ENABLE_RGB_MATRIX_HUE_WAVE` |Enables `RGB_MATRIX_HUE_WAVE ` |
|`#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL` |Enables `RGB_MATRIX_PIXEL_FRACTAL` |
|`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` |
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |

?> These modes don't require any additional defines.
Expand Down
1 change: 1 addition & 0 deletions docs/squeezing_avr.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ For RGB Matrix, these need to be explicitly enabled as well. To disable any that
#undef ENABLE_RGB_MATRIX_HUE_PENDULUM
#undef ENABLE_RGB_MATRIX_HUE_WAVE
#undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL
#undef ENABLE_RGB_MATRIX_PIXEL_FLOW
#undef ENABLE_RGB_MATRIX_PIXEL_RAIN

#undef ENABLE_RGB_MATRIX_TYPING_HEATMAP
Expand Down
51 changes: 51 additions & 0 deletions quantum/rgb_matrix/animations/pixel_flow_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// 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];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The consumption of RAM by this array may be significant (especially if using AVR chips). I wonder whether we should somehow optimize this by making the buffers used by different effects overlap (because at the moment only one effect at a time can run). Note that the PIXEL_FRACTAL effect also uses a RAM buffer with a comparable size (that one uses the key matrix size though).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Memory impact was reviewed with avr-size while coding that array table. This PCB uses 58 LEDs and the effect footprint was 178 bytes of data memory:
Without PIXEL_FLOW:

avr-size -C --mcu=atmega32u4 .build/boardsource_technik_o_default.elf
AVR Memory Usage
----------------
Device: atmega32u4

Program:   23712 bytes (72.4% Full)
(.text + .data + .bootloader)

Data:        845 bytes (33.0% Full)
(.data + .bss + .noinit)

WIth PIXEL_FLOW:

avr-size -C --mcu=atmega32u4 .build/boardsource_technik_o_default.elf
AVR Memory Usage
----------------
Device: atmega32u4

Program:   24130 bytes (73.6% Full)
(.text + .data + .bootloader)

Data:       1023 bytes (40.0% Full)
(.data + .bss + .noinit)

Is this a good benchmark for evaluating RAM impact? I can try to rework this to reduce the array at the expense of more code.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's revisit a "scratch" buffer for all the effects in a followup PR.


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
1 change: 1 addition & 0 deletions quantum/rgb_matrix/animations/rgb_matrix_effects.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down