diff --git a/wpilibc/athena/include/DriverStation.h b/wpilibc/athena/include/DriverStation.h index 0f0176c750..67668c8d2a 100644 --- a/wpilibc/athena/include/DriverStation.h +++ b/wpilibc/athena/include/DriverStation.h @@ -116,6 +116,7 @@ class DriverStation : public SensorBase, public RobotStateInterface { mutable Semaphore m_newControlData{Semaphore::kEmpty}; mutable priority_condition_variable m_packetDataAvailableCond; priority_mutex m_packetDataAvailableMutex; + bool m_updatedControlLoopData = false; std::condition_variable_any m_waitForDataCond; priority_mutex m_waitForDataMutex; mutable priority_mutex m_joystickDataMutex; diff --git a/wpilibc/athena/src/DriverStation.cpp b/wpilibc/athena/src/DriverStation.cpp index 1822d6e8bc..290be1a641 100644 --- a/wpilibc/athena/src/DriverStation.cpp +++ b/wpilibc/athena/src/DriverStation.cpp @@ -80,6 +80,10 @@ void DriverStation::Run() { m_packetDataAvailableCond.wait(lock); } GetData(); + { + std::lock_guard lock(m_waitForDataMutex); + m_updatedControlLoopData = true; + } m_waitForDataCond.notify_all(); if (++period >= 4) { @@ -554,7 +558,10 @@ uint32_t DriverStation::GetLocation() const { */ void DriverStation::WaitForData() { std::unique_lock lock(m_waitForDataMutex); - m_waitForDataCond.wait(lock); + while (!m_updatedControlLoopData) { + m_waitForDataCond.wait(lock); + } + m_updatedControlLoopData = false; } /** diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DriverStation.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DriverStation.java index d2349a0065..6b96a9b6ae 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DriverStation.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DriverStation.java @@ -99,6 +99,7 @@ public class DriverStation implements RobotState.Interface { private boolean m_userInAutonomous = false; private boolean m_userInTeleop = false; private boolean m_userInTest = false; + private boolean m_updatedControlLoopData; private boolean m_newControlData; private final long m_packetDataAvailableMutex; private final long m_packetDataAvailableSem; @@ -160,6 +161,7 @@ public class DriverStation implements RobotState.Interface { HALUtil.takeMultiWait(m_packetDataAvailableSem, m_packetDataAvailableMutex); getData(); synchronized (m_dataSem) { + m_updatedControlLoopData = true; m_dataSem.notifyAll(); } if (++safetyCounter >= 4) { @@ -197,7 +199,10 @@ public class DriverStation implements RobotState.Interface { public void waitForData(long timeout) { synchronized (m_dataSem) { try { - m_dataSem.wait(timeout); + while (!m_updatedControlLoopData) { + m_dataSem.wait(timeout); + } + m_updatedControlLoopData = false; } catch (InterruptedException ex) { Thread.currentThread().interrupt(); }