diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 82 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/hid/errors.h | 1 |
3 files changed, 55 insertions, 31 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 8badefdec..ef6befbd9 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -56,11 +56,22 @@ bool Controller_NPad::IsDeviceHandleValid(const Core::HID::VibrationDeviceHandle | |||
| 56 | return npad_id && npad_type && device_index; | 56 | return npad_id && npad_type && device_index; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | bool Controller_NPad::IsDeviceHandleValid(const Core::HID::SixAxisSensorHandle& device_handle) { | 59 | ResultCode Controller_NPad::VerifyValidSixAxisSensorHandle( |
| 60 | const Core::HID::SixAxisSensorHandle& device_handle) { | ||
| 60 | const auto npad_id = IsNpadIdValid(static_cast<Core::HID::NpadIdType>(device_handle.npad_id)); | 61 | const auto npad_id = IsNpadIdValid(static_cast<Core::HID::NpadIdType>(device_handle.npad_id)); |
| 61 | const bool npad_type = device_handle.npad_type < Core::HID::NpadStyleIndex::MaxNpadType; | 62 | if (!npad_id) { |
| 63 | return InvalidNpadId; | ||
| 64 | } | ||
| 62 | const bool device_index = device_handle.device_index < Core::HID::DeviceIndex::MaxDeviceIndex; | 65 | const bool device_index = device_handle.device_index < Core::HID::DeviceIndex::MaxDeviceIndex; |
| 63 | return npad_id && npad_type && device_index; | 66 | if (!device_index) { |
| 67 | return NpadDeviceIndexOutOfRange; | ||
| 68 | } | ||
| 69 | // This doesn't get validaded on nnsdk | ||
| 70 | const bool npad_type = device_handle.npad_type < Core::HID::NpadStyleIndex::MaxNpadType; | ||
| 71 | if (!npad_type) { | ||
| 72 | return NpadInvalidHandle; | ||
| 73 | } | ||
| 74 | return ResultSuccess; | ||
| 64 | } | 75 | } |
| 65 | 76 | ||
| 66 | Controller_NPad::Controller_NPad(Core::HID::HIDCore& hid_core_, u8* raw_shared_memory_, | 77 | Controller_NPad::Controller_NPad(Core::HID::HIDCore& hid_core_, u8* raw_shared_memory_, |
| @@ -1010,9 +1021,10 @@ ResultCode Controller_NPad::DisconnectNpad(Core::HID::NpadIdType npad_id) { | |||
| 1010 | } | 1021 | } |
| 1011 | ResultCode Controller_NPad::SetGyroscopeZeroDriftMode( | 1022 | ResultCode Controller_NPad::SetGyroscopeZeroDriftMode( |
| 1012 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, GyroscopeZeroDriftMode drift_mode) { | 1023 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, GyroscopeZeroDriftMode drift_mode) { |
| 1013 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1024 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1014 | LOG_ERROR(Service_HID, "Invalid handle"); | 1025 | if (is_valid.IsError()) { |
| 1015 | return NpadInvalidHandle; | 1026 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1027 | return is_valid; | ||
| 1016 | } | 1028 | } |
| 1017 | 1029 | ||
| 1018 | auto& sixaxis = GetSixaxisState(sixaxis_handle); | 1030 | auto& sixaxis = GetSixaxisState(sixaxis_handle); |
| @@ -1024,9 +1036,10 @@ ResultCode Controller_NPad::SetGyroscopeZeroDriftMode( | |||
| 1024 | ResultCode Controller_NPad::GetGyroscopeZeroDriftMode( | 1036 | ResultCode Controller_NPad::GetGyroscopeZeroDriftMode( |
| 1025 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, | 1037 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, |
| 1026 | GyroscopeZeroDriftMode& drift_mode) const { | 1038 | GyroscopeZeroDriftMode& drift_mode) const { |
| 1027 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1039 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1028 | LOG_ERROR(Service_HID, "Invalid handle"); | 1040 | if (is_valid.IsError()) { |
| 1029 | return NpadInvalidHandle; | 1041 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1042 | return is_valid; | ||
| 1030 | } | 1043 | } |
| 1031 | 1044 | ||
| 1032 | const auto& sixaxis = GetSixaxisState(sixaxis_handle); | 1045 | const auto& sixaxis = GetSixaxisState(sixaxis_handle); |
| @@ -1037,9 +1050,10 @@ ResultCode Controller_NPad::GetGyroscopeZeroDriftMode( | |||
| 1037 | 1050 | ||
| 1038 | ResultCode Controller_NPad::IsSixAxisSensorAtRest( | 1051 | ResultCode Controller_NPad::IsSixAxisSensorAtRest( |
| 1039 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool& is_at_rest) const { | 1052 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool& is_at_rest) const { |
| 1040 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1053 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1041 | LOG_ERROR(Service_HID, "Invalid handle"); | 1054 | if (is_valid.IsError()) { |
| 1042 | return NpadInvalidHandle; | 1055 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1056 | return is_valid; | ||
| 1043 | } | 1057 | } |
| 1044 | 1058 | ||
| 1045 | const auto& controller = GetControllerFromHandle(sixaxis_handle); | 1059 | const auto& controller = GetControllerFromHandle(sixaxis_handle); |
| @@ -1049,9 +1063,10 @@ ResultCode Controller_NPad::IsSixAxisSensorAtRest( | |||
| 1049 | 1063 | ||
| 1050 | ResultCode Controller_NPad::IsFirmwareUpdateAvailableForSixAxisSensor( | 1064 | ResultCode Controller_NPad::IsFirmwareUpdateAvailableForSixAxisSensor( |
| 1051 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool& is_firmware_available) const { | 1065 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool& is_firmware_available) const { |
| 1052 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1066 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1053 | LOG_ERROR(Service_HID, "Invalid handle"); | 1067 | if (is_valid.IsError()) { |
| 1054 | return NpadInvalidHandle; | 1068 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1069 | return is_valid; | ||
| 1055 | } | 1070 | } |
| 1056 | 1071 | ||
| 1057 | // We don't support joycon firmware updates | 1072 | // We don't support joycon firmware updates |
| @@ -1061,10 +1076,12 @@ ResultCode Controller_NPad::IsFirmwareUpdateAvailableForSixAxisSensor( | |||
| 1061 | 1076 | ||
| 1062 | ResultCode Controller_NPad::SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle, | 1077 | ResultCode Controller_NPad::SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle, |
| 1063 | bool sixaxis_status) { | 1078 | bool sixaxis_status) { |
| 1064 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1079 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1065 | LOG_ERROR(Service_HID, "Invalid handle"); | 1080 | if (is_valid.IsError()) { |
| 1066 | return NpadInvalidHandle; | 1081 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1082 | return is_valid; | ||
| 1067 | } | 1083 | } |
| 1084 | |||
| 1068 | auto& controller = GetControllerFromHandle(sixaxis_handle); | 1085 | auto& controller = GetControllerFromHandle(sixaxis_handle); |
| 1069 | controller.sixaxis_sensor_enabled = sixaxis_status; | 1086 | controller.sixaxis_sensor_enabled = sixaxis_status; |
| 1070 | return ResultSuccess; | 1087 | return ResultSuccess; |
| @@ -1072,9 +1089,10 @@ ResultCode Controller_NPad::SetSixAxisEnabled(const Core::HID::SixAxisSensorHand | |||
| 1072 | 1089 | ||
| 1073 | ResultCode Controller_NPad::IsSixAxisSensorFusionEnabled( | 1090 | ResultCode Controller_NPad::IsSixAxisSensorFusionEnabled( |
| 1074 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool& is_fusion_enabled) const { | 1091 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool& is_fusion_enabled) const { |
| 1075 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1092 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1076 | LOG_ERROR(Service_HID, "Invalid handle"); | 1093 | if (is_valid.IsError()) { |
| 1077 | return NpadInvalidHandle; | 1094 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1095 | return is_valid; | ||
| 1078 | } | 1096 | } |
| 1079 | 1097 | ||
| 1080 | const auto& sixaxis = GetSixaxisState(sixaxis_handle); | 1098 | const auto& sixaxis = GetSixaxisState(sixaxis_handle); |
| @@ -1084,9 +1102,10 @@ ResultCode Controller_NPad::IsSixAxisSensorFusionEnabled( | |||
| 1084 | } | 1102 | } |
| 1085 | ResultCode Controller_NPad::SetSixAxisFusionEnabled( | 1103 | ResultCode Controller_NPad::SetSixAxisFusionEnabled( |
| 1086 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool is_fusion_enabled) { | 1104 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool is_fusion_enabled) { |
| 1087 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1105 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1088 | LOG_ERROR(Service_HID, "Invalid handle"); | 1106 | if (is_valid.IsError()) { |
| 1089 | return NpadInvalidHandle; | 1107 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1108 | return is_valid; | ||
| 1090 | } | 1109 | } |
| 1091 | 1110 | ||
| 1092 | auto& sixaxis = GetSixaxisState(sixaxis_handle); | 1111 | auto& sixaxis = GetSixaxisState(sixaxis_handle); |
| @@ -1098,10 +1117,12 @@ ResultCode Controller_NPad::SetSixAxisFusionEnabled( | |||
| 1098 | ResultCode Controller_NPad::SetSixAxisFusionParameters( | 1117 | ResultCode Controller_NPad::SetSixAxisFusionParameters( |
| 1099 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, | 1118 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, |
| 1100 | Core::HID::SixAxisSensorFusionParameters sixaxis_fusion_parameters) { | 1119 | Core::HID::SixAxisSensorFusionParameters sixaxis_fusion_parameters) { |
| 1101 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1120 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1102 | LOG_ERROR(Service_HID, "Invalid handle"); | 1121 | if (is_valid.IsError()) { |
| 1103 | return NpadInvalidHandle; | 1122 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1123 | return is_valid; | ||
| 1104 | } | 1124 | } |
| 1125 | |||
| 1105 | const auto param1 = sixaxis_fusion_parameters.parameter1; | 1126 | const auto param1 = sixaxis_fusion_parameters.parameter1; |
| 1106 | if (param1 < 0.0f || param1 > 1.0f) { | 1127 | if (param1 < 0.0f || param1 > 1.0f) { |
| 1107 | return InvalidSixAxisFusionRange; | 1128 | return InvalidSixAxisFusionRange; |
| @@ -1116,9 +1137,10 @@ ResultCode Controller_NPad::SetSixAxisFusionParameters( | |||
| 1116 | ResultCode Controller_NPad::GetSixAxisFusionParameters( | 1137 | ResultCode Controller_NPad::GetSixAxisFusionParameters( |
| 1117 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, | 1138 | const Core::HID::SixAxisSensorHandle& sixaxis_handle, |
| 1118 | Core::HID::SixAxisSensorFusionParameters& parameters) const { | 1139 | Core::HID::SixAxisSensorFusionParameters& parameters) const { |
| 1119 | if (!IsDeviceHandleValid(sixaxis_handle)) { | 1140 | const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); |
| 1120 | LOG_ERROR(Service_HID, "Invalid handle"); | 1141 | if (is_valid.IsError()) { |
| 1121 | return NpadInvalidHandle; | 1142 | LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); |
| 1143 | return is_valid; | ||
| 1122 | } | 1144 | } |
| 1123 | 1145 | ||
| 1124 | const auto& sixaxis = GetSixaxisState(sixaxis_handle); | 1146 | const auto& sixaxis = GetSixaxisState(sixaxis_handle); |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index dfb4de740..e6125ffcc 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -185,8 +185,9 @@ public: | |||
| 185 | Core::HID::NpadButton GetAndResetPressState(); | 185 | Core::HID::NpadButton GetAndResetPressState(); |
| 186 | 186 | ||
| 187 | static bool IsNpadIdValid(Core::HID::NpadIdType npad_id); | 187 | static bool IsNpadIdValid(Core::HID::NpadIdType npad_id); |
| 188 | static bool IsDeviceHandleValid(const Core::HID::SixAxisSensorHandle& device_handle); | ||
| 189 | static bool IsDeviceHandleValid(const Core::HID::VibrationDeviceHandle& device_handle); | 188 | static bool IsDeviceHandleValid(const Core::HID::VibrationDeviceHandle& device_handle); |
| 189 | static ResultCode VerifyValidSixAxisSensorHandle( | ||
| 190 | const Core::HID::SixAxisSensorHandle& device_handle); | ||
| 190 | 191 | ||
| 191 | private: | 192 | private: |
| 192 | static constexpr std::size_t NPAD_COUNT = 10; | 193 | static constexpr std::size_t NPAD_COUNT = 10; |
diff --git a/src/core/hle/service/hid/errors.h b/src/core/hle/service/hid/errors.h index d518fd069..6c8ad04af 100644 --- a/src/core/hle/service/hid/errors.h +++ b/src/core/hle/service/hid/errors.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | namespace Service::HID { | 8 | namespace Service::HID { |
| 9 | 9 | ||
| 10 | constexpr ResultCode NpadInvalidHandle{ErrorModule::HID, 100}; | 10 | constexpr ResultCode NpadInvalidHandle{ErrorModule::HID, 100}; |
| 11 | constexpr ResultCode NpadDeviceIndexOutOfRange{ErrorModule::HID, 107}; | ||
| 11 | constexpr ResultCode InvalidSixAxisFusionRange{ErrorModule::HID, 423}; | 12 | constexpr ResultCode InvalidSixAxisFusionRange{ErrorModule::HID, 423}; |
| 12 | constexpr ResultCode NpadIsDualJoycon{ErrorModule::HID, 601}; | 13 | constexpr ResultCode NpadIsDualJoycon{ErrorModule::HID, 601}; |
| 13 | constexpr ResultCode NpadIsSameType{ErrorModule::HID, 602}; | 14 | constexpr ResultCode NpadIsSameType{ErrorModule::HID, 602}; |