@@ -41,6 +41,7 @@ public class FXSwerveModule implements SwerveModule {
4141 private final TalonFX driveTalon ;
4242 private final double azimuthCountsPerRev ;
4343 private final double driveCountsPerRev ;
44+ private final double azimuthPulseWidthCPR ;
4445 private final double driveGearRatio ;
4546 private final double wheelCircumferenceMeters ;
4647 private final double driveDeadbandMetersPerSecond ;
@@ -52,7 +53,7 @@ public class FXSwerveModule implements SwerveModule {
5253 private int closedLoopSlot ;
5354 private int azimuthSlot ;
5455 private boolean compensateLatency ;
55- private double azimuthPositionOffset ;
56+ private double azimuthPositionOffset = 0.0 ;
5657
5758 // Status Signals
5859 private StatusSignal <Angle > drivePosition ;
@@ -64,6 +65,7 @@ private FXSwerveModule(FXBuilder builder) {
6465 driveTalon = builder .driveTalon ;
6566 azimuthCountsPerRev = builder .azimuthCountsPerRev ;
6667 driveCountsPerRev = builder .driveCountsPerRev ;
68+ azimuthPulseWidthCPR = builder .azimuthPulseWidthCPR ;
6769 driveGearRatio = builder .driveGearRatio ;
6870 wheelCircumferenceMeters = Math .PI * Inches .of (builder .wheelDiameterInches ).in (Meters );
6971 driveDeadbandMetersPerSecond = builder .driveDeadbandMetersPerSecond ;
@@ -169,7 +171,7 @@ public void loadAndSetAzimuthZeroReference() {
169171 index ,
170172 azimuthAbsoluteCounts - reference );
171173
172- azimuthPositionOffset = reference ;
174+ azimuthPositionOffset = reference / azimuthPulseWidthCPR ;
173175 setAzimuthPosition (azimuthAbsoluteCounts );
174176 }
175177
@@ -182,17 +184,23 @@ public TalonFX getDriveTalon() {
182184 }
183185
184186 private double getAzimuthAbsoluteEncoderCounts () {
185- double extraRotations =
186- azimuthPosition .getValueAsDouble () > 0
187- ? Math .floor (azimuthPosition .getValueAsDouble ())
188- : Math .ceil (azimuthPosition .getValueAsDouble ());
189- return azimuthPosition .getValueAsDouble () - extraRotations ; // correct to within one rotation
187+ // double extraRotations =
188+ // azimuthPosition.getValueAsDouble() > 0
189+ // ? Math.floor(azimuthPosition.getValueAsDouble())
190+ // : Math.ceil(azimuthPosition.getValueAsDouble());
191+ // return azimuthPosition.getValueAsDouble() - extraRotations; // correct to within one
192+ // rotation
193+ return ((int ) (azimuthPosition .getValueAsDouble () * azimuthPulseWidthCPR )) & 0xFFF ;
190194 }
191195
192196 private double getAzimuthEcoderPosition () {
193197 return azimuthPosition .getValueAsDouble () - azimuthPositionOffset ;
194198 }
195199
200+ public double getAzimuthPositionOffset () {
201+ return azimuthPositionOffset ;
202+ }
203+
196204 @ Override
197205 public Rotation2d getAzimuthRotation2d () {
198206 double azimuthCounts = getAzimuthEcoderPosition ();
@@ -312,6 +320,7 @@ public static class FXBuilder {
312320 public static final double kDefaultTalonFXCountsPerRev = 1.0 ;
313321 private double azimuthCountsPerRev = kDefaultTalonFXCountsPerRev ;
314322 private double driveCountsPerRev = kDefaultTalonFXCountsPerRev ;
323+ private double azimuthPulseWidthCPR = 4096.0 ;
315324
316325 private TalonFXS azimuthTalon ;
317326 private TalonFX driveTalon ;
@@ -357,6 +366,11 @@ public FXBuilder azimuthEncoderCountsPerRevolution(double countsPerRev) {
357366 return this ;
358367 }
359368
369+ public FXBuilder azimuthPulseWidthCPR (double azimuthPulseWidthCPR ) {
370+ this .azimuthPulseWidthCPR = azimuthPulseWidthCPR ;
371+ return this ;
372+ }
373+
360374 public FXBuilder driveDeadbandMetersPerSecond (double driveDeadbandMetersPerSecond ) {
361375 this .driveDeadbandMetersPerSecond = driveDeadbandMetersPerSecond ;
362376 return this ;
@@ -416,7 +430,13 @@ private void validateSwerveModuleObject(FXSwerveModule module) {
416430 if (module .azimuthCountsPerRev <= 0 )
417431 throw new IllegalArgumentException (
418432 "azimuth encoder counts per revolution must be greater than zero." );
419-
433+ if (module .azimuthPulseWidthCPR <= 0 )
434+ throw new IllegalArgumentException ("azimuth pulse width cpr must be greater than zero" );
435+ // TalonFXSConfiguration azimuthConfig = new TalonFXSConfiguration();
436+ // module.azimuthTalon.getConfigurator().refresh(azimuthConfig);
437+ // if (azimuthConfig.ExternalFeedback.ExternalFeedbackSensorSource
438+ // != ExternalFeedbackSensorSourceValue.PulseWidth)
439+ // throw new IllegalArgumentException("Azimuth must use Pulse Width Feedback");
420440 if (module .driveCountsPerRev <= 0 )
421441 throw new IllegalArgumentException (
422442 "drive encoder counts per revolution must be greater than zero." );
0 commit comments