diff --git a/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/fixtures/MotorEncoderFixture.java b/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/fixtures/MotorEncoderFixture.java index 7f84691045..d930bc8918 100644 --- a/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/fixtures/MotorEncoderFixture.java +++ b/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/fixtures/MotorEncoderFixture.java @@ -23,13 +23,14 @@ import edu.wpi.first.wpilibj.test.TestBench; * @author Jonathan Leitschuh * */ -public class MotorEncoderFixture implements ITestFixture { - - private final SpeedController motor; - private final Encoder encoder; - private final Counter counters[] = new Counter[2]; - private final DigitalInput aSource; //Stored so it can be freed at tear down - private final DigitalInput bSource; +public abstract class MotorEncoderFixture implements ITestFixture { + private boolean initialized = false; + private boolean tornDown = false; + protected SpeedController motor; + private Encoder encoder; + private Counter counters[] = new Counter[2]; + protected DigitalInput aSource; //Stored so it can be freed at tear down + protected DigitalInput bSource; /** * Default constructor for a MotorEncoderFixture @@ -37,24 +38,51 @@ public class MotorEncoderFixture implements ITestFixture { * @param aSource One of the inputs for the encoder * @param bSource The other input for the encoder */ - public MotorEncoderFixture(SpeedController motor, DigitalInput aSource, DigitalInput bSource){ - this.aSource = aSource; - this.bSource = bSource; - - this.motor = motor; - - this.encoder = new Encoder(aSource, bSource); - counters[0] = new Counter(aSource); - counters[1] = new Counter(bSource); - for(Counter c: counters){ - c.start(); + public MotorEncoderFixture(){ + } + + /** + * Where the implementer of this class should pass the speed controller + * Constructor should only be called from outside this class if the Speed controller + * is not also an implementation of PWM interface + * @return + */ + abstract protected SpeedController giveSpeedController(); + /** + * Where the implementer of this class should pass one of the digital inputs
+ * CONSTRUCTOR SHOULD NOT BE CALLED FROM OUTSIDE THIS CLASS! + * @return + */ + abstract protected DigitalInput giveDigitalInputA(); + /** + * Where the implementer fo this class should pass the other digital input
+ * CONSTRUCTOR SHOULD NOT BE CALLED FROM OUTSIDE THIS CLASS! + * @return Input B to be used when this class is instantiated + */ + abstract protected DigitalInput giveDigitalInputB(); + + final private void initialize(){ + if(!initialized){ + aSource = giveDigitalInputA(); + bSource = giveDigitalInputB(); + + motor = giveSpeedController(); + + encoder = new Encoder(aSource, bSource); + counters[0] = new Counter(aSource); + counters[1] = new Counter(bSource); + for(Counter c: counters){ + c.start(); + } + initialized = true; } - encoder.start(); } @Override public boolean setup() { - return reset(); + initialize(); + encoder.start(); + return true; } /** @@ -62,6 +90,7 @@ public class MotorEncoderFixture implements ITestFixture { * @return the motor this object refers too */ public SpeedController getMotor(){ + initialize(); return motor; } @@ -70,10 +99,12 @@ public class MotorEncoderFixture implements ITestFixture { * @return the encoder that this object refers too */ public Encoder getEncoder(){ + initialize(); return encoder; } public Counter[] getCounters(){ + initialize(); return counters; } @@ -82,6 +113,7 @@ public class MotorEncoderFixture implements ITestFixture { * @return The simple name of the motor {@link Class#getSimpleName()} */ public String getType(){ + initialize(); return motor.getClass().getSimpleName(); } @@ -94,11 +126,13 @@ public class MotorEncoderFixture implements ITestFixture { * {@code Math.abs((Math.abs(motor.get()) - Math.abs(value))) < Math.abs(accuracy)} */ public boolean isMotorSpeedWithinRange(double value, double accuracy){ + initialize(); return Math.abs((Math.abs(motor.get()) - Math.abs(value))) < Math.abs(accuracy); } @Override public boolean reset(){ + initialize(); boolean wasReset = true; motor.set(0); @@ -121,17 +155,25 @@ public class MotorEncoderFixture implements ITestFixture { @Override public boolean teardown() { - reset(); - if(motor instanceof PWM){ - ((PWM) motor).free(); + if(!tornDown){ + initialize(); + reset(); + if(motor instanceof PWM){ + ((PWM) motor).free(); + } + motor = null; + encoder.free(); + counters[0].free(); + counters[0] = null; + counters[1].free(); + counters[1] = null; + + aSource.free(); + aSource = null; + bSource.free(); + bSource = null; + tornDown = true; } - encoder.free(); - for(Counter c : counters){ - c.free(); - } - - aSource.free(); - bSource.free(); return true; } diff --git a/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/test/TestBench.java b/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/test/TestBench.java index d4b02b55c3..306b9adcee 100644 --- a/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/test/TestBench.java +++ b/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/test/TestBench.java @@ -18,6 +18,7 @@ import edu.wpi.first.wpilibj.DigitalOutput; import edu.wpi.first.wpilibj.Gyro; import edu.wpi.first.wpilibj.Jaguar; import edu.wpi.first.wpilibj.Servo; +import edu.wpi.first.wpilibj.SpeedController; import edu.wpi.first.wpilibj.Talon; import edu.wpi.first.wpilibj.Victor; import edu.wpi.first.wpilibj.can.CANTimeoutException; @@ -40,7 +41,7 @@ public final class TestBench { * The time that it takes to have a motor go from rotating at full speed to * completely stopped */ - public static final double MOTOR_STOP_TIME = 0.15; + public static final double MOTOR_STOP_TIME = 0.20; //THESE MUST BE IN INCREMENTING ORDER @@ -69,12 +70,20 @@ public final class TestBench { * @return a freshly allocated Talon, Encoder pair */ public MotorEncoderFixture getTalonPair() { - Talon talon = new Talon(0); - DigitalInput encA1 = new DigitalInput(0); - DigitalInput encB1 = new DigitalInput(1); - - MotorEncoderFixture talonPair = new MotorEncoderFixture(talon, encA1, - encB1); + MotorEncoderFixture talonPair = new MotorEncoderFixture(){ + @Override + protected SpeedController giveSpeedController() { + return new Talon(1); + } + @Override + protected DigitalInput giveDigitalInputA() { + return new DigitalInput(0); + } + @Override + protected DigitalInput giveDigitalInputB() { + return new DigitalInput(1); + } + }; return talonPair; } @@ -85,10 +94,23 @@ public final class TestBench { * @return a freshly allocated Victor, Encoder pair */ public MotorEncoderFixture getVictorPair() { - Victor vic = new Victor(1); - DigitalInput encA2 = new DigitalInput(2); - DigitalInput encB2 = new DigitalInput(3); - MotorEncoderFixture vicPair = new MotorEncoderFixture(vic, encA2, encB2); + + MotorEncoderFixture vicPair = new MotorEncoderFixture(){ + @Override + protected SpeedController giveSpeedController() { + return new Victor(1); + } + + @Override + protected DigitalInput giveDigitalInputA() { + return new DigitalInput(2); + } + + @Override + protected DigitalInput giveDigitalInputB() { + return new DigitalInput(3); + } + }; return vicPair; } @@ -99,10 +121,22 @@ public final class TestBench { * @return a freshly allocated Jaguar, Encoder pair */ public MotorEncoderFixture getJaguarPair() { - Jaguar jag = new Jaguar(2); - DigitalInput encA3 = new DigitalInput(4); - DigitalInput encB3 = new DigitalInput(5); - MotorEncoderFixture jagPair = new MotorEncoderFixture(jag, encA3, encB3); + MotorEncoderFixture jagPair = new MotorEncoderFixture(){ + @Override + protected SpeedController giveSpeedController() { + return new Jaguar(2); + } + + @Override + protected DigitalInput giveDigitalInputA() { + return new DigitalInput(4); + } + + @Override + protected DigitalInput giveDigitalInputB() { + return new DigitalInput(5); + } + }; return jagPair; } @@ -115,9 +149,6 @@ public final class TestBench { * @return an existing CANJaguar and a freshly allocated Encoder */ public MotorEncoderFixture getCanJaguarPair() { - - DigitalInput encA4 = new DigitalInput(6); - DigitalInput encB4 = new DigitalInput(7); MotorEncoderFixture canPair; if (canJag == null) { // Again this is because the CanJaguar does not // have a free method @@ -127,7 +158,20 @@ public final class TestBench { e.printStackTrace(); } } - canPair = new MotorEncoderFixture(canJag, encA4, encB4); + canPair = new MotorEncoderFixture(){ + @Override + protected SpeedController giveSpeedController() { + return canJag; + } + @Override + protected DigitalInput giveDigitalInputA() { + return new DigitalInput(6); + } + @Override + protected DigitalInput giveDigitalInputB() { + return new DigitalInput(7); + } + }; assert canPair != null; return canPair; }