service: hid: Implement functions needed by QLaunch
This commit is contained in:
		@@ -289,6 +289,19 @@ enum class GyroscopeZeroDriftMode : u32 {
 | 
			
		||||
    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
 | 
			
		||||
struct NpadStyleTag {
 | 
			
		||||
    union {
 | 
			
		||||
@@ -334,6 +347,14 @@ struct TouchState {
 | 
			
		||||
};
 | 
			
		||||
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 {
 | 
			
		||||
    u8 r{};
 | 
			
		||||
    u8 g{};
 | 
			
		||||
@@ -662,6 +683,11 @@ struct MouseState {
 | 
			
		||||
};
 | 
			
		||||
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.
 | 
			
		||||
constexpr size_t NpadIdTypeToIndex(NpadIdType npad_id_type) {
 | 
			
		||||
    switch (npad_id_type) {
 | 
			
		||||
 
 | 
			
		||||
@@ -16,22 +16,6 @@ class EmulatedConsole;
 | 
			
		||||
namespace Service::HID {
 | 
			
		||||
class Controller_Touchscreen final : public ControllerBase {
 | 
			
		||||
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_);
 | 
			
		||||
    ~Controller_Touchscreen() override;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2368,7 +2368,7 @@ void Hid::GetNpadCommunicationMode(HLERequestContext& ctx) {
 | 
			
		||||
 | 
			
		||||
void Hid::SetTouchScreenConfiguration(HLERequestContext& 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>()};
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service_HID, "(STUBBED) called, touchscreen_mode={}, applet_resource_user_id={}",
 | 
			
		||||
@@ -2543,7 +2543,8 @@ public:
 | 
			
		||||
 | 
			
		||||
class HidSys final : public ServiceFramework<HidSys> {
 | 
			
		||||
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
 | 
			
		||||
        static const FunctionInfo functions[] = {
 | 
			
		||||
            {31, nullptr, "SendKeyboardLockKeyEvent"},
 | 
			
		||||
@@ -2568,7 +2569,7 @@ public:
 | 
			
		||||
            {303, &HidSys::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"},
 | 
			
		||||
            {304, nullptr, "EnableAssigningSingleOnSlSrPress"},
 | 
			
		||||
            {305, nullptr, "DisableAssigningSingleOnSlSrPress"},
 | 
			
		||||
            {306, nullptr, "GetLastActiveNpad"},
 | 
			
		||||
            {306, &HidSys::GetLastActiveNpad, "GetLastActiveNpad"},
 | 
			
		||||
            {307, nullptr, "GetNpadSystemExtStyle"},
 | 
			
		||||
            {308, nullptr, "ApplyNpadSystemCommonPolicyFull"},
 | 
			
		||||
            {309, nullptr, "GetNpadFullKeyGripColor"},
 | 
			
		||||
@@ -2624,7 +2625,7 @@ public:
 | 
			
		||||
            {700, nullptr, "ActivateUniquePad"},
 | 
			
		||||
            {702, nullptr, "AcquireUniquePadConnectionEventHandle"},
 | 
			
		||||
            {703, nullptr, "GetUniquePadIds"},
 | 
			
		||||
            {751, nullptr, "AcquireJoyDetachOnBluetoothOffEventHandle"},
 | 
			
		||||
            {751, &HidSys::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"},
 | 
			
		||||
            {800, nullptr, "ListSixAxisSensorHandles"},
 | 
			
		||||
            {801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
 | 
			
		||||
            {802, nullptr, "ResetSixAxisSensorCalibrationValues"},
 | 
			
		||||
@@ -2650,7 +2651,7 @@ public:
 | 
			
		||||
            {830, nullptr, "SetNotificationLedPattern"},
 | 
			
		||||
            {831, nullptr, "SetNotificationLedPatternWithTimeout"},
 | 
			
		||||
            {832, nullptr, "PrepareHidsForNotificationWake"},
 | 
			
		||||
            {850, nullptr, "IsUsbFullKeyControllerEnabled"},
 | 
			
		||||
            {850, &HidSys::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"},
 | 
			
		||||
            {851, nullptr, "EnableUsbFullKeyController"},
 | 
			
		||||
            {852, nullptr, "IsUsbConnected"},
 | 
			
		||||
            {870, nullptr, "IsHandheldButtonPressedOnConsoleMode"},
 | 
			
		||||
@@ -2682,7 +2683,7 @@ public:
 | 
			
		||||
            {1150, nullptr, "SetTouchScreenMagnification"},
 | 
			
		||||
            {1151, nullptr, "GetTouchScreenFirmwareVersion"},
 | 
			
		||||
            {1152, nullptr, "SetTouchScreenDefaultConfiguration"},
 | 
			
		||||
            {1153, nullptr, "GetTouchScreenDefaultConfiguration"},
 | 
			
		||||
            {1153, &HidSys::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"},
 | 
			
		||||
            {1154, nullptr, "IsFirmwareAvailableForNotification"},
 | 
			
		||||
            {1155, nullptr, "SetForceHandheldStyleVibration"},
 | 
			
		||||
            {1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
 | 
			
		||||
@@ -2749,6 +2750,8 @@ public:
 | 
			
		||||
        // clang-format on
 | 
			
		||||
 | 
			
		||||
        RegisterHandlers(functions);
 | 
			
		||||
 | 
			
		||||
        joy_detach_event = service_context.CreateEvent("HidSys::JoyDetachEvent");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
@@ -2760,17 +2763,66 @@ private:
 | 
			
		||||
        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) {
 | 
			
		||||
        IPC::RequestParser rp{ctx};
 | 
			
		||||
        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);
 | 
			
		||||
 | 
			
		||||
        const std::vector<Core::HID::UniquePadId> unique_pads{};
 | 
			
		||||
 | 
			
		||||
        ctx.WriteBuffer(unique_pads);
 | 
			
		||||
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 3};
 | 
			
		||||
        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) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user