aboutsummaryrefslogtreecommitdiff
path: root/quantum/rgb_matrix.c
diff options
context:
space:
mode:
authorJames Young <18669334+noroadsleft@users.noreply.github.com>2020-05-30 13:14:59 -0700
committerGitHub <noreply@github.com>2020-05-30 13:14:59 -0700
commitfced377ac007d27f2650ccffbe0b18abcdcfe23d (patch)
treebd5b141987394a5a16cfc416bfe2b9efdb14d067 /quantum/rgb_matrix.c
parent7b8a013826ad90714a05ea522de53adf964ab3b9 (diff)
downloadqmk_firmware-fced377ac007d27f2650ccffbe0b18abcdcfe23d.tar.gz
qmk_firmware-fced377ac007d27f2650ccffbe0b18abcdcfe23d.zip
2020 May 30 Breaking Changes Update (#9215)
* Branch point for 2020 May 30 Breaking Change * Migrate `ACTION_LAYER_TOGGLE` to `TG()` (#8954) * Migrate `ACTION_MODS_ONESHOT` to `OSM()` (#8957) * Migrate `ACTION_DEFAULT_LAYER_SET` to `DF()` (#8958) * Migrate `ACTION_LAYER_MODS` to `LM()` (#8959) * Migrate `ACTION_MODS_TAP_KEY` to `MT()` (#8968) * Convert V-USB usbdrv to a submodule (#8321) * Unify Tap Hold functions and documentation (#8348) * Changing board names to prevent confusion (#8412) * Move the Keyboardio Model01 to a keyboardio/ subdir (#8499) * Move spaceman keyboards (#8830) * Migrate miscellaneous `fn_actions` entries (#8977) * Migrate `ACTION_MODS_KEY` to chained mod keycodes (#8979) * Organizing my keyboards (plaid, tartan, ergoinu) (#8537) * Refactor Lily58 to use split_common (#6260) * Refactor zinc to use split_common (#7114) * Add a message if bin/qmk doesn't work (#9000) * Fix conflicting types for 'tfp_printf' (#8269) * Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup (#6480) * Refactor and updates to TKC1800 code (#8472) * Switch to qmk forks for everything (#9019) * audio refactor: replace deprecated PLAY_NOTE_ARRAY (#8484) * Audio enable corrections (2/3) (#8903) * Split HHKB to ANSI and JP layouts and Add VIA support for each (#8582) * Audio enable corrections (Part 4) (#8974) * Fix typo from PR7114 (#9171) * Augment future branch Changelogs (#8978) * Revert "Branch point for 2020 May 30 Breaking Change"
Diffstat (limited to 'quantum/rgb_matrix.c')
-rw-r--r--quantum/rgb_matrix.c106
1 files changed, 63 insertions, 43 deletions
diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c
index 91032b656..f3da0ab0f 100644
--- a/quantum/rgb_matrix.c
+++ b/quantum/rgb_matrix.c
@@ -57,8 +57,12 @@ const point_t k_rgb_matrix_center = RGB_MATRIX_CENTER;
57// -----End rgb effect includes macros------- 57// -----End rgb effect includes macros-------
58// ------------------------------------------ 58// ------------------------------------------
59 59
60#ifndef RGB_DISABLE_AFTER_TIMEOUT 60#if defined(RGB_DISABLE_AFTER_TIMEOUT) && !defined(RGB_DISABLE_TIMEOUT)
61# define RGB_DISABLE_AFTER_TIMEOUT 0 61# define RGB_DISABLE_TIMEOUT (RGB_DISABLE_AFTER_TIMEOUT * 1200)
62#endif
63
64#ifndef RGB_DISABLE_TIMEOUT
65# define RGB_DISABLE_TIMEOUT 0
62#endif 66#endif
63 67
64#ifndef RGB_DISABLE_WHEN_USB_SUSPENDED 68#ifndef RGB_DISABLE_WHEN_USB_SUSPENDED
@@ -111,19 +115,29 @@ const point_t k_rgb_matrix_center = RGB_MATRIX_CENTER;
111# define RGB_MATRIX_STARTUP_SPD UINT8_MAX / 2 115# define RGB_MATRIX_STARTUP_SPD UINT8_MAX / 2
112#endif 116#endif
113 117
114bool g_suspend_state = false; 118// globals
115 119bool g_suspend_state = false;
116rgb_config_t rgb_matrix_config; 120rgb_config_t rgb_matrix_config; // TODO: would like to prefix this with g_ for global consistancy, do this in another pr
117 121uint32_t g_rgb_timer;
118rgb_counters_t g_rgb_counters;
119static uint32_t rgb_counters_buffer;
120
121#ifdef RGB_MATRIX_FRAMEBUFFER_EFFECTS 122#ifdef RGB_MATRIX_FRAMEBUFFER_EFFECTS
122uint8_t rgb_frame_buffer[MATRIX_ROWS][MATRIX_COLS] = {{0}}; 123uint8_t g_rgb_frame_buffer[MATRIX_ROWS][MATRIX_COLS] = {{0}};
123#endif 124#endif // RGB_MATRIX_FRAMEBUFFER_EFFECTS
125#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
126last_hit_t g_last_hit_tracker;
127#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
124 128
129// internals
130static uint8_t rgb_last_enable = UINT8_MAX;
131static uint8_t rgb_last_effect = UINT8_MAX;
132static effect_params_t rgb_effect_params = {0, 0xFF};
133static rgb_task_states rgb_task_state = SYNCING;
134#if RGB_DISABLE_TIMEOUT > 0
135static uint32_t rgb_anykey_timer;
136#endif // RGB_DISABLE_TIMEOUT > 0
137
138// double buffers
139static uint32_t rgb_timer_buffer;
125#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED 140#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
126last_hit_t g_last_hit_tracker;
127static last_hit_t last_hit_buffer; 141static last_hit_t last_hit_buffer;
128#endif // RGB_MATRIX_KEYREACTIVE_ENABLED 142#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
129 143
@@ -169,21 +183,24 @@ void rgb_matrix_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
169void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { rgb_matrix_driver.set_color_all(red, green, blue); } 183void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { rgb_matrix_driver.set_color_all(red, green, blue); }
170 184
171bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record) { 185bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record) {
186#if RGB_DISABLE_TIMEOUT > 0
187 if (record->event.pressed) {
188 rgb_anykey_timer = 0;
189 }
190#endif // RGB_DISABLE_TIMEOUT > 0
191
172#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED 192#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
173 uint8_t led[LED_HITS_TO_REMEMBER]; 193 uint8_t led[LED_HITS_TO_REMEMBER];
174 uint8_t led_count = 0; 194 uint8_t led_count = 0;
175 195
176# if defined(RGB_MATRIX_KEYRELEASES) 196# if defined(RGB_MATRIX_KEYRELEASES)
177 if (!record->event.pressed) { 197 if (!record->event.pressed)
178 led_count = rgb_matrix_map_row_column_to_led(record->event.key.row, record->event.key.col, led);
179 g_rgb_counters.any_key_hit = 0;
180 }
181# elif defined(RGB_MATRIX_KEYPRESSES) 198# elif defined(RGB_MATRIX_KEYPRESSES)
182 if (record->event.pressed) { 199 if (record->event.pressed)
183 led_count = rgb_matrix_map_row_column_to_led(record->event.key.row, record->event.key.col, led);
184 g_rgb_counters.any_key_hit = 0;
185 }
186# endif // defined(RGB_MATRIX_KEYRELEASES) 200# endif // defined(RGB_MATRIX_KEYRELEASES)
201 {
202 led_count = rgb_matrix_map_row_column_to_led(record->event.key.row, record->event.key.col, led);
203 }
187 204
188 if (last_hit_buffer.count + led_count > LED_HITS_TO_REMEMBER) { 205 if (last_hit_buffer.count + led_count > LED_HITS_TO_REMEMBER) {
189 memcpy(&last_hit_buffer.x[0], &last_hit_buffer.x[led_count], LED_HITS_TO_REMEMBER - led_count); 206 memcpy(&last_hit_buffer.x[0], &last_hit_buffer.x[led_count], LED_HITS_TO_REMEMBER - led_count);
@@ -216,7 +233,7 @@ void rgb_matrix_test(void) {
216 // Mask out bits 4 and 5 233 // Mask out bits 4 and 5
217 // Increase the factor to make the test animation slower (and reduce to make it faster) 234 // Increase the factor to make the test animation slower (and reduce to make it faster)
218 uint8_t factor = 10; 235 uint8_t factor = 10;
219 switch ((g_rgb_counters.tick & (0b11 << factor)) >> factor) { 236 switch ((g_rgb_timer & (0b11 << factor)) >> factor) {
220 case 0: { 237 case 0: {
221 rgb_matrix_set_color_all(20, 0, 0); 238 rgb_matrix_set_color_all(20, 0, 0);
222 break; 239 break;
@@ -241,29 +258,26 @@ static bool rgb_matrix_none(effect_params_t *params) {
241 return false; 258 return false;
242 } 259 }
243 260
244 RGB_MATRIX_USE_LIMITS(led_min, led_max); 261 rgb_matrix_set_color_all(0, 0, 0);
245 for (uint8_t i = led_min; i < led_max; i++) { 262 return false;
246 rgb_matrix_set_color(i, 0, 0, 0);
247 }
248 return led_max < DRIVER_LED_TOTAL;
249} 263}
250 264
251static uint8_t rgb_last_enable = UINT8_MAX;
252static uint8_t rgb_last_effect = UINT8_MAX;
253static effect_params_t rgb_effect_params = {0, 0xFF};
254static rgb_task_states rgb_task_state = SYNCING;
255
256static void rgb_task_timers(void) { 265static void rgb_task_timers(void) {
266#if defined(RGB_MATRIX_KEYREACTIVE_ENABLED) || RGB_DISABLE_TIMEOUT > 0
267 uint32_t deltaTime = timer_elapsed32(rgb_timer_buffer);
268#endif // defined(RGB_MATRIX_KEYREACTIVE_ENABLED) || RGB_DISABLE_TIMEOUT > 0
269 rgb_timer_buffer = timer_read32();
270
257 // Update double buffer timers 271 // Update double buffer timers
258 uint16_t deltaTime = timer_elapsed32(rgb_counters_buffer); 272#if RGB_DISABLE_TIMEOUT > 0
259 rgb_counters_buffer = timer_read32(); 273 if (rgb_anykey_timer < UINT32_MAX) {
260 if (g_rgb_counters.any_key_hit < UINT32_MAX) { 274 if (UINT32_MAX - deltaTime < rgb_anykey_timer) {
261 if (UINT32_MAX - deltaTime < g_rgb_counters.any_key_hit) { 275 rgb_anykey_timer = UINT32_MAX;
262 g_rgb_counters.any_key_hit = UINT32_MAX;
263 } else { 276 } else {
264 g_rgb_counters.any_key_hit += deltaTime; 277 rgb_anykey_timer += deltaTime;
265 } 278 }
266 } 279 }
280#endif // RGB_DISABLE_TIMEOUT > 0
267 281
268 // Update double buffer last hit timers 282 // Update double buffer last hit timers
269#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED 283#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
@@ -280,7 +294,7 @@ static void rgb_task_timers(void) {
280 294
281static void rgb_task_sync(void) { 295static void rgb_task_sync(void) {
282 // next task 296 // next task
283 if (timer_elapsed32(g_rgb_counters.tick) >= RGB_MATRIX_LED_FLUSH_LIMIT) rgb_task_state = STARTING; 297 if (timer_elapsed32(g_rgb_timer) >= RGB_MATRIX_LED_FLUSH_LIMIT) rgb_task_state = STARTING;
284} 298}
285 299
286static void rgb_task_start(void) { 300static void rgb_task_start(void) {
@@ -288,7 +302,7 @@ static void rgb_task_start(void) {
288 rgb_effect_params.iter = 0; 302 rgb_effect_params.iter = 0;
289 303
290 // update double buffers 304 // update double buffers
291 g_rgb_counters.tick = rgb_counters_buffer; 305 g_rgb_timer = rgb_timer_buffer;
292#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED 306#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
293 g_last_hit_tracker = last_hit_buffer; 307 g_last_hit_tracker = last_hit_buffer;
294#endif // RGB_MATRIX_KEYREACTIVE_ENABLED 308#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
@@ -370,8 +384,16 @@ void rgb_matrix_task(void) {
370 384
371 // Ideally we would also stop sending zeros to the LED driver PWM buffers 385 // Ideally we would also stop sending zeros to the LED driver PWM buffers
372 // while suspended and just do a software shutdown. This is a cheap hack for now. 386 // while suspended and just do a software shutdown. This is a cheap hack for now.
373 bool suspend_backlight = ((g_suspend_state && RGB_DISABLE_WHEN_USB_SUSPENDED) || (RGB_DISABLE_AFTER_TIMEOUT > 0 && g_rgb_counters.any_key_hit > RGB_DISABLE_AFTER_TIMEOUT * 60 * 20)); 387 bool suspend_backlight =
374 uint8_t effect = suspend_backlight || !rgb_matrix_config.enable ? 0 : rgb_matrix_config.mode; 388#if RGB_DISABLE_WHEN_USB_SUSPENDED == true
389 g_suspend_state ||
390#endif // RGB_DISABLE_WHEN_USB_SUSPENDED == true
391#if RGB_DISABLE_TIMEOUT > 0
392 (rgb_anykey_timer > (uint32_t)RGB_DISABLE_TIMEOUT) ||
393#endif // RGB_DISABLE_TIMEOUT > 0
394 false;
395
396 uint8_t effect = suspend_backlight || !rgb_matrix_config.enable ? 0 : rgb_matrix_config.mode;
375 397
376 switch (rgb_task_state) { 398 switch (rgb_task_state) {
377 case STARTING: 399 case STARTING:
@@ -405,8 +427,6 @@ __attribute__((weak)) void rgb_matrix_indicators_user(void) {}
405void rgb_matrix_init(void) { 427void rgb_matrix_init(void) {
406 rgb_matrix_driver.init(); 428 rgb_matrix_driver.init();
407 429
408 // TODO: put the 1 second startup delay here?
409
410#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED 430#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
411 g_last_hit_tracker.count = 0; 431 g_last_hit_tracker.count = 0;
412 for (uint8_t i = 0; i < LED_HITS_TO_REMEMBER; ++i) { 432 for (uint8_t i = 0; i < LED_HITS_TO_REMEMBER; ++i) {