diff --git a/src/main/java/swervelib/SwerveDrive.java b/src/main/java/swervelib/SwerveDrive.java index f34cce7f9..d4833dfaf 100644 --- a/src/main/java/swervelib/SwerveDrive.java +++ b/src/main/java/swervelib/SwerveDrive.java @@ -71,7 +71,7 @@ /** * Swerve Drive class representing and controlling the swerve drive. */ -public class SwerveDrive +public class SwerveDrive implements AutoCloseable { /** @@ -334,6 +334,16 @@ public SwerveDrive( HAL.report(kResourceType_RobotDrive, kRobotDriveSwerve_YAGSL); } + @Override + public void close() { + imu.close(); + tunerXRecommendation.close(); + + for (var module : swerveModules) { + module.close(); + } + } + /** * Update the cache validity period for the robot. * diff --git a/src/main/java/swervelib/SwerveModule.java b/src/main/java/swervelib/SwerveModule.java index d0ad53568..67b751d23 100644 --- a/src/main/java/swervelib/SwerveModule.java +++ b/src/main/java/swervelib/SwerveModule.java @@ -34,7 +34,7 @@ /** * The Swerve Module class which represents and controls Swerve Modules for the swerve drive. */ -public class SwerveModule +public class SwerveModule implements AutoCloseable { /** @@ -267,6 +267,13 @@ public SwerveModule(int moduleNumber, SwerveModuleConfiguration moduleConfigurat "swerve/modules/" + configuration.name + "/Angle Setpoint").publish(); } + @Override + public void close() { + angleMotor.close(); + driveMotor.close(); + absoluteEncoder.close(); + } + /** * Get the default {@link SimpleMotorFeedforward} for the swerve module drive motor. * diff --git a/src/main/java/swervelib/encoders/AnalogAbsoluteEncoderSwerve.java b/src/main/java/swervelib/encoders/AnalogAbsoluteEncoderSwerve.java index 11016f652..3d91c6f22 100644 --- a/src/main/java/swervelib/encoders/AnalogAbsoluteEncoderSwerve.java +++ b/src/main/java/swervelib/encoders/AnalogAbsoluteEncoderSwerve.java @@ -47,6 +47,12 @@ public AnalogAbsoluteEncoderSwerve(AnalogInput encoder) AlertType.kWarning); } + @Override + public void close() + { + encoder.close(); + } + /** * Construct the Encoder given the analog input channel. * diff --git a/src/main/java/swervelib/encoders/CANCoderSwerve.java b/src/main/java/swervelib/encoders/CANCoderSwerve.java index a22c785c7..782012dea 100644 --- a/src/main/java/swervelib/encoders/CANCoderSwerve.java +++ b/src/main/java/swervelib/encoders/CANCoderSwerve.java @@ -112,6 +112,12 @@ public CANCoderSwerve(int id, String canbus) AlertType.kWarning); } + @Override + public void close() + { + encoder.close(); + } + /** * Reset the encoder to factory defaults. */ diff --git a/src/main/java/swervelib/encoders/CanAndMagSwerve.java b/src/main/java/swervelib/encoders/CanAndMagSwerve.java index 429715812..d33f04934 100644 --- a/src/main/java/swervelib/encoders/CanAndMagSwerve.java +++ b/src/main/java/swervelib/encoders/CanAndMagSwerve.java @@ -29,6 +29,12 @@ public CanAndMagSwerve(int canid) settings = encoder.getSettings(); } + @Override + public void close() + { + encoder.close(); + } + /** * Reset the encoder to factory defaults. *

diff --git a/src/main/java/swervelib/encoders/DIODutyCycleEncoderSwerve.java b/src/main/java/swervelib/encoders/DIODutyCycleEncoderSwerve.java index 2f2b16d82..770902d0d 100644 --- a/src/main/java/swervelib/encoders/DIODutyCycleEncoderSwerve.java +++ b/src/main/java/swervelib/encoders/DIODutyCycleEncoderSwerve.java @@ -47,6 +47,12 @@ public DIODutyCycleEncoderSwerve(int pin) } + @Override + public void close() + { + encoder.close(); + } + /** * Configure the inversion state of the encoder. * diff --git a/src/main/java/swervelib/encoders/SparkFlexEncoderSwerve.java b/src/main/java/swervelib/encoders/SparkFlexEncoderSwerve.java index 00ef7d4b7..4a0869a6f 100644 --- a/src/main/java/swervelib/encoders/SparkFlexEncoderSwerve.java +++ b/src/main/java/swervelib/encoders/SparkFlexEncoderSwerve.java @@ -62,6 +62,15 @@ public SparkFlexEncoderSwerve(SwerveMotor motor, int conversionFactor) } } + @Override + public void close() + { + // SPARK Flex encoder gets closed with the motor + // I don't think an encoder getting closed should + // close the entire motor so i will keep this empty + // sparkFlex.close(); + } + /** * Run the configuration until it succeeds or times out. * diff --git a/src/main/java/swervelib/encoders/SparkMaxAnalogEncoderSwerve.java b/src/main/java/swervelib/encoders/SparkMaxAnalogEncoderSwerve.java index 84c6b6c6b..bda63039f 100644 --- a/src/main/java/swervelib/encoders/SparkMaxAnalogEncoderSwerve.java +++ b/src/main/java/swervelib/encoders/SparkMaxAnalogEncoderSwerve.java @@ -64,6 +64,15 @@ public SparkMaxAnalogEncoderSwerve(SwerveMotor motor, double maxVoltage) } + @Override + public void close() + { + // SPARK MAX Analog encoder gets closed with the motor + // I don't think an encoder getting closed should + // close the entire motor so i will keep this empty + // sparkMax.close(); + } + /** * Run the configuration until it succeeds or times out. * diff --git a/src/main/java/swervelib/encoders/SparkMaxEncoderSwerve.java b/src/main/java/swervelib/encoders/SparkMaxEncoderSwerve.java index c822dfc20..d530a7365 100644 --- a/src/main/java/swervelib/encoders/SparkMaxEncoderSwerve.java +++ b/src/main/java/swervelib/encoders/SparkMaxEncoderSwerve.java @@ -64,6 +64,15 @@ public SparkMaxEncoderSwerve(SwerveMotor motor, int conversionFactor) } } + @Override + public void close() + { + // SPARK MAX encoder gets closed with the motor + // I don't think an encoder getting closed should + // close the entire motor so i will keep this empty + // sparkFlex.close(); + } + /** * Run the configuration until it succeeds or times out. * diff --git a/src/main/java/swervelib/encoders/SwerveAbsoluteEncoder.java b/src/main/java/swervelib/encoders/SwerveAbsoluteEncoder.java index c398c7448..e89439ae6 100644 --- a/src/main/java/swervelib/encoders/SwerveAbsoluteEncoder.java +++ b/src/main/java/swervelib/encoders/SwerveAbsoluteEncoder.java @@ -3,9 +3,15 @@ /** * Swerve abstraction class to define a standard interface with absolute encoders for swerve modules.. */ -public abstract class SwerveAbsoluteEncoder +public abstract class SwerveAbsoluteEncoder implements AutoCloseable { + // This is a bit weird because some encoders are closable + // while some get closed with the motor controller + // so for some encoders this will be an empty function + @Override + public abstract void close(); + /** * The maximum amount of times the swerve encoder will attempt to configure itself if failures occur. */ diff --git a/src/main/java/swervelib/encoders/TalonSRXEncoderSwerve.java b/src/main/java/swervelib/encoders/TalonSRXEncoderSwerve.java index d2449ed78..aa4271bac 100644 --- a/src/main/java/swervelib/encoders/TalonSRXEncoderSwerve.java +++ b/src/main/java/swervelib/encoders/TalonSRXEncoderSwerve.java @@ -44,6 +44,15 @@ public TalonSRXEncoderSwerve(SwerveMotor motor, FeedbackDevice feedbackDevice) } } + @Override + public void close() + { + // TalonSRX encoder gets closed with the motor + // I don't think an encoder getting closed should + // close the entire motor so i will keep this empty + // sparkFlex.close(); + } + @Override public void factoryDefault() { diff --git a/src/main/java/swervelib/encoders/ThriftyNovaEncoderSwerve.java b/src/main/java/swervelib/encoders/ThriftyNovaEncoderSwerve.java index b548bd513..cacb1a3ca 100644 --- a/src/main/java/swervelib/encoders/ThriftyNovaEncoderSwerve.java +++ b/src/main/java/swervelib/encoders/ThriftyNovaEncoderSwerve.java @@ -34,6 +34,15 @@ public ThriftyNovaEncoderSwerve(SwerveMotor motor) motor.setAbsoluteEncoder(null); } + @Override + public void close() + { + // ThriftyNova encoder gets closed with the motor + // I don't think an encoder getting closed should + // close the entire motor so i will keep this empty + // sparkFlex.close(); + } + /** * Set factory default. */ diff --git a/src/main/java/swervelib/imu/ADIS16448Swerve.java b/src/main/java/swervelib/imu/ADIS16448Swerve.java index 23573fd3d..fcea48293 100644 --- a/src/main/java/swervelib/imu/ADIS16448Swerve.java +++ b/src/main/java/swervelib/imu/ADIS16448Swerve.java @@ -42,6 +42,11 @@ public ADIS16448Swerve() SmartDashboard.putData(imu); } + @Override + public void close() { + imu.close(); + } + /** * Reset IMU to factory default. */ diff --git a/src/main/java/swervelib/imu/ADIS16470Swerve.java b/src/main/java/swervelib/imu/ADIS16470Swerve.java index d24af92f0..0da821120 100644 --- a/src/main/java/swervelib/imu/ADIS16470Swerve.java +++ b/src/main/java/swervelib/imu/ADIS16470Swerve.java @@ -44,6 +44,11 @@ public ADIS16470Swerve() SmartDashboard.putData(imu); } + @Override + public void close() { + imu.close(); + } + /** * Reset IMU to factory default. */ diff --git a/src/main/java/swervelib/imu/ADXRS450Swerve.java b/src/main/java/swervelib/imu/ADXRS450Swerve.java index d0dd2cbbf..85c7523f8 100644 --- a/src/main/java/swervelib/imu/ADXRS450Swerve.java +++ b/src/main/java/swervelib/imu/ADXRS450Swerve.java @@ -42,6 +42,11 @@ public ADXRS450Swerve() SmartDashboard.putData(imu); } + @Override + public void close() { + imu.close(); + } + /** * Reset IMU to factory default. */ diff --git a/src/main/java/swervelib/imu/AnalogGyroSwerve.java b/src/main/java/swervelib/imu/AnalogGyroSwerve.java index 01ce760e5..b5450f55f 100644 --- a/src/main/java/swervelib/imu/AnalogGyroSwerve.java +++ b/src/main/java/swervelib/imu/AnalogGyroSwerve.java @@ -49,6 +49,11 @@ public AnalogGyroSwerve(int channel) SmartDashboard.putData(imu); } + @Override + public void close() { + imu.close(); + } + /** * Reset IMU to factory default. */ diff --git a/src/main/java/swervelib/imu/NavXSwerve.java b/src/main/java/swervelib/imu/NavXSwerve.java index c032d6c50..b0f837b4c 100644 --- a/src/main/java/swervelib/imu/NavXSwerve.java +++ b/src/main/java/swervelib/imu/NavXSwerve.java @@ -60,6 +60,10 @@ public NavXSwerve(NavXComType port) } } + @Override + public void close() { + imu.close(); + } /** * Reset offset to current gyro reading. Does not call NavX({@link AHRS#reset()}) because it has been reported to be diff --git a/src/main/java/swervelib/imu/Pigeon2Swerve.java b/src/main/java/swervelib/imu/Pigeon2Swerve.java index 3f59502f8..7d4af3adf 100644 --- a/src/main/java/swervelib/imu/Pigeon2Swerve.java +++ b/src/main/java/swervelib/imu/Pigeon2Swerve.java @@ -85,6 +85,12 @@ public Pigeon2Swerve(int canid) this(canid, ""); } + @Override + public void close() { + imu.close(); + } + + /** * Reset {@link Pigeon2} to factory default. */ diff --git a/src/main/java/swervelib/imu/PigeonSwerve.java b/src/main/java/swervelib/imu/PigeonSwerve.java index b844d03d2..f6cfe3c36 100644 --- a/src/main/java/swervelib/imu/PigeonSwerve.java +++ b/src/main/java/swervelib/imu/PigeonSwerve.java @@ -45,6 +45,12 @@ public PigeonSwerve(int canid) SmartDashboard.putData(imu); } + @Override + public void close() { + imu.close(); + } + + /** * Reset IMU to factory default. */ diff --git a/src/main/java/swervelib/imu/PigeonViaTalonSRXSwerve.java b/src/main/java/swervelib/imu/PigeonViaTalonSRXSwerve.java index 9d1b9f4ea..a92e4c395 100644 --- a/src/main/java/swervelib/imu/PigeonViaTalonSRXSwerve.java +++ b/src/main/java/swervelib/imu/PigeonViaTalonSRXSwerve.java @@ -54,6 +54,11 @@ public PigeonViaTalonSRXSwerve(int canid) SmartDashboard.putData(imu); } + @Override + public void close() { + imu.close(); + } + /** * Reset IMU to factory default. */ diff --git a/src/main/java/swervelib/imu/SwerveIMU.java b/src/main/java/swervelib/imu/SwerveIMU.java index 9af3cc6e3..d16999b77 100644 --- a/src/main/java/swervelib/imu/SwerveIMU.java +++ b/src/main/java/swervelib/imu/SwerveIMU.java @@ -8,9 +8,12 @@ /** * Swerve IMU abstraction to define a standard interface with a swerve drive. */ -public abstract class SwerveIMU +public abstract class SwerveIMU implements AutoCloseable { + @Override + public abstract void close(); + /** * Reset IMU to factory default. */ diff --git a/src/main/java/swervelib/motors/SparkFlexSwerve.java b/src/main/java/swervelib/motors/SparkFlexSwerve.java index 75c16fd25..fe273e438 100644 --- a/src/main/java/swervelib/motors/SparkFlexSwerve.java +++ b/src/main/java/swervelib/motors/SparkFlexSwerve.java @@ -129,6 +129,11 @@ private void configureSparkFlex(Supplier config) failureConfiguring.set(true); } + @Override + public void close() { + motor.close(); + } + /** * Get the current configuration of the {@link SparkFlex} * diff --git a/src/main/java/swervelib/motors/SparkMaxBrushedMotorSwerve.java b/src/main/java/swervelib/motors/SparkMaxBrushedMotorSwerve.java index cf39b1f1f..8f7641f1e 100644 --- a/src/main/java/swervelib/motors/SparkMaxBrushedMotorSwerve.java +++ b/src/main/java/swervelib/motors/SparkMaxBrushedMotorSwerve.java @@ -195,6 +195,11 @@ private void configureSparkMax(Supplier config) failureConfiguringAlert.set(true); } + @Override + public void close() { + motor.close(); + } + /** * Get the current configuration of the {@link SparkMax} * diff --git a/src/main/java/swervelib/motors/SparkMaxSwerve.java b/src/main/java/swervelib/motors/SparkMaxSwerve.java index 41fc5b2f7..85b89cc13 100644 --- a/src/main/java/swervelib/motors/SparkMaxSwerve.java +++ b/src/main/java/swervelib/motors/SparkMaxSwerve.java @@ -127,6 +127,11 @@ private void configureSparkMax(Supplier config) DriverStation.reportWarning("Failure configuring motor " + motor.getDeviceId(), true); } + @Override + public void close() { + motor.close(); + } + /** * Get the current configuration of the {@link SparkMax} * diff --git a/src/main/java/swervelib/motors/SwerveMotor.java b/src/main/java/swervelib/motors/SwerveMotor.java index 06940c6ba..f2b4c625c 100644 --- a/src/main/java/swervelib/motors/SwerveMotor.java +++ b/src/main/java/swervelib/motors/SwerveMotor.java @@ -7,9 +7,12 @@ /** * Swerve motor abstraction which defines a standard interface for motors within a swerve module. */ -public abstract class SwerveMotor +public abstract class SwerveMotor implements AutoCloseable { + @Override + public abstract void close(); + /** * The maximum amount of times the swerve motor will attempt to configure a motor if failures occur. */ diff --git a/src/main/java/swervelib/motors/TalonFXSwerve.java b/src/main/java/swervelib/motors/TalonFXSwerve.java index 7d3b98a61..66c114429 100644 --- a/src/main/java/swervelib/motors/TalonFXSwerve.java +++ b/src/main/java/swervelib/motors/TalonFXSwerve.java @@ -131,6 +131,12 @@ public void factoryDefaults() } } + @Override + public void close() { + motor.close(); + } + + /** * Clear the sticky faults on the motor controller. */ diff --git a/src/main/java/swervelib/motors/TalonSRXSwerve.java b/src/main/java/swervelib/motors/TalonSRXSwerve.java index 00958e869..b93126e19 100644 --- a/src/main/java/swervelib/motors/TalonSRXSwerve.java +++ b/src/main/java/swervelib/motors/TalonSRXSwerve.java @@ -84,6 +84,11 @@ public TalonSRXSwerve(int id, boolean isDriveMotor, DCMotor motorType) this(new WPI_TalonSRX(id), isDriveMotor, motorType); } + @Override + public void close() { + motor.close(); + } + /** * Configure the factory defaults. */ diff --git a/src/main/java/swervelib/motors/ThriftyNovaSwerve.java b/src/main/java/swervelib/motors/ThriftyNovaSwerve.java index 30a18dfe6..cdcbd22b2 100644 --- a/src/main/java/swervelib/motors/ThriftyNovaSwerve.java +++ b/src/main/java/swervelib/motors/ThriftyNovaSwerve.java @@ -105,6 +105,16 @@ public ThriftyNovaSwerve(int id, boolean isDriveMotor, DCMotor motor) this(new ThriftyNova(id), isDriveMotor, motor); } + @Override + public void close() { + try { + motor.close(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** * Set factory defaults on the motor controller. */