60 using Output = std::variant<units::volt_t, units::ampere_t, units::scalar_t>;
66 : motorSpec{_motorSpec}, rotorToSensor(1), sensorToMech(1), voltageCompensation(units::volt_t{12.0}) {
67 for (TuningMode mode : magic_enum::enum_values<TuningMode>())
68 tuningModeChooser.AddOption(magic_enum::enum_name(mode), mode);
69 tuningModeChooser.SetDefaultOption(magic_enum::enum_name(TuningMode::Voltage));
70 opModeChooser.AddOption(
"Tuning", OperationalMode::Tuning);
71 opModeChooser.AddOption(
"Non Operational", OperationalMode::NonOperational);
72 opModeChooser.SetDefaultOption(
"Operational", OperationalMode::Operational);
74 LogChild(
"Tuning Mode", &tuningModeChooser);
75 LogChild(
"Operational Mode", &opModeChooser);
79 wpi::SendableRegistry::Remove(&tuningModeChooser);
80 wpi::SendableRegistry::Remove(&opModeChooser);
88 virtual void ApplyConfig() = 0;
90 enum class OperationalMode { NonOperational, Tuning, Operational };
91 enum class TuningMode { Voltage, Current, DutyCycle, Speed, Position };
93 inline OperationalMode GetOperationalMode()
const {
return opModeChooser.GetSelected(); }
95 inline TuningMode GetTuningMode()
const {
return tuningModeChooser.GetSelected(); }
103 constexpr units::turns_per_second_t
GetMaxMechanismSpeed() {
return motorSpec.freeSpeed / (rotorToSensor * sensorToMech); }
109 constexpr void SetVoltageCompensation(units::volt_t _voltageCompensation) { voltageCompensation = _voltageCompensation; }
111 constexpr units::volt_t GetVoltageCompensation() {
return voltageCompensation; }
150 virtual units::turns_per_second_t
GetSpeed()
const = 0;
152 virtual void SetEncoderPosition(units::turn_t position) = 0;
154 void SetPosition(units::turn_t position, Output feedforward = 0,
int slot = 0) {
155 if (GetOperationalMode() == OperationalMode::Operational) {
156 WriteLog(
"Requested Position", position);
158 }
else if (GetOperationalMode() == OperationalMode::Tuning &&
ReadLog<bool>(
"Tune"))
164 void SetSpeed(units::turns_per_second_t speed, Output feedforward = 0,
int slot = 0) {
165 if (GetOperationalMode() == OperationalMode::Operational) {
168 }
else if (GetOperationalMode() == OperationalMode::Tuning &&
ReadLog<bool>(
"Tune"))
174 void SetPower(Output power) {
175 if (GetOperationalMode() == OperationalMode::Operational)
177 else if (GetOperationalMode() == OperationalMode::Tuning &&
ReadLog<bool>(
"Tune"))
222 void SetLimits(units::turn_t reverse, units::turn_t forward,
bool saveImmediately =
false) {
235 virtual void SetForwardLimit(units::turn_t forward,
bool saveImmediately =
false) = 0;
245 virtual void SetReverseLimit(units::turn_t reverse,
bool saveImmediately =
false) = 0;
253 virtual void SetNeutralMode(valor::NeutralMode mode,
bool saveImmediately =
false) = 0;
270 virtual void SetGearRatios(
double rotorToSensor,
double sensorToMech,
bool saveImmediately =
false) = 0;
272 virtual void SetOpenLoopRamp(units::second_t time,
bool saveImmediately =
false) = 0;
274 virtual units::turn_t GetAbsoluteEncoderPosition()
const = 0;
276 virtual units::volt_t CalculateAppliedVoltage() = 0;
277 virtual void SetSimState(units::turn_t pos, units::turns_per_second_t vel, units::turns_per_second_squared_t accel) = 0;
279 virtual inline void SetSimState(frc::sim::DCMotorSim& sim) {
280 SetSimState(sim.GetAngularPosition(), sim.GetAngularVelocity(), sim.GetAngularAcceleration());
283 virtual inline void SetSimState(frc::sim::FlywheelSim& sim) {
284 SetSimState(0_tr, sim.GetAngularVelocity(), sim.GetAngularAcceleration());
287 virtual inline void SetSimState(frc::sim::SingleJointedArmSim& sim) { SetSimState(sim.GetAngle(), sim.GetVelocity(), 0_tr_per_s_sq); }
289 constexpr void SetDefaultTuningMode(TuningMode mode) { tuningModeChooser.SetDefaultOption(magic_enum::enum_name(mode)); };
291 frc::DCMotor motorSpec;
292 double rotorToSensor;
308 virtual void PositionSetter(units::turn_t position, Output feedforward = 0,
int slot = 0) = 0;
322 virtual void SpeedSetter(units::turns_per_second_t speed, Output feedforward = 0,
int slot = 0) = 0;
324 virtual void PowerSetter(Output out) = 0;
326 units::volt_t voltageCompensation;
329 void HandleTuningMode() {
331 switch (tuningModeChooser.GetSelected()) {
332 case TuningMode::Voltage:
333 return PowerSetter(units::volt_t{setpoint});
334 case TuningMode::Current:
335 return PowerSetter(units::ampere_t{setpoint});
336 case TuningMode::DutyCycle:
337 return PowerSetter(setpoint);
338 case TuningMode::Speed:
339 WriteLog(
"Requested Speed", units::turns_per_second_t{setpoint});
340 return SpeedSetter(units::turns_per_second_t{setpoint});
341 case TuningMode::Position:
342 WriteLog(
"Requested Position", units::turn_t{setpoint});