Address PR feedback, fix axis button thresholding

This commit is contained in:
Ameer 2020-07-07 12:20:59 -04:00
parent e3253b5f18
commit b57475887b
3 changed files with 21 additions and 57 deletions

View File

@ -385,51 +385,25 @@ const std::array<GCState, 4>& Adapter::GetPadState() const {
return state; return state;
} }
int Adapter::GetOriginValue(int port, int axis) { int Adapter::GetOriginValue(int port, int axis) const {
// TODO: perhaps place stick statuses into an array in PadStatus const auto& status = origin_status[port];
const PadAxes padaxis = static_cast<PadAxes>(axis);
if (padaxis == PadAxes::StickX) {
return origin_status[port].stick_x;
}
if (padaxis == PadAxes::StickY) {
return origin_status[port].stick_y;
}
if (padaxis == PadAxes::SubstickX) {
return origin_status[port].substick_x;
}
if (padaxis == PadAxes::SubstickY) {
return origin_status[port].substick_x;
}
if (padaxis == PadAxes::TriggerLeft) {
return origin_status[port].trigger_left;
}
if (padaxis == PadAxes::TriggerRight) {
return origin_status[port].trigger_right;
}
return 0;
}
const int Adapter::GetOriginValue(int port, int axis) const { switch (static_cast<PadAxes>(axis)) {
const PadAxes padaxis = static_cast<PadAxes>(axis); case PadAxes::StickX:
if (padaxis == PadAxes::StickX) { return status.stick_x;
return origin_status[port].stick_x; case PadAxes::StickY:
} return status.stick_y;
if (padaxis == PadAxes::StickY) { case PadAxes::SubstickX:
return origin_status[port].stick_y; return status.substick_x;
} case PadAxes::SubstickY:
if (padaxis == PadAxes::SubstickX) { return status.substick_y;
return origin_status[port].substick_x; case PadAxes::TriggerLeft:
} return status.trigger_left;
if (padaxis == PadAxes::SubstickY) { case PadAxes::TriggerRight:
return origin_status[port].substick_x; return status.trigger_right;
} default:
if (padaxis == PadAxes::TriggerLeft) {
return origin_status[port].trigger_left;
}
if (padaxis == PadAxes::TriggerRight) {
return origin_status[port].trigger_right;
}
return 0; return 0;
}
} }
} // namespace GCAdapter } // namespace GCAdapter

View File

@ -96,8 +96,7 @@ public:
std::array<GCState, 4>& GetPadState(); std::array<GCState, 4>& GetPadState();
const std::array<GCState, 4>& GetPadState() const; const std::array<GCState, 4>& GetPadState() const;
int GetOriginValue(int port, int axis); int GetOriginValue(int port, int axis) const;
const int GetOriginValue(int port, int axis) const;
private: private:
GCPadStatus GetPadStatus(int port, const std::array<u8, 37>& adapter_payload); GCPadStatus GetPadStatus(int port, const std::array<u8, 37>& adapter_payload);

View File

@ -34,13 +34,7 @@ public:
explicit GCAxisButton(int port_, int axis_, float threshold_, bool trigger_if_greater_, explicit GCAxisButton(int port_, int axis_, float threshold_, bool trigger_if_greater_,
GCAdapter::Adapter* adapter) GCAdapter::Adapter* adapter)
: port(port_), axis(axis_), threshold(threshold_), trigger_if_greater(trigger_if_greater_), : port(port_), axis(axis_), threshold(threshold_), trigger_if_greater(trigger_if_greater_),
gcadapter(adapter), origin_value(adapter->GetOriginValue(port_, axis_)) { gcadapter(adapter), origin_value(adapter->GetOriginValue(port_, axis_)) {}
// L/R triggers range is only in positive direction beginning near 0
// 0.0 threshold equates to near half trigger press, but threshold accounts for variability.
if (axis > 3) {
threshold *= -0.5;
}
}
bool GetStatus() const override { bool GetStatus() const override {
const float current_axis_value = gcadapter->GetPadState()[port].axes.at(axis); const float current_axis_value = gcadapter->GetPadState()[port].axes.at(axis);
@ -152,14 +146,11 @@ public:
float GetAxis(int axis) const { float GetAxis(int axis) const {
std::lock_guard lock{mutex}; std::lock_guard lock{mutex};
const auto origin_value = axis % 2 == 0 ? origin_value_x : origin_value_y;
// division is not by a perfect 128 to account for some variance in center location // division is not by a perfect 128 to account for some variance in center location
// e.g. my device idled at 131 in X, 120 in Y, and full range of motion was in range // e.g. my device idled at 131 in X, 120 in Y, and full range of motion was in range
// [20-230] // [20-230]
if (axis % 2 == 0) { return (gcadapter->GetPadState()[port].axes.at(axis) - origin_value) / 95.0f;
return (gcadapter->GetPadState()[port].axes.at(axis) - origin_value_x) / 95.0f;
} else {
return (gcadapter->GetPadState()[port].axes.at(axis) - origin_value_y) / 95.0f;
}
} }
std::pair<float, float> GetAnalog(int axis_x, int axis_y) const { std::pair<float, float> GetAnalog(int axis_x, int axis_y) const {