3#include <frc/controller/PIDController.h>
4#include <frc/smartdashboard/SmartDashboard.h>
5#include <rev/ClosedLoopSlot.h>
6#include <rev/SparkBase.h>
7#include <rev/SparkClosedLoopController.h>
8#include <rev/SparkFlex.h>
9#include <rev/SparkMax.h>
10#include <rev/config/SparkFlexConfig.h>
11#include <rev/config/SparkMaxConfig.h>
12#include <units/angle.h>
13#include <units/angular_velocity.h>
31template <
typename TMotor,
typename TController,
typename TRelativeEncoder,
32 typename TAbsoluteEncoder,
typename TPidConfig>
50 TRelativeEncoder &encoder,
52 TAbsoluteEncoder *absEncoder,
53 units::revolutions_per_minute_t maxRpm);
60 void Set(
double percentage)
override;
67 void Set(units::volt_t volts)
override;
121 m_config.encoder.PositionConversionFactor(factor);
122 m_config.encoder.VelocityConversionFactor(factor);
125 rev::spark::SparkBase::ResetMode::kNoResetSafeParameters,
126 rev::spark::SparkBase::PersistMode::kPersistParameters);
137 m_config.absoluteEncoder.PositionConversionFactor(factor);
138 m_config.absoluteEncoder.VelocityConversionFactor(factor);
141 m_config, rev::spark::SparkBase::ResetMode::kNoResetSafeParameters,
142 rev::spark::SparkBase::PersistMode::kPersistParameters);
180template <
typename TMotor,
typename TController,
typename TRelativeEncoder,
181 typename TAbsoluteEncoder,
typename TPidConfig>
186 TAbsoluteEncoder, TPidConfig> &controller)
187 : m_controller{controller} {
189 frc::SmartDashboard::PutNumber(m_controller.m_name +
" P Gain",
190 m_controller.GetPidSettings().p);
191 frc::SmartDashboard::PutNumber(m_controller.m_name +
" I Gain",
192 m_controller.GetPidSettings().i);
193 frc::SmartDashboard::PutNumber(m_controller.m_name +
" D Gain",
194 m_controller.GetPidSettings().d);
195 frc::SmartDashboard::PutNumber(m_controller.m_name +
" IZone",
196 m_controller.GetPidSettings().iZone);
197 frc::SmartDashboard::PutNumber(m_controller.m_name +
" Feed Forward",
198 m_controller.GetPidSettings().ff);
207 double tP = frc::SmartDashboard::GetNumber(m_controller.m_name +
" P Gain",
208 m_controller.GetPidSettings().p);
209 double tI = frc::SmartDashboard::GetNumber(m_controller.m_name +
" I Gain",
210 m_controller.GetPidSettings().i);
211 double tD = frc::SmartDashboard::GetNumber(m_controller.m_name +
" D Gain",
212 m_controller.GetPidSettings().d);
213 double tIZone = frc::SmartDashboard::GetNumber(
214 m_controller.m_name +
" IZone", m_controller.GetPidSettings().iZone);
215 double tFeedForward =
216 frc::SmartDashboard::GetNumber(m_controller.m_name +
" Feed Forward",
217 m_controller.GetPidSettings().ff);
219 m_controller.UpdatePidSettings(
225 .isIdleModeBrake = m_controller.GetPidSettings().isIdleModeBrake});
230 TPidConfig> &m_controller;
235 rev::spark::SparkMax, rev::spark::SparkClosedLoopController,
236 rev::spark::SparkRelativeEncoder, rev::spark::SparkAbsoluteEncoder,
237 rev::spark::SparkMaxConfig> {};
IPidMotorController(std::string name)
void UpdateFromShuffleboard()
Call this within the Periodic method of the encapsulating subsystem Note: You must enable submit butt...
PidMotorControllerTuner(PidMotorController< TMotor, TController, TRelativeEncoder, TAbsoluteEncoder, TPidConfig > &controller)
Combines a motor, motor drvier, relative encoder, and absolute encoder into a single wrapper; helpful...
void UpdatePidSettings(PidSettings settings)
bool m_absolutePositionEnabled
double GetEncoderPosition() override
frc::PIDController m_pidController
void Set(units::volt_t volts) override
Set a motor to a voltage.
void Stop() override
Disable absolute positioning and stop the motor.
const PidSettings & GetPidSettings() override
void RunWithVelocity(double percentage) override
Set to a percentage of max RPM.
void RunWithVelocity(units::revolutions_per_minute_t rpm) override
Set to this velocity.
void Set(double percentage) override
Set the motor to a percentage of max voltage.
TController & m_controller
void SetAbsoluteEncoderConversionFactor(double factor) override
Sets the multiplier for going between encoder ticks and actual distance.
void SetEncoderConversionFactor(double factor) override
Sets the multiplier for going between encoder ticks and actual distance.
TRelativeEncoder & m_encoder
TAbsoluteEncoder * m_absEncoder
void RunToPosition(double position) override
Enables absolute positioning and sets the target to the position.
void SetPidTolerance(double tolerance) override
Absolute positioning is considered 'Done' when within this zone.
std::optional< double > GetAbsoluteEncoderPosition() override
const units::revolutions_per_minute_t m_maxRpm
virtual void ResetEncoder() override
void Update() override
! Call this every loop in Periodic !
PidMotorController(std::string name, TMotor &motor, TRelativeEncoder &encoder, TController &controller, PidSettings pidSettings, TAbsoluteEncoder *absEncoder, units::revolutions_per_minute_t maxRpm)
Construct a new PidMotorController.