summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp6
-rw-r--r--src/core/hle/service/hid/controllers/npad.h2
-rw-r--r--src/core/hle/service/hid/hid.cpp20
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
317void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, 317void 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}
392void 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
115private: 116private:
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>();