2020-12-26 14:12:05 -08:00
|
|
|
// Copyright (c) FIRST and other WPILib contributors.
|
|
|
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
|
|
|
// the WPILib BSD license file in the root directory of this project.
|
2014-06-12 16:29:47 -04:00
|
|
|
|
|
|
|
|
package edu.wpi.first.wpilibj;
|
|
|
|
|
|
2020-12-29 22:45:16 -08:00
|
|
|
import static org.junit.Assert.assertEquals;
|
|
|
|
|
import static org.junit.Assert.assertFalse;
|
|
|
|
|
import static org.junit.Assert.assertTrue;
|
2018-05-24 00:31:04 -04:00
|
|
|
|
2020-12-29 22:45:16 -08:00
|
|
|
import edu.wpi.first.wpilibj.test.AbstractComsSetup;
|
|
|
|
|
import java.util.logging.Logger;
|
2014-06-12 16:29:47 -04:00
|
|
|
import org.junit.AfterClass;
|
|
|
|
|
import org.junit.Before;
|
|
|
|
|
import org.junit.BeforeClass;
|
|
|
|
|
import org.junit.Test;
|
|
|
|
|
|
2020-12-29 22:45:16 -08:00
|
|
|
/** Test that covers the {@link Compressor}. */
|
2014-06-12 16:29:47 -04:00
|
|
|
public class PCMTest extends AbstractComsSetup {
|
2015-06-25 15:07:55 -04:00
|
|
|
private static final Logger logger = Logger.getLogger(PCMTest.class.getName());
|
|
|
|
|
/*
|
|
|
|
|
* The PCM switches the compressor up to 2 seconds after the pressure switch
|
|
|
|
|
* changes.
|
|
|
|
|
*/
|
|
|
|
|
protected static final double kCompressorDelayTime = 2.0;
|
|
|
|
|
|
|
|
|
|
/* Solenoids should change much more quickly */
|
|
|
|
|
protected static final double kSolenoidDelayTime = 1.0;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* The voltage divider on the test bench should bring the compressor output to
|
|
|
|
|
* around these values.
|
|
|
|
|
*/
|
|
|
|
|
protected static final double kCompressorOnVoltage = 5.00;
|
|
|
|
|
protected static final double kCompressorOffVoltage = 1.68;
|
|
|
|
|
|
2021-06-05 22:36:39 -07:00
|
|
|
private static PneumaticsControlModule pcm;
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
private static DigitalOutput fakePressureSwitch;
|
|
|
|
|
private static AnalogInput fakeCompressor;
|
|
|
|
|
|
2016-05-20 12:07:40 -04:00
|
|
|
private static DigitalInput fakeSolenoid1;
|
|
|
|
|
private static DigitalInput fakeSolenoid2;
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
@BeforeClass
|
2019-08-01 01:19:48 -04:00
|
|
|
public static void setUpBeforeClass() {
|
2021-06-05 22:36:39 -07:00
|
|
|
pcm = new PneumaticsControlModule();
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
fakePressureSwitch = new DigitalOutput(11);
|
|
|
|
|
fakeCompressor = new AnalogInput(1);
|
|
|
|
|
|
|
|
|
|
fakeSolenoid1 = new DigitalInput(12);
|
|
|
|
|
fakeSolenoid2 = new DigitalInput(13);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@AfterClass
|
2019-08-01 01:19:48 -04:00
|
|
|
public static void tearDownAfterClass() {
|
2018-05-22 23:33:17 -07:00
|
|
|
fakePressureSwitch.close();
|
|
|
|
|
fakeCompressor.close();
|
2015-06-25 15:07:55 -04:00
|
|
|
|
2018-05-22 23:33:17 -07:00
|
|
|
fakeSolenoid1.close();
|
|
|
|
|
fakeSolenoid2.close();
|
2015-06-25 15:07:55 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Before
|
2019-08-01 01:19:48 -04:00
|
|
|
public void reset() {
|
2021-06-05 22:36:39 -07:00
|
|
|
pcm.setClosedLoopControl(false);
|
2015-06-25 15:07:55 -04:00
|
|
|
fakePressureSwitch.set(false);
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-29 22:45:16 -08:00
|
|
|
/** Test if the compressor turns on and off when the pressure switch is toggled. */
|
2015-06-25 15:07:55 -04:00
|
|
|
@Test
|
|
|
|
|
public void testPressureSwitch() throws Exception {
|
2017-11-24 20:14:36 -08:00
|
|
|
final double range = 0.5;
|
2015-06-25 15:07:55 -04:00
|
|
|
reset();
|
2021-06-05 22:36:39 -07:00
|
|
|
pcm.setClosedLoopControl(true);
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
// Turn on the compressor
|
|
|
|
|
fakePressureSwitch.set(true);
|
|
|
|
|
Timer.delay(kCompressorDelayTime);
|
2020-12-29 22:45:16 -08:00
|
|
|
assertEquals(
|
|
|
|
|
"Compressor did not turn on when the pressure switch turned on.",
|
|
|
|
|
kCompressorOnVoltage,
|
|
|
|
|
fakeCompressor.getVoltage(),
|
|
|
|
|
range);
|
2015-06-25 15:07:55 -04:00
|
|
|
|
2015-11-14 16:54:07 -08:00
|
|
|
// Turn off the compressor
|
2015-06-25 15:07:55 -04:00
|
|
|
fakePressureSwitch.set(false);
|
|
|
|
|
Timer.delay(kCompressorDelayTime);
|
2020-12-29 22:45:16 -08:00
|
|
|
assertEquals(
|
|
|
|
|
"Compressor did not turn off when the pressure switch turned off.",
|
|
|
|
|
kCompressorOffVoltage,
|
|
|
|
|
fakeCompressor.getVoltage(),
|
|
|
|
|
range);
|
2015-06-25 15:07:55 -04:00
|
|
|
}
|
|
|
|
|
|
2020-12-29 22:45:16 -08:00
|
|
|
/** Test if the correct solenoids turn on and off when they should. */
|
2015-06-25 15:07:55 -04:00
|
|
|
@Test
|
|
|
|
|
public void testSolenoid() throws Exception {
|
|
|
|
|
reset();
|
|
|
|
|
|
2021-09-16 18:50:27 -07:00
|
|
|
Solenoid solenoid1 = new Solenoid(PneumaticsModuleType.CTREPCM, 0);
|
|
|
|
|
Solenoid solenoid2 = new Solenoid(PneumaticsModuleType.CTREPCM, 1);
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
solenoid1.set(false);
|
|
|
|
|
solenoid2.set(false);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
2015-11-14 16:54:07 -08:00
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
2015-06-25 15:07:55 -04:00
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
2015-11-14 16:54:07 -08:00
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not report off", solenoid2.get());
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
// Turn Solenoid #1 on, and turn Solenoid #2 off
|
|
|
|
|
solenoid1.set(true);
|
|
|
|
|
solenoid2.set(false);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertFalse("Solenoid #1 did not turn on", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
2015-11-14 16:54:07 -08:00
|
|
|
assertTrue("Solenoid #1 did not report on", solenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not report off", solenoid2.get());
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
// Turn Solenoid #1 off, and turn Solenoid #2 on
|
|
|
|
|
solenoid1.set(false);
|
|
|
|
|
solenoid2.set(true);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not turn on", fakeSolenoid2.get());
|
2015-11-14 16:54:07 -08:00
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not report on", solenoid2.get());
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
// Turn both Solenoids on
|
|
|
|
|
solenoid1.set(true);
|
|
|
|
|
solenoid2.set(true);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertFalse("Solenoid #1 did not turn on", fakeSolenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not turn on", fakeSolenoid2.get());
|
2015-11-14 16:54:07 -08:00
|
|
|
assertTrue("Solenoid #1 did not report on", solenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not report on", solenoid2.get());
|
2015-06-25 15:07:55 -04:00
|
|
|
|
2018-05-22 23:33:17 -07:00
|
|
|
solenoid1.close();
|
|
|
|
|
solenoid2.close();
|
2015-06-25 15:07:55 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2016-05-20 12:07:40 -04:00
|
|
|
* Test if the correct solenoids turn on and off when they should when used with the
|
|
|
|
|
* DoubleSolenoid class.
|
2015-06-25 15:07:55 -04:00
|
|
|
*/
|
|
|
|
|
@Test
|
|
|
|
|
public void doubleSolenoid() {
|
2021-09-16 18:50:27 -07:00
|
|
|
DoubleSolenoid solenoid = new DoubleSolenoid(PneumaticsModuleType.CTREPCM, 0, 1);
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
solenoid.set(DoubleSolenoid.Value.kOff);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
2017-07-28 22:24:05 -07:00
|
|
|
assertTrue("DoubleSolenoid did not report off", solenoid.get() == DoubleSolenoid.Value.kOff);
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
solenoid.set(DoubleSolenoid.Value.kForward);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertFalse("Solenoid #1 did not turn on", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
2020-12-29 22:45:16 -08:00
|
|
|
assertTrue(
|
|
|
|
|
"DoubleSolenoid did not report Forward", solenoid.get() == DoubleSolenoid.Value.kForward);
|
2015-06-25 15:07:55 -04:00
|
|
|
|
|
|
|
|
solenoid.set(DoubleSolenoid.Value.kReverse);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not turn on", fakeSolenoid2.get());
|
2020-12-29 22:45:16 -08:00
|
|
|
assertTrue(
|
|
|
|
|
"DoubleSolenoid did not report Reverse", solenoid.get() == DoubleSolenoid.Value.kReverse);
|
2015-06-25 15:07:55 -04:00
|
|
|
|
2018-05-22 23:33:17 -07:00
|
|
|
solenoid.close();
|
2015-06-25 15:07:55 -04:00
|
|
|
}
|
|
|
|
|
|
2020-12-29 22:45:16 -08:00
|
|
|
/** Test if the correct solenoids turn on and off when they should. */
|
2017-11-26 12:55:21 -08:00
|
|
|
@Test
|
|
|
|
|
public void testOneShot() throws Exception {
|
|
|
|
|
reset();
|
|
|
|
|
|
2021-09-16 18:50:27 -07:00
|
|
|
Solenoid solenoid1 = new Solenoid(PneumaticsModuleType.CTREPCM, 0);
|
|
|
|
|
Solenoid solenoid2 = new Solenoid(PneumaticsModuleType.CTREPCM, 1);
|
2017-11-26 12:55:21 -08:00
|
|
|
|
|
|
|
|
solenoid1.set(false);
|
|
|
|
|
solenoid2.set(false);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
|
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not report off", solenoid2.get());
|
|
|
|
|
|
|
|
|
|
// Pulse Solenoid #1 on, and turn Solenoid #2 off
|
|
|
|
|
solenoid1.setPulseDuration(2 * kSolenoidDelayTime);
|
|
|
|
|
solenoid1.startPulse();
|
|
|
|
|
solenoid2.set(false);
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertFalse("Solenoid #1 did not turn on", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
|
|
|
|
assertTrue("Solenoid #1 did not report on", solenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not report off", solenoid2.get());
|
|
|
|
|
Timer.delay(2 * kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
|
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not report off", solenoid2.get());
|
|
|
|
|
|
|
|
|
|
// Turn Solenoid #1 off, and pulse Solenoid #2 on
|
|
|
|
|
solenoid1.set(false);
|
|
|
|
|
solenoid2.setPulseDuration(2 * kSolenoidDelayTime);
|
|
|
|
|
solenoid2.startPulse();
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not turn on", fakeSolenoid2.get());
|
|
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not report on", solenoid2.get());
|
|
|
|
|
Timer.delay(2 * kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
|
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not report off", solenoid2.get());
|
|
|
|
|
|
|
|
|
|
// Pulse both Solenoids on
|
|
|
|
|
solenoid1.setPulseDuration(2 * kSolenoidDelayTime);
|
|
|
|
|
solenoid2.setPulseDuration(2 * kSolenoidDelayTime);
|
|
|
|
|
solenoid1.startPulse();
|
|
|
|
|
solenoid2.startPulse();
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertFalse("Solenoid #1 did not turn on", fakeSolenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not turn on", fakeSolenoid2.get());
|
|
|
|
|
assertTrue("Solenoid #1 did not report on", solenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not report on", solenoid2.get());
|
|
|
|
|
Timer.delay(2 * kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
|
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not report off", solenoid2.get());
|
|
|
|
|
|
|
|
|
|
// Pulse both Solenoids on with different durations
|
|
|
|
|
solenoid1.setPulseDuration(1.5 * kSolenoidDelayTime);
|
|
|
|
|
solenoid2.setPulseDuration(2.5 * kSolenoidDelayTime);
|
|
|
|
|
solenoid1.startPulse();
|
|
|
|
|
solenoid2.startPulse();
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertFalse("Solenoid #1 did not turn on", fakeSolenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not turn on", fakeSolenoid2.get());
|
|
|
|
|
assertTrue("Solenoid #1 did not report on", solenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not report on", solenoid2.get());
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not turn on", fakeSolenoid2.get());
|
|
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not report on", solenoid2.get());
|
|
|
|
|
Timer.delay(kSolenoidDelayTime);
|
|
|
|
|
assertTrue("Solenoid #1 did not turn off", fakeSolenoid1.get());
|
|
|
|
|
assertTrue("Solenoid #2 did not turn off", fakeSolenoid2.get());
|
|
|
|
|
assertFalse("Solenoid #1 did not report off", solenoid1.get());
|
|
|
|
|
assertFalse("Solenoid #2 did not report off", solenoid2.get());
|
|
|
|
|
|
2018-05-22 23:33:17 -07:00
|
|
|
solenoid1.close();
|
|
|
|
|
solenoid2.close();
|
2017-11-26 12:55:21 -08:00
|
|
|
}
|
|
|
|
|
|
2018-06-03 10:00:53 -07:00
|
|
|
@Override
|
2015-06-25 15:07:55 -04:00
|
|
|
protected Logger getClassLogger() {
|
|
|
|
|
return logger;
|
|
|
|
|
}
|
2014-06-12 16:29:47 -04:00
|
|
|
}
|