forked from eden-emu/eden
		
	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, | ||||
|               "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
 | ||||
| struct VibrationDeviceHandle { | ||||
|     NpadStyleIndex npad_type{NpadStyleIndex::None}; | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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}; | ||||
|     }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 { | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 german77
						german77