mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
[wpilib] Add TimedRobot functions for running code on mode exit (#3499)
Currently, we have functions like TeleopInit() for running code on mode entry, but no such functions for running code on mode exit, and it's cumbersome to add those in user code without making a custom robot class. This PR adds exit functions to TimedRobot. Some example use cases include DisabledExit() for operations when the robot enables (whether that be into teleop, autonomous, or test) and AutonomousExit() for disabling feedback controllers.
This commit is contained in:
@@ -30,6 +30,11 @@ class TimedRobotTest {
|
||||
public final AtomicInteger m_teleopPeriodicCount = new AtomicInteger(0);
|
||||
public final AtomicInteger m_testPeriodicCount = new AtomicInteger(0);
|
||||
|
||||
public final AtomicInteger m_disabledExitCount = new AtomicInteger(0);
|
||||
public final AtomicInteger m_autonomousExitCount = new AtomicInteger(0);
|
||||
public final AtomicInteger m_teleopExitCount = new AtomicInteger(0);
|
||||
public final AtomicInteger m_testExitCount = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public void robotInit() {
|
||||
m_robotInitCount.addAndGet(1);
|
||||
@@ -89,6 +94,26 @@ class TimedRobotTest {
|
||||
public void testPeriodic() {
|
||||
m_testPeriodicCount.addAndGet(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disabledExit() {
|
||||
m_disabledExitCount.addAndGet(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void autonomousExit() {
|
||||
m_autonomousExitCount.addAndGet(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void teleopExit() {
|
||||
m_teleopExitCount.addAndGet(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void testExit() {
|
||||
m_testExitCount.addAndGet(1);
|
||||
}
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
@@ -131,6 +156,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_robotInitCount.get());
|
||||
@@ -147,6 +177,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_robotInitCount.get());
|
||||
@@ -163,6 +198,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
robot.endCompetition();
|
||||
try {
|
||||
robotThread.interrupt();
|
||||
@@ -205,6 +245,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_robotInitCount.get());
|
||||
@@ -221,6 +266,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_robotInitCount.get());
|
||||
@@ -237,6 +287,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
robot.endCompetition();
|
||||
try {
|
||||
robotThread.interrupt();
|
||||
@@ -279,6 +334,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_robotInitCount.get());
|
||||
@@ -295,6 +355,11 @@ class TimedRobotTest {
|
||||
assertEquals(1, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_robotInitCount.get());
|
||||
@@ -311,6 +376,11 @@ class TimedRobotTest {
|
||||
assertEquals(2, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
robot.endCompetition();
|
||||
try {
|
||||
robotThread.interrupt();
|
||||
@@ -353,6 +423,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(0, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_robotInitCount.get());
|
||||
@@ -369,6 +444,11 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(1, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_robotInitCount.get());
|
||||
@@ -385,6 +465,134 @@ class TimedRobotTest {
|
||||
assertEquals(0, robot.m_teleopPeriodicCount.get());
|
||||
assertEquals(2, robot.m_testPeriodicCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
robot.endCompetition();
|
||||
try {
|
||||
robotThread.interrupt();
|
||||
robotThread.join();
|
||||
} catch (InterruptedException ex) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
robot.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@ResourceLock("timing")
|
||||
void modeChangeTest() {
|
||||
MockRobot robot = new MockRobot();
|
||||
|
||||
Thread robotThread =
|
||||
new Thread(
|
||||
() -> {
|
||||
robot.startCompetition();
|
||||
});
|
||||
robotThread.start();
|
||||
|
||||
// Start in disabled
|
||||
DriverStationSim.setEnabled(false);
|
||||
DriverStationSim.setAutonomous(false);
|
||||
DriverStationSim.setTest(false);
|
||||
DriverStationSim.notifyNewData();
|
||||
SimHooks.stepTiming(0.0); // Wait for Notifiers
|
||||
|
||||
assertEquals(0, robot.m_disabledInitCount.get());
|
||||
assertEquals(0, robot.m_autonomousInitCount.get());
|
||||
assertEquals(0, robot.m_teleopInitCount.get());
|
||||
assertEquals(0, robot.m_testInitCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_disabledInitCount.get());
|
||||
assertEquals(0, robot.m_autonomousInitCount.get());
|
||||
assertEquals(0, robot.m_teleopInitCount.get());
|
||||
assertEquals(0, robot.m_testInitCount.get());
|
||||
|
||||
assertEquals(0, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
// Transition to autonomous
|
||||
DriverStationSim.setEnabled(true);
|
||||
DriverStationSim.setAutonomous(true);
|
||||
DriverStationSim.setTest(false);
|
||||
DriverStationSim.notifyNewData();
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_disabledInitCount.get());
|
||||
assertEquals(1, robot.m_autonomousInitCount.get());
|
||||
assertEquals(0, robot.m_teleopInitCount.get());
|
||||
assertEquals(0, robot.m_testInitCount.get());
|
||||
|
||||
assertEquals(1, robot.m_disabledExitCount.get());
|
||||
assertEquals(0, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
// Transition to teleop
|
||||
DriverStationSim.setEnabled(true);
|
||||
DriverStationSim.setAutonomous(false);
|
||||
DriverStationSim.setTest(false);
|
||||
DriverStationSim.notifyNewData();
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_disabledInitCount.get());
|
||||
assertEquals(1, robot.m_autonomousInitCount.get());
|
||||
assertEquals(1, robot.m_teleopInitCount.get());
|
||||
assertEquals(0, robot.m_testInitCount.get());
|
||||
|
||||
assertEquals(1, robot.m_disabledExitCount.get());
|
||||
assertEquals(1, robot.m_autonomousExitCount.get());
|
||||
assertEquals(0, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
// Transition to test
|
||||
DriverStationSim.setEnabled(true);
|
||||
DriverStationSim.setAutonomous(false);
|
||||
DriverStationSim.setTest(true);
|
||||
DriverStationSim.notifyNewData();
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(1, robot.m_disabledInitCount.get());
|
||||
assertEquals(1, robot.m_autonomousInitCount.get());
|
||||
assertEquals(1, robot.m_teleopInitCount.get());
|
||||
assertEquals(1, robot.m_testInitCount.get());
|
||||
|
||||
assertEquals(1, robot.m_disabledExitCount.get());
|
||||
assertEquals(1, robot.m_autonomousExitCount.get());
|
||||
assertEquals(1, robot.m_teleopExitCount.get());
|
||||
assertEquals(0, robot.m_testExitCount.get());
|
||||
|
||||
// Transition to disabled
|
||||
DriverStationSim.setEnabled(false);
|
||||
DriverStationSim.setAutonomous(false);
|
||||
DriverStationSim.setTest(false);
|
||||
DriverStationSim.notifyNewData();
|
||||
|
||||
SimHooks.stepTiming(0.02);
|
||||
|
||||
assertEquals(2, robot.m_disabledInitCount.get());
|
||||
assertEquals(1, robot.m_autonomousInitCount.get());
|
||||
assertEquals(1, robot.m_teleopInitCount.get());
|
||||
assertEquals(1, robot.m_testInitCount.get());
|
||||
|
||||
assertEquals(1, robot.m_disabledExitCount.get());
|
||||
assertEquals(1, robot.m_autonomousExitCount.get());
|
||||
assertEquals(1, robot.m_teleopExitCount.get());
|
||||
assertEquals(1, robot.m_testExitCount.get());
|
||||
|
||||
robot.endCompetition();
|
||||
try {
|
||||
robotThread.interrupt();
|
||||
|
||||
Reference in New Issue
Block a user