259 lines
5.6 KiB
C++
259 lines
5.6 KiB
C++
#ifndef EXTRAKEYBOARD_H
|
|
#define EXTRAKEYBOARD_H
|
|
|
|
#include "extrakeyboard.h"
|
|
#include <cstdint>
|
|
#include <gint/keyboard.h>
|
|
#include <gint/rtc.h>
|
|
|
|
enum {
|
|
MYKEY_F1 = 0,
|
|
MYKEY_F2,
|
|
MYKEY_F3,
|
|
MYKEY_F4,
|
|
MYKEY_F5,
|
|
MYKEY_F6,
|
|
|
|
MYKEY_SHIFT,
|
|
MYKEY_OPTN,
|
|
MYKEY_VARS,
|
|
MYKEY_MENU,
|
|
MYKEY_LEFT,
|
|
MYKEY_UP,
|
|
|
|
MYKEY_ALPHA,
|
|
MYKEY_SQUARE,
|
|
MYKEY_POWER,
|
|
MYKEY_EXIT,
|
|
MYKEY_DOWN,
|
|
MYKEY_RIGHT,
|
|
|
|
MYKEY_XOT,
|
|
MYKEY_LOG,
|
|
MYKEY_LN,
|
|
MYKEY_SIN,
|
|
MYKEY_COS,
|
|
MYKEY_TAN,
|
|
|
|
MYKEY_FRAC,
|
|
MYKEY_FD,
|
|
MYKEY_LEFTP,
|
|
MYKEY_RIGHTP,
|
|
MYKEY_COMMA,
|
|
MYKEY_ARROW,
|
|
|
|
MYKEY_7,
|
|
MYKEY_8,
|
|
MYKEY_9,
|
|
MYKEY_DEL,
|
|
|
|
MYKEY_4,
|
|
MYKEY_5,
|
|
MYKEY_6,
|
|
MYKEY_MUL,
|
|
MYKEY_DIV,
|
|
|
|
MYKEY_1,
|
|
MYKEY_2,
|
|
MYKEY_3,
|
|
MYKEY_ADD,
|
|
MYKEY_SUB,
|
|
|
|
MYKEY_0,
|
|
MYKEY_DOT,
|
|
MYKEY_EXP,
|
|
MYKEY_NEG,
|
|
MYKEY_EXE,
|
|
|
|
MYKEY_ACON,
|
|
|
|
MYKEY_LASTENUM,
|
|
};
|
|
|
|
typedef struct {
|
|
bool pressed;
|
|
uint32_t since = 0;
|
|
} keyinfo;
|
|
|
|
keyinfo MyKeyMapper[MYKEY_LASTENUM + 1];
|
|
|
|
class KeyboardExtra {
|
|
public:
|
|
KeyboardExtra() {
|
|
uint32_t timer = rtc_ticks();
|
|
now = timer;
|
|
for (int i = 0; i <= MYKEY_LASTENUM; i++)
|
|
MyKeyMapper[i] = {.pressed = false, .since = timer};
|
|
}
|
|
|
|
~KeyboardExtra() {}
|
|
|
|
void 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 IsKeyPressedEvent(int key) {
|
|
return (MyKeyMapper[key].pressed && MyKeyMapper[key].since == now);
|
|
}
|
|
|
|
bool IsKeyReleasedEvent(int key) {
|
|
return (!MyKeyMapper[key].pressed && MyKeyMapper[key].since == now);
|
|
}
|
|
|
|
bool IsKeyPressed(int key) { return MyKeyMapper[key].pressed; }
|
|
|
|
bool IsKeyReleased(int key) { return (!MyKeyMapper[key].pressed); }
|
|
|
|
uint32_t IsKeyHoldPressed(int key) {
|
|
if (MyKeyMapper[key].pressed && MyKeyMapper[key].since < now)
|
|
return (uint32_t)(now - MyKeyMapper[key].since);
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
uint32_t IsKeyHoldReleased(int key) {
|
|
if (!MyKeyMapper[key].pressed && MyKeyMapper[key].since < now)
|
|
return (uint32_t)(now - MyKeyMapper[key].since);
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
uint32_t GetLastTickKeyEvent(int key) {
|
|
return (uint32_t)MyKeyMapper[key].since;
|
|
}
|
|
|
|
private:
|
|
uint32_t now;
|
|
};
|
|
|
|
#endif
|