From 99b6000a65876c27c46cf2f6179ba8a343260f59 Mon Sep 17 00:00:00 2001 From: Brad Miller Date: Thu, 7 Jan 2016 10:19:14 -0500 Subject: [PATCH] Fix onTarget() so that it returns false until there are any values retrieved The onTarget() method uses the average error and there might not be a valid value until the PIDController runs once. This is causing commands to bail out early in simulation. Change-Id: I7bac9ecb847cbe4f378385b1a6998bba10147554 --- wpilibc/Athena/src/PIDController.cpp | 2 ++ .../java/edu/wpi/first/wpilibj/PIDController.java | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/wpilibc/Athena/src/PIDController.cpp b/wpilibc/Athena/src/PIDController.cpp index 81e97fc83a..ef4a49986d 100644 --- a/wpilibc/Athena/src/PIDController.cpp +++ b/wpilibc/Athena/src/PIDController.cpp @@ -486,8 +486,10 @@ void PIDController::SetToleranceBuffer(unsigned bufLength) { * setpoint. * Ideally it should be based on being within the tolerance for some period of * time. + * This will return false until at least one input value has been computed. */ bool PIDController::OnTarget() const { + if (m_buf.size() == 0) return false; double error = GetAvgError(); std::lock_guard sync(m_mutex); diff --git a/wpilibj/src/shared/java/edu/wpi/first/wpilibj/PIDController.java b/wpilibj/src/shared/java/edu/wpi/first/wpilibj/PIDController.java index da0989bcca..68a8c66289 100644 --- a/wpilibj/src/shared/java/edu/wpi/first/wpilibj/PIDController.java +++ b/wpilibj/src/shared/java/edu/wpi/first/wpilibj/PIDController.java @@ -86,7 +86,7 @@ public class PIDController implements PIDInterface, LiveWindowSendable, Controll @Override public boolean onTarget() { - return (Math.abs(getAvgError()) < percentage / 100 * (m_maximumInput - m_minimumInput)); + return isAvgErrorValid() && (Math.abs(getAvgError()) < percentage / 100 * (m_maximumInput - m_minimumInput)); } } @@ -99,7 +99,7 @@ public class PIDController implements PIDInterface, LiveWindowSendable, Controll @Override public boolean onTarget() { - return Math.abs(getAvgError()) < value; + return isAvgErrorValid() && Math.abs(getAvgError()) < value; } } @@ -575,6 +575,16 @@ public class PIDController implements PIDInterface, LiveWindowSendable, Controll return avgError; } + /** + * Returns whether or not any values have been collected. If no values + * have been collected, getAvgError is 0, which is invalid. + * + * @return True if {@link #getAvgError()} is currently valid. + */ + private synchronized boolean isAvgErrorValid() { + return m_buf.size() != 0; + } + /** * Set the percentage error which is considered tolerable for use with * OnTarget. (Input of 15.0 = 15 percent)