summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp82
-rw-r--r--src/core/hle/service/hid/controllers/npad.h3
-rw-r--r--src/core/hle/service/hid/errors.h1
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
59bool Controller_NPad::IsDeviceHandleValid(const Core::HID::SixAxisSensorHandle& device_handle) { 59ResultCode 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
66Controller_NPad::Controller_NPad(Core::HID::HIDCore& hid_core_, u8* raw_shared_memory_, 77Controller_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}
1011ResultCode Controller_NPad::SetGyroscopeZeroDriftMode( 1022ResultCode 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(
1024ResultCode Controller_NPad::GetGyroscopeZeroDriftMode( 1036ResultCode 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
1038ResultCode Controller_NPad::IsSixAxisSensorAtRest( 1051ResultCode 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
1050ResultCode Controller_NPad::IsFirmwareUpdateAvailableForSixAxisSensor( 1064ResultCode 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
1062ResultCode Controller_NPad::SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle, 1077ResultCode 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
1073ResultCode Controller_NPad::IsSixAxisSensorFusionEnabled( 1090ResultCode 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}
1085ResultCode Controller_NPad::SetSixAxisFusionEnabled( 1103ResultCode 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(
1098ResultCode Controller_NPad::SetSixAxisFusionParameters( 1117ResultCode 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(
1116ResultCode Controller_NPad::GetSixAxisFusionParameters( 1137ResultCode 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
191private: 192private:
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 @@
8namespace Service::HID { 8namespace Service::HID {
9 9
10constexpr ResultCode NpadInvalidHandle{ErrorModule::HID, 100}; 10constexpr ResultCode NpadInvalidHandle{ErrorModule::HID, 100};
11constexpr ResultCode NpadDeviceIndexOutOfRange{ErrorModule::HID, 107};
11constexpr ResultCode InvalidSixAxisFusionRange{ErrorModule::HID, 423}; 12constexpr ResultCode InvalidSixAxisFusionRange{ErrorModule::HID, 423};
12constexpr ResultCode NpadIsDualJoycon{ErrorModule::HID, 601}; 13constexpr ResultCode NpadIsDualJoycon{ErrorModule::HID, 601};
13constexpr ResultCode NpadIsSameType{ErrorModule::HID, 602}; 14constexpr ResultCode NpadIsSameType{ErrorModule::HID, 602};