npad_resource.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-3.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <mutex>
  6. #include <span>
  7. #include "common/common_types.h"
  8. #include "core/hle/result.h"
  9. #include "core/hle/service/kernel_helpers.h"
  10. #include "hid_core/hid_types.h"
  11. #include "hid_core/resources/applet_resource.h"
  12. #include "hid_core/resources/npad/npad_data.h"
  13. #include "hid_core/resources/npad/npad_types.h"
  14. namespace Core {
  15. class System;
  16. }
  17. namespace Kernel {
  18. class KReadableEvent;
  19. }
  20. namespace Service::HID {
  21. struct DataStatusFlag;
  22. struct NpadControllerState {
  23. bool is_styleset_update_event_initialized{};
  24. INSERT_PADDING_BYTES(0x7);
  25. Kernel::KEvent* style_set_update_event{nullptr};
  26. INSERT_PADDING_BYTES(0x27);
  27. };
  28. struct NpadState {
  29. DataStatusFlag flag{};
  30. u64 aruid{};
  31. NPadData data{};
  32. std::array<std::array<Core::HID::NpadButton, StyleIndexCount>, MaxSupportedNpadIdTypes>
  33. button_config;
  34. std::array<NpadControllerState, MaxSupportedNpadIdTypes> controller_state;
  35. NpadRevision npad_revision;
  36. };
  37. /// Handles Npad request from HID interfaces
  38. class NPadResource final {
  39. public:
  40. explicit NPadResource(KernelHelpers::ServiceContext& context);
  41. ~NPadResource();
  42. NPadData* GetActiveData();
  43. u64 GetActiveDataAruid();
  44. Result RegisterAppletResourceUserId(u64 aruid);
  45. void UnregisterAppletResourceUserId(u64 aruid);
  46. void DestroyStyleSetUpdateEvents(u64 aruid);
  47. Result Activate(u64 aruid);
  48. Result Activate();
  49. Result Deactivate();
  50. void SetAppletResourceUserId(u64 aruid);
  51. std::size_t GetIndexFromAruid(u64 aruid) const;
  52. Result ApplyNpadSystemCommonPolicy(u64 aruid, bool is_full_policy);
  53. Result ClearNpadSystemCommonPolicy(u64 aruid);
  54. Result SetSupportedNpadStyleSet(u64 aruid, Core::HID::NpadStyleSet style_set);
  55. Result GetSupportedNpadStyleSet(Core::HID::NpadStyleSet& out_style_Set, u64 aruid) const;
  56. Result GetMaskedSupportedNpadStyleSet(Core::HID::NpadStyleSet& out_style_set, u64 aruid) const;
  57. Result GetAvailableStyleset(Core::HID::NpadStyleSet& out_style_set, u64 aruid) const;
  58. NpadRevision GetNpadRevision(u64 aruid) const;
  59. void SetNpadRevision(u64 aruid, NpadRevision revision);
  60. Result IsSupportedNpadStyleSet(bool& is_set, u64 aruid);
  61. Result SetNpadJoyHoldType(u64 aruid, NpadJoyHoldType hold_type);
  62. Result GetNpadJoyHoldType(NpadJoyHoldType& hold_type, u64 aruid) const;
  63. Result SetNpadHandheldActivationMode(u64 aruid, NpadHandheldActivationMode activation_mode);
  64. Result GetNpadHandheldActivationMode(NpadHandheldActivationMode& activation_mode,
  65. u64 aruid) const;
  66. Result SetSupportedNpadIdType(u64 aruid,
  67. std::span<const Core::HID::NpadIdType> supported_npad_list);
  68. bool IsControllerSupported(u64 aruid, Core::HID::NpadStyleIndex style_index) const;
  69. Result SetLrAssignmentMode(u64 aruid, bool is_enabled);
  70. Result GetLrAssignmentMode(bool& is_enabled, u64 aruid) const;
  71. Result SetAssigningSingleOnSlSrPress(u64 aruid, bool is_enabled);
  72. Result IsAssigningSingleOnSlSrPressEnabled(bool& is_enabled, u64 aruid) const;
  73. Result AcquireNpadStyleSetUpdateEventHandle(u64 aruid, Kernel::KReadableEvent** out_event,
  74. Core::HID::NpadIdType npad_id);
  75. Result SignalStyleSetUpdateEvent(u64 aruid, Core::HID::NpadIdType npad_id);
  76. Result GetHomeProtectionEnabled(bool& is_enabled, u64 aruid,
  77. Core::HID::NpadIdType npad_id) const;
  78. Result SetHomeProtectionEnabled(u64 aruid, Core::HID::NpadIdType npad_id, bool is_enabled);
  79. Result SetNpadAnalogStickUseCenterClamp(u64 aruid, bool is_enabled);
  80. Result SetButtonConfig(u64 aruid, Core::HID::NpadIdType npad_id, std::size_t index,
  81. Core::HID::NpadButton button_config);
  82. Core::HID::NpadButton GetButtonConfig(u64 aruid, Core::HID::NpadIdType npad_id,
  83. std::size_t index, Core::HID::NpadButton mask,
  84. bool is_enabled);
  85. void ResetButtonConfig();
  86. Result SetNpadCaptureButtonAssignment(u64 aruid, Core::HID::NpadStyleSet npad_style_set,
  87. Core::HID::NpadButton button_assignment);
  88. Result ClearNpadCaptureButtonAssignment(u64 aruid);
  89. std::size_t GetNpadCaptureButtonAssignment(std::span<Core::HID::NpadButton> out_list,
  90. u64 aruid) const;
  91. Result SetNpadSystemExtStateEnabled(u64 aruid, bool is_enabled);
  92. private:
  93. NPadData active_data{};
  94. AruidRegisterList registration_list{};
  95. std::array<NpadState, AruidIndexMax> state{};
  96. u64 active_data_aruid{};
  97. NpadJoyHoldType default_hold_type{};
  98. s32 ref_counter{};
  99. KernelHelpers::ServiceContext& service_context;
  100. };
  101. } // namespace Service::HID