/** * Start a competition. * This code needs to track the order of the field starting to ensure that everything happens * in the right order. Repeatedly run the correct method, either Autonomous or OperatorControl * or Test when the robot is enabled. After running the correct method, wait for some state to * change, either the other mode starts or the robot is disabled. Then go back and wait for the * robot to be enabled again. */ void SampleRobot::StartCompetition() { LiveWindow *lw = LiveWindow::GetInstance(); SmartDashboard::init(); NetworkTable::GetTable("LiveWindow")->GetSubTable("~STATUS~")->PutBoolean("LW Enabled", false); RobotMain(); if (!m_robotMainOverridden) { // first and one-time initialization lw->SetEnabled(false); RobotInit(); while (true) { if (IsDisabled()) { m_ds.InDisabled(true); Disabled(); m_ds.InDisabled(false); while (IsDisabled()) sleep(1); //m_ds.WaitForData(); } else if (IsAutonomous()) { m_ds.InAutonomous(true); Autonomous(); m_ds.InAutonomous(false); while (IsAutonomous() && IsEnabled()) sleep(1); //m_ds.WaitForData(); } else if (IsTest()) { lw->SetEnabled(true); m_ds.InTest(true); Test(); m_ds.InTest(false); while (IsTest() && IsEnabled()) sleep(1); //m_ds.WaitForData(); lw->SetEnabled(false); } else { m_ds.InOperatorControl(true); OperatorControl(); m_ds.InOperatorControl(false); while (IsOperatorControl() && IsEnabled()) sleep(1); //m_ds.WaitForData(); } } } }
/** * Provide an alternate "main loop" via StartCompetition(). * * This specific StartCompetition() implements "main loop" behavior like that of the FRC * control system in 2008 and earlier, with a primary (slow) loop that is * called periodically, and a "fast loop" (a.k.a. "spin loop") that is * called as fast as possible with no delay between calls. */ void IterativeRobot::StartCompetition() { LiveWindow *lw = LiveWindow::GetInstance(); // first and one-time initialization SmartDashboard::init(); NetworkTable::GetTable("LiveWindow")->GetSubTable("~STATUS~")->PutBoolean("LW Enabled", false); RobotInit(); // loop forever, calling the appropriate mode-dependent function lw->SetEnabled(false); while (true) { // Call the appropriate function depending upon the current robot mode if (IsDisabled()) { // call DisabledInit() if we are now just entering disabled mode from // either a different mode or from power-on if(!m_disabledInitialized) { lw->SetEnabled(false); DisabledInit(); m_disabledInitialized = true; // reset the initialization flags for the other modes m_autonomousInitialized = false; m_teleopInitialized = false; m_testInitialized = false; } if (NextPeriodReady()) { // TODO: HALNetworkCommunicationObserveUserProgramDisabled(); 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_autonomousInitialized) { lw->SetEnabled(false); AutonomousInit(); m_autonomousInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_teleopInitialized = false; m_testInitialized = false; } if (NextPeriodReady()) { // TODO: HALNetworkCommunicationObserveUserProgramAutonomous(); AutonomousPeriodic(); } } else if (IsTest()) { // call TestInit() if we are now just entering test mode from // either a different mode or from power-on if(!m_testInitialized) { lw->SetEnabled(true); TestInit(); m_testInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_autonomousInitialized = false; m_teleopInitialized = false; } if (NextPeriodReady()) { // TODO: HALNetworkCommunicationObserveUserProgramTest(); TestPeriodic(); } } else { // call TeleopInit() if we are now just entering teleop mode from // either a different mode or from power-on if(!m_teleopInitialized) { lw->SetEnabled(false); TeleopInit(); m_teleopInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_autonomousInitialized = false; m_testInitialized = false; Scheduler::GetInstance()->SetEnabled(true); } if (NextPeriodReady()) { // TODO: HALNetworkCommunicationObserveUserProgramTeleop(); TeleopPeriodic(); } } // wait for driver station data so the loop doesn't hog the CPU m_ds.WaitForData(); } }
/** * Provide an alternate "main loop" via StartCompetition(). * * This specific StartCompetition() implements "main loop" behaviour synced with the DS packets */ void IterativeRobot::StartCompetition() { HALReport(HALUsageReporting::kResourceType_Framework, HALUsageReporting::kFramework_Iterative); LiveWindow *lw = LiveWindow::GetInstance(); // first and one-time initialization SmartDashboard::init(); NetworkTable::GetTable("LiveWindow")->GetSubTable("~STATUS~")->PutBoolean("LW Enabled", false); RobotInit(); // We call this now (not in Prestart like default) so that the robot // won't enable until the initialization has finished. This is useful // because otherwise it's sometimes possible to enable the robot // before the code is ready. HALNetworkCommunicationObserveUserProgramStarting(); // loop forever, calling the appropriate mode-dependent function lw->SetEnabled(false); while (true) { // Call the appropriate function depending upon the current robot mode if (IsDisabled()) { // call DisabledInit() if we are now just entering disabled mode from // either a different mode or from power-on if(!m_disabledInitialized) { lw->SetEnabled(false); DisabledInit(); m_disabledInitialized = true; // reset the initialization flags for the other modes m_autonomousInitialized = false; m_teleopInitialized = false; m_testInitialized = false; } HALNetworkCommunicationObserveUserProgramDisabled(); 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_autonomousInitialized) { lw->SetEnabled(false); AutonomousInit(); m_autonomousInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_teleopInitialized = false; m_testInitialized = false; } HALNetworkCommunicationObserveUserProgramAutonomous(); AutonomousPeriodic(); } else if (IsTest()) { // call TestInit() if we are now just entering test mode from // either a different mode or from power-on if(!m_testInitialized) { lw->SetEnabled(true); TestInit(); m_testInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_autonomousInitialized = false; m_teleopInitialized = false; } HALNetworkCommunicationObserveUserProgramTest(); TestPeriodic(); } else { // call TeleopInit() if we are now just entering teleop mode from // either a different mode or from power-on if(!m_teleopInitialized) { lw->SetEnabled(false); TeleopInit(); m_teleopInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_autonomousInitialized = false; m_testInitialized = false; Scheduler::GetInstance()->SetEnabled(true); } HALNetworkCommunicationObserveUserProgramTeleop(); TeleopPeriodic(); } // wait for driver station data so the loop doesn't hog the CPU m_ds->WaitForData(); } }
/** * Provide an alternate "main loop" via StartCompetition(). * * This specific StartCompetition() implements "main loop" behaviour synced with * the DS packets. */ void IterativeRobot::StartCompetition() { HAL_Report(HALUsageReporting::kResourceType_Framework, HALUsageReporting::kFramework_Iterative); LiveWindow* lw = LiveWindow::GetInstance(); // first and one-time initialization NetworkTable::GetTable("LiveWindow") ->GetSubTable("~STATUS~") ->PutBoolean("LW Enabled", false); RobotInit(); // Tell the DS that the robot is ready to be enabled HAL_ObserveUserProgramStarting(); // loop forever, calling the appropriate mode-dependent function lw->SetEnabled(false); while (true) { // wait for driver station data so the loop doesn't hog the CPU m_ds.WaitForData(); // Call the appropriate function depending upon the current robot mode if (IsDisabled()) { // call DisabledInit() if we are now just entering disabled mode from // either a different mode or from power-on if (!m_disabledInitialized) { lw->SetEnabled(false); DisabledInit(); m_disabledInitialized = true; // reset the initialization flags for the other modes m_autonomousInitialized = false; m_teleopInitialized = false; m_testInitialized = false; } HAL_ObserveUserProgramDisabled(); 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_autonomousInitialized) { lw->SetEnabled(false); AutonomousInit(); m_autonomousInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_teleopInitialized = false; m_testInitialized = false; } HAL_ObserveUserProgramAutonomous(); AutonomousPeriodic(); } else if (IsTest()) { // call TestInit() if we are now just entering test mode from // either a different mode or from power-on if (!m_testInitialized) { lw->SetEnabled(true); TestInit(); m_testInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_autonomousInitialized = false; m_teleopInitialized = false; } HAL_ObserveUserProgramTest(); TestPeriodic(); } else { // call TeleopInit() if we are now just entering teleop mode from // either a different mode or from power-on if (!m_teleopInitialized) { lw->SetEnabled(false); TeleopInit(); m_teleopInitialized = true; // reset the initialization flags for the other modes m_disabledInitialized = false; m_autonomousInitialized = false; m_testInitialized = false; Scheduler::GetInstance()->SetEnabled(true); } HAL_ObserveUserProgramTeleop(); TeleopPeriodic(); } RobotPeriodic(); } }