mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
Also added some references/smart pointers to a couple places that seemed convenient to the user. I haven't updated the constructors for RobotDrive() related examples, pending the results of gerrit change https://usfirst.collab.net/gerrit/#/c/960/ A few things that we are noticing: --It might be nice if ReturnPIDInput() didn't have to be const; when people try to override it, they have to remember to put the const in and if they don't, then the compiler error isn't the most obvious (especially since this is a change). This would also apply to PIDGet() in the PIDSource interface. --SendableChooser still takes raw pointers. This could lead to an issue I had to debug briefly where you accidentally call GetSelected() on autoChooser and put the resulting raw pointer into a unique_ptr, which destroys the pointer when it goes out of scope. Specifically, I was testing the PacGoat example and I ended up with a situation where if auto mode was run once, it was fine, but if it was run twice, the selected command would have been destroyed by the unique_ptr. I believe that this just requires updating SendableChosser to take shared_ptr. --When the samples are compiled with -pedantic, it points out that START_ROBOT_CLASS macro expansion results in a redundant semicolon. Change-Id: Ib4c025a61263d0d2780d4253faa31713e15333a5
77 lines
2.5 KiB
C++
77 lines
2.5 KiB
C++
/*----------------------------------------------------------------------------*/
|
|
/* Copyright (c) FIRST 2011. 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 __PID_SUBSYSTEM_H__
|
|
#define __PID_SUBSYSTEM_H__
|
|
|
|
#include "Commands/Subsystem.h"
|
|
#include "PIDController.h"
|
|
#include "PIDSource.h"
|
|
#include "PIDOutput.h"
|
|
|
|
#include <memory>
|
|
|
|
/**
|
|
* This class is designed to handle the case where there is a {@link Subsystem}
|
|
* which uses a single {@link PIDController} almost constantly (for instance,
|
|
* an elevator which attempts to stay at a constant height).
|
|
*
|
|
* <p>It provides some convenience methods to run an internal {@link
|
|
* PIDController}.
|
|
* It also allows access to the internal {@link PIDController} in order to give
|
|
* total control
|
|
* to the programmer.</p>
|
|
*
|
|
*/
|
|
class PIDSubsystem : public Subsystem, public PIDOutput, public PIDSource {
|
|
public:
|
|
PIDSubsystem(const std::string &name, double p, double i, double d);
|
|
PIDSubsystem(const std::string &name, double p, double i, double d, double f);
|
|
PIDSubsystem(const std::string &name, double p, double i, double d, double f,
|
|
double period);
|
|
PIDSubsystem(double p, double i, double d);
|
|
PIDSubsystem(double p, double i, double d, double f);
|
|
PIDSubsystem(double p, double i, double d, double f, double period);
|
|
virtual ~PIDSubsystem() = default;
|
|
|
|
void Enable();
|
|
void Disable();
|
|
|
|
// PIDOutput interface
|
|
virtual void PIDWrite(float output);
|
|
|
|
// PIDSource interface
|
|
virtual double PIDGet() const;
|
|
void SetSetpoint(double setpoint);
|
|
void SetSetpointRelative(double deltaSetpoint);
|
|
void SetInputRange(float minimumInput, float maximumInput);
|
|
void SetOutputRange(float minimumOutput, float maximumOutput);
|
|
double GetSetpoint();
|
|
double GetPosition();
|
|
double GetRate();
|
|
|
|
virtual void SetAbsoluteTolerance(float absValue);
|
|
virtual void SetPercentTolerance(float percent);
|
|
virtual bool OnTarget() const;
|
|
|
|
protected:
|
|
std::shared_ptr<PIDController> GetPIDController();
|
|
|
|
virtual double ReturnPIDInput() const = 0;
|
|
virtual void UsePIDOutput(double output) = 0;
|
|
|
|
private:
|
|
/** The internal {@link PIDController} */
|
|
std::shared_ptr<PIDController> m_controller;
|
|
|
|
public:
|
|
virtual void InitTable(std::shared_ptr<ITable> table);
|
|
virtual std::string GetSmartDashboardType() const;
|
|
};
|
|
|
|
#endif
|