diff options
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 10 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 42 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 2 |
4 files changed, 56 insertions, 6 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index c55d900e2..6fbee7efa 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -566,6 +566,14 @@ void Controller_NPad::DisconnectNPad(u32 npad_id) { | |||
| 566 | connected_controllers[NPadIdToIndex(npad_id)].is_connected = false; | 566 | connected_controllers[NPadIdToIndex(npad_id)].is_connected = false; |
| 567 | } | 567 | } |
| 568 | 568 | ||
| 569 | void Controller_NPad::SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode) { | ||
| 570 | gyroscope_zero_drift_mode = drift_mode; | ||
| 571 | } | ||
| 572 | |||
| 573 | Controller_NPad::GyroscopeZeroDriftMode Controller_NPad::GetGyroscopeZeroDriftMode() const { | ||
| 574 | return gyroscope_zero_drift_mode; | ||
| 575 | } | ||
| 576 | |||
| 569 | void Controller_NPad::StartLRAssignmentMode() { | 577 | void Controller_NPad::StartLRAssignmentMode() { |
| 570 | // Nothing internally is used for lr assignment mode. Since we have the ability to set the | 578 | // Nothing internally is used for lr assignment mode. Since we have the ability to set the |
| 571 | // controller types from boot, it doesn't really matter about showing a selection screen | 579 | // controller types from boot, it doesn't really matter about showing a selection screen |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 931f03430..5d4c58a43 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -58,6 +58,12 @@ public: | |||
| 58 | }; | 58 | }; |
| 59 | static_assert(sizeof(Vibration) == 0x10, "Vibration is an invalid size"); | 59 | static_assert(sizeof(Vibration) == 0x10, "Vibration is an invalid size"); |
| 60 | 60 | ||
| 61 | enum class GyroscopeZeroDriftMode : u32 { | ||
| 62 | Loose = 0, | ||
| 63 | Standard = 1, | ||
| 64 | Tight = 2, | ||
| 65 | }; | ||
| 66 | |||
| 61 | enum class NpadHoldType : u64 { | 67 | enum class NpadHoldType : u64 { |
| 62 | Vertical = 0, | 68 | Vertical = 0, |
| 63 | Horizontal = 1, | 69 | Horizontal = 1, |
| @@ -117,6 +123,8 @@ public: | |||
| 117 | 123 | ||
| 118 | void ConnectNPad(u32 npad_id); | 124 | void ConnectNPad(u32 npad_id); |
| 119 | void DisconnectNPad(u32 npad_id); | 125 | void DisconnectNPad(u32 npad_id); |
| 126 | void SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode); | ||
| 127 | GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const; | ||
| 120 | LedPattern GetLedPattern(u32 npad_id); | 128 | LedPattern GetLedPattern(u32 npad_id); |
| 121 | void SetVibrationEnabled(bool can_vibrate); | 129 | void SetVibrationEnabled(bool can_vibrate); |
| 122 | bool IsVibrationEnabled() const; | 130 | bool IsVibrationEnabled() const; |
| @@ -324,8 +332,8 @@ private: | |||
| 324 | std::array<Kernel::EventPair, 10> styleset_changed_events; | 332 | std::array<Kernel::EventPair, 10> styleset_changed_events; |
| 325 | Vibration last_processed_vibration{}; | 333 | Vibration last_processed_vibration{}; |
| 326 | std::array<ControllerHolder, 10> connected_controllers{}; | 334 | std::array<ControllerHolder, 10> connected_controllers{}; |
| 335 | GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard}; | ||
| 327 | bool can_controllers_vibrate{true}; | 336 | bool can_controllers_vibrate{true}; |
| 328 | |||
| 329 | std::array<ControllerPad, 10> npad_pad_states{}; | 337 | std::array<ControllerPad, 10> npad_pad_states{}; |
| 330 | bool is_in_lr_assignment_mode{false}; | 338 | bool is_in_lr_assignment_mode{false}; |
| 331 | Core::System& system; | 339 | Core::System& system; |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 72a050de2..415c2829e 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -185,8 +185,8 @@ Hid::Hid(Core::System& system) : ServiceFramework("hid"), system(system) { | |||
| 185 | {77, nullptr, "GetAccelerometerPlayMode"}, | 185 | {77, nullptr, "GetAccelerometerPlayMode"}, |
| 186 | {78, nullptr, "ResetAccelerometerPlayMode"}, | 186 | {78, nullptr, "ResetAccelerometerPlayMode"}, |
| 187 | {79, &Hid::SetGyroscopeZeroDriftMode, "SetGyroscopeZeroDriftMode"}, | 187 | {79, &Hid::SetGyroscopeZeroDriftMode, "SetGyroscopeZeroDriftMode"}, |
| 188 | {80, nullptr, "GetGyroscopeZeroDriftMode"}, | 188 | {80, &Hid::GetGyroscopeZeroDriftMode, "GetGyroscopeZeroDriftMode"}, |
| 189 | {81, nullptr, "ResetGyroscopeZeroDriftMode"}, | 189 | {81, &Hid::ResetGyroscopeZeroDriftMode, "ResetGyroscopeZeroDriftMode"}, |
| 190 | {82, &Hid::IsSixAxisSensorAtRest, "IsSixAxisSensorAtRest"}, | 190 | {82, &Hid::IsSixAxisSensorAtRest, "IsSixAxisSensorAtRest"}, |
| 191 | {83, nullptr, "IsFirmwareUpdateAvailableForSixAxisSensor"}, | 191 | {83, nullptr, "IsFirmwareUpdateAvailableForSixAxisSensor"}, |
| 192 | {91, &Hid::ActivateGesture, "ActivateGesture"}, | 192 | {91, &Hid::ActivateGesture, "ActivateGesture"}, |
| @@ -419,9 +419,41 @@ void Hid::SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | |||
| 419 | const auto drift_mode{rp.Pop<u32>()}; | 419 | const auto drift_mode{rp.Pop<u32>()}; |
| 420 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 420 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 421 | 421 | ||
| 422 | LOG_WARNING(Service_HID, | 422 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 423 | "(STUBBED) called, handle={}, drift_mode={}, applet_resource_user_id={}", handle, | 423 | .SetGyroscopeZeroDriftMode(Controller_NPad::GyroscopeZeroDriftMode{drift_mode}); |
| 424 | drift_mode, applet_resource_user_id); | 424 | |
| 425 | LOG_DEBUG(Service_HID, "called, handle={}, drift_mode={}, applet_resource_user_id={}", handle, | ||
| 426 | drift_mode, applet_resource_user_id); | ||
| 427 | |||
| 428 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 429 | rb.Push(RESULT_SUCCESS); | ||
| 430 | } | ||
| 431 | |||
| 432 | void Hid::GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | ||
| 433 | IPC::RequestParser rp{ctx}; | ||
| 434 | const auto handle{rp.Pop<u32>()}; | ||
| 435 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 436 | |||
| 437 | LOG_DEBUG(Service_HID, "called, handle={}, applet_resource_user_id={}", handle, | ||
| 438 | applet_resource_user_id); | ||
| 439 | |||
| 440 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 441 | rb.Push(RESULT_SUCCESS); | ||
| 442 | rb.Push<u32>( | ||
| 443 | static_cast<u32>(applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 444 | .GetGyroscopeZeroDriftMode())); | ||
| 445 | } | ||
| 446 | |||
| 447 | void Hid::ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | ||
| 448 | IPC::RequestParser rp{ctx}; | ||
| 449 | const auto handle{rp.Pop<u32>()}; | ||
| 450 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 451 | |||
| 452 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 453 | .SetGyroscopeZeroDriftMode(Controller_NPad::GyroscopeZeroDriftMode::Standard); | ||
| 454 | |||
| 455 | LOG_DEBUG(Service_HID, "called, handle={}, applet_resource_user_id={}", handle, | ||
| 456 | applet_resource_user_id); | ||
| 425 | 457 | ||
| 426 | IPC::ResponseBuilder rb{ctx, 2}; | 458 | IPC::ResponseBuilder rb{ctx, 2}; |
| 427 | rb.Push(RESULT_SUCCESS); | 459 | rb.Push(RESULT_SUCCESS); |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index d481a75f8..41b330fa9 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -95,6 +95,8 @@ private: | |||
| 95 | void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx); | 95 | void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx); |
| 96 | void StartSixAxisSensor(Kernel::HLERequestContext& ctx); | 96 | void StartSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 97 | void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | 97 | void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); |
| 98 | void GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | ||
| 99 | void ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | ||
| 98 | void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx); | 100 | void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx); |
| 99 | void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | 101 | void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); |
| 100 | void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | 102 | void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); |