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

LED Matrix: Effects! #12651

Merged
merged 1 commit into from
May 11, 2021
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 57 additions & 14 deletions quantum/led_matrix.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,38 @@

#include <lib/lib8tion/lib8tion.h>

#ifndef LED_MATRIX_CENTER
const point_t k_led_matrix_center = {112, 32};
#else
const point_t k_led_matrix_center = LED_MATRIX_CENTER;
#endif

// Generic effect runners
#include "led_matrix_runners/effect_runner_dx_dy_dist.h"
#include "led_matrix_runners/effect_runner_dx_dy.h"
#include "led_matrix_runners/effect_runner_i.h"
#include "led_matrix_runners/effect_runner_sin_cos_i.h"
#include "led_matrix_runners/effect_runner_reactive.h"
#include "led_matrix_runners/effect_runner_reactive_splash.h"

// ------------------------------------------
// -----Begin led effect includes macros-----
#define LED_MATRIX_EFFECT(name)
#define LED_MATRIX_CUSTOM_EFFECT_IMPLS

#include "led_matrix_animations/led_matrix_effects.inc"
#ifdef LED_MATRIX_CUSTOM_KB
# include "led_matrix_kb.inc"
#endif
#ifdef LED_MATRIX_CUSTOM_USER
# include "led_matrix_user.inc"
#endif

#undef LED_MATRIX_CUSTOM_EFFECT_IMPLS
#undef LED_MATRIX_EFFECT
// -----End led effect includes macros-------
// ------------------------------------------

#if defined(LED_DISABLE_AFTER_TIMEOUT) && !defined(LED_DISABLE_TIMEOUT)
# define LED_DISABLE_TIMEOUT (LED_DISABLE_AFTER_TIMEOUT * 1200UL)
#endif
Expand All @@ -53,7 +85,7 @@
#endif

#if !defined(LED_MATRIX_STARTUP_MODE)
# define LED_MATRIX_STARTUP_MODE LED_MATRIX_UNIFORM_BRIGHTNESS
# define LED_MATRIX_STARTUP_MODE LED_MATRIX_SOLID
#endif

#if !defined(LED_MATRIX_STARTUP_VAL)
Expand Down Expand Up @@ -216,17 +248,6 @@ static bool led_matrix_none(effect_params_t *params) {
return false;
}

static bool led_matrix_uniform_brightness(effect_params_t *params) {
LED_MATRIX_USE_LIMITS(led_min, led_max);

uint8_t val = led_matrix_eeconfig.val;
for (uint8_t i = led_min; i < led_max; i++) {
LED_MATRIX_TEST_LED_FLAGS();
led_matrix_set_value(i, val);
}
return led_max < DRIVER_LED_TOTAL;
}

static void led_task_timers(void) {
#if defined(LED_MATRIX_KEYREACTIVE_ENABLED) || LED_DISABLE_TIMEOUT > 0
uint32_t deltaTime = sync_timer_elapsed32(led_timer_buffer);
Expand Down Expand Up @@ -290,9 +311,31 @@ static void led_task_render(uint8_t effect) {
case LED_MATRIX_NONE:
rendering = led_matrix_none(&led_effect_params);
break;
case LED_MATRIX_UNIFORM_BRIGHTNESS:
rendering = led_matrix_uniform_brightness(&led_effect_params);

// ---------------------------------------------
// -----Begin led effect switch case macros-----
#define LED_MATRIX_EFFECT(name, ...) \
case LED_MATRIX_##name: \
rendering = name(&led_effect_params); \
break;
#include "led_matrix_animations/led_matrix_effects.inc"
#undef LED_MATRIX_EFFECT

#if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER)
# define LED_MATRIX_EFFECT(name, ...) \
case LED_MATRIX_CUSTOM_##name: \
rendering = name(&led_effect_params); \
break;
# ifdef LED_MATRIX_CUSTOM_KB
# include "led_matrix_kb.inc"
# endif
# ifdef LED_MATRIX_CUSTOM_USER
# include "led_matrix_user.inc"
# endif
# undef LED_MATRIX_EFFECT
#endif
// -----End led effect switch case macros-------
// ---------------------------------------------
}

led_effect_params.iter++;
Expand Down
20 changes: 18 additions & 2 deletions quantum/led_matrix.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,24 @@
enum led_matrix_effects {
LED_MATRIX_NONE = 0,

LED_MATRIX_UNIFORM_BRIGHTNESS,
// All new effects go above this line
// --------------------------------------
// -----Begin led effect enum macros-----
#define LED_MATRIX_EFFECT(name, ...) LED_MATRIX_##name,
#include "led_matrix_animations/led_matrix_effects.inc"
#undef LED_MATRIX_EFFECT

#if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER)
# define LED_MATRIX_EFFECT(name, ...) LED_MATRIX_CUSTOM_##name,
# ifdef LED_MATRIX_CUSTOM_KB
# include "led_matrix_kb.inc"
# endif
# ifdef LED_MATRIX_CUSTOM_USER
# include "led_matrix_user.inc"
# endif
# undef LED_MATRIX_EFFECT
#endif
// --------------------------------------
// -----End led effect enum macros-------

LED_MATRIX_EFFECT_MAX
};
Expand Down
24 changes: 24 additions & 0 deletions quantum/led_matrix_animations/alpha_mods_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef DISABLE_LED_MATRIX_ALPHAS_MODS
LED_MATRIX_EFFECT(ALPHAS_MODS)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

// alphas = val1, mods = val2
bool ALPHAS_MODS(effect_params_t* params) {
LED_MATRIX_USE_LIMITS(led_min, led_max);

uint8_t val1 = led_matrix_eeconfig.val;
uint8_t val2 = val1 + led_matrix_eeconfig.speed;

for (uint8_t i = led_min; i < led_max; i++) {
LED_MATRIX_TEST_LED_FLAGS();
if (HAS_FLAGS(g_led_config.flags[i], LED_FLAG_MODIFIER)) {
led_matrix_set_value(i, val2);
} else {
led_matrix_set_value(i, val1);
}
}
return led_max < DRIVER_LED_TOTAL;
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_ALPHAS_MODS
15 changes: 15 additions & 0 deletions quantum/led_matrix_animations/band_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#ifndef DISABLE_LED_MATRIX_BAND
LED_MATRIX_EFFECT(BAND)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t BAND_math(uint8_t val, uint8_t i, uint8_t time) {
int16_t v = val - abs(scale8(g_led_config.point[i].x, 228) + 28 - time) * 8;
return scale8(v < 0 ? 0 : v, val);
}

bool BAND(effect_params_t* params) {
return effect_runner_i(params, &BAND_math);
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_BAND
14 changes: 14 additions & 0 deletions quantum/led_matrix_animations/band_pinwheel_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef DISABLE_LED_MATRIX_BAND_PINWHEEL
LED_MATRIX_EFFECT(BAND_PINWHEEL)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t BAND_PINWHEEL_math(uint8_t val, int16_t dx, int16_t dy, uint8_t time) {
return scale8(val - time - atan2_8(dy, dx) * 3, val);
}

bool BAND_PINWHEEL(effect_params_t* params) {
return effect_runner_dx_dy(params, &BAND_PINWHEEL_math);
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_BAND_PINWHEEL
14 changes: 14 additions & 0 deletions quantum/led_matrix_animations/band_spiral_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef DISABLE_LED_MATRIX_BAND_SPIRAL
LED_MATRIX_EFFECT(BAND_SPIRAL)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t BAND_SPIRAL_math(uint8_t val, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
return scale8(val + dist - time - atan2_8(dy, dx), val);
}

bool BAND_SPIRAL(effect_params_t* params) {
return effect_runner_dx_dy_dist(params, &BAND_SPIRAL_math);
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_BAND_SPIRAL
19 changes: 19 additions & 0 deletions quantum/led_matrix_animations/breathing_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef DISABLE_LED_MATRIX_BREATHING
LED_MATRIX_EFFECT(BREATHING)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

bool BREATHING(effect_params_t* params) {
LED_MATRIX_USE_LIMITS(led_min, led_max);

uint8_t val = led_matrix_eeconfig.val;
uint16_t time = scale16by8(g_led_timer, led_matrix_eeconfig.speed / 8);
val = scale8(abs8(sin8(time) - 128) * 2, val);
for (uint8_t i = led_min; i < led_max; i++) {
LED_MATRIX_TEST_LED_FLAGS();
led_matrix_set_value(i, val);
}
return led_max < DRIVER_LED_TOTAL;
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_BREATHING
14 changes: 14 additions & 0 deletions quantum/led_matrix_animations/cycle_left_right_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef DISABLE_LED_MATRIX_CYCLE_LEFT_RIGHT
LED_MATRIX_EFFECT(CYCLE_LEFT_RIGHT)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t CYCLE_LEFT_RIGHT_math(uint8_t val, uint8_t i, uint8_t time) {
return scale8(g_led_config.point[i].x - time, val);
}

bool CYCLE_LEFT_RIGHT(effect_params_t* params) {
return effect_runner_i(params, &CYCLE_LEFT_RIGHT_math);
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_CYCLE_LEFT_RIGHT
14 changes: 14 additions & 0 deletions quantum/led_matrix_animations/cycle_out_in_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef DISABLE_LED_MATRIX_CYCLE_OUT_IN
LED_MATRIX_EFFECT(CYCLE_OUT_IN)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t CYCLE_OUT_IN_math(uint8_t val, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
return scale8(3 * dist / 2 + time, val);
}

bool CYCLE_OUT_IN(effect_params_t* params) {
return effect_runner_dx_dy_dist(params, &CYCLE_OUT_IN_math);
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_CYCLE_OUT_IN
14 changes: 14 additions & 0 deletions quantum/led_matrix_animations/cycle_up_down_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef DISABLE_LED_MATRIX_CYCLE_UP_DOWN
LED_MATRIX_EFFECT(CYCLE_UP_DOWN)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t CYCLE_UP_DOWN_math(uint8_t val, uint8_t i, uint8_t time) {
return scale8(g_led_config.point[i].y - time, val);
}

bool CYCLE_UP_DOWN(effect_params_t* params) {
return effect_runner_i(params, &CYCLE_UP_DOWN_math);
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_CYCLE_UP_DOWN
14 changes: 14 additions & 0 deletions quantum/led_matrix_animations/dual_beacon_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef DISABLE_LED_MATRIX_DUAL_BEACON
LED_MATRIX_EFFECT(DUAL_BEACON)
# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t DUAL_BEACON_math(uint8_t val, int8_t sin, int8_t cos, uint8_t i, uint8_t time) {
return scale8(((g_led_config.point[i].y - k_led_matrix_center.y) * cos + (g_led_config.point[i].x - k_led_matrix_center.x) * sin) / 128, val);
}

bool DUAL_BEACON(effect_params_t* params) {
return effect_runner_sin_cos_i(params, &DUAL_BEACON_math);
}

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // DISABLE_LED_MATRIX_DUAL_BEACON
18 changes: 18 additions & 0 deletions quantum/led_matrix_animations/led_matrix_effects.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Add your new core led matrix effect here, order determins enum order, requires "led_matrix_animations/ directory
#include "led_matrix_animations/solid_anim.h"
#include "led_matrix_animations/alpha_mods_anim.h"
#include "led_matrix_animations/breathing_anim.h"
#include "led_matrix_animations/band_anim.h"
#include "led_matrix_animations/band_pinwheel_anim.h"
#include "led_matrix_animations/band_spiral_anim.h"
#include "led_matrix_animations/cycle_left_right_anim.h"
#include "led_matrix_animations/cycle_up_down_anim.h"
#include "led_matrix_animations/cycle_out_in_anim.h"
#include "led_matrix_animations/dual_beacon_anim.h"
#include "led_matrix_animations/solid_reactive_simple_anim.h"
#include "led_matrix_animations/solid_reactive_wide.h"
#include "led_matrix_animations/solid_reactive_cross.h"
#include "led_matrix_animations/solid_reactive_nexus.h"
#include "led_matrix_animations/solid_splash_anim.h"
#include "led_matrix_animations/wave_left_right_anim.h"
#include "led_matrix_animations/wave_up_down_anim.h"
15 changes: 15 additions & 0 deletions quantum/led_matrix_animations/solid_anim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
LED_MATRIX_EFFECT(SOLID)
#ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

bool SOLID(effect_params_t* params) {
LED_MATRIX_USE_LIMITS(led_min, led_max);

uint8_t val = led_matrix_eeconfig.val;
for (uint8_t i = led_min; i < led_max; i++) {
LED_MATRIX_TEST_LED_FLAGS();
led_matrix_set_value(i, val);
}
return led_max < DRIVER_LED_TOTAL;
}

#endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
39 changes: 39 additions & 0 deletions quantum/led_matrix_animations/solid_reactive_cross.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#ifdef LED_MATRIX_KEYREACTIVE_ENABLED
# if !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_CROSS) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTICROSS)

# ifndef DISABLE_LED_MATRIX_SOLID_REACTIVE_CROSS
LED_MATRIX_EFFECT(SOLID_REACTIVE_CROSS)
# endif

# ifndef DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTICROSS
LED_MATRIX_EFFECT(SOLID_REACTIVE_MULTICROSS)
# endif

# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t SOLID_REACTIVE_CROSS_math(uint8_t val, int16_t dx, int16_t dy, uint8_t dist, uint16_t tick) {
uint16_t effect = tick + dist;
dx = dx < 0 ? dx * -1 : dx;
dy = dy < 0 ? dy * -1 : dy;
dx = dx * 16 > 255 ? 255 : dx * 16;
dy = dy * 16 > 255 ? 255 : dy * 16;
effect += dx > dy ? dy : dx;
if (effect > 255) effect = 255;
return qadd8(val, 255 - effect);
}

# ifndef DISABLE_LED_MATRIX_SOLID_REACTIVE_CROSS
bool SOLID_REACTIVE_CROSS(effect_params_t* params) {
return effect_runner_reactive_splash(qsub8(g_last_hit_tracker.count, 1), params, &SOLID_REACTIVE_CROSS_math);
}
# endif

# ifndef DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTICROSS
bool SOLID_REACTIVE_MULTICROSS(effect_params_t* params) {
return effect_runner_reactive_splash(0, params, &SOLID_REACTIVE_CROSS_math);
}
# endif

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
# endif // !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_CROSS) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTICROSS)
#endif // LED_MATRIX_KEYREACTIVE_ENABLED
36 changes: 36 additions & 0 deletions quantum/led_matrix_animations/solid_reactive_nexus.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#ifdef LED_MATRIX_KEYREACTIVE_ENABLED
# if !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_NEXUS) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS)

# ifndef DISABLE_LED_MATRIX_SOLID_REACTIVE_NEXUS
LED_MATRIX_EFFECT(SOLID_REACTIVE_NEXUS)
# endif

# ifndef DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS
LED_MATRIX_EFFECT(SOLID_REACTIVE_MULTINEXUS)
# endif

# ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS

static uint8_t SOLID_REACTIVE_NEXUS_math(uint8_t val, int16_t dx, int16_t dy, uint8_t dist, uint16_t tick) {
uint16_t effect = tick - dist;
if (effect > 255) effect = 255;
if (dist > 72) effect = 255;
if ((dx > 8 || dx < -8) && (dy > 8 || dy < -8)) effect = 255;
return qadd8(val, 255 - effect);
}

# ifndef DISABLE_LED_MATRIX_SOLID_REACTIVE_NEXUS
bool SOLID_REACTIVE_NEXUS(effect_params_t* params) {
return effect_runner_reactive_splash(qsub8(g_last_hit_tracker.count, 1), params, &SOLID_REACTIVE_NEXUS_math);
}
# endif

# ifndef DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS
bool SOLID_REACTIVE_MULTINEXUS(effect_params_t* params) {
return effect_runner_reactive_splash(0, params, &SOLID_REACTIVE_NEXUS_math);
}
# endif

# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
# endif // !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_NEXUS) || !defined(DISABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS)
#endif // LED_MATRIX_KEYREACTIVE_ENABLED
Loading