mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 10:44:49 +01:00 
			
		
		
		
	Merge pull request #12934 from german77/hid_debug_interface
service: hid: Migrate hid debug service to new interface
This commit is contained in:
		
						commit
						c79b3af610
					
				| @ -3,6 +3,7 @@ | ||||
| 
 | ||||
| #include <algorithm> | ||||
| 
 | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
| #include "core/hle/service/hid/hid_debug_server.h" | ||||
| #include "core/hle/service/ipc_helpers.h" | ||||
| #include "hid_core/hid_types.h" | ||||
| @ -11,7 +12,6 @@ | ||||
| 
 | ||||
| #include "hid_core/resources/touch_screen/gesture.h" | ||||
| #include "hid_core/resources/touch_screen/touch_screen.h" | ||||
| #include "hid_core/resources/touch_screen/touch_types.h" | ||||
| 
 | ||||
| namespace Service::HID { | ||||
| 
 | ||||
| @ -24,14 +24,14 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource | ||||
|         {0, nullptr, "DeactivateDebugPad"}, | ||||
|         {1, nullptr, "SetDebugPadAutoPilotState"}, | ||||
|         {2, nullptr, "UnsetDebugPadAutoPilotState"}, | ||||
|         {10, &IHidDebugServer::DeactivateTouchScreen, "DeactivateTouchScreen"}, | ||||
|         {11, &IHidDebugServer::SetTouchScreenAutoPilotState, "SetTouchScreenAutoPilotState"}, | ||||
|         {12, &IHidDebugServer::UnsetTouchScreenAutoPilotState, "UnsetTouchScreenAutoPilotState"}, | ||||
|         {13, &IHidDebugServer::GetTouchScreenConfiguration, "GetTouchScreenConfiguration"}, | ||||
|         {14, &IHidDebugServer::ProcessTouchScreenAutoTune, "ProcessTouchScreenAutoTune"}, | ||||
|         {15, &IHidDebugServer::ForceStopTouchScreenManagement, "ForceStopTouchScreenManagement"}, | ||||
|         {16, &IHidDebugServer::ForceRestartTouchScreenManagement, "ForceRestartTouchScreenManagement"}, | ||||
|         {17, &IHidDebugServer::IsTouchScreenManaged, "IsTouchScreenManaged"}, | ||||
|         {10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"}, | ||||
|         {11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"}, | ||||
|         {12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"}, | ||||
|         {13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"}, | ||||
|         {14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"}, | ||||
|         {15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"}, | ||||
|         {16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"}, | ||||
|         {17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"}, | ||||
|         {20, nullptr, "DeactivateMouse"}, | ||||
|         {21, nullptr, "SetMouseAutoPilotState"}, | ||||
|         {22, nullptr, "UnsetMouseAutoPilotState"}, | ||||
| @ -47,7 +47,7 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource | ||||
|         {60, nullptr, "ClearNpadSystemCommonPolicy"}, | ||||
|         {61, nullptr, "DeactivateNpad"}, | ||||
|         {62, nullptr, "ForceDisconnectNpad"}, | ||||
|         {91, &IHidDebugServer::DeactivateGesture, "DeactivateGesture"}, | ||||
|         {91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"}, | ||||
|         {110, nullptr, "DeactivateHomeButton"}, | ||||
|         {111, nullptr, "SetHomeButtonAutoPilotState"}, | ||||
|         {112, nullptr, "UnsetHomeButtonAutoPilotState"}, | ||||
| @ -160,169 +160,122 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource | ||||
| } | ||||
| 
 | ||||
| IHidDebugServer::~IHidDebugServer() = default; | ||||
| void IHidDebugServer::DeactivateTouchScreen(HLERequestContext& ctx) { | ||||
| 
 | ||||
| Result IHidDebugServer::DeactivateTouchScreen() { | ||||
|     LOG_INFO(Service_HID, "called"); | ||||
| 
 | ||||
|     Result result = ResultSuccess; | ||||
| 
 | ||||
|     if (!firmware_settings->IsDeviceManaged()) { | ||||
|         result = GetResourceManager()->GetTouchScreen()->Deactivate(); | ||||
|         R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate()); | ||||
|     } | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
| 
 | ||||
| void IHidDebugServer::SetTouchScreenAutoPilotState(HLERequestContext& ctx) { | ||||
| Result IHidDebugServer::SetTouchScreenAutoPilotState( | ||||
|     InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer) { | ||||
|     AutoPilotState auto_pilot{}; | ||||
|     auto_pilot.count = ctx.GetReadBufferNumElements<TouchState>(); | ||||
|     const auto buffer = ctx.ReadBuffer(); | ||||
| 
 | ||||
|     auto_pilot.count = std::min(auto_pilot.count, static_cast<u64>(auto_pilot.state.size())); | ||||
|     memcpy(auto_pilot.state.data(), buffer.data(), auto_pilot.count * sizeof(TouchState)); | ||||
|     auto_pilot.count = | ||||
|         static_cast<u64>(std::min(auto_pilot_buffer.size(), auto_pilot.state.size())); | ||||
|     memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(), | ||||
|            auto_pilot.count * sizeof(TouchState)); | ||||
| 
 | ||||
|     LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count); | ||||
| 
 | ||||
|     const Result result = | ||||
|         GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot); | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
|     R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot)); | ||||
| } | ||||
| 
 | ||||
| void IHidDebugServer::UnsetTouchScreenAutoPilotState(HLERequestContext& ctx) { | ||||
| Result IHidDebugServer::UnsetTouchScreenAutoPilotState() { | ||||
|     LOG_INFO(Service_HID, "called"); | ||||
| 
 | ||||
|     const Result result = GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState(); | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
|     R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState()); | ||||
| } | ||||
| 
 | ||||
| void IHidDebugServer::GetTouchScreenConfiguration(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto applet_resource_user_id{rp.Pop<u64>()}; | ||||
| Result IHidDebugServer::GetTouchScreenConfiguration( | ||||
|     Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config, | ||||
|     ClientAppletResourceUserId aruid) { | ||||
|     LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid); | ||||
| 
 | ||||
|     LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | ||||
|     R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( | ||||
|         *out_touchscreen_config, aruid.pid)); | ||||
| 
 | ||||
|     Core::HID::TouchScreenConfigurationForNx touchscreen_config{}; | ||||
|     const Result result = GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( | ||||
|         touchscreen_config, applet_resource_user_id); | ||||
| 
 | ||||
|     if (touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Heat2 && | ||||
|         touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Finger) { | ||||
|         touchscreen_config.mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; | ||||
|     if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 && | ||||
|         out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) { | ||||
|         out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; | ||||
|     } | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 6}; | ||||
|     rb.Push(result); | ||||
|     rb.PushRaw(touchscreen_config); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
| 
 | ||||
| void IHidDebugServer::ProcessTouchScreenAutoTune(HLERequestContext& ctx) { | ||||
| Result IHidDebugServer::ProcessTouchScreenAutoTune() { | ||||
|     LOG_INFO(Service_HID, "called"); | ||||
| 
 | ||||
|     Result result = GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune(); | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
|     R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune()); | ||||
| } | ||||
| 
 | ||||
| void IHidDebugServer::ForceStopTouchScreenManagement(HLERequestContext& ctx) { | ||||
| Result IHidDebugServer::ForceStopTouchScreenManagement() { | ||||
|     LOG_INFO(Service_HID, "called"); | ||||
| 
 | ||||
|     if (!firmware_settings->IsDeviceManaged()) { | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         return; | ||||
|         R_SUCCEED(); | ||||
|     } | ||||
| 
 | ||||
|     Result result = ResultSuccess; | ||||
|     bool is_touch_active{}; | ||||
|     bool is_gesture_active{}; | ||||
|     auto touch_screen = GetResourceManager()->GetTouchScreen(); | ||||
|     auto gesture = GetResourceManager()->GetGesture(); | ||||
| 
 | ||||
|     if (firmware_settings->IsTouchI2cManaged()) { | ||||
|         result = touch_screen->IsActive(is_touch_active); | ||||
|         if (result.IsSuccess()) { | ||||
|             result = gesture->IsActive(is_gesture_active); | ||||
|         bool is_touch_active{}; | ||||
|         bool is_gesture_active{}; | ||||
|         R_TRY(touch_screen->IsActive(is_touch_active)); | ||||
|         R_TRY(gesture->IsActive(is_gesture_active)); | ||||
| 
 | ||||
|         if (is_touch_active) { | ||||
|             R_TRY(touch_screen->Deactivate()); | ||||
|         } | ||||
|         if (result.IsSuccess() && is_touch_active) { | ||||
|             result = touch_screen->Deactivate(); | ||||
|         } | ||||
|         if (result.IsSuccess() && is_gesture_active) { | ||||
|             result = gesture->Deactivate(); | ||||
|         if (is_gesture_active) { | ||||
|             R_TRY(gesture->Deactivate()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
| 
 | ||||
| void IHidDebugServer::ForceRestartTouchScreenManagement(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     struct Parameters { | ||||
|         u32 basic_gesture_id; | ||||
|         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>()}; | ||||
| 
 | ||||
| Result IHidDebugServer::ForceRestartTouchScreenManagement(u32 basic_gesture_id, | ||||
|                                                           ClientAppletResourceUserId aruid) { | ||||
|     LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}", | ||||
|              parameters.basic_gesture_id, parameters.applet_resource_user_id); | ||||
|              basic_gesture_id, aruid.pid); | ||||
| 
 | ||||
|     Result result = ResultSuccess; | ||||
|     auto touch_screen = GetResourceManager()->GetTouchScreen(); | ||||
|     auto gesture = GetResourceManager()->GetGesture(); | ||||
| 
 | ||||
|     if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) { | ||||
|         result = gesture->Activate(); | ||||
|         if (result.IsSuccess()) { | ||||
|             result = | ||||
|                 gesture->Activate(parameters.applet_resource_user_id, parameters.basic_gesture_id); | ||||
|         } | ||||
|         if (result.IsSuccess()) { | ||||
|             result = touch_screen->Activate(); | ||||
|         } | ||||
|         if (result.IsSuccess()) { | ||||
|             result = touch_screen->Activate(parameters.applet_resource_user_id); | ||||
|         } | ||||
|         R_TRY(gesture->Activate()); | ||||
|         R_TRY(gesture->Activate(aruid.pid, basic_gesture_id)); | ||||
|         R_TRY(touch_screen->Activate()); | ||||
|         R_TRY(touch_screen->Activate(aruid.pid)); | ||||
|     } | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
| 
 | ||||
| void IHidDebugServer::IsTouchScreenManaged(HLERequestContext& ctx) { | ||||
| Result IHidDebugServer::IsTouchScreenManaged(Out<bool> out_is_managed) { | ||||
|     LOG_INFO(Service_HID, "called"); | ||||
| 
 | ||||
|     bool is_touch_active{}; | ||||
|     bool is_gesture_active{}; | ||||
|     R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active)); | ||||
|     R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active)); | ||||
| 
 | ||||
|     Result result = GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active); | ||||
|     if (result.IsSuccess()) { | ||||
|         result = GetResourceManager()->GetGesture()->IsActive(is_gesture_active); | ||||
|     } | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(result); | ||||
|     rb.Push(is_touch_active | is_gesture_active); | ||||
|     *out_is_managed = is_touch_active || is_gesture_active; | ||||
|     R_SUCCEED(); | ||||
| } | ||||
| 
 | ||||
| void IHidDebugServer::DeactivateGesture(HLERequestContext& ctx) { | ||||
| Result IHidDebugServer::DeactivateGesture() { | ||||
|     LOG_INFO(Service_HID, "called"); | ||||
| 
 | ||||
|     Result result = ResultSuccess; | ||||
| 
 | ||||
|     if (!firmware_settings->IsDeviceManaged()) { | ||||
|         result = GetResourceManager()->GetGesture()->Deactivate(); | ||||
|         R_RETURN(GetResourceManager()->GetGesture()->Deactivate()); | ||||
|     } | ||||
| 
 | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
| 
 | ||||
| std::shared_ptr<ResourceManager> IHidDebugServer::GetResourceManager() { | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
| #include "hid_core/resources/touch_screen/touch_types.h" | ||||
| 
 | ||||
| namespace Core { | ||||
| class System; | ||||
| @ -20,15 +22,19 @@ public: | ||||
|     ~IHidDebugServer() override; | ||||
| 
 | ||||
| private: | ||||
|     void DeactivateTouchScreen(HLERequestContext& ctx); | ||||
|     void SetTouchScreenAutoPilotState(HLERequestContext& ctx); | ||||
|     void UnsetTouchScreenAutoPilotState(HLERequestContext& ctx); | ||||
|     void GetTouchScreenConfiguration(HLERequestContext& ctx); | ||||
|     void ProcessTouchScreenAutoTune(HLERequestContext& ctx); | ||||
|     void ForceStopTouchScreenManagement(HLERequestContext& ctx); | ||||
|     void ForceRestartTouchScreenManagement(HLERequestContext& ctx); | ||||
|     void IsTouchScreenManaged(HLERequestContext& ctx); | ||||
|     void DeactivateGesture(HLERequestContext& ctx); | ||||
|     Result DeactivateTouchScreen(); | ||||
|     Result SetTouchScreenAutoPilotState( | ||||
|         InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer); | ||||
|     Result UnsetTouchScreenAutoPilotState(); | ||||
|     Result GetTouchScreenConfiguration( | ||||
|         Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config, | ||||
|         ClientAppletResourceUserId aruid); | ||||
|     Result ProcessTouchScreenAutoTune(); | ||||
|     Result ForceStopTouchScreenManagement(); | ||||
|     Result ForceRestartTouchScreenManagement(u32 basic_gesture_id, | ||||
|                                              ClientAppletResourceUserId aruid); | ||||
|     Result IsTouchScreenManaged(Out<bool> out_is_managed); | ||||
|     Result DeactivateGesture(); | ||||
| 
 | ||||
|     std::shared_ptr<ResourceManager> GetResourceManager(); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user