/* * CENA C++ Utilities * * by Stephane Chatty * * Copyright 1992-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * timers * * $Id$ * $CurLog$ */ #ifndef Timer_H_ #define Timer_H_ #include "cplus_bugs.h" #include "bool.h" #include "Time.h" class IvlSignalHandler; #if 0 template class IvlListOf; #else #include "List.h" #endif class IvlCoreTimer; class IvlTimerSet { friend class IvlCoreTimer; private: IvlCoreTimer* FirstTimer; #ifndef CPLUS_BUG19 IvlListOf OtherTimers; #else IvlList OtherTimers; #endif bool FirstIsUpdated; IvlCoreTimer* ExtractNextActive (); public: inline IvlTimerSet () : FirstTimer (0), OtherTimers (), FirstIsUpdated (false) {} inline ~IvlTimerSet () {} //inline bool IsEmpty () const { return bool (FirstTimer == 0); } seems useless (10 may 96) }; class IvlCoreTimer { friend class IvlTimerSet; public: enum timer_status { Active, Inactive }; protected: static int IsInactive (IvlCoreTimer*); IvlTimerSet* MySet; Millisecond NextDate; Millisecond Period; int PulsesLeft; timer_status StatusFlag; void Activate (); void Schedule (Millisecond); void Reschedule (); /*?public?*/ IvlCoreTimer (Millisecond, int, IvlTimerSet*); virtual ~IvlCoreTimer (); public: void ChangePeriod (Millisecond); void ChangeNbPulses (int); void Stop (); void Restart (); void Wait (); inline Millisecond GetPeriod () const { return Period; } inline int GetNbPulses () const { return PulsesLeft; } inline timer_status GetStatus () const { return StatusFlag; } protected: /*?public?*/ virtual void Handle (Millisecond); virtual void SetAlarm (Millisecond) = 0; virtual void StopAlarm () = 0; public: static void Fire (IvlTimerSet*); }; class IvlBaseTimer : public IvlCoreTimer { private: static IvlSignalHandler* TimeOutHandler; static IvlTimerSet* TimerSet; static void HandleSignal (int); static void ClassInit (); protected: void SetAlarm (Millisecond); void StopAlarm (); public: IvlBaseTimer (Millisecond, int = -1); ~IvlBaseTimer (); }; typedef void (*IvlTimerFun) (Millisecond); class IvlTimer : public IvlBaseTimer { protected: void (*Handler) (Millisecond); void Handle (Millisecond); public: IvlTimer (Millisecond, void (*) (Millisecond), int = -1); ~IvlTimer (); inline void SetHandler (void (*h) (Millisecond)) { Handler = h; } }; #endif /* Timer_H_ */