diff options
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 20 |
3 files changed, 26 insertions, 2 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 069e0d5de..27b38abab 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -316,6 +316,9 @@ void Controller_NPad::SetNpadMode(u32 npad_id, NPadAssignments assignment_mode) | |||
| 316 | 316 | ||
| 317 | void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, | 317 | void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, |
| 318 | const std::vector<Vibration>& vibrations) { | 318 | const std::vector<Vibration>& vibrations) { |
| 319 | if (!can_controllers_vibrate) { | ||
| 320 | return; | ||
| 321 | } | ||
| 319 | for (std::size_t i = 0; i < controller_ids.size(); i++) { | 322 | for (std::size_t i = 0; i < controller_ids.size(); i++) { |
| 320 | if (i >= controller_count) { | 323 | if (i >= controller_count) { |
| 321 | continue; | 324 | continue; |
| @@ -386,4 +389,7 @@ Controller_NPad::LedPattern Controller_NPad::GetLedPattern(u32 npad_id) { | |||
| 386 | return LedPattern{0, 0, 0, 0}; | 389 | return LedPattern{0, 0, 0, 0}; |
| 387 | }; | 390 | }; |
| 388 | } | 391 | } |
| 392 | void Controller_NPad::SetVibrationEnabled(bool can_vibrate) { | ||
| 393 | can_controllers_vibrate = can_vibrate; | ||
| 394 | } | ||
| 389 | } // namespace Service::HID | 395 | } // namespace Service::HID |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 28c89768c..b1aa98820 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -111,6 +111,7 @@ public: | |||
| 111 | void ConnectNPad(u32 npad_id); | 111 | void ConnectNPad(u32 npad_id); |
| 112 | void DisconnectNPad(u32 npad_id); | 112 | void DisconnectNPad(u32 npad_id); |
| 113 | LedPattern GetLedPattern(u32 npad_id); | 113 | LedPattern GetLedPattern(u32 npad_id); |
| 114 | void SetVibrationEnabled(bool can_vibrate); | ||
| 114 | 115 | ||
| 115 | private: | 116 | private: |
| 116 | struct CommonHeader { | 117 | struct CommonHeader { |
| @@ -275,6 +276,7 @@ private: | |||
| 275 | std::size_t controller_count{}; | 276 | std::size_t controller_count{}; |
| 276 | static constexpr std::array<u32, 10> npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32, 16}; | 277 | static constexpr std::array<u32, 10> npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32, 16}; |
| 277 | std::array<ControllerHolder, 10> connected_controllers{}; | 278 | std::array<ControllerHolder, 10> connected_controllers{}; |
| 279 | bool can_controllers_vibrate{true}; | ||
| 278 | 280 | ||
| 279 | void InitNewlyAddedControler(std::size_t controller_idx); | 281 | void InitNewlyAddedControler(std::size_t controller_idx); |
| 280 | }; | 282 | }; |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 4c0d96cc2..65ee1d9bb 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -240,8 +240,8 @@ public: | |||
| 240 | {206, &Hid::SendVibrationValues, "SendVibrationValues"}, | 240 | {206, &Hid::SendVibrationValues, "SendVibrationValues"}, |
| 241 | {207, nullptr, "SendVibrationGcErmCommand"}, | 241 | {207, nullptr, "SendVibrationGcErmCommand"}, |
| 242 | {208, nullptr, "GetActualVibrationGcErmCommand"}, | 242 | {208, nullptr, "GetActualVibrationGcErmCommand"}, |
| 243 | {209, nullptr, "BeginPermitVibrationSession"}, | 243 | {209, &Hid::BeginPermitVibrationSession, "BeginPermitVibrationSession"}, |
| 244 | {210, nullptr, "EndPermitVibrationSession"}, | 244 | {210, &Hid::EndPermitVibrationSession, "EndPermitVibrationSession"}, |
| 245 | {300, &Hid::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"}, | 245 | {300, &Hid::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"}, |
| 246 | {301, &Hid::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"}, | 246 | {301, &Hid::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"}, |
| 247 | {302, nullptr, "StopConsoleSixAxisSensor"}, | 247 | {302, nullptr, "StopConsoleSixAxisSensor"}, |
| @@ -457,6 +457,22 @@ private: | |||
| 457 | LOG_WARNING(Service_HID, "(STUBBED) called"); | 457 | LOG_WARNING(Service_HID, "(STUBBED) called"); |
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx) { | ||
| 461 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 462 | .SetVibrationEnabled(true); | ||
| 463 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 464 | rb.Push(RESULT_SUCCESS); | ||
| 465 | LOG_DEBUG(Service_HID, "called"); | ||
| 466 | } | ||
| 467 | |||
| 468 | void EndPermitVibrationSession(Kernel::HLERequestContext& ctx) { | ||
| 469 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 470 | .SetVibrationEnabled(false); | ||
| 471 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 472 | rb.Push(RESULT_SUCCESS); | ||
| 473 | LOG_DEBUG(Service_HID, "called"); | ||
| 474 | } | ||
| 475 | |||
| 460 | void SendVibrationValue(Kernel::HLERequestContext& ctx) { | 476 | void SendVibrationValue(Kernel::HLERequestContext& ctx) { |
| 461 | IPC::RequestParser rp{ctx}; | 477 | IPC::RequestParser rp{ctx}; |
| 462 | const auto controller_id = rp.PopRaw<u32>(); | 478 | const auto controller_id = rp.PopRaw<u32>(); |