#include "event_manager.h" #include "GLOBALS.h" #include "tft_handler.h" #include "input_manager.h" #include #define CARDKB_ADDR 0x5F // M5Stack CardKB I2C address void InputManager::init(DISPLAY_STATE* display_state, TFT_Handler* tf) { _display_state = display_state; _tf = tf; mi = { .x = 5, .y = 5, .size_x = 4, .size_y = 4, .color = 0x0000, }; Wire.begin(); } void InputManager::update() { Wire.requestFrom(CARDKB_ADDR, 1); if (Wire.available()) { char c = Wire.read(); if (c != 0) { handle_keyboard_input(c); } } } void InputManager::handle_keyboard_input(char key) { bool needs_redraw = true; Serial.printf("key: %x\n", key & 0xff); CLICK_EVENT event; switch(key) { case 'a': [[fallthrough]]; case 'A': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'b': [[fallthrough]]; case 'B': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'c': [[fallthrough]]; case 'C': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'd': [[fallthrough]]; case 'D': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'e': [[fallthrough]]; case 'E': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'f': [[fallthrough]]; case 'F': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'g': [[fallthrough]]; case 'G': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'h': [[fallthrough]]; case 'H': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'i': [[fallthrough]]; case 'I': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'j': [[fallthrough]]; case 'J': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'k': [[fallthrough]]; case 'K': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'l': [[fallthrough]]; case 'L': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'm': [[fallthrough]]; case 'M': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'n': [[fallthrough]]; case 'N': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'o': [[fallthrough]]; case 'O': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'p': [[fallthrough]]; case 'P': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'q': [[fallthrough]]; case 'Q': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'r': [[fallthrough]]; case 'R': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 's': [[fallthrough]]; case 'S': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 't': [[fallthrough]]; case 'T': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'u': [[fallthrough]]; case 'U': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'v': [[fallthrough]]; case 'V': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'w': [[fallthrough]]; case 'W': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'x': [[fallthrough]]; case 'X': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'y': [[fallthrough]]; case 'Y': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 'z': [[fallthrough]]; case 'Z': event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 0x20: // Space event.character = key; event.event = CLICK_EVENTS::KEYBOARD; break; case 0xB4: // Left arrow key (CardKB sends special codes) mi.x = (mi.x - 5 < 0) ? 0 : mi.x - 5; break; case 0xB7: // Right arrow key mi.x = (mi.x + 5 > 476) ? 476 : mi.x + 5; break; case 0xB5: // Up arrow key mi.y = (mi.y - 5 < 0) ? 0 : mi.y - 5; event.event = CLICK_EVENTS::UP; break; case 0xB6: // Down arrow key mi.y = (mi.y + 5 > 316) ? 316 : mi.y + 5; event.event = CLICK_EVENTS::DOWN; break; case 0xD: // Enter key event.x = mi.x; event.y = mi.y; event.event = CLICK_EVENTS::LEFT_CLICK; break; default: needs_redraw = false; break; } if (needs_redraw) { EventManager::getInstance().publish(event); _display_state->update_display.store(true); } } void InputManager::draw_button() { _tf->draw_box(mi.x, mi.y, mi.size_x, mi.size_y, mi.color); }