mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-07-03 03:01:44 +00:00
Merge "Keep Notifier firing after FPGA rollover (fixes artf3582), simulation may still have an issue with counter rollover"
This commit is contained in:
@@ -36,6 +36,9 @@ public:
|
|||||||
static double GetPPCTimestamp();
|
static double GetPPCTimestamp();
|
||||||
static double GetMatchTime();
|
static double GetMatchTime();
|
||||||
|
|
||||||
|
// The time, in seconds, at which the 32-bit FPGA timestamp rolls over to 0
|
||||||
|
static constexpr double kRolloverTime = (1ll << 32) / 1e6;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double m_startTime;
|
double m_startTime;
|
||||||
double m_accumulatedTime;
|
double m_accumulatedTime;
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ void Notifier::ProcessQueue(uint32_t mask, void *params)
|
|||||||
* Insert this Notifier into the timer queue in right place.
|
* Insert this Notifier into the timer queue in right place.
|
||||||
* WARNING: this method does not do synchronization! It must be called from somewhere
|
* WARNING: this method does not do synchronization! It must be called from somewhere
|
||||||
* that is taking care of synchronizing access to the queue.
|
* that is taking care of synchronizing access to the queue.
|
||||||
* @param reschedule If false, the scheduled alarm is based on the curent time and UpdateAlarm
|
* @param reschedule If false, the scheduled alarm is based on the current time and UpdateAlarm
|
||||||
* method is called which will enable the alarm if necessary.
|
* method is called which will enable the alarm if necessary.
|
||||||
* If true, update the time by adding the period (no drift) when rescheduled periodic from ProcessQueue.
|
* If true, update the time by adding the period (no drift) when rescheduled periodic from ProcessQueue.
|
||||||
* This ensures that the public methods only update the queue after finishing inserting.
|
* This ensures that the public methods only update the queue after finishing inserting.
|
||||||
@@ -153,6 +153,10 @@ void Notifier::InsertInQueue(bool reschedule)
|
|||||||
{
|
{
|
||||||
m_expirationTime = GetClock() + m_period;
|
m_expirationTime = GetClock() + m_period;
|
||||||
}
|
}
|
||||||
|
if (m_expirationTime > Timer::kRolloverTime)
|
||||||
|
{
|
||||||
|
m_expirationTime -= Timer::kRolloverTime;
|
||||||
|
}
|
||||||
if (timerQueueHead == NULL || timerQueueHead->m_expirationTime >= this->m_expirationTime)
|
if (timerQueueHead == NULL || timerQueueHead->m_expirationTime >= this->m_expirationTime)
|
||||||
{
|
{
|
||||||
// the queue is empty or greater than the new entry
|
// the queue is empty or greater than the new entry
|
||||||
|
|||||||
@@ -13,9 +13,6 @@
|
|||||||
#include "Utility.h"
|
#include "Utility.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
// The time, in seconds, at which the 32-bit FPGA timestamp rolls over to 0
|
|
||||||
static const double kRolloverTime = (1ll << 32) / 1e6;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pause the task for a specified time.
|
* Pause the task for a specified time.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user