NppClone/src/extrakeyboard.cpp

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;
}