Pinball/src/extrakeyboard.h

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