167 void SetVelocity(wpi::units::turns_per_second_t velocity)
override;
176 wpi::units::newton_t feedforwardForce)
override;
183 void SetVelocity(wpi::units::meters_per_second_t velocity)
override;
345 std::optional<wpi::units::volt_t> maxInput)
override;
378 rev::spark::SparkBase* m_spark{
nullptr};
379 rev::spark::SparkClosedLoopController* m_sparkPid{
nullptr};
380 rev::spark::SparkRelativeEncoder* m_relEncoder{
nullptr};
382 rev::spark::SparkAbsoluteEncoder* m_absEncoder{
nullptr};
384 rev::RelativeEncoder* m_quadratureEncoder{
nullptr};
386 rev::detached::DetachedEncoder* m_detachedEncoder{
nullptr};
388 double m_detachedEncoderZeroOffset{0.0};
390 double m_absEncoderZeroOffset{0.0};
395 wpi::units::turn_t m_absoluteEncoderDiscontinuityPoint{1.0};
397 wpi::units::turn_t m_detachedEncoderSimAngle{0.0};
398 wpi::math::DCMotor m_motor;
402 std::optional<rev::spark::SparkMaxConfig> m_maxConfig;
403 std::optional<rev::spark::SparkFlexConfig> m_flexConfig;
405 std::optional<wpi::sim::DCMotorSim> m_motorSim;
406 std::optional<rev::spark::SparkSim> m_sparkSim;
407 std::optional<rev::spark::SparkRelativeEncoderSim> m_relEncoderSim;
408 std::optional<rev::spark::SparkAbsoluteEncoderSim> m_absEncoderSim;
409 std::optional<rev::spark::SparkMaxAlternateEncoderSim> m_altEncoderSim;
410 std::optional<rev::spark::SparkExternalEncoderSim> m_extEncoderSim;
411 math::DerivativeTimeFilter m_accelFilter{20_ms};
417 double m_mechanismToFeedbackSensorRatio{1.0};
419 bool m_velocityGainsApplied{
false};
421 std::optional<wpi::math::TrapezoidProfile<wpi::units::turns>::State> m_simMaxMotionState;
423 rev::spark::SparkLowLevel::ControlType m_positionControlType{
424 rev::spark::SparkLowLevel::ControlType::kPosition};
425 rev::spark::SparkLowLevel::ControlType m_velocityControlType{
426 rev::spark::SparkLowLevel::ControlType::kVelocity};
428 rev::spark::ClosedLoopSlot m_closedLoopSlot{rev::spark::ClosedLoopSlot::kSlot0};
430 std::optional<wpi::util::Alert> m_rioControllerAlert;
432 std::optional<wpi::util::Alert> m_externalEncoderGearingDiscontinuityAlert;
434 std::optional<wpi::util::Alert> m_feedbackNotAppliedAlert;
437 std::optional<wpi::units::second_t> m_velocityMeasurementDelay;
439 wpi::units::second_t m_velocitySignalPeriod{0.02};
441 std::optional<wpi::util::Alert> m_feedforwardNotAppliedAlert;
443 void Init(rev::spark::SparkBase* spark, wpi::math::DCMotor motor,
444 SmartMotorControllerConfig* config);
446 rev::spark::SparkBaseConfig& SparkConfig();
448 bool ConfigureSpark(
const std::function<rev::REVLibError()>& call,
449 wpi::units::second_t retryFor = wpi::units::second_t{0.015});
459 bool ConfigureSpark(rev::spark::SparkBaseConfig& config);
468 bool ConfigureSpark(rev::spark::ClosedLoopConfig& closedLoop);
477 bool ConfigureSpark(rev::spark::FeedForwardConfig& feedForward);
479 rev::PersistMode PersistModeForState()
const;
481 void ConfigureAsync();
483 std::string AlertId(
const std::string& alertType)
const;
485 void ApplyFeedback(
double kP,
double kI,
double kD);
487 double MechanismToExternalEncoderRatio()
const;
489 void UpdateFeedbackSensorRatio(
const SmartMotorControllerConfig& config);
491 void WriteSparkPID(
double kP,
double kI,
double kD, rev::spark::ClosedLoopSlot slot);
493 void WriteSparkFeedforward(
double kS,
double kV,
double kA, rev::spark::ClosedLoopSlot slot);
497 void WriteMotionProfile(
const SmartMotorControllerConfig& config);
499 void WriteClosedLoopTolerance(
const SmartMotorControllerConfig& config);
501 void WriteSoftLimits(
const SmartMotorControllerConfig& config);
503 void RewriteScaledParameters();
505 void UseVelocityGains(
bool velocity);
507 void ApplyExternalEncoder(
const SmartMotorControllerConfig& config,
bool useExternalEncoder);
509 std::optional<wpi::units::turn_t> GetExternalEncoderSensorPosition();
511 std::optional<wpi::units::turns_per_second_t> GetExternalEncoderSensorVelocity();
513 void IterateSimulatedMaxMotionPosition();
518 void IterateSimulatedArmGravity();
520 bool SimulatingMaxMotion()
const;
522 bool HasExponentialProfile()
const;