hid_util.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-3.0-or-later
  3. #pragma once
  4. #include "hid_core/hid_result.h"
  5. #include "hid_core/hid_types.h"
  6. namespace Service::HID {
  7. constexpr bool IsNpadIdValid(const Core::HID::NpadIdType npad_id) {
  8. switch (npad_id) {
  9. case Core::HID::NpadIdType::Player1:
  10. case Core::HID::NpadIdType::Player2:
  11. case Core::HID::NpadIdType::Player3:
  12. case Core::HID::NpadIdType::Player4:
  13. case Core::HID::NpadIdType::Player5:
  14. case Core::HID::NpadIdType::Player6:
  15. case Core::HID::NpadIdType::Player7:
  16. case Core::HID::NpadIdType::Player8:
  17. case Core::HID::NpadIdType::Other:
  18. case Core::HID::NpadIdType::Handheld:
  19. return true;
  20. default:
  21. return false;
  22. }
  23. }
  24. constexpr Result IsSixaxisHandleValid(const Core::HID::SixAxisSensorHandle& handle) {
  25. const auto npad_id = IsNpadIdValid(static_cast<Core::HID::NpadIdType>(handle.npad_id));
  26. const bool device_index = handle.device_index < Core::HID::DeviceIndex::MaxDeviceIndex;
  27. if (!npad_id) {
  28. return ResultInvalidNpadId;
  29. }
  30. if (!device_index) {
  31. return NpadDeviceIndexOutOfRange;
  32. }
  33. return ResultSuccess;
  34. }
  35. constexpr Result IsVibrationHandleValid(const Core::HID::VibrationDeviceHandle& handle) {
  36. switch (handle.npad_type) {
  37. case Core::HID::NpadStyleIndex::Fullkey:
  38. case Core::HID::NpadStyleIndex::Handheld:
  39. case Core::HID::NpadStyleIndex::JoyconDual:
  40. case Core::HID::NpadStyleIndex::JoyconLeft:
  41. case Core::HID::NpadStyleIndex::JoyconRight:
  42. case Core::HID::NpadStyleIndex::GameCube:
  43. case Core::HID::NpadStyleIndex::N64:
  44. case Core::HID::NpadStyleIndex::SystemExt:
  45. case Core::HID::NpadStyleIndex::System:
  46. // These support vibration
  47. break;
  48. default:
  49. return ResultVibrationInvalidStyleIndex;
  50. }
  51. if (!IsNpadIdValid(static_cast<Core::HID::NpadIdType>(handle.npad_id))) {
  52. return ResultVibrationInvalidNpadId;
  53. }
  54. if (handle.device_index >= Core::HID::DeviceIndex::MaxDeviceIndex) {
  55. return ResultVibrationDeviceIndexOutOfRange;
  56. }
  57. return ResultSuccess;
  58. }
  59. /// Converts a Core::HID::NpadIdType to an array index.
  60. constexpr size_t NpadIdTypeToIndex(Core::HID::NpadIdType npad_id_type) {
  61. switch (npad_id_type) {
  62. case Core::HID::NpadIdType::Player1:
  63. return 0;
  64. case Core::HID::NpadIdType::Player2:
  65. return 1;
  66. case Core::HID::NpadIdType::Player3:
  67. return 2;
  68. case Core::HID::NpadIdType::Player4:
  69. return 3;
  70. case Core::HID::NpadIdType::Player5:
  71. return 4;
  72. case Core::HID::NpadIdType::Player6:
  73. return 5;
  74. case Core::HID::NpadIdType::Player7:
  75. return 6;
  76. case Core::HID::NpadIdType::Player8:
  77. return 7;
  78. case Core::HID::NpadIdType::Handheld:
  79. return 8;
  80. case Core::HID::NpadIdType::Other:
  81. return 9;
  82. default:
  83. return 8;
  84. }
  85. }
  86. /// Converts an array index to a Core::HID::NpadIdType
  87. constexpr Core::HID::NpadIdType IndexToNpadIdType(size_t index) {
  88. switch (index) {
  89. case 0:
  90. return Core::HID::NpadIdType::Player1;
  91. case 1:
  92. return Core::HID::NpadIdType::Player2;
  93. case 2:
  94. return Core::HID::NpadIdType::Player3;
  95. case 3:
  96. return Core::HID::NpadIdType::Player4;
  97. case 4:
  98. return Core::HID::NpadIdType::Player5;
  99. case 5:
  100. return Core::HID::NpadIdType::Player6;
  101. case 6:
  102. return Core::HID::NpadIdType::Player7;
  103. case 7:
  104. return Core::HID::NpadIdType::Player8;
  105. case 8:
  106. return Core::HID::NpadIdType::Handheld;
  107. case 9:
  108. return Core::HID::NpadIdType::Other;
  109. default:
  110. return Core::HID::NpadIdType::Invalid;
  111. }
  112. }
  113. constexpr Core::HID::NpadStyleSet GetStylesetByIndex(std::size_t index) {
  114. switch (index) {
  115. case 0:
  116. return Core::HID::NpadStyleSet::Fullkey;
  117. case 1:
  118. return Core::HID::NpadStyleSet::Handheld;
  119. case 2:
  120. return Core::HID::NpadStyleSet::JoyDual;
  121. case 3:
  122. return Core::HID::NpadStyleSet::JoyLeft;
  123. case 4:
  124. return Core::HID::NpadStyleSet::JoyRight;
  125. case 5:
  126. return Core::HID::NpadStyleSet::Palma;
  127. default:
  128. return Core::HID::NpadStyleSet::None;
  129. }
  130. }
  131. } // namespace Service::HID