#include "extrakeyboard.h" #include #include #include typedef struct { bool pressed; uint32_t since = 0; } keyinfo; keyinfo MyKeyMapper[MYKEY_LASTENUM+1]; KeyboardExtra::KeyboardExtra() { uint32_t timer = rtc_ticks(); now = timer; for(int i=0; i<=MYKEY_LASTENUM; i++) MyKeyMapper[i] = { .pressed = false, .since = timer }; } KeyboardExtra::~KeyboardExtra() { } void KeyboardExtra::Update( float dt ) { uint32_t timer = rtc_ticks(); now = timer; key_event_t ev; int keycode = -1; while((ev = pollevent()).type != KEYEV_NONE) { if (ev.key == KEY_F1) keycode = MYKEY_F1; else if(ev.key == KEY_F2) keycode = MYKEY_F2; else if(ev.key == KEY_F3) keycode = MYKEY_F3; else if(ev.key == KEY_F4) keycode = MYKEY_F4; else if(ev.key == KEY_F5) keycode = MYKEY_F5; else if(ev.key == KEY_F6) keycode = MYKEY_F6; else if(ev.key == KEY_SHIFT) keycode = MYKEY_SHIFT; else if(ev.key == KEY_OPTN) keycode = MYKEY_OPTN; else if(ev.key == KEY_VARS) keycode = MYKEY_VARS; else if(ev.key == KEY_MENU) keycode = MYKEY_MENU; else if(ev.key == KEY_LEFT) keycode = MYKEY_LEFT; else if(ev.key == KEY_UP) keycode = MYKEY_UP; else if(ev.key == KEY_ALPHA) keycode = MYKEY_ALPHA; else if(ev.key == KEY_SQUARE) keycode = MYKEY_SQUARE; else if(ev.key == KEY_POWER) keycode = MYKEY_POWER; else if(ev.key == KEY_EXIT) keycode = MYKEY_EXIT; else if(ev.key == KEY_DOWN) keycode = MYKEY_DOWN; else if(ev.key == KEY_RIGHT) keycode = MYKEY_RIGHT; else if(ev.key == KEY_XOT) keycode = MYKEY_XOT; else if(ev.key == KEY_LOG) keycode = MYKEY_LOG; else if(ev.key == KEY_LN) keycode = MYKEY_LN; else if(ev.key == KEY_SIN) keycode = MYKEY_SIN; else if(ev.key == KEY_COS) keycode = MYKEY_COS; else if(ev.key == KEY_TAN) keycode = MYKEY_TAN; else if(ev.key == KEY_FRAC) keycode = MYKEY_FRAC; else if(ev.key == KEY_FD) keycode = MYKEY_FD; else if(ev.key == KEY_LEFTP) keycode = MYKEY_LEFTP; else if(ev.key == KEY_RIGHTP) keycode = MYKEY_RIGHTP; else if(ev.key == KEY_COMMA) keycode = MYKEY_COMMA; else if(ev.key == KEY_ARROW) keycode = MYKEY_ARROW; else if(ev.key == KEY_7) keycode = MYKEY_7; else if(ev.key == KEY_8) keycode = MYKEY_8; else if(ev.key == KEY_9) keycode = MYKEY_9; else if(ev.key == KEY_DEL) keycode = MYKEY_DEL; else if(ev.key == KEY_4) keycode = MYKEY_4; else if(ev.key == KEY_5) keycode = MYKEY_5; else if(ev.key == KEY_6) keycode = MYKEY_6; else if(ev.key == KEY_MUL) keycode = MYKEY_MUL; else if(ev.key == KEY_DIV) keycode = MYKEY_DIV; else if(ev.key == KEY_1) keycode = MYKEY_1; else if(ev.key == KEY_2) keycode = MYKEY_2; else if(ev.key == KEY_3) keycode = MYKEY_3; else if(ev.key == KEY_ADD) keycode = MYKEY_ADD; else if(ev.key == KEY_SUB) keycode = MYKEY_SUB; else if(ev.key == KEY_0) keycode = MYKEY_0; else if(ev.key == KEY_DOT) keycode = MYKEY_DOT; else if(ev.key == KEY_EXP) keycode = MYKEY_EXP; else if(ev.key == KEY_NEG) keycode = MYKEY_NEG; else if(ev.key == KEY_EXE) keycode = MYKEY_EXE; else if(ev.key == KEY_ACON) keycode = MYKEY_ACON; if(keycode!=-1) { if (ev.type == KEYEV_DOWN) MyKeyMapper[keycode] = { .pressed = true, .since = timer }; else if (ev.type == KEYEV_UP) MyKeyMapper[keycode] = { .pressed = false, .since = timer }; else if (ev.type == KEYEV_HOLD) {} } else { // do nothing, just unstack the event from the events queue }; } } bool KeyboardExtra::IsKeyPressedEvent( int key ) { return (MyKeyMapper[key].pressed && MyKeyMapper[key].since == now); } bool KeyboardExtra::IsKeyReleasedEvent( int key ) { return (!MyKeyMapper[key].pressed && MyKeyMapper[key].since == now); } bool KeyboardExtra::IsKeyPressed( int key ) { return MyKeyMapper[key].pressed; } bool KeyboardExtra::IsKeyReleased( int key ) { return (!MyKeyMapper[key].pressed); } uint32_t KeyboardExtra::IsKeyHoldPressed( int key ) { if (MyKeyMapper[key].pressed && MyKeyMapper[key].since < now) return (uint32_t) (now-MyKeyMapper[key].since); else return 0; } uint32_t KeyboardExtra::IsKeyHoldReleased( int key ) { if (!MyKeyMapper[key].pressed && MyKeyMapper[key].since < now) return (uint32_t) (now-MyKeyMapper[key].since); else return 0; } uint32_t KeyboardExtra::GetLastTickKeyEvent( int key ) { return (uint32_t) MyKeyMapper[key].since; }