From 5b668ae4217a9fe2502972d41327982bd6aa445f Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Fri, 10 Apr 2020 13:37:32 +0200 Subject: [PATCH] Implement psl1ght keyboard --- input/drivers/psl1ght_input.c | 142 +++++++++++++++++++++++++++++++++- input/input_keymaps.c | 132 +++++++++++++++++++++++++++++++ 2 files changed, 273 insertions(+), 1 deletion(-) diff --git a/input/drivers/psl1ght_input.c b/input/drivers/psl1ght_input.c index 9be9de07a4..9e0f84585c 100644 --- a/input/drivers/psl1ght_input.c +++ b/input/drivers/psl1ght_input.c @@ -55,14 +55,85 @@ typedef struct ps3_input unsigned mice_connected; #endif const input_device_driver_t *joypad; + KbInfo kbinfo; + KbData kbdata[MAX_KB_PORT_NUM]; + int connected[MAX_KB_PORT_NUM]; } ps3_input_t; +static void connect_keyboard(ps3_input_t *ps3, int port) +{ + ioKbSetCodeType(port, KB_CODETYPE_RAW); + ioKbSetReadMode(port, KB_RMODE_INPUTCHAR); + ps3->connected[port] = 1; +} + +static void disconnect_keyboard(ps3_input_t *ps3, int port) +{ + ps3->connected[port] = 0; +} + static void ps3_input_poll(void *data) { ps3_input_t *ps3 = (ps3_input_t*)data; + KbData last_kbdata[MAX_KB_PORT_NUM]; if (ps3 && ps3->joypad) ps3->joypad->poll(); + + ioKbGetInfo(&ps3->kbinfo); + for (int i = 0; i < MAX_KB_PORT_NUM; i++) { + if(ps3->kbinfo.status[i] && !ps3->connected[i]) + connect_keyboard(ps3, i); +// if(!ps3->kbinfo.status[i] && ps3->connected[i]) +// disconnect_keyboard(ps3, i); + } + + memcpy(last_kbdata, ps3->kbdata, sizeof(last_kbdata)); + for (int i = 0; i < MAX_KB_PORT_NUM; i++) { + if(ps3->kbinfo.status[i]) + ioKbRead(i, &ps3->kbdata[i]); + } + + for (int i = 0; i < MAX_KB_PORT_NUM; i++) { + /* Set keyboard modifier based on shift,ctrl and alt state */ + uint16_t mod = 0; + + if (ps3->kbdata[i].mkey._KbMkeyU._KbMkeyS.l_alt || ps3->kbdata[i].mkey._KbMkeyU._KbMkeyS.r_alt) + mod |= RETROKMOD_ALT; + if (ps3->kbdata[i].mkey._KbMkeyU._KbMkeyS.l_ctrl || ps3->kbdata[i].mkey._KbMkeyU._KbMkeyS.r_ctrl) + mod |= RETROKMOD_CTRL; + if (ps3->kbdata[i].mkey._KbMkeyU._KbMkeyS.l_shift || ps3->kbdata[i].mkey._KbMkeyU._KbMkeyS.r_shift) + mod |= RETROKMOD_SHIFT; + /* TODO: windows keys. */ + + for (int j = 0; j < last_kbdata[i].nb_keycode; j++) { + int code = last_kbdata[i].keycode[j]; + int newly_depressed = 1; + for (int k = 0; k < MAX_KB_PORT_NUM; i++) + if (ps3->kbdata[i].keycode[k] == code) { + newly_depressed = 0; + break; + } + if (newly_depressed) { + unsigned keyboardcode = input_keymaps_translate_keysym_to_rk(code); + input_keyboard_event(false, keyboardcode, keyboardcode, mod, RETRO_DEVICE_KEYBOARD); + } + } + + for (int j = 0; j < ps3->kbdata[i].nb_keycode; j++) { + int code = ps3->kbdata[i].keycode[j]; + int newly_pressed = 1; + for (int k = 0; k < MAX_KB_PORT_NUM; i++) + if (last_kbdata[i].keycode[k] == code) { + newly_pressed = 0; + break; + } + if (newly_pressed) { + unsigned keyboardcode = input_keymaps_translate_keysym_to_rk(code); + input_keyboard_event(true, keyboardcode, keyboardcode, mod, RETRO_DEVICE_KEYBOARD); + } + } + } } #ifdef HAVE_MOUSE @@ -74,6 +145,46 @@ static int16_t ps3_mouse_device_state(ps3_input_t *ps3, #endif +static int mod_table[] = { + RETROK_RSUPER, + RETROK_RALT, + RETROK_RSHIFT, + RETROK_RCTRL, + RETROK_LSUPER, + RETROK_LALT, + RETROK_LSHIFT, + RETROK_LCTRL +}; + +static bool +psl1ght_keyboard_port_input_pressed(ps3_input_t *ps3, unsigned id) +{ + if (id >= RETROK_LAST || id == 0) + return false; + for (int i = 0; i < 8; i++) { + if (id == mod_table[i]) { + for (int j = 0; j < MAX_KB_PORT_NUM; j++) { + if(ps3->kbinfo.status[j] && (ps3->kbdata[j].mkey._KbMkeyU.mkeys & + (1 << i))) + return true; + } + return false; + } + } + + int code = rarch_keysym_lut[id]; + if (code == 0) + return false; + for (int i = 0; i < MAX_KB_PORT_NUM; i++) { + if(ps3->kbinfo.status[i]) + for (int j = 0; j < ps3->kbdata[i].nb_keycode; j++) { + if (ps3->kbdata[i].keycode[j] == code) + return true; + } + } + return false; +} + static int16_t ps3_input_state(void *data, rarch_joypad_info_t *joypad_info, const struct retro_keybind **binds, @@ -112,6 +223,9 @@ static int16_t ps3_input_state(void *data, ret |= (1 << i); continue; } + else if (psl1ght_keyboard_port_input_pressed(ps3, binds[port][i].key)) + ret |= (1 << i); + } return ret; @@ -129,12 +243,16 @@ static int16_t ps3_input_state(void *data, return true; if (((float)abs(ps3->joypad->axis(joypad_info->joy_idx, joyaxis)) / 0x8000) > joypad_info->axis_threshold) return true; + if (psl1ght_keyboard_port_input_pressed(ps3, binds[port][id].key)) + return true; } break; case RETRO_DEVICE_ANALOG: if (binds[port]) return input_joypad_analog(ps3->joypad, joypad_info, port, idx, id, binds[port]); break; + case RETRO_DEVICE_KEYBOARD: + return (psl1ght_keyboard_port_input_pressed(ps3, id)); } return 0; @@ -142,7 +260,8 @@ static int16_t ps3_input_state(void *data, static void ps3_input_free_input(void *data) { - RARCH_LOG("alive " __FILE__ ":%d\n", __LINE__); + ioPadEnd(); + ioKbEnd(); } static void* ps3_input_init(const char *joypad_driver) @@ -156,6 +275,26 @@ static void* ps3_input_init(const char *joypad_driver) if (ps3->joypad) ps3->joypad->init(ps3); + /* Keyboard */ + + input_keymaps_init_keyboard_lut(rarch_key_map_psl1ght); + + int status; + + status = ioKbInit(MAX_KB_PORT_NUM); + RARCH_LOG("Calling ioKbInit(%d) returned %d\r\n", MAX_KB_PORT_NUM, status); + + status = ioKbGetInfo(&ps3->kbinfo); + RARCH_LOG("Calling ioKbGetInfo() returned %d\r\n", status); + + RARCH_LOG("KbInfo:\r\nMax Kbs: %u\r\nConnected Kbs: %u\r\nInfo Field: %08x\r\n", ps3->kbinfo.max, ps3->kbinfo.connected, ps3->kbinfo.info); + + for (int i = 0; i < MAX_KB_PORT_NUM; i++) { + if(ps3->kbinfo.status[i]) { + connect_keyboard(ps3, i); + } + } + return ps3; } @@ -166,6 +305,7 @@ static uint64_t ps3_input_get_capabilities(void *data) #ifdef HAVE_MOUSE (1 << RETRO_DEVICE_MOUSE) | #endif + (1 << RETRO_DEVICE_KEYBOARD) | (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG); } diff --git a/input/input_keymaps.c b/input/input_keymaps.c index 1c34778b70..ca8ffaefa5 100644 --- a/input/input_keymaps.c +++ b/input/input_keymaps.c @@ -41,6 +41,10 @@ #include #endif +#ifdef __PSL1GHT__ +#include +#endif + #if defined(HAVE_SDL) || defined(HAVE_SDL2) #include "SDL.h" #endif @@ -1649,6 +1653,134 @@ const struct rarch_key_map rarch_key_map_dos[] = { }; #endif +#ifdef __PSL1GHT__ +const struct rarch_key_map rarch_key_map_psl1ght[] = { + { KB_RAWKEY_A, RETROK_a }, + { KB_RAWKEY_B, RETROK_b }, + { KB_RAWKEY_C, RETROK_c }, + { KB_RAWKEY_D, RETROK_d }, + { KB_RAWKEY_E, RETROK_e }, + { KB_RAWKEY_F, RETROK_f }, + { KB_RAWKEY_G, RETROK_g }, + { KB_RAWKEY_H, RETROK_h }, + { KB_RAWKEY_I, RETROK_i }, + { KB_RAWKEY_J, RETROK_j }, + { KB_RAWKEY_K, RETROK_k }, + { KB_RAWKEY_L, RETROK_l }, + { KB_RAWKEY_M, RETROK_m }, + { KB_RAWKEY_N, RETROK_n }, + { KB_RAWKEY_O, RETROK_o }, + { KB_RAWKEY_P, RETROK_p }, + { KB_RAWKEY_Q, RETROK_q }, + { KB_RAWKEY_R, RETROK_r }, + { KB_RAWKEY_S, RETROK_s }, + { KB_RAWKEY_T, RETROK_t }, + { KB_RAWKEY_U, RETROK_u }, + { KB_RAWKEY_V, RETROK_v }, + { KB_RAWKEY_W, RETROK_w }, + { KB_RAWKEY_X, RETROK_x }, + { KB_RAWKEY_Y, RETROK_y }, + { KB_RAWKEY_Z, RETROK_z }, + { KB_RAWKEY_BS, RETROK_BACKSPACE }, + { KB_RAWKEY_TAB, RETROK_TAB }, + { KB_RAWKEY_ENTER, RETROK_RETURN }, + { KB_RAWKEY_PAUSE, RETROK_PAUSE }, + { KB_RAWKEY_ESCAPE, RETROK_ESCAPE }, + { KB_RAWKEY_SPACE, RETROK_SPACE }, + { KB_RAWKEY_QUOTATION_101, RETROK_QUOTE }, + { KB_RAWKEY_COMMA, RETROK_COMMA }, + { KB_RAWKEY_MINUS, RETROK_MINUS }, + { KB_RAWKEY_PERIOD, RETROK_PERIOD }, + { KB_RAWKEY_SLASH, RETROK_SLASH }, + { KB_RAWKEY_0, RETROK_0 }, + { KB_RAWKEY_1, RETROK_1 }, + { KB_RAWKEY_2, RETROK_2 }, + { KB_RAWKEY_3, RETROK_3 }, + { KB_RAWKEY_4, RETROK_4 }, + { KB_RAWKEY_5, RETROK_5 }, + { KB_RAWKEY_6, RETROK_6 }, + { KB_RAWKEY_7, RETROK_7 }, + { KB_RAWKEY_8, RETROK_8 }, + { KB_RAWKEY_9, RETROK_9 }, + { KB_RAWKEY_SEMICOLON, RETROK_SEMICOLON }, + { KB_RAWKEY_EQUAL_101, RETROK_EQUALS }, + { KB_RAWKEY_LEFT_BRACKET_101, RETROK_LEFTBRACKET }, + { KB_RAWKEY_BACKSLASH_101, RETROK_BACKSLASH }, + { KB_RAWKEY_RIGHT_BRACKET_101, RETROK_RIGHTBRACKET }, + { KB_RAWKEY_DELETE, RETROK_DELETE }, + { KB_RAWKEY_KPAD_0, RETROK_KP0 }, + { KB_RAWKEY_KPAD_1, RETROK_KP1 }, + { KB_RAWKEY_KPAD_2, RETROK_KP2 }, + { KB_RAWKEY_KPAD_3, RETROK_KP3 }, + { KB_RAWKEY_KPAD_4, RETROK_KP4 }, + { KB_RAWKEY_KPAD_5, RETROK_KP5 }, + { KB_RAWKEY_KPAD_6, RETROK_KP6 }, + { KB_RAWKEY_KPAD_7, RETROK_KP7 }, + { KB_RAWKEY_KPAD_8, RETROK_KP8 }, + { KB_RAWKEY_KPAD_9, RETROK_KP9 }, + { KB_RAWKEY_KPAD_PERIOD, RETROK_KP_PERIOD }, + { KB_RAWKEY_KPAD_SLASH, RETROK_KP_DIVIDE }, + { KB_RAWKEY_KPAD_ASTERISK, RETROK_KP_MULTIPLY }, + { KB_RAWKEY_KPAD_MINUS, RETROK_KP_MINUS }, + { KB_RAWKEY_KPAD_PLUS, RETROK_KP_PLUS }, + { KB_RAWKEY_KPAD_ENTER, RETROK_KP_ENTER }, + { KB_RAWKEY_UP_ARROW, RETROK_UP }, + { KB_RAWKEY_DOWN_ARROW, RETROK_DOWN }, + { KB_RAWKEY_RIGHT_ARROW, RETROK_RIGHT }, + { KB_RAWKEY_LEFT_ARROW, RETROK_LEFT }, + { KB_RAWKEY_INSERT, RETROK_INSERT }, + { KB_RAWKEY_HOME, RETROK_HOME }, + { KB_RAWKEY_END, RETROK_END }, + { KB_RAWKEY_PAGE_UP, RETROK_PAGEUP }, + { KB_RAWKEY_PAGE_DOWN, RETROK_PAGEDOWN }, + { KB_RAWKEY_F1, RETROK_F1 }, + { KB_RAWKEY_F2, RETROK_F2 }, + { KB_RAWKEY_F3, RETROK_F3 }, + { KB_RAWKEY_F4, RETROK_F4 }, + { KB_RAWKEY_F5, RETROK_F5 }, + { KB_RAWKEY_F6, RETROK_F6 }, + { KB_RAWKEY_F7, RETROK_F7 }, + { KB_RAWKEY_F8, RETROK_F8 }, + { KB_RAWKEY_F9, RETROK_F9 }, + { KB_RAWKEY_F10, RETROK_F10 }, + { KB_RAWKEY_F11, RETROK_F11 }, + { KB_RAWKEY_F12, RETROK_F12 }, + { KB_RAWKEY_KPAD_NUMLOCK, RETROK_NUMLOCK }, + { KB_RAWKEY_CAPS_LOCK, RETROK_CAPSLOCK }, + { KB_RAWKEY_SCROLL_LOCK, RETROK_SCROLLOCK }, + { KB_RAWKEY_PAUSE, RETROK_BREAK }, + + /* + { KB_RAWKEY_HASHTILDE, RETROK_HASH }, + { KB_RAWKEY_KPLEFTPAREN, RETROK_LEFTPAREN }, + { KB_RAWKEY_KPRIGHTPAREN, RETROK_RIGHTPAREN }, + { KB_RAWKEY_LEFTMETA, RETROK_LMETA }, + { KB_RAWKEY_RIGHTMETA, RETROK_RMETA }, + { KB_RAWKEY_COMPOSE, RETROK_COMPOSE }, + { KB_RAWKEY_HELP, RETROK_HELP }, + { KB_RAWKEY_POWER, RETROK_POWER }, + { KB_RAWKEY_UNDO, RETROK_UNDO }, + { KB_RAWKEY_KPAD_EQUAL, RETROK_KP_EQUALS }, + + KB_RAWKEY_PRINTSCREEN + KB_RAWKEY_APPLICATION + + KB_RAWKEY_106_KANJI + KB_RAWKEY_KANA + KB_RAWKEY_HENKAN + KB_RAWKEY_MUHENKAN + KB_RAWKEY_ACCENT_CIRCONFLEX_106 + KB_RAWKEY_ATMARK_106 + KB_RAWKEY_LEFT_BRACKET_106 + KB_RAWKEY_RIGHT_BRACKET_106 + KB_RAWKEY_COLON_106 + KB_RAWKEY_BACKSLASH_106 + KB_RAWKEY_YEN_106 */ + + { 0, RETROK_UNKNOWN } +}; +#endif + #if defined(_WIN32) && _WIN32_WINNT >= 0x0501 && !defined(__WINRT__) const struct rarch_key_map rarch_key_map_winraw[] = { { VK_BACK, RETROK_BACKSPACE },