joycon.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <span>
  6. #include <thread>
  7. #include <SDL_hidapi.h>
  8. #include "input_common/input_engine.h"
  9. namespace InputCommon::Joycon {
  10. using SerialNumber = std::array<u8, 15>;
  11. struct Battery;
  12. struct Color;
  13. struct MotionData;
  14. struct TagInfo;
  15. enum class ControllerType : u8;
  16. enum class DriverResult;
  17. enum class IrsResolution;
  18. class JoyconDriver;
  19. } // namespace InputCommon::Joycon
  20. namespace InputCommon {
  21. class Joycons final : public InputCommon::InputEngine {
  22. public:
  23. explicit Joycons(const std::string& input_engine_);
  24. ~Joycons();
  25. bool IsVibrationEnabled(const PadIdentifier& identifier) override;
  26. Common::Input::DriverResult SetVibration(
  27. const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override;
  28. Common::Input::DriverResult SetLeds(const PadIdentifier& identifier,
  29. const Common::Input::LedStatus& led_status) override;
  30. Common::Input::DriverResult SetCameraFormat(const PadIdentifier& identifier,
  31. Common::Input::CameraFormat camera_format) override;
  32. Common::Input::NfcState SupportsNfc(const PadIdentifier& identifier) const override;
  33. Common::Input::NfcState StartNfcPolling(const PadIdentifier& identifier) override;
  34. Common::Input::NfcState StopNfcPolling(const PadIdentifier& identifier) override;
  35. Common::Input::NfcState ReadAmiiboData(const PadIdentifier& identifier,
  36. std::vector<u8>& out_data) override;
  37. Common::Input::NfcState WriteNfcData(const PadIdentifier& identifier,
  38. const std::vector<u8>& data) override;
  39. Common::Input::NfcState ReadMifareData(const PadIdentifier& identifier,
  40. const Common::Input::MifareRequest& request,
  41. Common::Input::MifareRequest& out_data) override;
  42. Common::Input::NfcState WriteMifareData(const PadIdentifier& identifier,
  43. const Common::Input::MifareRequest& request) override;
  44. Common::Input::DriverResult SetPollingMode(
  45. const PadIdentifier& identifier, const Common::Input::PollingMode polling_mode) override;
  46. /// Used for automapping features
  47. std::vector<Common::ParamPackage> GetInputDevices() const override;
  48. ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) override;
  49. AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override;
  50. MotionMapping GetMotionMappingForDevice(const Common::ParamPackage& params) override;
  51. Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override;
  52. private:
  53. static constexpr std::size_t MaxSupportedControllers = 8;
  54. /// For shutting down, clear all data, join all threads, release usb devices
  55. void Reset();
  56. /// Registers controllers, clears all data and starts the scan thread
  57. void Setup();
  58. /// Actively searches for new devices
  59. void ScanThread(std::stop_token stop_token);
  60. /// Returns true if device is valid and not registered
  61. bool IsDeviceNew(SDL_hid_device_info* device_info) const;
  62. /// Tries to connect to the new device
  63. void RegisterNewDevice(SDL_hid_device_info* device_info);
  64. /// Returns the next free handle
  65. std::shared_ptr<Joycon::JoyconDriver> GetNextFreeHandle(Joycon::ControllerType type) const;
  66. void OnBatteryUpdate(std::size_t port, Joycon::ControllerType type, Joycon::Battery value);
  67. void OnColorUpdate(std::size_t port, Joycon::ControllerType type, const Joycon::Color& value);
  68. void OnButtonUpdate(std::size_t port, Joycon::ControllerType type, int id, bool value);
  69. void OnStickUpdate(std::size_t port, Joycon::ControllerType type, int id, f32 value);
  70. void OnMotionUpdate(std::size_t port, Joycon::ControllerType type, int id,
  71. const Joycon::MotionData& value);
  72. void OnRingConUpdate(f32 ring_data);
  73. void OnAmiiboUpdate(std::size_t port, Joycon::ControllerType type,
  74. const Joycon::TagInfo& amiibo_data);
  75. void OnCameraUpdate(std::size_t port, const std::vector<u8>& camera_data,
  76. Joycon::IrsResolution format);
  77. /// Returns a JoyconHandle corresponding to a PadIdentifier
  78. std::shared_ptr<Joycon::JoyconDriver> GetHandle(PadIdentifier identifier) const;
  79. /// Returns a PadIdentifier corresponding to the port number and joycon type
  80. PadIdentifier GetIdentifier(std::size_t port, Joycon::ControllerType type) const;
  81. /// Returns a ParamPackage corresponding to the port number and joycon type
  82. Common::ParamPackage GetParamPackage(std::size_t port, Joycon::ControllerType type) const;
  83. std::string JoyconName(std::size_t port) const;
  84. Common::Input::ButtonNames GetUIButtonName(const Common::ParamPackage& params) const;
  85. /// Returns the name of the device in text format
  86. std::string JoyconName(Joycon::ControllerType type) const;
  87. Common::Input::NfcState TranslateDriverResult(Joycon::DriverResult result) const;
  88. std::jthread scan_thread;
  89. // Joycon types are split by type to ease supporting dualjoycon configurations
  90. std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> left_joycons{};
  91. std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> right_joycons{};
  92. std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> pro_controller{};
  93. };
  94. } // namespace InputCommon