| |
| |
|
|
| #pragma once |
|
|
| #include <array> |
| #include <span> |
| #include <thread> |
| #include <SDL_hidapi.h> |
|
|
| #include "input_common/input_engine.h" |
|
|
| namespace InputCommon::Joycon { |
| using SerialNumber = std::array<u8, 15>; |
| struct Battery; |
| struct Color; |
| struct MotionData; |
| struct TagInfo; |
| enum class ControllerType : u8; |
| enum class IrsResolution; |
| class JoyconDriver; |
| } |
|
|
| namespace InputCommon { |
|
|
| class Joycons final : public InputCommon::InputEngine { |
| public: |
| explicit Joycons(const std::string& input_engine_); |
|
|
| ~Joycons(); |
|
|
| bool IsVibrationEnabled(const PadIdentifier& identifier) override; |
| Common::Input::DriverResult SetVibration( |
| const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; |
|
|
| Common::Input::DriverResult SetLeds(const PadIdentifier& identifier, |
| const Common::Input::LedStatus& led_status) override; |
|
|
| Common::Input::DriverResult SetCameraFormat(const PadIdentifier& identifier, |
| Common::Input::CameraFormat camera_format) override; |
|
|
| Common::Input::NfcState SupportsNfc(const PadIdentifier& identifier) const override; |
| Common::Input::NfcState StartNfcPolling(const PadIdentifier& identifier) override; |
| Common::Input::NfcState StopNfcPolling(const PadIdentifier& identifier) override; |
| Common::Input::NfcState ReadAmiiboData(const PadIdentifier& identifier, |
| std::vector<u8>& out_data) override; |
| Common::Input::NfcState WriteNfcData(const PadIdentifier& identifier, |
| const std::vector<u8>& data) override; |
| Common::Input::NfcState ReadMifareData(const PadIdentifier& identifier, |
| const Common::Input::MifareRequest& request, |
| Common::Input::MifareRequest& out_data) override; |
| Common::Input::NfcState WriteMifareData(const PadIdentifier& identifier, |
| const Common::Input::MifareRequest& request) override; |
|
|
| Common::Input::DriverResult SetPollingMode( |
| const PadIdentifier& identifier, const Common::Input::PollingMode polling_mode) override; |
|
|
| |
| std::vector<Common::ParamPackage> GetInputDevices() const override; |
| ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) override; |
| AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override; |
| MotionMapping GetMotionMappingForDevice(const Common::ParamPackage& params) override; |
| Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override; |
|
|
| private: |
| static constexpr std::size_t MaxSupportedControllers = 8; |
|
|
| |
| void Reset(); |
|
|
| |
| void Setup(); |
|
|
| |
| void ScanThread(std::stop_token stop_token); |
|
|
| |
| bool IsDeviceNew(SDL_hid_device_info* device_info) const; |
|
|
| |
| void RegisterNewDevice(SDL_hid_device_info* device_info); |
|
|
| |
| std::shared_ptr<Joycon::JoyconDriver> GetNextFreeHandle(Joycon::ControllerType type) const; |
|
|
| void OnBatteryUpdate(std::size_t port, Joycon::ControllerType type, Joycon::Battery value); |
| void OnColorUpdate(std::size_t port, Joycon::ControllerType type, const Joycon::Color& value); |
| void OnButtonUpdate(std::size_t port, Joycon::ControllerType type, int id, bool value); |
| void OnStickUpdate(std::size_t port, Joycon::ControllerType type, int id, f32 value); |
| void OnMotionUpdate(std::size_t port, Joycon::ControllerType type, int id, |
| const Joycon::MotionData& value); |
| void OnRingConUpdate(f32 ring_data); |
| void OnAmiiboUpdate(std::size_t port, Joycon::ControllerType type, |
| const Joycon::TagInfo& amiibo_data); |
| void OnCameraUpdate(std::size_t port, const std::vector<u8>& camera_data, |
| Joycon::IrsResolution format); |
|
|
| |
| std::shared_ptr<Joycon::JoyconDriver> GetHandle(PadIdentifier identifier) const; |
|
|
| |
| PadIdentifier GetIdentifier(std::size_t port, Joycon::ControllerType type) const; |
|
|
| |
| Common::ParamPackage GetParamPackage(std::size_t port, Joycon::ControllerType type) const; |
|
|
| std::string JoyconName(std::size_t port) const; |
|
|
| Common::Input::ButtonNames GetUIButtonName(const Common::ParamPackage& params) const; |
|
|
| |
| std::string JoyconName(Joycon::ControllerType type) const; |
|
|
| Common::Input::NfcState TranslateDriverResult(Common::Input::DriverResult result) const; |
|
|
| std::jthread scan_thread; |
|
|
| |
| std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> left_joycons{}; |
| std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> right_joycons{}; |
| std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> pro_controller{}; |
| }; |
|
|
| } |
|
|