blob: 2997234f11ae9c56d6f291a02934cfc90a237145 [file] [log] [blame]
Brian Silverman41cdd3e2019-01-19 19:48:58 -08001/*----------------------------------------------------------------------------*/
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -08002/* Copyright (c) 2017-2019 FIRST. All Rights Reserved. */
Brian Silverman41cdd3e2019-01-19 19:48:58 -08003/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8#include "frc/IterativeRobotBase.h"
9
10#include <cstdio>
11
James Kuszmaul4b81d302019-12-14 20:53:14 -080012#include <hal/DriverStation.h>
13#include <hal/FRCUsageReporting.h>
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080014#include <wpi/Format.h>
Brian Silverman41cdd3e2019-01-19 19:48:58 -080015#include <wpi/SmallString.h>
16#include <wpi/raw_ostream.h>
17
18#include "frc/DriverStation.h"
19#include "frc/Timer.h"
Brian Silverman41cdd3e2019-01-19 19:48:58 -080020#include "frc/livewindow/LiveWindow.h"
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080021#include "frc/shuffleboard/Shuffleboard.h"
Brian Silverman41cdd3e2019-01-19 19:48:58 -080022#include "frc/smartdashboard/SmartDashboard.h"
23
24using namespace frc;
25
26IterativeRobotBase::IterativeRobotBase(double period)
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080027 : IterativeRobotBase(units::second_t(period)) {}
28
29IterativeRobotBase::IterativeRobotBase(units::second_t period)
Brian Silverman41cdd3e2019-01-19 19:48:58 -080030 : m_period(period),
31 m_watchdog(period, [this] { PrintLoopOverrunMessage(); }) {}
32
33void IterativeRobotBase::RobotInit() {
Brian Silverman60246092019-03-02 13:29:58 -080034 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080035}
36
37void IterativeRobotBase::DisabledInit() {
Brian Silverman60246092019-03-02 13:29:58 -080038 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080039}
40
41void IterativeRobotBase::AutonomousInit() {
Brian Silverman60246092019-03-02 13:29:58 -080042 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080043}
44
45void IterativeRobotBase::TeleopInit() {
Brian Silverman60246092019-03-02 13:29:58 -080046 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080047}
48
49void IterativeRobotBase::TestInit() {
Brian Silverman60246092019-03-02 13:29:58 -080050 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080051}
52
53void IterativeRobotBase::RobotPeriodic() {
54 static bool firstRun = true;
55 if (firstRun) {
Brian Silverman60246092019-03-02 13:29:58 -080056 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080057 firstRun = false;
58 }
59}
60
61void IterativeRobotBase::DisabledPeriodic() {
62 static bool firstRun = true;
63 if (firstRun) {
Brian Silverman60246092019-03-02 13:29:58 -080064 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080065 firstRun = false;
66 }
67}
68
69void IterativeRobotBase::AutonomousPeriodic() {
70 static bool firstRun = true;
71 if (firstRun) {
Brian Silverman60246092019-03-02 13:29:58 -080072 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080073 firstRun = false;
74 }
75}
76
77void IterativeRobotBase::TeleopPeriodic() {
78 static bool firstRun = true;
79 if (firstRun) {
Brian Silverman60246092019-03-02 13:29:58 -080080 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080081 firstRun = false;
82 }
83}
84
85void IterativeRobotBase::TestPeriodic() {
86 static bool firstRun = true;
87 if (firstRun) {
Brian Silverman60246092019-03-02 13:29:58 -080088 wpi::outs() << "Default " << __FUNCTION__ << "() method... Override me!\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -080089 firstRun = false;
90 }
91}
92
93void IterativeRobotBase::LoopFunc() {
94 m_watchdog.Reset();
95
96 // Call the appropriate function depending upon the current robot mode
97 if (IsDisabled()) {
98 // Call DisabledInit() if we are now just entering disabled mode from
99 // either a different mode or from power-on.
100 if (m_lastMode != Mode::kDisabled) {
101 LiveWindow::GetInstance()->SetEnabled(false);
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -0800102 Shuffleboard::DisableActuatorWidgets();
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800103 DisabledInit();
104 m_watchdog.AddEpoch("DisabledInit()");
105 m_lastMode = Mode::kDisabled;
106 }
107
108 HAL_ObserveUserProgramDisabled();
109 DisabledPeriodic();
110 m_watchdog.AddEpoch("DisabledPeriodic()");
111 } else if (IsAutonomous()) {
112 // Call AutonomousInit() if we are now just entering autonomous mode from
113 // either a different mode or from power-on.
114 if (m_lastMode != Mode::kAutonomous) {
115 LiveWindow::GetInstance()->SetEnabled(false);
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -0800116 Shuffleboard::DisableActuatorWidgets();
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800117 AutonomousInit();
118 m_watchdog.AddEpoch("AutonomousInit()");
119 m_lastMode = Mode::kAutonomous;
120 }
121
122 HAL_ObserveUserProgramAutonomous();
123 AutonomousPeriodic();
124 m_watchdog.AddEpoch("AutonomousPeriodic()");
125 } else if (IsOperatorControl()) {
126 // Call TeleopInit() if we are now just entering teleop mode from
127 // either a different mode or from power-on.
128 if (m_lastMode != Mode::kTeleop) {
129 LiveWindow::GetInstance()->SetEnabled(false);
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -0800130 Shuffleboard::DisableActuatorWidgets();
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800131 TeleopInit();
132 m_watchdog.AddEpoch("TeleopInit()");
133 m_lastMode = Mode::kTeleop;
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800134 }
135
136 HAL_ObserveUserProgramTeleop();
137 TeleopPeriodic();
138 m_watchdog.AddEpoch("TeleopPeriodic()");
139 } else {
140 // Call TestInit() if we are now just entering test mode from
141 // either a different mode or from power-on.
142 if (m_lastMode != Mode::kTest) {
143 LiveWindow::GetInstance()->SetEnabled(true);
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -0800144 Shuffleboard::EnableActuatorWidgets();
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800145 TestInit();
146 m_watchdog.AddEpoch("TestInit()");
147 m_lastMode = Mode::kTest;
148 }
149
150 HAL_ObserveUserProgramTest();
151 TestPeriodic();
152 m_watchdog.AddEpoch("TestPeriodic()");
153 }
154
155 RobotPeriodic();
156 m_watchdog.AddEpoch("RobotPeriodic()");
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800157
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -0800158 SmartDashboard::UpdateValues();
159 m_watchdog.AddEpoch("SmartDashboard::UpdateValues()");
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800160 LiveWindow::GetInstance()->UpdateValues();
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -0800161 m_watchdog.AddEpoch("LiveWindow::UpdateValues()");
162 Shuffleboard::Update();
163 m_watchdog.AddEpoch("Shuffleboard::Update()");
164 m_watchdog.Disable();
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800165
166 // Warn on loop time overruns
167 if (m_watchdog.IsExpired()) {
168 m_watchdog.PrintEpochs();
169 }
170}
171
172void IterativeRobotBase::PrintLoopOverrunMessage() {
173 wpi::SmallString<128> str;
174 wpi::raw_svector_ostream buf(str);
175
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -0800176 buf << "Loop time of " << wpi::format("%.6f", m_period.to<double>())
177 << "s overrun\n";
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800178
179 DriverStation::ReportWarning(str);
180}