service: hid: Implement LoadSixAxisSensorCalibrationParameter and GetSixAxisSensorIcInformation
Needed by Nintendo Switch Sports
This commit is contained in:
parent
c889a5805e
commit
240f59a4c8
5 changed files with 136 additions and 3 deletions
|
@ -498,6 +498,39 @@ struct SixAxisSensorFusionParameters {
|
||||||
static_assert(sizeof(SixAxisSensorFusionParameters) == 8,
|
static_assert(sizeof(SixAxisSensorFusionParameters) == 8,
|
||||||
"SixAxisSensorFusionParameters is an invalid size");
|
"SixAxisSensorFusionParameters is an invalid size");
|
||||||
|
|
||||||
|
// This is nn::hid::SixAxisSensorCalibrationParameter
|
||||||
|
struct SixAxisSensorCalibrationParameter {
|
||||||
|
std::array<u8, 0x744> unknown_data{};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(SixAxisSensorCalibrationParameter) == 0x744,
|
||||||
|
"SixAxisSensorCalibrationParameter is an invalid size");
|
||||||
|
|
||||||
|
// This is nn::hid::SixAxisSensorIcInformation
|
||||||
|
struct SixAxisSensorIcInformation {
|
||||||
|
f32 angular_rate{2000.0f}; // dps
|
||||||
|
std::array<f32, 6> unknown_gyro_data1{
|
||||||
|
-10.0f, -10.0f, -10.0f, 10.0f, 10.0f, 10.0f,
|
||||||
|
}; // dps
|
||||||
|
std::array<f32, 9> unknown_gyro_data2{
|
||||||
|
0.95f, -0.003f, -0.003f, -0.003f, 0.95f, -0.003f, -0.003f, -0.003f, 0.95f,
|
||||||
|
};
|
||||||
|
std::array<f32, 9> unknown_gyro_data3{
|
||||||
|
1.05f, 0.003f, 0.003f, 0.003f, 1.05f, 0.003f, 0.003f, 0.003f, 1.05f,
|
||||||
|
};
|
||||||
|
f32 acceleration_range{8.0f}; // g force
|
||||||
|
std::array<f32, 6> unknown_accel_data1{
|
||||||
|
-0.0612f, -0.0612f, -0.0612f, 0.0612f, 0.0612f, 0.0612f,
|
||||||
|
}; // g force
|
||||||
|
std::array<f32, 9> unknown_accel_data2{
|
||||||
|
0.95f, -0.003f, -0.003f, -0.003f, 0.95f, -0.003f, -0.003f, -0.003f, 0.95f,
|
||||||
|
};
|
||||||
|
std::array<f32, 9> unknown_accel_data3{
|
||||||
|
1.05f, 0.003f, 0.003f, 0.003f, 1.05f, 0.003f, 0.003f, 0.003f, 1.05f,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(SixAxisSensorIcInformation) == 0xC8,
|
||||||
|
"SixAxisSensorIcInformation is an invalid size");
|
||||||
|
|
||||||
// This is nn::hid::VibrationDeviceHandle
|
// This is nn::hid::VibrationDeviceHandle
|
||||||
struct VibrationDeviceHandle {
|
struct VibrationDeviceHandle {
|
||||||
NpadStyleIndex npad_type{NpadStyleIndex::None};
|
NpadStyleIndex npad_type{NpadStyleIndex::None};
|
||||||
|
|
|
@ -66,7 +66,7 @@ ResultCode Controller_NPad::VerifyValidSixAxisSensorHandle(
|
||||||
if (!device_index) {
|
if (!device_index) {
|
||||||
return NpadDeviceIndexOutOfRange;
|
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;
|
const bool npad_type = device_handle.npad_type < Core::HID::NpadStyleIndex::MaxNpadType;
|
||||||
if (!npad_type) {
|
if (!npad_type) {
|
||||||
return NpadInvalidHandle;
|
return NpadInvalidHandle;
|
||||||
|
@ -1100,6 +1100,36 @@ ResultCode Controller_NPad::IsSixAxisSensorUnalteredPassthroughEnabled(
|
||||||
return ResultSuccess;
|
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,
|
ResultCode Controller_NPad::SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
||||||
bool sixaxis_status) {
|
bool sixaxis_status) {
|
||||||
const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle);
|
const auto is_valid = VerifyValidSixAxisSensorHandle(sixaxis_handle);
|
||||||
|
|
|
@ -155,6 +155,12 @@ public:
|
||||||
const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool is_enabled);
|
const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool is_enabled);
|
||||||
ResultCode IsSixAxisSensorUnalteredPassthroughEnabled(
|
ResultCode IsSixAxisSensorUnalteredPassthroughEnabled(
|
||||||
const Core::HID::SixAxisSensorHandle& sixaxis_handle, bool& is_enabled) const;
|
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,
|
ResultCode SetSixAxisEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
||||||
bool sixaxis_status);
|
bool sixaxis_status);
|
||||||
ResultCode IsSixAxisSensorFusionEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
ResultCode IsSixAxisSensorFusionEnabled(const Core::HID::SixAxisSensorHandle& sixaxis_handle,
|
||||||
|
@ -474,6 +480,8 @@ private:
|
||||||
bool is_fusion_enabled{true};
|
bool is_fusion_enabled{true};
|
||||||
bool unaltered_passtrough{false};
|
bool unaltered_passtrough{false};
|
||||||
Core::HID::SixAxisSensorFusionParameters fusion{};
|
Core::HID::SixAxisSensorFusionParameters fusion{};
|
||||||
|
Core::HID::SixAxisSensorCalibrationParameter calibration{};
|
||||||
|
Core::HID::SixAxisSensorIcInformation ic_information{};
|
||||||
GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard};
|
GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -260,8 +260,8 @@ Hid::Hid(Core::System& system_)
|
||||||
{84, &Hid::EnableSixAxisSensorUnalteredPassthrough, "EnableSixAxisSensorUnalteredPassthrough"},
|
{84, &Hid::EnableSixAxisSensorUnalteredPassthrough, "EnableSixAxisSensorUnalteredPassthrough"},
|
||||||
{85, &Hid::IsSixAxisSensorUnalteredPassthroughEnabled, "IsSixAxisSensorUnalteredPassthroughEnabled"},
|
{85, &Hid::IsSixAxisSensorUnalteredPassthroughEnabled, "IsSixAxisSensorUnalteredPassthroughEnabled"},
|
||||||
{86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
|
{86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
|
||||||
{87, nullptr, "LoadSixAxisSensorCalibrationParameter"},
|
{87, &Hid::LoadSixAxisSensorCalibrationParameter, "LoadSixAxisSensorCalibrationParameter"},
|
||||||
{88, nullptr, "GetSixAxisSensorIcInformation"},
|
{88, &Hid::GetSixAxisSensorIcInformation, "GetSixAxisSensorIcInformation"},
|
||||||
{89, nullptr, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
|
{89, nullptr, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
|
||||||
{91, &Hid::ActivateGesture, "ActivateGesture"},
|
{91, &Hid::ActivateGesture, "ActivateGesture"},
|
||||||
{100, &Hid::SetSupportedNpadStyleSet, "SetSupportedNpadStyleSet"},
|
{100, &Hid::SetSupportedNpadStyleSet, "SetSupportedNpadStyleSet"},
|
||||||
|
@ -870,6 +870,66 @@ void Hid::IsSixAxisSensorUnalteredPassthroughEnabled(Kernel::HLERequestContext&
|
||||||
rb.Push(is_unaltered_sisxaxis_enabled);
|
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) {
|
void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
struct Parameters {
|
struct Parameters {
|
||||||
|
|
|
@ -115,6 +115,8 @@ private:
|
||||||
void IsFirmwareUpdateAvailableForSixAxisSensor(Kernel::HLERequestContext& ctx);
|
void IsFirmwareUpdateAvailableForSixAxisSensor(Kernel::HLERequestContext& ctx);
|
||||||
void EnableSixAxisSensorUnalteredPassthrough(Kernel::HLERequestContext& ctx);
|
void EnableSixAxisSensorUnalteredPassthrough(Kernel::HLERequestContext& ctx);
|
||||||
void IsSixAxisSensorUnalteredPassthroughEnabled(Kernel::HLERequestContext& ctx);
|
void IsSixAxisSensorUnalteredPassthroughEnabled(Kernel::HLERequestContext& ctx);
|
||||||
|
void LoadSixAxisSensorCalibrationParameter(Kernel::HLERequestContext& ctx);
|
||||||
|
void GetSixAxisSensorIcInformation(Kernel::HLERequestContext& ctx);
|
||||||
void ActivateGesture(Kernel::HLERequestContext& ctx);
|
void ActivateGesture(Kernel::HLERequestContext& ctx);
|
||||||
void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
|
void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
|
||||||
void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
|
void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
|
||||||
|
|
Loading…
Reference in a new issue