From 57b2e5db71b0d8c4b6630990a7dbb9e5ca8fce18 Mon Sep 17 00:00:00 2001 From: Dean Brettle Date: Sat, 13 Jul 2024 23:09:10 -0700 Subject: [PATCH] Fix to close mocked encoders associated with mocked Spark when the Spark is closed. --- .../lib199/sim/MockSparkBase.java | 19 +++++++++++++++++-- .../lib199/sim/MockSparkMaxTest.java | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java index b8e787a..3ad8f1f 100644 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java +++ b/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java @@ -34,8 +34,10 @@ public class MockSparkBase extends MockedMotorBase { private final SparkPIDController pidController; private final MockedSparkMaxPIDController pidControllerImpl; private SparkAbsoluteEncoder absoluteEncoder = null; + private MockedEncoder absoluteEncoderImpl = null; private MockedEncoder alternateEncoder = null; private SparkAnalogSensor analogSensor = null; + private MockedEncoder analogSensorImpl = null; private final String name; /** @@ -183,6 +185,18 @@ public double getBusVoltage() { @Override public void close() { controllers.remove(port); + if (encoder != null) { + encoder.close(); + } + if (absoluteEncoderImpl != null) { + absoluteEncoderImpl.close(); + } + if (analogSensorImpl != null) { + analogSensorImpl.close(); + } + if (alternateEncoder != null) { + alternateEncoder.close(); + } super.close(); } @@ -196,7 +210,7 @@ public void close() { */ public synchronized SparkAbsoluteEncoder getAbsoluteEncoder(SparkAbsoluteEncoder.Type encoderType) { if(absoluteEncoder == null) { - MockedEncoder absoluteEncoderImpl = new MockedEncoder( + absoluteEncoderImpl = new MockedEncoder( SimDevice.create("CANDutyCycle:" + name, port), 0, false, true, true); absoluteEncoder = Mocks.createMock(SparkAbsoluteEncoder.class, absoluteEncoderImpl, new REVLibErrorAnswer()); @@ -243,7 +257,8 @@ public synchronized RelativeEncoder getAlternateEncoder(SparkMaxAlternateEncoder */ public synchronized SparkAnalogSensor getAnalog(SparkAnalogSensor.Mode mode) { if(analogSensor == null) { - MockedEncoder analogSensorImpl = new MockedEncoder(SimDevice.create("CANAIn:" + name, port), 0, true, true); + analogSensorImpl = new MockedEncoder( + SimDevice.create("CANAIn:" + name, port), 0, true, true); analogSensor = Mocks.createMock(SparkAnalogSensor.class, analogSensorImpl, new REVLibErrorAnswer()); } return analogSensor; diff --git a/src/test/java/org/carlmontrobotics/lib199/sim/MockSparkMaxTest.java b/src/test/java/org/carlmontrobotics/lib199/sim/MockSparkMaxTest.java index d8837fc..d5fde3b 100644 --- a/src/test/java/org/carlmontrobotics/lib199/sim/MockSparkMaxTest.java +++ b/src/test/java/org/carlmontrobotics/lib199/sim/MockSparkMaxTest.java @@ -30,6 +30,22 @@ public void testHasEncoder() { assertNotNull(simPosition); } + @Test + public void testCanRecreateIfClosed() { + for (int i = 0; i < 2; i++) { + try (var mockSpark = new MockSparkMax(0, MotorType.kBrushless)) { + SimDeviceSim simSpark = + new SimDeviceSim("CANMotor:CANSparkMax", 0); + assertNotNull(simSpark); + SimDeviceSim simEncoder = + new SimDeviceSim("CANEncoder:CANSparkMax", 0); + assertNotNull(simEncoder); + SimDouble simPosition = simEncoder.getDouble("position"); + assertNotNull(simPosition); + } + } + } + @Test public void testGetOutputCurrent() { var mockSpark = new MockSparkMax(0, MotorType.kBrushless);