summaryrefslogtreecommitdiff
path: root/src/core/hid/input_interpreter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hid/input_interpreter.h')
-rw-r--r--src/core/hid/input_interpreter.h144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/core/hid/input_interpreter.h b/src/core/hid/input_interpreter.h
new file mode 100644
index 000000000..9495e3daf
--- /dev/null
+++ b/src/core/hid/input_interpreter.h
@@ -0,0 +1,144 @@
1// Copyright 2020 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <array>
8
9#include "common/common_types.h"
10
11namespace Core {
12class System;
13}
14
15namespace Service::HID {
16class Controller_NPad;
17}
18
19enum class HIDButton : u8 {
20 A,
21 B,
22 X,
23 Y,
24 LStick,
25 RStick,
26 L,
27 R,
28 ZL,
29 ZR,
30 Plus,
31 Minus,
32
33 DLeft,
34 DUp,
35 DRight,
36 DDown,
37
38 LStickLeft,
39 LStickUp,
40 LStickRight,
41 LStickDown,
42
43 RStickLeft,
44 RStickUp,
45 RStickRight,
46 RStickDown,
47
48 LeftSL,
49 LeftSR,
50
51 RightSL,
52 RightSR,
53};
54
55/**
56 * The InputInterpreter class interfaces with HID to retrieve button press states.
57 * Input is intended to be polled every 50ms so that a button is considered to be
58 * held down after 400ms has elapsed since the initial button press and subsequent
59 * repeated presses occur every 50ms.
60 */
61class InputInterpreter {
62public:
63 explicit InputInterpreter(Core::System& system);
64 virtual ~InputInterpreter();
65
66 /// Gets a button state from HID and inserts it into the array of button states.
67 void PollInput();
68
69 /// Resets all the button states to their defaults.
70 void ResetButtonStates();
71
72 /**
73 * Checks whether the button is pressed.
74 *
75 * @param button The button to check.
76 *
77 * @returns True when the button is pressed.
78 */
79 [[nodiscard]] bool IsButtonPressed(HIDButton button) const;
80
81 /**
82 * Checks whether any of the buttons in the parameter list is pressed.
83 *
84 * @tparam HIDButton The buttons to check.
85 *
86 * @returns True when at least one of the buttons is pressed.
87 */
88 template <HIDButton... T>
89 [[nodiscard]] bool IsAnyButtonPressed() {
90 return (IsButtonPressed(T) || ...);
91 }
92
93 /**
94 * The specified button is considered to be pressed once
95 * if it is currently pressed and not pressed previously.
96 *
97 * @param button The button to check.
98 *
99 * @returns True when the button is pressed once.
100 */
101 [[nodiscard]] bool IsButtonPressedOnce(HIDButton button) const;
102
103 /**
104 * Checks whether any of the buttons in the parameter list is pressed once.
105 *
106 * @tparam T The buttons to check.
107 *
108 * @returns True when at least one of the buttons is pressed once.
109 */
110 template <HIDButton... T>
111 [[nodiscard]] bool IsAnyButtonPressedOnce() const {
112 return (IsButtonPressedOnce(T) || ...);
113 }
114
115 /**
116 * The specified button is considered to be held down if it is pressed in all 9 button states.
117 *
118 * @param button The button to check.
119 *
120 * @returns True when the button is held down.
121 */
122 [[nodiscard]] bool IsButtonHeld(HIDButton button) const;
123
124 /**
125 * Checks whether any of the buttons in the parameter list is held down.
126 *
127 * @tparam T The buttons to check.
128 *
129 * @returns True when at least one of the buttons is held down.
130 */
131 template <HIDButton... T>
132 [[nodiscard]] bool IsAnyButtonHeld() const {
133 return (IsButtonHeld(T) || ...);
134 }
135
136private:
137 Service::HID::Controller_NPad& npad;
138
139 /// Stores 9 consecutive button states polled from HID.
140 std::array<u32, 9> button_states{};
141
142 std::size_t previous_index{};
143 std::size_t current_index{};
144};