diff options
| author | 2020-10-06 07:00:18 -0400 | |
|---|---|---|
| committer | 2020-11-15 23:33:20 -0500 | |
| commit | e3c274998603b1bf3aa00a79474f5796c7dadac6 (patch) | |
| tree | 0874e2eeb43d8c9aa3c8fd98eafc100db2ffceb8 | |
| parent | hid: Implement GetVibrationDeviceInfo (diff) | |
| download | yuzu-e3c274998603b1bf3aa00a79474f5796c7dadac6.tar.gz yuzu-e3c274998603b1bf3aa00a79474f5796c7dadac6.tar.xz yuzu-e3c274998603b1bf3aa00a79474f5796c7dadac6.zip | |
hid: Reorder all HID commands
Reorders all HID commands in command id order.
Diffstat (limited to '')
| -rw-r--r-- | src/core/frontend/applets/controller.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 34 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 14 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 377 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 20 |
5 files changed, 232 insertions, 217 deletions
diff --git a/src/core/frontend/applets/controller.cpp b/src/core/frontend/applets/controller.cpp index 1ac2fb80c..03bbedf8b 100644 --- a/src/core/frontend/applets/controller.cpp +++ b/src/core/frontend/applets/controller.cpp | |||
| @@ -33,13 +33,13 @@ void DefaultControllerApplet::ReconfigureControllers(std::function<void()> callb | |||
| 33 | parameters.enable_single_mode ? 1 : parameters.min_players; | 33 | parameters.enable_single_mode ? 1 : parameters.min_players; |
| 34 | 34 | ||
| 35 | // Disconnect Handheld first. | 35 | // Disconnect Handheld first. |
| 36 | npad.DisconnectNPadAtIndex(8); | 36 | npad.DisconnectNpadAtIndex(8); |
| 37 | 37 | ||
| 38 | // Deduce the best configuration based on the input parameters. | 38 | // Deduce the best configuration based on the input parameters. |
| 39 | for (std::size_t index = 0; index < players.size() - 2; ++index) { | 39 | for (std::size_t index = 0; index < players.size() - 2; ++index) { |
| 40 | // First, disconnect all controllers regardless of the value of keep_controllers_connected. | 40 | // First, disconnect all controllers regardless of the value of keep_controllers_connected. |
| 41 | // This makes it easy to connect the desired controllers. | 41 | // This makes it easy to connect the desired controllers. |
| 42 | npad.DisconnectNPadAtIndex(index); | 42 | npad.DisconnectNpadAtIndex(index); |
| 43 | 43 | ||
| 44 | // Only connect the minimum number of required players. | 44 | // Only connect the minimum number of required players. |
| 45 | if (index >= min_supported_players) { | 45 | if (index >= min_supported_players) { |
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 8181bddbc..b330c5e40 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -139,7 +139,7 @@ void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) { | |||
| 139 | controller.properties.is_vertical.Assign(1); | 139 | controller.properties.is_vertical.Assign(1); |
| 140 | controller.properties.use_plus.Assign(1); | 140 | controller.properties.use_plus.Assign(1); |
| 141 | controller.properties.use_minus.Assign(1); | 141 | controller.properties.use_minus.Assign(1); |
| 142 | controller.pad_assignment = NPadAssignments::Single; | 142 | controller.pad_assignment = NpadAssignments::Single; |
| 143 | break; | 143 | break; |
| 144 | case NPadControllerType::Handheld: | 144 | case NPadControllerType::Handheld: |
| 145 | controller.joy_styles.handheld.Assign(1); | 145 | controller.joy_styles.handheld.Assign(1); |
| @@ -147,7 +147,7 @@ void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) { | |||
| 147 | controller.properties.is_vertical.Assign(1); | 147 | controller.properties.is_vertical.Assign(1); |
| 148 | controller.properties.use_plus.Assign(1); | 148 | controller.properties.use_plus.Assign(1); |
| 149 | controller.properties.use_minus.Assign(1); | 149 | controller.properties.use_minus.Assign(1); |
| 150 | controller.pad_assignment = NPadAssignments::Dual; | 150 | controller.pad_assignment = NpadAssignments::Dual; |
| 151 | break; | 151 | break; |
| 152 | case NPadControllerType::JoyDual: | 152 | case NPadControllerType::JoyDual: |
| 153 | controller.joy_styles.joycon_dual.Assign(1); | 153 | controller.joy_styles.joycon_dual.Assign(1); |
| @@ -156,26 +156,26 @@ void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) { | |||
| 156 | controller.properties.is_vertical.Assign(1); | 156 | controller.properties.is_vertical.Assign(1); |
| 157 | controller.properties.use_plus.Assign(1); | 157 | controller.properties.use_plus.Assign(1); |
| 158 | controller.properties.use_minus.Assign(1); | 158 | controller.properties.use_minus.Assign(1); |
| 159 | controller.pad_assignment = NPadAssignments::Dual; | 159 | controller.pad_assignment = NpadAssignments::Dual; |
| 160 | break; | 160 | break; |
| 161 | case NPadControllerType::JoyLeft: | 161 | case NPadControllerType::JoyLeft: |
| 162 | controller.joy_styles.joycon_left.Assign(1); | 162 | controller.joy_styles.joycon_left.Assign(1); |
| 163 | controller.device_type.joycon_left.Assign(1); | 163 | controller.device_type.joycon_left.Assign(1); |
| 164 | controller.properties.is_horizontal.Assign(1); | 164 | controller.properties.is_horizontal.Assign(1); |
| 165 | controller.properties.use_minus.Assign(1); | 165 | controller.properties.use_minus.Assign(1); |
| 166 | controller.pad_assignment = NPadAssignments::Single; | 166 | controller.pad_assignment = NpadAssignments::Single; |
| 167 | break; | 167 | break; |
| 168 | case NPadControllerType::JoyRight: | 168 | case NPadControllerType::JoyRight: |
| 169 | controller.joy_styles.joycon_right.Assign(1); | 169 | controller.joy_styles.joycon_right.Assign(1); |
| 170 | controller.device_type.joycon_right.Assign(1); | 170 | controller.device_type.joycon_right.Assign(1); |
| 171 | controller.properties.is_horizontal.Assign(1); | 171 | controller.properties.is_horizontal.Assign(1); |
| 172 | controller.properties.use_plus.Assign(1); | 172 | controller.properties.use_plus.Assign(1); |
| 173 | controller.pad_assignment = NPadAssignments::Single; | 173 | controller.pad_assignment = NpadAssignments::Single; |
| 174 | break; | 174 | break; |
| 175 | case NPadControllerType::Pokeball: | 175 | case NPadControllerType::Pokeball: |
| 176 | controller.joy_styles.pokeball.Assign(1); | 176 | controller.joy_styles.pokeball.Assign(1); |
| 177 | controller.device_type.pokeball.Assign(1); | 177 | controller.device_type.pokeball.Assign(1); |
| 178 | controller.pad_assignment = NPadAssignments::Single; | 178 | controller.pad_assignment = NpadAssignments::Single; |
| 179 | break; | 179 | break; |
| 180 | } | 180 | } |
| 181 | 181 | ||
| @@ -202,7 +202,7 @@ void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) { | |||
| 202 | 202 | ||
| 203 | void Controller_NPad::OnInit() { | 203 | void Controller_NPad::OnInit() { |
| 204 | auto& kernel = system.Kernel(); | 204 | auto& kernel = system.Kernel(); |
| 205 | for (std::size_t i = 0; i < styleset_changed_events.size(); i++) { | 205 | for (std::size_t i = 0; i < styleset_changed_events.size(); ++i) { |
| 206 | styleset_changed_events[i] = Kernel::WritableEvent::CreateEventPair( | 206 | styleset_changed_events[i] = Kernel::WritableEvent::CreateEventPair( |
| 207 | kernel, fmt::format("npad:NpadStyleSetChanged_{}", i)); | 207 | kernel, fmt::format("npad:NpadStyleSetChanged_{}", i)); |
| 208 | } | 208 | } |
| @@ -357,7 +357,7 @@ void Controller_NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* | |||
| 357 | if (!IsControllerActivated()) { | 357 | if (!IsControllerActivated()) { |
| 358 | return; | 358 | return; |
| 359 | } | 359 | } |
| 360 | for (std::size_t i = 0; i < shared_memory_entries.size(); i++) { | 360 | for (std::size_t i = 0; i < shared_memory_entries.size(); ++i) { |
| 361 | auto& npad = shared_memory_entries[i]; | 361 | auto& npad = shared_memory_entries[i]; |
| 362 | const std::array<NPadGeneric*, 7> controller_npads{&npad.main_controller_states, | 362 | const std::array<NPadGeneric*, 7> controller_npads{&npad.main_controller_states, |
| 363 | &npad.handheld_states, | 363 | &npad.handheld_states, |
| @@ -499,7 +499,7 @@ void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing | |||
| 499 | if (!IsControllerActivated()) { | 499 | if (!IsControllerActivated()) { |
| 500 | return; | 500 | return; |
| 501 | } | 501 | } |
| 502 | for (std::size_t i = 0; i < shared_memory_entries.size(); i++) { | 502 | for (std::size_t i = 0; i < shared_memory_entries.size(); ++i) { |
| 503 | auto& npad = shared_memory_entries[i]; | 503 | auto& npad = shared_memory_entries[i]; |
| 504 | 504 | ||
| 505 | const auto& controller_type = connected_controllers[i].type; | 505 | const auto& controller_type = connected_controllers[i].type; |
| @@ -627,7 +627,7 @@ Controller_NPad::NpadStyleSet Controller_NPad::GetSupportedStyleSet() const { | |||
| 627 | return style; | 627 | return style; |
| 628 | } | 628 | } |
| 629 | 629 | ||
| 630 | void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) { | 630 | void Controller_NPad::SetSupportedNpadIdTypes(u8* data, std::size_t length) { |
| 631 | ASSERT(length > 0 && (length % sizeof(u32)) == 0); | 631 | ASSERT(length > 0 && (length % sizeof(u32)) == 0); |
| 632 | supported_npad_id_types.clear(); | 632 | supported_npad_id_types.clear(); |
| 633 | supported_npad_id_types.resize(length / sizeof(u32)); | 633 | supported_npad_id_types.resize(length / sizeof(u32)); |
| @@ -639,7 +639,7 @@ void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) | |||
| 639 | std::memcpy(data, supported_npad_id_types.data(), supported_npad_id_types.size()); | 639 | std::memcpy(data, supported_npad_id_types.data(), supported_npad_id_types.size()); |
| 640 | } | 640 | } |
| 641 | 641 | ||
| 642 | std::size_t Controller_NPad::GetSupportedNPadIdTypesSize() const { | 642 | std::size_t Controller_NPad::GetSupportedNpadIdTypesSize() const { |
| 643 | return supported_npad_id_types.size(); | 643 | return supported_npad_id_types.size(); |
| 644 | } | 644 | } |
| 645 | 645 | ||
| @@ -659,7 +659,7 @@ Controller_NPad::NpadHandheldActivationMode Controller_NPad::GetNpadHandheldActi | |||
| 659 | return handheld_activation_mode; | 659 | return handheld_activation_mode; |
| 660 | } | 660 | } |
| 661 | 661 | ||
| 662 | void Controller_NPad::SetNpadMode(u32 npad_id, NPadAssignments assignment_mode) { | 662 | void Controller_NPad::SetNpadMode(u32 npad_id, NpadAssignments assignment_mode) { |
| 663 | const std::size_t npad_index = NPadIdToIndex(npad_id); | 663 | const std::size_t npad_index = NPadIdToIndex(npad_id); |
| 664 | ASSERT(npad_index < shared_memory_entries.size()); | 664 | ASSERT(npad_index < shared_memory_entries.size()); |
| 665 | if (shared_memory_entries[npad_index].pad_assignment != assignment_mode) { | 665 | if (shared_memory_entries[npad_index].pad_assignment != assignment_mode) { |
| @@ -714,7 +714,7 @@ void Controller_NPad::AddNewControllerAt(NPadControllerType controller, std::siz | |||
| 714 | void Controller_NPad::UpdateControllerAt(NPadControllerType controller, std::size_t npad_index, | 714 | void Controller_NPad::UpdateControllerAt(NPadControllerType controller, std::size_t npad_index, |
| 715 | bool connected) { | 715 | bool connected) { |
| 716 | if (!connected) { | 716 | if (!connected) { |
| 717 | DisconnectNPadAtIndex(npad_index); | 717 | DisconnectNpadAtIndex(npad_index); |
| 718 | return; | 718 | return; |
| 719 | } | 719 | } |
| 720 | 720 | ||
| @@ -734,11 +734,11 @@ void Controller_NPad::UpdateControllerAt(NPadControllerType controller, std::siz | |||
| 734 | InitNewlyAddedController(npad_index); | 734 | InitNewlyAddedController(npad_index); |
| 735 | } | 735 | } |
| 736 | 736 | ||
| 737 | void Controller_NPad::DisconnectNPad(u32 npad_id) { | 737 | void Controller_NPad::DisconnectNpad(u32 npad_id) { |
| 738 | DisconnectNPadAtIndex(NPadIdToIndex(npad_id)); | 738 | DisconnectNpadAtIndex(NPadIdToIndex(npad_id)); |
| 739 | } | 739 | } |
| 740 | 740 | ||
| 741 | void Controller_NPad::DisconnectNPadAtIndex(std::size_t npad_index) { | 741 | void Controller_NPad::DisconnectNpadAtIndex(std::size_t npad_index) { |
| 742 | Settings::values.players.GetValue()[npad_index].connected = false; | 742 | Settings::values.players.GetValue()[npad_index].connected = false; |
| 743 | connected_controllers[npad_index].is_connected = false; | 743 | connected_controllers[npad_index].is_connected = false; |
| 744 | 744 | ||
| @@ -777,7 +777,7 @@ void Controller_NPad::MergeSingleJoyAsDualJoy(u32 npad_id_1, u32 npad_id_2) { | |||
| 777 | (connected_controllers[npad_index_2].type == NPadControllerType::JoyLeft && | 777 | (connected_controllers[npad_index_2].type == NPadControllerType::JoyLeft && |
| 778 | connected_controllers[npad_index_1].type == NPadControllerType::JoyRight)) { | 778 | connected_controllers[npad_index_1].type == NPadControllerType::JoyRight)) { |
| 779 | // Disconnect the joycon at the second id and connect the dual joycon at the first index. | 779 | // Disconnect the joycon at the second id and connect the dual joycon at the first index. |
| 780 | DisconnectNPad(npad_id_2); | 780 | DisconnectNpad(npad_id_2); |
| 781 | AddNewControllerAt(NPadControllerType::JoyDual, npad_index_1); | 781 | AddNewControllerAt(NPadControllerType::JoyDual, npad_index_1); |
| 782 | } | 782 | } |
| 783 | } | 783 | } |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index fed8425b1..35dd2bf5f 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -75,7 +75,7 @@ public: | |||
| 75 | Horizontal = 1, | 75 | Horizontal = 1, |
| 76 | }; | 76 | }; |
| 77 | 77 | ||
| 78 | enum class NPadAssignments : u32 { | 78 | enum class NpadAssignments : u32 { |
| 79 | Dual = 0, | 79 | Dual = 0, |
| 80 | Single = 1, | 80 | Single = 1, |
| 81 | }; | 81 | }; |
| @@ -136,9 +136,9 @@ public: | |||
| 136 | void SetSupportedStyleSet(NpadStyleSet style_set); | 136 | void SetSupportedStyleSet(NpadStyleSet style_set); |
| 137 | NpadStyleSet GetSupportedStyleSet() const; | 137 | NpadStyleSet GetSupportedStyleSet() const; |
| 138 | 138 | ||
| 139 | void SetSupportedNPadIdTypes(u8* data, std::size_t length); | 139 | void SetSupportedNpadIdTypes(u8* data, std::size_t length); |
| 140 | void GetSupportedNpadIdTypes(u32* data, std::size_t max_length); | 140 | void GetSupportedNpadIdTypes(u32* data, std::size_t max_length); |
| 141 | std::size_t GetSupportedNPadIdTypesSize() const; | 141 | std::size_t GetSupportedNpadIdTypesSize() const; |
| 142 | 142 | ||
| 143 | void SetHoldType(NpadHoldType joy_hold_type); | 143 | void SetHoldType(NpadHoldType joy_hold_type); |
| 144 | NpadHoldType GetHoldType() const; | 144 | NpadHoldType GetHoldType() const; |
| @@ -146,7 +146,7 @@ public: | |||
| 146 | void SetNpadHandheldActivationMode(NpadHandheldActivationMode activation_mode); | 146 | void SetNpadHandheldActivationMode(NpadHandheldActivationMode activation_mode); |
| 147 | NpadHandheldActivationMode GetNpadHandheldActivationMode() const; | 147 | NpadHandheldActivationMode GetNpadHandheldActivationMode() const; |
| 148 | 148 | ||
| 149 | void SetNpadMode(u32 npad_id, NPadAssignments assignment_mode); | 149 | void SetNpadMode(u32 npad_id, NpadAssignments assignment_mode); |
| 150 | 150 | ||
| 151 | void VibrateController(const std::vector<u32>& controllers, | 151 | void VibrateController(const std::vector<u32>& controllers, |
| 152 | const std::vector<Vibration>& vibrations); | 152 | const std::vector<Vibration>& vibrations); |
| @@ -161,8 +161,8 @@ public: | |||
| 161 | // Adds a new controller at an index with connection status. | 161 | // Adds a new controller at an index with connection status. |
| 162 | void UpdateControllerAt(NPadControllerType controller, std::size_t npad_index, bool connected); | 162 | void UpdateControllerAt(NPadControllerType controller, std::size_t npad_index, bool connected); |
| 163 | 163 | ||
| 164 | void DisconnectNPad(u32 npad_id); | 164 | void DisconnectNpad(u32 npad_id); |
| 165 | void DisconnectNPadAtIndex(std::size_t index); | 165 | void DisconnectNpadAtIndex(std::size_t index); |
| 166 | 166 | ||
| 167 | void SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode); | 167 | void SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode); |
| 168 | GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const; | 168 | GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const; |
| @@ -348,7 +348,7 @@ private: | |||
| 348 | 348 | ||
| 349 | struct NPadEntry { | 349 | struct NPadEntry { |
| 350 | NpadStyleSet joy_styles; | 350 | NpadStyleSet joy_styles; |
| 351 | NPadAssignments pad_assignment; | 351 | NpadAssignments pad_assignment; |
| 352 | 352 | ||
| 353 | ColorReadError single_color_error; | 353 | ColorReadError single_color_error; |
| 354 | ControllerColor single_color; | 354 | ControllerColor single_color; |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 993738f36..9a631008f 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -328,131 +328,113 @@ void Hid::CreateAppletResource(Kernel::HLERequestContext& ctx) { | |||
| 328 | rb.PushIpcInterface<IAppletResource>(applet_resource); | 328 | rb.PushIpcInterface<IAppletResource>(applet_resource); |
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | void Hid::ActivateXpad(Kernel::HLERequestContext& ctx) { | 331 | void Hid::ActivateDebugPad(Kernel::HLERequestContext& ctx) { |
| 332 | IPC::RequestParser rp{ctx}; | 332 | IPC::RequestParser rp{ctx}; |
| 333 | const auto basic_xpad_id{rp.Pop<u32>()}; | ||
| 334 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 333 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 335 | 334 | ||
| 336 | LOG_DEBUG(Service_HID, "called, basic_xpad_id={}, applet_resource_user_id={}", basic_xpad_id, | 335 | applet_resource->ActivateController(HidController::DebugPad); |
| 337 | applet_resource_user_id); | 336 | |
| 337 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | ||
| 338 | 338 | ||
| 339 | applet_resource->ActivateController(HidController::XPad); | ||
| 340 | IPC::ResponseBuilder rb{ctx, 2}; | 339 | IPC::ResponseBuilder rb{ctx, 2}; |
| 341 | rb.Push(RESULT_SUCCESS); | 340 | rb.Push(RESULT_SUCCESS); |
| 342 | } | 341 | } |
| 343 | 342 | ||
| 344 | void Hid::GetXpadIDs(Kernel::HLERequestContext& ctx) { | 343 | void Hid::ActivateTouchScreen(Kernel::HLERequestContext& ctx) { |
| 345 | IPC::RequestParser rp{ctx}; | 344 | IPC::RequestParser rp{ctx}; |
| 346 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 345 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 347 | 346 | ||
| 348 | LOG_DEBUG(Service_HID, "(STUBBED) called, applet_resource_user_id={}", applet_resource_user_id); | 347 | applet_resource->ActivateController(HidController::Touchscreen); |
| 349 | |||
| 350 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 351 | rb.Push(RESULT_SUCCESS); | ||
| 352 | rb.Push(0); | ||
| 353 | } | ||
| 354 | 348 | ||
| 355 | void Hid::ActivateSixAxisSensor(Kernel::HLERequestContext& ctx) { | 349 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 356 | IPC::RequestParser rp{ctx}; | ||
| 357 | const auto handle{rp.Pop<u32>()}; | ||
| 358 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 359 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetSixAxisEnabled(true); | ||
| 360 | LOG_DEBUG(Service_HID, "called, handle={}, applet_resource_user_id={}", handle, | ||
| 361 | applet_resource_user_id); | ||
| 362 | 350 | ||
| 363 | IPC::ResponseBuilder rb{ctx, 2}; | 351 | IPC::ResponseBuilder rb{ctx, 2}; |
| 364 | rb.Push(RESULT_SUCCESS); | 352 | rb.Push(RESULT_SUCCESS); |
| 365 | } | 353 | } |
| 366 | 354 | ||
| 367 | void Hid::DeactivateSixAxisSensor(Kernel::HLERequestContext& ctx) { | 355 | void Hid::ActivateMouse(Kernel::HLERequestContext& ctx) { |
| 368 | IPC::RequestParser rp{ctx}; | 356 | IPC::RequestParser rp{ctx}; |
| 369 | const auto handle{rp.Pop<u32>()}; | ||
| 370 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 357 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 371 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetSixAxisEnabled(false); | ||
| 372 | 358 | ||
| 373 | LOG_DEBUG(Service_HID, "called, handle={}, applet_resource_user_id={}", handle, | 359 | applet_resource->ActivateController(HidController::Mouse); |
| 374 | applet_resource_user_id); | ||
| 375 | |||
| 376 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 377 | rb.Push(RESULT_SUCCESS); | ||
| 378 | } | ||
| 379 | |||
| 380 | void Hid::ActivateDebugPad(Kernel::HLERequestContext& ctx) { | ||
| 381 | IPC::RequestParser rp{ctx}; | ||
| 382 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 383 | 360 | ||
| 384 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 361 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 385 | 362 | ||
| 386 | applet_resource->ActivateController(HidController::DebugPad); | ||
| 387 | IPC::ResponseBuilder rb{ctx, 2}; | 363 | IPC::ResponseBuilder rb{ctx, 2}; |
| 388 | rb.Push(RESULT_SUCCESS); | 364 | rb.Push(RESULT_SUCCESS); |
| 389 | } | 365 | } |
| 390 | 366 | ||
| 391 | void Hid::ActivateTouchScreen(Kernel::HLERequestContext& ctx) { | 367 | void Hid::ActivateKeyboard(Kernel::HLERequestContext& ctx) { |
| 392 | IPC::RequestParser rp{ctx}; | 368 | IPC::RequestParser rp{ctx}; |
| 393 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 369 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 394 | 370 | ||
| 371 | applet_resource->ActivateController(HidController::Keyboard); | ||
| 372 | |||
| 395 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 373 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 396 | 374 | ||
| 397 | applet_resource->ActivateController(HidController::Touchscreen); | ||
| 398 | IPC::ResponseBuilder rb{ctx, 2}; | 375 | IPC::ResponseBuilder rb{ctx, 2}; |
| 399 | rb.Push(RESULT_SUCCESS); | 376 | rb.Push(RESULT_SUCCESS); |
| 400 | } | 377 | } |
| 401 | 378 | ||
| 402 | void Hid::ActivateMouse(Kernel::HLERequestContext& ctx) { | 379 | void Hid::SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx) { |
| 403 | IPC::RequestParser rp{ctx}; | 380 | IPC::RequestParser rp{ctx}; |
| 404 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 381 | const auto flags{rp.Pop<u32>()}; |
| 405 | 382 | ||
| 406 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 383 | LOG_WARNING(Service_HID, "(STUBBED) called. flags={}", flags); |
| 407 | 384 | ||
| 408 | applet_resource->ActivateController(HidController::Mouse); | ||
| 409 | IPC::ResponseBuilder rb{ctx, 2}; | 385 | IPC::ResponseBuilder rb{ctx, 2}; |
| 410 | rb.Push(RESULT_SUCCESS); | 386 | rb.Push(RESULT_SUCCESS); |
| 411 | } | 387 | } |
| 412 | 388 | ||
| 413 | void Hid::ActivateKeyboard(Kernel::HLERequestContext& ctx) { | 389 | void Hid::ActivateXpad(Kernel::HLERequestContext& ctx) { |
| 414 | IPC::RequestParser rp{ctx}; | 390 | IPC::RequestParser rp{ctx}; |
| 391 | const auto basic_xpad_id{rp.Pop<u32>()}; | ||
| 415 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 392 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 416 | 393 | ||
| 417 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 394 | applet_resource->ActivateController(HidController::XPad); |
| 395 | |||
| 396 | LOG_DEBUG(Service_HID, "called, basic_xpad_id={}, applet_resource_user_id={}", basic_xpad_id, | ||
| 397 | applet_resource_user_id); | ||
| 418 | 398 | ||
| 419 | applet_resource->ActivateController(HidController::Keyboard); | ||
| 420 | IPC::ResponseBuilder rb{ctx, 2}; | 399 | IPC::ResponseBuilder rb{ctx, 2}; |
| 421 | rb.Push(RESULT_SUCCESS); | 400 | rb.Push(RESULT_SUCCESS); |
| 422 | } | 401 | } |
| 423 | 402 | ||
| 424 | void Hid::SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx) { | 403 | void Hid::GetXpadIDs(Kernel::HLERequestContext& ctx) { |
| 425 | IPC::RequestParser rp{ctx}; | 404 | IPC::RequestParser rp{ctx}; |
| 426 | const auto flags{rp.Pop<u32>()}; | 405 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 427 | LOG_WARNING(Service_HID, "(STUBBED) called. flags={}", flags); | ||
| 428 | 406 | ||
| 429 | IPC::ResponseBuilder rb{ctx, 2}; | 407 | LOG_DEBUG(Service_HID, "(STUBBED) called, applet_resource_user_id={}", applet_resource_user_id); |
| 408 | |||
| 409 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 430 | rb.Push(RESULT_SUCCESS); | 410 | rb.Push(RESULT_SUCCESS); |
| 411 | rb.Push(0); | ||
| 431 | } | 412 | } |
| 432 | 413 | ||
| 433 | void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) { | 414 | void Hid::ActivateSixAxisSensor(Kernel::HLERequestContext& ctx) { |
| 434 | IPC::RequestParser rp{ctx}; | 415 | IPC::RequestParser rp{ctx}; |
| 435 | const auto unknown{rp.Pop<u32>()}; | 416 | const auto handle{rp.Pop<u32>()}; |
| 436 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 417 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 437 | 418 | ||
| 438 | LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown, | 419 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetSixAxisEnabled(true); |
| 420 | |||
| 421 | LOG_DEBUG(Service_HID, "called, handle={}, applet_resource_user_id={}", handle, | ||
| 439 | applet_resource_user_id); | 422 | applet_resource_user_id); |
| 440 | 423 | ||
| 441 | applet_resource->ActivateController(HidController::Gesture); | ||
| 442 | IPC::ResponseBuilder rb{ctx, 2}; | 424 | IPC::ResponseBuilder rb{ctx, 2}; |
| 443 | rb.Push(RESULT_SUCCESS); | 425 | rb.Push(RESULT_SUCCESS); |
| 444 | } | 426 | } |
| 445 | 427 | ||
| 446 | void Hid::ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) { | 428 | void Hid::DeactivateSixAxisSensor(Kernel::HLERequestContext& ctx) { |
| 447 | // Should have no effect with how our npad sets up the data | ||
| 448 | IPC::RequestParser rp{ctx}; | 429 | IPC::RequestParser rp{ctx}; |
| 449 | const auto unknown{rp.Pop<u32>()}; | 430 | const auto handle{rp.Pop<u32>()}; |
| 450 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 431 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 451 | 432 | ||
| 452 | LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown, | 433 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetSixAxisEnabled(false); |
| 434 | |||
| 435 | LOG_DEBUG(Service_HID, "called, handle={}, applet_resource_user_id={}", handle, | ||
| 453 | applet_resource_user_id); | 436 | applet_resource_user_id); |
| 454 | 437 | ||
| 455 | applet_resource->ActivateController(HidController::NPad); | ||
| 456 | IPC::ResponseBuilder rb{ctx, 2}; | 438 | IPC::ResponseBuilder rb{ctx, 2}; |
| 457 | rb.Push(RESULT_SUCCESS); | 439 | rb.Push(RESULT_SUCCESS); |
| 458 | } | 440 | } |
| @@ -487,8 +469,8 @@ void Hid::EnableSixAxisSensorFusion(Kernel::HLERequestContext& ctx) { | |||
| 487 | const auto handle{rp.Pop<u32>()}; | 469 | const auto handle{rp.Pop<u32>()}; |
| 488 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 470 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 489 | 471 | ||
| 490 | LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle, | 472 | LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", enable, |
| 491 | applet_resource_user_id); | 473 | handle, applet_resource_user_id); |
| 492 | 474 | ||
| 493 | IPC::ResponseBuilder rb{ctx, 2}; | 475 | IPC::ResponseBuilder rb{ctx, 2}; |
| 494 | rb.Push(RESULT_SUCCESS); | 476 | rb.Push(RESULT_SUCCESS); |
| @@ -501,7 +483,7 @@ void Hid::SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | |||
| 501 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 483 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 502 | 484 | ||
| 503 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 485 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 504 | .SetGyroscopeZeroDriftMode(Controller_NPad::GyroscopeZeroDriftMode{drift_mode}); | 486 | .SetGyroscopeZeroDriftMode({drift_mode}); |
| 505 | 487 | ||
| 506 | LOG_DEBUG(Service_HID, "called, handle={}, drift_mode={}, applet_resource_user_id={}", handle, | 488 | LOG_DEBUG(Service_HID, "called, handle={}, drift_mode={}, applet_resource_user_id={}", handle, |
| 507 | drift_mode, applet_resource_user_id); | 489 | drift_mode, applet_resource_user_id); |
| @@ -520,9 +502,8 @@ void Hid::GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | |||
| 520 | 502 | ||
| 521 | IPC::ResponseBuilder rb{ctx, 3}; | 503 | IPC::ResponseBuilder rb{ctx, 3}; |
| 522 | rb.Push(RESULT_SUCCESS); | 504 | rb.Push(RESULT_SUCCESS); |
| 523 | rb.Push<u32>( | 505 | rb.PushEnum(applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 524 | static_cast<u32>(applet_resource->GetController<Controller_NPad>(HidController::NPad) | 506 | .GetGyroscopeZeroDriftMode()); |
| 525 | .GetGyroscopeZeroDriftMode())); | ||
| 526 | } | 507 | } |
| 527 | 508 | ||
| 528 | void Hid::ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | 509 | void Hid::ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { |
| @@ -554,15 +535,29 @@ void Hid::IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx) { | |||
| 554 | .IsSixAxisSensorAtRest()); | 535 | .IsSixAxisSensorAtRest()); |
| 555 | } | 536 | } |
| 556 | 537 | ||
| 538 | void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) { | ||
| 539 | IPC::RequestParser rp{ctx}; | ||
| 540 | const auto unknown{rp.Pop<u32>()}; | ||
| 541 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 542 | |||
| 543 | applet_resource->ActivateController(HidController::Gesture); | ||
| 544 | |||
| 545 | LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown, | ||
| 546 | applet_resource_user_id); | ||
| 547 | |||
| 548 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 549 | rb.Push(RESULT_SUCCESS); | ||
| 550 | } | ||
| 551 | |||
| 557 | void Hid::SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) { | 552 | void Hid::SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) { |
| 558 | IPC::RequestParser rp{ctx}; | 553 | IPC::RequestParser rp{ctx}; |
| 559 | const auto supported_styleset{rp.Pop<u32>()}; | 554 | const auto supported_styleset{rp.Pop<u32>()}; |
| 560 | 555 | ||
| 561 | LOG_DEBUG(Service_HID, "called, supported_styleset={}", supported_styleset); | ||
| 562 | |||
| 563 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 556 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 564 | .SetSupportedStyleSet({supported_styleset}); | 557 | .SetSupportedStyleSet({supported_styleset}); |
| 565 | 558 | ||
| 559 | LOG_DEBUG(Service_HID, "called, supported_styleset={}", supported_styleset); | ||
| 560 | |||
| 566 | IPC::ResponseBuilder rb{ctx, 2}; | 561 | IPC::ResponseBuilder rb{ctx, 2}; |
| 567 | rb.Push(RESULT_SUCCESS); | 562 | rb.Push(RESULT_SUCCESS); |
| 568 | } | 563 | } |
| @@ -573,21 +568,22 @@ void Hid::GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) { | |||
| 573 | 568 | ||
| 574 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 569 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 575 | 570 | ||
| 576 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 577 | |||
| 578 | IPC::ResponseBuilder rb{ctx, 3}; | 571 | IPC::ResponseBuilder rb{ctx, 3}; |
| 579 | rb.Push(RESULT_SUCCESS); | 572 | rb.Push(RESULT_SUCCESS); |
| 580 | rb.Push<u32>(controller.GetSupportedStyleSet().raw); | 573 | rb.Push(applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 574 | .GetSupportedStyleSet() | ||
| 575 | .raw); | ||
| 581 | } | 576 | } |
| 582 | 577 | ||
| 583 | void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) { | 578 | void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) { |
| 584 | IPC::RequestParser rp{ctx}; | 579 | IPC::RequestParser rp{ctx}; |
| 585 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 580 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 586 | 581 | ||
| 582 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 583 | .SetSupportedNpadIdTypes(ctx.ReadBuffer().data(), ctx.GetReadBufferSize()); | ||
| 584 | |||
| 587 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 585 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 588 | 586 | ||
| 589 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 590 | .SetSupportedNPadIdTypes(ctx.ReadBuffer().data(), ctx.GetReadBufferSize()); | ||
| 591 | IPC::ResponseBuilder rb{ctx, 2}; | 587 | IPC::ResponseBuilder rb{ctx, 2}; |
| 592 | rb.Push(RESULT_SUCCESS); | 588 | rb.Push(RESULT_SUCCESS); |
| 593 | } | 589 | } |
| @@ -596,22 +592,24 @@ void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) { | |||
| 596 | IPC::RequestParser rp{ctx}; | 592 | IPC::RequestParser rp{ctx}; |
| 597 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 593 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 598 | 594 | ||
| 595 | applet_resource->ActivateController(HidController::NPad); | ||
| 596 | |||
| 599 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 597 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 600 | 598 | ||
| 601 | IPC::ResponseBuilder rb{ctx, 2}; | 599 | IPC::ResponseBuilder rb{ctx, 2}; |
| 602 | rb.Push(RESULT_SUCCESS); | 600 | rb.Push(RESULT_SUCCESS); |
| 603 | applet_resource->ActivateController(HidController::NPad); | ||
| 604 | } | 601 | } |
| 605 | 602 | ||
| 606 | void Hid::DeactivateNpad(Kernel::HLERequestContext& ctx) { | 603 | void Hid::DeactivateNpad(Kernel::HLERequestContext& ctx) { |
| 607 | IPC::RequestParser rp{ctx}; | 604 | IPC::RequestParser rp{ctx}; |
| 608 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 605 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 609 | 606 | ||
| 607 | applet_resource->DeactivateController(HidController::NPad); | ||
| 608 | |||
| 610 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 609 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 611 | 610 | ||
| 612 | IPC::ResponseBuilder rb{ctx, 2}; | 611 | IPC::ResponseBuilder rb{ctx, 2}; |
| 613 | rb.Push(RESULT_SUCCESS); | 612 | rb.Push(RESULT_SUCCESS); |
| 614 | applet_resource->DeactivateController(HidController::NPad); | ||
| 615 | } | 613 | } |
| 616 | 614 | ||
| 617 | void Hid::AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) { | 615 | void Hid::AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) { |
| @@ -634,10 +632,11 @@ void Hid::DisconnectNpad(Kernel::HLERequestContext& ctx) { | |||
| 634 | const auto npad_id{rp.Pop<u32>()}; | 632 | const auto npad_id{rp.Pop<u32>()}; |
| 635 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 633 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 636 | 634 | ||
| 635 | applet_resource->GetController<Controller_NPad>(HidController::NPad).DisconnectNpad(npad_id); | ||
| 636 | |||
| 637 | LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id, | 637 | LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id, |
| 638 | applet_resource_user_id); | 638 | applet_resource_user_id); |
| 639 | 639 | ||
| 640 | applet_resource->GetController<Controller_NPad>(HidController::NPad).DisconnectNPad(npad_id); | ||
| 641 | IPC::ResponseBuilder rb{ctx, 2}; | 640 | IPC::ResponseBuilder rb{ctx, 2}; |
| 642 | rb.Push(RESULT_SUCCESS); | 641 | rb.Push(RESULT_SUCCESS); |
| 643 | } | 642 | } |
| @@ -650,9 +649,24 @@ void Hid::GetPlayerLedPattern(Kernel::HLERequestContext& ctx) { | |||
| 650 | 649 | ||
| 651 | IPC::ResponseBuilder rb{ctx, 4}; | 650 | IPC::ResponseBuilder rb{ctx, 4}; |
| 652 | rb.Push(RESULT_SUCCESS); | 651 | rb.Push(RESULT_SUCCESS); |
| 653 | rb.PushRaw<u64>(applet_resource->GetController<Controller_NPad>(HidController::NPad) | 652 | rb.Push(applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 654 | .GetLedPattern(npad_id) | 653 | .GetLedPattern(npad_id) |
| 655 | .raw); | 654 | .raw); |
| 655 | } | ||
| 656 | |||
| 657 | void Hid::ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) { | ||
| 658 | // Should have no effect with how our npad sets up the data | ||
| 659 | IPC::RequestParser rp{ctx}; | ||
| 660 | const auto unknown{rp.Pop<u32>()}; | ||
| 661 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 662 | |||
| 663 | applet_resource->ActivateController(HidController::NPad); | ||
| 664 | |||
| 665 | LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown, | ||
| 666 | applet_resource_user_id); | ||
| 667 | |||
| 668 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 669 | rb.Push(RESULT_SUCCESS); | ||
| 656 | } | 670 | } |
| 657 | 671 | ||
| 658 | void Hid::SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) { | 672 | void Hid::SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) { |
| @@ -660,12 +674,11 @@ void Hid::SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) { | |||
| 660 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 674 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 661 | const auto hold_type{rp.Pop<u64>()}; | 675 | const auto hold_type{rp.Pop<u64>()}; |
| 662 | 676 | ||
| 677 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetHoldType({hold_type}); | ||
| 678 | |||
| 663 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, hold_type={}", | 679 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, hold_type={}", |
| 664 | applet_resource_user_id, hold_type); | 680 | applet_resource_user_id, hold_type); |
| 665 | 681 | ||
| 666 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 667 | controller.SetHoldType(Controller_NPad::NpadHoldType{hold_type}); | ||
| 668 | |||
| 669 | IPC::ResponseBuilder rb{ctx, 2}; | 682 | IPC::ResponseBuilder rb{ctx, 2}; |
| 670 | rb.Push(RESULT_SUCCESS); | 683 | rb.Push(RESULT_SUCCESS); |
| 671 | } | 684 | } |
| @@ -676,10 +689,9 @@ void Hid::GetNpadJoyHoldType(Kernel::HLERequestContext& ctx) { | |||
| 676 | 689 | ||
| 677 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 690 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 678 | 691 | ||
| 679 | const auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 680 | IPC::ResponseBuilder rb{ctx, 4}; | 692 | IPC::ResponseBuilder rb{ctx, 4}; |
| 681 | rb.Push(RESULT_SUCCESS); | 693 | rb.Push(RESULT_SUCCESS); |
| 682 | rb.Push<u64>(static_cast<u64>(controller.GetHoldType())); | 694 | rb.PushEnum(applet_resource->GetController<Controller_NPad>(HidController::NPad).GetHoldType())); |
| 683 | } | 695 | } |
| 684 | 696 | ||
| 685 | void Hid::SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) { | 697 | void Hid::SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) { |
| @@ -687,12 +699,12 @@ void Hid::SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx | |||
| 687 | const auto npad_id{rp.Pop<u32>()}; | 699 | const auto npad_id{rp.Pop<u32>()}; |
| 688 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 700 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 689 | 701 | ||
| 702 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 703 | .SetNpadMode(npad_id, Controller_NPad::NpadAssignments::Single); | ||
| 704 | |||
| 690 | LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}", npad_id, | 705 | LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}", npad_id, |
| 691 | applet_resource_user_id); | 706 | applet_resource_user_id); |
| 692 | 707 | ||
| 693 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 694 | controller.SetNpadMode(npad_id, Controller_NPad::NPadAssignments::Single); | ||
| 695 | |||
| 696 | IPC::ResponseBuilder rb{ctx, 2}; | 708 | IPC::ResponseBuilder rb{ctx, 2}; |
| 697 | rb.Push(RESULT_SUCCESS); | 709 | rb.Push(RESULT_SUCCESS); |
| 698 | } | 710 | } |
| @@ -704,13 +716,13 @@ void Hid::SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx) { | |||
| 704 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 716 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 705 | const auto npad_joy_device_type{rp.Pop<u64>()}; | 717 | const auto npad_joy_device_type{rp.Pop<u64>()}; |
| 706 | 718 | ||
| 719 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 720 | .SetNpadMode(npad_id, Controller_NPad::NpadAssignments::Single); | ||
| 721 | |||
| 707 | LOG_WARNING(Service_HID, | 722 | LOG_WARNING(Service_HID, |
| 708 | "(STUBBED) called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}", | 723 | "(STUBBED) called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}", |
| 709 | npad_id, applet_resource_user_id, npad_joy_device_type); | 724 | npad_id, applet_resource_user_id, npad_joy_device_type); |
| 710 | 725 | ||
| 711 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 712 | controller.SetNpadMode(npad_id, Controller_NPad::NPadAssignments::Single); | ||
| 713 | |||
| 714 | IPC::ResponseBuilder rb{ctx, 2}; | 726 | IPC::ResponseBuilder rb{ctx, 2}; |
| 715 | rb.Push(RESULT_SUCCESS); | 727 | rb.Push(RESULT_SUCCESS); |
| 716 | } | 728 | } |
| @@ -720,12 +732,12 @@ void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) { | |||
| 720 | const auto npad_id{rp.Pop<u32>()}; | 732 | const auto npad_id{rp.Pop<u32>()}; |
| 721 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 733 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 722 | 734 | ||
| 735 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 736 | .SetNpadMode(npad_id, Controller_NPad::NpadAssignments::Dual); | ||
| 737 | |||
| 723 | LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id, | 738 | LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id, |
| 724 | applet_resource_user_id); | 739 | applet_resource_user_id); |
| 725 | 740 | ||
| 726 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 727 | controller.SetNpadMode(npad_id, Controller_NPad::NPadAssignments::Dual); | ||
| 728 | |||
| 729 | IPC::ResponseBuilder rb{ctx, 2}; | 741 | IPC::ResponseBuilder rb{ctx, 2}; |
| 730 | rb.Push(RESULT_SUCCESS); | 742 | rb.Push(RESULT_SUCCESS); |
| 731 | } | 743 | } |
| @@ -736,12 +748,12 @@ void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) { | |||
| 736 | const auto npad_id_2{rp.Pop<u32>()}; | 748 | const auto npad_id_2{rp.Pop<u32>()}; |
| 737 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 749 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 738 | 750 | ||
| 751 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 752 | .MergeSingleJoyAsDualJoy(npad_id_1, npad_id_2); | ||
| 753 | |||
| 739 | LOG_DEBUG(Service_HID, "called, npad_id_1={}, npad_id_2={}, applet_resource_user_id={}", | 754 | LOG_DEBUG(Service_HID, "called, npad_id_1={}, npad_id_2={}, applet_resource_user_id={}", |
| 740 | npad_id_1, npad_id_2, applet_resource_user_id); | 755 | npad_id_1, npad_id_2, applet_resource_user_id); |
| 741 | 756 | ||
| 742 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 743 | controller.MergeSingleJoyAsDualJoy(npad_id_1, npad_id_2); | ||
| 744 | |||
| 745 | IPC::ResponseBuilder rb{ctx, 2}; | 757 | IPC::ResponseBuilder rb{ctx, 2}; |
| 746 | rb.Push(RESULT_SUCCESS); | 758 | rb.Push(RESULT_SUCCESS); |
| 747 | } | 759 | } |
| @@ -750,9 +762,9 @@ void Hid::StartLrAssignmentMode(Kernel::HLERequestContext& ctx) { | |||
| 750 | IPC::RequestParser rp{ctx}; | 762 | IPC::RequestParser rp{ctx}; |
| 751 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 763 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 752 | 764 | ||
| 765 | applet_resource->GetController<Controller_NPad>(HidController::NPad).StartLRAssignmentMode(); | ||
| 766 | |||
| 753 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 767 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 754 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 755 | controller.StartLRAssignmentMode(); | ||
| 756 | 768 | ||
| 757 | IPC::ResponseBuilder rb{ctx, 2}; | 769 | IPC::ResponseBuilder rb{ctx, 2}; |
| 758 | rb.Push(RESULT_SUCCESS); | 770 | rb.Push(RESULT_SUCCESS); |
| @@ -762,9 +774,9 @@ void Hid::StopLrAssignmentMode(Kernel::HLERequestContext& ctx) { | |||
| 762 | IPC::RequestParser rp{ctx}; | 774 | IPC::RequestParser rp{ctx}; |
| 763 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 775 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 764 | 776 | ||
| 777 | applet_resource->GetController<Controller_NPad>(HidController::NPad).StopLRAssignmentMode(); | ||
| 778 | |||
| 765 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 779 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 766 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 767 | controller.StopLRAssignmentMode(); | ||
| 768 | 780 | ||
| 769 | IPC::ResponseBuilder rb{ctx, 2}; | 781 | IPC::ResponseBuilder rb{ctx, 2}; |
| 770 | rb.Push(RESULT_SUCCESS); | 782 | rb.Push(RESULT_SUCCESS); |
| @@ -775,12 +787,12 @@ void Hid::SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) { | |||
| 775 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 787 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 776 | const auto mode{rp.Pop<u64>()}; | 788 | const auto mode{rp.Pop<u64>()}; |
| 777 | 789 | ||
| 790 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 791 | .SetNpadHandheldActivationMode({mode}); | ||
| 792 | |||
| 778 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, mode={}", applet_resource_user_id, | 793 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, mode={}", applet_resource_user_id, |
| 779 | mode); | 794 | mode); |
| 780 | 795 | ||
| 781 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 782 | .SetNpadHandheldActivationMode(Controller_NPad::NpadHandheldActivationMode{mode}); | ||
| 783 | |||
| 784 | IPC::ResponseBuilder rb{ctx, 2}; | 796 | IPC::ResponseBuilder rb{ctx, 2}; |
| 785 | rb.Push(RESULT_SUCCESS); | 797 | rb.Push(RESULT_SUCCESS); |
| 786 | } | 798 | } |
| @@ -793,23 +805,24 @@ void Hid::GetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) { | |||
| 793 | 805 | ||
| 794 | IPC::ResponseBuilder rb{ctx, 4}; | 806 | IPC::ResponseBuilder rb{ctx, 4}; |
| 795 | rb.Push(RESULT_SUCCESS); | 807 | rb.Push(RESULT_SUCCESS); |
| 796 | rb.Push<u64>( | 808 | rb.PushEnum(applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 797 | static_cast<u64>(applet_resource->GetController<Controller_NPad>(HidController::NPad) | 809 | .GetNpadHandheldActivationMode()); |
| 798 | .GetNpadHandheldActivationMode())); | ||
| 799 | } | 810 | } |
| 800 | 811 | ||
| 801 | void Hid::SwapNpadAssignment(Kernel::HLERequestContext& ctx) { | 812 | void Hid::SwapNpadAssignment(Kernel::HLERequestContext& ctx) { |
| 802 | IPC::RequestParser rp{ctx}; | 813 | IPC::RequestParser rp{ctx}; |
| 803 | const auto npad_1{rp.Pop<u32>()}; | 814 | const auto npad_id_1{rp.Pop<u32>()}; |
| 804 | const auto npad_2{rp.Pop<u32>()}; | 815 | const auto npad_id_2{rp.Pop<u32>()}; |
| 805 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 816 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 806 | 817 | ||
| 807 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, npad_1={}, npad_2={}", | 818 | const bool res = applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 808 | applet_resource_user_id, npad_1, npad_2); | 819 | .SwapNpadAssignment(npad_id_1, npad_id_2); |
| 820 | |||
| 821 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, npad_id_1={}, npad_id_2={}", | ||
| 822 | applet_resource_user_id, npad_id_1, npad_id_2); | ||
| 809 | 823 | ||
| 810 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 811 | IPC::ResponseBuilder rb{ctx, 2}; | 824 | IPC::ResponseBuilder rb{ctx, 2}; |
| 812 | if (controller.SwapNpadAssignment(npad_1, npad_2)) { | 825 | if (res) { |
| 813 | rb.Push(RESULT_SUCCESS); | 826 | rb.Push(RESULT_SUCCESS); |
| 814 | } else { | 827 | } else { |
| 815 | LOG_ERROR(Service_HID, "Npads are not connected!"); | 828 | LOG_ERROR(Service_HID, "Npads are not connected!"); |
| @@ -825,11 +838,10 @@ void Hid::IsUnintendedHomeButtonInputProtectionEnabled(Kernel::HLERequestContext | |||
| 825 | LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}", npad_id, | 838 | LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}", npad_id, |
| 826 | applet_resource_user_id); | 839 | applet_resource_user_id); |
| 827 | 840 | ||
| 828 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 829 | |||
| 830 | IPC::ResponseBuilder rb{ctx, 3}; | 841 | IPC::ResponseBuilder rb{ctx, 3}; |
| 831 | rb.Push(RESULT_SUCCESS); | 842 | rb.Push(RESULT_SUCCESS); |
| 832 | rb.Push<bool>(controller.IsUnintendedHomeButtonInputProtectionEnabled(npad_id)); | 843 | rb.Push(applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 844 | .IsUnintendedHomeButtonInputProtectionEnabled(npad_id)); | ||
| 833 | } | 845 | } |
| 834 | 846 | ||
| 835 | void Hid::EnableUnintendedHomeButtonInputProtection(Kernel::HLERequestContext& ctx) { | 847 | void Hid::EnableUnintendedHomeButtonInputProtection(Kernel::HLERequestContext& ctx) { |
| @@ -838,36 +850,46 @@ void Hid::EnableUnintendedHomeButtonInputProtection(Kernel::HLERequestContext& c | |||
| 838 | const auto npad_id{rp.Pop<u32>()}; | 850 | const auto npad_id{rp.Pop<u32>()}; |
| 839 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 851 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 840 | 852 | ||
| 853 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 854 | .SetUnintendedHomeButtonInputProtectionEnabled(unintended_home_button_input_protection, | ||
| 855 | npad_id); | ||
| 856 | |||
| 841 | LOG_WARNING(Service_HID, | 857 | LOG_WARNING(Service_HID, |
| 842 | "(STUBBED) called, unintended_home_button_input_protection={}, npad_id={}," | 858 | "(STUBBED) called, unintended_home_button_input_protection={}, npad_id={}," |
| 843 | "applet_resource_user_id={}", | 859 | "applet_resource_user_id={}", |
| 844 | npad_id, unintended_home_button_input_protection, applet_resource_user_id); | 860 | unintended_home_button_input_protection, npad_id, applet_resource_user_id); |
| 845 | |||
| 846 | auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad); | ||
| 847 | controller.SetUnintendedHomeButtonInputProtectionEnabled( | ||
| 848 | unintended_home_button_input_protection, npad_id); | ||
| 849 | 861 | ||
| 850 | IPC::ResponseBuilder rb{ctx, 2}; | 862 | IPC::ResponseBuilder rb{ctx, 2}; |
| 851 | rb.Push(RESULT_SUCCESS); | 863 | rb.Push(RESULT_SUCCESS); |
| 852 | } | 864 | } |
| 853 | 865 | ||
| 854 | void Hid::BeginPermitVibrationSession(Kernel::HLERequestContext& ctx) { | 866 | void Hid::GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) { |
| 855 | IPC::RequestParser rp{ctx}; | 867 | IPC::RequestParser rp{ctx}; |
| 856 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 868 | const auto vibration_device_handle{rp.PopRaw<Controller_NPad::DeviceHandle>()}; |
| 857 | 869 | ||
| 858 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 870 | VibrationDeviceInfo vibration_device_info; |
| 859 | 871 | ||
| 860 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetVibrationEnabled(true); | 872 | vibration_device_info.type = VibrationDeviceType::LinearResonantActuator; |
| 861 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 862 | rb.Push(RESULT_SUCCESS); | ||
| 863 | } | ||
| 864 | 873 | ||
| 865 | void Hid::EndPermitVibrationSession(Kernel::HLERequestContext& ctx) { | 874 | switch (vibration_device_handle.device_index) { |
| 866 | LOG_DEBUG(Service_HID, "called"); | 875 | case Controller_NPad::DeviceIndex::Left: |
| 876 | vibration_device_info.position = VibrationDevicePosition::Left; | ||
| 877 | break; | ||
| 878 | case Controller_NPad::DeviceIndex::Right: | ||
| 879 | vibration_device_info.position = VibrationDevicePosition::Right; | ||
| 880 | break; | ||
| 881 | case Controller_NPad::DeviceIndex::None: | ||
| 882 | default: | ||
| 883 | vibration_device_info.position = VibrationDevicePosition::None; | ||
| 884 | break; | ||
| 885 | } | ||
| 867 | 886 | ||
| 868 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetVibrationEnabled(false); | 887 | LOG_DEBUG(Service_HID, "called, vibration_device_type={}, vibration_device_position={}", |
| 869 | IPC::ResponseBuilder rb{ctx, 2}; | 888 | vibration_device_info.type, vibration_device_info.position); |
| 889 | |||
| 890 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 870 | rb.Push(RESULT_SUCCESS); | 891 | rb.Push(RESULT_SUCCESS); |
| 892 | rb.PushRaw(vibration_device_info); | ||
| 871 | } | 893 | } |
| 872 | 894 | ||
| 873 | void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) { | 895 | void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) { |
| @@ -876,34 +898,11 @@ void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) { | |||
| 876 | const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()}; | 898 | const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()}; |
| 877 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 899 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 878 | 900 | ||
| 879 | LOG_DEBUG(Service_HID, "called, controller={}, applet_resource_user_id={}", controller, | ||
| 880 | applet_resource_user_id); | ||
| 881 | |||
| 882 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 883 | rb.Push(RESULT_SUCCESS); | ||
| 884 | |||
| 885 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 901 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 886 | .VibrateController({controller}, {vibration_values}); | 902 | .VibrateController({controller}, {vibration_values}); |
| 887 | } | ||
| 888 | 903 | ||
| 889 | void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) { | 904 | LOG_DEBUG(Service_HID, "called, controller={}, applet_resource_user_id={}", controller, |
| 890 | IPC::RequestParser rp{ctx}; | 905 | applet_resource_user_id); |
| 891 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 892 | |||
| 893 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | ||
| 894 | |||
| 895 | const auto controllers = ctx.ReadBuffer(0); | ||
| 896 | const auto vibrations = ctx.ReadBuffer(1); | ||
| 897 | |||
| 898 | std::vector<u32> controller_list(controllers.size() / sizeof(u32)); | ||
| 899 | std::vector<Controller_NPad::Vibration> vibration_list(vibrations.size() / | ||
| 900 | sizeof(Controller_NPad::Vibration)); | ||
| 901 | |||
| 902 | std::memcpy(controller_list.data(), controllers.data(), controllers.size()); | ||
| 903 | std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size()); | ||
| 904 | |||
| 905 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 906 | .VibrateController(controller_list, vibration_list); | ||
| 907 | 906 | ||
| 908 | IPC::ResponseBuilder rb{ctx, 2}; | 907 | IPC::ResponseBuilder rb{ctx, 2}; |
| 909 | rb.Push(RESULT_SUCCESS); | 908 | rb.Push(RESULT_SUCCESS); |
| @@ -919,39 +918,10 @@ void Hid::GetActualVibrationValue(Kernel::HLERequestContext& ctx) { | |||
| 919 | 918 | ||
| 920 | IPC::ResponseBuilder rb{ctx, 6}; | 919 | IPC::ResponseBuilder rb{ctx, 6}; |
| 921 | rb.Push(RESULT_SUCCESS); | 920 | rb.Push(RESULT_SUCCESS); |
| 922 | rb.PushRaw<Controller_NPad::Vibration>( | 921 | rb.PushRaw( |
| 923 | applet_resource->GetController<Controller_NPad>(HidController::NPad).GetLastVibration()); | 922 | applet_resource->GetController<Controller_NPad>(HidController::NPad).GetLastVibration()); |
| 924 | } | 923 | } |
| 925 | 924 | ||
| 926 | void Hid::GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) { | ||
| 927 | IPC::RequestParser rp{ctx}; | ||
| 928 | const auto vibration_device_handle{rp.PopRaw<Controller_NPad::DeviceHandle>()}; | ||
| 929 | |||
| 930 | VibrationDeviceInfo vibration_device_info; | ||
| 931 | |||
| 932 | vibration_device_info.type = VibrationDeviceType::LinearResonantActuator; | ||
| 933 | |||
| 934 | switch (vibration_device_handle.device_index) { | ||
| 935 | case Controller_NPad::DeviceIndex::Left: | ||
| 936 | vibration_device_info.position = VibrationDevicePosition::Left; | ||
| 937 | break; | ||
| 938 | case Controller_NPad::DeviceIndex::Right: | ||
| 939 | vibration_device_info.position = VibrationDevicePosition::Right; | ||
| 940 | break; | ||
| 941 | case Controller_NPad::DeviceIndex::None: | ||
| 942 | default: | ||
| 943 | vibration_device_info.position = VibrationDevicePosition::None; | ||
| 944 | break; | ||
| 945 | } | ||
| 946 | |||
| 947 | LOG_DEBUG(Service_HID, "called, vibration_device_type={}, vibration_device_position={}", | ||
| 948 | vibration_device_info.type, vibration_device_info.position); | ||
| 949 | |||
| 950 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 951 | rb.Push(RESULT_SUCCESS); | ||
| 952 | rb.PushRaw<VibrationDeviceInfo>(vibration_device_info); | ||
| 953 | } | ||
| 954 | |||
| 955 | void Hid::CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx) { | 925 | void Hid::CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx) { |
| 956 | LOG_DEBUG(Service_HID, "called"); | 926 | LOG_DEBUG(Service_HID, "called"); |
| 957 | 927 | ||
| @@ -963,6 +933,7 @@ void Hid::CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx) { | |||
| 963 | void Hid::PermitVibration(Kernel::HLERequestContext& ctx) { | 933 | void Hid::PermitVibration(Kernel::HLERequestContext& ctx) { |
| 964 | IPC::RequestParser rp{ctx}; | 934 | IPC::RequestParser rp{ctx}; |
| 965 | const auto can_vibrate{rp.Pop<bool>()}; | 935 | const auto can_vibrate{rp.Pop<bool>()}; |
| 936 | |||
| 966 | Settings::values.vibration_enabled.SetValue(can_vibrate); | 937 | Settings::values.vibration_enabled.SetValue(can_vibrate); |
| 967 | 938 | ||
| 968 | LOG_DEBUG(Service_HID, "called, can_vibrate={}", can_vibrate); | 939 | LOG_DEBUG(Service_HID, "called, can_vibrate={}", can_vibrate); |
| @@ -979,6 +950,50 @@ void Hid::IsVibrationPermitted(Kernel::HLERequestContext& ctx) { | |||
| 979 | rb.Push(Settings::values.vibration_enabled.GetValue()); | 950 | rb.Push(Settings::values.vibration_enabled.GetValue()); |
| 980 | } | 951 | } |
| 981 | 952 | ||
| 953 | void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) { | ||
| 954 | IPC::RequestParser rp{ctx}; | ||
| 955 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 956 | |||
| 957 | const auto controllers = ctx.ReadBuffer(0); | ||
| 958 | const auto vibrations = ctx.ReadBuffer(1); | ||
| 959 | |||
| 960 | std::vector<u32> controller_list(controllers.size() / sizeof(u32)); | ||
| 961 | std::vector<Controller_NPad::Vibration> vibration_list(vibrations.size() / | ||
| 962 | sizeof(Controller_NPad::Vibration)); | ||
| 963 | |||
| 964 | std::memcpy(controller_list.data(), controllers.data(), controllers.size()); | ||
| 965 | std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size()); | ||
| 966 | |||
| 967 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 968 | .VibrateController(controller_list, vibration_list); | ||
| 969 | |||
| 970 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | ||
| 971 | |||
| 972 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 973 | rb.Push(RESULT_SUCCESS); | ||
| 974 | } | ||
| 975 | |||
| 976 | void Hid::BeginPermitVibrationSession(Kernel::HLERequestContext& ctx) { | ||
| 977 | IPC::RequestParser rp{ctx}; | ||
| 978 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 979 | |||
| 980 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetVibrationEnabled(true); | ||
| 981 | |||
| 982 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | ||
| 983 | |||
| 984 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 985 | rb.Push(RESULT_SUCCESS); | ||
| 986 | } | ||
| 987 | |||
| 988 | void Hid::EndPermitVibrationSession(Kernel::HLERequestContext& ctx) { | ||
| 989 | applet_resource->GetController<Controller_NPad>(HidController::NPad).SetVibrationEnabled(false); | ||
| 990 | |||
| 991 | LOG_DEBUG(Service_HID, "called"); | ||
| 992 | |||
| 993 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 994 | rb.Push(RESULT_SUCCESS); | ||
| 995 | } | ||
| 996 | |||
| 982 | void Hid::ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) { | 997 | void Hid::ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) { |
| 983 | IPC::RequestParser rp{ctx}; | 998 | IPC::RequestParser rp{ctx}; |
| 984 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 999 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index 2f7483170..57bc93778 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -86,17 +86,15 @@ public: | |||
| 86 | 86 | ||
| 87 | private: | 87 | private: |
| 88 | void CreateAppletResource(Kernel::HLERequestContext& ctx); | 88 | void CreateAppletResource(Kernel::HLERequestContext& ctx); |
| 89 | void ActivateXpad(Kernel::HLERequestContext& ctx); | ||
| 90 | void GetXpadIDs(Kernel::HLERequestContext& ctx); | ||
| 91 | void ActivateSixAxisSensor(Kernel::HLERequestContext& ctx); | ||
| 92 | void DeactivateSixAxisSensor(Kernel::HLERequestContext& ctx); | ||
| 93 | void ActivateDebugPad(Kernel::HLERequestContext& ctx); | 89 | void ActivateDebugPad(Kernel::HLERequestContext& ctx); |
| 94 | void ActivateTouchScreen(Kernel::HLERequestContext& ctx); | 90 | void ActivateTouchScreen(Kernel::HLERequestContext& ctx); |
| 95 | void ActivateMouse(Kernel::HLERequestContext& ctx); | 91 | void ActivateMouse(Kernel::HLERequestContext& ctx); |
| 96 | void ActivateKeyboard(Kernel::HLERequestContext& ctx); | 92 | void ActivateKeyboard(Kernel::HLERequestContext& ctx); |
| 97 | void SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx); | 93 | void SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx); |
| 98 | void ActivateGesture(Kernel::HLERequestContext& ctx); | 94 | void ActivateXpad(Kernel::HLERequestContext& ctx); |
| 99 | void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx); | 95 | void GetXpadIDs(Kernel::HLERequestContext& ctx); |
| 96 | void ActivateSixAxisSensor(Kernel::HLERequestContext& ctx); | ||
| 97 | void DeactivateSixAxisSensor(Kernel::HLERequestContext& ctx); | ||
| 100 | void StartSixAxisSensor(Kernel::HLERequestContext& ctx); | 98 | void StartSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 101 | void StopSixAxisSensor(Kernel::HLERequestContext& ctx); | 99 | void StopSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 102 | void EnableSixAxisSensorFusion(Kernel::HLERequestContext& ctx); | 100 | void EnableSixAxisSensorFusion(Kernel::HLERequestContext& ctx); |
| @@ -104,6 +102,7 @@ private: | |||
| 104 | void GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | 102 | void GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); |
| 105 | void ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | 103 | void ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); |
| 106 | void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx); | 104 | void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx); |
| 105 | void ActivateGesture(Kernel::HLERequestContext& ctx); | ||
| 107 | void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | 106 | void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); |
| 108 | void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | 107 | void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); |
| 109 | void SetSupportedNpadIdType(Kernel::HLERequestContext& ctx); | 108 | void SetSupportedNpadIdType(Kernel::HLERequestContext& ctx); |
| @@ -112,6 +111,7 @@ private: | |||
| 112 | void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx); | 111 | void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx); |
| 113 | void DisconnectNpad(Kernel::HLERequestContext& ctx); | 112 | void DisconnectNpad(Kernel::HLERequestContext& ctx); |
| 114 | void GetPlayerLedPattern(Kernel::HLERequestContext& ctx); | 113 | void GetPlayerLedPattern(Kernel::HLERequestContext& ctx); |
| 114 | void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx); | ||
| 115 | void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx); | 115 | void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx); |
| 116 | void GetNpadJoyHoldType(Kernel::HLERequestContext& ctx); | 116 | void GetNpadJoyHoldType(Kernel::HLERequestContext& ctx); |
| 117 | void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx); | 117 | void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx); |
| @@ -125,15 +125,15 @@ private: | |||
| 125 | void SwapNpadAssignment(Kernel::HLERequestContext& ctx); | 125 | void SwapNpadAssignment(Kernel::HLERequestContext& ctx); |
| 126 | void IsUnintendedHomeButtonInputProtectionEnabled(Kernel::HLERequestContext& ctx); | 126 | void IsUnintendedHomeButtonInputProtectionEnabled(Kernel::HLERequestContext& ctx); |
| 127 | void EnableUnintendedHomeButtonInputProtection(Kernel::HLERequestContext& ctx); | 127 | void EnableUnintendedHomeButtonInputProtection(Kernel::HLERequestContext& ctx); |
| 128 | void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx); | 128 | void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx); |
| 129 | void EndPermitVibrationSession(Kernel::HLERequestContext& ctx); | ||
| 130 | void SendVibrationValue(Kernel::HLERequestContext& ctx); | 129 | void SendVibrationValue(Kernel::HLERequestContext& ctx); |
| 131 | void SendVibrationValues(Kernel::HLERequestContext& ctx); | ||
| 132 | void GetActualVibrationValue(Kernel::HLERequestContext& ctx); | 130 | void GetActualVibrationValue(Kernel::HLERequestContext& ctx); |
| 133 | void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx); | ||
| 134 | void CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx); | 131 | void CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx); |
| 135 | void PermitVibration(Kernel::HLERequestContext& ctx); | 132 | void PermitVibration(Kernel::HLERequestContext& ctx); |
| 136 | void IsVibrationPermitted(Kernel::HLERequestContext& ctx); | 133 | void IsVibrationPermitted(Kernel::HLERequestContext& ctx); |
| 134 | void SendVibrationValues(Kernel::HLERequestContext& ctx); | ||
| 135 | void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx); | ||
| 136 | void EndPermitVibrationSession(Kernel::HLERequestContext& ctx); | ||
| 137 | void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); | 137 | void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 138 | void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); | 138 | void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 139 | void StopConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); | 139 | void StopConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); |