summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/hid/hid_debug_server.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/hid/hid_debug_server.cpp149
1 files changed, 138 insertions, 11 deletions
diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp
index f2a767d37..4e2663672 100644
--- a/src/core/hle/service/hid/hid_debug_server.cpp
+++ b/src/core/hle/service/hid/hid_debug_server.cpp
@@ -1,27 +1,37 @@
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
+#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"
#include "hid_core/resource_manager.h"
+#include "hid_core/resources/hid_firmware_settings.h"
+
+#include "hid_core/resources/touch_screen/gesture.h"
+#include "hid_core/resources/touch_screen/touch_screen.h"
namespace Service::HID {
-IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource)
- : ServiceFramework{system_, "hid:dbg"}, resource_manager{resource} {
+IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
+ std::shared_ptr<HidFirmwareSettings> settings)
+ : ServiceFramework{system_, "hid:dbg"}, resource_manager{resource}, firmware_settings{
+ settings} {
// clang-format off
static const FunctionInfo functions[] = {
{0, nullptr, "DeactivateDebugPad"},
{1, nullptr, "SetDebugPadAutoPilotState"},
{2, nullptr, "UnsetDebugPadAutoPilotState"},
- {10, nullptr, "DeactivateTouchScreen"},
- {11, nullptr, "SetTouchScreenAutoPilotState"},
- {12, nullptr, "UnsetTouchScreenAutoPilotState"},
- {13, nullptr, "GetTouchScreenConfiguration"},
- {14, nullptr, "ProcessTouchScreenAutoTune"},
- {15, nullptr, "ForceStopTouchScreenManagement"},
- {16, nullptr, "ForceRestartTouchScreenManagement"},
- {17, nullptr, "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"},
@@ -37,7 +47,7 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource
{60, nullptr, "ClearNpadSystemCommonPolicy"},
{61, nullptr, "DeactivateNpad"},
{62, nullptr, "ForceDisconnectNpad"},
- {91, nullptr, "DeactivateGesture"},
+ {91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"},
{110, nullptr, "DeactivateHomeButton"},
{111, nullptr, "SetHomeButtonAutoPilotState"},
{112, nullptr, "UnsetHomeButtonAutoPilotState"},
@@ -151,6 +161,123 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource
IHidDebugServer::~IHidDebugServer() = default;
+Result IHidDebugServer::DeactivateTouchScreen() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate());
+ }
+
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::SetTouchScreenAutoPilotState(
+ InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer) {
+ AutoPilotState auto_pilot{};
+
+ 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);
+
+ R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot));
+}
+
+Result IHidDebugServer::UnsetTouchScreenAutoPilotState() {
+ LOG_INFO(Service_HID, "called");
+ R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState());
+}
+
+Result IHidDebugServer::GetTouchScreenConfiguration(
+ Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config,
+ ClientAppletResourceUserId aruid) {
+ LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid);
+
+ R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration(
+ *out_touchscreen_config, aruid.pid));
+
+ 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;
+ }
+
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::ProcessTouchScreenAutoTune() {
+ LOG_INFO(Service_HID, "called");
+ R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune());
+}
+
+Result IHidDebugServer::ForceStopTouchScreenManagement() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_SUCCEED();
+ }
+
+ auto touch_screen = GetResourceManager()->GetTouchScreen();
+ auto gesture = GetResourceManager()->GetGesture();
+
+ if (firmware_settings->IsTouchI2cManaged()) {
+ 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 (is_gesture_active) {
+ R_TRY(gesture->Deactivate());
+ }
+ }
+
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::ForceRestartTouchScreenManagement(u32 basic_gesture_id,
+ ClientAppletResourceUserId aruid) {
+ LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}",
+ basic_gesture_id, aruid.pid);
+
+ auto touch_screen = GetResourceManager()->GetTouchScreen();
+ auto gesture = GetResourceManager()->GetGesture();
+
+ if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) {
+ 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));
+ }
+
+ R_SUCCEED();
+}
+
+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));
+
+ *out_is_managed = is_touch_active || is_gesture_active;
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::DeactivateGesture() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_RETURN(GetResourceManager()->GetGesture()->Deactivate());
+ }
+
+ R_SUCCEED();
+}
+
std::shared_ptr<ResourceManager> IHidDebugServer::GetResourceManager() {
resource_manager->Initialize();
return resource_manager;