diff options
-rw-r--r-- | quantum/visualizer/visualizer.c | 58 | ||||
-rw-r--r-- | quantum/visualizer/visualizer.h | 9 | ||||
-rw-r--r-- | tmk_core/common/keyboard.c | 2 |
3 files changed, 66 insertions, 3 deletions
diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 54f6faaa4..5826d909e 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c | |||
@@ -53,10 +53,13 @@ SOFTWARE. | |||
53 | #define "Visualizer thread priority not defined" | 53 | #define "Visualizer thread priority not defined" |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | // mods status | ||
57 | #include "action_util.h" | ||
56 | 58 | ||
57 | static visualizer_keyboard_status_t current_status = { | 59 | static visualizer_keyboard_status_t current_status = { |
58 | .layer = 0xFFFFFFFF, | 60 | .layer = 0xFFFFFFFF, |
59 | .default_layer = 0xFFFFFFFF, | 61 | .default_layer = 0xFFFFFFFF, |
62 | .mods = 0xFF, | ||
60 | .leds = 0xFFFFFFFF, | 63 | .leds = 0xFFFFFFFF, |
61 | .suspended = false, | 64 | .suspended = false, |
62 | }; | 65 | }; |
@@ -64,6 +67,7 @@ static visualizer_keyboard_status_t current_status = { | |||
64 | static bool same_status(visualizer_keyboard_status_t* status1, visualizer_keyboard_status_t* status2) { | 67 | static bool same_status(visualizer_keyboard_status_t* status1, visualizer_keyboard_status_t* status2) { |
65 | return status1->layer == status2->layer && | 68 | return status1->layer == status2->layer && |
66 | status1->default_layer == status2->default_layer && | 69 | status1->default_layer == status2->default_layer && |
70 | status1->mods == status2->mods && | ||
67 | status1->leds == status2->leds && | 71 | status1->leds == status2->leds && |
68 | status1->suspended == status2->suspended; | 72 | status1->suspended == status2->suspended; |
69 | } | 73 | } |
@@ -307,6 +311,45 @@ bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_s | |||
307 | gdispFlush(); | 311 | gdispFlush(); |
308 | return false; | 312 | return false; |
309 | } | 313 | } |
314 | |||
315 | static void format_mods_bitmap_string(uint8_t mods, char* buffer) { | ||
316 | *buffer = ' '; | ||
317 | ++buffer; | ||
318 | |||
319 | for (int i = 0; i<8; i++) | ||
320 | { | ||
321 | uint32_t mask = (1u << i); | ||
322 | if (mods & mask) { | ||
323 | *buffer = '1'; | ||
324 | } else { | ||
325 | *buffer = '0'; | ||
326 | } | ||
327 | ++buffer; | ||
328 | |||
329 | if (i==3) { | ||
330 | *buffer = ' '; | ||
331 | ++buffer; | ||
332 | } | ||
333 | } | ||
334 | *buffer = 0; | ||
335 | } | ||
336 | |||
337 | bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) { | ||
338 | (void)animation; | ||
339 | |||
340 | const char* title = "Modifier states"; | ||
341 | const char* mods_header = " CSAG CSAG "; | ||
342 | char status_buffer[12]; | ||
343 | |||
344 | gdispClear(White); | ||
345 | gdispDrawString(0, 0, title, state->font_fixed5x8, Black); | ||
346 | gdispDrawString(0, 10, mods_header, state->font_fixed5x8, Black); | ||
347 | format_mods_bitmap_string(state->status.mods, status_buffer); | ||
348 | gdispDrawString(0, 20, status_buffer, state->font_fixed5x8, Black); | ||
349 | |||
350 | gdispFlush(); | ||
351 | return false; | ||
352 | } | ||
310 | #endif // LCD_ENABLE | 353 | #endif // LCD_ENABLE |
311 | 354 | ||
312 | bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { | 355 | bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { |
@@ -350,6 +393,7 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { | |||
350 | visualizer_keyboard_status_t initial_status = { | 393 | visualizer_keyboard_status_t initial_status = { |
351 | .default_layer = 0xFFFFFFFF, | 394 | .default_layer = 0xFFFFFFFF, |
352 | .layer = 0xFFFFFFFF, | 395 | .layer = 0xFFFFFFFF, |
396 | .mods = 0xFF, | ||
353 | .leds = 0xFFFFFFFF, | 397 | .leds = 0xFFFFFFFF, |
354 | .suspended = false, | 398 | .suspended = false, |
355 | }; | 399 | }; |
@@ -499,7 +543,18 @@ void update_status(bool changed) { | |||
499 | #endif | 543 | #endif |
500 | } | 544 | } |
501 | 545 | ||
502 | void visualizer_update(uint32_t default_state, uint32_t state, uint32_t leds) { | 546 | uint8_t visualizer_get_mods() { |
547 | uint8_t mods = get_mods(); | ||
548 | |||
549 | #ifndef NO_ACTION_ONESHOT | ||
550 | if (!has_oneshot_mods_timed_out()) { | ||
551 | mods |= get_oneshot_mods(); | ||
552 | } | ||
553 | #endif | ||
554 | return mods; | ||
555 | } | ||
556 | |||
557 | void visualizer_update(uint32_t default_state, uint32_t state, uint8_t mods, uint32_t leds) { | ||
503 | // Note that there's a small race condition here, the thread could read | 558 | // Note that there's a small race condition here, the thread could read |
504 | // a state where one of these are set but not the other. But this should | 559 | // a state where one of these are set but not the other. But this should |
505 | // not really matter as it will be fixed during the next loop step. | 560 | // not really matter as it will be fixed during the next loop step. |
@@ -523,6 +578,7 @@ void visualizer_update(uint32_t default_state, uint32_t state, uint32_t leds) { | |||
523 | visualizer_keyboard_status_t new_status = { | 578 | visualizer_keyboard_status_t new_status = { |
524 | .layer = state, | 579 | .layer = state, |
525 | .default_layer = default_state, | 580 | .default_layer = default_state, |
581 | .mods = mods, | ||
526 | .leds = leds, | 582 | .leds = leds, |
527 | .suspended = current_status.suspended, | 583 | .suspended = current_status.suspended, |
528 | }; | 584 | }; |
diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index 53e250725..315af5022 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h | |||
@@ -34,10 +34,14 @@ SOFTWARE. | |||
34 | #include "lcd_backlight.h" | 34 | #include "lcd_backlight.h" |
35 | #endif | 35 | #endif |
36 | 36 | ||
37 | // use this function to merget both real_mods and oneshot_mods in a uint16_t | ||
38 | uint8_t visualizer_get_mods(void); | ||
39 | |||
37 | // This need to be called once at the start | 40 | // This need to be called once at the start |
38 | void visualizer_init(void); | 41 | void visualizer_init(void); |
39 | // This should be called at every matrix scan | 42 | // This should be called at every matrix scan |
40 | void visualizer_update(uint32_t default_state, uint32_t state, uint32_t leds); | 43 | void visualizer_update(uint32_t default_state, uint32_t state, uint8_t mods, uint32_t leds); |
44 | |||
41 | // This should be called when the keyboard goes to suspend state | 45 | // This should be called when the keyboard goes to suspend state |
42 | void visualizer_suspend(void); | 46 | void visualizer_suspend(void); |
43 | // This should be called when the keyboard wakes up from suspend state | 47 | // This should be called when the keyboard wakes up from suspend state |
@@ -61,6 +65,7 @@ struct keyframe_animation_t; | |||
61 | typedef struct { | 65 | typedef struct { |
62 | uint32_t layer; | 66 | uint32_t layer; |
63 | uint32_t default_layer; | 67 | uint32_t default_layer; |
68 | uint8_t mods; | ||
64 | uint32_t leds; // See led.h for available statuses | 69 | uint32_t leds; // See led.h for available statuses |
65 | bool suspended; | 70 | bool suspended; |
66 | } visualizer_keyboard_status_t; | 71 | } visualizer_keyboard_status_t; |
@@ -129,6 +134,8 @@ bool keyframe_set_backlight_color(keyframe_animation_t* animation, visualizer_st | |||
129 | bool keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state); | 134 | bool keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state); |
130 | // Displays a bitmap (0/1) of all the currently active layers | 135 | // Displays a bitmap (0/1) of all the currently active layers |
131 | bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); | 136 | bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); |
137 | // Displays a bitmap (0/1) of all the currently active mods | ||
138 | bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); | ||
132 | 139 | ||
133 | bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); | 140 | bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); |
134 | bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); | 141 | bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); |
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 371d93f3e..765350792 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c | |||
@@ -188,7 +188,7 @@ MATRIX_LOOP_END: | |||
188 | #endif | 188 | #endif |
189 | 189 | ||
190 | #ifdef VISUALIZER_ENABLE | 190 | #ifdef VISUALIZER_ENABLE |
191 | visualizer_update(default_layer_state, layer_state, host_keyboard_leds()); | 191 | visualizer_update(default_layer_state, layer_state, visualizer_get_mods(), host_keyboard_leds()); |
192 | #endif | 192 | #endif |
193 | 193 | ||
194 | // update LED | 194 | // update LED |