mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
45 lines
1.8 KiB
C++
45 lines
1.8 KiB
C++
/*----------------------------------------------------------------------------*/
|
|
/* Copyright (c) FIRST 2008. 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 $(WIND_BASE)/WPILib. */
|
|
/*----------------------------------------------------------------------------*/
|
|
#pragma once
|
|
|
|
#include "ErrorBase.h"
|
|
#include "Task.h"
|
|
#include "HAL/cpp/Synchronized.hpp"
|
|
|
|
typedef void (*TimerEventHandler)(void *param);
|
|
|
|
class Notifier : public ErrorBase
|
|
{
|
|
public:
|
|
Notifier(TimerEventHandler handler, void *param = NULL);
|
|
virtual ~Notifier();
|
|
void StartSingle(double delay);
|
|
void StartPeriodic(double period);
|
|
void Stop();
|
|
private:
|
|
static Notifier *timerQueueHead;
|
|
static ReentrantSemaphore queueSemaphore;
|
|
static int refcount;
|
|
|
|
static void ProcessQueue(uint32_t mask, void *params); // process the timer queue on a timer event
|
|
static void UpdateAlarm(); // update the FPGA alarm since the queue has changed
|
|
void InsertInQueue(bool reschedule); // insert this Notifier in the timer queue
|
|
void DeleteFromQueue(); // delete this Notifier from the timer queue
|
|
TimerEventHandler m_handler; // address of the handler
|
|
void *m_param; // a parameter to pass to the handler
|
|
double m_period; // the relative time (either periodic or single)
|
|
double m_expirationTime; // absolute expiration time for the current event
|
|
Notifier *m_nextEvent; // next Nofifier event
|
|
bool m_periodic; // true if this is a periodic event
|
|
bool m_queued; // indicates if this entry is queued
|
|
SEMAPHORE_ID m_handlerSemaphore; // held by interrupt manager task while handler call is in progress
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(Notifier);
|
|
|
|
static Task *task;
|
|
static void Run();
|
|
};
|