summaryrefslogtreecommitdiff
path: root/src/core/hid/input_interpreter.cpp
diff options
context:
space:
mode:
authorGravatar Fernando S2021-11-27 11:52:08 +0100
committerGravatar GitHub2021-11-27 11:52:08 +0100
commit564f10527745f870621c08bbb5d16badee0ed861 (patch)
treee8ac8dee60086facf1837393882865f5df18c95e /src/core/hid/input_interpreter.cpp
parentMerge pull request #7431 from liushuyu/fix-linux-decoding (diff)
parentconfig: Remove vibration configuration (diff)
downloadyuzu-564f10527745f870621c08bbb5d16badee0ed861.tar.gz
yuzu-564f10527745f870621c08bbb5d16badee0ed861.tar.xz
yuzu-564f10527745f870621c08bbb5d16badee0ed861.zip
Merge pull request #7255 from german77/kraken
Project Kraken: Input rewrite
Diffstat (limited to 'src/core/hid/input_interpreter.cpp')
-rw-r--r--src/core/hid/input_interpreter.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/core/hid/input_interpreter.cpp b/src/core/hid/input_interpreter.cpp
new file mode 100644
index 000000000..870422d82
--- /dev/null
+++ b/src/core/hid/input_interpreter.cpp
@@ -0,0 +1,61 @@
1// Copyright 2020 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "core/core.h"
6#include "core/hid/hid_types.h"
7#include "core/hid/input_interpreter.h"
8#include "core/hle/service/hid/controllers/npad.h"
9#include "core/hle/service/hid/hid.h"
10#include "core/hle/service/sm/sm.h"
11
12InputInterpreter::InputInterpreter(Core::System& system)
13 : npad{system.ServiceManager()
14 .GetService<Service::HID::Hid>("hid")
15 ->GetAppletResource()
16 ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad)} {
17 ResetButtonStates();
18}
19
20InputInterpreter::~InputInterpreter() = default;
21
22void InputInterpreter::PollInput() {
23 const u64 button_state = npad.GetAndResetPressState();
24
25 previous_index = current_index;
26 current_index = (current_index + 1) % button_states.size();
27
28 button_states[current_index] = button_state;
29}
30
31void InputInterpreter::ResetButtonStates() {
32 previous_index = 0;
33 current_index = 0;
34
35 button_states[0] = 0xFFFFFFFFFFFFFFFF;
36
37 for (std::size_t i = 1; i < button_states.size(); ++i) {
38 button_states[i] = 0;
39 }
40}
41
42bool InputInterpreter::IsButtonPressed(Core::HID::NpadButton button) const {
43 return (button_states[current_index] & static_cast<u64>(button)) != 0;
44}
45
46bool InputInterpreter::IsButtonPressedOnce(Core::HID::NpadButton button) const {
47 const bool current_press = (button_states[current_index] & static_cast<u64>(button)) != 0;
48 const bool previous_press = (button_states[previous_index] & static_cast<u64>(button)) != 0;
49
50 return current_press && !previous_press;
51}
52
53bool InputInterpreter::IsButtonHeld(Core::HID::NpadButton button) const {
54 u64 held_buttons{button_states[0]};
55
56 for (std::size_t i = 1; i < button_states.size(); ++i) {
57 held_buttons &= button_states[i];
58 }
59
60 return (held_buttons & static_cast<u64>(button)) != 0;
61}