Files
allwpilib/wpilibj/src/main/java/edu/wpi/first/wpilibj/TimedRobot.java
Thad House e210073044 Move HAL classes to their own base package (#1317)
Needed for modularization.
2018-09-20 21:59:46 -07:00

100 lines
2.8 KiB
Java

/*----------------------------------------------------------------------------*/
/* Copyright (c) 2017-2018 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj;
import edu.wpi.first.hal.FRCNetComm.tInstances;
import edu.wpi.first.hal.FRCNetComm.tResourceType;
import edu.wpi.first.hal.HAL;
import edu.wpi.first.hal.NotifierJNI;
/**
* TimedRobot implements the IterativeRobotBase robot program framework.
*
* <p>The TimedRobot class is intended to be subclassed by a user creating a robot program.
*
* <p>periodic() functions from the base class are called on an interval by a Notifier instance.
*/
public class TimedRobot extends IterativeRobotBase {
public static final double kDefaultPeriod = 0.02;
// The C pointer to the notifier object. We don't use it directly, it is
// just passed to the JNI bindings.
private final int m_notifier = NotifierJNI.initializeNotifier();
// The absolute expiration time
private double m_expirationTime;
/**
* Constructor for TimedRobot.
*/
protected TimedRobot() {
this(kDefaultPeriod);
}
/**
* Constructor for TimedRobot.
*
* @param period Period in seconds.
*/
protected TimedRobot(double period) {
super(period);
HAL.report(tResourceType.kResourceType_Framework, tInstances.kFramework_Timed);
}
@Override
@SuppressWarnings("NoFinalizer")
protected void finalize() {
NotifierJNI.stopNotifier(m_notifier);
NotifierJNI.cleanNotifier(m_notifier);
}
/**
* Provide an alternate "main loop" via startCompetition().
*/
@Override
@SuppressWarnings("UnsafeFinalization")
public void startCompetition() {
robotInit();
// Tell the DS that the robot is ready to be enabled
HAL.observeUserProgramStarting();
m_expirationTime = RobotController.getFPGATime() * 1e-6 + m_period;
updateAlarm();
// Loop forever, calling the appropriate mode-dependent function
while (true) {
long curTime = NotifierJNI.waitForNotifierAlarm(m_notifier);
if (curTime == 0) {
break;
}
m_expirationTime += m_period;
updateAlarm();
loopFunc();
}
}
/**
* Get time period between calls to Periodic() functions.
*/
public double getPeriod() {
return m_period;
}
/**
* Update the alarm hardware to reflect the next alarm.
*/
@SuppressWarnings("UnsafeFinalization")
private void updateAlarm() {
NotifierJNI.updateNotifierAlarm(m_notifier, (long) (m_expirationTime * 1e6));
}
}