/* * CENA C++ Utilities * * by Stephane Chatty * * Copyright 1992-1995 * 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 CcuSignalHandler; #if 0 template class CcuListOf; #else #include "List.h" #endif class CcuCoreTimer; class CcuTimerSet { friend class CcuCoreTimer; private: CcuCoreTimer* FirstTimer; #ifndef CPLUS_BUG19 CcuListOf OtherTimers; #else CcuList OtherTimers; #endif CcuCoreTimer* ExtractNextActive (); public: inline CcuTimerSet () : FirstTimer (0), OtherTimers () {} inline ~CcuTimerSet () {} inline bool IsEmpty () const { return bool (FirstTimer == 0); } }; class CcuCoreTimer { friend class CcuTimerSet; public: enum timer_status { Active, Inactive }; protected: static int IsInactive (CcuCoreTimer*); CcuTimerSet* MySet; Millisecond NextDate; Millisecond Period; int PulsesLeft; timer_status StatusFlag; void Activate (); void Schedule (Millisecond); void Reschedule (); /*?public?*/ CcuCoreTimer (Millisecond, int, CcuTimerSet*); virtual ~CcuCoreTimer (); 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 (CcuTimerSet*); }; class CcuBaseTimer : public CcuCoreTimer { private: static CcuSignalHandler* TimeOutHandler; static CcuTimerSet* TimerSet; static void HandleSignal (int); static void ClassInit (); protected: void SetAlarm (Millisecond); void StopAlarm (); public: CcuBaseTimer (Millisecond, int = -1); ~CcuBaseTimer (); }; typedef void (*CcuTimerFun) (Millisecond); class CcuTimer : public CcuBaseTimer { protected: void (*Handler) (Millisecond); void Handle (Millisecond); public: CcuTimer (Millisecond, void (*) (Millisecond), int = -1); ~CcuTimer (); inline void SetHandler (void (*h) (Millisecond)) { Handler = h; } }; #endif /* Timer_H_ */