diff options
Diffstat (limited to '')
| -rw-r--r-- | src/input_common/input_poller.cpp | 64 | ||||
| -rw-r--r-- | src/input_common/input_poller.h | 10 | ||||
| -rw-r--r-- | src/input_common/main.cpp | 21 | ||||
| -rw-r--r-- | src/input_common/main.h | 7 |
4 files changed, 102 insertions, 0 deletions
diff --git a/src/input_common/input_poller.cpp b/src/input_common/input_poller.cpp index ffb9b945e..a8eb1442b 100644 --- a/src/input_common/input_poller.cpp +++ b/src/input_common/input_poller.cpp | |||
| @@ -705,6 +705,47 @@ private: | |||
| 705 | InputEngine* input_engine; | 705 | InputEngine* input_engine; |
| 706 | }; | 706 | }; |
| 707 | 707 | ||
| 708 | class InputFromNfc final : public Common::Input::InputDevice { | ||
| 709 | public: | ||
| 710 | explicit InputFromNfc(PadIdentifier identifier_, InputEngine* input_engine_) | ||
| 711 | : identifier(identifier_), input_engine(input_engine_) { | ||
| 712 | UpdateCallback engine_callback{[this]() { OnChange(); }}; | ||
| 713 | const InputIdentifier input_identifier{ | ||
| 714 | .identifier = identifier, | ||
| 715 | .type = EngineInputType::Nfc, | ||
| 716 | .index = 0, | ||
| 717 | .callback = engine_callback, | ||
| 718 | }; | ||
| 719 | callback_key = input_engine->SetCallback(input_identifier); | ||
| 720 | } | ||
| 721 | |||
| 722 | ~InputFromNfc() override { | ||
| 723 | input_engine->DeleteCallback(callback_key); | ||
| 724 | } | ||
| 725 | |||
| 726 | Common::Input::NfcStatus GetStatus() const { | ||
| 727 | return input_engine->GetNfc(identifier); | ||
| 728 | } | ||
| 729 | |||
| 730 | void ForceUpdate() override { | ||
| 731 | OnChange(); | ||
| 732 | } | ||
| 733 | |||
| 734 | void OnChange() { | ||
| 735 | const Common::Input::CallbackStatus status{ | ||
| 736 | .type = Common::Input::InputType::Nfc, | ||
| 737 | .nfc_status = GetStatus(), | ||
| 738 | }; | ||
| 739 | |||
| 740 | TriggerOnChange(status); | ||
| 741 | } | ||
| 742 | |||
| 743 | private: | ||
| 744 | const PadIdentifier identifier; | ||
| 745 | int callback_key; | ||
| 746 | InputEngine* input_engine; | ||
| 747 | }; | ||
| 748 | |||
| 708 | class OutputFromIdentifier final : public Common::Input::OutputDevice { | 749 | class OutputFromIdentifier final : public Common::Input::OutputDevice { |
| 709 | public: | 750 | public: |
| 710 | explicit OutputFromIdentifier(PadIdentifier identifier_, InputEngine* input_engine_) | 751 | explicit OutputFromIdentifier(PadIdentifier identifier_, InputEngine* input_engine_) |
| @@ -727,6 +768,14 @@ public: | |||
| 727 | return input_engine->SetCameraFormat(identifier, camera_format); | 768 | return input_engine->SetCameraFormat(identifier, camera_format); |
| 728 | } | 769 | } |
| 729 | 770 | ||
| 771 | Common::Input::NfcState SupportsNfc() override { | ||
| 772 | return input_engine->SupportsNfc(identifier); | ||
| 773 | } | ||
| 774 | |||
| 775 | Common::Input::NfcState WriteNfcData(const std::vector<u8>& data) override { | ||
| 776 | return input_engine->WriteNfcData(identifier, data); | ||
| 777 | } | ||
| 778 | |||
| 730 | private: | 779 | private: |
| 731 | const PadIdentifier identifier; | 780 | const PadIdentifier identifier; |
| 732 | InputEngine* input_engine; | 781 | InputEngine* input_engine; |
| @@ -978,6 +1027,18 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateCameraDevice( | |||
| 978 | return std::make_unique<InputFromCamera>(identifier, input_engine.get()); | 1027 | return std::make_unique<InputFromCamera>(identifier, input_engine.get()); |
| 979 | } | 1028 | } |
| 980 | 1029 | ||
| 1030 | std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateNfcDevice( | ||
| 1031 | const Common::ParamPackage& params) { | ||
| 1032 | const PadIdentifier identifier = { | ||
| 1033 | .guid = Common::UUID{params.Get("guid", "")}, | ||
| 1034 | .port = static_cast<std::size_t>(params.Get("port", 0)), | ||
| 1035 | .pad = static_cast<std::size_t>(params.Get("pad", 0)), | ||
| 1036 | }; | ||
| 1037 | |||
| 1038 | input_engine->PreSetController(identifier); | ||
| 1039 | return std::make_unique<InputFromNfc>(identifier, input_engine.get()); | ||
| 1040 | } | ||
| 1041 | |||
| 981 | InputFactory::InputFactory(std::shared_ptr<InputEngine> input_engine_) | 1042 | InputFactory::InputFactory(std::shared_ptr<InputEngine> input_engine_) |
| 982 | : input_engine(std::move(input_engine_)) {} | 1043 | : input_engine(std::move(input_engine_)) {} |
| 983 | 1044 | ||
| @@ -989,6 +1050,9 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::Create( | |||
| 989 | if (params.Has("camera")) { | 1050 | if (params.Has("camera")) { |
| 990 | return CreateCameraDevice(params); | 1051 | return CreateCameraDevice(params); |
| 991 | } | 1052 | } |
| 1053 | if (params.Has("nfc")) { | ||
| 1054 | return CreateNfcDevice(params); | ||
| 1055 | } | ||
| 992 | if (params.Has("button") && params.Has("axis")) { | 1056 | if (params.Has("button") && params.Has("axis")) { |
| 993 | return CreateTriggerDevice(params); | 1057 | return CreateTriggerDevice(params); |
| 994 | } | 1058 | } |
diff --git a/src/input_common/input_poller.h b/src/input_common/input_poller.h index 4410a8415..d7db13ce4 100644 --- a/src/input_common/input_poller.h +++ b/src/input_common/input_poller.h | |||
| @@ -222,6 +222,16 @@ private: | |||
| 222 | std::unique_ptr<Common::Input::InputDevice> CreateCameraDevice( | 222 | std::unique_ptr<Common::Input::InputDevice> CreateCameraDevice( |
| 223 | const Common::ParamPackage& params); | 223 | const Common::ParamPackage& params); |
| 224 | 224 | ||
| 225 | /** | ||
| 226 | * Creates a nfc device from the parameters given. | ||
| 227 | * @param params contains parameters for creating the device: | ||
| 228 | * - "guid": text string for identifying controllers | ||
| 229 | * - "port": port of the connected device | ||
| 230 | * - "pad": slot of the connected controller | ||
| 231 | * @returns a unique input device with the parameters specified | ||
| 232 | */ | ||
| 233 | std::unique_ptr<Common::Input::InputDevice> CreateNfcDevice(const Common::ParamPackage& params); | ||
| 234 | |||
| 225 | std::shared_ptr<InputEngine> input_engine; | 235 | std::shared_ptr<InputEngine> input_engine; |
| 226 | }; | 236 | }; |
| 227 | } // namespace InputCommon | 237 | } // namespace InputCommon |
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp index 75a57b9fc..b2064ef95 100644 --- a/src/input_common/main.cpp +++ b/src/input_common/main.cpp | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include "input_common/drivers/tas_input.h" | 11 | #include "input_common/drivers/tas_input.h" |
| 12 | #include "input_common/drivers/touch_screen.h" | 12 | #include "input_common/drivers/touch_screen.h" |
| 13 | #include "input_common/drivers/udp_client.h" | 13 | #include "input_common/drivers/udp_client.h" |
| 14 | #include "input_common/drivers/virtual_amiibo.h" | ||
| 14 | #include "input_common/helpers/stick_from_buttons.h" | 15 | #include "input_common/helpers/stick_from_buttons.h" |
| 15 | #include "input_common/helpers/touch_from_buttons.h" | 16 | #include "input_common/helpers/touch_from_buttons.h" |
| 16 | #include "input_common/input_engine.h" | 17 | #include "input_common/input_engine.h" |
| @@ -87,6 +88,15 @@ struct InputSubsystem::Impl { | |||
| 87 | Common::Input::RegisterFactory<Common::Input::OutputDevice>(camera->GetEngineName(), | 88 | Common::Input::RegisterFactory<Common::Input::OutputDevice>(camera->GetEngineName(), |
| 88 | camera_output_factory); | 89 | camera_output_factory); |
| 89 | 90 | ||
| 91 | virtual_amiibo = std::make_shared<VirtualAmiibo>("virtual_amiibo"); | ||
| 92 | virtual_amiibo->SetMappingCallback(mapping_callback); | ||
| 93 | virtual_amiibo_input_factory = std::make_shared<InputFactory>(virtual_amiibo); | ||
| 94 | virtual_amiibo_output_factory = std::make_shared<OutputFactory>(virtual_amiibo); | ||
| 95 | Common::Input::RegisterFactory<Common::Input::InputDevice>(virtual_amiibo->GetEngineName(), | ||
| 96 | virtual_amiibo_input_factory); | ||
| 97 | Common::Input::RegisterFactory<Common::Input::OutputDevice>(virtual_amiibo->GetEngineName(), | ||
| 98 | virtual_amiibo_output_factory); | ||
| 99 | |||
| 90 | #ifdef HAVE_SDL2 | 100 | #ifdef HAVE_SDL2 |
| 91 | sdl = std::make_shared<SDLDriver>("sdl"); | 101 | sdl = std::make_shared<SDLDriver>("sdl"); |
| 92 | sdl->SetMappingCallback(mapping_callback); | 102 | sdl->SetMappingCallback(mapping_callback); |
| @@ -327,6 +337,7 @@ struct InputSubsystem::Impl { | |||
| 327 | std::shared_ptr<TasInput::Tas> tas_input; | 337 | std::shared_ptr<TasInput::Tas> tas_input; |
| 328 | std::shared_ptr<CemuhookUDP::UDPClient> udp_client; | 338 | std::shared_ptr<CemuhookUDP::UDPClient> udp_client; |
| 329 | std::shared_ptr<Camera> camera; | 339 | std::shared_ptr<Camera> camera; |
| 340 | std::shared_ptr<VirtualAmiibo> virtual_amiibo; | ||
| 330 | 341 | ||
| 331 | std::shared_ptr<InputFactory> keyboard_factory; | 342 | std::shared_ptr<InputFactory> keyboard_factory; |
| 332 | std::shared_ptr<InputFactory> mouse_factory; | 343 | std::shared_ptr<InputFactory> mouse_factory; |
| @@ -335,6 +346,7 @@ struct InputSubsystem::Impl { | |||
| 335 | std::shared_ptr<InputFactory> udp_client_input_factory; | 346 | std::shared_ptr<InputFactory> udp_client_input_factory; |
| 336 | std::shared_ptr<InputFactory> tas_input_factory; | 347 | std::shared_ptr<InputFactory> tas_input_factory; |
| 337 | std::shared_ptr<InputFactory> camera_input_factory; | 348 | std::shared_ptr<InputFactory> camera_input_factory; |
| 349 | std::shared_ptr<InputFactory> virtual_amiibo_input_factory; | ||
| 338 | 350 | ||
| 339 | std::shared_ptr<OutputFactory> keyboard_output_factory; | 351 | std::shared_ptr<OutputFactory> keyboard_output_factory; |
| 340 | std::shared_ptr<OutputFactory> mouse_output_factory; | 352 | std::shared_ptr<OutputFactory> mouse_output_factory; |
| @@ -342,6 +354,7 @@ struct InputSubsystem::Impl { | |||
| 342 | std::shared_ptr<OutputFactory> udp_client_output_factory; | 354 | std::shared_ptr<OutputFactory> udp_client_output_factory; |
| 343 | std::shared_ptr<OutputFactory> tas_output_factory; | 355 | std::shared_ptr<OutputFactory> tas_output_factory; |
| 344 | std::shared_ptr<OutputFactory> camera_output_factory; | 356 | std::shared_ptr<OutputFactory> camera_output_factory; |
| 357 | std::shared_ptr<OutputFactory> virtual_amiibo_output_factory; | ||
| 345 | 358 | ||
| 346 | #ifdef HAVE_SDL2 | 359 | #ifdef HAVE_SDL2 |
| 347 | std::shared_ptr<SDLDriver> sdl; | 360 | std::shared_ptr<SDLDriver> sdl; |
| @@ -402,6 +415,14 @@ const Camera* InputSubsystem::GetCamera() const { | |||
| 402 | return impl->camera.get(); | 415 | return impl->camera.get(); |
| 403 | } | 416 | } |
| 404 | 417 | ||
| 418 | VirtualAmiibo* InputSubsystem::GetVirtualAmiibo() { | ||
| 419 | return impl->virtual_amiibo.get(); | ||
| 420 | } | ||
| 421 | |||
| 422 | const VirtualAmiibo* InputSubsystem::GetVirtualAmiibo() const { | ||
| 423 | return impl->virtual_amiibo.get(); | ||
| 424 | } | ||
| 425 | |||
| 405 | std::vector<Common::ParamPackage> InputSubsystem::GetInputDevices() const { | 426 | std::vector<Common::ParamPackage> InputSubsystem::GetInputDevices() const { |
| 406 | return impl->GetInputDevices(); | 427 | return impl->GetInputDevices(); |
| 407 | } | 428 | } |
diff --git a/src/input_common/main.h b/src/input_common/main.h index 9a969e747..ced252383 100644 --- a/src/input_common/main.h +++ b/src/input_common/main.h | |||
| @@ -33,6 +33,7 @@ class Camera; | |||
| 33 | class Keyboard; | 33 | class Keyboard; |
| 34 | class Mouse; | 34 | class Mouse; |
| 35 | class TouchScreen; | 35 | class TouchScreen; |
| 36 | class VirtualAmiibo; | ||
| 36 | struct MappingData; | 37 | struct MappingData; |
| 37 | } // namespace InputCommon | 38 | } // namespace InputCommon |
| 38 | 39 | ||
| @@ -101,6 +102,12 @@ public: | |||
| 101 | /// Retrieves the underlying camera input device. | 102 | /// Retrieves the underlying camera input device. |
| 102 | [[nodiscard]] const Camera* GetCamera() const; | 103 | [[nodiscard]] const Camera* GetCamera() const; |
| 103 | 104 | ||
| 105 | /// Retrieves the underlying virtual amiibo input device. | ||
| 106 | [[nodiscard]] VirtualAmiibo* GetVirtualAmiibo(); | ||
| 107 | |||
| 108 | /// Retrieves the underlying virtual amiibo input device. | ||
| 109 | [[nodiscard]] const VirtualAmiibo* GetVirtualAmiibo() const; | ||
| 110 | |||
| 104 | /** | 111 | /** |
| 105 | * Returns all available input devices that this Factory can create a new device with. | 112 | * Returns all available input devices that this Factory can create a new device with. |
| 106 | * Each returned ParamPackage should have a `display` field used for display, a `engine` field | 113 | * Each returned ParamPackage should have a `display` field used for display, a `engine` field |