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