X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=gp2x%2Fin_gp2x.c;h=213b3d4ac8a16f210ff70aa5d06517be897f1faf;hb=82abf46f3db8ade517881c03327bdbc0de848eb2;hp=489bbf7dc8d86a206aa9d2a8ce74bda79f71b144;hpb=13b692eb4ee66fd0c7d4d45bdead750a4defa90e;p=libpicofe.git diff --git a/gp2x/in_gp2x.c b/gp2x/in_gp2x.c index 489bbf7..213b3d4 100644 --- a/gp2x/in_gp2x.c +++ b/gp2x/in_gp2x.c @@ -1,13 +1,17 @@ #include #include -#include "../common/common.h" #include "../common/input.h" #include "in_gp2x.h" #define IN_PREFIX "gp2x:" #define IN_GP2X_NBUTTONS 32 +/* note: in_gp2x hadles combos (if 2 btns have the same bind, + * both must be pressed for action to happen) */ +static int in_gp2x_combo_keys = 0; +static int in_gp2x_combo_acts = 0; + extern volatile unsigned short *gp2x_memregs; /* from minimal library rlyeh */ enum { BTN_UP = 0, BTN_LEFT = 2, BTN_DOWN = 4, BTN_RIGHT = 6, @@ -28,7 +32,7 @@ static const char * const in_gp2x_keys[IN_GP2X_NBUTTONS] = { static void in_gp2x_probe(void) { - in_register(IN_PREFIX "GP2X pad", IN_DRVID_GP2X, -1, (void *)1); + in_register(IN_PREFIX "GP2X pad", IN_DRVID_GP2X, -1, (void *)1, 1); } static int in_gp2x_get_bind_count(void) @@ -59,14 +63,17 @@ static int in_gp2x_get_gpio_bits(void) /* returns bitfield of binds of pressed buttons */ int in_gp2x_update(void *drv_data, int *binds) { - int i, value, ret = 0; + int i, keys, ret = 0; + + keys = in_gp2x_get_gpio_bits(); - value = in_gp2x_get_gpio_bits(); + if (keys & in_gp2x_combo_keys) + return in_combos_do(keys, binds, BTN_PUSH, in_gp2x_combo_keys, in_gp2x_combo_acts); - for (i = 0; value; i++) { - if (value & 1) + for (i = 0; keys; i++) { + if (keys & 1) ret |= binds[i]; - value >>= 1; + keys >>= 1; } return ret; @@ -94,18 +101,45 @@ int in_gp2x_update_keycode(void *data, int *is_down) return i; } +static const struct { + short key; + short pbtn; +} key_pbtn_map[] = +{ + { BTN_UP, PBTN_UP }, + { BTN_DOWN, PBTN_DOWN }, + { BTN_LEFT, PBTN_LEFT }, + { BTN_RIGHT, PBTN_RIGHT }, + { BTN_B, PBTN_MOK }, + { BTN_X, PBTN_MBACK }, + { BTN_A, PBTN_MA2 }, + { BTN_Y, PBTN_MA3 }, + { BTN_L, PBTN_L }, + { BTN_R, PBTN_R }, + { BTN_SELECT, PBTN_MENU }, +}; + +#define KEY_PBTN_MAP_SIZE (sizeof(key_pbtn_map) / sizeof(key_pbtn_map[0])) + static int in_gp2x_menu_translate(int keycode) { - switch (keycode) { - case BTN_UP: return PBTN_UP; - case BTN_LEFT: return PBTN_LEFT; - case BTN_DOWN: return PBTN_DOWN; - case BTN_RIGHT: return PBTN_RIGHT; - case BTN_B: return PBTN_MOK; - case BTN_X: return PBTN_MBACK; - case BTN_START: return PBTN_MENU; - default: return 0; + int i; + if (keycode < 0) + { + /* menu -> kc */ + keycode = -keycode; + for (i = 0; i < KEY_PBTN_MAP_SIZE; i++) + if (key_pbtn_map[i].pbtn == keycode) + return key_pbtn_map[i].key; } + else + { + for (i = 0; i < KEY_PBTN_MAP_SIZE; i++) + if (key_pbtn_map[i].key == keycode) + return key_pbtn_map[i].pbtn; + } + + return 0; } static int in_gp2x_get_key_code(const char *key_name) @@ -146,6 +180,12 @@ static const struct { { BTN_B, 5 }, /* C */ { BTN_A, 6 }, /* A */ { BTN_START, 7 }, + { BTN_SELECT, 23 }, /* menu */ + { BTN_Y, 26 }, /* switch rend */ + { BTN_L, 27 }, /* save state */ + { BTN_R, 28 }, /* load state */ + { BTN_VOL_UP, 29 }, /* vol up */ + { BTN_VOL_DOWN, 30 }, /* vol down */ }; #define DEF_BIND_COUNT (sizeof(in_gp2x_def_binds) / sizeof(in_gp2x_def_binds[0])) @@ -161,15 +201,31 @@ static void in_gp2x_get_def_binds(int *binds) /* remove binds of missing keys, count remaining ones */ static int in_gp2x_clean_binds(void *drv_data, int *binds) { - int i, count = 0; + int i, count = 0, have_vol = 0, have_menu = 0; for (i = 0; i < IN_GP2X_NBUTTONS; i++) { if (in_gp2x_keys[i] == NULL) binds[i] = binds[i + IN_GP2X_NBUTTONS] = 0; - if (binds[i]) + if (binds[i]) { count++; + if (binds[i] & ((1 << 29)|(1 << 30))) + have_vol = 1; + if (binds[i] & (1 << 23)) + have_menu = 1; + } + } + + /* autobind some important keys, if they are unbound */ + if (!have_vol && binds[BTN_VOL_UP] == 0 && binds[BTN_VOL_DOWN] == 0) { + binds[BTN_VOL_UP] = 1 << 29; + binds[BTN_VOL_DOWN] = 1 << 30; } + if (!have_menu && binds[BTN_SELECT] == 0) + binds[BTN_SELECT] = 1 << 23; + + in_combos_find(binds, BTN_PUSH, &in_gp2x_combo_keys, &in_gp2x_combo_acts); + return count; } @@ -178,6 +234,8 @@ void in_gp2x_init(void *vdrv) { in_drv_t *drv = vdrv; + in_gp2x_combo_keys = in_gp2x_combo_acts = 0; + drv->prefix = in_gp2x_prefix; drv->probe = in_gp2x_probe; drv->get_bind_count = in_gp2x_get_bind_count;