mirror of
				https://git.h3cjp.net/H3cJP/citra.git
				synced 2025-11-04 00:46:37 +00:00 
			
		
		
		
	service: hid: Migrate hid debug service to new interface
This commit is contained in:
		
							parent
							
								
									a2f23746c2
								
							
						
					
					
						commit
						b6106604c4
					
				| 
						 | 
				
			
			@ -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 a new issue