// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" namespace Core { class System; } namespace Core::Timing { struct EventType; } namespace Kernel { class KSharedMemory; } namespace Service::HID { class AppletResource; class Controller_Stubbed; class ConsoleSixAxis; class DebugPad; class Gesture; class Keyboard; class Mouse; class NPad; class Palma; class SevenSixAxis; class SixAxis; class TouchScreen; 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 { public: explicit ResourceManager(Core::System& system_); ~ResourceManager(); void Initialize(); void InitializeController(u64 aruid); std::shared_ptr GetAppletResource() const; std::shared_ptr GetCaptureButton() const; std::shared_ptr GetConsoleSixAxis() const; std::shared_ptr GetDebugMouse() const; std::shared_ptr GetDebugPad() const; std::shared_ptr GetDigitizer() const; std::shared_ptr GetGesture() const; std::shared_ptr GetHomeButton() const; std::shared_ptr GetKeyboard() const; std::shared_ptr GetMouse() const; std::shared_ptr GetNpad() const; std::shared_ptr GetPalma() const; std::shared_ptr GetSevenSixAxis() const; std::shared_ptr GetSixAxis() const; std::shared_ptr GetSleepButton() const; std::shared_ptr GetTouchScreen() const; std::shared_ptr GetUniquePad() const; Result CreateAppletResource(u64 aruid); Result RegisterCoreAppletResource(); Result UnregisterCoreAppletResource(); Result RegisterAppletResourceUserId(u64 aruid, bool bool_value); void UnregisterAppletResourceUserId(u64 aruid); Result GetSharedMemoryHandle(Kernel::KSharedMemory** out_handle, u64 aruid); void FreeAppletResourceId(u64 aruid); void EnableInput(u64 aruid, bool is_enabled); void EnableSixAxisSensor(u64 aruid, bool is_enabled); void EnablePadInput(u64 aruid, bool is_enabled); void EnableTouchScreen(u64 aruid, bool is_enabled); void UpdateControllers(std::chrono::nanoseconds ns_late); void UpdateNpad(std::chrono::nanoseconds ns_late); void UpdateMouseKeyboard(std::chrono::nanoseconds ns_late); void UpdateMotion(std::chrono::nanoseconds ns_late); private: Result CreateAppletResourceImpl(u64 aruid); bool is_initialized{false}; mutable std::mutex shared_mutex; std::shared_ptr applet_resource = nullptr; std::shared_ptr capture_button = nullptr; std::shared_ptr console_six_axis = nullptr; std::shared_ptr debug_mouse = nullptr; std::shared_ptr debug_pad = nullptr; std::shared_ptr digitizer = nullptr; std::shared_ptr gesture = nullptr; std::shared_ptr home_button = nullptr; std::shared_ptr keyboard = nullptr; std::shared_ptr mouse = nullptr; std::shared_ptr npad = nullptr; std::shared_ptr palma = nullptr; std::shared_ptr seven_six_axis = nullptr; std::shared_ptr six_axis = nullptr; std::shared_ptr sleep_button = nullptr; std::shared_ptr touch_screen = nullptr; std::shared_ptr unique_pad = nullptr; // TODO: Create these resources // std::shared_ptr audio_control = nullptr; // std::shared_ptr button_config = nullptr; // std::shared_ptr config = nullptr; // std::shared_ptr connection = nullptr; // std::shared_ptr custom_config = nullptr; // std::shared_ptr digitizer = nullptr; // std::shared_ptr hdls = nullptr; // std::shared_ptr play_report = nullptr; // std::shared_ptr rail = nullptr; Core::System& system; KernelHelpers::ServiceContext service_context; }; class IAppletResource final : public ServiceFramework { public: explicit IAppletResource(Core::System& system_, std::shared_ptr resource, u64 applet_resource_user_id); ~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; u64 aruid; std::shared_ptr resource_manager; }; } // namespace Service::HID