summaryrefslogtreecommitdiffstats
path: root/src/input_common/helpers/joycon_protocol/poller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/helpers/joycon_protocol/poller.cpp')
-rw-r--r--src/input_common/helpers/joycon_protocol/poller.cpp107
1 files changed, 72 insertions, 35 deletions
diff --git a/src/input_common/helpers/joycon_protocol/poller.cpp b/src/input_common/helpers/joycon_protocol/poller.cpp
index 9bb15e935..dca797f7a 100644
--- a/src/input_common/helpers/joycon_protocol/poller.cpp
+++ b/src/input_common/helpers/joycon_protocol/poller.cpp
@@ -12,7 +12,7 @@ JoyconPoller::JoyconPoller(ControllerType device_type_, JoyStickCalibration left
: device_type{device_type_}, left_stick_calibration{left_stick_calibration_},
right_stick_calibration{right_stick_calibration_}, motion_calibration{motion_calibration_} {}
-void JoyconPoller::SetCallbacks(const Joycon::JoyconCallbacks& callbacks_) {
+void JoyconPoller::SetCallbacks(const JoyconCallbacks& callbacks_) {
callbacks = std::move(callbacks_);
}
@@ -22,13 +22,13 @@ void JoyconPoller::ReadActiveMode(std::span<u8> buffer, const MotionStatus& moti
memcpy(&data, buffer.data(), sizeof(InputReportActive));
switch (device_type) {
- case Joycon::ControllerType::Left:
+ case ControllerType::Left:
UpdateActiveLeftPadInput(data, motion_status);
break;
- case Joycon::ControllerType::Right:
+ case ControllerType::Right:
UpdateActiveRightPadInput(data, motion_status);
break;
- case Joycon::ControllerType::Pro:
+ case ControllerType::Pro:
UpdateActiveProPadInput(data, motion_status);
break;
default:
@@ -47,14 +47,14 @@ void JoyconPoller::ReadPassiveMode(std::span<u8> buffer) {
memcpy(&data, buffer.data(), sizeof(InputReportPassive));
switch (device_type) {
- case Joycon::ControllerType::Left:
- UpdatePasiveLeftPadInput(data);
+ case ControllerType::Left:
+ UpdatePassiveLeftPadInput(data);
break;
- case Joycon::ControllerType::Right:
- UpdatePasiveRightPadInput(data);
+ case ControllerType::Right:
+ UpdatePassiveRightPadInput(data);
break;
- case Joycon::ControllerType::Pro:
- UpdatePasiveProPadInput(data);
+ case ControllerType::Pro:
+ UpdatePassiveProPadInput(data);
break;
default:
break;
@@ -210,14 +210,12 @@ void JoyconPoller::UpdateActiveProPadInput(const InputReportActive& input,
}
}
-void JoyconPoller::UpdatePasiveLeftPadInput(const InputReportPassive& input) {
- static constexpr std::array<Joycon::PasivePadButton, 11> left_buttons{
- Joycon::PasivePadButton::Down_A, Joycon::PasivePadButton::Right_X,
- Joycon::PasivePadButton::Left_B, Joycon::PasivePadButton::Up_Y,
- Joycon::PasivePadButton::SL, Joycon::PasivePadButton::SR,
- Joycon::PasivePadButton::L_R, Joycon::PasivePadButton::ZL_ZR,
- Joycon::PasivePadButton::Minus, Joycon::PasivePadButton::Capture,
- Joycon::PasivePadButton::StickL,
+void JoyconPoller::UpdatePassiveLeftPadInput(const InputReportPassive& input) {
+ static constexpr std::array<PassivePadButton, 11> left_buttons{
+ PassivePadButton::Down_A, PassivePadButton::Right_X, PassivePadButton::Left_B,
+ PassivePadButton::Up_Y, PassivePadButton::SL, PassivePadButton::SR,
+ PassivePadButton::L_R, PassivePadButton::ZL_ZR, PassivePadButton::Minus,
+ PassivePadButton::Capture, PassivePadButton::StickL,
};
for (auto left_button : left_buttons) {
@@ -225,16 +223,19 @@ void JoyconPoller::UpdatePasiveLeftPadInput(const InputReportPassive& input) {
const int button = static_cast<int>(left_button);
callbacks.on_button_data(button, button_status);
}
+
+ const auto [left_axis_x, left_axis_y] =
+ GetPassiveAxisValue(static_cast<PassivePadStick>(input.stick_state));
+ callbacks.on_stick_data(static_cast<int>(PadAxes::LeftStickX), left_axis_x);
+ callbacks.on_stick_data(static_cast<int>(PadAxes::LeftStickY), left_axis_y);
}
-void JoyconPoller::UpdatePasiveRightPadInput(const InputReportPassive& input) {
- static constexpr std::array<Joycon::PasivePadButton, 11> right_buttons{
- Joycon::PasivePadButton::Down_A, Joycon::PasivePadButton::Right_X,
- Joycon::PasivePadButton::Left_B, Joycon::PasivePadButton::Up_Y,
- Joycon::PasivePadButton::SL, Joycon::PasivePadButton::SR,
- Joycon::PasivePadButton::L_R, Joycon::PasivePadButton::ZL_ZR,
- Joycon::PasivePadButton::Plus, Joycon::PasivePadButton::Home,
- Joycon::PasivePadButton::StickR,
+void JoyconPoller::UpdatePassiveRightPadInput(const InputReportPassive& input) {
+ static constexpr std::array<PassivePadButton, 11> right_buttons{
+ PassivePadButton::Down_A, PassivePadButton::Right_X, PassivePadButton::Left_B,
+ PassivePadButton::Up_Y, PassivePadButton::SL, PassivePadButton::SR,
+ PassivePadButton::L_R, PassivePadButton::ZL_ZR, PassivePadButton::Plus,
+ PassivePadButton::Home, PassivePadButton::StickR,
};
for (auto right_button : right_buttons) {
@@ -242,17 +243,20 @@ void JoyconPoller::UpdatePasiveRightPadInput(const InputReportPassive& input) {
const int button = static_cast<int>(right_button);
callbacks.on_button_data(button, button_status);
}
+
+ const auto [right_axis_x, right_axis_y] =
+ GetPassiveAxisValue(static_cast<PassivePadStick>(input.stick_state));
+ callbacks.on_stick_data(static_cast<int>(PadAxes::RightStickX), right_axis_x);
+ callbacks.on_stick_data(static_cast<int>(PadAxes::RightStickY), right_axis_y);
}
-void JoyconPoller::UpdatePasiveProPadInput(const InputReportPassive& input) {
- static constexpr std::array<Joycon::PasivePadButton, 14> pro_buttons{
- Joycon::PasivePadButton::Down_A, Joycon::PasivePadButton::Right_X,
- Joycon::PasivePadButton::Left_B, Joycon::PasivePadButton::Up_Y,
- Joycon::PasivePadButton::SL, Joycon::PasivePadButton::SR,
- Joycon::PasivePadButton::L_R, Joycon::PasivePadButton::ZL_ZR,
- Joycon::PasivePadButton::Minus, Joycon::PasivePadButton::Plus,
- Joycon::PasivePadButton::Capture, Joycon::PasivePadButton::Home,
- Joycon::PasivePadButton::StickL, Joycon::PasivePadButton::StickR,
+void JoyconPoller::UpdatePassiveProPadInput(const InputReportPassive& input) {
+ static constexpr std::array<PassivePadButton, 14> pro_buttons{
+ PassivePadButton::Down_A, PassivePadButton::Right_X, PassivePadButton::Left_B,
+ PassivePadButton::Up_Y, PassivePadButton::SL, PassivePadButton::SR,
+ PassivePadButton::L_R, PassivePadButton::ZL_ZR, PassivePadButton::Minus,
+ PassivePadButton::Plus, PassivePadButton::Capture, PassivePadButton::Home,
+ PassivePadButton::StickL, PassivePadButton::StickR,
};
for (auto pro_button : pro_buttons) {
@@ -260,6 +264,15 @@ void JoyconPoller::UpdatePasiveProPadInput(const InputReportPassive& input) {
const int button = static_cast<int>(pro_button);
callbacks.on_button_data(button, button_status);
}
+
+ const auto [left_axis_x, left_axis_y] =
+ GetPassiveAxisValue(static_cast<PassivePadStick>(input.stick_state & 0xf));
+ const auto [right_axis_x, right_axis_y] =
+ GetPassiveAxisValue(static_cast<PassivePadStick>(input.stick_state >> 4));
+ callbacks.on_stick_data(static_cast<int>(PadAxes::LeftStickX), left_axis_x);
+ callbacks.on_stick_data(static_cast<int>(PadAxes::LeftStickY), left_axis_y);
+ callbacks.on_stick_data(static_cast<int>(PadAxes::RightStickX), right_axis_x);
+ callbacks.on_stick_data(static_cast<int>(PadAxes::RightStickY), right_axis_y);
}
f32 JoyconPoller::GetAxisValue(u16 raw_value, Joycon::JoyStickAxisCalibration calibration) const {
@@ -270,6 +283,30 @@ f32 JoyconPoller::GetAxisValue(u16 raw_value, Joycon::JoyStickAxisCalibration ca
return value / calibration.min;
}
+std::pair<f32, f32> JoyconPoller::GetPassiveAxisValue(PassivePadStick raw_value) const {
+ switch (raw_value) {
+ case PassivePadStick::Right:
+ return {1.0f, 0.0f};
+ case PassivePadStick::RightDown:
+ return {1.0f, -1.0f};
+ case PassivePadStick::Down:
+ return {0.0f, -1.0f};
+ case PassivePadStick::DownLeft:
+ return {-1.0f, -1.0f};
+ case PassivePadStick::Left:
+ return {-1.0f, 0.0f};
+ case PassivePadStick::LeftUp:
+ return {-1.0f, 1.0f};
+ case PassivePadStick::Up:
+ return {0.0f, 1.0f};
+ case PassivePadStick::UpRight:
+ return {1.0f, 1.0f};
+ case PassivePadStick::Neutral:
+ default:
+ return {0.0f, 0.0f};
+ }
+}
+
f32 JoyconPoller::GetAccelerometerValue(s16 raw, const MotionSensorCalibration& cal,
AccelerometerSensitivity sensitivity) const {
const f32 value = raw * (1.0f / (cal.scale - cal.offset)) * 4;