| /*----------------------------------------------------------------------------*/ |
| /* 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 |