X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=quantum%2Fled_matrix.c;h=8ef8abe712b99cba2a45027451c24f9d73fca53b;hb=6af77551c67c846b06c596cbd367d66c755f8051;hp=9a0aa6acd940b395b03cfa03d29016b4de5b8978;hpb=fd698c43d78ebbc42c1eb2bec74078b791616ad1;p=qmk_firmware.git diff --git a/quantum/led_matrix.c b/quantum/led_matrix.c index 9a0aa6acd..8ef8abe71 100644 --- a/quantum/led_matrix.c +++ b/quantum/led_matrix.c @@ -20,7 +20,7 @@ #include #include #include "quantum.h" -#include "led_matrix.h" +#include "ledmatrix.h" #include "progmem.h" #include "config.h" #include "eeprom.h" @@ -59,7 +59,7 @@ bool g_suspend_state = false; uint32_t g_tick = 0; // Ticks since this key was last hit. -uint8_t g_key_hit[DRIVER_LED_TOTAL]; +uint8_t g_key_hit[LED_DRIVER_LED_COUNT]; // Ticks since any key was last hit. uint32_t g_any_key_hit = 0; @@ -67,9 +67,11 @@ uint32_t g_any_key_hit = 0; uint32_t eeconfig_read_led_matrix(void) { return eeprom_read_dword(EECONFIG_LED_MATRIX); } + void eeconfig_update_led_matrix(uint32_t config_value) { eeprom_update_dword(EECONFIG_LED_MATRIX, config_value); } + void eeconfig_update_led_matrix_default(void) { dprintf("eeconfig_update_led_matrix_default\n"); led_matrix_config.enable = 1; @@ -78,8 +80,9 @@ void eeconfig_update_led_matrix_default(void) { led_matrix_config.speed = 0; eeconfig_update_led_matrix(led_matrix_config.raw); } + void eeconfig_debug_led_matrix(void) { - dprintf("led_matrix_config eprom\n"); + dprintf("led_matrix_config eeprom\n"); dprintf("led_matrix_config.enable = %d\n", led_matrix_config.enable); dprintf("led_matrix_config.mode = %d\n", led_matrix_config.mode); dprintf("led_matrix_config.val = %d\n", led_matrix_config.val); @@ -87,7 +90,9 @@ void eeconfig_debug_led_matrix(void) { } // Last led hit -#define LED_HITS_TO_REMEMBER 8 +#ifndef LED_HITS_TO_REMEMBER + #define LED_HITS_TO_REMEMBER 8 +#endif uint8_t g_last_led_hit[LED_HITS_TO_REMEMBER] = {255}; uint8_t g_last_led_count = 0; @@ -95,7 +100,7 @@ void map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *led_i, uint8_t led_matrix led; *led_count = 0; - for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { + for (uint8_t i = 0; i < LED_DRIVER_LED_COUNT; i++) { // map_index_to_led(i, &led); led = g_leds[i]; if (row == led.matrix_co.row && column == led.matrix_co.col) { @@ -155,29 +160,15 @@ void led_matrix_all_off(void) { // Uniform brightness void led_matrix_uniform_brightness(void) { - led_matrix_set_index_value_all(led_matrix_config.val); + led_matrix_set_index_value_all(LED_MATRIX_MAXIMUM_BRIGHTNESS / BACKLIGHT_LEVELS * led_matrix_config.val); } void led_matrix_custom(void) {} void led_matrix_task(void) { - #ifdef TRACK_PREVIOUS_EFFECT - static uint8_t toggle_enable_last = 255; - #endif - if (!led_matrix_config.enable) { - led_matrix_all_off(); - led_matrix_indicators(); - #ifdef TRACK_PREVIOUS_EFFECT - toggle_enable_last = led_matrix_config.enable; - #endif - return; - } - - // delay 1 second before driving LEDs or doing anything else - // FIXME: Can't we use wait_ms() here? - static uint8_t startup_tick = 0; - if (startup_tick < 20) { - startup_tick++; + if (!led_matrix_config.enable) { + led_matrix_all_off(); + led_matrix_indicators(); return; } @@ -187,7 +178,7 @@ void led_matrix_task(void) { g_any_key_hit++; } - for (int led = 0; led < DRIVER_LED_TOTAL; led++) { + for (int led = 0; led < LED_DRIVER_LED_COUNT; led++) { if (g_key_hit[led] < 255) { if (g_key_hit[led] == 254) g_last_led_count = MAX(g_last_led_count - 1, 0); @@ -195,29 +186,12 @@ void led_matrix_task(void) { } } - // Factory default magic value - if (led_matrix_config.mode == 255) { - led_matrix_uniform_brightness(); - return; - } - // Ideally we would also stop sending zeros to the LED driver PWM buffers // while suspended and just do a software shutdown. This is a cheap hack for now. bool suspend_backlight = ((g_suspend_state && LED_DISABLE_WHEN_USB_SUSPENDED) || (LED_DISABLE_AFTER_TIMEOUT > 0 && g_any_key_hit > LED_DISABLE_AFTER_TIMEOUT * 60 * 20)); uint8_t effect = suspend_backlight ? 0 : led_matrix_config.mode; - #ifdef TRACK_PREVIOUS_EFFECT - // Keep track of the effect used last time, - // detect change in effect, so each effect can - // have an optional initialization. - - static uint8_t effect_last = 255; - bool initialize = (effect != effect_last) || (led_matrix_config.enable != toggle_enable_last); - effect_last = effect; - toggle_enable_last = led_matrix_config.enable; - #endif - // this gets ticked at 20 Hz. // each effect can opt to do calculations // and/or request PWM buffer updates. @@ -230,10 +204,12 @@ void led_matrix_task(void) { break; } - if (! suspend_backlight) { + if (!suspend_backlight) { led_matrix_indicators(); } + // Tell the LED driver to update its state + led_matrix_driver.flush(); } void led_matrix_indicators(void) { @@ -266,41 +242,44 @@ void led_matrix_indicators_user(void) {} // } void led_matrix_init(void) { - led_matrix_driver.init(); + led_matrix_driver.init(); - // TODO: put the 1 second startup delay here? + // Wait half a second for the driver to finish initializing + wait_ms(500); - // clear the key hits - for (int led=0; led= LED_MATRIX_EFFECT_MAX) + if (led_matrix_config.mode >= LED_MATRIX_EFFECT_MAX) { led_matrix_config.mode = 1; + } eeconfig_update_led_matrix(led_matrix_config.raw); } void led_matrix_step_reverse(void) { led_matrix_config.mode--; - if (led_matrix_config.mode < 1) + if (led_matrix_config.mode < 1) { led_matrix_config.mode = LED_MATRIX_EFFECT_MAX - 1; + } eeconfig_update_led_matrix(led_matrix_config.raw); } @@ -396,9 +377,15 @@ uint8_t led_matrix_get_mode(void) { return led_matrix_config.mode; } -void led_matrix_set_value(uint8_t val, bool eeprom_write) { +void led_matrix_set_value_noeeprom(uint8_t val) { led_matrix_config.val = val; - if (eeprom_write) { - eeconfig_update_led_matrix(led_matrix_config.raw); - } +} + +void led_matrix_set_value(uint8_t val) { + led_matrix_set_value_noeeprom(val); + eeconfig_update_led_matrix(led_matrix_config.raw); +} + +void backlight_set(uint8_t val) { + led_matrix_set_value(val); }