59 using Output = std::variant<units::volt_t, units::ampere_t, units::scalar_t>;
64 constexpr Signal(T value, units::second_t timestamp) : value{value}, timestamp{timestamp} {}
66 inline const T* operator->()
const {
return &value; }
68 inline const T& operator*()
const {
return value; }
70 constexpr units::second_t GetTimestamp()
const {
return timestamp; }
74 units::second_t timestamp;
77 enum class OperationalMode {
84 enum class ControlMode {
96 : motorSpec{_motorSpec}, rotorToSensor(1), sensorToMech(1), voltageCompensation(units::volt_t{12.0}) {
97 tuningModeChooser.SetDefaultOption(magic_enum::enum_name(ControlMode::VOLTAGE), ControlMode::VOLTAGE);
98 for (ControlMode mode : magic_enum::enum_values<ControlMode>())
99 tuningModeChooser.AddOption(magic_enum::enum_name(mode), mode);
101 opModeChooser.SetDefaultOption(magic_enum::enum_name(OperationalMode::OPERATIONAL), OperationalMode::OPERATIONAL);
102 for (OperationalMode mode : magic_enum::enum_values<OperationalMode>())
103 opModeChooser.AddOption(magic_enum::enum_name(mode), mode);
105 LogChild(
"Tuning Mode", &tuningModeChooser);
106 LogChild(
"Operational Mode", &opModeChooser);
111 virtual void ApplyConfig() = 0;
121 constexpr double GetGearRatio()
const {
return rotorToSensor * sensorToMech; }
127 constexpr void SetVoltageCompensation(units::volt_t _voltageCompensation) { voltageCompensation = _voltageCompensation; }
129 constexpr units::volt_t GetVoltageCompensation()
const {
return voltageCompensation; }
174 virtual void SetEncoderPosition(units::turn_t position) = 0;
176 void SetPosition(units::turn_t position, Output feedforward = 0,
int slot = 0) {
177 if (opModeChooser.GetSelected() == OperationalMode::OPERATIONAL) {
178 setpoint = position.value();
179 controlMode = ControlMode::POSITION;
181 }
else if (opModeChooser.GetSelected() == OperationalMode::TUNING)
187 void SetSpeed(units::turns_per_second_t speed, Output feedforward = 0,
int slot = 0) {
188 if (opModeChooser.GetSelected() == OperationalMode::OPERATIONAL) {
189 setpoint = speed.value();
190 controlMode = ControlMode::SPEED;
192 }
else if (opModeChooser.GetSelected() == OperationalMode::TUNING)
198 void SetPower(Output power) {
199 if (opModeChooser.GetSelected() == OperationalMode::OPERATIONAL) {
200 std::visit([
this](
auto&& power) { setpoint = power.value(); }, power);
201 controlMode =
static_cast<ControlMode
>(power.index());
203 }
else if (opModeChooser.GetSelected() == OperationalMode::TUNING)
248 void SetLimits(units::turn_t reverse, units::turn_t forward,
bool saveImmediately =
false) {
261 virtual void SetForwardLimit(units::turn_t forward,
bool saveImmediately =
false) = 0;
271 virtual void SetReverseLimit(units::turn_t reverse,
bool saveImmediately =
false) = 0;
279 virtual void SetNeutralMode(valor::NeutralMode mode,
bool saveImmediately =
false) = 0;
296 virtual void SetGearRatios(
double rotorToSensor,
double sensorToMech,
bool saveImmediately =
false) = 0;
298 virtual void SetOpenLoopRamp(units::second_t time,
bool saveImmediately =
false) = 0;
300 virtual units::turn_t GetAbsoluteEncoderPosition()
const = 0;
302 virtual units::volt_t CalculateAppliedVoltage() = 0;
303 virtual void SetSimState(units::turn_t pos, units::turns_per_second_t vel, units::turns_per_second_squared_t accel) = 0;
305 virtual inline void SetSimState(frc::sim::DCMotorSim& sim) {
306 SetSimState(sim.GetAngularPosition(), sim.GetAngularVelocity(), sim.GetAngularAcceleration());
309 virtual inline void SetSimState(frc::sim::FlywheelSim& sim) {
310 SetSimState(0_tr, sim.GetAngularVelocity(), sim.GetAngularAcceleration());
313 virtual inline void SetSimState(frc::sim::SingleJointedArmSim& sim) { SetSimState(sim.GetAngle(), sim.GetVelocity(), 0_tr_per_s_sq); }
316 WriteLog(
"Control Mode", controlMode);
317 if (opModeChooser.GetSelected() == OperationalMode::TUNING)
318 setpoint = ReadLog(
"Setpoint", setpoint);
320 WriteLog(
"Setpoint", setpoint);
323 frc::DCMotor motorSpec;
338 virtual void PositionSetter(units::turn_t position, Output feedforward = 0,
int slot = 0) = 0;
352 virtual void SpeedSetter(units::turns_per_second_t speed, Output feedforward = 0,
int slot = 0) = 0;
354 virtual void PowerSetter(Output out) = 0;
356 double rotorToSensor;
358 units::volt_t voltageCompensation;
361 void HandleTuningMode() {
362 controlMode = tuningModeChooser.GetSelected();
363 switch (tuningModeChooser.GetSelected()) {
364 case ControlMode::VOLTAGE:
365 return PowerSetter(units::volt_t{setpoint});
366 case ControlMode::CURRENT:
367 return PowerSetter(units::ampere_t{setpoint});
368 case ControlMode::DUTY_CYCLE:
369 return PowerSetter(setpoint);
370 case ControlMode::SPEED:
371 return SpeedSetter(units::turns_per_second_t{setpoint});
372 case ControlMode::POSITION:
377 frc::SendableChooser<ControlMode> tuningModeChooser;
378 frc::SendableChooser<OperationalMode> opModeChooser;
379 ControlMode controlMode = ControlMode::DUTY_CYCLE;
380 double setpoint = 0.0;