[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:
Tyler Veness
2021-08-05 19:08:29 -07:00
committed by GitHub
parent 94e0db7963
commit fb2ee8ec34
5 changed files with 603 additions and 98 deletions

View File

@@ -94,6 +94,14 @@ void IterativeRobotBase::TestPeriodic() {
}
}
void IterativeRobotBase::DisabledExit() {}
void IterativeRobotBase::AutonomousExit() {}
void IterativeRobotBase::TeleopExit() {}
void IterativeRobotBase::TestExit() {}
void IterativeRobotBase::SetNetworkTablesFlushEnabled(bool enabled) {
m_ntFlushEnabled = enabled;
}
@@ -105,60 +113,67 @@ units::second_t IterativeRobotBase::GetPeriod() const {
void IterativeRobotBase::LoopFunc() {
m_watchdog.Reset();
// Call the appropriate function depending upon the current robot mode
// Get current mode
Mode mode = Mode::kNone;
if (IsDisabled()) {
// Call DisabledInit() if we are now just entering disabled mode from
// either a different mode or from power-on.
if (m_lastMode != Mode::kDisabled) {
mode = Mode::kDisabled;
} else if (IsAutonomous()) {
mode = Mode::kAutonomous;
} else if (IsOperatorControl()) {
mode = Mode::kTeleop;
} else if (IsTest()) {
mode = Mode::kTest;
}
// If mode changed, call mode exit and entry functions
if (m_lastMode != mode) {
// Call last mode's exit function
if (m_lastMode == Mode::kDisabled) {
DisabledExit();
} else if (m_lastMode == Mode::kAutonomous) {
AutonomousExit();
} else if (m_lastMode == Mode::kTeleop) {
TeleopExit();
} else if (m_lastMode == Mode::kTest) {
LiveWindow::SetEnabled(false);
Shuffleboard::DisableActuatorWidgets();
TestExit();
}
// Call current mode's entry function
if (mode == Mode::kDisabled) {
DisabledInit();
m_watchdog.AddEpoch("DisabledInit()");
m_lastMode = Mode::kDisabled;
}
HAL_ObserveUserProgramDisabled();
DisabledPeriodic();
m_watchdog.AddEpoch("DisabledPeriodic()");
} else if (IsAutonomous()) {
// Call AutonomousInit() if we are now just entering autonomous mode from
// either a different mode or from power-on.
if (m_lastMode != Mode::kAutonomous) {
LiveWindow::SetEnabled(false);
Shuffleboard::DisableActuatorWidgets();
} else if (mode == Mode::kAutonomous) {
AutonomousInit();
m_watchdog.AddEpoch("AutonomousInit()");
m_lastMode = Mode::kAutonomous;
}
HAL_ObserveUserProgramAutonomous();
AutonomousPeriodic();
m_watchdog.AddEpoch("AutonomousPeriodic()");
} else if (IsOperatorControl()) {
// Call TeleopInit() if we are now just entering teleop mode from
// either a different mode or from power-on.
if (m_lastMode != Mode::kTeleop) {
LiveWindow::SetEnabled(false);
Shuffleboard::DisableActuatorWidgets();
} else if (mode == Mode::kTeleop) {
TeleopInit();
m_watchdog.AddEpoch("TeleopInit()");
m_lastMode = Mode::kTeleop;
}
HAL_ObserveUserProgramTeleop();
TeleopPeriodic();
m_watchdog.AddEpoch("TeleopPeriodic()");
} else {
// Call TestInit() if we are now just entering test mode from
// either a different mode or from power-on.
if (m_lastMode != Mode::kTest) {
} else if (mode == Mode::kTest) {
LiveWindow::SetEnabled(true);
Shuffleboard::EnableActuatorWidgets();
TestInit();
m_watchdog.AddEpoch("TestInit()");
m_lastMode = Mode::kTest;
}
m_lastMode = mode;
}
// Call the appropriate function depending upon the current robot mode
if (mode == Mode::kDisabled) {
HAL_ObserveUserProgramDisabled();
DisabledPeriodic();
m_watchdog.AddEpoch("DisabledPeriodic()");
} else if (mode == Mode::kAutonomous) {
HAL_ObserveUserProgramAutonomous();
AutonomousPeriodic();
m_watchdog.AddEpoch("AutonomousPeriodic()");
} else if (mode == Mode::kTeleop) {
HAL_ObserveUserProgramTeleop();
TeleopPeriodic();
m_watchdog.AddEpoch("TeleopPeriodic()");
} else if (mode == Mode::kTest) {
HAL_ObserveUserProgramTest();
TestPeriodic();
m_watchdog.AddEpoch("TestPeriodic()");