From c9cd938dfd8fc40ec58d61dc453bc31d3b811496 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Tue, 14 Nov 2023 21:34:27 -0600 Subject: service: hid: Split hid.cpp into individual interfaces --- src/core/hle/service/hid/resource_manager.h | 106 ++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/core/hle/service/hid/resource_manager.h (limited to 'src/core/hle/service/hid/resource_manager.h') diff --git a/src/core/hle/service/hid/resource_manager.h b/src/core/hle/service/hid/resource_manager.h new file mode 100644 index 000000000..81b17f9a9 --- /dev/null +++ b/src/core/hle/service/hid/resource_manager.h @@ -0,0 +1,106 @@ +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +#include "core/core.h" +#include "core/hle/service/hid/controllers/controller_base.h" +#include "core/hle/service/kernel_helpers.h" +#include "core/hle/service/service.h" + +namespace Core::Timing { +struct EventType; +} + +namespace Core::HID { +class HIDCore; +} + +namespace Service::HID { + +enum class HidController : std::size_t { + DebugPad, + Touchscreen, + Mouse, + Keyboard, + XPad, + HomeButton, + SleepButton, + CaptureButton, + InputDetector, + UniquePad, + NPad, + Gesture, + ConsoleSixAxisSensor, + DebugMouse, + Palma, + + MaxControllers, +}; +class ResourceManager { +public: + explicit ResourceManager(Core::System& system_); + ~ResourceManager(); + + template + T& GetController(HidController controller) { + return static_cast(*controllers[static_cast(controller)]); + } + + template + const T& GetController(HidController controller) const { + return static_cast(*controllers[static_cast(controller)]); + } + + void Initialize(); + void ActivateController(HidController controller); + void DeactivateController(HidController controller); + + void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); + void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); + void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); + void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); + +private: + template + void MakeController(HidController controller, u8* shared_memory) { + if constexpr (std::is_constructible_v) { + controllers[static_cast(controller)] = + std::make_unique(system, shared_memory); + } else { + controllers[static_cast(controller)] = + std::make_unique(system.HIDCore(), shared_memory); + } + } + + template + void MakeControllerWithServiceContext(HidController controller, u8* shared_memory) { + controllers[static_cast(controller)] = + std::make_unique(system.HIDCore(), shared_memory, service_context); + } + + bool is_initialized{false}; + std::array, static_cast(HidController::MaxControllers)> + controllers{}; + + Core::System& system; + KernelHelpers::ServiceContext service_context; +}; + +class IAppletResource final : public ServiceFramework { +public: + explicit IAppletResource(Core::System& system_, std::shared_ptr resource); + ~IAppletResource() override; + +private: + void GetSharedMemoryHandle(HLERequestContext& ctx); + + std::shared_ptr npad_update_event; + std::shared_ptr default_update_event; + std::shared_ptr mouse_keyboard_update_event; + std::shared_ptr motion_update_event; +}; + +} // namespace Service::HID -- cgit v1.2.3