This is the latest WPILib src, VisionSample2013, cRIO image, ... pulled down from firstforge.wpi.edu.
There might be risks in using the top of tree rather than an official release, but the commit messages do mention fixes for some deadlocks and race conditions.
git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4066 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/azaleasource/WPILibCProgramming/trunk/WPILib/PIDController.h b/azaleasource/WPILibCProgramming/trunk/WPILib/PIDController.h
new file mode 100644
index 0000000..a2a196e
--- /dev/null
+++ b/azaleasource/WPILibCProgramming/trunk/WPILib/PIDController.h
@@ -0,0 +1,109 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
+/*----------------------------------------------------------------------------*/
+
+#ifndef PIDCONTROLLER_H_
+#define PIDCONTROLLER_H_
+
+#include "Base.h"
+#include "semLib.h"
+#include "Controller.h"
+#include "LiveWindow/LiveWindow.h"
+
+class PIDOutput;
+class PIDSource;
+class Notifier;
+
+/**
+ * Class implements a PID Control Loop.
+ *
+ * Creates a separate thread which reads the given PIDSource and takes
+ * care of the integral calculations, as well as writing the given
+ * PIDOutput
+ */
+class PIDController : public LiveWindowSendable, public Controller, public ITableListener
+{
+public:
+ PIDController(float p, float i, float d,
+ PIDSource *source, PIDOutput *output,
+ float period = 0.05);
+ PIDController(float p, float i, float d, float f,
+ PIDSource *source, PIDOutput *output,
+ float period = 0.05);
+ virtual ~PIDController();
+ virtual float Get();
+ virtual void SetContinuous(bool continuous = true);
+ virtual void SetInputRange(float minimumInput, float maximumInput);
+ virtual void SetOutputRange(float mimimumOutput, float maximumOutput);
+ virtual void SetPID(float p, float i, float d);
+ virtual void SetPID(float p, float i, float d, float f);
+ virtual float GetP();
+ virtual float GetI();
+ virtual float GetD();
+ virtual float GetF();
+
+ virtual void SetSetpoint(float setpoint);
+ virtual float GetSetpoint();
+
+ virtual float GetError();
+
+ virtual void SetTolerance(float percent);
+ virtual void SetAbsoluteTolerance(float absValue);
+ virtual void SetPercentTolerance(float percentValue);
+ virtual bool OnTarget();
+
+ virtual void Enable();
+ virtual void Disable();
+ virtual bool IsEnabled();
+
+ virtual void Reset();
+
+ virtual void InitTable(ITable* table);
+
+private:
+ float m_P; // factor for "proportional" control
+ float m_I; // factor for "integral" control
+ float m_D; // factor for "derivative" control
+ float m_F; // factor for "feed forward" control
+ float m_maximumOutput; // |maximum output|
+ float m_minimumOutput; // |minimum output|
+ float m_maximumInput; // maximum input - limit setpoint to this
+ float m_minimumInput; // minimum input - limit setpoint to this
+ bool m_continuous; // do the endpoints wrap around? eg. Absolute encoder
+ bool m_enabled; //is the pid controller enabled
+ float m_prevError; // the prior sensor input (used to compute velocity)
+ double m_totalError; //the sum of the errors for use in the integral calc
+ enum {kAbsoluteTolerance, kPercentTolerance, kNoTolerance} m_toleranceType;
+ float m_tolerance; //the percetage or absolute error that is considered on target
+ float m_setpoint;
+ float m_error;
+ float m_result;
+ float m_period;
+
+ SEM_ID m_semaphore;
+
+ PIDSource *m_pidInput;
+ PIDOutput *m_pidOutput;
+ Notifier *m_controlLoop;
+
+ void Initialize(float p, float i, float d, float f,
+ PIDSource *source, PIDOutput *output,
+ float period = 0.05);
+ static void CallCalculate(void *controller);
+ void Calculate();
+
+ virtual ITable* GetTable();
+ virtual std::string GetSmartDashboardType();
+ virtual void ValueChanged(ITable* source, const std::string& key, EntryValue value, bool isNew);
+ virtual void UpdateTable();
+ virtual void StartLiveWindowMode();
+ virtual void StopLiveWindowMode();
+protected:
+ ITable* m_table;
+
+ DISALLOW_COPY_AND_ASSIGN(PIDController);
+};
+
+#endif