1 #include <spdlog/spdlog.h>
9 #include "imgui_internal.h"
18 template<
typename Base,
typename T>
20 return dynamic_cast<const Base*
>(ptr) !=
nullptr;
59 {0x0008, SDL_SCANCODE_1},
60 {0x0004, SDL_SCANCODE_2},
61 {0x0002, SDL_SCANCODE_3},
62 {0x0001, SDL_SCANCODE_UP},
64 {0x0080, SDL_SCANCODE_4},
65 {0x0040, SDL_SCANCODE_5},
66 {0x0020, SDL_SCANCODE_6},
67 {0x0010, SDL_SCANCODE_LEFT},
69 {0x0800, SDL_SCANCODE_7},
70 {0x0400, SDL_SCANCODE_8},
71 {0x0200, SDL_SCANCODE_9},
72 {0x0100, SDL_SCANCODE_RIGHT},
75 {0x4000, SDL_SCANCODE_BACKSPACE},
77 {0x1000, SDL_SCANCODE_DOWN}
85 {0x0008, SDL_SCANCODE_1},
86 {0x0004, SDL_SCANCODE_2},
87 {0x0002, SDL_SCANCODE_3},
88 {0x0001, SDL_SCANCODE_BACKSPACE},
90 {0x0080, SDL_SCANCODE_4},
91 {0x0040, SDL_SCANCODE_5},
92 {0x0020, SDL_SCANCODE_6},
93 {0x0010, SDL_SCANCODE_MINUS},
95 {0x0800, SDL_SCANCODE_7},
96 {0x0400, SDL_SCANCODE_8},
97 {0x0200, SDL_SCANCODE_9},
101 {0x4000, SDL_SCANCODE_0},
111 {0x0008, SDL_SCANCODE_1},
112 {0x0004, SDL_SCANCODE_2},
113 {0x0002, SDL_SCANCODE_3},
114 {0x0001, SDL_SCANCODE_BACKSPACE},
116 {0x0080, SDL_SCANCODE_4},
117 {0x0040, SDL_SCANCODE_5},
118 {0x0020, SDL_SCANCODE_6},
119 {0x0010, SDL_SCANCODE_MINUS},
121 {0x0800, SDL_SCANCODE_7},
122 {0x0400, SDL_SCANCODE_8},
123 {0x0200, SDL_SCANCODE_9},
126 {0x8000, SDL_SCANCODE_DECIMALSEPARATOR},
127 {0x4000, SDL_SCANCODE_0},
139 {0x0008, {SDL_SCANCODE_1}},
140 {0x0004, {SDL_SCANCODE_2, SDL_SCANCODE_A, SDL_SCANCODE_B, SDL_SCANCODE_C}},
141 {0x0002, {SDL_SCANCODE_3, SDL_SCANCODE_D, SDL_SCANCODE_E, SDL_SCANCODE_F}},
142 {0x0001, {SDL_SCANCODE_BACKSPACE}},
144 {0x0080, {SDL_SCANCODE_4, SDL_SCANCODE_G, SDL_SCANCODE_H, SDL_SCANCODE_I}},
145 {0x0040, {SDL_SCANCODE_5, SDL_SCANCODE_J, SDL_SCANCODE_K, SDL_SCANCODE_L}},
146 {0x0020, {SDL_SCANCODE_6, SDL_SCANCODE_M, SDL_SCANCODE_N, SDL_SCANCODE_O}},
147 {0x0010, {SDL_SCANCODE_LSHIFT}},
149 {0x0800, {SDL_SCANCODE_7, SDL_SCANCODE_P, SDL_SCANCODE_Q, SDL_SCANCODE_R, SDL_SCANCODE_S}},
150 {0x0400, {SDL_SCANCODE_8, SDL_SCANCODE_T, SDL_SCANCODE_U, SDL_SCANCODE_V}},
151 {0x0200, {SDL_SCANCODE_9, SDL_SCANCODE_W, SDL_SCANCODE_X, SDL_SCANCODE_Y, SDL_SCANCODE_Z}},
152 {0x0100, {SDL_SCANCODE_CAPSLOCK}},
154 {0x8000, {SDL_SCANCODE_KP_MULTIPLY, SDL_SCANCODE_DECIMALSEPARATOR, SDL_SCANCODE_MINUS}},
155 {0x4000, {SDL_SCANCODE_0}},
162 {SDL_SCANCODE_KP_MULTIPLY,
"*"},
163 {SDL_SCANCODE_DECIMALSEPARATOR,
"."},
164 {SDL_SCANCODE_MINUS,
"-"}
169 {SDL_SCANCODE_MINUS,
"_"}
231 static kb_event* last_raw_event =
nullptr;
232 static uint8_t key_cycle = 0;
234 static bool combo_expanded =
false;
244 if (raw_event->
scancode == 0x2000 &&
252 spdlog::info(
"event_handler.cpp - Recieved event to stop continuous measuring. Stopping...");
261 spdlog::debug(
"event_handler.cpp - Not handling keyboard events because a hx measuring is ongoing.");
271 spdlog::debug(
"Handling raw event: {0}", raw_event->
scancode);
275 if (raw_event->
scancode == 0x2000 &&
307 if ((event->type == SDL_KEYDOWN || event->type == SDL_KEYUP) &&
308 (event->key.keysym.scancode == SDL_SCANCODE_DOWN || event->key.keysym.scancode == SDL_SCANCODE_UP) &&
309 (!ImGui::IsAnyItemFocused() || (!scr_mgr->
focused && !combo_expanded)))
312 spdlog::debug(
"event_handler.cpp - masking arrow key DOWN as UP {0}", combo_expanded);
323 if (event->type == SDL_KEYDOWN) {
324 spdlog::debug(
"event_handler.cpp - KEYDOWN scancode: {0}", event->key.keysym.scancode);
328 if (event->key.keysym.scancode == SDL_SCANCODE_RALT) {
334 event->key.keysym.scancode == SDL_SCANCODE_BACKSPACE)
344 event->key.keysym.scancode >= SDL_SCANCODE_1 &&
345 event->key.keysym.scancode < SDL_SCANCODE_0) {
347 uint8_t screen_no = strtol(SDL_GetKeyName(event->key.keysym.sym), NULL, 10);
350 spdlog::debug(
"event_handler.cpp - Requested screen ({0}) doesn't exist", screen_no);
369 if (event->type == SDL_KEYUP) {
370 spdlog::debug(
"event_handler.cpp - KEYUP scancode: {0}", event->key.keysym.scancode);
388 switch (kbins->current_type) {
397 return opts[cycle % opts.size()];
401 spdlog::error(
"keyboard.cpp - This kb_input_type has no keymap");
404 spdlog::error(
"keyboard.cpp - Unknown kb_input_mode");
406 }
catch (
const std::out_of_range& ex) {
412 return SDL_SCANCODE_CLEAR;
415 return SDL_SCANCODE_CLEAR;
421 event.type = SDL_KEYDOWN;
422 event.key.timestamp = SDL_GetTicks();
423 event.key.keysym.scancode = scancode;
424 event.key.keysym.sym = SDL_GetKeyFromScancode(scancode);
425 event.key.keysym.mod = mod;
433 txt_in.type = SDL_TEXTINPUT;
441 strcpy(txt_in.text.text, txt);
443 }
catch (std::out_of_range &ex) {
451 strcpy(txt_in.text.text, txt);
453 }
catch (std::out_of_range &ex) {
454 spdlog::debug(
"event_handler.cpp - Custom keymaps are missing request scancode ({0})", scancode);
457 strcpy(txt_in.text.text, SDL_GetScancodeName(scancode));
460 for (
size_t i = 0; i < strlen(txt_in.text.text); i++) {
461 txt_in.text.text[i] = std::tolower(txt_in.text.text[i]);
471 spdlog::debug(
"event_handler.cpp - Pushing key event with scancode: {0} - {1}", event->key.keysym.scancode,
472 SDL_GetKeyName(SDL_GetKeyFromScancode(event->key.keysym.scancode)));
475 if (replace_cur_char &&
478 event->key.keysym.scancode != SDL_SCANCODE_RETURN)
481 SDL_PushEvent(&backspace);
483 backspace.type = SDL_KEYUP;
484 SDL_PushEvent(&backspace);
487 SDL_PushEvent(event);
490 event->key.keysym.scancode != SDL_SCANCODE_RETURN &&
491 event->key.keysym.scancode != SDL_SCANCODE_BACKSPACE)
494 SDL_PushEvent(&txt_input);
497 event->type = SDL_KEYUP;
498 event->key.state = 0;
499 SDL_PushEvent(event);
513 if (!instanceof<gui_input>(scr_mgr->
focused))
527 if (instanceof<gui_button>(element)) {
528 spdlog::debug(
"event_handler.cpp - action of focused element BUTTON");
529 }
else if (instanceof<gui_combobox>(element)) {
530 spdlog::debug(
"event_handler.cpp - action of focused element COMBOBOX");
531 }
else if (instanceof<gui_direct>(element)) {
532 spdlog::debug(
"event_handler.cpp - action of focused element DIRECT");
533 }
else if (instanceof<gui_label>(element)) {
534 spdlog::debug(
"event_handler.cpp - action of focused element LABEL");
535 }
else if (instanceof<gui_observer>(element)) {
536 spdlog::debug(
"event_handler.cpp - action of focused element OBSERVER");
537 }
else if (instanceof<gui_selectable>(element)) {
538 spdlog::debug(
"event_handler.cpp - action of focused element SELECTABLE");
540 spdlog::debug(
"event_handler.cpp - action of focused element UNKNOWN");
544 if (instanceof<gui_button>(element) || instanceof<gui_combobox>(element) ||
545 instanceof<gui_selectable>(element) || combo_expanded)
551 spdlog::debug(
"event_handler.cpp - creating action event");
557 SDL_PushEvent(&txt_input);
559 ret.type = SDL_KEYUP;
563 if (instanceof<gui_combobox>(element) || combo_expanded) {
564 combo_expanded = !combo_expanded;
565 spdlog::debug(
"event_handler.cpp - setting combo_expanded flag to {0}", combo_expanded);
590 spdlog::debug(
"event_handler.cpp - handling RETURN raw event");
593 spdlog::debug(
"event_handler.cpp - switching input mode from INPUT to NAVIGATION");
608 spdlog::debug(
"event_handler.cpp - switching input mode from NAVIGATION to INPUT");
620 spdlog::debug(
"event_handler.cpp - input type: {0}", kbins->
current_type);
626 if (scr_mgr->
focused || combo_expanded) {
627 spdlog::debug(
"event_handler.cpp - calling focused element action");
631 spdlog::debug(
"event_handler.cpp - handling RETURN raw event with no action");
643 if (sc == SDL_SCANCODE_CLEAR)
647 if (sc >= SDL_SCANCODE_1 && sc < SDL_SCANCODE_0) {
648 uint8_t screen_no = strtol(SDL_GetScancodeName(sc), NULL, 10);
654 if (sc == SDL_SCANCODE_BACKSPACE) {
675 uint32_t delta_t = UINT32_MAX;
677 if (last_raw_event !=
nullptr) {
678 delta_t = (raw_event->
timestamp.tv_sec - last_raw_event->
timestamp.tv_sec) * 1000000 +
688 last_raw_event = raw_event;
692 if (sc == SDL_SCANCODE_CLEAR)
697 if (sc == SDL_SCANCODE_LSHIFT) {
701 if (sc == SDL_SCANCODE_CAPSLOCK) {
723 spdlog::info(
"event_handler.cpp - RFID event handler: user with this RFID is already logged");
730 spdlog::error(
"event_handler.cpp - RFID event handler: ");
750 spdlog::error(
"event_handler.cpp - RFID event handler: already have user and subuser.");
764 spdlog::debug(
"event_handler.cpp - Not handling keyboard events, because a hx measuring is ongoing.");
768 spdlog::info(
"event_handler.cpp - handling RFID event");
771 printf(
"RFID serial: ");
772 for (
int i = 0; i <
event->tag.serial_size; i++) {
784 spdlog::error(
"event_handler.cpp - No user logged in. RFID login only possible from screen 1.");
One of the most importat classes in the whole project. Holds variables that define the state of the a...
static std::unique_ptr< app_workspace > & get_instance()
Get the instance app_workspace which is a singleton.
user_workspace * get_userspace()
void set_err_screen_and_activate(const char *title, const char *label)
Set the err screen and activate the screen on next frame.
int s5_screen_6_indicator
int log_in_user_rfid(rfid_reader::rfid_tag *tag, bool loading_sub=false)
Logs in user through scanned RFID tag. Initializes user_workspace if loading_sub is false.
bool has_user()
Checks if user is logged in. This is determined by user_space being initialized and having the user_l...
screen_manager * get_scr_mgr()
Get the screen manager instance. This instance is kind of singleton. Is initalized only once on start...
std::unique_ptr< rfid_reader::rfid_tag > s6_rfid_tag
bool refresh_current_screen
When this is set to true, elements of current screen will be reinitialized for next frame.
Paren class for other gui elements.
void pop_screen_from_previous()
void set_selected_screen(uint8_t screen)
uint8_t get_screen_count()
uint8_t get_selected_screen()
Container that servers for storing users data and manipulating them.
int compare_rfid_serials(rfid_reader::rfid_tag *tag)
const char * get_localized_text(const char *key)
Get the localized text object.
int handle_rfid_event(rfid_event *event)
Function handles RFID event.
bool can_switch_modes()
Determine if keyboard can be switched to INPUT mode.
bool instanceof(const T *ptr)
int handle_return_event()
Handles return event (NAVIGATION/INPUT mode switch, BUTTON/ COMBOOX... activation)
std::map< uint16_t, SDL_Scancode > navigation_keymap
Map for translating SPI keyboard scancodes keys to SDL scancodes for navigation.
std::map< SDL_Scancode, const char * > custom_shift_keymap
std::map< uint16_t, SDL_Scancode > int_in_keymap
int input map that is used for mapping spi keys to sdl scancodes
int handle_nav_event(kb_event *raw_event)
Handle event as navigation event.
void push_event_to_sdl(SDL_Event *event, bool replace_cur_char=false)
Pushes event to SDL queue. This event then can be propagated to ImGui. If @replace_cur_char is set,...
SDL_Event create_key_event(SDL_Scancode scancode, Uint16 mod=0)
Creates an SDL_Event simulating keyboard press from SDL_Scancode.
int rfid_action_user_logged(rfid_event *event)
std::map< uint16_t, SDL_Scancode > float_in_keymap
float input map that is used for mapping spi keys to sdl scancodes
int handle_input_event(kb_event *raw_event)
Handle event as input event.
SDL_Scancode determine_scancode(uint16_t keycode, uint8_t cycle=0)
Determines SDL_Scancode from SPI keyboard keycode and cycle. Cycle is used to cycle keys during text ...
int focused_element_action(gui_element *element)
std::map< uint16_t, std::vector< SDL_Scancode > > text_in_keymap
Text input keymap. Holds what scancodes are cycled for corresponding key. First value should correspo...
int handle_raw_event(kb_event *raw_event)
Offers option for cutom event handling. If not desired only created SDL event.
SDL_Event create_textinput_event(SDL_Scancode scancode)
Creates an SDL_Event for input.
int handle_sdl_event(const SDL_Event *event)
Handles SDL2 library event.
std::map< SDL_Scancode, const char * > custom_keymap
#define ADMIN_SELECT_SCREEN
Structure of SPI keyboard event, Contains pressed scancode, flags and timestamp of event creation.
Structure used for RFID event. This structure contains read tag and flags of the event.
rfid_reader::rfid_tag tag
RFID tag structure. Stores data read from SPI.