160 lines
4.9 KiB
C++
160 lines
4.9 KiB
C++
#include "extrakeyboard.h"
|
|
#include <gint/keyboard.h>
|
|
#include <gint/rtc.h>
|
|
#include <cstdint>
|
|
|
|
|
|
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;
|
|
} |