summaryrefslogtreecommitdiff
path: root/src/core/frontend/input_interpreter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/frontend/input_interpreter.h')
-rw-r--r--src/core/frontend/input_interpreter.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/core/frontend/input_interpreter.h b/src/core/frontend/input_interpreter.h
new file mode 100644
index 000000000..fea9aebe6
--- /dev/null
+++ b/src/core/frontend/input_interpreter.h
@@ -0,0 +1,120 @@
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 /**
70 * The specified button is considered to be pressed once
71 * if it is currently pressed and not pressed previously.
72 *
73 * @param button The button to check.
74 *
75 * @returns True when the button is pressed once.
76 */
77 [[nodiscard]] bool IsButtonPressedOnce(HIDButton button) const;
78
79 /**
80 * Checks whether any of the buttons in the parameter list is pressed once.
81 *
82 * @tparam HIDButton The buttons to check.
83 *
84 * @returns True when at least one of the buttons is pressed once.
85 */
86 template <HIDButton... T>
87 [[nodiscard]] bool IsAnyButtonPressedOnce() {
88 return (IsButtonPressedOnce(T) || ...);
89 }
90
91 /**
92 * The specified button is considered to be held down if it is pressed in all 9 button states.
93 *
94 * @param button The button to check.
95 *
96 * @returns True when the button is held down.
97 */
98 [[nodiscard]] bool IsButtonHeld(HIDButton button) const;
99
100 /**
101 * Checks whether any of the buttons in the parameter list is held down.
102 *
103 * @tparam HIDButton The buttons to check.
104 *
105 * @returns True when at least one of the buttons is held down.
106 */
107 template <HIDButton... T>
108 [[nodiscard]] bool IsAnyButtonHeld() {
109 return (IsButtonHeld(T) || ...);
110 }
111
112private:
113 Service::HID::Controller_NPad& npad;
114
115 /// Stores 9 consecutive button states polled from HID.
116 std::array<u32, 9> button_states{};
117
118 std::size_t previous_index{};
119 std::size_t current_index{};
120};