import org.littletonrobotics.junction.AutoLogOutput;
import org.littletonrobotics.junction.Logger;
+import com.ctre.phoenix6.BaseStatusSignal;
import com.pathplanner.lib.util.PathPlannerLogging;
import edu.wpi.first.math.VecBuilder;
@Override
public void periodic() {
odometryLock.lock(); // Prevents odometry updates while reading data
+
+ java.util.List<BaseStatusSignal> signals = new java.util.ArrayList<>();
+ var gyroYawSignal = gyroIO.getYawSignal();
+ if (gyroYawSignal != null) {
+ signals.add(gyroYawSignal);
+ }
+ for (var module : modules) {
+ signals.add(module.getDrivePositionSignal());
+ signals.add(module.getTurnPositionSignal());
+ signals.add(module.getTurnAbsolutePositionSignal());
+ }
+ if (!signals.isEmpty()) {
+ BaseStatusSignal.waitForAll(0.1, signals.toArray(new BaseStatusSignal[0]));
+ }
+
gyroIO.updateInputs(gyroInputs);
Logger.processInputs("Drive/Gyro", gyroInputs);
for (var module : modules) {
import com.ctre.phoenix6.configs.CANcoderConfiguration;
import com.ctre.phoenix6.configs.ClosedLoopRampsConfigs;
import com.ctre.phoenix6.configs.CurrentLimitsConfigs;
+import com.ctre.phoenix6.configs.FeedbackConfigs;
import com.ctre.phoenix6.configs.MagnetSensorConfigs;
import com.ctre.phoenix6.configs.MotorOutputConfigs;
import com.ctre.phoenix6.configs.OpenLoopRampsConfigs;
import com.ctre.phoenix6.controls.VoltageOut;
import com.ctre.phoenix6.controls.PositionDutyCycle;
import com.ctre.phoenix6.hardware.CANcoder;
-import com.ctre.phoenix6.hardware.ParentDevice;
import com.ctre.phoenix6.hardware.TalonFX;
+import com.ctre.phoenix6.signals.FeedbackSensorSourceValue;
import com.ctre.phoenix6.signals.SensorDirectionValue;
import edu.wpi.first.math.MathUtil;
turnVelocity,
turnAppliedVolts,
turnCurrent);
- ParentDevice.optimizeBusUtilizationForAll(driveMotor, angleMotor);
setDesiredState(new SwerveModuleState(0, getAngle()), false);
}
private void configAngleMotor() {
angleMotor.getConfigurator().apply(new TalonFXConfiguration());
+
+ // configure FusedCANcoder feedback
+ FeedbackConfigs feedbackConfigs = new FeedbackConfigs();
+ feedbackConfigs.FeedbackSensorSource = FeedbackSensorSourceValue.FusedCANcoder;
+ feedbackConfigs.FeedbackRemoteSensorID = moduleConstants.getEncoderPort();
+ angleMotor.getConfigurator().apply(feedbackConfigs);
+
CurrentLimitsConfigs config = new CurrentLimitsConfigs();
config.SupplyCurrentLimitEnable = DriveConstants.STEER_ENABLE_CURRENT_LIMIT;
config.SupplyCurrentLimit = DriveConstants.STEER_CONTINUOUS_CURRENT_LIMIT;
angleMotor.setNeutralMode(DriveConstants.STEER_NEUTRAL_MODE);
angleMotor.setPosition(0);
+ // optimize bus utilization for angle motor
+ angleMotor.optimizeBusUtilization();
+
resetToAbsolute();
}
driveMotor.getConfigurator().apply(new ClosedLoopRampsConfigs().withDutyCycleClosedLoopRampPeriod(DriveConstants.CLOSE_LOOP_RAMP));
driveMotor.setNeutralMode(DriveConstants.DRIVE_NEUTRAL_MODE);
+ // optimize bus utilization for drive motor
+ driveMotor.optimizeBusUtilization();
+
}
public SwerveModuleState getState() {
return inputs.odometryTimestamps;
}
+ /** returns the drive position status signal for time-synced odometry. */
+ public StatusSignal<Angle> getDrivePositionSignal() {
+ return drivePosition;
+ }
+
+ /** returns the turn position status signal for time-synced odometry. */
+ public StatusSignal<Angle> getTurnPositionSignal() {
+ return turnPosition;
+ }
+
+ /** returns the turn absolute position status signal for time-synced odometry. */
+ public StatusSignal<Angle> getTurnAbsolutePositionSignal() {
+ return turnAbsolutePosition;
+ }
+
}
\ No newline at end of file