7#include <units/current.h>
14#include "ctre/Phoenix.h"
18 namespace falcon_config {
101 TalonFXConfiguration config;
102 auto timeout = configTimeout.to<
int>();
105 motorController.SetInverted(T::inverted);
108 motorController.SetSensorPhase(T::sensorPhase);
111 motorController.SetNeutralMode(T::neutralMode);
114 constexpr units::volt_t voltage = T::voltCompSat;
115 config.voltageCompSaturation = voltage.to<
double>();
116 motorController.EnableVoltageCompensation(
true);
118 motorController.EnableVoltageCompensation(
false);
121 ctre::phoenix::motorcontrol::can::FilterConfiguration filterConfig;
122 filterConfig.remoteSensorDeviceID = T::remoteFilter0_addr.address;
123 filterConfig.remoteSensorSource = T::remoteFilter0_type;
124 config.remoteFilter0 = filterConfig;
127 config.nominalOutputForward = T::nominalOutputForward;
130 config.nominalOutputReverse = T::nominalOutputReverse;
133 config.peakOutputForward = T::peakOutputForward;
136 config.peakOutputReverse = T::peakOutputReverse;
139 config.primaryPID.selectedFeedbackSensor = T::pid0_selectedSensor;
142 config.slot0.kP = T::pid0_kP;
145 config.slot0.kI = T::pid0_kI;
148 config.slot0.kD = T::pid0_kD;
151 config.slot0.kF = T::pid0_kF;
154 config.slot0.integralZone = T::pid0_iZone;
157 config.slot0.allowableClosedloopError = T::pid0_allowableError;
160 config.slot1.kP = T::pid1_kP;
163 config.slot1.kI = T::pid1_kI;
166 config.slot1.kD = T::pid1_kD;
169 config.slot1.kF = T::pid1_kF;
172 config.slot1.integralZone = T::pid1_iZone;
175 config.slot1.allowableClosedloopError = T::pid1_allowableError;
179 config.supplyCurrLimit.enable =
true;
181 constexpr units::ampere_t currentLimit = T::supplyCurrentLimit;
182 static_assert(currentLimit.to<
double>() > 0,
"Current limit must be positive");
183 config.supplyCurrLimit.currentLimit = currentLimit.to<
double>();
186 constexpr units::ampere_t currentThreshold = T::supplyCurrentThreshold;
187 static_assert(currentThreshold.to<
double>() > 0,
"Current threshold must be positive");
188 config.supplyCurrLimit.triggerThresholdCurrent = currentThreshold.to<
double>();
191 constexpr units::second_t currentThresholdTime = T::supplyCurrentThresholdTime;
192 static_assert(currentThresholdTime.to<
double>() >= 0,
"Current threshold time must be non-negative");
193 config.supplyCurrLimit.triggerThresholdTime = currentThresholdTime.to<
double>();
199 constexpr ctre::phoenix::motorcontrol::LimitSwitchSource source = T::forwardLimit_source;
200 if constexpr (source != ctre::phoenix::motorcontrol::LimitSwitchSource_Deactivated &&
201 source != ctre::phoenix::motorcontrol::LimitSwitchSource_FeedbackConnector) {
204 if constexpr (source != ctre::phoenix::motorcontrol::LimitSwitchSource_Deactivated) {
206 T::forwardLimit_normalState != ctre::phoenix::motorcontrol::LimitSwitchNormal_Disabled,
207 "Forward limit switch configuration requires both source and normal state");
209 config.forwardLimitSwitchSource = T::forwardLimit_source;
213 T::forwardLimit_source != ctre::phoenix::motorcontrol::LimitSwitchSource_Deactivated &&
214 T::forwardLimit_source != ctre::phoenix::motorcontrol::LimitSwitchSource_FeedbackConnector,
215 "Forward limit switch device ID has no effect when limit source is not remote");
216 config.forwardLimitSwitchDeviceID = T::forwardLimit_deviceID;
219 if constexpr (T::forwardLimit_normalState != ctre::phoenix::motorcontrol::LimitSwitchNormal_Disabled) {
222 config.forwardLimitSwitchNormal = T::forwardLimit_normalState;
228 constexpr ctre::phoenix::motorcontrol::LimitSwitchSource source = T::reverseLimit_source;
229 if constexpr (source != ctre::phoenix::motorcontrol::LimitSwitchSource_Deactivated &&
230 source != ctre::phoenix::motorcontrol::LimitSwitchSource_FeedbackConnector) {
233 if constexpr (source != ctre::phoenix::motorcontrol::LimitSwitchSource_Deactivated) {
235 T::reverseLimit_normalState != ctre::phoenix::motorcontrol::LimitSwitchNormal_Disabled,
236 "Reverse limit switch configuration requires both source and normal state");
238 config.reverseLimitSwitchSource = T::reverseLimit_source;
242 T::reverseLimit_source != ctre::phoenix::motorcontrol::LimitSwitchSource_Deactivated &&
243 T::reverseLimit_source != ctre::phoenix::motorcontrol::LimitSwitchSource_FeedbackConnector,
244 "Reverse limit switch device ID has no effect when limit source is not remote");
245 config.reverseLimitSwitchDeviceID = T::reverseLimit_deviceID;
248 if constexpr (T::reverseLimit_normalState != ctre::phoenix::motorcontrol::LimitSwitchNormal_Disabled) {
251 config.reverseLimitSwitchNormal = T::reverseLimit_normalState;
255 static_assert(T::neutralDeadband >= 0.001,
"Neutral deadband must be greater than 0.001 (0.1%)");
256 static_assert(T::neutralDeadband <= 0.25,
"Neutral deadband must be less than 0.25 (25%)");
257 config.neutralDeadband = T::neutralDeadband;
264 auto retVal = motorController.ConfigAllSettings(config, timeout);
266 std::cout <<
"Error code (" << motorController.GetDeviceID() <<
"): " << retVal <<
'\n';
283 template <
typename CompetitionConfig,
typename PracticeConfig>
285 units::millisecond_t configTimeout,
289 return FalconConfig<CompetitionConfig>(motorController, configTimeout);
292 return FalconConfig<PracticeConfig>(motorController, configTimeout);
#define HAS_MEMBER(X)
Helper function generator to detect if a namespace has a member defined.
Definition: compile_time_member_check.h:14
bool FalconConfig(TalonFX &motorController, units::millisecond_t configTimeout)
Configures a CTRE Falcon with only the fields provided. All other fields are given the factory defaul...
Definition: falcon_config.h:100
void SetMotorStatusFrameRates(BaseTalon &motor, MotorPresetMode motorMode)
Set motor controller status frame update periods based on the motor preset.
Definition: status_frame_config.cpp:7
Definition: swap_controllers_command.h:12
RobotInstance
Differentiates between practice robot and competition robot.
Definition: config_types.h:13
@ Competition
Competition robot.
@ Practice
Practice robot.
Definition: sensor_conversions.h:14
Definition: falcon_config.h:20
Definition: falcon_config.h:21
Definition: falcon_config.h:22
Definition: falcon_config.h:23
Definition: falcon_config.h:24
Definition: falcon_config.h:25
Definition: falcon_config.h:26
Definition: falcon_config.h:27
Definition: falcon_config.h:28
Definition: falcon_config.h:29
Definition: falcon_config.h:30
Definition: falcon_config.h:31
Definition: falcon_config.h:32
Definition: falcon_config.h:33
Definition: falcon_config.h:34
Definition: falcon_config.h:35
Definition: falcon_config.h:36
Definition: falcon_config.h:37
Definition: falcon_config.h:38
Definition: falcon_config.h:39
Definition: falcon_config.h:40
Definition: falcon_config.h:41
Definition: falcon_config.h:42
Definition: falcon_config.h:43
Definition: falcon_config.h:44
Definition: falcon_config.h:45
Definition: falcon_config.h:46
Definition: falcon_config.h:47
Definition: falcon_config.h:48
Definition: falcon_config.h:53
Definition: falcon_config.h:49
Definition: falcon_config.h:50
Definition: falcon_config.h:51
Definition: falcon_config.h:52