YAMS
Yet Another Mechanism System
Loading...
Searching...
No Matches
NovaWrapper.hpp
Go to the documentation of this file.
1// Copyright (c) 2026 Yet Another Software Suite
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#pragma once
5
6#include <thrifty/canEncoder/CanEncoder.h>
7#include <thrifty/core/Motor.h>
8#include <thrifty/nova/Nova.h>
9
10#include <optional>
11#include <string>
12#include <wpi/simulation/DCMotorSim.hpp>
13#include <wpi/util/Alert.hpp>
14
17
19
64 public:
65 // Expose SetVelocity(velocity, feedforwardForce) from the base class alongside the overrides.
67
75 NovaWrapper(thrifty::Nova* nova, wpi::math::DCMotor motor, SmartMotorControllerConfig* config);
77
78 // ---- Configuration ------------------------------------------------------
80 bool ApplyConfig(const SmartMotorControllerConfig& config) override;
81
82 // ---- Simulation ---------------------------------------------------------
84 void SetupSimulation() override;
86 void SimIterate() override;
87
88 // ---- Encoder sync -------------------------------------------------------
90 void SeedRelativeEncoder() override;
93
94 // ---- Open-loop outputs --------------------------------------------------
96 void SetDutyCycle(double dutyCycle) override;
98 double GetDutyCycle() override;
100 void SetVoltage(wpi::units::volt_t voltage) override;
102 wpi::units::volt_t GetVoltage() override;
103
104 // ---- Closed-loop setpoints ----------------------------------------------
106 void SetPosition(wpi::units::turn_t angle) override;
108 void SetPosition(wpi::units::meter_t distance) override;
110 void SetVelocity(wpi::units::turns_per_second_t velocity) override;
118 void SetVelocity(wpi::units::turns_per_second_t velocity,
119 wpi::units::newton_t feedforwardForce) override;
121 void SetVelocity(wpi::units::meters_per_second_t velocity) override;
122
123 // ---- Encoder writes -----------------------------------------------------
125 void SetEncoderPosition(wpi::units::turn_t angle) override;
127 void SetEncoderPosition(wpi::units::meter_t distance) override;
134 void SetEncoderVelocity(wpi::units::turns_per_second_t velocity) override;
141 void SetEncoderVelocity(wpi::units::meters_per_second_t velocity) override;
142
143 // ---- Encoder reads ------------------------------------------------------
145 wpi::units::turn_t GetMechanismPosition() override;
147 wpi::units::turns_per_second_t GetMechanismVelocity() override;
149 wpi::units::turn_t GetRelativeMechanismPosition() override;
151 wpi::units::turns_per_second_t GetRelativeMechanismVelocity() override;
153 wpi::units::turns_per_second_squared_t GetMechanismAcceleration() override;
155 wpi::units::turn_t GetRotorPosition() override;
157 wpi::units::turns_per_second_t GetRotorVelocity() override;
159 wpi::units::meter_t GetMeasurementPosition() override;
161 wpi::units::meters_per_second_t GetMeasurementVelocity() override;
163 wpi::units::meters_per_second_squared_t GetMeasurementAcceleration() override;
165 std::optional<wpi::units::turn_t> GetExternalEncoderMechanismPosition() override;
167 std::optional<wpi::units::turns_per_second_t> GetExternalEncoderMechanismVelocity() override;
168
169 // ---- Motor status -------------------------------------------------------
171 std::optional<wpi::units::ampere_t> GetSupplyCurrent() override;
173 wpi::units::ampere_t GetStatorCurrent() override;
175 wpi::units::celsius_t GetTemperature() override;
177 wpi::math::DCMotor GetDCMotor() override;
178
179 // ---- Configuration setters (live tuning) --------------------------------
181 void SetZeroPower(MotorMode mode) override;
183 void SetMotorInverted(bool inverted) override;
185 void SetEncoderInverted(bool inverted) override;
187 void SetKp(double kP) override;
189 void SetKi(double kI) override;
191 void SetKd(double kD) override;
193 void SetFeedback(double kP, double kI, double kD) override;
195 void SetKs(double kS) override;
197 void SetKv(double kV) override;
199 void SetKa(double kA) override;
201 void SetKg(double kG) override;
203 void SetFeedforward(double kS, double kV, double kA, double kG) override;
205 void SetStatorCurrentLimit(wpi::units::ampere_t currentLimit) override;
207 void SetSupplyCurrentLimit(wpi::units::ampere_t currentLimit) override;
209 void SetClosedLoopRampRate(wpi::units::second_t rampRate) override;
211 void SetOpenLoopRampRate(wpi::units::second_t rampRate) override;
213 void SetMechanismUpperLimit(wpi::units::turn_t upperLimit) override;
215 void SetMechanismLowerLimit(wpi::units::turn_t lowerLimit) override;
217 void SetMechanismLimits(wpi::units::turn_t lower, wpi::units::turn_t upper) override;
219 void SetMechanismLimitsEnabled(bool enabled) override;
221 void SetMeasurementUpperLimit(wpi::units::meter_t upperLimit) override;
223 void SetMeasurementLowerLimit(wpi::units::meter_t lowerLimit) override;
225 void SetMotionProfileMaxVelocity(wpi::units::turns_per_second_t maxVelocity) override;
227 void SetMotionProfileMaxVelocity(wpi::units::meters_per_second_t maxVelocity) override;
229 void SetMotionProfileMaxAcceleration(wpi::units::turns_per_second_squared_t maxAcc) override;
231 void SetMotionProfileMaxAcceleration(wpi::units::meters_per_second_squared_t maxAcc) override;
238 void SetMotionProfileMaxJerk(wpi::units::angular_jerk::turns_per_second_cubed_t maxJerk) override;
240 void SetExponentialProfile(std::optional<double> kV, std::optional<double> kA,
241 std::optional<wpi::units::volt_t> maxInput) override;
249 void SetMechanismGearing(const gearing::MechanismGearing& gearing) override;
251 void SetMechanismCircumference(wpi::units::meter_t circumference) override;
252
260 void* GetMotorController() override;
269 void* GetMotorControllerConfig() override;
270
271 private:
272 thrifty::Nova* m_nova{nullptr};
274 std::optional<thrifty::NovaConfigBatch> m_vendorConfig;
275 wpi::math::DCMotor m_motor;
276 std::optional<wpi::sim::DCMotorSim> m_motorSim;
278 std::optional<thrifty::Motor::FeedbackSensorType> m_dataPortEncoder;
280 thrifty::CanEncoder* m_canEncoder{nullptr};
285 wpi::units::turn_t m_absoluteEncoderDiscontinuityPoint{1.0};
291 double m_simDutyCycle{0.0};
292 math::DerivativeTimeFilter m_accelFilter{20_ms};
293
294 std::optional<wpi::util::Alert> m_systemCoreClosedLoopAlert;
295
297 std::string AlertId(const std::string& alertType) const;
299 double MechanismToRotorRatio() const;
301 double MechanismToExternalEncoderRatio() const;
303 void LoadClosedLoopController(const SmartMotorControllerConfig& config);
305 void ApplyFeedback(double kP, double kI, double kD);
307 void CreateMotorSim();
309 void ApplyExternalEncoder(const SmartMotorControllerConfig& config,
310 thrifty::NovaConfigBatch& novaConfig);
312 std::optional<wpi::units::turn_t> GetExternalEncoderSensorPosition();
314 std::optional<wpi::units::turns_per_second_t> GetExternalEncoderSensorVelocity();
315};
316
317} // namespace yams::motorcontrollers::local
Definition MechanismGearing.hpp:19
Definition SmartMotorControllerConfig.hpp:65
ClosedLoopControllerSlot
Definition SmartMotorControllerConfig.hpp:74
MotorMode
Definition SmartMotorControllerConfig.hpp:70
Definition SmartMotorController.hpp:48
virtual void SetVelocity(wpi::units::turns_per_second_t velocity)=0
Definition NovaWrapper.hpp:63
void SetExponentialProfile(std::optional< double > kV, std::optional< double > kA, std::optional< wpi::units::volt_t > maxInput) override
void SetMechanismCircumference(wpi::units::meter_t circumference) override
void SetFeedforward(double kS, double kV, double kA, double kG) override
void SetEncoderInverted(bool inverted) override
wpi::units::meters_per_second_squared_t GetMeasurementAcceleration() override
wpi::math::DCMotor GetDCMotor() override
wpi::units::turn_t GetRotorPosition() override
void SetMeasurementUpperLimit(wpi::units::meter_t upperLimit) override
void SetMeasurementLowerLimit(wpi::units::meter_t lowerLimit) override
wpi::units::meters_per_second_t GetMeasurementVelocity() override
wpi::units::volt_t GetVoltage() override
wpi::units::turns_per_second_t GetRotorVelocity() override
void SetMotorInverted(bool inverted) override
void SetSupplyCurrentLimit(wpi::units::ampere_t currentLimit) override
void SetFeedback(double kP, double kI, double kD) override
void SetOpenLoopRampRate(wpi::units::second_t rampRate) override
bool ApplyConfig(const SmartMotorControllerConfig &config) override
wpi::units::turn_t GetRelativeMechanismPosition() override
void SetEncoderPosition(wpi::units::turn_t angle) override
void SetZeroPower(MotorMode mode) override
void SetVelocity(wpi::units::meters_per_second_t velocity) override
wpi::units::turn_t GetMechanismPosition() override
wpi::units::turns_per_second_t GetMechanismVelocity() override
void SetEncoderVelocity(wpi::units::meters_per_second_t velocity) override
void SetVelocity(wpi::units::turns_per_second_t velocity, wpi::units::newton_t feedforwardForce) override
void SetMechanismLimits(wpi::units::turn_t lower, wpi::units::turn_t upper) override
void SetMechanismUpperLimit(wpi::units::turn_t upperLimit) override
wpi::units::celsius_t GetTemperature() override
void SetMotionProfileMaxJerk(wpi::units::angular_jerk::turns_per_second_cubed_t maxJerk) override
wpi::units::meter_t GetMeasurementPosition() override
NovaWrapper(thrifty::Nova *nova, wpi::math::DCMotor motor, SmartMotorControllerConfig *config)
std::optional< wpi::units::ampere_t > GetSupplyCurrent() override
void SetMechanismLimitsEnabled(bool enabled) override
void SetEncoderPosition(wpi::units::meter_t distance) override
wpi::units::turns_per_second_t GetRelativeMechanismVelocity() override
wpi::units::turns_per_second_squared_t GetMechanismAcceleration() override
void SetEncoderVelocity(wpi::units::turns_per_second_t velocity) override
void SetStatorCurrentLimit(wpi::units::ampere_t currentLimit) override
void SetVelocity(wpi::units::turns_per_second_t velocity) override
wpi::units::ampere_t GetStatorCurrent() override
std::optional< wpi::units::turns_per_second_t > GetExternalEncoderMechanismVelocity() override
void SetMotionProfileMaxVelocity(wpi::units::meters_per_second_t maxVelocity) override
void SetClosedLoopSlot(ClosedLoopControllerSlot slot) override
void SetVoltage(wpi::units::volt_t voltage) override
void SetDutyCycle(double dutyCycle) override
void SetMotionProfileMaxAcceleration(wpi::units::meters_per_second_squared_t maxAcc) override
void SetMechanismGearing(const gearing::MechanismGearing &gearing) override
void SetMotionProfileMaxVelocity(wpi::units::turns_per_second_t maxVelocity) override
void SetPosition(wpi::units::meter_t distance) override
std::optional< wpi::units::turn_t > GetExternalEncoderMechanismPosition() override
SmartMotorControllerConfig & GetConfig() override
void SetMechanismLowerLimit(wpi::units::turn_t lowerLimit) override
void SetPosition(wpi::units::turn_t angle) override
void SetClosedLoopRampRate(wpi::units::second_t rampRate) override
void SetMotionProfileMaxAcceleration(wpi::units::turns_per_second_squared_t maxAcc) override
Definition NovaWrapper.hpp:18