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