diff --git a/rpcs3/Input/dualsense_pad_handler.cpp b/rpcs3/Input/dualsense_pad_handler.cpp index 68d9a565fd..e9e2627a3c 100644 --- a/rpcs3/Input/dualsense_pad_handler.cpp +++ b/rpcs3/Input/dualsense_pad_handler.cpp @@ -129,7 +129,11 @@ dualsense_pad_handler::dualsense_pad_handler() { DualSenseKeyCodes::RSXNeg, "RS X-" }, { DualSenseKeyCodes::RSXPos, "RS X+" }, { DualSenseKeyCodes::RSYPos, "RS Y+" }, - { DualSenseKeyCodes::RSYNeg, "RS Y-" } + { DualSenseKeyCodes::RSYNeg, "RS Y-" }, + { DualSenseKeyCodes::EdgeFnL, "FN L" }, + { DualSenseKeyCodes::EdgeFnR, "FN R" }, + { DualSenseKeyCodes::EdgeLB, "LB" }, + { DualSenseKeyCodes::EdgeRB, "RB" }, }; init_configs(); @@ -252,6 +256,20 @@ void dualsense_pad_handler::check_add_device(hid_device* hidDevice, std::string_ device->has_calib_data = true; device->path = path; + // Get feature set + if (const hid_device_info* info = hid_get_device_info(device->hidDevice)) + { + if (info->product_id == SONY_DUALSENSE_ID_1.m_pid) + { + device->feature_set = DualSenseDevice::DualSenseFeatureSet::Edge; + dualsense_log.notice("check_add_device: device is DualSense Edge: vid=0x%x, pid=0x%x, path='%s'", info->vendor_id, info->product_id, path); + } + } + else + { + dualsense_log.warning("check_add_device: hid_get_device_info failed for determining feature set! Reason: %s", hid_error(hidDevice)); + } + // Activate if (send_output_report(device) == -1) { @@ -789,6 +807,14 @@ std::unordered_map dualsense_pad_handler::get_button_values(const std: keyBuffer[DualSenseKeyCodes::TouchPad] = ((data & 0x02) != 0) ? 255 : 0; keyBuffer[DualSenseKeyCodes::Mic] = ((data & 0x04) != 0) ? 255 : 0; + if (dualsense_dev->feature_set == DualSenseDevice::DualSenseFeatureSet::Edge) + { + keyBuffer[DualSenseKeyCodes::EdgeFnL] = ((data & 0x10) != 0) ? 255 : 0; + keyBuffer[DualSenseKeyCodes::EdgeFnR] = ((data & 0x20) != 0) ? 255 : 0; + keyBuffer[DualSenseKeyCodes::EdgeLB] = ((data & 0x40) != 0) ? 255 : 0; + keyBuffer[DualSenseKeyCodes::EdgeRB] = ((data & 0x80) != 0) ? 255 : 0; + } + return keyBuffer; } diff --git a/rpcs3/Input/dualsense_pad_handler.h b/rpcs3/Input/dualsense_pad_handler.h index cc26700099..282a994e70 100644 --- a/rpcs3/Input/dualsense_pad_handler.h +++ b/rpcs3/Input/dualsense_pad_handler.h @@ -13,11 +13,18 @@ public: Enhanced }; + enum class DualSenseFeatureSet + { + Normal, + Edge + }; + bool bt_controller{false}; u8 bt_sequence{0}; bool has_calib_data{false}; std::array calib_data{}; DualSenseDataMode data_mode{DualSenseDataMode::Simple}; + DualSenseFeatureSet feature_set{DualSenseFeatureSet::Normal}; bool init_lightbar{true}; bool update_lightbar{true}; bool update_player_leds{true}; @@ -63,7 +70,12 @@ class dualsense_pad_handler final : public hid_pad_handler RSXNeg, RSXPos, RSYNeg, - RSYPos + RSYPos, + + EdgeFnL, + EdgeFnR, + EdgeLB, + EdgeRB, }; public: