diff --git a/qmk_firmware/keyboards/keyball/lib/keyball/keyball.c b/qmk_firmware/keyboards/keyball/lib/keyball/keyball.c index 051be1841..df03b044c 100644 --- a/qmk_firmware/keyboards/keyball/lib/keyball/keyball.c +++ b/qmk_firmware/keyboards/keyball/lib/keyball/keyball.c @@ -40,6 +40,8 @@ keyball_t keyball = { .scroll_mode = false, .scroll_div = 0, + + .pressing_kc = {0}, }; ////////////////////////////////////////////////////////////////////////////// @@ -377,15 +379,18 @@ void keyball_oled_render_ballinfo(void) { void keyball_oled_render_keyinfo(void) { #ifdef OLED_ENABLE - // Format: `Key : R{row} C{col} K{kc} '{name}` + // Format: `Key : R{row} C{col} K{kc} {name}{name}{name}` // // Where `kc` is lower 8 bit of keycode. - // Where `name` is readable label for `kc`, valid between 4 and 56. + // Where `name`s are readable labels for pressing keys, valid between 4 and 56. + // + // `row`, `col`, and `kc` indicates the last processed key, + // but `name`s indicate unreleased keys in best effort. // // It is aligned to fit with output of keyball_oled_render_ballinfo(). // For example: // - // Key : R2 C3 K06 'c + // Key : R2 C3 K06 abc // Ball: 0 0 0 0 // uint8_t keycode = keyball.last_kc; @@ -398,13 +403,23 @@ void keyball_oled_render_keyinfo(void) { oled_write_P(PSTR(" K"), false); oled_write_char(to_1x(keycode >> 4), false); oled_write_char(to_1x(keycode), false); - } - if (keycode >= 4 && keycode < 57) { - oled_write_P(PSTR(" '"), false); - char name = pgm_read_byte(code_to_name + keycode - 4); - oled_write_char(name, false); } else { - oled_advance_page(true); + oled_write_P(PSTR(" "), false); + } + // pads spaces to align pressing keys to the right + oled_write_char(' ', false); + for (int i=0; ievent.pressed && keyball.pressing_kc[i] == lower_keycode) { + keyball.pressing_kc[i] = 0; + break; + } + // stores the pressed key if the slot is vacant + if (record->event.pressed && keyball.pressing_kc[i] == 0) { + // store only valid keycodes + // This simplifies the code for OLED printing. + if (lower_keycode >= 4 && lower_keycode < 57) { + keyball.pressing_kc[i] = lower_keycode; + } + // no need to check other slots in either case above + break; + } + } // store last keycode, row, and col for OLED keyball.last_kc = keycode; keyball.last_pos = record->event.key; diff --git a/qmk_firmware/keyboards/keyball/lib/keyball/keyball.h b/qmk_firmware/keyboards/keyball/lib/keyball/keyball.h index aeb55fe5f..ed2923f9d 100644 --- a/qmk_firmware/keyboards/keyball/lib/keyball/keyball.h +++ b/qmk_firmware/keyboards/keyball/lib/keyball/keyball.h @@ -67,6 +67,8 @@ along with this program. If not, see . # define KEYBALL_MODEL 44 #endif +#define KEYBALL_OLED_MAX_PRESSING_KEYCODES 3 + ////////////////////////////////////////////////////////////////////////////// // Types @@ -130,6 +132,9 @@ typedef struct { uint16_t last_kc; keypos_t last_pos; report_mouse_t last_mouse; + + // It needs only the lower 8 bits of each key code to show on OLED. + uint8_t pressing_kc[KEYBALL_OLED_MAX_PRESSING_KEYCODES]; } keyball_t; typedef enum {