summaryrefslogtreecommitdiffstats
path: root/src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp
diff options
context:
space:
mode:
authorViktor Szépe <viktor@szepe.net>2024-01-16 01:09:00 +0100
committerViktor Szépe <viktor@szepe.net>2024-01-16 01:09:00 +0100
commit90ab89a0b0174f8df559b79dc06a03479d959f93 (patch)
tree3d11a790e44945e309f0e68f5332b33b42e72bbb /src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp
parentFix typos in arrays.xml (diff)
parentMerge pull request #12681 from t895/stick-toggles (diff)
downloadyuzu-90ab89a0b0174f8df559b79dc06a03479d959f93.tar
yuzu-90ab89a0b0174f8df559b79dc06a03479d959f93.tar.gz
yuzu-90ab89a0b0174f8df559b79dc06a03479d959f93.tar.bz2
yuzu-90ab89a0b0174f8df559b79dc06a03479d959f93.tar.lz
yuzu-90ab89a0b0174f8df559b79dc06a03479d959f93.tar.xz
yuzu-90ab89a0b0174f8df559b79dc06a03479d959f93.tar.zst
yuzu-90ab89a0b0174f8df559b79dc06a03479d959f93.zip
Diffstat (limited to 'src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp')
-rw-r--r--src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp
new file mode 100644
index 000000000..0b2bfe88d
--- /dev/null
+++ b/src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp
@@ -0,0 +1,123 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "core/core_timing.h"
+#include "hid_core/hid_result.h"
+#include "hid_core/hid_util.h"
+#include "hid_core/resources/abstracted_pad/abstract_led_handler.h"
+#include "hid_core/resources/abstracted_pad/abstract_pad_holder.h"
+#include "hid_core/resources/abstracted_pad/abstract_properties_handler.h"
+#include "hid_core/resources/applet_resource.h"
+#include "hid_core/resources/npad/npad_types.h"
+
+namespace Service::HID {
+
+NpadAbstractLedHandler::NpadAbstractLedHandler() {}
+
+NpadAbstractLedHandler::~NpadAbstractLedHandler() = default;
+
+void NpadAbstractLedHandler::SetAbstractPadHolder(NpadAbstractedPadHolder* holder) {
+ abstract_pad_holder = holder;
+}
+
+void NpadAbstractLedHandler::SetAppletResource(AppletResourceHolder* applet_resource) {
+ applet_resource_holder = applet_resource;
+}
+
+void NpadAbstractLedHandler::SetPropertiesHandler(NpadAbstractPropertiesHandler* handler) {
+ properties_handler = handler;
+}
+
+Result NpadAbstractLedHandler::IncrementRefCounter() {
+ if (ref_counter == std::numeric_limits<s32>::max() - 1) {
+ return ResultNpadHandlerOverflow;
+ }
+ ref_counter++;
+ return ResultSuccess;
+}
+
+Result NpadAbstractLedHandler::DecrementRefCounter() {
+ if (ref_counter == 0) {
+ return ResultNpadHandlerNotInitialized;
+ }
+ ref_counter--;
+ return ResultSuccess;
+}
+
+void NpadAbstractLedHandler::SetNpadLedHandlerLedPattern() {
+ const auto npad_id = properties_handler->GetNpadId();
+
+ switch (npad_id) {
+ case Core::HID::NpadIdType::Player1:
+ left_pattern = Core::HID::LedPattern{1, 0, 0, 0};
+ break;
+ case Core::HID::NpadIdType::Player2:
+ left_pattern = Core::HID::LedPattern{1, 1, 0, 0};
+ break;
+ case Core::HID::NpadIdType::Player3:
+ left_pattern = Core::HID::LedPattern{1, 1, 1, 0};
+ break;
+ case Core::HID::NpadIdType::Player4:
+ left_pattern = Core::HID::LedPattern{1, 1, 1, 1};
+ break;
+ case Core::HID::NpadIdType::Player5:
+ left_pattern = Core::HID::LedPattern{1, 0, 0, 1};
+ break;
+ case Core::HID::NpadIdType::Player6:
+ left_pattern = Core::HID::LedPattern{1, 0, 1, 0};
+ break;
+ case Core::HID::NpadIdType::Player7:
+ left_pattern = Core::HID::LedPattern{1, 0, 1, 1};
+ break;
+ case Core::HID::NpadIdType::Player8:
+ left_pattern = Core::HID::LedPattern{0, 1, 1, 0};
+ break;
+ case Core::HID::NpadIdType::Other:
+ case Core::HID::NpadIdType::Handheld:
+ left_pattern = Core::HID::LedPattern{0, 0, 0, 0};
+ break;
+ default:
+ ASSERT_MSG(false, "Invalid npad id type");
+ break;
+ }
+
+ switch (npad_id) {
+ case Core::HID::NpadIdType::Player1:
+ right_pattern = Core::HID::LedPattern{0, 0, 0, 1};
+ break;
+ case Core::HID::NpadIdType::Player2:
+ right_pattern = Core::HID::LedPattern{0, 1, 1, 1};
+ break;
+ case Core::HID::NpadIdType::Player3:
+ right_pattern = Core::HID::LedPattern{0, 1, 1, 1};
+ break;
+ case Core::HID::NpadIdType::Player4:
+ right_pattern = Core::HID::LedPattern{1, 1, 1, 1};
+ break;
+ case Core::HID::NpadIdType::Player5:
+ right_pattern = Core::HID::LedPattern{1, 0, 0, 1};
+ break;
+ case Core::HID::NpadIdType::Player6:
+ right_pattern = Core::HID::LedPattern{0, 1, 0, 1};
+ break;
+ case Core::HID::NpadIdType::Player7:
+ right_pattern = Core::HID::LedPattern{1, 1, 0, 1};
+ break;
+ case Core::HID::NpadIdType::Player8:
+ right_pattern = Core::HID::LedPattern{0, 1, 1, 0};
+ break;
+ case Core::HID::NpadIdType::Other:
+ case Core::HID::NpadIdType::Handheld:
+ right_pattern = Core::HID::LedPattern{0, 0, 0, 0};
+ break;
+ default:
+ ASSERT_MSG(false, "Invalid npad id type");
+ break;
+ }
+}
+
+void NpadAbstractLedHandler::SetLedBlinkingDevice(Core::HID::LedPattern pattern) {
+ led_blinking = pattern;
+}
+
+} // namespace Service::HID