summaryrefslogtreecommitdiff
path: root/src/core/frontend
diff options
context:
space:
mode:
authorGravatar german772021-09-20 15:02:01 -0500
committerGravatar Narr the Reg2021-11-24 20:30:22 -0600
commitbf71d18af99368d7658c9519086c40e73c6abfdd (patch)
tree1040c7d8554106215b6da4637f75aabc0154d9c7 /src/core/frontend
parentcommon: Rewrite and move core/frontend/input.h to common (diff)
downloadyuzu-bf71d18af99368d7658c9519086c40e73c6abfdd.tar.gz
yuzu-bf71d18af99368d7658c9519086c40e73c6abfdd.tar.xz
yuzu-bf71d18af99368d7658c9519086c40e73c6abfdd.zip
core/hid: Move input_interpreter to hid
Diffstat (limited to 'src/core/frontend')
-rw-r--r--src/core/frontend/input_interpreter.cpp62
-rw-r--r--src/core/frontend/input_interpreter.h144
2 files changed, 0 insertions, 206 deletions
diff --git a/src/core/frontend/input_interpreter.cpp b/src/core/frontend/input_interpreter.cpp
deleted file mode 100644
index 9f6a90e8f..000000000
--- a/src/core/frontend/input_interpreter.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
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/frontend/input_interpreter.h"
7#include "core/hle/service/hid/controllers/npad.h"
8#include "core/hle/service/hid/hid.h"
9#include "core/hle/service/sm/sm.h"
10
11InputInterpreter::InputInterpreter(Core::System& system)
12 : npad{system.ServiceManager()
13 .GetService<Service::HID::Hid>("hid")
14 ->GetAppletResource()
15 ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad)} {
16 ResetButtonStates();
17}
18
19InputInterpreter::~InputInterpreter() = default;
20
21void InputInterpreter::PollInput() {
22 const u32 button_state = npad.GetAndResetPressState();
23
24 previous_index = current_index;
25 current_index = (current_index + 1) % button_states.size();
26
27 button_states[current_index] = button_state;
28}
29
30void InputInterpreter::ResetButtonStates() {
31 previous_index = 0;
32 current_index = 0;
33
34 button_states[0] = 0xFFFFFFFF;
35
36 for (std::size_t i = 1; i < button_states.size(); ++i) {
37 button_states[i] = 0;
38 }
39}
40
41bool InputInterpreter::IsButtonPressed(HIDButton button) const {
42 return (button_states[current_index] & (1U << static_cast<u8>(button))) != 0;
43}
44
45bool InputInterpreter::IsButtonPressedOnce(HIDButton button) const {
46 const bool current_press =
47 (button_states[current_index] & (1U << static_cast<u8>(button))) != 0;
48 const bool previous_press =
49 (button_states[previous_index] & (1U << static_cast<u8>(button))) != 0;
50
51 return current_press && !previous_press;
52}
53
54bool InputInterpreter::IsButtonHeld(HIDButton button) const {
55 u32 held_buttons{button_states[0]};
56
57 for (std::size_t i = 1; i < button_states.size(); ++i) {
58 held_buttons &= button_states[i];
59 }
60
61 return (held_buttons & (1U << static_cast<u8>(button))) != 0;
62}
diff --git a/src/core/frontend/input_interpreter.h b/src/core/frontend/input_interpreter.h
deleted file mode 100644
index 9495e3daf..000000000
--- a/src/core/frontend/input_interpreter.h
+++ /dev/null
@@ -1,144 +0,0 @@
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};