mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-12-25 19:02:45 -06:00
service: hid: Implement functions needed by QLaunch
This commit is contained in:
parent
9d3a293a4e
commit
bdd96118d1
3 changed files with 86 additions and 24 deletions
|
@ -289,6 +289,19 @@ enum class GyroscopeZeroDriftMode : u32 {
|
||||||
Tight = 2,
|
Tight = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This is nn::settings::system::TouchScreenMode
|
||||||
|
enum class TouchScreenMode : u32 {
|
||||||
|
Stylus = 0,
|
||||||
|
Standard = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is nn::hid::TouchScreenModeForNx
|
||||||
|
enum class TouchScreenModeForNx : u8 {
|
||||||
|
UseSystemSetting,
|
||||||
|
Finger,
|
||||||
|
Heat2,
|
||||||
|
};
|
||||||
|
|
||||||
// This is nn::hid::NpadStyleTag
|
// This is nn::hid::NpadStyleTag
|
||||||
struct NpadStyleTag {
|
struct NpadStyleTag {
|
||||||
union {
|
union {
|
||||||
|
@ -334,6 +347,14 @@ struct TouchState {
|
||||||
};
|
};
|
||||||
static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size");
|
static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size");
|
||||||
|
|
||||||
|
// This is nn::hid::TouchScreenConfigurationForNx
|
||||||
|
struct TouchScreenConfigurationForNx {
|
||||||
|
TouchScreenModeForNx mode{TouchScreenModeForNx::UseSystemSetting};
|
||||||
|
INSERT_PADDING_BYTES(0xF);
|
||||||
|
};
|
||||||
|
static_assert(sizeof(TouchScreenConfigurationForNx) == 0x10,
|
||||||
|
"TouchScreenConfigurationForNx is an invalid size");
|
||||||
|
|
||||||
struct NpadColor {
|
struct NpadColor {
|
||||||
u8 r{};
|
u8 r{};
|
||||||
u8 g{};
|
u8 g{};
|
||||||
|
@ -662,6 +683,11 @@ struct MouseState {
|
||||||
};
|
};
|
||||||
static_assert(sizeof(MouseState) == 0x28, "MouseState is an invalid size");
|
static_assert(sizeof(MouseState) == 0x28, "MouseState is an invalid size");
|
||||||
|
|
||||||
|
struct UniquePadId {
|
||||||
|
u64 id;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(UniquePadId) == 0x8, "UniquePadId is an invalid size");
|
||||||
|
|
||||||
/// Converts a NpadIdType to an array index.
|
/// Converts a NpadIdType to an array index.
|
||||||
constexpr size_t NpadIdTypeToIndex(NpadIdType npad_id_type) {
|
constexpr size_t NpadIdTypeToIndex(NpadIdType npad_id_type) {
|
||||||
switch (npad_id_type) {
|
switch (npad_id_type) {
|
||||||
|
|
|
@ -16,22 +16,6 @@ class EmulatedConsole;
|
||||||
namespace Service::HID {
|
namespace Service::HID {
|
||||||
class Controller_Touchscreen final : public ControllerBase {
|
class Controller_Touchscreen final : public ControllerBase {
|
||||||
public:
|
public:
|
||||||
// This is nn::hid::TouchScreenModeForNx
|
|
||||||
enum class TouchScreenModeForNx : u8 {
|
|
||||||
UseSystemSetting,
|
|
||||||
Finger,
|
|
||||||
Heat2,
|
|
||||||
};
|
|
||||||
|
|
||||||
// This is nn::hid::TouchScreenConfigurationForNx
|
|
||||||
struct TouchScreenConfigurationForNx {
|
|
||||||
TouchScreenModeForNx mode{TouchScreenModeForNx::UseSystemSetting};
|
|
||||||
INSERT_PADDING_BYTES_NOINIT(0x7);
|
|
||||||
INSERT_PADDING_BYTES_NOINIT(0xF); // Reserved
|
|
||||||
};
|
|
||||||
static_assert(sizeof(TouchScreenConfigurationForNx) == 0x17,
|
|
||||||
"TouchScreenConfigurationForNx is an invalid size");
|
|
||||||
|
|
||||||
explicit Controller_Touchscreen(Core::HID::HIDCore& hid_core_, u8* raw_shared_memory_);
|
explicit Controller_Touchscreen(Core::HID::HIDCore& hid_core_, u8* raw_shared_memory_);
|
||||||
~Controller_Touchscreen() override;
|
~Controller_Touchscreen() override;
|
||||||
|
|
||||||
|
|
|
@ -2368,7 +2368,7 @@ void Hid::GetNpadCommunicationMode(HLERequestContext& ctx) {
|
||||||
|
|
||||||
void Hid::SetTouchScreenConfiguration(HLERequestContext& ctx) {
|
void Hid::SetTouchScreenConfiguration(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto touchscreen_mode{rp.PopRaw<Controller_Touchscreen::TouchScreenConfigurationForNx>()};
|
const auto touchscreen_mode{rp.PopRaw<Core::HID::TouchScreenConfigurationForNx>()};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, touchscreen_mode={}, applet_resource_user_id={}",
|
LOG_WARNING(Service_HID, "(STUBBED) called, touchscreen_mode={}, applet_resource_user_id={}",
|
||||||
|
@ -2543,7 +2543,8 @@ public:
|
||||||
|
|
||||||
class HidSys final : public ServiceFramework<HidSys> {
|
class HidSys final : public ServiceFramework<HidSys> {
|
||||||
public:
|
public:
|
||||||
explicit HidSys(Core::System& system_) : ServiceFramework{system_, "hid:sys"} {
|
explicit HidSys(Core::System& system_)
|
||||||
|
: ServiceFramework{system_, "hid:sys"}, service_context{system_, "hid:sys"} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{31, nullptr, "SendKeyboardLockKeyEvent"},
|
{31, nullptr, "SendKeyboardLockKeyEvent"},
|
||||||
|
@ -2568,7 +2569,7 @@ public:
|
||||||
{303, &HidSys::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"},
|
{303, &HidSys::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"},
|
||||||
{304, nullptr, "EnableAssigningSingleOnSlSrPress"},
|
{304, nullptr, "EnableAssigningSingleOnSlSrPress"},
|
||||||
{305, nullptr, "DisableAssigningSingleOnSlSrPress"},
|
{305, nullptr, "DisableAssigningSingleOnSlSrPress"},
|
||||||
{306, nullptr, "GetLastActiveNpad"},
|
{306, &HidSys::GetLastActiveNpad, "GetLastActiveNpad"},
|
||||||
{307, nullptr, "GetNpadSystemExtStyle"},
|
{307, nullptr, "GetNpadSystemExtStyle"},
|
||||||
{308, nullptr, "ApplyNpadSystemCommonPolicyFull"},
|
{308, nullptr, "ApplyNpadSystemCommonPolicyFull"},
|
||||||
{309, nullptr, "GetNpadFullKeyGripColor"},
|
{309, nullptr, "GetNpadFullKeyGripColor"},
|
||||||
|
@ -2624,7 +2625,7 @@ public:
|
||||||
{700, nullptr, "ActivateUniquePad"},
|
{700, nullptr, "ActivateUniquePad"},
|
||||||
{702, nullptr, "AcquireUniquePadConnectionEventHandle"},
|
{702, nullptr, "AcquireUniquePadConnectionEventHandle"},
|
||||||
{703, nullptr, "GetUniquePadIds"},
|
{703, nullptr, "GetUniquePadIds"},
|
||||||
{751, nullptr, "AcquireJoyDetachOnBluetoothOffEventHandle"},
|
{751, &HidSys::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"},
|
||||||
{800, nullptr, "ListSixAxisSensorHandles"},
|
{800, nullptr, "ListSixAxisSensorHandles"},
|
||||||
{801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
|
{801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
|
||||||
{802, nullptr, "ResetSixAxisSensorCalibrationValues"},
|
{802, nullptr, "ResetSixAxisSensorCalibrationValues"},
|
||||||
|
@ -2650,7 +2651,7 @@ public:
|
||||||
{830, nullptr, "SetNotificationLedPattern"},
|
{830, nullptr, "SetNotificationLedPattern"},
|
||||||
{831, nullptr, "SetNotificationLedPatternWithTimeout"},
|
{831, nullptr, "SetNotificationLedPatternWithTimeout"},
|
||||||
{832, nullptr, "PrepareHidsForNotificationWake"},
|
{832, nullptr, "PrepareHidsForNotificationWake"},
|
||||||
{850, nullptr, "IsUsbFullKeyControllerEnabled"},
|
{850, &HidSys::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"},
|
||||||
{851, nullptr, "EnableUsbFullKeyController"},
|
{851, nullptr, "EnableUsbFullKeyController"},
|
||||||
{852, nullptr, "IsUsbConnected"},
|
{852, nullptr, "IsUsbConnected"},
|
||||||
{870, nullptr, "IsHandheldButtonPressedOnConsoleMode"},
|
{870, nullptr, "IsHandheldButtonPressedOnConsoleMode"},
|
||||||
|
@ -2682,7 +2683,7 @@ public:
|
||||||
{1150, nullptr, "SetTouchScreenMagnification"},
|
{1150, nullptr, "SetTouchScreenMagnification"},
|
||||||
{1151, nullptr, "GetTouchScreenFirmwareVersion"},
|
{1151, nullptr, "GetTouchScreenFirmwareVersion"},
|
||||||
{1152, nullptr, "SetTouchScreenDefaultConfiguration"},
|
{1152, nullptr, "SetTouchScreenDefaultConfiguration"},
|
||||||
{1153, nullptr, "GetTouchScreenDefaultConfiguration"},
|
{1153, &HidSys::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"},
|
||||||
{1154, nullptr, "IsFirmwareAvailableForNotification"},
|
{1154, nullptr, "IsFirmwareAvailableForNotification"},
|
||||||
{1155, nullptr, "SetForceHandheldStyleVibration"},
|
{1155, nullptr, "SetForceHandheldStyleVibration"},
|
||||||
{1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
|
{1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
|
||||||
|
@ -2749,6 +2750,8 @@ public:
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
|
joy_detach_event = service_context.CreateEvent("HidSys::JoyDetachEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -2760,17 +2763,66 @@ private:
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetLastActiveNpad(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_HID, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushEnum(Core::HID::NpadIdType::Handheld);
|
||||||
|
}
|
||||||
|
|
||||||
void GetUniquePadsFromNpad(HLERequestContext& ctx) {
|
void GetUniquePadsFromNpad(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto npad_id_type{rp.PopEnum<Core::HID::NpadIdType>()};
|
const auto npad_id_type{rp.PopEnum<Core::HID::NpadIdType>()};
|
||||||
|
|
||||||
const s64 total_entries = 0;
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, npad_id_type={}", npad_id_type);
|
LOG_WARNING(Service_HID, "(STUBBED) called, npad_id_type={}", npad_id_type);
|
||||||
|
|
||||||
|
const std::vector<Core::HID::UniquePadId> unique_pads{};
|
||||||
|
|
||||||
|
ctx.WriteBuffer(unique_pads);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
rb.Push(total_entries);
|
rb.Push(static_cast<u32>(unique_pads.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AcquireJoyDetachOnBluetoothOffEventHandle(HLERequestContext& ctx) {
|
||||||
|
LOG_INFO(Service_AM, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushCopyObjects(joy_detach_event->GetReadableEvent());
|
||||||
|
}
|
||||||
|
|
||||||
|
void IsUsbFullKeyControllerEnabled(HLERequestContext& ctx) {
|
||||||
|
const bool is_enabled = false;
|
||||||
|
|
||||||
|
LOG_WARNING(Service_HID, "(STUBBED) called, is_enabled={}", is_enabled);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(is_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetTouchScreenDefaultConfiguration(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_HID, "(STUBBED) called");
|
||||||
|
|
||||||
|
Core::HID::TouchScreenConfigurationForNx touchscreen_config{
|
||||||
|
.mode = Core::HID::TouchScreenModeForNx::Finger,
|
||||||
|
};
|
||||||
|
|
||||||
|
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};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushRaw(touchscreen_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
Kernel::KEvent* joy_detach_event;
|
||||||
|
KernelHelpers::ServiceContext service_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
void LoopProcess(Core::System& system) {
|
void LoopProcess(Core::System& system) {
|
||||||
|
|
Loading…
Reference in a new issue