diff options
author | Ryan <fauxpark@gmail.com> | 2021-04-13 19:51:03 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-13 19:51:03 +1000 |
commit | ce99f98bb5217ede628cfbf7e20924346b4279da (patch) | |
tree | 20079e250b26339964ff3eb9c588d35474cbe8c5 | |
parent | 15f7cc3bde0199afe3b49718fa7b73bc6771e04b (diff) | |
download | qmk_firmware-ce99f98bb5217ede628cfbf7e20924346b4279da.tar.gz qmk_firmware-ce99f98bb5217ede628cfbf7e20924346b4279da.zip |
LED Matrix: suspend code (#12509)
-rw-r--r-- | quantum/led_matrix.c | 57 | ||||
-rw-r--r-- | quantum/led_matrix.h | 7 | ||||
-rw-r--r-- | tmk_core/common/avr/suspend.c | 3 | ||||
-rw-r--r-- | tmk_core/common/chibios/suspend.c | 6 | ||||
-rw-r--r-- | tmk_core/common/keyboard.c | 3 |
5 files changed, 49 insertions, 27 deletions
diff --git a/quantum/led_matrix.c b/quantum/led_matrix.c index e13376455..5258b3acf 100644 --- a/quantum/led_matrix.c +++ b/quantum/led_matrix.c | |||
@@ -27,8 +27,6 @@ | |||
27 | 27 | ||
28 | #include <lib/lib8tion/lib8tion.h> | 28 | #include <lib/lib8tion/lib8tion.h> |
29 | 29 | ||
30 | led_eeconfig_t led_matrix_eeconfig; | ||
31 | |||
32 | #ifndef MAX | 30 | #ifndef MAX |
33 | # define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) | 31 | # define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) |
34 | #endif | 32 | #endif |
@@ -74,7 +72,9 @@ led_eeconfig_t led_matrix_eeconfig; | |||
74 | # define LED_MATRIX_STARTUP_SPD UINT8_MAX / 2 | 72 | # define LED_MATRIX_STARTUP_SPD UINT8_MAX / 2 |
75 | #endif | 73 | #endif |
76 | 74 | ||
77 | bool g_suspend_state = false; | 75 | // globals |
76 | bool g_suspend_state = false; | ||
77 | led_eeconfig_t led_matrix_eeconfig; // TODO: would like to prefix this with g_ for global consistancy, do this in another pr | ||
78 | 78 | ||
79 | // Global tick at 20 Hz | 79 | // Global tick at 20 Hz |
80 | uint32_t g_tick = 0; | 80 | uint32_t g_tick = 0; |
@@ -139,10 +139,10 @@ void led_matrix_set_value_all(uint8_t value) { | |||
139 | #endif | 139 | #endif |
140 | } | 140 | } |
141 | 141 | ||
142 | bool process_led_matrix(uint16_t keycode, keyrecord_t *record) { | 142 | void process_led_matrix(uint8_t row, uint8_t col, bool pressed) { |
143 | if (record->event.pressed) { | 143 | if (pressed) { |
144 | uint8_t led[8]; | 144 | uint8_t led[8]; |
145 | uint8_t led_count = led_matrix_map_row_column_to_led(record->event.key.row, record->event.key.col, led); | 145 | uint8_t led_count = led_matrix_map_row_column_to_led(row, col, led); |
146 | if (led_count > 0) { | 146 | if (led_count > 0) { |
147 | for (uint8_t i = LED_HITS_TO_REMEMBER; i > 1; i--) { | 147 | for (uint8_t i = LED_HITS_TO_REMEMBER; i > 1; i--) { |
148 | g_last_led_hit[i - 1] = g_last_led_hit[i - 2]; | 148 | g_last_led_hit[i - 1] = g_last_led_hit[i - 2]; |
@@ -155,35 +155,24 @@ bool process_led_matrix(uint16_t keycode, keyrecord_t *record) { | |||
155 | } else { | 155 | } else { |
156 | #ifdef LED_MATRIX_KEYRELEASES | 156 | #ifdef LED_MATRIX_KEYRELEASES |
157 | uint8_t led[8]; | 157 | uint8_t led[8]; |
158 | uint8_t led_count = led_matrix_map_row_column_to_led(record->event.key.row, record->event.key.col, led); | 158 | uint8_t led_count = led_matrix_map_row_column_to_led(row, .col, led); |
159 | for (uint8_t i = 0; i < led_count; i++) g_key_hit[led[i]] = 255; | 159 | for (uint8_t i = 0; i < led_count; i++) g_key_hit[led[i]] = 255; |
160 | 160 | ||
161 | g_any_key_hit = 255; | 161 | g_any_key_hit = 255; |
162 | #endif | 162 | #endif |
163 | } | 163 | } |
164 | return true; | ||
165 | } | 164 | } |
166 | 165 | ||
167 | void led_matrix_set_suspend_state(bool state) { | 166 | static void led_matrix_none(void) { led_matrix_set_value_all(0); } |
168 | if (LED_DISABLE_WHEN_USB_SUSPENDED && state) { | ||
169 | led_matrix_set_value_all(0); // turn off all LEDs when suspending | ||
170 | } | ||
171 | g_suspend_state = state; | ||
172 | } | ||
173 | |||
174 | bool led_matrix_get_suspend_state(void) { return g_suspend_state; } | ||
175 | |||
176 | // All LEDs off | ||
177 | void led_matrix_all_off(void) { led_matrix_set_index_value_all(0); } | ||
178 | 167 | ||
179 | // Uniform brightness | 168 | // Uniform brightness |
180 | void led_matrix_uniform_brightness(void) { led_matrix_set_index_value_all(led_matrix_eeconfig.val); } | 169 | void led_matrix_uniform_brightness(void) { led_matrix_set_value_all(led_matrix_eeconfig.val); } |
181 | 170 | ||
182 | void led_matrix_custom(void) {} | 171 | void led_matrix_custom(void) {} |
183 | 172 | ||
184 | void led_matrix_task(void) { | 173 | void led_matrix_task(void) { |
185 | if (!led_matrix_eeconfig.enable) { | 174 | if (!led_matrix_eeconfig.enable) { |
186 | led_matrix_all_off(); | 175 | led_matrix_none(); |
187 | led_matrix_indicators(); | 176 | led_matrix_indicators(); |
188 | return; | 177 | return; |
189 | } | 178 | } |
@@ -203,13 +192,23 @@ void led_matrix_task(void) { | |||
203 | 192 | ||
204 | // Ideally we would also stop sending zeros to the LED driver PWM buffers | 193 | // Ideally we would also stop sending zeros to the LED driver PWM buffers |
205 | // while suspended and just do a software shutdown. This is a cheap hack for now. | 194 | // while suspended and just do a software shutdown. This is a cheap hack for now. |
206 | bool suspend_backlight = ((g_suspend_state && LED_DISABLE_WHEN_USB_SUSPENDED) || (LED_DISABLE_TIMEOUT > 0 && g_any_key_hit > LED_DISABLE_TIMEOUT)); | 195 | bool suspend_backlight = |
207 | uint8_t effect = suspend_backlight ? 0 : led_matrix_eeconfig.mode; | 196 | #if LED_DISABLE_WHEN_USB_SUSPENDED == true |
197 | g_suspend_state || | ||
198 | #endif // LED_DISABLE_WHEN_USB_SUSPENDED == true | ||
199 | #if LED_DISABLE_TIMEOUT > 0 | ||
200 | (g_any_key_hit > (uint32_t)LED_DISABLE_TIMEOUT) || | ||
201 | #endif // LED_DISABLE_TIMEOUT > 0 | ||
202 | false; | ||
203 | |||
204 | uint8_t effect = suspend_backlight || !led_matrix_eeconfig.enable ? 0 : led_matrix_eeconfig.mode; | ||
208 | 205 | ||
209 | // this gets ticked at 20 Hz. | 206 | // this gets ticked at 20 Hz. |
210 | // each effect can opt to do calculations | 207 | // each effect can opt to do calculations |
211 | // and/or request PWM buffer updates. | 208 | // and/or request PWM buffer updates. |
212 | switch (effect) { | 209 | switch (effect) { |
210 | case LED_MATRIX_NONE: | ||
211 | led_matrix_none(); | ||
213 | case LED_MATRIX_UNIFORM_BRIGHTNESS: | 212 | case LED_MATRIX_UNIFORM_BRIGHTNESS: |
214 | led_matrix_uniform_brightness(); | 213 | led_matrix_uniform_brightness(); |
215 | break; | 214 | break; |
@@ -218,7 +217,7 @@ void led_matrix_task(void) { | |||
218 | break; | 217 | break; |
219 | } | 218 | } |
220 | 219 | ||
221 | if (!suspend_backlight) { | 220 | if (effect) { |
222 | led_matrix_indicators(); | 221 | led_matrix_indicators(); |
223 | } | 222 | } |
224 | 223 | ||
@@ -257,10 +256,18 @@ void led_matrix_init(void) { | |||
257 | dprintf("led_matrix_init_drivers led_matrix_eeconfig.mode = 0. Write default values to EEPROM.\n"); | 256 | dprintf("led_matrix_init_drivers led_matrix_eeconfig.mode = 0. Write default values to EEPROM.\n"); |
258 | eeconfig_update_led_matrix_default(); | 257 | eeconfig_update_led_matrix_default(); |
259 | } | 258 | } |
260 | |||
261 | eeconfig_debug_led_matrix(); // display current eeprom values | 259 | eeconfig_debug_led_matrix(); // display current eeprom values |
262 | } | 260 | } |
263 | 261 | ||
262 | void led_matrix_set_suspend_state(bool state) { | ||
263 | if (LED_DISABLE_WHEN_USB_SUSPENDED && state) { | ||
264 | led_matrix_set_value_all(0); // turn off all LEDs when suspending | ||
265 | } | ||
266 | g_suspend_state = state; | ||
267 | } | ||
268 | |||
269 | bool led_matrix_get_suspend_state(void) { return g_suspend_state; } | ||
270 | |||
264 | void led_matrix_toggle_eeprom_helper(bool write_to_eeprom) { | 271 | void led_matrix_toggle_eeprom_helper(bool write_to_eeprom) { |
265 | led_matrix_eeconfig.enable ^= 1; | 272 | led_matrix_eeconfig.enable ^= 1; |
266 | if (write_to_eeprom) { | 273 | if (write_to_eeprom) { |
diff --git a/quantum/led_matrix.h b/quantum/led_matrix.h index ba8f0279a..48c9483b2 100644 --- a/quantum/led_matrix.h +++ b/quantum/led_matrix.h | |||
@@ -48,8 +48,11 @@ | |||
48 | #endif | 48 | #endif |
49 | 49 | ||
50 | enum led_matrix_effects { | 50 | enum led_matrix_effects { |
51 | LED_MATRIX_UNIFORM_BRIGHTNESS = 1, | 51 | LED_MATRIX_NONE = 0, |
52 | |||
53 | LED_MATRIX_UNIFORM_BRIGHTNESS, | ||
52 | // All new effects go above this line | 54 | // All new effects go above this line |
55 | |||
53 | LED_MATRIX_EFFECT_MAX | 56 | LED_MATRIX_EFFECT_MAX |
54 | }; | 57 | }; |
55 | 58 | ||
@@ -63,7 +66,7 @@ uint8_t led_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *l | |||
63 | void led_matrix_set_value(int index, uint8_t value); | 66 | void led_matrix_set_value(int index, uint8_t value); |
64 | void led_matrix_set_value_all(uint8_t value); | 67 | void led_matrix_set_value_all(uint8_t value); |
65 | 68 | ||
66 | bool process_led_matrix(uint16_t keycode, keyrecord_t *record); | 69 | void process_led_matrix(uint8_t row, uint8_t col, bool pressed); |
67 | 70 | ||
68 | void led_matrix_task(void); | 71 | void led_matrix_task(void); |
69 | 72 | ||
diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index d52c8ac41..96b19a77f 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c | |||
@@ -28,6 +28,9 @@ | |||
28 | # include "rgblight.h" | 28 | # include "rgblight.h" |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | #ifdef LED_MATRIX_ENABLE | ||
32 | # include "led_matrix.h" | ||
33 | #endif | ||
31 | #ifdef RGB_MATRIX_ENABLE | 34 | #ifdef RGB_MATRIX_ENABLE |
32 | # include "rgb_matrix.h" | 35 | # include "rgb_matrix.h" |
33 | #endif | 36 | #endif |
diff --git a/tmk_core/common/chibios/suspend.c b/tmk_core/common/chibios/suspend.c index 17f024cab..b3949185e 100644 --- a/tmk_core/common/chibios/suspend.c +++ b/tmk_core/common/chibios/suspend.c | |||
@@ -24,6 +24,9 @@ | |||
24 | # include "rgblight.h" | 24 | # include "rgblight.h" |
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | #ifdef LED_MATRIX_ENABLE | ||
28 | # include "led_matrix.h" | ||
29 | #endif | ||
27 | #ifdef RGB_MATRIX_ENABLE | 30 | #ifdef RGB_MATRIX_ENABLE |
28 | # include "rgb_matrix.h" | 31 | # include "rgb_matrix.h" |
29 | #endif | 32 | #endif |
@@ -57,6 +60,9 @@ void suspend_power_down(void) { | |||
57 | backlight_set(0); | 60 | backlight_set(0); |
58 | #endif | 61 | #endif |
59 | 62 | ||
63 | #ifdef LED_MATRIX_ENABLE | ||
64 | led_matrix_task(); | ||
65 | #endif | ||
60 | #ifdef RGB_MATRIX_ENABLE | 66 | #ifdef RGB_MATRIX_ENABLE |
61 | rgb_matrix_task(); | 67 | rgb_matrix_task(); |
62 | #endif | 68 | #endif |
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index e473806b2..132affe7a 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c | |||
@@ -330,6 +330,9 @@ void keyboard_init(void) { | |||
330 | * This is differnet than keycode events as no layer processing, or filtering occurs. | 330 | * This is differnet than keycode events as no layer processing, or filtering occurs. |
331 | */ | 331 | */ |
332 | void switch_events(uint8_t row, uint8_t col, bool pressed) { | 332 | void switch_events(uint8_t row, uint8_t col, bool pressed) { |
333 | #if defined(LED_MATRIX_ENABLE) | ||
334 | process_led_matrix(row, col, pressed); | ||
335 | #endif | ||
333 | #if defined(RGB_MATRIX_ENABLE) | 336 | #if defined(RGB_MATRIX_ENABLE) |
334 | process_rgb_matrix(row, col, pressed); | 337 | process_rgb_matrix(row, col, pressed); |
335 | #endif | 338 | #endif |