diff options
author | SjB <steve@sagacity.ca> | 2017-01-17 21:47:07 -0500 |
---|---|---|
committer | SjB <steve@sagacity.ca> | 2017-01-17 21:57:32 -0500 |
commit | 9eb8d05246fba4f46c04b8fa1884b8f2d2ee0664 (patch) | |
tree | b423092318863773fe81beb6bf5c9c6317ae0ab6 /quantum/visualizer/visualizer.c | |
parent | 3d264adfc5e4538b57315cb8d3d429b9ed310f25 (diff) | |
download | qmk_firmware-9eb8d05246fba4f46c04b8fa1884b8f2d2ee0664.tar.gz qmk_firmware-9eb8d05246fba4f46c04b8fa1884b8f2d2ee0664.zip |
added mods status bit to visualizer.
Since we can't read the real_mods and oneshot_mods static variable
directly within the update_user_visualizer_state
function (Threading and serial link). We are know storing the mods
states in the visualizer_keyboard_status_t structure. We can now
display the status of the modifier keys on the LCD display.
Diffstat (limited to 'quantum/visualizer/visualizer.c')
-rw-r--r-- | quantum/visualizer/visualizer.c | 58 |
1 files changed, 57 insertions, 1 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 | }; |