summaryrefslogtreecommitdiff
path: root/src/input_common/gcadapter/gc_poller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/gcadapter/gc_poller.cpp')
-rw-r--r--src/input_common/gcadapter/gc_poller.cpp66
1 files changed, 35 insertions, 31 deletions
diff --git a/src/input_common/gcadapter/gc_poller.cpp b/src/input_common/gcadapter/gc_poller.cpp
index b346fdf8e..893556916 100644
--- a/src/input_common/gcadapter/gc_poller.cpp
+++ b/src/input_common/gcadapter/gc_poller.cpp
@@ -15,7 +15,7 @@ namespace InputCommon {
15 15
16class GCButton final : public Input::ButtonDevice { 16class GCButton final : public Input::ButtonDevice {
17public: 17public:
18 explicit GCButton(int port_, int button_, GCAdapter::Adapter* adapter) 18 explicit GCButton(u32 port_, int button_, const GCAdapter::Adapter* adapter)
19 : port(port_), button(button_), gcadapter(adapter) {} 19 : port(port_), button(button_), gcadapter(adapter) {}
20 20
21 ~GCButton() override; 21 ~GCButton() override;
@@ -28,17 +28,18 @@ public:
28 } 28 }
29 29
30private: 30private:
31 const int port; 31 const u32 port;
32 const int button; 32 const int button;
33 GCAdapter::Adapter* gcadapter; 33 const GCAdapter::Adapter* gcadapter;
34}; 34};
35 35
36class GCAxisButton final : public Input::ButtonDevice { 36class GCAxisButton final : public Input::ButtonDevice {
37public: 37public:
38 explicit GCAxisButton(int port_, int axis_, float threshold_, bool trigger_if_greater_, 38 explicit GCAxisButton(u32 port_, u32 axis_, float threshold_, bool trigger_if_greater_,
39 GCAdapter::Adapter* adapter) 39 const GCAdapter::Adapter* adapter)
40 : port(port_), axis(axis_), threshold(threshold_), trigger_if_greater(trigger_if_greater_), 40 : port(port_), axis(axis_), threshold(threshold_), trigger_if_greater(trigger_if_greater_),
41 gcadapter(adapter), origin_value(adapter->GetOriginValue(port_, axis_)) {} 41 gcadapter(adapter),
42 origin_value(static_cast<float>(adapter->GetOriginValue(port_, axis_))) {}
42 43
43 bool GetStatus() const override { 44 bool GetStatus() const override {
44 if (gcadapter->DeviceConnected(port)) { 45 if (gcadapter->DeviceConnected(port)) {
@@ -55,11 +56,11 @@ public:
55 } 56 }
56 57
57private: 58private:
58 const int port; 59 const u32 port;
59 const int axis; 60 const u32 axis;
60 float threshold; 61 float threshold;
61 bool trigger_if_greater; 62 bool trigger_if_greater;
62 GCAdapter::Adapter* gcadapter; 63 const GCAdapter::Adapter* gcadapter;
63 const float origin_value; 64 const float origin_value;
64}; 65};
65 66
@@ -69,8 +70,8 @@ GCButtonFactory::GCButtonFactory(std::shared_ptr<GCAdapter::Adapter> adapter_)
69GCButton::~GCButton() = default; 70GCButton::~GCButton() = default;
70 71
71std::unique_ptr<Input::ButtonDevice> GCButtonFactory::Create(const Common::ParamPackage& params) { 72std::unique_ptr<Input::ButtonDevice> GCButtonFactory::Create(const Common::ParamPackage& params) {
72 const int button_id = params.Get("button", 0); 73 const auto button_id = params.Get("button", 0);
73 const int port = params.Get("port", 0); 74 const auto port = static_cast<u32>(params.Get("port", 0));
74 75
75 constexpr int PAD_STICK_ID = static_cast<u16>(GCAdapter::PadButton::PAD_STICK); 76 constexpr int PAD_STICK_ID = static_cast<u16>(GCAdapter::PadButton::PAD_STICK);
76 77
@@ -148,24 +149,27 @@ void GCButtonFactory::EndConfiguration() {
148 149
149class GCAnalog final : public Input::AnalogDevice { 150class GCAnalog final : public Input::AnalogDevice {
150public: 151public:
151 GCAnalog(int port_, int axis_x_, int axis_y_, float deadzone_, GCAdapter::Adapter* adapter, 152 explicit GCAnalog(u32 port_, u32 axis_x_, u32 axis_y_, float deadzone_,
152 float range_) 153 const GCAdapter::Adapter* adapter, float range_)
153 : port(port_), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_), gcadapter(adapter), 154 : port(port_), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_), gcadapter(adapter),
154 origin_value_x(adapter->GetOriginValue(port_, axis_x_)), 155 origin_value_x(static_cast<float>(adapter->GetOriginValue(port_, axis_x_))),
155 origin_value_y(adapter->GetOriginValue(port_, axis_y_)), range(range_) {} 156 origin_value_y(static_cast<float>(adapter->GetOriginValue(port_, axis_y_))),
157 range(range_) {}
156 158
157 float GetAxis(int axis) const { 159 float GetAxis(u32 axis) const {
158 if (gcadapter->DeviceConnected(port)) { 160 if (gcadapter->DeviceConnected(port)) {
159 std::lock_guard lock{mutex}; 161 std::lock_guard lock{mutex};
160 const auto origin_value = axis % 2 == 0 ? origin_value_x : origin_value_y; 162 const auto origin_value = axis % 2 == 0 ? origin_value_x : origin_value_y;
161 return (gcadapter->GetPadState()[port].axes.at(axis) - origin_value) / (100.0f * range); 163 const auto axis_value =
164 static_cast<float>(gcadapter->GetPadState()[port].axes.at(axis));
165 return (axis_value - origin_value) / (100.0f * range);
162 } 166 }
163 return 0.0f; 167 return 0.0f;
164 } 168 }
165 169
166 std::pair<float, float> GetAnalog(int axis_x, int axis_y) const { 170 std::pair<float, float> GetAnalog(u32 analog_axis_x, u32 analog_axis_y) const {
167 float x = GetAxis(axis_x); 171 float x = GetAxis(analog_axis_x);
168 float y = GetAxis(axis_y); 172 float y = GetAxis(analog_axis_y);
169 173
170 // Make sure the coordinates are in the unit circle, 174 // Make sure the coordinates are in the unit circle,
171 // otherwise normalize it. 175 // otherwise normalize it.
@@ -191,7 +195,7 @@ public:
191 195
192 bool GetAnalogDirectionStatus(Input::AnalogDirection direction) const override { 196 bool GetAnalogDirectionStatus(Input::AnalogDirection direction) const override {
193 const auto [x, y] = GetStatus(); 197 const auto [x, y] = GetStatus();
194 const float directional_deadzone = 0.4f; 198 const float directional_deadzone = 0.5f;
195 switch (direction) { 199 switch (direction) {
196 case Input::AnalogDirection::RIGHT: 200 case Input::AnalogDirection::RIGHT:
197 return x > directional_deadzone; 201 return x > directional_deadzone;
@@ -206,11 +210,11 @@ public:
206 } 210 }
207 211
208private: 212private:
209 const int port; 213 const u32 port;
210 const int axis_x; 214 const u32 axis_x;
211 const int axis_y; 215 const u32 axis_y;
212 const float deadzone; 216 const float deadzone;
213 GCAdapter::Adapter* gcadapter; 217 const GCAdapter::Adapter* gcadapter;
214 const float origin_value_x; 218 const float origin_value_x;
215 const float origin_value_y; 219 const float origin_value_y;
216 const float range; 220 const float range;
@@ -229,11 +233,11 @@ GCAnalogFactory::GCAnalogFactory(std::shared_ptr<GCAdapter::Adapter> adapter_)
229 * - "axis_y": the index of the axis to be bind as y-axis 233 * - "axis_y": the index of the axis to be bind as y-axis
230 */ 234 */
231std::unique_ptr<Input::AnalogDevice> GCAnalogFactory::Create(const Common::ParamPackage& params) { 235std::unique_ptr<Input::AnalogDevice> GCAnalogFactory::Create(const Common::ParamPackage& params) {
232 const int port = params.Get("port", 0); 236 const auto port = static_cast<u32>(params.Get("port", 0));
233 const int axis_x = params.Get("axis_x", 0); 237 const auto axis_x = static_cast<u32>(params.Get("axis_x", 0));
234 const int axis_y = params.Get("axis_y", 1); 238 const auto axis_y = static_cast<u32>(params.Get("axis_y", 1));
235 const float deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, .99f); 239 const auto deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, 1.0f);
236 const float range = std::clamp(params.Get("range", 1.0f), 0.50f, 1.50f); 240 const auto range = std::clamp(params.Get("range", 1.0f), 0.50f, 1.50f);
237 241
238 return std::make_unique<GCAnalog>(port, axis_x, axis_y, deadzone, adapter.get(), range); 242 return std::make_unique<GCAnalog>(port, axis_x, axis_y, deadzone, adapter.get(), range);
239} 243}
@@ -254,7 +258,7 @@ Common::ParamPackage GCAnalogFactory::GetNextInput() {
254 for (std::size_t port = 0; port < queue.size(); ++port) { 258 for (std::size_t port = 0; port < queue.size(); ++port) {
255 while (queue[port].Pop(pad)) { 259 while (queue[port].Pop(pad)) {
256 if (pad.axis == GCAdapter::PadAxes::Undefined || 260 if (pad.axis == GCAdapter::PadAxes::Undefined ||
257 std::abs((pad.axis_value - 128.0f) / 128.0f) < 0.1) { 261 std::abs((static_cast<float>(pad.axis_value) - 128.0f) / 128.0f) < 0.1f) {
258 continue; 262 continue;
259 } 263 }
260 // An analog device needs two axes, so we need to store the axis for later and wait for 264 // An analog device needs two axes, so we need to store the axis for later and wait for