summaryrefslogtreecommitdiff
path: root/src/input_common/input_poller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/input_poller.cpp')
-rw-r--r--src/input_common/input_poller.cpp135
1 files changed, 115 insertions, 20 deletions
diff --git a/src/input_common/input_poller.cpp b/src/input_common/input_poller.cpp
index fb8be42e2..870e76ab0 100644
--- a/src/input_common/input_poller.cpp
+++ b/src/input_common/input_poller.cpp
@@ -16,10 +16,10 @@ public:
16 16
17class InputFromButton final : public Common::Input::InputDevice { 17class InputFromButton final : public Common::Input::InputDevice {
18public: 18public:
19 explicit InputFromButton(PadIdentifier identifier_, int button_, bool toggle_, bool inverted_, 19 explicit InputFromButton(PadIdentifier identifier_, int button_, bool turbo_, bool toggle_,
20 InputEngine* input_engine_) 20 bool inverted_, InputEngine* input_engine_)
21 : identifier(identifier_), button(button_), toggle(toggle_), inverted(inverted_), 21 : identifier(identifier_), button(button_), turbo(turbo_), toggle(toggle_),
22 input_engine(input_engine_) { 22 inverted(inverted_), input_engine(input_engine_) {
23 UpdateCallback engine_callback{[this]() { OnChange(); }}; 23 UpdateCallback engine_callback{[this]() { OnChange(); }};
24 const InputIdentifier input_identifier{ 24 const InputIdentifier input_identifier{
25 .identifier = identifier, 25 .identifier = identifier,
@@ -40,6 +40,7 @@ public:
40 .value = input_engine->GetButton(identifier, button), 40 .value = input_engine->GetButton(identifier, button),
41 .inverted = inverted, 41 .inverted = inverted,
42 .toggle = toggle, 42 .toggle = toggle,
43 .turbo = turbo,
43 }; 44 };
44 } 45 }
45 46
@@ -68,6 +69,7 @@ public:
68private: 69private:
69 const PadIdentifier identifier; 70 const PadIdentifier identifier;
70 const int button; 71 const int button;
72 const bool turbo;
71 const bool toggle; 73 const bool toggle;
72 const bool inverted; 74 const bool inverted;
73 int callback_key; 75 int callback_key;
@@ -77,10 +79,10 @@ private:
77 79
78class InputFromHatButton final : public Common::Input::InputDevice { 80class InputFromHatButton final : public Common::Input::InputDevice {
79public: 81public:
80 explicit InputFromHatButton(PadIdentifier identifier_, int button_, u8 direction_, bool toggle_, 82 explicit InputFromHatButton(PadIdentifier identifier_, int button_, u8 direction_, bool turbo_,
81 bool inverted_, InputEngine* input_engine_) 83 bool toggle_, bool inverted_, InputEngine* input_engine_)
82 : identifier(identifier_), button(button_), direction(direction_), toggle(toggle_), 84 : identifier(identifier_), button(button_), direction(direction_), turbo(turbo_),
83 inverted(inverted_), input_engine(input_engine_) { 85 toggle(toggle_), inverted(inverted_), input_engine(input_engine_) {
84 UpdateCallback engine_callback{[this]() { OnChange(); }}; 86 UpdateCallback engine_callback{[this]() { OnChange(); }};
85 const InputIdentifier input_identifier{ 87 const InputIdentifier input_identifier{
86 .identifier = identifier, 88 .identifier = identifier,
@@ -101,6 +103,7 @@ public:
101 .value = input_engine->GetHatButton(identifier, button, direction), 103 .value = input_engine->GetHatButton(identifier, button, direction),
102 .inverted = inverted, 104 .inverted = inverted,
103 .toggle = toggle, 105 .toggle = toggle,
106 .turbo = turbo,
104 }; 107 };
105 } 108 }
106 109
@@ -130,6 +133,7 @@ private:
130 const PadIdentifier identifier; 133 const PadIdentifier identifier;
131 const int button; 134 const int button;
132 const u8 direction; 135 const u8 direction;
136 const bool turbo;
133 const bool toggle; 137 const bool toggle;
134 const bool inverted; 138 const bool inverted;
135 int callback_key; 139 int callback_key;
@@ -498,6 +502,58 @@ private:
498 InputEngine* input_engine; 502 InputEngine* input_engine;
499}; 503};
500 504
505class InputFromColor final : public Common::Input::InputDevice {
506public:
507 explicit InputFromColor(PadIdentifier identifier_, InputEngine* input_engine_)
508 : identifier(identifier_), input_engine(input_engine_) {
509 UpdateCallback engine_callback{[this]() { OnChange(); }};
510 const InputIdentifier input_identifier{
511 .identifier = identifier,
512 .type = EngineInputType::Color,
513 .index = 0,
514 .callback = engine_callback,
515 };
516 last_color_value = {};
517 callback_key = input_engine->SetCallback(input_identifier);
518 }
519
520 ~InputFromColor() override {
521 input_engine->DeleteCallback(callback_key);
522 }
523
524 Common::Input::BodyColorStatus GetStatus() const {
525 return input_engine->GetColor(identifier);
526 }
527
528 void ForceUpdate() override {
529 const Common::Input::CallbackStatus status{
530 .type = Common::Input::InputType::Color,
531 .color_status = GetStatus(),
532 };
533
534 last_color_value = status.color_status;
535 TriggerOnChange(status);
536 }
537
538 void OnChange() {
539 const Common::Input::CallbackStatus status{
540 .type = Common::Input::InputType::Color,
541 .color_status = GetStatus(),
542 };
543
544 if (status.color_status.body != last_color_value.body) {
545 last_color_value = status.color_status;
546 TriggerOnChange(status);
547 }
548 }
549
550private:
551 const PadIdentifier identifier;
552 int callback_key;
553 Common::Input::BodyColorStatus last_color_value;
554 InputEngine* input_engine;
555};
556
501class InputFromMotion final : public Common::Input::InputDevice { 557class InputFromMotion final : public Common::Input::InputDevice {
502public: 558public:
503 explicit InputFromMotion(PadIdentifier identifier_, int motion_sensor_, float gyro_threshold_, 559 explicit InputFromMotion(PadIdentifier identifier_, int motion_sensor_, float gyro_threshold_,
@@ -611,7 +667,7 @@ public:
611 .raw_value = input_engine->GetAxis(identifier, axis_z), 667 .raw_value = input_engine->GetAxis(identifier, axis_z),
612 .properties = properties_z, 668 .properties = properties_z,
613 }; 669 };
614 status.delta_timestamp = 5000; 670 status.delta_timestamp = 1000;
615 status.force_update = true; 671 status.force_update = true;
616 return status; 672 return status;
617 } 673 }
@@ -736,8 +792,7 @@ public:
736 792
737 const Common::Input::CallbackStatus status{ 793 const Common::Input::CallbackStatus status{
738 .type = Common::Input::InputType::Nfc, 794 .type = Common::Input::InputType::Nfc,
739 .nfc_status = nfc_status.state, 795 .nfc_status = nfc_status,
740 .raw_data = nfc_status.data,
741 }; 796 };
742 797
743 TriggerOnChange(status); 798 TriggerOnChange(status);
@@ -754,11 +809,11 @@ public:
754 explicit OutputFromIdentifier(PadIdentifier identifier_, InputEngine* input_engine_) 809 explicit OutputFromIdentifier(PadIdentifier identifier_, InputEngine* input_engine_)
755 : identifier(identifier_), input_engine(input_engine_) {} 810 : identifier(identifier_), input_engine(input_engine_) {}
756 811
757 void SetLED(const Common::Input::LedStatus& led_status) override { 812 Common::Input::DriverResult SetLED(const Common::Input::LedStatus& led_status) override {
758 input_engine->SetLeds(identifier, led_status); 813 return input_engine->SetLeds(identifier, led_status);
759 } 814 }
760 815
761 Common::Input::VibrationError SetVibration( 816 Common::Input::DriverResult SetVibration(
762 const Common::Input::VibrationStatus& vibration_status) override { 817 const Common::Input::VibrationStatus& vibration_status) override {
763 return input_engine->SetVibration(identifier, vibration_status); 818 return input_engine->SetVibration(identifier, vibration_status);
764 } 819 }
@@ -767,11 +822,12 @@ public:
767 return input_engine->IsVibrationEnabled(identifier); 822 return input_engine->IsVibrationEnabled(identifier);
768 } 823 }
769 824
770 Common::Input::PollingError SetPollingMode(Common::Input::PollingMode polling_mode) override { 825 Common::Input::DriverResult SetPollingMode(Common::Input::PollingMode polling_mode) override {
771 return input_engine->SetPollingMode(identifier, polling_mode); 826 return input_engine->SetPollingMode(identifier, polling_mode);
772 } 827 }
773 828
774 Common::Input::CameraError SetCameraFormat(Common::Input::CameraFormat camera_format) override { 829 Common::Input::DriverResult SetCameraFormat(
830 Common::Input::CameraFormat camera_format) override {
775 return input_engine->SetCameraFormat(identifier, camera_format); 831 return input_engine->SetCameraFormat(identifier, camera_format);
776 } 832 }
777 833
@@ -779,10 +835,31 @@ public:
779 return input_engine->SupportsNfc(identifier); 835 return input_engine->SupportsNfc(identifier);
780 } 836 }
781 837
838 Common::Input::NfcState StartNfcPolling() {
839 return input_engine->StartNfcPolling(identifier);
840 }
841
842 Common::Input::NfcState StopNfcPolling() {
843 return input_engine->StopNfcPolling(identifier);
844 }
845
846 Common::Input::NfcState ReadAmiiboData(std::vector<u8>& out_data) {
847 return input_engine->ReadAmiiboData(identifier, out_data);
848 }
849
782 Common::Input::NfcState WriteNfcData(const std::vector<u8>& data) override { 850 Common::Input::NfcState WriteNfcData(const std::vector<u8>& data) override {
783 return input_engine->WriteNfcData(identifier, data); 851 return input_engine->WriteNfcData(identifier, data);
784 } 852 }
785 853
854 Common::Input::NfcState ReadMifareData(const Common::Input::MifareRequest& request,
855 Common::Input::MifareRequest& out_data) {
856 return input_engine->ReadMifareData(identifier, request, out_data);
857 }
858
859 Common::Input::NfcState WriteMifareData(const Common::Input::MifareRequest& request) {
860 return input_engine->WriteMifareData(identifier, request);
861 }
862
786private: 863private:
787 const PadIdentifier identifier; 864 const PadIdentifier identifier;
788 InputEngine* input_engine; 865 InputEngine* input_engine;
@@ -800,14 +877,15 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateButtonDevice(
800 const auto keyboard_key = params.Get("code", 0); 877 const auto keyboard_key = params.Get("code", 0);
801 const auto toggle = params.Get("toggle", false) != 0; 878 const auto toggle = params.Get("toggle", false) != 0;
802 const auto inverted = params.Get("inverted", false) != 0; 879 const auto inverted = params.Get("inverted", false) != 0;
880 const auto turbo = params.Get("turbo", false) != 0;
803 input_engine->PreSetController(identifier); 881 input_engine->PreSetController(identifier);
804 input_engine->PreSetButton(identifier, button_id); 882 input_engine->PreSetButton(identifier, button_id);
805 input_engine->PreSetButton(identifier, keyboard_key); 883 input_engine->PreSetButton(identifier, keyboard_key);
806 if (keyboard_key != 0) { 884 if (keyboard_key != 0) {
807 return std::make_unique<InputFromButton>(identifier, keyboard_key, toggle, inverted, 885 return std::make_unique<InputFromButton>(identifier, keyboard_key, turbo, toggle, inverted,
808 input_engine.get()); 886 input_engine.get());
809 } 887 }
810 return std::make_unique<InputFromButton>(identifier, button_id, toggle, inverted, 888 return std::make_unique<InputFromButton>(identifier, button_id, turbo, toggle, inverted,
811 input_engine.get()); 889 input_engine.get());
812} 890}
813 891
@@ -823,11 +901,12 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateHatButtonDevice(
823 const auto direction = input_engine->GetHatButtonId(params.Get("direction", "")); 901 const auto direction = input_engine->GetHatButtonId(params.Get("direction", ""));
824 const auto toggle = params.Get("toggle", false) != 0; 902 const auto toggle = params.Get("toggle", false) != 0;
825 const auto inverted = params.Get("inverted", false) != 0; 903 const auto inverted = params.Get("inverted", false) != 0;
904 const auto turbo = params.Get("turbo", false) != 0;
826 905
827 input_engine->PreSetController(identifier); 906 input_engine->PreSetController(identifier);
828 input_engine->PreSetHatButton(identifier, button_id); 907 input_engine->PreSetHatButton(identifier, button_id);
829 return std::make_unique<InputFromHatButton>(identifier, button_id, direction, toggle, inverted, 908 return std::make_unique<InputFromHatButton>(identifier, button_id, direction, turbo, toggle,
830 input_engine.get()); 909 inverted, input_engine.get());
831} 910}
832 911
833std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateStickDevice( 912std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateStickDevice(
@@ -880,6 +959,7 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateAnalogDevice(
880 .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f), 959 .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f),
881 .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f), 960 .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f),
882 .inverted = params.Get("invert", "+") == "-", 961 .inverted = params.Get("invert", "+") == "-",
962 .inverted_button = params.Get("inverted", false) != 0,
883 .toggle = params.Get("toggle", false) != 0, 963 .toggle = params.Get("toggle", false) != 0,
884 }; 964 };
885 input_engine->PreSetController(identifier); 965 input_engine->PreSetController(identifier);
@@ -966,6 +1046,18 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateBatteryDevice(
966 return std::make_unique<InputFromBattery>(identifier, input_engine.get()); 1046 return std::make_unique<InputFromBattery>(identifier, input_engine.get());
967} 1047}
968 1048
1049std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateColorDevice(
1050 const Common::ParamPackage& params) {
1051 const PadIdentifier identifier = {
1052 .guid = Common::UUID{params.Get("guid", "")},
1053 .port = static_cast<std::size_t>(params.Get("port", 0)),
1054 .pad = static_cast<std::size_t>(params.Get("pad", 0)),
1055 };
1056
1057 input_engine->PreSetController(identifier);
1058 return std::make_unique<InputFromColor>(identifier, input_engine.get());
1059}
1060
969std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateMotionDevice( 1061std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateMotionDevice(
970 Common::ParamPackage params) { 1062 Common::ParamPackage params) {
971 const PadIdentifier identifier = { 1063 const PadIdentifier identifier = {
@@ -1053,6 +1145,9 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::Create(
1053 if (params.Has("battery")) { 1145 if (params.Has("battery")) {
1054 return CreateBatteryDevice(params); 1146 return CreateBatteryDevice(params);
1055 } 1147 }
1148 if (params.Has("color")) {
1149 return CreateColorDevice(params);
1150 }
1056 if (params.Has("camera")) { 1151 if (params.Has("camera")) {
1057 return CreateCameraDevice(params); 1152 return CreateCameraDevice(params);
1058 } 1153 }