|
|
|
@ -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) { |
|
|
|
LOG_INFO(Service_HID, "called"); |
|
|
|
|
|
|
|
Result result = ResultSuccess; |
|
|
|
Result IHidDebugServer::DeactivateTouchScreen() { |
|
|
|
LOG_INFO(Service_HID, "called"); |
|
|
|
|
|
|
|
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>()}; |
|
|
|
|
|
|
|
LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
|
|
|
Result IHidDebugServer::GetTouchScreenConfiguration( |
|
|
|
Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config, |
|
|
|
ClientAppletResourceUserId aruid) { |
|
|
|
LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid); |
|
|
|
|
|
|
|
Core::HID::TouchScreenConfigurationForNx touchscreen_config{}; |
|
|
|
const Result result = GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( |
|
|
|
touchscreen_config, applet_resource_user_id); |
|
|
|
R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( |
|
|
|
*out_touchscreen_config, aruid.pid)); |
|
|
|
|
|
|
|
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); |
|
|
|
} |
|
|
|
if (result.IsSuccess() && is_touch_active) { |
|
|
|
result = touch_screen->Deactivate(); |
|
|
|
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_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); |
|
|
|
*out_is_managed = is_touch_active || is_gesture_active; |
|
|
|
R_SUCCEED(); |
|
|
|
} |
|
|
|
|
|
|
|
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"); |
|
|
|
|
|
|
|
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() { |
|
|
|
|