mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
86 lines
2.7 KiB
C++
86 lines
2.7 KiB
C++
/*----------------------------------------------------------------------------*/
|
|
/* Copyright (c) 2008-2019 FIRST. 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 the root directory of */
|
|
/* the project. */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
#include "frc/PIDController.h"
|
|
|
|
#include "frc/Notifier.h"
|
|
#include "frc/PIDOutput.h"
|
|
#include "frc/smartdashboard/SendableBuilder.h"
|
|
|
|
using namespace frc;
|
|
|
|
PIDController::PIDController(double Kp, double Ki, double Kd, PIDSource* source,
|
|
PIDOutput* output, double period)
|
|
: PIDController(Kp, Ki, Kd, 0.0, *source, *output, period) {}
|
|
|
|
PIDController::PIDController(double Kp, double Ki, double Kd, double Kf,
|
|
PIDSource* source, PIDOutput* output,
|
|
double period)
|
|
: PIDController(Kp, Ki, Kd, Kf, *source, *output, period) {}
|
|
|
|
PIDController::PIDController(double Kp, double Ki, double Kd, PIDSource& source,
|
|
PIDOutput& output, double period)
|
|
: PIDController(Kp, Ki, Kd, 0.0, source, output, period) {}
|
|
|
|
PIDController::PIDController(double Kp, double Ki, double Kd, double Kf,
|
|
PIDSource& source, PIDOutput& output,
|
|
double period)
|
|
: PIDBase(Kp, Ki, Kd, Kf, source, output) {
|
|
m_controlLoop = std::make_unique<Notifier>(&PIDController::Calculate, this);
|
|
m_controlLoop->StartPeriodic(units::second_t(period));
|
|
}
|
|
|
|
PIDController::~PIDController() {
|
|
// Forcefully stopping the notifier so the callback can successfully run.
|
|
m_controlLoop->Stop();
|
|
}
|
|
|
|
void PIDController::Enable() {
|
|
{
|
|
std::scoped_lock lock(m_thisMutex);
|
|
m_enabled = true;
|
|
}
|
|
}
|
|
|
|
void PIDController::Disable() {
|
|
{
|
|
// Ensures m_enabled modification and PIDWrite() call occur atomically
|
|
std::scoped_lock pidWriteLock(m_pidWriteMutex);
|
|
{
|
|
std::scoped_lock mainLock(m_thisMutex);
|
|
m_enabled = false;
|
|
}
|
|
|
|
m_pidOutput->PIDWrite(0);
|
|
}
|
|
}
|
|
|
|
void PIDController::SetEnabled(bool enable) {
|
|
if (enable) {
|
|
Enable();
|
|
} else {
|
|
Disable();
|
|
}
|
|
}
|
|
|
|
bool PIDController::IsEnabled() const {
|
|
std::scoped_lock lock(m_thisMutex);
|
|
return m_enabled;
|
|
}
|
|
|
|
void PIDController::Reset() {
|
|
Disable();
|
|
|
|
PIDBase::Reset();
|
|
}
|
|
|
|
void PIDController::InitSendable(SendableBuilder& builder) {
|
|
PIDBase::InitSendable(builder);
|
|
builder.AddBooleanProperty("enabled", [=]() { return IsEnabled(); },
|
|
[=](bool value) { SetEnabled(value); });
|
|
}
|