xpad.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 "common/bit_field.h"
  6. #include "common/common_funcs.h"
  7. #include "common/common_types.h"
  8. #include "common/swap.h"
  9. #include "core/hle/service/hid/controllers/controller_base.h"
  10. namespace Service::HID {
  11. class Controller_XPad final : public ControllerBase {
  12. public:
  13. explicit Controller_XPad(Core::System& system);
  14. ~Controller_XPad() override;
  15. // Called when the controller is initialized
  16. void OnInit() override;
  17. // When the controller is released
  18. void OnRelease() override;
  19. // When the controller is requesting an update for the shared memory
  20. void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
  21. // Called when input devices should be loaded
  22. void OnLoadInputDevices() override;
  23. private:
  24. struct Attributes {
  25. union {
  26. s32_le raw{};
  27. BitField<0, 1, u32> IsConnected;
  28. BitField<1, 1, u32> IsWired;
  29. BitField<2, 1, u32> IsLeftConnected;
  30. BitField<3, 1, u32> IsLeftWired;
  31. BitField<4, 1, u32> IsRightConnected;
  32. BitField<5, 1, u32> IsRightWired;
  33. };
  34. };
  35. static_assert(sizeof(Attributes) == 4, "Attributes is an invalid size");
  36. struct Buttons {
  37. union {
  38. u32_le raw{};
  39. // Button states
  40. BitField<0, 1, u32> a;
  41. BitField<1, 1, u32> b;
  42. BitField<2, 1, u32> x;
  43. BitField<3, 1, u32> y;
  44. BitField<4, 1, u32> l_stick;
  45. BitField<5, 1, u32> r_stick;
  46. BitField<6, 1, u32> l;
  47. BitField<7, 1, u32> r;
  48. BitField<8, 1, u32> zl;
  49. BitField<9, 1, u32> zr;
  50. BitField<10, 1, u32> plus;
  51. BitField<11, 1, u32> minus;
  52. // D-Pad
  53. BitField<12, 1, u32> d_left;
  54. BitField<13, 1, u32> d_up;
  55. BitField<14, 1, u32> d_right;
  56. BitField<15, 1, u32> d_down;
  57. // Left JoyStick
  58. BitField<16, 1, u32> l_stick_left;
  59. BitField<17, 1, u32> l_stick_up;
  60. BitField<18, 1, u32> l_stick_right;
  61. BitField<19, 1, u32> l_stick_down;
  62. // Right JoyStick
  63. BitField<20, 1, u32> r_stick_left;
  64. BitField<21, 1, u32> r_stick_up;
  65. BitField<22, 1, u32> r_stick_right;
  66. BitField<23, 1, u32> r_stick_down;
  67. // Not always active?
  68. BitField<24, 1, u32> left_sl;
  69. BitField<25, 1, u32> left_sr;
  70. BitField<26, 1, u32> right_sl;
  71. BitField<27, 1, u32> right_sr;
  72. BitField<28, 1, u32> palma;
  73. BitField<30, 1, u32> handheld_left_b;
  74. };
  75. };
  76. static_assert(sizeof(Buttons) == 4, "Buttons is an invalid size");
  77. struct AnalogStick {
  78. s32_le x;
  79. s32_le y;
  80. };
  81. static_assert(sizeof(AnalogStick) == 0x8, "AnalogStick is an invalid size");
  82. struct XPadState {
  83. s64_le sampling_number;
  84. s64_le sampling_number2;
  85. Attributes attributes;
  86. Buttons pad_states;
  87. AnalogStick l_stick;
  88. AnalogStick r_stick;
  89. };
  90. static_assert(sizeof(XPadState) == 0x28, "XPadState is an invalid size");
  91. struct XPadEntry {
  92. CommonHeader header;
  93. std::array<XPadState, 17> pad_states{};
  94. INSERT_PADDING_BYTES(0x138);
  95. };
  96. static_assert(sizeof(XPadEntry) == 0x400, "XPadEntry is an invalid size");
  97. struct SharedMemory {
  98. std::array<XPadEntry, 4> shared_memory_entries{};
  99. };
  100. static_assert(sizeof(SharedMemory) == 0x1000, "SharedMemory is an invalid size");
  101. SharedMemory shared_memory{};
  102. };
  103. } // namespace Service::HID