From b2e56342c2042ce087d6669ba1fb2b7e8c42529a Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Sat, 19 Dec 2020 11:56:23 +0100 Subject: [PATCH] keyboard factoring WIP --- legacy/firmware/keyboard.c | 71 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/legacy/firmware/keyboard.c b/legacy/firmware/keyboard.c index 0facbcb1d..54e4a887d 100644 --- a/legacy/firmware/keyboard.c +++ b/legacy/firmware/keyboard.c @@ -72,6 +72,14 @@ enum { #define TEXT_OFFSET 0 CONFIDENTIAL char input[MAX_INPUT_LEN + 1] = ""; +typedef struct { + int select_index; + bool input_done; + int kbd_layout; + bool left_shift; + bool right_shift; +} State; + static void drawBtn(int i, const char *text) { int x = KBD_X_OFFSET + (i % KBD_COLS) * (BTN_WIDTH + BTN_X_SEP); int y = KBD_Y_OFFSET + (i / KBD_COLS) * (BTN_HEIGHT + BTN_Y_SEP); @@ -188,6 +196,69 @@ static void pressBtn(int btn) { if (select_index < 0) drawCursor(); } +#define STATE_NONE 0 +#define STATE_LEFT_DOWN 1 +#define STATE_RIGHT_DOWN 2 +#define STATE_SHIFT 4 +#define STATE_LEFT_SHIFT (STATE_LEFT_DOWN | STATE_SHIFT) +#define STATE_RIGHT_SHIFT (STATE_RIGHT_DOWN | STATE_SHIFT) + +#define EVENT_NONE 0 +#define EVENT_LEFT 1 +#define EVENT_RIGHT 2 +#define EVENT_SHIFTED_LEFT 4 +#define EVENT_SHIFTED_RIGHT 8 +#define EVENT_LEFT_SHIFT 16 +#define EVENT_RIGHT_SHIFT 32 +#define EVENT_SHIFT_RELEASE 64 + +int button_handler(State *state) { + int events = 0; + + buttonUpdate(); + if (button.YesReleased) { + if (state->right_shift) { + state->right_shift = false; + events |= EVENT_SHIFT_RELEASE; + } else { + if (button.YesDown > button.NoDown) { + // Right + events |= EVENT_RIGHT; + } else { + // Shift + Right + events |= EVENT_SHIFTED_RIGHT; + state->left_shift = true; + } + } + } + + if (button.NoReleased) { + if (state->left_shift) { + state->left_shift = false; + events |= EVENT_SHIFT_RELEASE; + } else { + if (button.NoDown > button.YesDown) { + // Left + events |= EVENT_LEFT; + } else { + // Shift + Left + events |= EVENT_SHIFTED_LEFT; + state->right_shift = true; + } + } + } + + if (button.NoDown == 1 && button.YesDown <= 1) { + events |= EVENT_LEFT_SHIFT; + } + + if (button.YesDown == 1 && button.NoDown <= 1) { + events |= EVENT_RIGHT_SHIFT; + } + + return events; +} + static bool host_cancelled(void) { return (msg_tiny_id == MessageType_MessageType_Cancel) || (msg_tiny_id == MessageType_MessageType_Initialize);