static void sdl_pad_disconnect(unsigned id) { settings_t *settings = config_get_ptr(); #ifdef HAVE_SDL2 if (sdl_pads[id].haptic) SDL_HapticClose(sdl_pads[id].haptic); if (sdl_pads[id].controller) { SDL_GameControllerClose(sdl_pads[id].controller); input_config_autoconfigure_disconnect(id, sdl_joypad.ident); } else #endif if (sdl_pads[id].joypad) { SDL_JoystickClose(sdl_pads[id].joypad); input_config_autoconfigure_disconnect(id, sdl_joypad.ident); } settings->input.device_names[id][0] = '\0'; memset(&sdl_pads[id], 0, sizeof(sdl_pads[id])); }
static void iohidmanager_hid_device_remove(void *data, IOReturn result, void* sender) { struct iohidmanager_hid_adapter *adapter = (struct iohidmanager_hid_adapter*)data; iohidmanager_hid_t *hid = (iohidmanager_hid_t*)hid_driver_get_data(); if (hid && adapter && (adapter->slot < MAX_USERS)) { input_config_autoconfigure_disconnect(adapter->slot, adapter->name); hid->buttons[adapter->slot] = 0; memset(hid->axes[adapter->slot], 0, sizeof(hid->axes)); pad_connection_pad_deinit(&hid->slots[adapter->slot], adapter->slot); free(adapter); } }
static void iohidmanager_hid_device_remove(void *data, IOReturn result, void* sender) { driver_t *driver = driver_get_ptr(); cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data; struct iohidmanager_hid_adapter *adapter = (struct iohidmanager_hid_adapter*)data; iohidmanager_hid_t *hid = driver ? (iohidmanager_hid_t*)driver->hid_data : NULL; if (adapter && (adapter->slot < MAX_USERS)) { input_config_autoconfigure_disconnect(adapter->slot, adapter->name); apple->buttons[adapter->slot] = 0; memset(apple->axes[adapter->slot], 0, sizeof(apple->axes)); pad_connection_pad_deinit(&hid->slots[adapter->slot], adapter->slot); free(adapter); } }
static int remove_adapter(void *data, struct libusb_device *dev) { struct libusb_adapter *adapter = (struct libusb_adapter*)&adapters; struct libusb_hid *hid = (struct libusb_hid*)data; while (adapter->next == NULL) return -1; if (adapter->next->device == dev) { struct libusb_adapter *new_next = NULL; const char *name = (const char*)adapter->next->name; input_config_autoconfigure_disconnect(adapter->slot, name); adapter->next->quitting = true; sthread_join(adapter->next->thread); pad_connection_pad_deinit(&hid->slots[adapter->slot], adapter->slot); slock_free(adapter->send_control_lock); fifo_free(adapter->send_control_buffer); libusb_release_interface(adapter->next->handle, adapter->next->interface_number); libusb_close(adapter->next->handle); new_next = adapter->next->next; free(adapter->next); adapter->next = new_next; return 0; } adapter = adapter->next; return -1; }
void removal_cb(void *usrdata) { input_config_autoconfigure_disconnect((int)usrdata, gx_joypad.ident); }
static void handle_plugged_pad(void) { int i, rc; size_t event_size = sizeof(struct inotify_event) + NAME_MAX + 1; uint8_t *event_buf = (uint8_t*)calloc(1, event_size); if (!event_buf) return; while ((rc = read(g_notify, event_buf, event_size)) >= 0) { struct inotify_event *event = NULL; /* Can read multiple events in one read() call. */ for (i = 0; i < rc; i += event->len + sizeof(struct inotify_event)) { unsigned idx; autoconfig_params_t params = {{0}}; event = (struct inotify_event*)&event_buf[i]; if (strstr(event->name, "js") != event->name) continue; idx = strtoul(event->name + 2, NULL, 0); if (idx >= MAX_USERS) continue; if (event->mask & IN_DELETE) { if (linuxraw_pads[idx].fd >= 0) { if (g_hotplug) input_config_autoconfigure_disconnect(idx, linuxraw_pads[idx].ident); close(linuxraw_pads[idx].fd); linuxraw_pads[idx].buttons = 0; memset(linuxraw_pads[idx].axes, 0, sizeof(linuxraw_pads[idx].axes)); linuxraw_pads[idx].fd = -1; *linuxraw_pads[idx].ident = '\0'; /* TODO - implement VID/PID? */ params.idx = idx; input_config_autoconfigure_joypad(¶ms); } } /* Sometimes, device will be created before acess to it is established. */ else if (event->mask & (IN_CREATE | IN_ATTRIB)) { bool ret; char path[PATH_MAX_LENGTH] = {0}; snprintf(path, sizeof(path), "/dev/input/%s", event->name); ret = linuxraw_joypad_init_pad(path, &linuxraw_pads[idx]); if (*linuxraw_pads[idx].ident && ret) { params.idx = idx; strlcpy(params.name, linuxraw_pads[idx].ident, sizeof(params.name)); strlcpy(params.driver, linuxraw_joypad.ident, sizeof(params.driver)); /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(¶ms); } } } } free(event_buf); }
static void ps3_joypad_poll(void) { unsigned port; CellPadInfo2 pad_info; cellPadGetInfo2(&pad_info); for (port = 0; port < MAX_PADS; port++) { CellPadData state_tmp; if (pad_info.port_status[port] & CELL_PAD_STATUS_ASSIGN_CHANGES) { if ( (pad_info.port_status[port] & CELL_PAD_STATUS_CONNECTED) == 0 ) { input_config_autoconfigure_disconnect(port, ps3_joypad.ident); pads_connected[port] = 0; } else if ((pad_info.port_status[port] & CELL_PAD_STATUS_CONNECTED) > 0 ) { pads_connected[port] = 1; ps3_joypad_autodetect_add(port); } } if (pads_connected[port] == 0) continue; cellPadGetData(port, &state_tmp); if (state_tmp.len != 0) { uint64_t *state_cur = &pad_state[port]; *state_cur = 0; #ifdef __PSL1GHT__ *state_cur |= (state_tmp.BTN_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; *state_cur |= (state_tmp.BTN_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; *state_cur |= (state_tmp.BTN_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; *state_cur |= (state_tmp.BTN_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; *state_cur |= (state_tmp.BTN_START) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; *state_cur |= (state_tmp.BTN_R3) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0; *state_cur |= (state_tmp.BTN_L3) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0; *state_cur |= (state_tmp.BTN_SELECT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; *state_cur |= (state_tmp.BTN_TRIANGLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; *state_cur |= (state_tmp.BTN_SQUARE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; *state_cur |= (state_tmp.BTN_CROSS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; *state_cur |= (state_tmp.BTN_CIRCLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; *state_cur |= (state_tmp.BTN_R1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; *state_cur |= (state_tmp.BTN_L1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; *state_cur |= (state_tmp.BTN_R2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; *state_cur |= (state_tmp.BTN_L2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; #else *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_START) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_R3) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_L3) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL1] & CELL_PAD_CTRL_SELECT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_TRIANGLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_SQUARE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL)) { int value = 0; if (cellSysutilGetSystemParamInt(CELL_SYSUTIL_SYSTEMPARAM_ID_ENTER_BUTTON_ASSIGN, &value) == 0) { if (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_CROSS) *state_cur |= (value == CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CROSS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B); if (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_CIRCLE) *state_cur |= (value == CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CIRCLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B); } } else { *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_CROSS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_CIRCLE) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; } *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_R1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_R2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; //RARCH_LOG("lsx : %d (%hd) lsy : %d (%hd) rsx : %d (%hd) rsy : %d (%hd)\n", lsx, ls_x, lsy, ls_y, rsx, rs_x, rsy, rs_y); uint8_t lsx = (uint8_t)(state_tmp.button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X]); uint8_t lsy = (uint8_t)(state_tmp.button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y]); uint8_t rsx = (uint8_t)(state_tmp.button[CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X]); uint8_t rsy = (uint8_t)(state_tmp.button[CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y]); analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT ][RETRO_DEVICE_ID_ANALOG_X] = convert_u8_to_s16(lsx); analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT ][RETRO_DEVICE_ID_ANALOG_Y] = convert_u8_to_s16(lsy); analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_X] = convert_u8_to_s16(rsx); analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_Y] = convert_u8_to_s16(rsy); #if 0 accelerometer_state[port].x = state_tmp.button[CELL_PAD_BTN_OFFSET_SENSOR_X]; accelerometer_state[port].y = state_tmp.button[CELL_PAD_BTN_OFFSET_SENSOR_Y]; accelerometer_state[port].z = state_tmp.button[CELL_PAD_BTN_OFFSET_SENSOR_Z]; #endif #endif } for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) if (analog_state[port][i][j] == -0x8000) analog_state[port][i][j] = -0x7fff; } }