Skip to content

Commit 0c86080

Browse files
committed
Cleaning up.
Signed-off-by: Mike Stitt <[email protected]>
1 parent ff1713e commit 0c86080

File tree

2 files changed

+125
-134
lines changed

2 files changed

+125
-134
lines changed

subprojects/robotpy-wpilib/wpilib/iterativerobotpy.py

Lines changed: 79 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
1-
import hal
2-
import ntcore
3-
import wpilib
4-
import wpilib._impl
5-
import wpilib._impl.report_error
1+
from enum import Enum
62

7-
from wpilib import DriverStation, DSControlWord
3+
from hal import report, tResourceType, tInstances, observeUserProgramDisabled, \
4+
observeUserProgramTest, observeUserProgramAutonomous, \
5+
observeUserProgramTeleop, simPeriodicBefore, simPeriodicAfter
6+
from ntcore import NetworkTableInstance
7+
from wpilib import DriverStation, DSControlWord, Watchdog, LiveWindow, RobotBase, SmartDashboard, reportWarning
88
from wpilib.shuffleboard import Shuffleboard
99

10+
_kResourceType_SmartDashboard = tResourceType.kResourceType_SmartDashboard
11+
_kSmartDashboard_LiveWindow = tInstances.kSmartDashboard_LiveWindow
1012

11-
from enum import IntEnum
12-
13-
14-
class IterativeRobotMode(IntEnum):
13+
class IterativeRobotMode(Enum):
1514
kNone = 0
1615
kDisabled = 1
1716
kAutonomous = 2
1817
kTeleop = 3
1918
kTest = 4
2019

21-
22-
class IterativeRobotPy(wpilib.RobotBase):
20+
class IterativeRobotPy(RobotBase):
2321

2422
def __init__(self, period: float):
2523
super().__init__()
26-
self._word = DSControlWord()
2724
self._periodS = period
28-
self._watchdog = wpilib.Watchdog(self._periodS, self.printLoopOverrunMessage)
25+
self._watchdog = Watchdog(self._periodS, self.printLoopOverrunMessage)
26+
self._networkTableInstanceDefault = NetworkTableInstance.getDefault()
2927
self._mode: IterativeRobotMode = IterativeRobotMode.kNone
3028
self._lastMode: IterativeRobotMode = IterativeRobotMode.kNone
3129
self._ntFlushEnabled: bool = True
@@ -111,15 +109,9 @@ def setNetworkTablesFlushEnabled(self, enabled: bool):
111109

112110
def enableLiveWindowInTest(self, testLW: bool):
113111
if self.isTestEnabled():
114-
pass
115-
# todo throw
116-
# throw FRC_MakeError(err::IncompatibleMode,
117-
# "Can't configure test mode while in test mode!")
112+
raise RuntimeError("Can't configure test mode while in test mode!")
118113
if not self._reportedLw and testLW:
119-
hal.report(
120-
hal.tResourceType.kResourceType_SmartDashboard,
121-
hal.tInstances.kSmartDashboard_LiveWindow,
122-
)
114+
report(_kResourceType_SmartDashboard, _kSmartDashboard_LiveWindow)
123115
self._reportedLw = True
124116
self._lwEnabledInTest = testLW
125117

@@ -133,106 +125,102 @@ def loopFunc(self):
133125
DriverStation.refreshData()
134126
self._watchdog.reset()
135127

136-
self._word = DSControlWord() # todo switch to a version that does refresh()
137-
138-
self._mode = IterativeRobotMode.kNone
139-
if self._word.isDisabled():
128+
isEnabled, isAutonomous, isTest = self.getControlState()
129+
if not isEnabled:
140130
self._mode = IterativeRobotMode.kDisabled
141-
elif self._word.isAutonomous():
131+
elif isAutonomous:
142132
self._mode = IterativeRobotMode.kAutonomous
143-
elif self._word.isTeleop():
144-
self._mode = IterativeRobotMode.kTeleop
145-
elif self._word.isTest():
133+
elif isTest:
146134
self._mode = IterativeRobotMode.kTest
135+
else:
136+
self._mode = IterativeRobotMode.kTeleop
147137

148-
if not self._calledDsConnected and self._word.isDSAttached():
138+
if not self._calledDsConnected and DSControlWord().isDSAttached():
149139
self._calledDsConnected = True
150140
self.driverStationConnected()
151141

152142
# If self._mode changed, call self._mode exit and entry functions
153-
if self._lastMode != self._mode:
154-
if self._lastMode == IterativeRobotMode.kDisabled:
155-
self.disabledExit()
156-
elif self._lastMode == IterativeRobotMode.kAutonomous:
157-
self.autonomousExit()
158-
elif self._lastMode == IterativeRobotMode.kTeleop:
159-
self.teleopExit()
160-
elif self._lastMode == IterativeRobotMode.kTest:
161-
if self._lwEnabledInTest:
162-
wpilib.LiveWindow.setEnabled(False)
163-
Shuffleboard.disableActuatorWidgets()
164-
self.testExit()
165-
166-
if self._mode == IterativeRobotMode.kDisabled:
167-
self.disabledInit()
168-
self._watchdog.addEpoch("DisabledInit()")
169-
elif self._mode == IterativeRobotMode.kAutonomous:
170-
self.autonomousInit()
171-
self._watchdog.addEpoch("AutonomousInit()")
172-
elif self._mode == IterativeRobotMode.kTeleop:
173-
self.teleopInit()
174-
self._watchdog.addEpoch("TeleopInit()")
175-
elif self._mode == IterativeRobotMode.kTest:
176-
if self._lwEnabledInTest:
177-
wpilib.LiveWindow.setEnabled(True)
178-
Shuffleboard.enableActuatorWidgets()
179-
self.testInit()
180-
self._watchdog.addEpoch("TestInit()")
143+
if self._lastMode is not self._mode:
144+
match self._lastMode:
145+
case IterativeRobotMode.kDisabled:
146+
self.disabledExit()
147+
case IterativeRobotMode.kAutonomous:
148+
self.autonomousExit()
149+
case IterativeRobotMode.kTeleop:
150+
self.teleopExit()
151+
case IterativeRobotMode.kTest:
152+
if self._lwEnabledInTest:
153+
LiveWindow.setEnabled(False)
154+
Shuffleboard.disableActuatorWidgets()
155+
self.testExit()
156+
157+
match self._mode:
158+
case IterativeRobotMode.kDisabled:
159+
self.disabledInit()
160+
self._watchdog.addEpoch("DisabledInit()")
161+
case IterativeRobotMode.kAutonomous:
162+
self.autonomousInit()
163+
self._watchdog.addEpoch("AutonomousInit()")
164+
case IterativeRobotMode.kTeleop:
165+
self.teleopInit()
166+
self._watchdog.addEpoch("TeleopInit()")
167+
case IterativeRobotMode.kTest:
168+
if self._lwEnabledInTest:
169+
LiveWindow.setEnabled(True)
170+
Shuffleboard.enableActuatorWidgets()
171+
self.testInit()
172+
self._watchdog.addEpoch("TestInit()")
181173
self._lastMode = self._mode
182174

183175
# Call the appropriate function depending upon the current robot mode
184-
if self._mode == IterativeRobotMode.kDisabled:
185-
hal.observeUserProgramDisabled()
186-
self.disabledPeriodic()
187-
self._watchdog.addEpoch("DisabledPeriodic()")
188-
elif self._mode == IterativeRobotMode.kAutonomous:
189-
hal.observeUserProgramAutonomous()
190-
self.autonomousPeriodic()
191-
self._watchdog.addEpoch("AutonomousPeriodic()")
192-
elif self._mode == IterativeRobotMode.kTeleop:
193-
hal.observeUserProgramTeleop()
194-
self.teleopPeriodic()
195-
self._watchdog.addEpoch("TeleopPeriodic()")
196-
elif self._mode == IterativeRobotMode.kTest:
197-
hal.observeUserProgramTest()
198-
self.testPeriodic()
199-
self._watchdog.addEpoch("TestPeriodic()")
176+
match self._mode:
177+
case IterativeRobotMode.kDisabled:
178+
observeUserProgramDisabled()
179+
self.disabledPeriodic()
180+
self._watchdog.addEpoch("DisabledPeriodic()")
181+
case IterativeRobotMode.kAutonomous:
182+
observeUserProgramAutonomous()
183+
self.autonomousPeriodic()
184+
self._watchdog.addEpoch("AutonomousPeriodic()")
185+
case IterativeRobotMode.kTeleop:
186+
observeUserProgramTeleop()
187+
self.teleopPeriodic()
188+
self._watchdog.addEpoch("TeleopPeriodic()")
189+
case IterativeRobotMode.kTest:
190+
observeUserProgramTest()
191+
self.testPeriodic()
192+
self._watchdog.addEpoch("TestPeriodic()")
200193

201194
self.robotPeriodic()
202195
self._watchdog.addEpoch("RobotPeriodic()")
203-
#
204-
wpilib.SmartDashboard.updateValues()
196+
197+
SmartDashboard.updateValues()
205198
self._watchdog.addEpoch("SmartDashboard::UpdateValues()")
206-
wpilib.LiveWindow.updateValues()
199+
200+
LiveWindow.updateValues()
207201
self._watchdog.addEpoch("LiveWindow::UpdateValues()")
202+
208203
Shuffleboard.update()
209204
self._watchdog.addEpoch("Shuffleboard::Update()")
205+
210206
if self.isSimulation():
211-
hal.simPeriodicBefore()
207+
simPeriodicBefore()
212208
self.simulationPeriodic()
213-
hal.simPeriodicAfter()
209+
simPeriodicAfter()
214210
self._watchdog.addEpoch("SimulationPeriodic()")
215211

216212
self._watchdog.disable()
217213

218-
# // Flush NetworkTables
214+
# Flush NetworkTables
219215
if self._ntFlushEnabled:
220-
ntcore.NetworkTableInstance.getDefault().flushLocal()
216+
self._networkTableInstanceDefault.flushLocal()
221217

222218
# Warn on loop time overruns
223219
if self._watchdog.isExpired():
224220
self._watchdog.printEpochs()
225221

226222
def printLoopOverrunMessages(self):
227-
# todo ask about this
228-
# cpp has this as a error, java as a warning, is this the right way to call?
229-
# void IterativeRobotBase::PrintLoopOverrunMessage() {
230-
# FRC_ReportError(err::Error, "Loop time of {:.6f}s overrun", m_period.value())
231-
# }
232-
# private void printLoopOverrunMessage() {
233-
# DriverStation.reportWarning("Loop time of " + m_period + "s overrun\n", false);
234-
# }
235-
wpilib._impl.report_error.reportWarning(
223+
reportWarning(
236224
f"Loop time of {self._periodS}s overrun\n", False
237225
)
238226

0 commit comments

Comments
 (0)