/*----------------------------------------------------------------------------*/ /* Copyright (c) 2008-2017 FIRST. 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 the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #pragma once #include #include #include #include #include #include #include "ErrorBase.h" namespace frc { typedef std::function TimerEventHandler; class Notifier : public ErrorBase { public: explicit Notifier(TimerEventHandler handler); template Notifier(Callable&& f, Arg&& arg, Args&&... args) : Notifier(std::bind(std::forward(f), std::forward(arg), std::forward(args)...)) {} virtual ~Notifier(); Notifier(const Notifier&) = delete; Notifier& operator=(const Notifier&) = delete; void StartSingle(double delay); void StartPeriodic(double period); void Stop(); private: // Update the HAL alarm void UpdateAlarm(); // HAL callback static void Notify(uint64_t currentTimeInt, HAL_NotifierHandle handle); // Used to constrain execution between destructors and callback static wpi::mutex m_destructorMutex; // Held while updating process information wpi::mutex m_processMutex; // HAL handle, atomic for proper destruction std::atomic m_notifier{0}; // Address of the handler TimerEventHandler m_handler; // The absolute expiration time double m_expirationTime = 0; // The relative time (either periodic or single) double m_period = 0; // True if this is a periodic event bool m_periodic = false; }; } // namespace frc