changes during implementation
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/* epicsTimer.h */
|
||||
|
||||
/* Author: Jeffrey O. Hill */
|
||||
/* Authors: Marty Kraimer, Jeff Hill */
|
||||
|
||||
/********************COPYRIGHT NOTIFICATION**********************************
|
||||
This software was developed under a United States Government license
|
||||
@@ -11,90 +11,129 @@ of this distribution.
|
||||
#ifndef epicsTimerH
|
||||
#define epicsTimerH
|
||||
|
||||
#include "epicsAssert.h"
|
||||
#include <float.h>
|
||||
|
||||
#include "shareLib.h"
|
||||
#include "epicsAssert.h"
|
||||
#include "epicsTime.h"
|
||||
#include "epicsThread.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
class epicsTimerExpireStatus{
|
||||
public:
|
||||
bool again; // Is this a periodic timer? That is reschedule
|
||||
double delay; //If again is true the delay until expire is called again
|
||||
epicsTimerExpireStatus() : again(false), delay(0.0) {}
|
||||
epicsTimerExpireStatus(bool a,double d) : again(a), delay(d) {}
|
||||
};
|
||||
|
||||
// code using a timer must implement epicsTimerNotify
|
||||
class epicsTimerNotify {
|
||||
class epicsShareClass epicsTimerNotify {
|
||||
public:
|
||||
virtual epicsTimerExpireStatus expire() = 0;
|
||||
virtual void show(unsigned int level);
|
||||
};
|
||||
|
||||
class epicsShareClass epicsTimerQueue {
|
||||
public:
|
||||
static epicsTimerQueue &createNonThreaded();
|
||||
static epicsTimerQueue &createThreaded(
|
||||
bool okToShare, int threadPriority = threadPriorityMin+10);
|
||||
static destroy(epicsTimerQueue &);
|
||||
virtual void process() = 0;
|
||||
virtual epicsTime getExpireTime() const = 0;
|
||||
virtual void show(unsigned int level) const = 0;
|
||||
enum restart_t { noRestart, restart };
|
||||
class expireStatus {
|
||||
public:
|
||||
expireStatus ( restart_t );
|
||||
expireStatus ( restart_t, const double &expireDelaySec );
|
||||
bool restart () const;
|
||||
double expirationDelay () const;
|
||||
private:
|
||||
bool again;
|
||||
double delay;
|
||||
};
|
||||
// return noRestart OR return expireStatus ( restart, 30.0 /* sec */ );
|
||||
virtual expireStatus expire () = 0;
|
||||
virtual void show ( unsigned int level ) const;
|
||||
};
|
||||
|
||||
class epicsShareClass epicsTimer {
|
||||
public:
|
||||
static epicsTimer& create(epicsTimerNotify &,epicsTimerQueue&);
|
||||
static destroy(epicsTimer&);
|
||||
virtual void start(epicsTime &) = 0;
|
||||
virtual void start(double delaySeconds) = 0;
|
||||
virtual virtual void cancel() = 0;
|
||||
virtual epicsTime getExpireTime() const = 0;
|
||||
virtual bool isExpired() const = 0;
|
||||
virtual void show(unsigned int level) const = 0;
|
||||
virtual ~epicsTimer () = 0;
|
||||
virtual void start ( const epicsTime & ) = 0;
|
||||
virtual void start ( double delaySeconds ) = 0;
|
||||
virtual void cancel () = 0;
|
||||
virtual double getExpireDelay () const = 0;
|
||||
virtual void show ( unsigned int level ) const = 0;
|
||||
};
|
||||
|
||||
class epicsShareClass epicsTimerQueueThreaded {
|
||||
public:
|
||||
static epicsTimerQueueThreaded & create (
|
||||
bool okToShare, int threadPriority = epicsThreadPriorityMin + 10 );
|
||||
virtual epicsTimer & createTimer ( epicsTimerNotify & ) = 0;
|
||||
virtual void show ( unsigned int level ) const = 0;
|
||||
virtual void release () = 0;
|
||||
protected:
|
||||
virtual ~epicsTimerQueueThreaded () = 0;
|
||||
};
|
||||
|
||||
class epicsShareClass epicsTimerQueueNonThreaded {
|
||||
public:
|
||||
static epicsTimerQueueNonThreaded & create ();
|
||||
virtual epicsTimer & createTimer ( epicsTimerNotify & ) = 0;
|
||||
virtual void process () = 0;
|
||||
virtual double getNextExpireDelay () const = 0;
|
||||
virtual void show ( unsigned int level ) const = 0;
|
||||
virtual void release () = 0;
|
||||
protected:
|
||||
virtual ~epicsTimerQueueNonThreaded () = 0;
|
||||
};
|
||||
|
||||
inline epicsTimerNotify::expireStatus::expireStatus ( restart_t restart ) :
|
||||
again ( false ), delay ( - DBL_MAX )
|
||||
{
|
||||
assert ( restart == noRestart );
|
||||
}
|
||||
|
||||
inline epicsTimerNotify::expireStatus::expireStatus
|
||||
( restart_t, const double &expireDelaySec ) :
|
||||
again ( true ), delay ( expireDelaySec )
|
||||
{
|
||||
assert ( this->delay >= 0.0 );
|
||||
}
|
||||
|
||||
inline bool epicsTimerNotify::expireStatus::restart () const
|
||||
{
|
||||
return this->again;
|
||||
}
|
||||
|
||||
inline double epicsTimerNotify::expireStatus::expirationDelay () const
|
||||
{
|
||||
assert ( this->again );
|
||||
return this->delay;
|
||||
}
|
||||
|
||||
|
||||
extern "C" {
|
||||
#endif /*__cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef void *epicsTimerQueueId;
|
||||
|
||||
epicsShareFunc epicsTimerQueueId* epicsShareAPI
|
||||
epicsTimerQueueCreateNonThreaded();
|
||||
epicsTimerQueueCreateNonThreaded ();
|
||||
epicsShareFunc epicsTimerQueueId* epicsShareAPI
|
||||
epicsTimerQueueCreateThreaded(unsigned int threadPriority,int okToShare);
|
||||
epicsShareFunc void epicsShareAPI epicsTimerQueueDelete(epicsTimerQueueId);
|
||||
epicsTimerQueueCreateThreaded ( unsigned int threadPriority, int okToShare );
|
||||
epicsShareFunc void epicsShareAPI epicsTimerQueueDelete ( epicsTimerQueueId );
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsTimerQueueProcess(epicsTimerQueueId);
|
||||
epicsShareFunc int epicsShareAPI epicsTimerQueueGetExpireTime(
|
||||
epicsTimerQueueId, epicsTimeStamp *time);
|
||||
epicsShareFunc void epicsShareAPI epicsTimerQueueShow(
|
||||
epicsTimerQueueId id, unsigned int level);
|
||||
epicsShareFunc void epicsShareAPI epicsTimerQueueProcess ( epicsTimerQueueId );
|
||||
epicsShareFunc int epicsShareAPI epicsTimerQueueGetExpireTime (
|
||||
epicsTimerQueueId, epicsTimeStamp *time );
|
||||
epicsShareFunc void epicsShareAPI epicsTimerQueueShow (
|
||||
epicsTimerQueueId id, unsigned int level );
|
||||
|
||||
typedef void *epicsTimerId;
|
||||
typedef void (*epicsTimerCallback)(void *);
|
||||
typedef void ( *epicsTimerCallback ) ( void * );
|
||||
|
||||
epicsShareFunc epicsTimerId epicsShareAPI epicsTimerCreate(
|
||||
epicsTimerQueueId queueid,epicsTimerCallback callback, void *arg);
|
||||
epicsShareFunc void epicsShareAPI epicsTimerDestroy(epicsTimerId id);
|
||||
epicsShareFunc epicsTimerId epicsShareAPI epicsTimerCreate (
|
||||
epicsTimerQueueId queueid,epicsTimerCallback callback, void *arg );
|
||||
epicsShareFunc void epicsShareAPI epicsTimerDestroy ( epicsTimerId id );
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsTimerStartTime(
|
||||
epicsTimerId id,epicsTimeStamp *time);
|
||||
epicsShareFunc void epicsShareAPI epicsTimerStartDelay(
|
||||
epicsTimerId id,double delaySeconds);
|
||||
epicsShareFunc void epicsShareAPI epicsTimerCancel(epicsTimerId id);
|
||||
/* GetExpireTime returns (0,1) if time (is not, is) given a value*/
|
||||
epicsShareFunc int epicsShareAPI epicsTimerGetExpireTime(
|
||||
epicsShareFunc void epicsShareAPI epicsTimerStartTime (
|
||||
epicsTimerId id,epicsTimeStamp *time );
|
||||
epicsShareFunc void epicsShareAPI epicsTimerStartDelay (
|
||||
epicsTimerId id,double delaySeconds );
|
||||
epicsShareFunc void epicsShareAPI epicsTimerCancel ( epicsTimerId id );
|
||||
/* GetExpireTime returns (0,1) if time (is not, is) given a value */
|
||||
epicsShareFunc int epicsShareAPI epicsTimerGetExpireTime (
|
||||
epicsTimerId id, epicsTimeStamp *time);
|
||||
/* epicsTimerIsExpired returns (0,1) if timer (is not, is) expired*/
|
||||
epicsShareFunc int epicsShareAPI epicsTimerIsExpired(epicsTimerId id);
|
||||
epicsShareFunc void epicsShareAPI epicsTimerShow(
|
||||
epicsTimerId id, unsigned int level);
|
||||
epicsShareFunc void epicsShareAPI epicsTimerShow (
|
||||
epicsTimerId id, unsigned int level );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /*__cplusplus */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /*epicsTimerH*/
|
||||
#endif /* epicsTimerH */
|
||||
|
||||
Reference in New Issue
Block a user