diff options
Diffstat (limited to 'src/core/hle/service')
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 32 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 8 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 64 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 2 | 
4 files changed, 103 insertions, 3 deletions
| diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index c9909ad5a..9ce25c641 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp @@ -66,7 +66,7 @@ ResultCode Controller_NPad::VerifyValidSixAxisSensorHandle(      if (!device_index) {          return NpadDeviceIndexOutOfRange;      } -    // This doesn't get validaded on nnsdk +    // This doesn't get validated on nnsdk      const bool npad_type = device_handle.npad_type < Core::HID::NpadStyleIndex::MaxNpadType;      if (!npad_type) {          return NpadInvalidHandle; @@ -1100,6 +1100,36 @@ ResultCode Controller_NPad::IsSixAxisSensorUnalteredPassthroughEnabled(      return ResultSuccess;  } +ResultCode Controller_NPad::LoadSixAxisSensorCalibrationParameter( +    const Core::HID::SixAxisSensorHandle& sixaxis_handle, +    Core::HID::SixAxisSensorCalibrationParameter& calibration) const { +    const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); +    if (is_valid.IsError()) { +        LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); +        return is_valid; +    } + +    // TODO: Request this data to the controller. On error return 0xd8ca +    const auto& sixaxis = GetSixaxisState(sixaxis_handle); +    calibration = sixaxis.calibration; +    return ResultSuccess; +} + +ResultCode Controller_NPad::GetSixAxisSensorIcInformation( +    const Core::HID::SixAxisSensorHandle& sixaxis_handle, +    Core::HID::SixAxisSensorIcInformation& ic_information) const { +    const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); +    if (is_valid.IsError()) { +        LOG_ERROR(Service_HID, "Invalid handle, error_code={}", is_valid.raw); +        return is_valid; +    } + +    // TODO: Request this data to the controller. On error return 0xd8ca +    const auto& sixaxis = GetSixaxisState(sixaxis_handle); +    ic_information = sixaxis.ic_information; +    return ResultSuccess; +} +  ResultCode Controller_NPad::SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,                                                bool sixaxis_status) {      const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle); diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 951f46425..2e2e1d07f 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -155,6 +155,12 @@ public:          const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool is_enabled);      ResultCode IsSixAxisSensorUnalteredPassthroughEnabled(          const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool& is_enabled) const; +    ResultCode LoadSixAxisSensorCalibrationParameter( +        const Core::HID::SixAxisSensorHandle& sixaxis_handle, +        Core::HID::SixAxisSensorCalibrationParameter& calibration) const; +    ResultCode GetSixAxisSensorIcInformation( +        const Core::HID::SixAxisSensorHandle& sixaxis_handle, +        Core::HID::SixAxisSensorIcInformation& ic_information) const;      ResultCode SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,                                   bool sixaxis_status);      ResultCode IsSixAxisSensorFusionEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle, @@ -474,6 +480,8 @@ private:          bool is_fusion_enabled{true};          bool unaltered_passtrough{false};          Core::HID::SixAxisSensorFusionParameters fusion{}; +        Core::HID::SixAxisSensorCalibrationParameter calibration{}; +        Core::HID::SixAxisSensorIcInformation ic_information{};          GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard};      }; diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 1fb3b790c..19d12cf51 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -260,8 +260,8 @@ Hid::Hid(Core::System& system_)          {84, &Hid::EnableSixAxisSensorUnalteredPassthrough, "EnableSixAxisSensorUnalteredPassthrough"},          {85, &Hid::IsSixAxisSensorUnalteredPassthroughEnabled, "IsSixAxisSensorUnalteredPassthroughEnabled"},          {86, nullptr, "StoreSixAxisSensorCalibrationParameter"}, -        {87, nullptr, "LoadSixAxisSensorCalibrationParameter"}, -        {88, nullptr, "GetSixAxisSensorIcInformation"}, +        {87, &Hid::LoadSixAxisSensorCalibrationParameter, "LoadSixAxisSensorCalibrationParameter"}, +        {88, &Hid::GetSixAxisSensorIcInformation, "GetSixAxisSensorIcInformation"},          {89, nullptr, "ResetIsSixAxisSensorDeviceNewlyAssigned"},          {91, &Hid::ActivateGesture, "ActivateGesture"},          {100, &Hid::SetSupportedNpadStyleSet, "SetSupportedNpadStyleSet"}, @@ -870,6 +870,66 @@ void Hid::IsSixAxisSensorUnalteredPassthroughEnabled(Kernel::HLERequestContext&      rb.Push(is_unaltered_sisxaxis_enabled);  } +void Hid::LoadSixAxisSensorCalibrationParameter(Kernel::HLERequestContext& ctx) { +    IPC::RequestParser rp{ctx}; +    struct Parameters { +        Core::HID::SixAxisSensorHandle sixaxis_handle; +        INSERT_PADDING_WORDS_NOINIT(1); +        u64 applet_resource_user_id; +    }; +    static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); + +    const auto parameters{rp.PopRaw<Parameters>()}; + +    Core::HID::SixAxisSensorCalibrationParameter calibration{}; +    auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); +    const auto result = +        controller.LoadSixAxisSensorCalibrationParameter(parameters.sixaxis_handle, calibration); + +    LOG_WARNING( +        Service_HID, +        "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}", +        parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id, +        parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id); + +    if (result.IsSuccess()) { +        ctx.WriteBuffer(calibration); +    } + +    IPC::ResponseBuilder rb{ctx, 2}; +    rb.Push(result); +} + +void Hid::GetSixAxisSensorIcInformation(Kernel::HLERequestContext& ctx) { +    IPC::RequestParser rp{ctx}; +    struct Parameters { +        Core::HID::SixAxisSensorHandle sixaxis_handle; +        INSERT_PADDING_WORDS_NOINIT(1); +        u64 applet_resource_user_id; +    }; +    static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); + +    const auto parameters{rp.PopRaw<Parameters>()}; + +    Core::HID::SixAxisSensorIcInformation ic_information{}; +    auto& controller = GetAppletResource()->GetController<Controller_NPad>(HidController::NPad); +    const auto result = +        controller.GetSixAxisSensorIcInformation(parameters.sixaxis_handle, ic_information); + +    LOG_WARNING( +        Service_HID, +        "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}", +        parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id, +        parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id); + +    if (result.IsSuccess()) { +        ctx.WriteBuffer(ic_information); +    } + +    IPC::ResponseBuilder rb{ctx, 2}; +    rb.Push(result); +} +  void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) {      IPC::RequestParser rp{ctx};      struct Parameters { diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index b8515a002..726a031de 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -115,6 +115,8 @@ private:      void IsFirmwareUpdateAvailableForSixAxisSensor(Kernel::HLERequestContext& ctx);      void EnableSixAxisSensorUnalteredPassthrough(Kernel::HLERequestContext& ctx);      void IsSixAxisSensorUnalteredPassthroughEnabled(Kernel::HLERequestContext& ctx); +    void LoadSixAxisSensorCalibrationParameter(Kernel::HLERequestContext& ctx); +    void GetSixAxisSensorIcInformation(Kernel::HLERequestContext& ctx);      void ActivateGesture(Kernel::HLERequestContext& ctx);      void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);      void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | 
