diff --git a/input.c b/input.c index b4af3f3..510fd50 100644 --- a/input.c +++ b/input.c @@ -19,9 +19,13 @@ typedef struct { uint16_t vid, pid; char led; - char has_map; char last_l, last_r, last_u, last_d; + + char has_map; uint32_t map[32]; + + char has_kbdmap; + uint8_t kbdmap[256]; } devInput; static devInput input[NUMDEV] = {0}; @@ -445,19 +449,20 @@ static int mapping_button; static int mapping_dev; static int mapping_type; static int mapping_count; +static uint8_t mapping_key; void start_map_setting(int cnt) { mapping_button = 0; mapping = 1; mapping_dev = -1; - mapping_type = 1; + mapping_type = cnt ? 1 : 2; mapping_count = cnt; } int get_map_button() { - return mapping_button; + return (mapping_type == 2) ? mapping_key : mapping_button; } int get_map_type() @@ -472,13 +477,28 @@ static char *get_map_name(int dev) return name; } +static char *get_kbdmap_name(int dev) +{ + static char name[128]; + sprintf(name, "kbd_%04x_%04x.map", input[dev].vid, input[dev].pid); + return name; +} + void finish_map_setting(int dismiss) { mapping = 0; if (mapping_dev<0) return; - if(dismiss) input[mapping_dev].has_map = 0; - else FileSaveConfig(get_map_name(mapping_dev), &input[mapping_dev].map, sizeof(input[mapping_dev].map)); + if (mapping_type == 2) + { + if (dismiss) input[mapping_dev].has_kbdmap = 0; + else FileSaveConfig(get_kbdmap_name(mapping_dev), &input[mapping_dev].kbdmap, sizeof(input[mapping_dev].kbdmap)); + } + else + { + if (dismiss) input[mapping_dev].has_map = 0; + else FileSaveConfig(get_map_name(mapping_dev), &input[mapping_dev].map, sizeof(input[mapping_dev].map)); + } } uint16_t get_map_vid() @@ -609,11 +629,12 @@ static void input_cb(struct input_event *ev, int dev) static char keys[6] = { 0,0,0,0,0,0 }; static unsigned char mouse_btn = 0; - // repeat events won'tbe processed + // repeat events won't be processed if (ev->type == EV_KEY && ev->value > 1) return; - int map_skip = (mapping && ev->type == EV_KEY && ev->code == 57 && mapping_dev >= 0 && mapping_type); - int map_cancel = (mapping && ev->type == EV_KEY && ev->code == 1); + int map_skip = (ev->type == EV_KEY && ev->code == 57 && mapping_dev >= 0 && mapping_type==1); + int cancel = (ev->type == EV_KEY && ev->code == 1); + int enter = (ev->type == EV_KEY && ev->code == 28); //mouse switch (ev->type) @@ -654,17 +675,36 @@ static void input_cb(struct input_event *ev, int dev) input[dev].has_map = 1; } - //joystick mapping - if (mapping && (mapping_dev >=0 || ev->value) && !map_cancel) + //mapping + if (mapping && (mapping_dev >=0 || ev->value) && !cancel && !enter) { if (ev->type == EV_KEY) { - if ((mapping_dev < 0) || ((ev->code >= BTN_JOYSTICK) ? mapping_type : !mapping_type)) + if (mapping_type == 2) + { + if (ev->value && ev->code < 256) + { + if(mapping_dev < 0) + { + mapping_dev = dev; + mapping_key = 0; + } + + if (!mapping_key) mapping_key = ev->code; + else + { + input[dev].kbdmap[mapping_key] = ev->code; + mapping_key = 0; + } + } + return; + } + else if ((mapping_dev < 0) || ((ev->code >= 256) ? mapping_type : !mapping_type)) { if (mapping_dev < 0) { mapping_dev = dev; - mapping_type = (ev->code >= BTN_JOYSTICK) ? 1 : 0; + mapping_type = (ev->code >= 256) ? 1 : 0; } if (mapping_dev == dev && mapping_button < mapping_count) @@ -695,10 +735,7 @@ static void input_cb(struct input_event *ev, int dev) if (map_skip && mapping_button < mapping_count) { - if (ev->value == 1) - { - mapping_button++; - } + if (ev->value == 1) mapping_button++; return; } } @@ -709,7 +746,7 @@ static void input_cb(struct input_event *ev, int dev) { case EV_KEY: //joystick buttons, digital directions - if (ev->code >= BTN_JOYSTICK) + if (ev->code >= 256) { if (first_joystick < 0) first_joystick = dev; @@ -751,7 +788,18 @@ static void input_cb(struct input_event *ev, int dev) kbd_toggle = 0; } - int key = (ev->code < (sizeof(ev2usb) / sizeof(ev2usb[0]))) ? ev2usb[ev->code] : NONE; + + if (!input[dev].has_kbdmap) + { + if (!FileLoadConfig(get_kbdmap_name(dev), &input[dev].kbdmap, sizeof(input[dev].kbdmap))) + { + memset(&input[dev].kbdmap, 0, sizeof(input[dev].kbdmap)); + } + input[dev].has_kbdmap = 1; + } + + int key = input[dev].kbdmap[ev->code] ? input[dev].kbdmap[ev->code] : ev->code; + key = (key < (sizeof(ev2usb) / sizeof(ev2usb[0]))) ? ev2usb[key] : NONE; if(key != NONE) { if (key & MODMASK) diff --git a/menu.c b/menu.c index a3c84ee..6872b08 100644 --- a/menu.c +++ b/menu.c @@ -532,6 +532,7 @@ void HandleUI(void) static const char *helptext; static char helpstate = 0; static char drive_num = 0; + static char flag; uint8_t keys[6] = { 0,0,0,0,0,0 }; uint16_t keys_ps2[6] = { 0,0,0,0,0,0 }; @@ -1235,7 +1236,7 @@ void HandleUI(void) { finish_map_setting(menu); menustate = is_menu_core() ? MENU_FIRMWARE1 : MENU_8BIT_SYSTEM1; - menusub = 1; + menusub = is_menu_core() ? 2 : 1; } break; @@ -3198,7 +3199,7 @@ void HandleUI(void) helptext = helptexts[HELPTEXT_NONE]; parentstate = menustate; - OsdSetTitle("FW & Core", 0); + OsdSetTitle(is_menu_core() ? "Settings" : "FW & Core", 0); //OsdWrite(0, "", 0, 0); siprintf(s, " ARM s/w ver. %s", version + 5); OsdWrite(0, "", 0, 0); @@ -3206,7 +3207,7 @@ void HandleUI(void) if (is_menu_core()) { - menumask = 3; + menumask = 7; OsdWrite(2, "", 0, 0); if (getStorage(0)) { @@ -3232,11 +3233,11 @@ void HandleUI(void) OsdWrite(8, " time to initialize", 0, 0); OsdWrite(9, " upon cold boot.", 0, 0); OsdWrite(10, " Use OSD or USER button to", 0, 0); - OsdWrite(11, " cancel USB waiting", 0, 0); - OsdWrite(12, " and use SD instead.", 0, 0); + OsdWrite(11, " cancel USB waiting.", 0, 0); + OsdWrite(12, "", 0, 0); OsdWrite(13, "", 0, 0); - OsdWrite(14, " Define joystick buttons", menusub == 1, 0); - OsdWrite(15, "", 0, 0); + OsdWrite(14, " Remap keyboard", menusub == 1, 0); + OsdWrite(15, " Define joystick buttons", menusub == 2, 0); menustate = MENU_STORAGE; } else @@ -3291,6 +3292,11 @@ void HandleUI(void) } break; case 1: + start_map_setting(0); + menustate = MENU_KBDMAP; + menusub = 0; + break; + case 2: joy_bcount = 1; strcpy(joy_bnames[0], "Select"); start_map_setting(6); @@ -3301,6 +3307,46 @@ void HandleUI(void) } break; + case MENU_KBDMAP: + helptext = 0; + menumask = 1; + OsdSetTitle("Keyboard", 0); + menustate = MENU_KBDMAP1; + parentstate = MENU_KBDMAP; + for (int i = 0; i < OsdGetSize() - 1; i++) OsdWrite(i, "", 0, 0); + OsdWrite(OsdGetSize() - 1, " cancel", menusub == 0, 0); + flag = 0; + break; + + case MENU_KBDMAP1: + if(!get_map_button()) + { + OsdWrite(3, " Press key to remap", 0, 0); + s[0] = 0; + if(flag) + { + sprintf(s, " on keyboard ID: %04x:%04x", get_map_vid(), get_map_pid()); + } + OsdWrite(5, s, 0, 0); + } + else + { + flag = 1; + sprintf(s, " Press key to map %02X to", get_map_button() & 0xFF); + OsdWrite(3, s, 0, 0); + OsdWrite(5, " on any keyboard", 0, 0); + } + + OsdWrite(OsdGetSize() - 1, " finish", menusub == 0, 0); + + if (select || menu) + { + finish_map_setting(menu); + menustate = MENU_FIRMWARE1; + menusub = 1; + } + break; + case MENU_FIRMWARE2: if (menu) { switch (user_io_core_type()) { diff --git a/menu.h b/menu.h index 97f7974..3e0008a 100644 --- a/menu.h +++ b/menu.h @@ -54,6 +54,8 @@ enum MENU MENU_STORAGE, MENU_JOYDIGMAP, MENU_JOYDIGMAP1, + MENU_KBDMAP, + MENU_KBDMAP1, // Mist/atari specific pages MENU_MIST_MAIN1,