2
1
Fork 0
mirror of https://github.com/yuzu-emu/yuzu.git synced 2024-07-04 23:31:19 +01:00

Merge pull request #4338 from ameerj/disconnected-adapter

gcadapter: Fix crash if gc configured but adapter not connected
This commit is contained in:
bunnei 2020-07-14 12:01:43 -04:00 committed by GitHub
commit bf9c010be5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 15 deletions

View file

@ -100,6 +100,9 @@ public:
void BeginConfiguration(); void BeginConfiguration();
void EndConfiguration(); void EndConfiguration();
/// Returns true if there is a device connected to port
bool DeviceConnected(std::size_t port);
std::array<Common::SPSCQueue<GCPadStatus>, 4>& GetPadQueue(); std::array<Common::SPSCQueue<GCPadStatus>, 4>& GetPadQueue();
const std::array<Common::SPSCQueue<GCPadStatus>, 4>& GetPadQueue() const; const std::array<Common::SPSCQueue<GCPadStatus>, 4>& GetPadQueue() const;
@ -119,9 +122,6 @@ private:
/// Stop scanning for the adapter /// Stop scanning for the adapter
void StopScanThread(); void StopScanThread();
/// Returns true if there is a device connected to port
bool DeviceConnected(std::size_t port);
/// Resets status of device connected to port /// Resets status of device connected to port
void ResetDeviceType(std::size_t port); void ResetDeviceType(std::size_t port);

View file

@ -21,7 +21,10 @@ public:
~GCButton() override; ~GCButton() override;
bool GetStatus() const override { bool GetStatus() const override {
return gcadapter->GetPadState()[port].buttons.at(button); if (gcadapter->DeviceConnected(port)) {
return gcadapter->GetPadState()[port].buttons.at(button);
}
return false;
} }
private: private:
@ -44,13 +47,17 @@ public:
} }
bool GetStatus() const override { bool GetStatus() const override {
const float axis_value = (gcadapter->GetPadState()[port].axes.at(axis) - 128.0f) / 128.0f; if (gcadapter->DeviceConnected(port)) {
if (trigger_if_greater) { const float axis_value =
// TODO: Might be worthwile to set a slider for the trigger threshold. It is currently (gcadapter->GetPadState()[port].axes.at(axis) - 128.0f) / 128.0f;
// always set to 0.5 in configure_input_player.cpp ZL/ZR HandleClick if (trigger_if_greater) {
return axis_value > threshold; // TODO: Might be worthwile to set a slider for the trigger threshold. It is
// currently always set to 0.5 in configure_input_player.cpp ZL/ZR HandleClick
return axis_value > threshold;
}
return axis_value < -threshold;
} }
return axis_value < -threshold; return false;
} }
private: private:
@ -151,11 +158,14 @@ public:
: port(port_), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_), gcadapter(adapter) {} : port(port_), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_), gcadapter(adapter) {}
float GetAxis(int axis) const { float GetAxis(int axis) const {
std::lock_guard lock{mutex}; if (gcadapter->DeviceConnected(port)) {
// division is not by a perfect 128 to account for some variance in center location std::lock_guard lock{mutex};
// e.g. my device idled at 131 in X, 120 in Y, and full range of motion was in range // division is not by a perfect 128 to account for some variance in center location
// [20-230] // e.g. my device idled at 131 in X, 120 in Y, and full range of motion was in range
return (gcadapter->GetPadState()[port].axes.at(axis) - 128.0f) / 95.0f; // [20-230]
return (gcadapter->GetPadState()[port].axes.at(axis) - 128.0f) / 95.0f;
}
return 0.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 {