diff --git a/user_program/usb4vc_gamepads.py b/user_program/usb4vc_gamepads.py index 455391c..fb26986 100644 --- a/user_program/usb4vc_gamepads.py +++ b/user_program/usb4vc_gamepads.py @@ -1,16 +1,23 @@ +GAMEPAD_TYPE_XBOX = 'Xbox' +GAMEPAD_TYPE_PS4_GEN1 = "DualShock 4 [CUH-ZCT1x]" +GAMEPAD_TYPE_PS4_GEN2 = "DualShock 4 [CUH-ZCT2x]" +GAMEPAD_TYPE_PS5_GEN1 = "DualSense wireless controller" +GAMEPAD_TYPE_SWITCH_PRO = "Switch Pro Controller" +GAMEPAD_TYPE_UNKNOWN = "Generic" + def gamepad_type_lookup(vendor_id, product_id): # https://the-sz.com/products/usbid/index.php?v=0x54c&p=&n= if vendor_id == 0x054c and product_id == 0x09cc: - return "DualShock 4 [CUH-ZCT2x]" + return GAMEPAD_TYPE_PS4_GEN2 if vendor_id == 0x054c and product_id == 0x05c4: - return "DualShock 4 [CUH-ZCT1x]" + return GAMEPAD_TYPE_PS4_GEN1 if vendor_id == 0x054c and product_id == 0x0ce6: - return "DualSense wireless controller" + return GAMEPAD_TYPE_PS5_GEN1 if vendor_id == 0x057e and product_id == 0x2009: - return "Switch Pro Controller" + return GAMEPAD_TYPE_SWITCH_PRO if vendor_id == 0x045e: - return "Xbox" - return "Generic" + return GAMEPAD_TYPE_XBOX + return GAMEPAD_TYPE_UNKNOWN ABS_Z = 0x02 ABS_RX = 0x03 diff --git a/user_program/usb4vc_usb_scan.py b/user_program/usb4vc_usb_scan.py index 505254b..173b59f 100644 --- a/user_program/usb4vc_usb_scan.py +++ b/user_program/usb4vc_usb_scan.py @@ -472,6 +472,12 @@ def xbname_to_ev_codename(xb_btn): return None return usb4vc_shared.code_name_to_value_lookup[ev_name][0] +def ps5name_to_ev_codename(ps5_btn): + ev_name = usb4vc_gamepads.ps5_to_linux_ev_code_dict.get(ps5_btn) + if ev_name is None: + return None + return usb4vc_shared.code_name_to_value_lookup[ev_name][0] + xbox_to_generic_dict = { xbname_to_ev_codename('XB_A'):'FACE_BUTTON_SOUTH', xbname_to_ev_codename('XB_B'):'FACE_BUTTON_EAST', @@ -486,11 +492,29 @@ xbox_to_generic_dict = { xbname_to_ev_codename('XB_LOGO'):'LOGO_BUTTON', } +ps5_to_generic_dict = { + ps5name_to_ev_codename('PS_CROSS'):'FACE_BUTTON_SOUTH', + ps5name_to_ev_codename('PS_CIRCLE'):'FACE_BUTTON_EAST', + ps5name_to_ev_codename('PS_SQUARE'):'FACE_BUTTON_WEST', + ps5name_to_ev_codename('PS_TRIANGLE'):'FACE_BUTTON_NORTH', + ps5name_to_ev_codename('PS_L1'):'SHOULDER_BUTTON_LEFT', + ps5name_to_ev_codename('PS_R1'):'SHOULDER_BUTTON_RIGHT', + ps5name_to_ev_codename('PS_L2_BUTTON'):'BUMPER_BUTTON_LEFT', + ps5name_to_ev_codename('PS_R2_BUTTON'):'BUMPER_BUTTON_RIGHT', + ps5name_to_ev_codename('PS_LSB'):'STICK_BUTTON_LEFT', + ps5name_to_ev_codename('PS_RSB'):'STICK_BUTTON_RIGHT', + ps5name_to_ev_codename('PS_CREATE'):'MISC_BUTTON_1', + ps5name_to_ev_codename('PS_OPTION'):'MISC_BUTTON_2', + ps5name_to_ev_codename('PS_MUTE'):'MISC_BUTTON_3', + ps5name_to_ev_codename('PS_TOUCHPAD_BUTTON'):'MISC_BUTTON_4', + ps5name_to_ev_codename('PS_LOGO'):'LOGO_BUTTON', +} + def make_supported_raw_gamepad_spi_packet(gp_status_dict, this_device_info): gp_id = this_device_info['id'] this_gp_status = gp_status_dict[gp_id] print(this_gp_status) - generic_button_dict = { + supported_gamepad_status_dict = { 'FACE_BUTTON_SOUTH':0, 'FACE_BUTTON_EAST':0, 'FACE_BUTTON_WEST':0, @@ -507,13 +531,45 @@ def make_supported_raw_gamepad_spi_packet(gp_status_dict, this_device_info): 'MISC_BUTTON_3':0, 'MISC_BUTTON_4':0, 'MISC_BUTTON_5':0, + "LEFT_STICK_X":127, + "LEFT_STICK_Y":127, + "RIGHT_STICK_X":127, + "RIGHT_STICK_Y":127, + "ANALOG_TRIGGER_LEFT":0, + "ANALOG_TRIGGER_RIGHT":0, + "DPAD_X":127, + "DPAD_Y":127, } if this_device_info['gamepad_type'] == 'Xbox': for item in this_gp_status: generic_name = xbox_to_generic_dict.get(item) if generic_name is not None: - generic_button_dict[generic_name] = this_gp_status[item] - print(generic_button_dict) + supported_gamepad_status_dict[generic_name] = this_gp_status[item] + supported_gamepad_status_dict["LEFT_STICK_X"] = this_gp_status.get(xbname_to_ev_codename('XB_LSX'), 127) + supported_gamepad_status_dict["LEFT_STICK_Y"] = this_gp_status.get(xbname_to_ev_codename('XB_LSY'), 127) + supported_gamepad_status_dict["RIGHT_STICK_X"] = this_gp_status.get(xbname_to_ev_codename('XB_RSX'), 127) + supported_gamepad_status_dict["RIGHT_STICK_Y"] = this_gp_status.get(xbname_to_ev_codename('XB_RSY'), 127) + supported_gamepad_status_dict["ANALOG_TRIGGER_LEFT"] = this_gp_status.get(xbname_to_ev_codename('XB_LT'), 0) + supported_gamepad_status_dict["ANALOG_TRIGGER_RIGHT"] = this_gp_status.get(xbname_to_ev_codename('XB_RT'), 0) + supported_gamepad_status_dict["DPAD_X"] = this_gp_status.get(xbname_to_ev_codename('XB_DPX'), 127) + supported_gamepad_status_dict["DPAD_Y"] = this_gp_status.get(xbname_to_ev_codename('XB_DPY'), 127) + # print(supported_gamepad_status_dict) + + elif this_device_info['gamepad_type'] == usb4vc_gamepads.GAMEPAD_TYPE_PS5_GEN1: + for item in this_gp_status: + generic_name = ps5_to_generic_dict.get(item) + if generic_name is not None: + supported_gamepad_status_dict[generic_name] = this_gp_status[item] + supported_gamepad_status_dict["LEFT_STICK_X"] = this_gp_status.get(ps5name_to_ev_codename('PS_LSX'), 127) + supported_gamepad_status_dict["LEFT_STICK_Y"] = this_gp_status.get(ps5name_to_ev_codename('PS_LSY'), 127) + supported_gamepad_status_dict["RIGHT_STICK_X"] = this_gp_status.get(ps5name_to_ev_codename('PS_RSX'), 127) + supported_gamepad_status_dict["RIGHT_STICK_Y"] = this_gp_status.get(ps5name_to_ev_codename('PS_RSY'), 127) + supported_gamepad_status_dict["ANALOG_TRIGGER_LEFT"] = this_gp_status.get(ps5name_to_ev_codename('PS_L2_ANALOG'), 0) + supported_gamepad_status_dict["ANALOG_TRIGGER_RIGHT"] = this_gp_status.get(ps5name_to_ev_codename('PS_R2_ANALOG'), 0) + supported_gamepad_status_dict["DPAD_X"] = this_gp_status.get(ps5name_to_ev_codename('PS_DPX'), 127) + supported_gamepad_status_dict["DPAD_Y"] = this_gp_status.get(ps5name_to_ev_codename('PS_DPY'), 127) + print(supported_gamepad_status_dict) + return list(nop_spi_msg_template), None, None def make_gamepad_spi_packet(gp_status_dict, this_device_info):