added key repeat to keymon and api
This commit is contained in:
parent
0f8665ed26
commit
809a7e360d
4 changed files with 138 additions and 103 deletions
|
|
@ -669,7 +669,11 @@ static struct PAD_Context {
|
||||||
int is_pressed;
|
int is_pressed;
|
||||||
int just_pressed;
|
int just_pressed;
|
||||||
int just_released;
|
int just_released;
|
||||||
|
int just_repeated;
|
||||||
|
int repeat_at[BTN_ID_COUNT];
|
||||||
} pad;
|
} pad;
|
||||||
|
#define PAD_REPEAT_DELAY 300
|
||||||
|
#define PAD_REPEAT_INTERVAL 100
|
||||||
void PAD_reset(void) {
|
void PAD_reset(void) {
|
||||||
pad.just_pressed = BTN_NONE;
|
pad.just_pressed = BTN_NONE;
|
||||||
pad.is_pressed = BTN_NONE;
|
pad.is_pressed = BTN_NONE;
|
||||||
|
|
@ -679,42 +683,56 @@ void PAD_poll(void) {
|
||||||
// reset transient state
|
// reset transient state
|
||||||
pad.just_pressed = BTN_NONE;
|
pad.just_pressed = BTN_NONE;
|
||||||
pad.just_released = BTN_NONE;
|
pad.just_released = BTN_NONE;
|
||||||
|
pad.just_repeated = BTN_NONE;
|
||||||
|
|
||||||
|
int tick = SDL_GetTicks();
|
||||||
|
for (int i=0; i<BTN_ID_COUNT; i++) {
|
||||||
|
int btn = 1 << i;
|
||||||
|
if ((pad.is_pressed & btn) && (tick>=pad.repeat_at[i])) {
|
||||||
|
pad.just_repeated |= btn; // set
|
||||||
|
pad.repeat_at[i] += PAD_REPEAT_INTERVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// the actual poll
|
// the actual poll
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
int btn = BTN_NONE;
|
int btn = BTN_NONE;
|
||||||
|
int id = -1;
|
||||||
if (event.type==SDL_KEYDOWN || event.type==SDL_KEYUP) {
|
if (event.type==SDL_KEYDOWN || event.type==SDL_KEYUP) {
|
||||||
uint8_t code = event.key.keysym.scancode;
|
uint8_t code = event.key.keysym.scancode;
|
||||||
if (code==CODE_UP) btn = BTN_UP;
|
if (code==CODE_UP) { btn = BTN_UP; id = BTN_ID_UP; }
|
||||||
else if (code==CODE_DOWN) btn = BTN_DOWN;
|
else if (code==CODE_DOWN) { btn = BTN_DOWN; id = BTN_ID_DOWN; }
|
||||||
else if (code==CODE_LEFT) btn = BTN_LEFT;
|
else if (code==CODE_LEFT) { btn = BTN_LEFT; id = BTN_ID_LEFT; }
|
||||||
else if (code==CODE_RIGHT) btn = BTN_RIGHT;
|
else if (code==CODE_RIGHT) { btn = BTN_RIGHT; id = BTN_ID_RIGHT; }
|
||||||
else if (code==CODE_A) btn = BTN_A;
|
else if (code==CODE_A) { btn = BTN_A; id = BTN_ID_A; }
|
||||||
else if (code==CODE_B) btn = BTN_B;
|
else if (code==CODE_B) { btn = BTN_B; id = BTN_ID_B; }
|
||||||
else if (code==CODE_X) btn = BTN_X;
|
else if (code==CODE_X) { btn = BTN_X; id = BTN_ID_X; }
|
||||||
else if (code==CODE_Y) btn = BTN_Y;
|
else if (code==CODE_Y) { btn = BTN_Y; id = BTN_ID_Y; }
|
||||||
else if (code==CODE_START) btn = BTN_START;
|
else if (code==CODE_START) { btn = BTN_START; id = BTN_ID_START; }
|
||||||
else if (code==CODE_SELECT) btn = BTN_SELECT;
|
else if (code==CODE_SELECT) { btn = BTN_SELECT; id = BTN_ID_SELECT; }
|
||||||
else if (code==CODE_MENU) btn = BTN_MENU;
|
else if (code==CODE_MENU) { btn = BTN_MENU; id = BTN_ID_MENU; }
|
||||||
else if (code==CODE_L1) btn = BTN_L1;
|
else if (code==CODE_L1) { btn = BTN_L1; id = BTN_ID_L1; }
|
||||||
else if (code==CODE_L2) btn = BTN_L2;
|
else if (code==CODE_L2) { btn = BTN_L2; id = BTN_ID_L2; }
|
||||||
else if (code==CODE_R1) btn = BTN_R1;
|
else if (code==CODE_R1) { btn = BTN_R1; id = BTN_ID_R1; }
|
||||||
else if (code==CODE_R2) btn = BTN_R2;
|
else if (code==CODE_R2) { btn = BTN_R2; id = BTN_ID_R2; }
|
||||||
else if (code==CODE_VOL_UP) btn = BTN_VOL_UP;
|
else if (code==CODE_VOL_UP) { btn = BTN_VOL_UP; id = BTN_ID_VOL_UP; }
|
||||||
else if (code==CODE_VOL_DN) btn = BTN_VOL_DN;
|
else if (code==CODE_VOL_DN) { btn = BTN_VOL_DN; id = BTN_ID_VOL_DN; }
|
||||||
else if (code==CODE_POWER) btn = BTN_POWER;
|
else if (code==CODE_POWER) { btn = BTN_POWER; id = BTN_ID_POWER; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (btn==BTN_NONE) continue;
|
if (btn==BTN_NONE) continue;
|
||||||
|
|
||||||
if (event.type==SDL_KEYUP) {
|
if (event.type==SDL_KEYUP) {
|
||||||
pad.is_pressed &= ~btn; // unset
|
pad.is_pressed &= ~btn; // unset
|
||||||
pad.just_released |= btn; // set
|
pad.just_repeated &= ~btn; // unset
|
||||||
|
pad.just_released |= btn; // set
|
||||||
}
|
}
|
||||||
else if ((pad.is_pressed & btn)==BTN_NONE) {
|
else if ((pad.is_pressed & btn)==BTN_NONE) {
|
||||||
pad.just_pressed |= btn; // set
|
pad.just_pressed |= btn; // set
|
||||||
pad.is_pressed |= btn; // set
|
pad.just_repeated |= btn; // set
|
||||||
|
pad.is_pressed |= btn; // set
|
||||||
|
pad.repeat_at[id] = tick + PAD_REPEAT_DELAY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -724,6 +742,7 @@ int PAD_anyPressed(void) { return pad.is_pressed!=BTN_NONE; }
|
||||||
int PAD_justPressed(int btn) { return pad.just_pressed & btn; }
|
int PAD_justPressed(int btn) { return pad.just_pressed & btn; }
|
||||||
int PAD_isPressed(int btn) { return pad.is_pressed & btn; }
|
int PAD_isPressed(int btn) { return pad.is_pressed & btn; }
|
||||||
int PAD_justReleased(int btn) { return pad.just_released & btn; }
|
int PAD_justReleased(int btn) { return pad.just_released & btn; }
|
||||||
|
int PAD_justRepeated(int btn) { return pad.just_repeated & btn; }
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
|
|
@ -801,14 +820,5 @@ int POW_getBattery(void) {
|
||||||
// return getInt("/sys/class/power_supply/battery/capacity"); // this is really inaccurate
|
// return getInt("/sys/class/power_supply/battery/capacity"); // this is really inaccurate
|
||||||
|
|
||||||
int i = getInt("/sys/class/power_supply/battery/voltage_now") / 10000; // ~320-420
|
int i = getInt("/sys/class/power_supply/battery/voltage_now") / 10000; // ~320-420
|
||||||
i = MIN(MAX(0, i-320), 100); // TODO: smooth this value before returning ala Mini
|
return MIN(MAX(0, i-320), 100); // TODO: smooth this value before returning ala Mini
|
||||||
|
|
||||||
// eh
|
|
||||||
// if (i>80) return 100;
|
|
||||||
// else if (i>60) return 80;
|
|
||||||
// else if (i>40) return 60;
|
|
||||||
// else if (i>20) return 40;
|
|
||||||
// else if (i>10) return 20;
|
|
||||||
// else if (i>5) return 10;
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
@ -5,11 +5,6 @@
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
// TODO: tmp
|
|
||||||
#define PAD_justRepeated PAD_justPressed
|
|
||||||
|
|
||||||
///////////////////////////////
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
LOG_DEBUG = 0,
|
LOG_DEBUG = 0,
|
||||||
LOG_INFO,
|
LOG_INFO,
|
||||||
|
|
@ -93,26 +88,48 @@ void SND_quit(void);
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
|
enum {
|
||||||
|
BTN_ID_UP,
|
||||||
|
BTN_ID_DOWN,
|
||||||
|
BTN_ID_LEFT,
|
||||||
|
BTN_ID_RIGHT,
|
||||||
|
BTN_ID_A,
|
||||||
|
BTN_ID_B,
|
||||||
|
BTN_ID_X,
|
||||||
|
BTN_ID_Y,
|
||||||
|
BTN_ID_START,
|
||||||
|
BTN_ID_SELECT,
|
||||||
|
BTN_ID_L1,
|
||||||
|
BTN_ID_R1,
|
||||||
|
BTN_ID_L2,
|
||||||
|
BTN_ID_R2,
|
||||||
|
BTN_ID_MENU,
|
||||||
|
BTN_ID_VOL_UP,
|
||||||
|
BTN_ID_VOL_DN,
|
||||||
|
BTN_ID_POWER,
|
||||||
|
BTN_ID_COUNT,
|
||||||
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
BTN_NONE = 0,
|
BTN_NONE = 0,
|
||||||
BTN_UP = 1 << 0,
|
BTN_UP = 1 << BTN_ID_UP,
|
||||||
BTN_DOWN = 1 << 1,
|
BTN_DOWN = 1 << BTN_ID_DOWN,
|
||||||
BTN_LEFT = 1 << 2,
|
BTN_LEFT = 1 << BTN_ID_LEFT,
|
||||||
BTN_RIGHT = 1 << 3,
|
BTN_RIGHT = 1 << BTN_ID_RIGHT,
|
||||||
BTN_A = 1 << 4,
|
BTN_A = 1 << BTN_ID_A,
|
||||||
BTN_B = 1 << 5,
|
BTN_B = 1 << BTN_ID_B,
|
||||||
BTN_X = 1 << 6,
|
BTN_X = 1 << BTN_ID_X,
|
||||||
BTN_Y = 1 << 7,
|
BTN_Y = 1 << BTN_ID_Y,
|
||||||
BTN_START = 1 << 8,
|
BTN_START = 1 << BTN_ID_START,
|
||||||
BTN_SELECT = 1 << 9,
|
BTN_SELECT = 1 << BTN_ID_SELECT,
|
||||||
BTN_L1 = 1 << 10,
|
BTN_L1 = 1 << BTN_ID_L1,
|
||||||
BTN_R1 = 1 << 11,
|
BTN_R1 = 1 << BTN_ID_R1,
|
||||||
BTN_L2 = 1 << 12,
|
BTN_L2 = 1 << BTN_ID_L2,
|
||||||
BTN_R2 = 1 << 13,
|
BTN_R2 = 1 << BTN_ID_R2,
|
||||||
BTN_MENU = 1 << 14,
|
BTN_MENU = 1 << BTN_ID_MENU,
|
||||||
BTN_VOL_UP = 1 << 15,
|
BTN_VOL_UP = 1 << BTN_ID_VOL_UP,
|
||||||
BTN_VOL_DN = 1 << 16,
|
BTN_VOL_DN = 1 << BTN_ID_VOL_DN,
|
||||||
BTN_POWER = 1 << 17,
|
BTN_POWER = 1 << BTN_ID_POWER,
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: this belongs in defines.h or better yet a platform.h
|
// TODO: this belongs in defines.h or better yet a platform.h
|
||||||
|
|
@ -125,6 +142,7 @@ int PAD_anyPressed(void);
|
||||||
int PAD_justPressed(int btn);
|
int PAD_justPressed(int btn);
|
||||||
int PAD_isPressed(int btn);
|
int PAD_isPressed(int btn);
|
||||||
int PAD_justReleased(int btn);
|
int PAD_justReleased(int btn);
|
||||||
|
int PAD_justRepeated(int btn);
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,22 +69,30 @@ int main (int argc, char *argv[]) {
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
uint32_t menu_pressed = 0;
|
uint32_t menu_pressed = 0;
|
||||||
uint32_t power_pressed = 0;
|
uint32_t power_pressed = 0;
|
||||||
uint32_t repeat_volume = 0;
|
|
||||||
|
uint32_t up_pressed = 0;
|
||||||
|
uint32_t up_just_pressed = 0;
|
||||||
|
uint32_t up_repeat_at = 0;
|
||||||
|
|
||||||
|
uint32_t down_pressed = 0;
|
||||||
|
uint32_t down_just_pressed = 0;
|
||||||
|
uint32_t down_repeat_at = 0;
|
||||||
|
|
||||||
uint8_t ignore;
|
uint8_t ignore;
|
||||||
uint64_t then;
|
uint32_t then;
|
||||||
uint64_t now;
|
uint32_t now;
|
||||||
struct timeval tod;
|
struct timeval tod;
|
||||||
|
|
||||||
gettimeofday(&tod, NULL);
|
gettimeofday(&tod, NULL);
|
||||||
then = tod.tv_sec * 1000 + tod.tv_usec / 1000;
|
then = tod.tv_sec * 1000 + tod.tv_usec / 1000; // essential SDL_GetTicks()
|
||||||
ignore = 0;
|
ignore = 0;
|
||||||
|
|
||||||
|
|
||||||
// TODO: enable key repeat (not supported natively)
|
// TODO: enable key repeat (not supported natively)
|
||||||
while (1) {
|
while (1) {
|
||||||
gettimeofday(&tod, NULL);
|
gettimeofday(&tod, NULL);
|
||||||
now = tod.tv_sec * 1000 + tod.tv_usec / 1000;
|
now = tod.tv_sec * 1000 + tod.tv_usec / 1000;
|
||||||
if ((int)(now-then)>20) ignore = 1; // ignore input that arrived during sleep
|
if (now-then>100) ignore = 1; // ignore input that arrived during sleep
|
||||||
|
|
||||||
for (int i=0; i<INPUT_COUNT; i++) {
|
for (int i=0; i<INPUT_COUNT; i++) {
|
||||||
input = inputs[i];
|
input = inputs[i];
|
||||||
|
|
@ -94,54 +102,53 @@ int main (int argc, char *argv[]) {
|
||||||
if (( ev.type != EV_KEY ) || ( val > REPEAT )) continue;
|
if (( ev.type != EV_KEY ) || ( val > REPEAT )) continue;
|
||||||
switch (ev.code) {
|
switch (ev.code) {
|
||||||
case CODE_MENU:
|
case CODE_MENU:
|
||||||
if ( val != REPEAT ) menu_pressed = val;
|
menu_pressed = val;
|
||||||
break;
|
break;
|
||||||
case CODE_POWER:
|
case CODE_POWER:
|
||||||
if ( val != REPEAT ) power_pressed = val;
|
power_pressed = val;
|
||||||
break;
|
break;
|
||||||
case CODE_VOL_DN:
|
|
||||||
if ( val == REPEAT ) {
|
|
||||||
// Adjust repeat speed to 1/2
|
|
||||||
val = repeat_volume;
|
|
||||||
repeat_volume ^= PRESSED;
|
|
||||||
} else {
|
|
||||||
repeat_volume = 0;
|
|
||||||
}
|
|
||||||
if ( val == PRESSED ) {
|
|
||||||
if (menu_pressed) {
|
|
||||||
val = GetBrightness();
|
|
||||||
if (val>BRIGHTNESS_MIN) SetBrightness(--val);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
val = GetVolume();
|
|
||||||
if (val>VOLUME_MIN) SetVolume(--val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CODE_VOL_UP:
|
case CODE_VOL_UP:
|
||||||
if ( val == REPEAT ) {
|
up_pressed = up_just_pressed = val;
|
||||||
// Adjust repeat speed to 1/2
|
if (val) up_repeat_at = now + 300;
|
||||||
val = repeat_volume;
|
break;
|
||||||
repeat_volume ^= PRESSED;
|
case CODE_VOL_DN:
|
||||||
} else {
|
down_pressed = down_just_pressed = val;
|
||||||
repeat_volume = 0;
|
if (val) down_repeat_at = now + 300;
|
||||||
}
|
break;
|
||||||
if ( val == PRESSED ) {
|
|
||||||
if (menu_pressed) {
|
|
||||||
val = GetBrightness();
|
|
||||||
if (val<BRIGHTNESS_MAX) SetBrightness(++val);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
val = GetVolume();
|
|
||||||
if (val<VOLUME_MAX) SetVolume(++val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (up_just_pressed || (up_pressed && now>=up_repeat_at)) {
|
||||||
|
if (menu_pressed) {
|
||||||
|
val = GetBrightness();
|
||||||
|
if (val<BRIGHTNESS_MAX) SetBrightness(++val);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
val = GetVolume();
|
||||||
|
if (val<VOLUME_MAX) SetVolume(++val);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (up_just_pressed) up_just_pressed = 0;
|
||||||
|
else up_repeat_at += 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (down_just_pressed || (down_pressed && now>=down_repeat_at)) {
|
||||||
|
if (menu_pressed) {
|
||||||
|
val = GetBrightness();
|
||||||
|
if (val>BRIGHTNESS_MIN) SetBrightness(--val);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
val = GetVolume();
|
||||||
|
if (val>VOLUME_MIN) SetVolume(--val);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (down_just_pressed) down_just_pressed = 0;
|
||||||
|
else down_repeat_at += 100;
|
||||||
|
}
|
||||||
|
|
||||||
then = now;
|
then = now;
|
||||||
ignore = 0;
|
ignore = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1422,7 +1422,7 @@ int main (int argc, char *argv[]) {
|
||||||
dirty = 1;
|
dirty = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PAD_justPressed(BTN_VOL_UP) || PAD_justPressed(BTN_VOL_DN) || PAD_justPressed(BTN_MENU)) {
|
if (PAD_justRepeated(BTN_VOL_UP) || PAD_justRepeated(BTN_VOL_DN) || PAD_justPressed(BTN_MENU)) {
|
||||||
setting_start = now;
|
setting_start = now;
|
||||||
if (PAD_isPressed(BTN_MENU)) {
|
if (PAD_isPressed(BTN_MENU)) {
|
||||||
show_setting = 1;
|
show_setting = 1;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue