308 lines
6.7 KiB
C++
308 lines
6.7 KiB
C++
#include "event_manager.h"
|
|
#include "GLOBALS.h"
|
|
#include "tft_handler.h"
|
|
#include "input_manager.h"
|
|
#include <Wire.h>
|
|
|
|
#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();
|
|
|
|
for (int i = 0; i < NUM_BUTTONS; i++) {
|
|
pinMode(BUTTON_PINS[i], INPUT_PULLUP);
|
|
}
|
|
}
|
|
|
|
void InputManager::update() {
|
|
for (int i = 0; i < NUM_BUTTONS; i++) {
|
|
short int reading = digitalRead(BUTTON_PINS[i]);
|
|
|
|
if (reading != lastButtonState[i]) {
|
|
lastDebounceTime[i] = millis();
|
|
}
|
|
|
|
if ((millis() - lastDebounceTime[i]) > DEBOUNCE_DELAY) {
|
|
if (reading != buttonState[i]) {
|
|
buttonState[i] = reading;
|
|
|
|
if (buttonState[i] == LOW) {
|
|
handle_button_press(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
lastButtonState[i] = reading;
|
|
}
|
|
|
|
|
|
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 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;
|
|
break;
|
|
|
|
case 0xB6: // Down arrow key
|
|
mi.y = (mi.y + 5 > 316) ? 316 : mi.y + 5;
|
|
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::handle_button_press(short buttonIndex) {
|
|
bool needs_redraw = false;
|
|
|
|
switch(buttonIndex) {
|
|
case 0:
|
|
mi.x = (mi.x + 5 > 476) ? 476 : mi.x + 5;
|
|
needs_redraw = true;
|
|
break;
|
|
case 1:
|
|
mi.y = (mi.y + 5 > 316) ? 316 : mi.y + 5;
|
|
needs_redraw = true;
|
|
break;
|
|
case 2:
|
|
mi.y = (mi.y - 5 < 0) ? 0 : mi.y - 5;
|
|
needs_redraw = true;
|
|
break;
|
|
case 3:
|
|
mi.x = (mi.x - 5 < 0) ? 0 : mi.x - 5;
|
|
needs_redraw = true;
|
|
break;
|
|
case 4: // Click
|
|
{
|
|
CLICK_EVENT event = {
|
|
.x = mi.x,
|
|
.y = mi.y,
|
|
.event = CLICK_EVENTS::LEFT_CLICK
|
|
};
|
|
EventManager::getInstance().publish(event);
|
|
}
|
|
break;
|
|
case 5: // Right click
|
|
{
|
|
CLICK_EVENT event = {
|
|
.x = mi.x,
|
|
.y = mi.y,
|
|
.event = CLICK_EVENTS::RIGHT_CLICK
|
|
};
|
|
EventManager::getInstance().publish(event);
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (needs_redraw) {
|
|
_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);
|
|
}
|
|
|
|
bool InputManager::are_buttons_pressed(short btn1, short btn2) {
|
|
return (buttonState[btn1] == LOW && buttonState[btn2] == LOW);
|
|
} |