mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
111 lines
3.2 KiB
Java
111 lines
3.2 KiB
Java
// Copyright (c) FIRST and other WPILib contributors.
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
// the WPILib BSD license file in the root directory of this project.
|
|
|
|
package org.wpilib.internal;
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import org.wpilib.driverstation.DriverStation;
|
|
import org.wpilib.hardware.hal.DriverStationJNI;
|
|
import org.wpilib.util.WPIUtilJNI;
|
|
|
|
/** For internal use only. */
|
|
public class DriverStationModeThread implements AutoCloseable {
|
|
private final AtomicBoolean m_keepAlive = new AtomicBoolean();
|
|
private final Thread m_thread;
|
|
|
|
private boolean m_userInDisabled;
|
|
private boolean m_userInAutonomous;
|
|
private boolean m_userInTeleop;
|
|
private boolean m_userInTest;
|
|
|
|
/** Internal use only. */
|
|
public DriverStationModeThread() {
|
|
m_keepAlive.set(true);
|
|
m_thread = new Thread(this::run, "DriverStationMode");
|
|
m_thread.start();
|
|
}
|
|
|
|
private void run() {
|
|
int handle = WPIUtilJNI.createEvent(false, false);
|
|
DriverStationJNI.provideNewDataEventHandle(handle);
|
|
|
|
while (m_keepAlive.get()) {
|
|
try {
|
|
WPIUtilJNI.waitForObjectTimeout(handle, 0.1);
|
|
} catch (InterruptedException e) {
|
|
DriverStationJNI.removeNewDataEventHandle(handle);
|
|
WPIUtilJNI.destroyEvent(handle);
|
|
Thread.currentThread().interrupt();
|
|
return;
|
|
}
|
|
DriverStation.refreshData();
|
|
if (m_userInDisabled) {
|
|
DriverStationJNI.observeUserProgramDisabled();
|
|
}
|
|
if (m_userInAutonomous) {
|
|
DriverStationJNI.observeUserProgramAutonomous();
|
|
}
|
|
if (m_userInTeleop) {
|
|
DriverStationJNI.observeUserProgramTeleop();
|
|
}
|
|
if (m_userInTest) {
|
|
DriverStationJNI.observeUserProgramTest();
|
|
}
|
|
}
|
|
|
|
DriverStationJNI.removeNewDataEventHandle(handle);
|
|
WPIUtilJNI.destroyEvent(handle);
|
|
}
|
|
|
|
/**
|
|
* Only to be used to tell the Driver Station what code you claim to be executing for diagnostic
|
|
* purposes only.
|
|
*
|
|
* @param entering If true, starting disabled code; if false, leaving disabled code
|
|
*/
|
|
public void inDisabled(boolean entering) {
|
|
m_userInDisabled = entering;
|
|
}
|
|
|
|
/**
|
|
* Only to be used to tell the Driver Station what code you claim to be executing for diagnostic
|
|
* purposes only.
|
|
*
|
|
* @param entering If true, starting autonomous code; if false, leaving autonomous code
|
|
*/
|
|
public void inAutonomous(boolean entering) {
|
|
m_userInAutonomous = entering;
|
|
}
|
|
|
|
/**
|
|
* Only to be used to tell the Driver Station what code you claim to be executing for diagnostic
|
|
* purposes only.
|
|
*
|
|
* @param entering If true, starting teleop code; if false, leaving teleop code
|
|
*/
|
|
public void inTeleop(boolean entering) {
|
|
m_userInTeleop = entering;
|
|
}
|
|
|
|
/**
|
|
* Only to be used to tell the Driver Station what code you claim to be executing for diagnostic
|
|
* purposes only.
|
|
*
|
|
* @param entering If true, starting test code; if false, leaving test code
|
|
*/
|
|
public void inTest(boolean entering) {
|
|
m_userInTest = entering;
|
|
}
|
|
|
|
@Override
|
|
public void close() {
|
|
m_keepAlive.set(false);
|
|
try {
|
|
m_thread.join();
|
|
} catch (InterruptedException e) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|