service: hid: Use applet resource to get latest shared memory handle
This commit is contained in:
		| @@ -553,17 +553,26 @@ add_library(core STATIC | |||||||
|     hle/service/hid/controllers/types/keyboard_types.h |     hle/service/hid/controllers/types/keyboard_types.h | ||||||
|     hle/service/hid/controllers/types/mouse_types.h |     hle/service/hid/controllers/types/mouse_types.h | ||||||
|     hle/service/hid/controllers/types/npad_types.h |     hle/service/hid/controllers/types/npad_types.h | ||||||
|  |     hle/service/hid/controllers/types/shared_memory_format.h | ||||||
|     hle/service/hid/controllers/types/touch_types.h |     hle/service/hid/controllers/types/touch_types.h | ||||||
|     hle/service/hid/controllers/applet_resource.cpp |     hle/service/hid/controllers/applet_resource.cpp | ||||||
|     hle/service/hid/controllers/applet_resource.h |     hle/service/hid/controllers/applet_resource.h | ||||||
|  |     hle/service/hid/controllers/capture_button.cpp | ||||||
|  |     hle/service/hid/controllers/capture_button.h | ||||||
|     hle/service/hid/controllers/console_six_axis.cpp |     hle/service/hid/controllers/console_six_axis.cpp | ||||||
|     hle/service/hid/controllers/console_six_axis.h |     hle/service/hid/controllers/console_six_axis.h | ||||||
|     hle/service/hid/controllers/controller_base.cpp |     hle/service/hid/controllers/controller_base.cpp | ||||||
|     hle/service/hid/controllers/controller_base.h |     hle/service/hid/controllers/controller_base.h | ||||||
|  |     hle/service/hid/controllers/debug_mouse.cpp | ||||||
|  |     hle/service/hid/controllers/debug_mouse.h | ||||||
|     hle/service/hid/controllers/debug_pad.cpp |     hle/service/hid/controllers/debug_pad.cpp | ||||||
|     hle/service/hid/controllers/debug_pad.h |     hle/service/hid/controllers/debug_pad.h | ||||||
|  |     hle/service/hid/controllers/digitizer.cpp | ||||||
|  |     hle/service/hid/controllers/digitizer.h | ||||||
|     hle/service/hid/controllers/gesture.cpp |     hle/service/hid/controllers/gesture.cpp | ||||||
|     hle/service/hid/controllers/gesture.h |     hle/service/hid/controllers/gesture.h | ||||||
|  |     hle/service/hid/controllers/home_button.cpp | ||||||
|  |     hle/service/hid/controllers/home_button.h | ||||||
|     hle/service/hid/controllers/keyboard.cpp |     hle/service/hid/controllers/keyboard.cpp | ||||||
|     hle/service/hid/controllers/keyboard.h |     hle/service/hid/controllers/keyboard.h | ||||||
|     hle/service/hid/controllers/mouse.cpp |     hle/service/hid/controllers/mouse.cpp | ||||||
| @@ -574,15 +583,16 @@ add_library(core STATIC | |||||||
|     hle/service/hid/controllers/palma.h |     hle/service/hid/controllers/palma.h | ||||||
|     hle/service/hid/controllers/seven_six_axis.cpp |     hle/service/hid/controllers/seven_six_axis.cpp | ||||||
|     hle/service/hid/controllers/seven_six_axis.h |     hle/service/hid/controllers/seven_six_axis.h | ||||||
|     hle/service/hid/controllers/shared_memory_format.h |  | ||||||
|     hle/service/hid/controllers/shared_memory_holder.cpp |     hle/service/hid/controllers/shared_memory_holder.cpp | ||||||
|     hle/service/hid/controllers/shared_memory_holder.h |     hle/service/hid/controllers/shared_memory_holder.h | ||||||
|     hle/service/hid/controllers/six_axis.cpp |     hle/service/hid/controllers/six_axis.cpp | ||||||
|     hle/service/hid/controllers/six_axis.h |     hle/service/hid/controllers/six_axis.h | ||||||
|     hle/service/hid/controllers/stubbed.cpp |     hle/service/hid/controllers/sleep_button.cpp | ||||||
|     hle/service/hid/controllers/stubbed.h |     hle/service/hid/controllers/sleep_button.h | ||||||
|     hle/service/hid/controllers/touchscreen.cpp |     hle/service/hid/controllers/touchscreen.cpp | ||||||
|     hle/service/hid/controllers/touchscreen.h |     hle/service/hid/controllers/touchscreen.h | ||||||
|  |     hle/service/hid/controllers/unique_pad.cpp | ||||||
|  |     hle/service/hid/controllers/unique_pad.h | ||||||
|     hle/service/hid/hidbus/hidbus_base.cpp |     hle/service/hid/hidbus/hidbus_base.cpp | ||||||
|     hle/service/hid/hidbus/hidbus_base.h |     hle/service/hid/hidbus/hidbus_base.h | ||||||
|     hle/service/hid/hidbus/ringcon.cpp |     hle/service/hid/hidbus/ringcon.cpp | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/hle/kernel/k_shared_memory.h" | #include "core/hle/kernel/k_shared_memory.h" | ||||||
| #include "core/hle/service/hid/controllers/applet_resource.h" | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
| #include "core/hle/service/hid/errors.h" | #include "core/hle/service/hid/errors.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| @@ -164,6 +164,22 @@ Result AppletResource::GetSharedMemoryFormat(SharedMemoryFormat** out_shared_mem | |||||||
|     return ResultSuccess; |     return ResultSuccess; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | AruidData* AppletResource::GetAruidData(u64 aruid) { | ||||||
|  |     const u64 aruid_index = GetIndexFromAruid(aruid); | ||||||
|  |     if (aruid_index == AruidIndexMax) { | ||||||
|  |         return nullptr; | ||||||
|  |     } | ||||||
|  |     return &data[aruid_index]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | AruidData* AppletResource::GetAruidDataByIndex(std::size_t aruid_index) { | ||||||
|  |     return &data[aruid_index]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool AppletResource::IsVibrationAruidActive(u64 aruid) const { | ||||||
|  |     return aruid == 0 || aruid == active_vibration_aruid; | ||||||
|  | } | ||||||
|  |  | ||||||
| u64 AppletResource::GetIndexFromAruid(u64 aruid) { | u64 AppletResource::GetIndexFromAruid(u64 aruid) { | ||||||
|     for (std::size_t i = 0; i < AruidIndexMax; i++) { |     for (std::size_t i = 0; i < AruidIndexMax; i++) { | ||||||
|         if (registration_list.flag[i] == RegistrationStatus::Initialized && |         if (registration_list.flag[i] == RegistrationStatus::Initialized && | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include <array> | #include <array> | ||||||
|  | #include <mutex> | ||||||
|  |  | ||||||
| #include "common/bit_field.h" | #include "common/bit_field.h" | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| @@ -20,6 +21,59 @@ class KSharedMemory; | |||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| struct SharedMemoryFormat; | struct SharedMemoryFormat; | ||||||
|  | class AppletResource; | ||||||
|  | class NPadResource; | ||||||
|  |  | ||||||
|  | static constexpr std::size_t AruidIndexMax = 0x20; | ||||||
|  |  | ||||||
|  | enum class RegistrationStatus : u32 { | ||||||
|  |     None, | ||||||
|  |     Initialized, | ||||||
|  |     PendingDelete, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct DataStatusFlag { | ||||||
|  |     union { | ||||||
|  |         u32 raw{}; | ||||||
|  |  | ||||||
|  |         BitField<0, 1, u32> is_initialized; | ||||||
|  |         BitField<1, 1, u32> is_assigned; | ||||||
|  |         BitField<16, 1, u32> enable_pad_input; | ||||||
|  |         BitField<17, 1, u32> enable_six_axis_sensor; | ||||||
|  |         BitField<18, 1, u32> bit_18; | ||||||
|  |         BitField<19, 1, u32> is_palma_connectable; | ||||||
|  |         BitField<20, 1, u32> enable_palma_boost_mode; | ||||||
|  |         BitField<21, 1, u32> enable_touchscreen; | ||||||
|  |     }; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct AruidRegisterList { | ||||||
|  |     std::array<RegistrationStatus, AruidIndexMax> flag{}; | ||||||
|  |     std::array<u64, AruidIndexMax> aruid{}; | ||||||
|  | }; | ||||||
|  | static_assert(sizeof(AruidRegisterList) == 0x180, "AruidRegisterList is an invalid size"); | ||||||
|  |  | ||||||
|  | struct AruidData { | ||||||
|  |     DataStatusFlag flag{}; | ||||||
|  |     u64 aruid{}; | ||||||
|  |     SharedMemoryFormat* shared_memory_format{nullptr}; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct HandheldConfig { | ||||||
|  |     bool is_handheld_hid_enabled; | ||||||
|  |     bool is_force_handheld; | ||||||
|  |     bool is_joycon_rail_enabled; | ||||||
|  |     bool is_force_handheld_style_vibration; | ||||||
|  | }; | ||||||
|  | static_assert(sizeof(HandheldConfig) == 0x4, "HandheldConfig is an invalid size"); | ||||||
|  |  | ||||||
|  | struct AppletResourceHolder { | ||||||
|  |     std::shared_ptr<AppletResource> applet_resource{nullptr}; | ||||||
|  |     std::recursive_mutex* shared_mutex{nullptr}; | ||||||
|  |     NPadResource* shared_npad_resource{nullptr}; | ||||||
|  |     std::shared_ptr<HandheldConfig> handheld_config{nullptr}; | ||||||
|  |     long* handle_1; | ||||||
|  | }; | ||||||
|  |  | ||||||
| class AppletResource { | class AppletResource { | ||||||
| public: | public: | ||||||
| @@ -36,6 +90,10 @@ public: | |||||||
|     u64 GetActiveAruid(); |     u64 GetActiveAruid(); | ||||||
|     Result GetSharedMemoryHandle(Kernel::KSharedMemory** out_handle, u64 aruid); |     Result GetSharedMemoryHandle(Kernel::KSharedMemory** out_handle, u64 aruid); | ||||||
|     Result GetSharedMemoryFormat(SharedMemoryFormat** out_shared_memory_format, u64 aruid); |     Result GetSharedMemoryFormat(SharedMemoryFormat** out_shared_memory_format, u64 aruid); | ||||||
|  |     AruidData* GetAruidData(u64 aruid); | ||||||
|  |     AruidData* GetAruidDataByIndex(std::size_t aruid_index); | ||||||
|  |  | ||||||
|  |     bool IsVibrationAruidActive(u64 aruid) const; | ||||||
|  |  | ||||||
|     u64 GetIndexFromAruid(u64 aruid); |     u64 GetIndexFromAruid(u64 aruid); | ||||||
|  |  | ||||||
| @@ -52,46 +110,12 @@ public: | |||||||
|     Result UnregisterCoreAppletResource(); |     Result UnregisterCoreAppletResource(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     static constexpr std::size_t AruidIndexMax = 0x20; |  | ||||||
|  |  | ||||||
|     enum RegistrationStatus : u32 { |  | ||||||
|         None, |  | ||||||
|         Initialized, |  | ||||||
|         PendingDelete, |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct DataStatusFlag { |  | ||||||
|         union { |  | ||||||
|             u32 raw{}; |  | ||||||
|  |  | ||||||
|             BitField<0, 1, u32> is_initialized; |  | ||||||
|             BitField<1, 1, u32> is_assigned; |  | ||||||
|             BitField<16, 1, u32> enable_pad_input; |  | ||||||
|             BitField<17, 1, u32> enable_six_axis_sensor; |  | ||||||
|             BitField<18, 1, u32> bit_18; |  | ||||||
|             BitField<19, 1, u32> is_palma_connectable; |  | ||||||
|             BitField<20, 1, u32> enable_palma_boost_mode; |  | ||||||
|             BitField<21, 1, u32> enable_touchscreen; |  | ||||||
|         }; |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct AruidRegisterList { |  | ||||||
|         std::array<RegistrationStatus, AruidIndexMax> flag{}; |  | ||||||
|         std::array<u64, AruidIndexMax> aruid{}; |  | ||||||
|     }; |  | ||||||
|     static_assert(sizeof(AruidRegisterList) == 0x180, "AruidRegisterList is an invalid size"); |  | ||||||
|  |  | ||||||
|     struct AruidData { |  | ||||||
|         DataStatusFlag flag{}; |  | ||||||
|         u64 aruid{}; |  | ||||||
|         SharedMemoryFormat* shared_memory_format{nullptr}; |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     u64 active_aruid{}; |     u64 active_aruid{}; | ||||||
|     AruidRegisterList registration_list{}; |     AruidRegisterList registration_list{}; | ||||||
|     std::array<AruidData, AruidIndexMax> data{}; |     std::array<AruidData, AruidIndexMax> data{}; | ||||||
|     std::array<SharedMemoryHolder, AruidIndexMax> shared_memory_holder{}; |     std::array<SharedMemoryHolder, AruidIndexMax> shared_memory_holder{}; | ||||||
|     s32 ref_counter{}; |     s32 ref_counter{}; | ||||||
|  |     u64 active_vibration_aruid; | ||||||
|  |  | ||||||
|     Core::System& system; |     Core::System& system; | ||||||
| }; | }; | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								src/core/hle/service/hid/controllers/capture_button.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/core/hle/service/hid/controllers/capture_button.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #include "core/core_timing.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
|  | #include "core/hle/service/hid/controllers/capture_button.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | CaptureButton::CaptureButton(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {} | ||||||
|  |  | ||||||
|  | CaptureButton::~CaptureButton() = default; | ||||||
|  |  | ||||||
|  | void CaptureButton::OnInit() {} | ||||||
|  |  | ||||||
|  | void CaptureButton::OnRelease() {} | ||||||
|  |  | ||||||
|  | void CaptureButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     if (!smart_update) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     auto& header = data->shared_memory_format->capture_button.header; | ||||||
|  |     header.timestamp = core_timing.GetGlobalTimeNs().count(); | ||||||
|  |     header.total_entry_count = 17; | ||||||
|  |     header.entry_count = 0; | ||||||
|  |     header.last_entry_index = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace Service::HID | ||||||
| @@ -6,12 +6,11 @@ | |||||||
| #include "core/hle/service/hid/controllers/controller_base.h" | #include "core/hle/service/hid/controllers/controller_base.h" | ||||||
| 
 | 
 | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| struct CommonHeader; |  | ||||||
| 
 | 
 | ||||||
| class Controller_Stubbed final : public ControllerBase { | class CaptureButton final : public ControllerBase { | ||||||
| public: | public: | ||||||
|     explicit Controller_Stubbed(Core::HID::HIDCore& hid_core_, CommonHeader& ring_lifo_header); |     explicit CaptureButton(Core::HID::HIDCore& hid_core_); | ||||||
|     ~Controller_Stubbed() override; |     ~CaptureButton() override; | ||||||
| 
 | 
 | ||||||
|     // Called when the controller is initialized
 |     // Called when the controller is initialized
 | ||||||
|     void OnInit() override; |     void OnInit() override; | ||||||
| @@ -23,7 +22,6 @@ public: | |||||||
|     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; |     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     CommonHeader& header; |  | ||||||
|     bool smart_update{}; |     bool smart_update{}; | ||||||
| }; | }; | ||||||
| } // namespace Service::HID
 | } // namespace Service::HID
 | ||||||
| @@ -5,13 +5,11 @@ | |||||||
| #include "core/hid/emulated_console.h" | #include "core/hid/emulated_console.h" | ||||||
| #include "core/hid/hid_core.h" | #include "core/hid/hid_core.h" | ||||||
| #include "core/hle/service/hid/controllers/console_six_axis.h" | #include "core/hle/service/hid/controllers/console_six_axis.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
|  |  | ||||||
| ConsoleSixAxis::ConsoleSixAxis(Core::HID::HIDCore& hid_core_, | ConsoleSixAxis::ConsoleSixAxis(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} { | ||||||
|                                ConsoleSixAxisSensorSharedMemoryFormat& console_shared_memory) |  | ||||||
|     : ControllerBase{hid_core_}, shared_memory{console_shared_memory} { |  | ||||||
|     console = hid_core.GetEmulatedConsole(); |     console = hid_core.GetEmulatedConsole(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -22,6 +20,15 @@ void ConsoleSixAxis::OnInit() {} | |||||||
| void ConsoleSixAxis::OnRelease() {} | void ConsoleSixAxis::OnRelease() {} | ||||||
|  |  | ||||||
| void ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | void ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ConsoleSixAxisSensorSharedMemoryFormat& shared_memory = data->shared_memory_format->console; | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -10,12 +10,9 @@ class EmulatedConsole; | |||||||
| } // namespace Core::HID | } // namespace Core::HID | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| struct ConsoleSixAxisSensorSharedMemoryFormat; |  | ||||||
|  |  | ||||||
| class ConsoleSixAxis final : public ControllerBase { | class ConsoleSixAxis final : public ControllerBase { | ||||||
| public: | public: | ||||||
|     explicit ConsoleSixAxis(Core::HID::HIDCore& hid_core_, |     explicit ConsoleSixAxis(Core::HID::HIDCore& hid_core_); | ||||||
|                             ConsoleSixAxisSensorSharedMemoryFormat& console_shared_memory); |  | ||||||
|     ~ConsoleSixAxis() override; |     ~ConsoleSixAxis() override; | ||||||
|  |  | ||||||
|     // Called when the controller is initialized |     // Called when the controller is initialized | ||||||
| @@ -28,7 +25,6 @@ public: | |||||||
|     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; |     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     ConsoleSixAxisSensorSharedMemoryFormat& shared_memory; |  | ||||||
|     Core::HID::EmulatedConsole* console = nullptr; |     Core::HID::EmulatedConsole* console = nullptr; | ||||||
| }; | }; | ||||||
| } // namespace Service::HID | } // namespace Service::HID | ||||||
|   | |||||||
| @@ -31,4 +31,9 @@ void ControllerBase::DeactivateController() { | |||||||
| bool ControllerBase::IsControllerActivated() const { | bool ControllerBase::IsControllerActivated() const { | ||||||
|     return is_activated; |     return is_activated; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void ControllerBase::SetAppletResource(std::shared_ptr<AppletResource> resource) { | ||||||
|  |     applet_resource = resource; | ||||||
|  | } | ||||||
|  |  | ||||||
| } // namespace Service::HID | } // namespace Service::HID | ||||||
|   | |||||||
| @@ -3,8 +3,11 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
|  | #include <memory> | ||||||
|  |  | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| #include "core/hle/result.h" | #include "core/hle/result.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
|  |  | ||||||
| namespace Core::Timing { | namespace Core::Timing { | ||||||
| class CoreTiming; | class CoreTiming; | ||||||
| @@ -12,7 +15,7 @@ class CoreTiming; | |||||||
|  |  | ||||||
| namespace Core::HID { | namespace Core::HID { | ||||||
| class HIDCore; | class HIDCore; | ||||||
| } | } // namespace Core::HID | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| class ControllerBase { | class ControllerBase { | ||||||
| @@ -39,8 +42,11 @@ public: | |||||||
|  |  | ||||||
|     bool IsControllerActivated() const; |     bool IsControllerActivated() const; | ||||||
|  |  | ||||||
|  |     void SetAppletResource(std::shared_ptr<AppletResource> resource); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
|     bool is_activated{false}; |     bool is_activated{false}; | ||||||
|  |     std::shared_ptr<AppletResource> applet_resource{nullptr}; | ||||||
|  |  | ||||||
|     Core::HID::HIDCore& hid_core; |     Core::HID::HIDCore& hid_core; | ||||||
| }; | }; | ||||||
|   | |||||||
							
								
								
									
										63
									
								
								src/core/hle/service/hid/controllers/debug_mouse.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/core/hle/service/hid/controllers/debug_mouse.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #include "core/core_timing.h" | ||||||
|  | #include "core/frontend/emu_window.h" | ||||||
|  | #include "core/hid/emulated_devices.h" | ||||||
|  | #include "core/hid/hid_core.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
|  | #include "core/hle/service/hid/controllers/debug_mouse.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | DebugMouse::DebugMouse(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} { | ||||||
|  |     emulated_devices = hid_core.GetEmulatedDevices(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | DebugMouse::~DebugMouse() = default; | ||||||
|  |  | ||||||
|  | void DebugMouse::OnInit() {} | ||||||
|  | void DebugMouse::OnRelease() {} | ||||||
|  |  | ||||||
|  | void DebugMouse::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     MouseSharedMemoryFormat& shared_memory = data->shared_memory_format->debug_mouse; | ||||||
|  |  | ||||||
|  |     if (!IsControllerActivated()) { | ||||||
|  |         shared_memory.mouse_lifo.buffer_count = 0; | ||||||
|  |         shared_memory.mouse_lifo.buffer_tail = 0; | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     next_state = {}; | ||||||
|  |  | ||||||
|  |     const auto& last_entry = shared_memory.mouse_lifo.ReadCurrentEntry().state; | ||||||
|  |     next_state.sampling_number = last_entry.sampling_number + 1; | ||||||
|  |  | ||||||
|  |     if (Settings::values.mouse_enabled) { | ||||||
|  |         const auto& mouse_button_state = emulated_devices->GetMouseButtons(); | ||||||
|  |         const auto& mouse_position_state = emulated_devices->GetMousePosition(); | ||||||
|  |         const auto& mouse_wheel_state = emulated_devices->GetMouseWheel(); | ||||||
|  |         next_state.attribute.is_connected.Assign(1); | ||||||
|  |         next_state.x = static_cast<s32>(mouse_position_state.x * Layout::ScreenUndocked::Width); | ||||||
|  |         next_state.y = static_cast<s32>(mouse_position_state.y * Layout::ScreenUndocked::Height); | ||||||
|  |         next_state.delta_x = next_state.x - last_entry.x; | ||||||
|  |         next_state.delta_y = next_state.y - last_entry.y; | ||||||
|  |         next_state.delta_wheel_x = mouse_wheel_state.x - last_mouse_wheel_state.x; | ||||||
|  |         next_state.delta_wheel_y = mouse_wheel_state.y - last_mouse_wheel_state.y; | ||||||
|  |  | ||||||
|  |         last_mouse_wheel_state = mouse_wheel_state; | ||||||
|  |         next_state.button = mouse_button_state; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     shared_memory.mouse_lifo.WriteNextEntry(next_state); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace Service::HID | ||||||
							
								
								
									
										34
									
								
								src/core/hle/service/hid/controllers/debug_mouse.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/core/hle/service/hid/controllers/debug_mouse.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "core/hle/service/hid/controllers/controller_base.h" | ||||||
|  |  | ||||||
|  | namespace Core::HID { | ||||||
|  | class EmulatedDevices; | ||||||
|  | struct MouseState; | ||||||
|  | struct AnalogStickState; | ||||||
|  | } // namespace Core::HID | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  | class DebugMouse final : public ControllerBase { | ||||||
|  | public: | ||||||
|  |     explicit DebugMouse(Core::HID::HIDCore& hid_core_); | ||||||
|  |     ~DebugMouse() override; | ||||||
|  |  | ||||||
|  |     // Called when the controller is initialized | ||||||
|  |     void OnInit() override; | ||||||
|  |  | ||||||
|  |     // When the controller is released | ||||||
|  |     void OnRelease() override; | ||||||
|  |  | ||||||
|  |     // When the controller is requesting an update for the shared memory | ||||||
|  |     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     Core::HID::MouseState next_state{}; | ||||||
|  |     Core::HID::AnalogStickState last_mouse_wheel_state{}; | ||||||
|  |     Core::HID::EmulatedDevices* emulated_devices = nullptr; | ||||||
|  | }; | ||||||
|  | } // namespace Service::HID | ||||||
| @@ -6,14 +6,13 @@ | |||||||
| #include "core/hid/emulated_controller.h" | #include "core/hid/emulated_controller.h" | ||||||
| #include "core/hid/hid_core.h" | #include "core/hid/hid_core.h" | ||||||
| #include "core/hid/hid_types.h" | #include "core/hid/hid_types.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
| #include "core/hle/service/hid/controllers/debug_pad.h" | #include "core/hle/service/hid/controllers/debug_pad.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
|  |  | ||||||
| DebugPad::DebugPad(Core::HID::HIDCore& hid_core_, | DebugPad::DebugPad(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} { | ||||||
|                    DebugPadSharedMemoryFormat& debug_pad_shared_memory) |  | ||||||
|     : ControllerBase{hid_core_}, shared_memory{debug_pad_shared_memory} { |  | ||||||
|     controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Other); |     controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Other); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -24,6 +23,15 @@ void DebugPad::OnInit() {} | |||||||
| void DebugPad::OnRelease() {} | void DebugPad::OnRelease() {} | ||||||
|  |  | ||||||
| void DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | void DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     DebugPadSharedMemoryFormat& shared_memory = data->shared_memory_format->debug_pad; | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|         shared_memory.debug_pad_lifo.buffer_count = 0; |         shared_memory.debug_pad_lifo.buffer_count = 0; | ||||||
|         shared_memory.debug_pad_lifo.buffer_tail = 0; |         shared_memory.debug_pad_lifo.buffer_tail = 0; | ||||||
|   | |||||||
| @@ -15,12 +15,9 @@ class CoreTiming; | |||||||
| } | } | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| struct DebugPadSharedMemoryFormat; |  | ||||||
|  |  | ||||||
| class DebugPad final : public ControllerBase { | class DebugPad final : public ControllerBase { | ||||||
| public: | public: | ||||||
|     explicit DebugPad(Core::HID::HIDCore& hid_core_, |     explicit DebugPad(Core::HID::HIDCore& hid_core_); | ||||||
|                       DebugPadSharedMemoryFormat& debug_pad_shared_memory); |  | ||||||
|     ~DebugPad() override; |     ~DebugPad() override; | ||||||
|  |  | ||||||
|     // Called when the controller is initialized |     // Called when the controller is initialized | ||||||
| @@ -34,7 +31,6 @@ public: | |||||||
|  |  | ||||||
| private: | private: | ||||||
|     DebugPadState next_state{}; |     DebugPadState next_state{}; | ||||||
|     DebugPadSharedMemoryFormat& shared_memory; |  | ||||||
|     Core::HID::EmulatedController* controller = nullptr; |     Core::HID::EmulatedController* controller = nullptr; | ||||||
| }; | }; | ||||||
| } // namespace Service::HID | } // namespace Service::HID | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								src/core/hle/service/hid/controllers/digitizer.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/core/hle/service/hid/controllers/digitizer.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #include "core/core_timing.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
|  | #include "core/hle/service/hid/controllers/digitizer.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | Digitizer::Digitizer(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {} | ||||||
|  |  | ||||||
|  | Digitizer::~Digitizer() = default; | ||||||
|  |  | ||||||
|  | void Digitizer::OnInit() {} | ||||||
|  |  | ||||||
|  | void Digitizer::OnRelease() {} | ||||||
|  |  | ||||||
|  | void Digitizer::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     if (!smart_update) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     auto& header = data->shared_memory_format->digitizer.header; | ||||||
|  |     header.timestamp = core_timing.GetGlobalTimeNs().count(); | ||||||
|  |     header.total_entry_count = 17; | ||||||
|  |     header.entry_count = 0; | ||||||
|  |     header.last_entry_index = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace Service::HID | ||||||
							
								
								
									
										27
									
								
								src/core/hle/service/hid/controllers/digitizer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/core/hle/service/hid/controllers/digitizer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "core/hle/service/hid/controllers/controller_base.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | class Digitizer final : public ControllerBase { | ||||||
|  | public: | ||||||
|  |     explicit Digitizer(Core::HID::HIDCore& hid_core_); | ||||||
|  |     ~Digitizer() override; | ||||||
|  |  | ||||||
|  |     // Called when the controller is initialized | ||||||
|  |     void OnInit() override; | ||||||
|  |  | ||||||
|  |     // When the controller is released | ||||||
|  |     void OnRelease() override; | ||||||
|  |  | ||||||
|  |     // When the controller is requesting an update for the shared memory | ||||||
|  |     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     bool smart_update{}; | ||||||
|  | }; | ||||||
|  | } // namespace Service::HID | ||||||
| @@ -6,8 +6,9 @@ | |||||||
| #include "core/frontend/emu_window.h" | #include "core/frontend/emu_window.h" | ||||||
| #include "core/hid/emulated_console.h" | #include "core/hid/emulated_console.h" | ||||||
| #include "core/hid/hid_core.h" | #include "core/hid/hid_core.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
| #include "core/hle/service/hid/controllers/gesture.h" | #include "core/hle/service/hid/controllers/gesture.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| // HW is around 700, value is set to 400 to make it easier to trigger with mouse | // HW is around 700, value is set to 400 to make it easier to trigger with mouse | ||||||
| @@ -21,24 +22,40 @@ constexpr f32 Square(s32 num) { | |||||||
|     return static_cast<f32>(num * num); |     return static_cast<f32>(num * num); | ||||||
| } | } | ||||||
|  |  | ||||||
| Gesture::Gesture(Core::HID::HIDCore& hid_core_, GestureSharedMemoryFormat& gesture_shared_memory) | Gesture::Gesture(Core::HID::HIDCore& hid_core_) : ControllerBase(hid_core_) { | ||||||
|     : ControllerBase(hid_core_), shared_memory{gesture_shared_memory} { |  | ||||||
|     console = hid_core.GetEmulatedConsole(); |     console = hid_core.GetEmulatedConsole(); | ||||||
| } | } | ||||||
| Gesture::~Gesture() = default; | Gesture::~Gesture() = default; | ||||||
|  |  | ||||||
| void Gesture::OnInit() { | void Gesture::OnInit() { | ||||||
|     shared_memory.gesture_lifo.buffer_count = 0; |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|     shared_memory.gesture_lifo.buffer_tail = 0; |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     shared_memory = &data->shared_memory_format->gesture; | ||||||
|  |     shared_memory->gesture_lifo.buffer_count = 0; | ||||||
|  |     shared_memory->gesture_lifo.buffer_tail = 0; | ||||||
|     force_update = true; |     force_update = true; | ||||||
| } | } | ||||||
|  |  | ||||||
| void Gesture::OnRelease() {} | void Gesture::OnRelease() {} | ||||||
|  |  | ||||||
| void Gesture::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | void Gesture::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     shared_memory = &data->shared_memory_format->gesture; | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|         shared_memory.gesture_lifo.buffer_count = 0; |         shared_memory->gesture_lifo.buffer_count = 0; | ||||||
|         shared_memory.gesture_lifo.buffer_tail = 0; |         shared_memory->gesture_lifo.buffer_tail = 0; | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -46,7 +63,7 @@ void Gesture::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||||||
|  |  | ||||||
|     GestureProperties gesture = GetGestureProperties(); |     GestureProperties gesture = GetGestureProperties(); | ||||||
|     f32 time_difference = |     f32 time_difference = | ||||||
|         static_cast<f32>(shared_memory.gesture_lifo.timestamp - last_update_timestamp) / |         static_cast<f32>(shared_memory->gesture_lifo.timestamp - last_update_timestamp) / | ||||||
|         (1000 * 1000 * 1000); |         (1000 * 1000 * 1000); | ||||||
|  |  | ||||||
|     // Only update if necessary |     // Only update if necessary | ||||||
| @@ -54,7 +71,7 @@ void Gesture::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     last_update_timestamp = shared_memory.gesture_lifo.timestamp; |     last_update_timestamp = shared_memory->gesture_lifo.timestamp; | ||||||
|     UpdateGestureSharedMemory(gesture, time_difference); |     UpdateGestureSharedMemory(gesture, time_difference); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -97,7 +114,7 @@ void Gesture::UpdateGestureSharedMemory(GestureProperties& gesture, f32 time_dif | |||||||
|     GestureType type = GestureType::Idle; |     GestureType type = GestureType::Idle; | ||||||
|     GestureAttribute attributes{}; |     GestureAttribute attributes{}; | ||||||
|  |  | ||||||
|     const auto& last_entry = shared_memory.gesture_lifo.ReadCurrentEntry().state; |     const auto& last_entry = shared_memory->gesture_lifo.ReadCurrentEntry().state; | ||||||
|  |  | ||||||
|     // Reset next state to default |     // Reset next state to default | ||||||
|     next_state.sampling_number = last_entry.sampling_number + 1; |     next_state.sampling_number = last_entry.sampling_number + 1; | ||||||
| @@ -127,7 +144,7 @@ void Gesture::UpdateGestureSharedMemory(GestureProperties& gesture, f32 time_dif | |||||||
|     next_state.points = gesture.points; |     next_state.points = gesture.points; | ||||||
|     last_gesture = gesture; |     last_gesture = gesture; | ||||||
|  |  | ||||||
|     shared_memory.gesture_lifo.WriteNextEntry(next_state); |     shared_memory->gesture_lifo.WriteNextEntry(next_state); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Gesture::NewGesture(GestureProperties& gesture, GestureType& type, | void Gesture::NewGesture(GestureProperties& gesture, GestureType& type, | ||||||
| @@ -300,7 +317,7 @@ void Gesture::SetSwipeEvent(GestureProperties& gesture, GestureProperties& last_ | |||||||
| } | } | ||||||
|  |  | ||||||
| const GestureState& Gesture::GetLastGestureEntry() const { | const GestureState& Gesture::GetLastGestureEntry() const { | ||||||
|     return shared_memory.gesture_lifo.ReadCurrentEntry().state; |     return shared_memory->gesture_lifo.ReadCurrentEntry().state; | ||||||
| } | } | ||||||
|  |  | ||||||
| GestureProperties Gesture::GetGestureProperties() { | GestureProperties Gesture::GetGestureProperties() { | ||||||
|   | |||||||
| @@ -18,8 +18,7 @@ struct GestureSharedMemoryFormat; | |||||||
|  |  | ||||||
| class Gesture final : public ControllerBase { | class Gesture final : public ControllerBase { | ||||||
| public: | public: | ||||||
|     explicit Gesture(Core::HID::HIDCore& hid_core_, |     explicit Gesture(Core::HID::HIDCore& hid_core_); | ||||||
|                      GestureSharedMemoryFormat& gesture_shared_memory); |  | ||||||
|     ~Gesture() override; |     ~Gesture() override; | ||||||
|  |  | ||||||
|     // Called when the controller is initialized |     // Called when the controller is initialized | ||||||
| @@ -74,7 +73,7 @@ private: | |||||||
|     GestureProperties GetGestureProperties(); |     GestureProperties GetGestureProperties(); | ||||||
|  |  | ||||||
|     GestureState next_state{}; |     GestureState next_state{}; | ||||||
|     GestureSharedMemoryFormat& shared_memory; |     GestureSharedMemoryFormat* shared_memory; | ||||||
|     Core::HID::EmulatedConsole* console = nullptr; |     Core::HID::EmulatedConsole* console = nullptr; | ||||||
|  |  | ||||||
|     std::array<Core::HID::TouchFinger, MAX_POINTS> fingers{}; |     std::array<Core::HID::TouchFinger, MAX_POINTS> fingers{}; | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								src/core/hle/service/hid/controllers/home_button.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/core/hle/service/hid/controllers/home_button.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #include "core/core_timing.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
|  | #include "core/hle/service/hid/controllers/home_button.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | HomeButton::HomeButton(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {} | ||||||
|  |  | ||||||
|  | HomeButton::~HomeButton() = default; | ||||||
|  |  | ||||||
|  | void HomeButton::OnInit() {} | ||||||
|  |  | ||||||
|  | void HomeButton::OnRelease() {} | ||||||
|  |  | ||||||
|  | void HomeButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     if (!smart_update) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     auto& header = data->shared_memory_format->home_button.header; | ||||||
|  |     header.timestamp = core_timing.GetGlobalTimeNs().count(); | ||||||
|  |     header.total_entry_count = 17; | ||||||
|  |     header.entry_count = 0; | ||||||
|  |     header.last_entry_index = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace Service::HID | ||||||
							
								
								
									
										27
									
								
								src/core/hle/service/hid/controllers/home_button.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/core/hle/service/hid/controllers/home_button.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "core/hle/service/hid/controllers/controller_base.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | class HomeButton final : public ControllerBase { | ||||||
|  | public: | ||||||
|  |     explicit HomeButton(Core::HID::HIDCore& hid_core_); | ||||||
|  |     ~HomeButton() override; | ||||||
|  |  | ||||||
|  |     // Called when the controller is initialized | ||||||
|  |     void OnInit() override; | ||||||
|  |  | ||||||
|  |     // When the controller is released | ||||||
|  |     void OnRelease() override; | ||||||
|  |  | ||||||
|  |     // When the controller is requesting an update for the shared memory | ||||||
|  |     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     bool smart_update{}; | ||||||
|  | }; | ||||||
|  | } // namespace Service::HID | ||||||
| @@ -5,14 +5,13 @@ | |||||||
| #include "core/core_timing.h" | #include "core/core_timing.h" | ||||||
| #include "core/hid/emulated_devices.h" | #include "core/hid/emulated_devices.h" | ||||||
| #include "core/hid/hid_core.h" | #include "core/hid/hid_core.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
| #include "core/hle/service/hid/controllers/keyboard.h" | #include "core/hle/service/hid/controllers/keyboard.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
|  |  | ||||||
| Keyboard::Keyboard(Core::HID::HIDCore& hid_core_, | Keyboard::Keyboard(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} { | ||||||
|                    KeyboardSharedMemoryFormat& keyboard_shared_memory) |  | ||||||
|     : ControllerBase{hid_core_}, shared_memory{keyboard_shared_memory} { |  | ||||||
|     emulated_devices = hid_core.GetEmulatedDevices(); |     emulated_devices = hid_core.GetEmulatedDevices(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -23,6 +22,15 @@ void Keyboard::OnInit() {} | |||||||
| void Keyboard::OnRelease() {} | void Keyboard::OnRelease() {} | ||||||
|  |  | ||||||
| void Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | void Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     KeyboardSharedMemoryFormat& shared_memory = data->shared_memory_format->keyboard; | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|         shared_memory.keyboard_lifo.buffer_count = 0; |         shared_memory.keyboard_lifo.buffer_count = 0; | ||||||
|         shared_memory.keyboard_lifo.buffer_tail = 0; |         shared_memory.keyboard_lifo.buffer_tail = 0; | ||||||
|   | |||||||
| @@ -7,12 +7,9 @@ | |||||||
| #include "core/hle/service/hid/controllers/types/keyboard_types.h" | #include "core/hle/service/hid/controllers/types/keyboard_types.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| struct KeyboardSharedMemoryFormat; |  | ||||||
|  |  | ||||||
| class Keyboard final : public ControllerBase { | class Keyboard final : public ControllerBase { | ||||||
| public: | public: | ||||||
|     explicit Keyboard(Core::HID::HIDCore& hid_core_, |     explicit Keyboard(Core::HID::HIDCore& hid_core_); | ||||||
|                       KeyboardSharedMemoryFormat& keyboard_shared_memory); |  | ||||||
|     ~Keyboard() override; |     ~Keyboard() override; | ||||||
|  |  | ||||||
|     // Called when the controller is initialized |     // Called when the controller is initialized | ||||||
| @@ -26,7 +23,6 @@ public: | |||||||
|  |  | ||||||
| private: | private: | ||||||
|     KeyboardState next_state{}; |     KeyboardState next_state{}; | ||||||
|     KeyboardSharedMemoryFormat& shared_memory; |  | ||||||
|     Core::HID::EmulatedDevices* emulated_devices = nullptr; |     Core::HID::EmulatedDevices* emulated_devices = nullptr; | ||||||
| }; | }; | ||||||
| } // namespace Service::HID | } // namespace Service::HID | ||||||
|   | |||||||
| @@ -5,13 +5,13 @@ | |||||||
| #include "core/frontend/emu_window.h" | #include "core/frontend/emu_window.h" | ||||||
| #include "core/hid/emulated_devices.h" | #include "core/hid/emulated_devices.h" | ||||||
| #include "core/hid/hid_core.h" | #include "core/hid/hid_core.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
| #include "core/hle/service/hid/controllers/mouse.h" | #include "core/hle/service/hid/controllers/mouse.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
|  |  | ||||||
| Mouse::Mouse(Core::HID::HIDCore& hid_core_, MouseSharedMemoryFormat& mouse_shared_memory) | Mouse::Mouse(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} { | ||||||
|     : ControllerBase{hid_core_}, shared_memory{mouse_shared_memory} { |  | ||||||
|     emulated_devices = hid_core.GetEmulatedDevices(); |     emulated_devices = hid_core.GetEmulatedDevices(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -21,6 +21,15 @@ void Mouse::OnInit() {} | |||||||
| void Mouse::OnRelease() {} | void Mouse::OnRelease() {} | ||||||
|  |  | ||||||
| void Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | void Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     MouseSharedMemoryFormat& shared_memory = data->shared_memory_format->mouse; | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|         shared_memory.mouse_lifo.buffer_count = 0; |         shared_memory.mouse_lifo.buffer_count = 0; | ||||||
|         shared_memory.mouse_lifo.buffer_tail = 0; |         shared_memory.mouse_lifo.buffer_tail = 0; | ||||||
|   | |||||||
| @@ -12,11 +12,9 @@ struct AnalogStickState; | |||||||
| } // namespace Core::HID | } // namespace Core::HID | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| struct MouseSharedMemoryFormat; |  | ||||||
|  |  | ||||||
| class Mouse final : public ControllerBase { | class Mouse final : public ControllerBase { | ||||||
| public: | public: | ||||||
|     explicit Mouse(Core::HID::HIDCore& hid_core_, MouseSharedMemoryFormat& mouse_shared_memory); |     explicit Mouse(Core::HID::HIDCore& hid_core_); | ||||||
|     ~Mouse() override; |     ~Mouse() override; | ||||||
|  |  | ||||||
|     // Called when the controller is initialized |     // Called when the controller is initialized | ||||||
| @@ -31,7 +29,6 @@ public: | |||||||
| private: | private: | ||||||
|     Core::HID::MouseState next_state{}; |     Core::HID::MouseState next_state{}; | ||||||
|     Core::HID::AnalogStickState last_mouse_wheel_state{}; |     Core::HID::AnalogStickState last_mouse_wheel_state{}; | ||||||
|     MouseSharedMemoryFormat& shared_memory; |  | ||||||
|     Core::HID::EmulatedDevices* emulated_devices = nullptr; |     Core::HID::EmulatedDevices* emulated_devices = nullptr; | ||||||
| }; | }; | ||||||
| } // namespace Service::HID | } // namespace Service::HID | ||||||
|   | |||||||
| @@ -16,8 +16,9 @@ | |||||||
| #include "core/hid/hid_core.h" | #include "core/hid/hid_core.h" | ||||||
| #include "core/hle/kernel/k_event.h" | #include "core/hle/kernel/k_event.h" | ||||||
| #include "core/hle/kernel/k_readable_event.h" | #include "core/hle/kernel/k_readable_event.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
| #include "core/hle/service/hid/controllers/npad.h" | #include "core/hle/service/hid/controllers/npad.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
| #include "core/hle/service/hid/errors.h" | #include "core/hle/service/hid/errors.h" | ||||||
| #include "core/hle/service/hid/hid_util.h" | #include "core/hle/service/hid/hid_util.h" | ||||||
| #include "core/hle/service/kernel_helpers.h" | #include "core/hle/service/kernel_helpers.h" | ||||||
| @@ -30,12 +31,10 @@ constexpr std::array<Core::HID::NpadIdType, 10> npad_id_list{ | |||||||
|     Core::HID::NpadIdType::Handheld, |     Core::HID::NpadIdType::Handheld, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| NPad::NPad(Core::HID::HIDCore& hid_core_, NpadSharedMemoryFormat& npad_shared_memory_format, | NPad::NPad(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service_context_) | ||||||
|            KernelHelpers::ServiceContext& service_context_) |  | ||||||
|     : ControllerBase{hid_core_}, service_context{service_context_} { |     : ControllerBase{hid_core_}, service_context{service_context_} { | ||||||
|     for (std::size_t i = 0; i < controller_data.size(); ++i) { |     for (std::size_t i = 0; i < controller_data.size(); ++i) { | ||||||
|         auto& controller = controller_data[i]; |         auto& controller = controller_data[i]; | ||||||
|         controller.shared_memory = &npad_shared_memory_format.npad_entry[i].internal_state; |  | ||||||
|         controller.device = hid_core.GetEmulatedControllerByIndex(i); |         controller.device = hid_core.GetEmulatedControllerByIndex(i); | ||||||
|         controller.vibration[Core::HID::EmulatedDeviceIndex::LeftIndex].latest_vibration_value = |         controller.vibration[Core::HID::EmulatedDeviceIndex::LeftIndex].latest_vibration_value = | ||||||
|             Core::HID::DEFAULT_VIBRATION_VALUE; |             Core::HID::DEFAULT_VIBRATION_VALUE; | ||||||
| @@ -297,12 +296,20 @@ void NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void NPad::OnInit() { | void NPad::OnInit() { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (std::size_t i = 0; i < controller_data.size(); ++i) { |     for (std::size_t i = 0; i < controller_data.size(); ++i) { | ||||||
|         auto& controller = controller_data[i]; |         auto& controller = controller_data[i]; | ||||||
|  |         controller.shared_memory = &data->shared_memory_format->npad.npad_entry[i].internal_state; | ||||||
|         controller.styleset_changed_event = |         controller.styleset_changed_event = | ||||||
|             service_context.CreateEvent(fmt::format("npad:NpadStyleSetChanged_{}", i)); |             service_context.CreateEvent(fmt::format("npad:NpadStyleSetChanged_{}", i)); | ||||||
|     } |     } | ||||||
| @@ -355,7 +362,9 @@ void NPad::OnRelease() { | |||||||
|     is_controller_initialized = false; |     is_controller_initialized = false; | ||||||
|     for (std::size_t i = 0; i < controller_data.size(); ++i) { |     for (std::size_t i = 0; i < controller_data.size(); ++i) { | ||||||
|         auto& controller = controller_data[i]; |         auto& controller = controller_data[i]; | ||||||
|         service_context.CloseEvent(controller.styleset_changed_event); |         if (controller.styleset_changed_event) { | ||||||
|  |             service_context.CloseEvent(controller.styleset_changed_event); | ||||||
|  |         } | ||||||
|         for (std::size_t device_idx = 0; device_idx < controller.vibration.size(); ++device_idx) { |         for (std::size_t device_idx = 0; device_idx < controller.vibration.size(); ++device_idx) { | ||||||
|             VibrateControllerAtIndex(controller.device->GetNpadIdType(), device_idx, {}); |             VibrateControllerAtIndex(controller.device->GetNpadIdType(), device_idx, {}); | ||||||
|         } |         } | ||||||
| @@ -432,12 +441,20 @@ void NPad::RequestPadStateUpdate(Core::HID::NpadIdType npad_id) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (std::size_t i = 0; i < controller_data.size(); ++i) { |     for (std::size_t i = 0; i < controller_data.size(); ++i) { | ||||||
|         auto& controller = controller_data[i]; |         auto& controller = controller_data[i]; | ||||||
|  |         controller.shared_memory = &data->shared_memory_format->npad.npad_entry[i].internal_state; | ||||||
|         auto* npad = controller.shared_memory; |         auto* npad = controller.shared_memory; | ||||||
|  |  | ||||||
|         const auto& controller_type = controller.device->GetNpadStyleIndex(); |         const auto& controller_type = controller.device->GetNpadStyleIndex(); | ||||||
| @@ -976,30 +993,6 @@ Result NPad::ResetIsSixAxisSensorDeviceNewlyAssigned( | |||||||
|     return ResultSuccess; |     return ResultSuccess; | ||||||
| } | } | ||||||
|  |  | ||||||
| NpadSixAxisSensorLifo& NPad::GetSixAxisFullkeyLifo(Core::HID::NpadIdType npad_id) { |  | ||||||
|     return GetControllerFromNpadIdType(npad_id).shared_memory->sixaxis_fullkey_lifo; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| NpadSixAxisSensorLifo& NPad::GetSixAxisHandheldLifo(Core::HID::NpadIdType npad_id) { |  | ||||||
|     return GetControllerFromNpadIdType(npad_id).shared_memory->sixaxis_handheld_lifo; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| NpadSixAxisSensorLifo& NPad::GetSixAxisDualLeftLifo(Core::HID::NpadIdType npad_id) { |  | ||||||
|     return GetControllerFromNpadIdType(npad_id).shared_memory->sixaxis_dual_left_lifo; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| NpadSixAxisSensorLifo& NPad::GetSixAxisDualRightLifo(Core::HID::NpadIdType npad_id) { |  | ||||||
|     return GetControllerFromNpadIdType(npad_id).shared_memory->sixaxis_dual_right_lifo; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| NpadSixAxisSensorLifo& NPad::GetSixAxisLeftLifo(Core::HID::NpadIdType npad_id) { |  | ||||||
|     return GetControllerFromNpadIdType(npad_id).shared_memory->sixaxis_left_lifo; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| NpadSixAxisSensorLifo& NPad::GetSixAxisRightLifo(Core::HID::NpadIdType npad_id) { |  | ||||||
|     return GetControllerFromNpadIdType(npad_id).shared_memory->sixaxis_right_lifo; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Result NPad::MergeSingleJoyAsDualJoy(Core::HID::NpadIdType npad_id_1, | Result NPad::MergeSingleJoyAsDualJoy(Core::HID::NpadIdType npad_id_1, | ||||||
|                                      Core::HID::NpadIdType npad_id_2) { |                                      Core::HID::NpadIdType npad_id_2) { | ||||||
|     if (!IsNpadIdValid(npad_id_1) || !IsNpadIdValid(npad_id_2)) { |     if (!IsNpadIdValid(npad_id_1) || !IsNpadIdValid(npad_id_2)) { | ||||||
|   | |||||||
| @@ -30,14 +30,14 @@ class ServiceContext; | |||||||
| union Result; | union Result; | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
|  | class AppletResource; | ||||||
| struct NpadInternalState; | struct NpadInternalState; | ||||||
| struct NpadSixAxisSensorLifo; | struct NpadSixAxisSensorLifo; | ||||||
| struct NpadSharedMemoryFormat; | struct NpadSharedMemoryFormat; | ||||||
|  |  | ||||||
| class NPad final : public ControllerBase { | class NPad final : public ControllerBase { | ||||||
| public: | public: | ||||||
|     explicit NPad(Core::HID::HIDCore& hid_core_, NpadSharedMemoryFormat& npad_shared_memory_format, |     explicit NPad(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service_context_); | ||||||
|                   KernelHelpers::ServiceContext& service_context_); |  | ||||||
|     ~NPad() override; |     ~NPad() override; | ||||||
|  |  | ||||||
|     // Called when the controller is initialized |     // Called when the controller is initialized | ||||||
| @@ -106,13 +106,6 @@ public: | |||||||
|     Result ResetIsSixAxisSensorDeviceNewlyAssigned( |     Result ResetIsSixAxisSensorDeviceNewlyAssigned( | ||||||
|         const Core::HID::SixAxisSensorHandle& sixaxis_handle); |         const Core::HID::SixAxisSensorHandle& sixaxis_handle); | ||||||
|  |  | ||||||
|     NpadSixAxisSensorLifo& GetSixAxisFullkeyLifo(Core::HID::NpadIdType npad_id); |  | ||||||
|     NpadSixAxisSensorLifo& GetSixAxisHandheldLifo(Core::HID::NpadIdType npad_id); |  | ||||||
|     NpadSixAxisSensorLifo& GetSixAxisDualLeftLifo(Core::HID::NpadIdType npad_id); |  | ||||||
|     NpadSixAxisSensorLifo& GetSixAxisDualRightLifo(Core::HID::NpadIdType npad_id); |  | ||||||
|     NpadSixAxisSensorLifo& GetSixAxisLeftLifo(Core::HID::NpadIdType npad_id); |  | ||||||
|     NpadSixAxisSensorLifo& GetSixAxisRightLifo(Core::HID::NpadIdType npad_id); |  | ||||||
|  |  | ||||||
|     Result GetLedPattern(Core::HID::NpadIdType npad_id, Core::HID::LedPattern& pattern) const; |     Result GetLedPattern(Core::HID::NpadIdType npad_id, Core::HID::LedPattern& pattern) const; | ||||||
|     Result IsUnintendedHomeButtonInputProtectionEnabled(Core::HID::NpadIdType npad_id, |     Result IsUnintendedHomeButtonInputProtectionEnabled(Core::HID::NpadIdType npad_id, | ||||||
|                                                         bool& is_enabled) const; |                                                         bool& is_enabled) const; | ||||||
|   | |||||||
| @@ -3,8 +3,9 @@ | |||||||
|  |  | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/hle/kernel/k_shared_memory.h" | #include "core/hle/kernel/k_shared_memory.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_holder.h" | #include "core/hle/service/hid/controllers/shared_memory_holder.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
| #include "core/hle/service/hid/errors.h" | #include "core/hle/service/hid/errors.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ | |||||||
| #include "core/hid/emulated_controller.h" | #include "core/hid/emulated_controller.h" | ||||||
| #include "core/hid/hid_core.h" | #include "core/hid/hid_core.h" | ||||||
| #include "core/hle/service/hid/controllers/npad.h" | #include "core/hle/service/hid/controllers/npad.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" |  | ||||||
| #include "core/hle/service/hid/controllers/six_axis.h" | #include "core/hle/service/hid/controllers/six_axis.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
| #include "core/hle/service/hid/errors.h" | #include "core/hle/service/hid/errors.h" | ||||||
| #include "core/hle/service/hid/hid_util.h" | #include "core/hle/service/hid/hid_util.h" | ||||||
|  |  | ||||||
| @@ -27,14 +27,20 @@ void SixAxis::OnInit() {} | |||||||
| void SixAxis::OnRelease() {} | void SixAxis::OnRelease() {} | ||||||
|  |  | ||||||
| void SixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | void SixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (std::size_t i = 0; i < controller_data.size(); ++i) { |     for (std::size_t i = 0; i < controller_data.size(); ++i) { | ||||||
|  |         NpadSharedMemoryEntry& shared_memory = data->shared_memory_format->npad.npad_entry[i]; | ||||||
|         auto& controller = controller_data[i]; |         auto& controller = controller_data[i]; | ||||||
|  |  | ||||||
|         const auto npad_id = IndexToNpadIdType(i); |  | ||||||
|         const auto& controller_type = controller.device->GetNpadStyleIndex(); |         const auto& controller_type = controller.device->GetNpadStyleIndex(); | ||||||
|  |  | ||||||
|         if (controller_type == Core::HID::NpadStyleIndex::None || |         if (controller_type == Core::HID::NpadStyleIndex::None || | ||||||
| @@ -50,12 +56,12 @@ void SixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||||||
|         auto& sixaxis_left_lifo_state = controller.sixaxis_left_lifo_state; |         auto& sixaxis_left_lifo_state = controller.sixaxis_left_lifo_state; | ||||||
|         auto& sixaxis_right_lifo_state = controller.sixaxis_right_lifo_state; |         auto& sixaxis_right_lifo_state = controller.sixaxis_right_lifo_state; | ||||||
|  |  | ||||||
|         auto& sixaxis_fullkey_lifo = npad->GetSixAxisFullkeyLifo(npad_id); |         auto& sixaxis_fullkey_lifo = shared_memory.internal_state.sixaxis_fullkey_lifo; | ||||||
|         auto& sixaxis_handheld_lifo = npad->GetSixAxisHandheldLifo(npad_id); |         auto& sixaxis_handheld_lifo = shared_memory.internal_state.sixaxis_handheld_lifo; | ||||||
|         auto& sixaxis_dual_left_lifo = npad->GetSixAxisDualLeftLifo(npad_id); |         auto& sixaxis_dual_left_lifo = shared_memory.internal_state.sixaxis_dual_left_lifo; | ||||||
|         auto& sixaxis_dual_right_lifo = npad->GetSixAxisDualRightLifo(npad_id); |         auto& sixaxis_dual_right_lifo = shared_memory.internal_state.sixaxis_dual_right_lifo; | ||||||
|         auto& sixaxis_left_lifo = npad->GetSixAxisLeftLifo(npad_id); |         auto& sixaxis_left_lifo = shared_memory.internal_state.sixaxis_left_lifo; | ||||||
|         auto& sixaxis_right_lifo = npad->GetSixAxisRightLifo(npad_id); |         auto& sixaxis_right_lifo = shared_memory.internal_state.sixaxis_right_lifo; | ||||||
|  |  | ||||||
|         // Clear previous state |         // Clear previous state | ||||||
|         sixaxis_fullkey_state = {}; |         sixaxis_fullkey_state = {}; | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								src/core/hle/service/hid/controllers/sleep_button.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/core/hle/service/hid/controllers/sleep_button.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #include "core/core_timing.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
|  | #include "core/hle/service/hid/controllers/sleep_button.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | SleepButton::SleepButton(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {} | ||||||
|  |  | ||||||
|  | SleepButton::~SleepButton() = default; | ||||||
|  |  | ||||||
|  | void SleepButton::OnInit() {} | ||||||
|  |  | ||||||
|  | void SleepButton::OnRelease() {} | ||||||
|  |  | ||||||
|  | void SleepButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     if (!smart_update) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     auto& header = data->shared_memory_format->capture_button.header; | ||||||
|  |     header.timestamp = core_timing.GetGlobalTimeNs().count(); | ||||||
|  |     header.total_entry_count = 17; | ||||||
|  |     header.entry_count = 0; | ||||||
|  |     header.last_entry_index = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace Service::HID | ||||||
							
								
								
									
										27
									
								
								src/core/hle/service/hid/controllers/sleep_button.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/core/hle/service/hid/controllers/sleep_button.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "core/hle/service/hid/controllers/controller_base.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | class SleepButton final : public ControllerBase { | ||||||
|  | public: | ||||||
|  |     explicit SleepButton(Core::HID::HIDCore& hid_core_); | ||||||
|  |     ~SleepButton() override; | ||||||
|  |  | ||||||
|  |     // Called when the controller is initialized | ||||||
|  |     void OnInit() override; | ||||||
|  |  | ||||||
|  |     // When the controller is released | ||||||
|  |     void OnRelease() override; | ||||||
|  |  | ||||||
|  |     // When the controller is requesting an update for the shared memory | ||||||
|  |     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     bool smart_update{}; | ||||||
|  | }; | ||||||
|  | } // namespace Service::HID | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |  | ||||||
| // SPDX-License-Identifier: GPL-2.0-or-later |  | ||||||
|  |  | ||||||
| #include "core/core_timing.h" |  | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" |  | ||||||
| #include "core/hle/service/hid/controllers/stubbed.h" |  | ||||||
|  |  | ||||||
| namespace Service::HID { |  | ||||||
|  |  | ||||||
| Controller_Stubbed::Controller_Stubbed(Core::HID::HIDCore& hid_core_, |  | ||||||
|                                        CommonHeader& ring_lifo_header) |  | ||||||
|     : ControllerBase{hid_core_}, header{ring_lifo_header} {} |  | ||||||
|  |  | ||||||
| Controller_Stubbed::~Controller_Stubbed() = default; |  | ||||||
|  |  | ||||||
| void Controller_Stubbed::OnInit() {} |  | ||||||
|  |  | ||||||
| void Controller_Stubbed::OnRelease() {} |  | ||||||
|  |  | ||||||
| void Controller_Stubbed::OnUpdate(const Core::Timing::CoreTiming& core_timing) { |  | ||||||
|     if (!smart_update) { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     header.timestamp = core_timing.GetGlobalTimeNs().count(); |  | ||||||
|     header.total_entry_count = 17; |  | ||||||
|     header.entry_count = 0; |  | ||||||
|     header.last_entry_index = 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| } // namespace Service::HID |  | ||||||
| @@ -8,15 +8,14 @@ | |||||||
| #include "core/frontend/emu_window.h" | #include "core/frontend/emu_window.h" | ||||||
| #include "core/hid/emulated_console.h" | #include "core/hid/emulated_console.h" | ||||||
| #include "core/hid/hid_core.h" | #include "core/hid/hid_core.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
| #include "core/hle/service/hid/controllers/touchscreen.h" | #include "core/hle/service/hid/controllers/touchscreen.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
|  |  | ||||||
| TouchScreen::TouchScreen(Core::HID::HIDCore& hid_core_, | TouchScreen::TouchScreen(Core::HID::HIDCore& hid_core_) | ||||||
|                          TouchScreenSharedMemoryFormat& touch_shared_memory) |     : ControllerBase{hid_core_}, touchscreen_width(Layout::ScreenUndocked::Width), | ||||||
|     : ControllerBase{hid_core_}, shared_memory{touch_shared_memory}, |  | ||||||
|       touchscreen_width(Layout::ScreenUndocked::Width), |  | ||||||
|       touchscreen_height(Layout::ScreenUndocked::Height) { |       touchscreen_height(Layout::ScreenUndocked::Height) { | ||||||
|     console = hid_core.GetEmulatedConsole(); |     console = hid_core.GetEmulatedConsole(); | ||||||
| } | } | ||||||
| @@ -28,6 +27,14 @@ void TouchScreen::OnInit() {} | |||||||
| void TouchScreen::OnRelease() {} | void TouchScreen::OnRelease() {} | ||||||
|  |  | ||||||
| void TouchScreen::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | void TouchScreen::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     TouchScreenSharedMemoryFormat& shared_memory = data->shared_memory_format->touch_screen; | ||||||
|     shared_memory.touch_screen_lifo.timestamp = core_timing.GetGlobalTimeNs().count(); |     shared_memory.touch_screen_lifo.timestamp = core_timing.GetGlobalTimeNs().count(); | ||||||
|  |  | ||||||
|     if (!IsControllerActivated()) { |     if (!IsControllerActivated()) { | ||||||
|   | |||||||
| @@ -18,8 +18,7 @@ struct TouchScreenSharedMemoryFormat; | |||||||
|  |  | ||||||
| class TouchScreen final : public ControllerBase { | class TouchScreen final : public ControllerBase { | ||||||
| public: | public: | ||||||
|     explicit TouchScreen(Core::HID::HIDCore& hid_core_, |     explicit TouchScreen(Core::HID::HIDCore& hid_core_); | ||||||
|                          TouchScreenSharedMemoryFormat& touch_shared_memory); |  | ||||||
|     ~TouchScreen() override; |     ~TouchScreen() override; | ||||||
|  |  | ||||||
|     // Called when the controller is initialized |     // Called when the controller is initialized | ||||||
| @@ -35,7 +34,6 @@ public: | |||||||
|  |  | ||||||
| private: | private: | ||||||
|     TouchScreenState next_state{}; |     TouchScreenState next_state{}; | ||||||
|     TouchScreenSharedMemoryFormat& shared_memory; |  | ||||||
|     Core::HID::EmulatedConsole* console = nullptr; |     Core::HID::EmulatedConsole* console = nullptr; | ||||||
|  |  | ||||||
|     std::array<Core::HID::TouchFinger, MAX_FINGERS> fingers{}; |     std::array<Core::HID::TouchFinger, MAX_FINGERS> fingers{}; | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								src/core/hle/service/hid/controllers/unique_pad.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/core/hle/service/hid/controllers/unique_pad.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #include "core/core_timing.h" | ||||||
|  | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  | #include "core/hle/service/hid/controllers/unique_pad.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | UniquePad::UniquePad(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {} | ||||||
|  |  | ||||||
|  | UniquePad::~UniquePad() = default; | ||||||
|  |  | ||||||
|  | void UniquePad::OnInit() {} | ||||||
|  |  | ||||||
|  | void UniquePad::OnRelease() {} | ||||||
|  |  | ||||||
|  | void UniquePad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||||||
|  |     if (!smart_update) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const u64 aruid = applet_resource->GetActiveAruid(); | ||||||
|  |     auto* data = applet_resource->GetAruidData(aruid); | ||||||
|  |  | ||||||
|  |     if (data == nullptr) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     auto& header = data->shared_memory_format->capture_button.header; | ||||||
|  |     header.timestamp = core_timing.GetGlobalTimeNs().count(); | ||||||
|  |     header.total_entry_count = 17; | ||||||
|  |     header.entry_count = 0; | ||||||
|  |     header.last_entry_index = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace Service::HID | ||||||
							
								
								
									
										27
									
								
								src/core/hle/service/hid/controllers/unique_pad.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/core/hle/service/hid/controllers/unique_pad.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "core/hle/service/hid/controllers/controller_base.h" | ||||||
|  |  | ||||||
|  | namespace Service::HID { | ||||||
|  |  | ||||||
|  | class UniquePad final : public ControllerBase { | ||||||
|  | public: | ||||||
|  |     explicit UniquePad(Core::HID::HIDCore& hid_core_); | ||||||
|  |     ~UniquePad() override; | ||||||
|  |  | ||||||
|  |     // Called when the controller is initialized | ||||||
|  |     void OnInit() override; | ||||||
|  |  | ||||||
|  |     // When the controller is released | ||||||
|  |     void OnRelease() override; | ||||||
|  |  | ||||||
|  |     // When the controller is requesting an update for the shared memory | ||||||
|  |     void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     bool smart_update{}; | ||||||
|  | }; | ||||||
|  | } // namespace Service::HID | ||||||
| @@ -10,18 +10,23 @@ | |||||||
| #include "core/hle/service/ipc_helpers.h" | #include "core/hle/service/ipc_helpers.h" | ||||||
|  |  | ||||||
| #include "core/hle/service/hid/controllers/applet_resource.h" | #include "core/hle/service/hid/controllers/applet_resource.h" | ||||||
|  | #include "core/hle/service/hid/controllers/capture_button.h" | ||||||
| #include "core/hle/service/hid/controllers/console_six_axis.h" | #include "core/hle/service/hid/controllers/console_six_axis.h" | ||||||
|  | #include "core/hle/service/hid/controllers/debug_mouse.h" | ||||||
| #include "core/hle/service/hid/controllers/debug_pad.h" | #include "core/hle/service/hid/controllers/debug_pad.h" | ||||||
|  | #include "core/hle/service/hid/controllers/digitizer.h" | ||||||
| #include "core/hle/service/hid/controllers/gesture.h" | #include "core/hle/service/hid/controllers/gesture.h" | ||||||
|  | #include "core/hle/service/hid/controllers/home_button.h" | ||||||
| #include "core/hle/service/hid/controllers/keyboard.h" | #include "core/hle/service/hid/controllers/keyboard.h" | ||||||
| #include "core/hle/service/hid/controllers/mouse.h" | #include "core/hle/service/hid/controllers/mouse.h" | ||||||
| #include "core/hle/service/hid/controllers/npad.h" | #include "core/hle/service/hid/controllers/npad.h" | ||||||
| #include "core/hle/service/hid/controllers/palma.h" | #include "core/hle/service/hid/controllers/palma.h" | ||||||
| #include "core/hle/service/hid/controllers/seven_six_axis.h" | #include "core/hle/service/hid/controllers/seven_six_axis.h" | ||||||
| #include "core/hle/service/hid/controllers/shared_memory_format.h" |  | ||||||
| #include "core/hle/service/hid/controllers/six_axis.h" | #include "core/hle/service/hid/controllers/six_axis.h" | ||||||
| #include "core/hle/service/hid/controllers/stubbed.h" | #include "core/hle/service/hid/controllers/sleep_button.h" | ||||||
| #include "core/hle/service/hid/controllers/touchscreen.h" | #include "core/hle/service/hid/controllers/touchscreen.h" | ||||||
|  | #include "core/hle/service/hid/controllers/types/shared_memory_format.h" | ||||||
|  | #include "core/hle/service/hid/controllers/unique_pad.h" | ||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
|  |  | ||||||
| @@ -46,44 +51,15 @@ void ResourceManager::Initialize() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     system.HIDCore().ReloadInputDevices(); |     system.HIDCore().ReloadInputDevices(); | ||||||
|  |  | ||||||
|  |     InitializeHidCommonSampler(); | ||||||
|  |     InitializeTouchScreenSampler(); | ||||||
|  |     InitializeConsoleSixAxisSampler(); | ||||||
|  |     InitializeAHidSampler(); | ||||||
|  |  | ||||||
|     is_initialized = true; |     is_initialized = true; | ||||||
| } | } | ||||||
|  |  | ||||||
| void ResourceManager::InitializeController(u64 aruid) { |  | ||||||
|     SharedMemoryFormat* shared_memory = nullptr; |  | ||||||
|     const auto result = applet_resource->GetSharedMemoryFormat(&shared_memory, aruid); |  | ||||||
|     if (result.IsError()) { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     debug_pad = std::make_shared<DebugPad>(system.HIDCore(), shared_memory->debug_pad); |  | ||||||
|     mouse = std::make_shared<Mouse>(system.HIDCore(), shared_memory->mouse); |  | ||||||
|     debug_mouse = std::make_shared<DebugMouse>(system.HIDCore(), shared_memory->debug_mouse); |  | ||||||
|     keyboard = std::make_shared<Keyboard>(system.HIDCore(), shared_memory->keyboard); |  | ||||||
|     unique_pad = std::make_shared<UniquePad>(system.HIDCore(), shared_memory->unique_pad.header); |  | ||||||
|     npad = std::make_shared<NPad>(system.HIDCore(), shared_memory->npad, service_context); |  | ||||||
|     gesture = std::make_shared<Gesture>(system.HIDCore(), shared_memory->gesture); |  | ||||||
|     touch_screen = std::make_shared<TouchScreen>(system.HIDCore(), shared_memory->touch_screen); |  | ||||||
|  |  | ||||||
|     palma = std::make_shared<Palma>(system.HIDCore(), service_context); |  | ||||||
|  |  | ||||||
|     home_button = std::make_shared<HomeButton>(system.HIDCore(), shared_memory->home_button.header); |  | ||||||
|     sleep_button = |  | ||||||
|         std::make_shared<SleepButton>(system.HIDCore(), shared_memory->sleep_button.header); |  | ||||||
|     capture_button = |  | ||||||
|         std::make_shared<CaptureButton>(system.HIDCore(), shared_memory->capture_button.header); |  | ||||||
|     digitizer = std::make_shared<Digitizer>(system.HIDCore(), shared_memory->digitizer.header); |  | ||||||
|  |  | ||||||
|     six_axis = std::make_shared<SixAxis>(system.HIDCore(), npad); |  | ||||||
|     console_six_axis = std::make_shared<ConsoleSixAxis>(system.HIDCore(), shared_memory->console); |  | ||||||
|     seven_six_axis = std::make_shared<SevenSixAxis>(system); |  | ||||||
|  |  | ||||||
|     // Homebrew doesn't try to activate some controllers, so we activate them by default |  | ||||||
|     npad->Activate(); |  | ||||||
|     six_axis->Activate(); |  | ||||||
|     touch_screen->Activate(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::shared_ptr<AppletResource> ResourceManager::GetAppletResource() const { | std::shared_ptr<AppletResource> ResourceManager::GetAppletResource() const { | ||||||
|     return applet_resource; |     return applet_resource; | ||||||
| } | } | ||||||
| @@ -165,16 +141,65 @@ Result ResourceManager::CreateAppletResource(u64 aruid) { | |||||||
|     if (result.IsError()) { |     if (result.IsError()) { | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Homebrew doesn't try to activate some controllers, so we activate them by default | ||||||
|  |     npad->Activate(); | ||||||
|  |     six_axis->Activate(); | ||||||
|  |     touch_screen->Activate(); | ||||||
|  |  | ||||||
|     return GetNpad()->Activate(aruid); |     return GetNpad()->Activate(aruid); | ||||||
| } | } | ||||||
|  |  | ||||||
| Result ResourceManager::CreateAppletResourceImpl(u64 aruid) { | Result ResourceManager::CreateAppletResourceImpl(u64 aruid) { | ||||||
|     std::scoped_lock lock{shared_mutex}; |     std::scoped_lock lock{shared_mutex}; | ||||||
|     const auto result = applet_resource->CreateAppletResource(aruid); |     return applet_resource->CreateAppletResource(aruid); | ||||||
|     if (result.IsSuccess()) { | } | ||||||
|         InitializeController(aruid); |  | ||||||
|     } | void ResourceManager::InitializeHidCommonSampler() { | ||||||
|     return result; |     debug_pad = std::make_shared<DebugPad>(system.HIDCore()); | ||||||
|  |     mouse = std::make_shared<Mouse>(system.HIDCore()); | ||||||
|  |     debug_mouse = std::make_shared<DebugMouse>(system.HIDCore()); | ||||||
|  |     keyboard = std::make_shared<Keyboard>(system.HIDCore()); | ||||||
|  |     unique_pad = std::make_shared<UniquePad>(system.HIDCore()); | ||||||
|  |     npad = std::make_shared<NPad>(system.HIDCore(), service_context); | ||||||
|  |     gesture = std::make_shared<Gesture>(system.HIDCore()); | ||||||
|  |     home_button = std::make_shared<HomeButton>(system.HIDCore()); | ||||||
|  |     sleep_button = std::make_shared<SleepButton>(system.HIDCore()); | ||||||
|  |     capture_button = std::make_shared<CaptureButton>(system.HIDCore()); | ||||||
|  |     digitizer = std::make_shared<Digitizer>(system.HIDCore()); | ||||||
|  |  | ||||||
|  |     palma = std::make_shared<Palma>(system.HIDCore(), service_context); | ||||||
|  |     six_axis = std::make_shared<SixAxis>(system.HIDCore(), npad); | ||||||
|  |  | ||||||
|  |     debug_pad->SetAppletResource(applet_resource); | ||||||
|  |     digitizer->SetAppletResource(applet_resource); | ||||||
|  |     keyboard->SetAppletResource(applet_resource); | ||||||
|  |     npad->SetAppletResource(applet_resource); | ||||||
|  |     six_axis->SetAppletResource(applet_resource); | ||||||
|  |     mouse->SetAppletResource(applet_resource); | ||||||
|  |     debug_mouse->SetAppletResource(applet_resource); | ||||||
|  |     home_button->SetAppletResource(applet_resource); | ||||||
|  |     sleep_button->SetAppletResource(applet_resource); | ||||||
|  |     capture_button->SetAppletResource(applet_resource); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ResourceManager::InitializeTouchScreenSampler() { | ||||||
|  |     gesture = std::make_shared<Gesture>(system.HIDCore()); | ||||||
|  |     touch_screen = std::make_shared<TouchScreen>(system.HIDCore()); | ||||||
|  |  | ||||||
|  |     touch_screen->SetAppletResource(applet_resource); | ||||||
|  |     gesture->SetAppletResource(applet_resource); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ResourceManager::InitializeConsoleSixAxisSampler() { | ||||||
|  |     console_six_axis = std::make_shared<ConsoleSixAxis>(system.HIDCore()); | ||||||
|  |     seven_six_axis = std::make_shared<SevenSixAxis>(system); | ||||||
|  |  | ||||||
|  |     console_six_axis->SetAppletResource(applet_resource); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ResourceManager::InitializeAHidSampler() { | ||||||
|  |     // TODO | ||||||
| } | } | ||||||
|  |  | ||||||
| Result ResourceManager::RegisterCoreAppletResource() { | Result ResourceManager::RegisterCoreAppletResource() { | ||||||
|   | |||||||
| @@ -20,24 +20,23 @@ class KSharedMemory; | |||||||
|  |  | ||||||
| namespace Service::HID { | namespace Service::HID { | ||||||
| class AppletResource; | class AppletResource; | ||||||
|  | class CaptureButton; | ||||||
| class Controller_Stubbed; | class Controller_Stubbed; | ||||||
| class ConsoleSixAxis; | class ConsoleSixAxis; | ||||||
|  | class DebugMouse; | ||||||
| class DebugPad; | class DebugPad; | ||||||
|  | class Digitizer; | ||||||
| class Gesture; | class Gesture; | ||||||
|  | class HomeButton; | ||||||
| class Keyboard; | class Keyboard; | ||||||
| class Mouse; | class Mouse; | ||||||
| class NPad; | class NPad; | ||||||
| class Palma; | class Palma; | ||||||
| class SevenSixAxis; | class SevenSixAxis; | ||||||
| class SixAxis; | class SixAxis; | ||||||
|  | class SleepButton; | ||||||
| class TouchScreen; | class TouchScreen; | ||||||
|  | class UniquePad; | ||||||
| using CaptureButton = Controller_Stubbed; |  | ||||||
| using DebugMouse = Mouse; |  | ||||||
| using Digitizer = Controller_Stubbed; |  | ||||||
| using HomeButton = Controller_Stubbed; |  | ||||||
| using SleepButton = Controller_Stubbed; |  | ||||||
| using UniquePad = Controller_Stubbed; |  | ||||||
|  |  | ||||||
| class ResourceManager { | class ResourceManager { | ||||||
|  |  | ||||||
| @@ -46,7 +45,6 @@ public: | |||||||
|     ~ResourceManager(); |     ~ResourceManager(); | ||||||
|  |  | ||||||
|     void Initialize(); |     void Initialize(); | ||||||
|     void InitializeController(u64 aruid); |  | ||||||
|  |  | ||||||
|     std::shared_ptr<AppletResource> GetAppletResource() const; |     std::shared_ptr<AppletResource> GetAppletResource() const; | ||||||
|     std::shared_ptr<CaptureButton> GetCaptureButton() const; |     std::shared_ptr<CaptureButton> GetCaptureButton() const; | ||||||
| @@ -88,6 +86,10 @@ public: | |||||||
|  |  | ||||||
| private: | private: | ||||||
|     Result CreateAppletResourceImpl(u64 aruid); |     Result CreateAppletResourceImpl(u64 aruid); | ||||||
|  |     void InitializeHidCommonSampler(); | ||||||
|  |     void InitializeTouchScreenSampler(); | ||||||
|  |     void InitializeConsoleSixAxisSampler(); | ||||||
|  |     void InitializeAHidSampler(); | ||||||
|  |  | ||||||
|     bool is_initialized{false}; |     bool is_initialized{false}; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user