hid.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include "core/hle/service/hid/controllers/controller_base.h"
  6. #include "core/hle/service/service.h"
  7. #include "controllers/controller_base.h"
  8. #include "core/hle/service/service.h"
  9. namespace Core::Timing {
  10. struct EventType;
  11. }
  12. namespace Kernel {
  13. class SharedMemory;
  14. }
  15. namespace Service::SM {
  16. class ServiceManager;
  17. }
  18. namespace Service::HID {
  19. enum class HidController : std::size_t {
  20. DebugPad,
  21. Touchscreen,
  22. Mouse,
  23. Keyboard,
  24. XPad,
  25. Unknown1,
  26. Unknown2,
  27. Unknown3,
  28. SixAxisSensor,
  29. NPad,
  30. Gesture,
  31. MaxControllers,
  32. };
  33. class IAppletResource final : public ServiceFramework<IAppletResource> {
  34. public:
  35. explicit IAppletResource(Core::System& system);
  36. ~IAppletResource() override;
  37. void ActivateController(HidController controller);
  38. void DeactivateController(HidController controller);
  39. template <typename T>
  40. T& GetController(HidController controller) {
  41. return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
  42. }
  43. template <typename T>
  44. const T& GetController(HidController controller) const {
  45. return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
  46. }
  47. private:
  48. template <typename T>
  49. void MakeController(HidController controller) {
  50. controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(system);
  51. }
  52. void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx);
  53. void UpdateControllers(u64 userdata, s64 cycles_late);
  54. std::shared_ptr<Kernel::SharedMemory> shared_mem;
  55. std::shared_ptr<Core::Timing::EventType> pad_update_event;
  56. Core::System& system;
  57. std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
  58. controllers{};
  59. };
  60. class Hid final : public ServiceFramework<Hid> {
  61. public:
  62. explicit Hid(Core::System& system);
  63. ~Hid() override;
  64. std::shared_ptr<IAppletResource> GetAppletResource();
  65. private:
  66. void CreateAppletResource(Kernel::HLERequestContext& ctx);
  67. void ActivateXpad(Kernel::HLERequestContext& ctx);
  68. void GetXpadIDs(Kernel::HLERequestContext& ctx);
  69. void ActivateDebugPad(Kernel::HLERequestContext& ctx);
  70. void ActivateTouchScreen(Kernel::HLERequestContext& ctx);
  71. void ActivateMouse(Kernel::HLERequestContext& ctx);
  72. void ActivateKeyboard(Kernel::HLERequestContext& ctx);
  73. void ActivateGesture(Kernel::HLERequestContext& ctx);
  74. void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx);
  75. void StartSixAxisSensor(Kernel::HLERequestContext& ctx);
  76. void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx);
  77. void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx);
  78. void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
  79. void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx);
  80. void SetSupportedNpadIdType(Kernel::HLERequestContext& ctx);
  81. void ActivateNpad(Kernel::HLERequestContext& ctx);
  82. void DeactivateNpad(Kernel::HLERequestContext& ctx);
  83. void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx);
  84. void DisconnectNpad(Kernel::HLERequestContext& ctx);
  85. void GetPlayerLedPattern(Kernel::HLERequestContext& ctx);
  86. void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx);
  87. void GetNpadJoyHoldType(Kernel::HLERequestContext& ctx);
  88. void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx);
  89. void SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx);
  90. void SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx);
  91. void MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx);
  92. void StartLrAssignmentMode(Kernel::HLERequestContext& ctx);
  93. void StopLrAssignmentMode(Kernel::HLERequestContext& ctx);
  94. void SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx);
  95. void GetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx);
  96. void SwapNpadAssignment(Kernel::HLERequestContext& ctx);
  97. void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx);
  98. void EndPermitVibrationSession(Kernel::HLERequestContext& ctx);
  99. void SendVibrationValue(Kernel::HLERequestContext& ctx);
  100. void SendVibrationValues(Kernel::HLERequestContext& ctx);
  101. void GetActualVibrationValue(Kernel::HLERequestContext& ctx);
  102. void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx);
  103. void CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx);
  104. void PermitVibration(Kernel::HLERequestContext& ctx);
  105. void IsVibrationPermitted(Kernel::HLERequestContext& ctx);
  106. void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx);
  107. void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx);
  108. void StopSixAxisSensor(Kernel::HLERequestContext& ctx);
  109. void SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx);
  110. void SetPalmaBoostMode(Kernel::HLERequestContext& ctx);
  111. void StopSevenSixAxisSensor(Kernel::HLERequestContext& ctx);
  112. void InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx);
  113. void SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx);
  114. std::shared_ptr<IAppletResource> applet_resource;
  115. Core::System& system;
  116. };
  117. /// Reload input devices. Used when input configuration changed
  118. void ReloadInputDevices();
  119. /// Registers all HID services with the specified service manager.
  120. void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
  121. } // namespace Service::HID