From 680fdab13d30ad38d7ccf9733c80b41135bb49ce Mon Sep 17 00:00:00 2001 From: sorgelig Date: Fri, 7 Jul 2017 20:03:34 +0800 Subject: [PATCH] Fixes and improvements in joystick code. --- input.c | 6 ++-- menu.c | 4 +-- user_io.c | 87 ++++++++++++++++++++++++++++++++++++------------------- 3 files changed, 63 insertions(+), 34 deletions(-) diff --git a/input.c b/input.c index 5c596b7..3a9f017 100644 --- a/input.c +++ b/input.c @@ -546,8 +546,8 @@ static void joy_digital(int num, uint16_t mask, char press, int bnum) } else { - if (press) joy[num] |= (char)mask; - else joy[num] &= ~(char)mask; + if (press) joy[num] |= mask; + else joy[num] &= ~mask; user_io_digital_joystick(num, joy[num]); } } @@ -697,7 +697,7 @@ static void input_cb(struct input_event *ev, int dev) { if (ev->code == input[dev].map[i]) { - joy_digital((user_io_get_kbdemu() != EMU_JOY0) ? 0 : 1, 1 << i, ev->value, i); + joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 1 << i, ev->value, i); return; } } diff --git a/menu.c b/menu.c index 927eb79..cf6b328 100644 --- a/menu.c +++ b/menu.c @@ -948,12 +948,12 @@ void HandleUI(void) for (int n = 0; n < 12; n++) { substrcpy(joy_bnames[n], p, n+1); - printf("joy_bname = %s\n", joy_bnames[n]); + //printf("joy_bname = %s\n", joy_bnames[n]); if(!joy_bnames[n][0]) break; joy_bcount++; } - printf("joy_bcount = %d\n", joy_bcount); + //printf("joy_bcount = %d\n", joy_bcount); } i++; diff --git a/user_io.c b/user_io.c index 8106353..23e7ce0 100644 --- a/user_io.c +++ b/user_io.c @@ -159,6 +159,59 @@ static void user_io_read_core_name() iprintf("Core name is \"%s\"\n", core_name); } +static void set_kbd_led(unsigned char led, bool on) +{ + if (led & HID_LED_CAPS_LOCK) + { + if (!(keyboard_leds & KBD_LED_CAPS_CONTROL)) set_kbdled(led, on); + caps_status = on; + } + + if (led & HID_LED_NUM_LOCK) + { + if (!(keyboard_leds & KBD_LED_NUM_CONTROL)) set_kbdled(led, on); + num_status = on; + } + + if (led & HID_LED_SCROLL_LOCK) + { + if (!(keyboard_leds & KBD_LED_SCRL_CONTROL)) set_kbdled(led, on); + scrl_status = on; + } +} + +static int joy_force = 0; + +static void parse_config() +{ + // check if core has a config string + core_type_8bit_with_config_string = (user_io_8bit_get_string(0) != NULL); + + // set core name. This currently only sets a name for the 8 bit cores + user_io_read_core_name(); + + joy_force = 0; + if (core_type_8bit_with_config_string) + { + int i = 2; + char *p; + do { + p = user_io_8bit_get_string(i); + printf("*** %d: %s\n", i, p); + if (i && p && p[0]) + { + if (p[0] == 'J' && p[1] == '1') + { + joy_force = 1; + emu_mode = EMU_JOY0; + set_kbd_led(HID_LED_NUM_LOCK, true); + } + } + i++; + } while (p); + } +} + void user_io_detect_core_type() { char *name; @@ -218,11 +271,7 @@ void user_io_detect_core_type() // SD card implementation user_io_sd_set_config(); - // check if core has a config string - core_type_8bit_with_config_string = (user_io_8bit_get_string(0) != NULL); - - // set core name. This currently only sets a name for the 8 bit cores - user_io_read_core_name(); + parse_config(); // send a reset user_io_8bit_set_status(UIO_STATUS_RESET, UIO_STATUS_RESET); @@ -777,27 +826,6 @@ void user_io_send_buttons(char force) } } -static void set_kbd_led(unsigned char led, bool on) -{ - if (led & HID_LED_CAPS_LOCK) - { - if (!(keyboard_leds & KBD_LED_CAPS_CONTROL)) set_kbdled(led, on); - caps_status = on; - } - - if (led & HID_LED_NUM_LOCK) - { - if (!(keyboard_leds & KBD_LED_NUM_CONTROL)) set_kbdled(led, on); - num_status = on; - } - - if (led & HID_LED_SCROLL_LOCK) - { - if (!(keyboard_leds & KBD_LED_SCRL_CONTROL)) set_kbdled(led, on); - scrl_status = on; - } -} - uint32_t diskled_timer = 0; uint32_t diskled_is_on = 0; void __inline diskled_on() @@ -1862,7 +1890,7 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned switch (code ^ NUM_LOCK_TOGGLE) { case 1: - emu_mode = EMU_MOUSE; + if(!joy_force) emu_mode = EMU_MOUSE; break; case 2: @@ -1874,11 +1902,12 @@ void user_io_kbd(unsigned char m, unsigned char *k, unsigned short vid, unsigned break; case 4: - emu_mode = EMU_NONE; + if (!joy_force) emu_mode = EMU_NONE; break; default: - emu_mode = (emu_mode + 1) & 3; + if (joy_force) emu_mode = (emu_mode == EMU_JOY0) ? EMU_JOY1 : EMU_JOY0; + else emu_mode = (emu_mode + 1) & 3; break; } if(emu_mode == EMU_MOUSE || emu_mode == EMU_JOY0) set_kbd_led(HID_LED_NUM_LOCK, true);