110 lines
2.6 KiB
C
110 lines
2.6 KiB
C
|
#ifdef RGB_MATRIX_DATAPOINTER_ENABLED
|
||
|
#ifndef DISABLE_RGB_MATRIX_FFT_ANIM
|
||
|
RGB_MATRIX_EFFECT(FFT_ANIM)
|
||
|
|
||
|
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||
|
|
||
|
// Maps fft columns to leds.
|
||
|
// fft_col_to_array[i] returns an array of leds in the ith bin of the fft.
|
||
|
// Negative indices are "invisible" leds.
|
||
|
// Use them when your keyboard has gaps.
|
||
|
//
|
||
|
// This layout is for the Ergodox EZ.
|
||
|
static int8_t fft_col_to_array[10][5] = {
|
||
|
{ 47, 43, 38, 33, 28 },
|
||
|
{ 46, 42, 37, 32, 27 },
|
||
|
{ 45, 41, 36, 31, 26 },
|
||
|
{ 44, 40, 35, 30, 25 },
|
||
|
{ -1, 39, 34, 29, 24 },
|
||
|
{ -1, 15, 10, 5, 0 },
|
||
|
{ 20, 16, 11, 6, 1 },
|
||
|
{ 21, 17, 12, 7, 2 },
|
||
|
{ 22, 18, 13, 8, 3 },
|
||
|
{ 23, 19, 14, 9, 4 }
|
||
|
};
|
||
|
|
||
|
|
||
|
// TODO:
|
||
|
// Dynamic color settings
|
||
|
bool FFT_ANIM(effect_params_t* params) {
|
||
|
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
||
|
|
||
|
// REQUIRED for any animation that uses this pointer.
|
||
|
// Clears any previous data.
|
||
|
if (params->init) {
|
||
|
rgb_matrix_anim_data = NULL;
|
||
|
return led_max < DRIVER_LED_TOTAL;
|
||
|
};
|
||
|
|
||
|
if (rgb_matrix_anim_data == NULL) {
|
||
|
// If animation data is empty, turn off all leds and exit.
|
||
|
for (uint8_t i = led_min; i < led_max; i++) {
|
||
|
rgb_matrix_set_color(
|
||
|
i,
|
||
|
0x00, 0x00, 0x00
|
||
|
);
|
||
|
}
|
||
|
} else {
|
||
|
|
||
|
// Data should be a pointer to 10 uint8_ts, each representing
|
||
|
// the height of a bar on the display.
|
||
|
uint8_t* data = (uint8_t*) rgb_matrix_anim_data;
|
||
|
|
||
|
for (uint8_t bin = 0; bin < 10; bin++) {
|
||
|
// Scale data values
|
||
|
uint8_t d = data[bin];
|
||
|
uint8_t bin_height = d / 50;
|
||
|
// Brightness of topmost key
|
||
|
uint8_t last_brightness = ((d % 50)/50.0) * 0xFF;
|
||
|
|
||
|
|
||
|
// Turn off leds that should be off.
|
||
|
// There are 5 keys in each column.
|
||
|
for (uint8_t i = bin_height; i < 6; i++) {
|
||
|
// Ignore negative indices.
|
||
|
// See fft_col_to_array definition.
|
||
|
if (fft_col_to_array[bin][i] < 0) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
rgb_matrix_set_color(
|
||
|
fft_col_to_array[bin][i],
|
||
|
0x00, 0x00, 0x00
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Turn on leds that should be on.
|
||
|
for (uint8_t i = 0; i < bin_height; i++) {
|
||
|
// Ignore negative indices.
|
||
|
// See fft_col_to_array definition.
|
||
|
if (fft_col_to_array[bin][i] < 0) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// If this is the topmost lit key, its
|
||
|
// brightness depends on the height of the bar.
|
||
|
if (i == bin_height - 1) {
|
||
|
rgb_matrix_set_color(
|
||
|
fft_col_to_array[bin][i],
|
||
|
last_brightness, 0x00, last_brightness
|
||
|
);
|
||
|
|
||
|
// If this isn't the topmost key,
|
||
|
// it has a plain full-brightness color.
|
||
|
} else {
|
||
|
rgb_matrix_set_color(
|
||
|
fft_col_to_array[bin][i],
|
||
|
0x00, 0x00, 0xFF
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return led_max < DRIVER_LED_TOTAL;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
#endif
|
||
|
#endif
|