mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
This is a major restructuring of the WPILib repository to simply build procedures and remove the remnants of Maven from everything except the eclipse plugins. Gradle files have been largely simplified or rewritten, taking advantage of splitting up parts of the build into separate build files for ease of reading. The eclipse plugins are now in a separate project, as is ntcore. All dependencies are resolved via Maven dependencies, with the Jenkins-maintained WPILib repo. Project structures have also been simplified: we no longer have separate subprojects inside wpilibc and wpilibj. Where possible, these changes hav been done with git renames, to make sure we still have full history for all repositories. Other unrelated subprojects have also been broken out: OutlineViewer is now a separate project. Change-Id: Ib4e2a6e1a2f66427a14f16612b0e0d69ed661878
57 lines
2.1 KiB
C++
57 lines
2.1 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 "HAL/cpp/priority_mutex.h"
|
|
#include <thread>
|
|
#include <atomic>
|
|
|
|
typedef void (*TimerEventHandler)(void *param);
|
|
|
|
class Notifier : public ErrorBase {
|
|
public:
|
|
Notifier(TimerEventHandler handler, void *param = nullptr);
|
|
virtual ~Notifier();
|
|
|
|
Notifier(const Notifier&) = delete;
|
|
Notifier& operator=(const Notifier&) = delete;
|
|
|
|
void StartSingle(double delay);
|
|
void StartPeriodic(double period);
|
|
void Stop();
|
|
|
|
private:
|
|
static Notifier *timerQueueHead;
|
|
static priority_recursive_mutex queueMutex;
|
|
static void *m_notifier;
|
|
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 = 0; // the relative time (either periodic or single)
|
|
double m_expirationTime = 0; // absolute expiration time for the current event
|
|
Notifier *m_nextEvent = nullptr; // next Nofifier event
|
|
bool m_periodic = false; // true if this is a periodic event
|
|
bool m_queued = false; // indicates if this entry is queued
|
|
priority_mutex m_handlerMutex; // held by interrupt manager task while
|
|
// handler call is in progress
|
|
|
|
#ifdef FRC_SIMULATOR
|
|
static std::thread m_task;
|
|
static std::atomic<bool> m_stopped;
|
|
#endif
|
|
static void Run();
|
|
};
|