Просмотр исходного кода

service: hid: Implement functions needed by QLaunch

Narr the Reg 2 лет назад
Родитель
Сommit
bdd96118d1

+ 26 - 0
src/core/hid/hid_types.h

@@ -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) {

+ 0 - 16
src/core/hle/service/hid/controllers/touchscreen.h

@@ -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;
 

+ 60 - 8
src/core/hle/service/hid/hid.cpp

@@ -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) {