resource_manager.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-3.0-or-later
  3. #pragma once
  4. #include <chrono>
  5. #include "core/core.h"
  6. #include "core/hle/service/hid/controllers/controller_base.h"
  7. #include "core/hle/service/kernel_helpers.h"
  8. #include "core/hle/service/service.h"
  9. namespace Core::Timing {
  10. struct EventType;
  11. }
  12. namespace Core::HID {
  13. class HIDCore;
  14. }
  15. namespace Service::HID {
  16. enum class HidController : std::size_t {
  17. DebugPad,
  18. Touchscreen,
  19. Mouse,
  20. Keyboard,
  21. XPad,
  22. HomeButton,
  23. SleepButton,
  24. CaptureButton,
  25. InputDetector,
  26. UniquePad,
  27. NPad,
  28. Gesture,
  29. ConsoleSixAxisSensor,
  30. DebugMouse,
  31. Palma,
  32. MaxControllers,
  33. };
  34. class ResourceManager {
  35. public:
  36. explicit ResourceManager(Core::System& system_);
  37. ~ResourceManager();
  38. template <typename T>
  39. T& GetController(HidController controller) {
  40. return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
  41. }
  42. template <typename T>
  43. const T& GetController(HidController controller) const {
  44. return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
  45. }
  46. void Initialize();
  47. void ActivateController(HidController controller);
  48. void DeactivateController(HidController controller);
  49. void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  50. void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  51. void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  52. void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  53. private:
  54. template <typename T>
  55. void MakeController(HidController controller, u8* shared_memory) {
  56. if constexpr (std::is_constructible_v<T, Core::System&, u8*>) {
  57. controllers[static_cast<std::size_t>(controller)] =
  58. std::make_unique<T>(system, shared_memory);
  59. } else {
  60. controllers[static_cast<std::size_t>(controller)] =
  61. std::make_unique<T>(system.HIDCore(), shared_memory);
  62. }
  63. }
  64. template <typename T>
  65. void MakeControllerWithServiceContext(HidController controller, u8* shared_memory) {
  66. controllers[static_cast<std::size_t>(controller)] =
  67. std::make_unique<T>(system.HIDCore(), shared_memory, service_context);
  68. }
  69. bool is_initialized{false};
  70. std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
  71. controllers{};
  72. Core::System& system;
  73. KernelHelpers::ServiceContext service_context;
  74. };
  75. class IAppletResource final : public ServiceFramework<IAppletResource> {
  76. public:
  77. explicit IAppletResource(Core::System& system_, std::shared_ptr<ResourceManager> resource);
  78. ~IAppletResource() override;
  79. private:
  80. void GetSharedMemoryHandle(HLERequestContext& ctx);
  81. std::shared_ptr<Core::Timing::EventType> npad_update_event;
  82. std::shared_ptr<Core::Timing::EventType> default_update_event;
  83. std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event;
  84. std::shared_ptr<Core::Timing::EventType> motion_update_event;
  85. };
  86. } // namespace Service::HID