diff --git a/src/common/api.c b/src/common/api.c index 5828c4a..1a843e9 100644 --- a/src/common/api.c +++ b/src/common/api.c @@ -669,7 +669,11 @@ static struct PAD_Context { int is_pressed; int just_pressed; int just_released; + int just_repeated; + int repeat_at[BTN_ID_COUNT]; } pad; +#define PAD_REPEAT_DELAY 300 +#define PAD_REPEAT_INTERVAL 100 void PAD_reset(void) { pad.just_pressed = BTN_NONE; pad.is_pressed = BTN_NONE; @@ -679,42 +683,56 @@ void PAD_poll(void) { // reset transient state pad.just_pressed = BTN_NONE; pad.just_released = BTN_NONE; + pad.just_repeated = BTN_NONE; + + int tick = SDL_GetTicks(); + for (int i=0; i=pad.repeat_at[i])) { + pad.just_repeated |= btn; // set + pad.repeat_at[i] += PAD_REPEAT_INTERVAL; + } + } // the actual poll SDL_Event event; while (SDL_PollEvent(&event)) { int btn = BTN_NONE; + int id = -1; if (event.type==SDL_KEYDOWN || event.type==SDL_KEYUP) { uint8_t code = event.key.keysym.scancode; - if (code==CODE_UP) btn = BTN_UP; - else if (code==CODE_DOWN) btn = BTN_DOWN; - else if (code==CODE_LEFT) btn = BTN_LEFT; - else if (code==CODE_RIGHT) btn = BTN_RIGHT; - else if (code==CODE_A) btn = BTN_A; - else if (code==CODE_B) btn = BTN_B; - else if (code==CODE_X) btn = BTN_X; - else if (code==CODE_Y) btn = BTN_Y; - else if (code==CODE_START) btn = BTN_START; - else if (code==CODE_SELECT) btn = BTN_SELECT; - else if (code==CODE_MENU) btn = BTN_MENU; - else if (code==CODE_L1) btn = BTN_L1; - else if (code==CODE_L2) btn = BTN_L2; - else if (code==CODE_R1) btn = BTN_R1; - else if (code==CODE_R2) btn = BTN_R2; - else if (code==CODE_VOL_UP) btn = BTN_VOL_UP; - else if (code==CODE_VOL_DN) btn = BTN_VOL_DN; - else if (code==CODE_POWER) btn = BTN_POWER; + if (code==CODE_UP) { btn = BTN_UP; id = BTN_ID_UP; } + else if (code==CODE_DOWN) { btn = BTN_DOWN; id = BTN_ID_DOWN; } + else if (code==CODE_LEFT) { btn = BTN_LEFT; id = BTN_ID_LEFT; } + else if (code==CODE_RIGHT) { btn = BTN_RIGHT; id = BTN_ID_RIGHT; } + else if (code==CODE_A) { btn = BTN_A; id = BTN_ID_A; } + else if (code==CODE_B) { btn = BTN_B; id = BTN_ID_B; } + else if (code==CODE_X) { btn = BTN_X; id = BTN_ID_X; } + else if (code==CODE_Y) { btn = BTN_Y; id = BTN_ID_Y; } + else if (code==CODE_START) { btn = BTN_START; id = BTN_ID_START; } + else if (code==CODE_SELECT) { btn = BTN_SELECT; id = BTN_ID_SELECT; } + else if (code==CODE_MENU) { btn = BTN_MENU; id = BTN_ID_MENU; } + else if (code==CODE_L1) { btn = BTN_L1; id = BTN_ID_L1; } + else if (code==CODE_L2) { btn = BTN_L2; id = BTN_ID_L2; } + else if (code==CODE_R1) { btn = BTN_R1; id = BTN_ID_R1; } + else if (code==CODE_R2) { btn = BTN_R2; id = BTN_ID_R2; } + 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; id = BTN_ID_VOL_DN; } + else if (code==CODE_POWER) { btn = BTN_POWER; id = BTN_ID_POWER; } } if (btn==BTN_NONE) continue; if (event.type==SDL_KEYUP) { - pad.is_pressed &= ~btn; // unset - pad.just_released |= btn; // set + pad.is_pressed &= ~btn; // unset + pad.just_repeated &= ~btn; // unset + pad.just_released |= btn; // set } else if ((pad.is_pressed & btn)==BTN_NONE) { - pad.just_pressed |= btn; // set - pad.is_pressed |= btn; // set + pad.just_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_isPressed(int btn) { return pad.is_pressed & 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 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 - - // 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; + return MIN(MAX(0, i-320), 100); // TODO: smooth this value before returning ala Mini } \ No newline at end of file diff --git a/src/common/api.h b/src/common/api.h index 885e0ff..f755da3 100644 --- a/src/common/api.h +++ b/src/common/api.h @@ -5,11 +5,6 @@ /////////////////////////////// -// TODO: tmp -#define PAD_justRepeated PAD_justPressed - -/////////////////////////////// - enum { LOG_DEBUG = 0, 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 { BTN_NONE = 0, - BTN_UP = 1 << 0, - BTN_DOWN = 1 << 1, - BTN_LEFT = 1 << 2, - BTN_RIGHT = 1 << 3, - BTN_A = 1 << 4, - BTN_B = 1 << 5, - BTN_X = 1 << 6, - BTN_Y = 1 << 7, - BTN_START = 1 << 8, - BTN_SELECT = 1 << 9, - BTN_L1 = 1 << 10, - BTN_R1 = 1 << 11, - BTN_L2 = 1 << 12, - BTN_R2 = 1 << 13, - BTN_MENU = 1 << 14, - BTN_VOL_UP = 1 << 15, - BTN_VOL_DN = 1 << 16, - BTN_POWER = 1 << 17, + BTN_UP = 1 << BTN_ID_UP, + BTN_DOWN = 1 << BTN_ID_DOWN, + BTN_LEFT = 1 << BTN_ID_LEFT, + BTN_RIGHT = 1 << BTN_ID_RIGHT, + BTN_A = 1 << BTN_ID_A, + BTN_B = 1 << BTN_ID_B, + BTN_X = 1 << BTN_ID_X, + BTN_Y = 1 << BTN_ID_Y, + BTN_START = 1 << BTN_ID_START, + BTN_SELECT = 1 << BTN_ID_SELECT, + BTN_L1 = 1 << BTN_ID_L1, + BTN_R1 = 1 << BTN_ID_R1, + BTN_L2 = 1 << BTN_ID_L2, + BTN_R2 = 1 << BTN_ID_R2, + BTN_MENU = 1 << BTN_ID_MENU, + BTN_VOL_UP = 1 << BTN_ID_VOL_UP, + BTN_VOL_DN = 1 << BTN_ID_VOL_DN, + BTN_POWER = 1 << BTN_ID_POWER, }; // 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_isPressed(int btn); int PAD_justReleased(int btn); +int PAD_justRepeated(int btn); /////////////////////////////// diff --git a/src/keymon/keymon.c b/src/keymon/keymon.c index f1bc762..0031fec 100644 --- a/src/keymon/keymon.c +++ b/src/keymon/keymon.c @@ -69,22 +69,30 @@ int main (int argc, char *argv[]) { uint32_t val; uint32_t menu_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; - uint64_t then; - uint64_t now; + uint32_t then; + uint32_t now; struct timeval tod; 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; + // TODO: enable key repeat (not supported natively) while (1) { gettimeofday(&tod, NULL); 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 REPEAT )) continue; switch (ev.code) { case CODE_MENU: - if ( val != REPEAT ) menu_pressed = val; - break; + menu_pressed = val; + break; case CODE_POWER: - if ( val != REPEAT ) power_pressed = val; - 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; + power_pressed = val; + break; case CODE_VOL_UP: - 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=up_repeat_at)) { + if (menu_pressed) { + val = GetBrightness(); + if (val=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; ignore = 0; diff --git a/src/minui/main.c b/src/minui/main.c index 3c29c1b..15cdb0c 100644 --- a/src/minui/main.c +++ b/src/minui/main.c @@ -1422,7 +1422,7 @@ int main (int argc, char *argv[]) { 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; if (PAD_isPressed(BTN_MENU)) { show_setting = 1;