// 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