diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL345_I2C.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL345_I2C.java index 0de8e76681..d901462296 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL345_I2C.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL345_I2C.java @@ -113,6 +113,7 @@ public class ADXL345_I2C implements Accelerometer, Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); if (m_i2c != null) { m_i2c.close(); m_i2c = null; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL345_SPI.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL345_SPI.java index 25546e4b83..6aed40eed4 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL345_SPI.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL345_SPI.java @@ -98,6 +98,7 @@ public class ADXL345_SPI implements Accelerometer, Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); if (m_spi != null) { m_spi.close(); m_spi = null; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL362.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL362.java index fb1a5da1b6..06daf85e6e 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL362.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXL362.java @@ -135,6 +135,7 @@ public class ADXL362 implements Accelerometer, Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); if (m_spi != null) { m_spi.close(); m_spi = null; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXRS450_Gyro.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXRS450_Gyro.java index 78f5591ac8..76580729b8 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXRS450_Gyro.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/ADXRS450_Gyro.java @@ -175,6 +175,7 @@ public class ADXRS450_Gyro extends GyroBase implements Gyro, PIDSource, Sendable */ @Override public void close() { + SendableRegistry.remove(this); if (m_spi != null) { m_spi.close(); m_spi = null; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogAccelerometer.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogAccelerometer.java index b4fc0e4ed6..4a4c675fed 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogAccelerometer.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogAccelerometer.java @@ -71,6 +71,7 @@ public class AnalogAccelerometer implements PIDSource, Sendable, AutoCloseable { */ @Override public void close() { + SendableRegistry.remove(this); if (m_analogChannel != null && m_allocatedChannel) { m_analogChannel.close(); } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogGyro.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogGyro.java index a06bae0249..f7e3f2f0b9 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogGyro.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogGyro.java @@ -121,6 +121,7 @@ public class AnalogGyro extends GyroBase implements Gyro, PIDSource, Sendable, A */ @Override public void close() { + SendableRegistry.remove(this); if (m_analog != null && m_channelAllocated) { m_analog.close(); } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogInput.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogInput.java index 9f97cec9df..0e1260e0d7 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogInput.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogInput.java @@ -55,6 +55,7 @@ public class AnalogInput implements PIDSource, Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); AnalogJNI.freeAnalogInputPort(m_port); m_port = 0; m_channel = 0; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogOutput.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogOutput.java index 35202b5653..902bec6ca3 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogOutput.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogOutput.java @@ -39,6 +39,7 @@ public class AnalogOutput implements Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); AnalogJNI.freeAnalogOutputPort(m_port); m_port = 0; m_channel = 0; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogPotentiometer.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogPotentiometer.java index 57239ca31f..3a6f338f57 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogPotentiometer.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogPotentiometer.java @@ -157,6 +157,7 @@ public class AnalogPotentiometer implements Potentiometer, Sendable, AutoCloseab @Override public void close() { + SendableRegistry.remove(this); if (m_initAnalogInput) { m_analogInput.close(); m_analogInput = null; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogTrigger.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogTrigger.java index c0de21168b..5bff3ea481 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogTrigger.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/AnalogTrigger.java @@ -78,6 +78,7 @@ public class AnalogTrigger implements Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); AnalogJNI.cleanAnalogTrigger(m_port); m_port = 0; if (m_ownsAnalog && m_analogInput != null) { diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/BuiltInAccelerometer.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/BuiltInAccelerometer.java index e7a24f9f68..f6811c0aff 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/BuiltInAccelerometer.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/BuiltInAccelerometer.java @@ -20,7 +20,7 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; * *

This class allows access to the roboRIO's internal accelerometer. */ -public class BuiltInAccelerometer implements Accelerometer, Sendable { +public class BuiltInAccelerometer implements Accelerometer, Sendable, AutoCloseable { /** * Constructor. * @@ -39,6 +39,11 @@ public class BuiltInAccelerometer implements Accelerometer, Sendable { this(Range.k8G); } + @Override + public void close() { + SendableRegistry.remove(this); + } + @Override public void setRange(Range range) { AccelerometerJNI.setAccelerometerActive(false); diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Compressor.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Compressor.java index 66cd9aa9af..cddf2ef488 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Compressor.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Compressor.java @@ -24,7 +24,7 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; * the safety provided by using the pressure switch and closed loop control. You can only turn off * closed loop control, thereby stopping the compressor from operating. */ -public class Compressor implements Sendable { +public class Compressor implements Sendable, AutoCloseable { private int m_compressorHandle; private byte m_module; @@ -53,6 +53,11 @@ public class Compressor implements Sendable { this(SensorUtil.getDefaultSolenoidModule()); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Start the compressor running in closed loop control mode. * diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Counter.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Counter.java index 65e636ccba..bdb81fd107 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Counter.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Counter.java @@ -183,6 +183,8 @@ public class Counter implements CounterBase, PIDSource, Sendable, AutoCloseable @Override public void close() { + SendableRegistry.remove(this); + setUpdateWhenEmpty(true); clearUpSource(); diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalGlitchFilter.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalGlitchFilter.java index d90fc51843..777f2f9346 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalGlitchFilter.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalGlitchFilter.java @@ -43,6 +43,7 @@ public class DigitalGlitchFilter implements Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); if (m_channelIndex >= 0) { synchronized (m_mutex) { m_filterAllocated[m_channelIndex] = false; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalInput.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalInput.java index 4449cd6843..433e3fd6c6 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalInput.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalInput.java @@ -42,6 +42,7 @@ public class DigitalInput extends DigitalSource implements Sendable, AutoCloseab @Override public void close() { super.close(); + SendableRegistry.remove(this); if (m_interrupt != 0) { cancelInterrupts(); } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalOutput.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalOutput.java index 777bbbbc52..ede25f25b3 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalOutput.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalOutput.java @@ -44,6 +44,7 @@ public class DigitalOutput implements Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); // Disable the pwm only if we have allocated it if (m_pwmGenerator != invalidPwmGenerator) { disablePWM(); diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DoubleSolenoid.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DoubleSolenoid.java index b4bb97e867..10029456e5 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DoubleSolenoid.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DoubleSolenoid.java @@ -86,6 +86,7 @@ public class DoubleSolenoid extends SolenoidBase implements Sendable, AutoClosea @Override public synchronized void close() { + SendableRegistry.remove(this); SolenoidJNI.freeSolenoidPort(m_forwardHandle); SolenoidJNI.freeSolenoidPort(m_reverseHandle); } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Encoder.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Encoder.java index 2f5454c7ab..a6ea302b84 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Encoder.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Encoder.java @@ -294,6 +294,7 @@ public class Encoder implements CounterBase, PIDSource, Sendable, AutoCloseable @Override public void close() { + SendableRegistry.remove(this); if (m_aSource != null && m_allocatedA) { m_aSource.close(); m_allocatedA = false; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/NidecBrushless.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/NidecBrushless.java index 06f50f5c02..4bfee487b6 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/NidecBrushless.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/NidecBrushless.java @@ -50,6 +50,7 @@ public class NidecBrushless extends MotorSafety implements SpeedController, Send @Override public void close() { + SendableRegistry.remove(this); m_dio.close(); m_pwm.close(); } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/PIDBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/PIDBase.java index 702636ca34..b9d852b6fe 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/PIDBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/PIDBase.java @@ -28,7 +28,7 @@ import static edu.wpi.first.wpilibj.util.ErrorMessages.requireNonNullParam; * given set of PID constants. */ @SuppressWarnings("PMD.TooManyFields") -public class PIDBase implements PIDInterface, PIDOutput, Sendable { +public class PIDBase implements PIDInterface, PIDOutput, Sendable, AutoCloseable { public static final double kDefaultPeriod = 0.05; private static int instances; @@ -191,6 +191,11 @@ public class PIDBase implements PIDInterface, PIDOutput, Sendable { this(Kp, Ki, Kd, 0.0, source, output); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Read the input, calculate the output accordingly, and write to the output. This should only be * called by the PIDTask and is created during initialization. diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/PWM.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/PWM.java index 9698e1876a..0647291764 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/PWM.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/PWM.java @@ -74,6 +74,7 @@ public class PWM extends MotorSafety implements Sendable, AutoCloseable { */ @Override public void close() { + SendableRegistry.remove(this); if (m_handle == 0) { return; } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/PowerDistributionPanel.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/PowerDistributionPanel.java index 53ce284edc..8030daa515 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/PowerDistributionPanel.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/PowerDistributionPanel.java @@ -17,7 +17,7 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; * Class for getting voltage, current, temperature, power and energy from the Power Distribution * Panel over CAN. */ -public class PowerDistributionPanel implements Sendable { +public class PowerDistributionPanel implements Sendable, AutoCloseable { private final int m_handle; /** @@ -40,6 +40,11 @@ public class PowerDistributionPanel implements Sendable { this(0); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Query the input voltage of the PDP. * diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Relay.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Relay.java index 8539d8f355..bea2491598 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Relay.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Relay.java @@ -141,6 +141,7 @@ public class Relay extends MotorSafety implements Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); freeRelay(); } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SendableBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SendableBase.java index 27b8fa2069..4e2116cb84 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SendableBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SendableBase.java @@ -37,5 +37,7 @@ public abstract class SendableBase implements Sendable, AutoCloseable { } @Override - public void close() {} + public void close() { + SendableRegistry.remove(this); + } } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Solenoid.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Solenoid.java index 47b7fa098b..dc9b9209dc 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Solenoid.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Solenoid.java @@ -54,6 +54,7 @@ public class Solenoid extends SolenoidBase implements Sendable, AutoCloseable { @Override public void close() { + SendableRegistry.remove(this); SolenoidJNI.freeSolenoidPort(m_solenoidHandle); m_solenoidHandle = 0; } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SpeedControllerGroup.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SpeedControllerGroup.java index bfe57fcd0b..7dd3f76e9f 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SpeedControllerGroup.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SpeedControllerGroup.java @@ -13,7 +13,7 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; /** * Allows multiple {@link SpeedController} objects to be linked together. */ -public class SpeedControllerGroup implements SpeedController, Sendable { +public class SpeedControllerGroup implements SpeedController, Sendable, AutoCloseable { private boolean m_isInverted; private final SpeedController[] m_speedControllers; private static int instances; @@ -37,6 +37,11 @@ public class SpeedControllerGroup implements SpeedController, Sendable { SendableRegistry.addLW(this, "tSpeedControllerGroup", instances); } + @Override + public void close() { + SendableRegistry.remove(this); + } + @Override public void set(double speed) { for (SpeedController speedController : m_speedControllers) { diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Ultrasonic.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Ultrasonic.java index 45c57c6657..db7454ab2f 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Ultrasonic.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Ultrasonic.java @@ -206,6 +206,7 @@ public class Ultrasonic implements PIDSource, Sendable, AutoCloseable { */ @Override public synchronized void close() { + SendableRegistry.remove(this); final boolean wasAutomaticMode = m_automaticEnabled; setAutomaticMode(false); if (m_allocatedChannels) { diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Command.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Command.java index 1b50dd6286..da135ca7a3 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Command.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Command.java @@ -41,7 +41,7 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; * @see IllegalUseOfCommandException */ @SuppressWarnings("PMD.TooManyMethods") -public abstract class Command implements Sendable { +public abstract class Command implements Sendable, AutoCloseable { /** * The time since this command was initialized. */ @@ -204,6 +204,11 @@ public abstract class Command implements Sendable { requires(subsystem); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Sets the timeout of this command. * diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Scheduler.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Scheduler.java index 1c4f4706a4..e25a5a7470 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Scheduler.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Scheduler.java @@ -32,7 +32,8 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; * * @see Command */ -public final class Scheduler implements Sendable { +@SuppressWarnings("PMD.TooManyMethods") +public final class Scheduler implements Sendable, AutoCloseable { /** * The Singleton Instance. */ @@ -99,6 +100,11 @@ public final class Scheduler implements Sendable { SendableRegistry.addLW(this, "Scheduler"); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Adds the command to the {@link Scheduler}. This will not add the {@link Command} immediately, * but will instead wait for the proper time in the {@link Scheduler#run()} loop before doing so. diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Subsystem.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Subsystem.java index 41f4ed131f..3c2858f65f 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Subsystem.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/command/Subsystem.java @@ -27,7 +27,7 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; * * @see Command */ -public abstract class Subsystem implements Sendable { +public abstract class Subsystem implements Sendable, AutoCloseable { /** * Whether or not getDefaultCommand() was called. */ @@ -64,6 +64,11 @@ public abstract class Subsystem implements Sendable { m_currentCommandChanged = true; } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Initialize the default command for a subsystem By default subsystems have no default command, * but if they do, the default command is set with this method. It is called on all Subsystems by diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/controller/PIDController.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/controller/PIDController.java index 8a3c290b05..c7bdb2556c 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/controller/PIDController.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/controller/PIDController.java @@ -18,7 +18,7 @@ import edu.wpi.first.wpiutil.math.MathUtils; * Implements a PID control loop. */ @SuppressWarnings("PMD.TooManyFields") -public class PIDController implements Sendable { +public class PIDController implements Sendable, AutoCloseable { private static int instances; // Factor for "proportional" control @@ -103,6 +103,11 @@ public class PIDController implements Sendable { HAL.report(tResourceType.kResourceType_PIDController, instances); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Sets the PID Controller gain parameters. * diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/DifferentialDrive.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/DifferentialDrive.java index da71fd43fb..13016298c1 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/DifferentialDrive.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/DifferentialDrive.java @@ -96,7 +96,7 @@ import edu.wpi.first.wpiutil.math.MathUtils; * {@link edu.wpi.first.wpilibj.RobotDrive#drive(double, double)} with the addition of a quick turn * mode. However, it is not designed to give exactly the same response. */ -public class DifferentialDrive extends RobotDriveBase implements Sendable { +public class DifferentialDrive extends RobotDriveBase implements Sendable, AutoCloseable { public static final double kDefaultQuickStopThreshold = 0.2; public static final double kDefaultQuickStopAlpha = 0.1; @@ -127,6 +127,11 @@ public class DifferentialDrive extends RobotDriveBase implements Sendable { SendableRegistry.addLW(this, "DifferentialDrive", instances); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Verifies that all motors are nonnull, throwing a NullPointerException if any of them are. * The exception's error message will specify all null motors, e.g. {@code diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/KilloughDrive.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/KilloughDrive.java index 64e5e4cb38..d1270bd8ea 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/KilloughDrive.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/KilloughDrive.java @@ -42,7 +42,7 @@ import edu.wpi.first.wpiutil.math.MathUtils; * points down. Rotations follow the right-hand rule, so clockwise rotation around the Z axis is * positive. */ -public class KilloughDrive extends RobotDriveBase implements Sendable { +public class KilloughDrive extends RobotDriveBase implements Sendable, AutoCloseable { public static final double kDefaultLeftMotorAngle = 60.0; public static final double kDefaultRightMotorAngle = 120.0; public static final double kDefaultBackMotorAngle = 270.0; @@ -109,6 +109,11 @@ public class KilloughDrive extends RobotDriveBase implements Sendable { SendableRegistry.addLW(this, "KilloughDrive", instances); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Verifies that all motors are nonnull, throwing a NullPointerException if any of them are. * The exception's error message will specify all null motors, e.g. {@code diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/MecanumDrive.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/MecanumDrive.java index 62a2161cbc..1d3a8788d5 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/MecanumDrive.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/drive/MecanumDrive.java @@ -61,7 +61,7 @@ import edu.wpi.first.wpiutil.math.MathUtils; * {@link edu.wpi.first.wpilibj.RobotDrive#mecanumDrive_Polar(double, double, double)} if a * deadband of 0 is used. */ -public class MecanumDrive extends RobotDriveBase implements Sendable { +public class MecanumDrive extends RobotDriveBase implements Sendable, AutoCloseable { private static int instances; private final SpeedController m_frontLeftMotor; @@ -92,6 +92,11 @@ public class MecanumDrive extends RobotDriveBase implements Sendable { SendableRegistry.addLW(this, "MecanumDrive", instances); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Verifies that all motors are nonnull, throwing a NullPointerException if any of them are. * The exception's error message will specify all null motors, e.g. {@code diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/shuffleboard/SendableCameraWrapper.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/shuffleboard/SendableCameraWrapper.java index 208982246d..bb7738f4ee 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/shuffleboard/SendableCameraWrapper.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/shuffleboard/SendableCameraWrapper.java @@ -18,7 +18,7 @@ import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; /** * A wrapper to make video sources sendable and usable from Shuffleboard. */ -public final class SendableCameraWrapper implements Sendable { +public final class SendableCameraWrapper implements Sendable, AutoCloseable { private static final String kProtocol = "camera_server://"; private static Map m_wrappers = new WeakHashMap<>(); @@ -37,6 +37,11 @@ public final class SendableCameraWrapper implements Sendable { m_uri = kProtocol + name; } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Gets a sendable wrapper object for the given video source, creating the wrapper if one does * not already exist for the source. diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SendableChooser.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SendableChooser.java index 8be9f87943..57435b437b 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SendableChooser.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SendableChooser.java @@ -32,7 +32,7 @@ import static edu.wpi.first.wpilibj.util.ErrorMessages.requireNonNullParam; * * @param The type of the values to be stored */ -public class SendableChooser implements Sendable { +public class SendableChooser implements Sendable, AutoCloseable { /** * The key for the default value. */ @@ -69,6 +69,11 @@ public class SendableChooser implements Sendable { SendableRegistry.add(this, "SendableChooser", m_instance); } + @Override + public void close() { + SendableRegistry.remove(this); + } + /** * Adds the given object to the list of options. On the {@link SmartDashboard} on the desktop, the * object will appear as the given name.