xpad.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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/hid/hid_types.h"
  10. #include "core/hle/service/hid/controllers/controller_base.h"
  11. #include "core/hle/service/hid/ring_lifo.h"
  12. namespace Service::HID {
  13. class Controller_XPad final : public ControllerBase {
  14. public:
  15. explicit Controller_XPad(Core::HID::HIDCore& hid_core_);
  16. ~Controller_XPad() override;
  17. // Called when the controller is initialized
  18. void OnInit() override;
  19. // When the controller is released
  20. void OnRelease() override;
  21. // When the controller is requesting an update for the shared memory
  22. void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
  23. private:
  24. // This is nn::hid::BasicXpadAttributeSet
  25. struct BasicXpadAttributeSet {
  26. union {
  27. u32 raw{};
  28. BitField<0, 1, u32> is_connected;
  29. BitField<1, 1, u32> is_wired;
  30. BitField<2, 1, u32> is_left_connected;
  31. BitField<3, 1, u32> is_left_wired;
  32. BitField<4, 1, u32> is_right_connected;
  33. BitField<5, 1, u32> is_right_wired;
  34. };
  35. };
  36. static_assert(sizeof(BasicXpadAttributeSet) == 4, "BasicXpadAttributeSet is an invalid size");
  37. // This is nn::hid::BasicXpadButtonSet
  38. struct BasicXpadButtonSet {
  39. union {
  40. u32 raw{};
  41. // Button states
  42. BitField<0, 1, u32> a;
  43. BitField<1, 1, u32> b;
  44. BitField<2, 1, u32> x;
  45. BitField<3, 1, u32> y;
  46. BitField<4, 1, u32> l_stick;
  47. BitField<5, 1, u32> r_stick;
  48. BitField<6, 1, u32> l;
  49. BitField<7, 1, u32> r;
  50. BitField<8, 1, u32> zl;
  51. BitField<9, 1, u32> zr;
  52. BitField<10, 1, u32> plus;
  53. BitField<11, 1, u32> minus;
  54. // D-Pad
  55. BitField<12, 1, u32> d_left;
  56. BitField<13, 1, u32> d_up;
  57. BitField<14, 1, u32> d_right;
  58. BitField<15, 1, u32> d_down;
  59. // Left JoyStick
  60. BitField<16, 1, u32> l_stick_left;
  61. BitField<17, 1, u32> l_stick_up;
  62. BitField<18, 1, u32> l_stick_right;
  63. BitField<19, 1, u32> l_stick_down;
  64. // Right JoyStick
  65. BitField<20, 1, u32> r_stick_left;
  66. BitField<21, 1, u32> r_stick_up;
  67. BitField<22, 1, u32> r_stick_right;
  68. BitField<23, 1, u32> r_stick_down;
  69. // Not always active?
  70. BitField<24, 1, u32> left_sl;
  71. BitField<25, 1, u32> left_sr;
  72. BitField<26, 1, u32> right_sl;
  73. BitField<27, 1, u32> right_sr;
  74. BitField<28, 1, u32> palma;
  75. BitField<30, 1, u32> handheld_left_b;
  76. };
  77. };
  78. static_assert(sizeof(BasicXpadButtonSet) == 4, "BasicXpadButtonSet is an invalid size");
  79. // This is nn::hid::detail::BasicXpadState
  80. struct BasicXpadState {
  81. s64 sampling_number;
  82. BasicXpadAttributeSet attributes;
  83. BasicXpadButtonSet pad_states;
  84. Core::HID::AnalogStickState l_stick;
  85. Core::HID::AnalogStickState r_stick;
  86. };
  87. static_assert(sizeof(BasicXpadState) == 0x20, "BasicXpadState is an invalid size");
  88. // This is nn::hid::detail::BasicXpadLifo
  89. Lifo<BasicXpadState> basic_xpad_lifo{};
  90. static_assert(sizeof(basic_xpad_lifo) == 0x2C8, "basic_xpad_lifo is an invalid size");
  91. BasicXpadState next_state{};
  92. };
  93. } // namespace Service::HID