This is Unofficial EPICS BASE Doxygen Site
epicsTime.h
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2009 UChicago Argonne LLC, as Operator of Argonne
3 * National Laboratory.
4 * Copyright (c) 2002 The Regents of the University of California, as
5 * Operator of Los Alamos National Laboratory.
6 * EPICS BASE is distributed subject to a Software License Agreement found
7 * in file LICENSE that is included with this distribution.
8 \*************************************************************************/
15 #ifndef epicsTimehInclude
16 #define epicsTimehInclude
17 
18 #include <time.h>
19 
20 #include "libComAPI.h"
21 #include "epicsTypes.h"
22 #include "osdTime.h"
23 #include "errMdef.h"
24 
26 #define POSIX_TIME_AT_EPICS_EPOCH 631152000u
27 
33 typedef struct epicsTimeStamp {
37 
42 #define TS_STAMP epicsTimeStamp
43 
44 
52 struct timespec; /* POSIX real time */
53 
61 struct timeval; /* BSD */
62 
70 struct l_fp; /* NTP timestamp */
71 
72 #ifdef __cplusplus
73 
79 struct local_tm_nano_sec {
80  struct tm ansi_tm;
81  unsigned long nSec;
82 };
83 
89 struct gm_tm_nano_sec {
90  struct tm ansi_tm;
91  unsigned long nSec;
92 };
93 
102 struct time_t_wrapper {
103  time_t ts;
104 };
105 
111 class LIBCOM_API epicsTimeEvent
112 {
113 public:
114  epicsTimeEvent (const int &number);
115  operator int () const;
116 private:
117  int eventNumber;
118 };
119 
131 class LIBCOM_API epicsTime
132 {
133 public:
135  class unableToFetchCurrentTime {};
137  class formatProblemWithStructTM {};
138 
140  epicsTime ();
141 
147  static epicsTime getEvent ( const epicsTimeEvent & );
155  static epicsTime getCurrent ();
163  static epicsTime getMonotonic ();
164 
169  operator epicsTimeStamp () const;
171  epicsTime ( const epicsTimeStamp & ts );
173  epicsTime & operator = ( const epicsTimeStamp & );
180  operator time_t_wrapper () const;
182  epicsTime ( const time_t_wrapper & );
184  epicsTime & operator = ( const time_t_wrapper & );
192  operator local_tm_nano_sec () const;
194  epicsTime ( const local_tm_nano_sec & );
196  epicsTime & operator = ( const local_tm_nano_sec & );
204  operator gm_tm_nano_sec () const;
206  epicsTime ( const gm_tm_nano_sec & );
208  epicsTime & operator = ( const gm_tm_nano_sec & );
216  operator struct timespec () const;
218  epicsTime ( const struct timespec & );
220  epicsTime & operator = ( const struct timespec & );
227  operator struct timeval () const;
229  epicsTime ( const struct timeval & );
231  epicsTime & operator = ( const struct timeval & );
238  operator l_fp () const;
240  epicsTime ( const l_fp & );
242  epicsTime & operator = ( const l_fp & );
250  operator struct _FILETIME () const;
252  epicsTime ( const struct _FILETIME & );
254  epicsTime & operator = ( const struct _FILETIME & );
261  double operator- ( const epicsTime & ) const;
264  epicsTime operator+ ( const double & ) const;
266  epicsTime operator- ( const double & ) const;
268  epicsTime operator+= ( const double & );
270  epicsTime operator-= ( const double & );
276  bool operator == ( const epicsTime & ) const;
279  bool operator != ( const epicsTime & ) const;
281  bool operator <= ( const epicsTime & ) const;
283  bool operator < ( const epicsTime & ) const;
285  bool operator >= ( const epicsTime & ) const;
287  bool operator > ( const epicsTime & ) const;
310  size_t strftime ( char * pBuff, size_t bufLength, const char * pFormat ) const;
311 
313  void show ( unsigned interestLevel ) const;
314 
315 private:
316  /*
317  * private because:
318  * a) application does not break when EPICS epoch is changed
319  * b) no assumptions about internal storage or internal precision
320  * in the application
321  * c) it would be easy to forget which argument is nanoseconds
322  * and which argument is seconds (no help from compiler)
323  */
324  epicsTime ( const unsigned long secPastEpoch, const unsigned long nSec );
325  void addNanoSec ( long nanoSecAdjust );
326 
327  unsigned long secPastEpoch; /* seconds since O000 Jan 1, 1990 */
328  unsigned long nSec; /* nanoseconds within second */
329 };
330 
331 extern "C" {
332 #endif /* __cplusplus */
333 
339 #define epicsTimeOK 0
340 
341 #define S_time_noProvider (M_time| 1) /*No time provider*/
342 
343 #define S_time_badEvent (M_time| 2) /*Bad event number*/
344 
345 #define S_time_badArgs (M_time| 3) /*Invalid arguments*/
346 
347 #define S_time_noMemory (M_time| 4) /*Out of memory*/
348 
349 #define S_time_unsynchronized (M_time| 5) /*Provider not synchronized*/
350 
351 #define S_time_timezone (M_time| 6) /*Invalid timezone*/
352 
353 #define S_time_conversion (M_time| 7) /*Time conversion error*/
354 
360 #define epicsTimeEventCurrentTime 0
361 #define epicsTimeEventBestTime -1
362 #define epicsTimeEventDeviceTime -2
363 
370 LIBCOM_API int epicsStdCall epicsTimeGetCurrent ( epicsTimeStamp * pDest );
372 LIBCOM_API int epicsStdCall epicsTimeGetEvent (
373  epicsTimeStamp *pDest, int eventNumber);
375 LIBCOM_API int epicsTimeGetMonotonic ( epicsTimeStamp * pDest );
385 LIBCOM_API int epicsTimeGetCurrentInt(epicsTimeStamp *pDest);
387 LIBCOM_API int epicsTimeGetEventInt(epicsTimeStamp *pDest, int eventNumber);
395 LIBCOM_API int epicsStdCall epicsTimeToTime_t (
396  time_t * pDest, const epicsTimeStamp * pSrc );
398 LIBCOM_API int epicsStdCall epicsTimeFromTime_t (
399  epicsTimeStamp * pDest, time_t src );
407 LIBCOM_API int epicsStdCall epicsTimeToTM (
408  struct tm * pDest, unsigned long * pNSecDest, const epicsTimeStamp * pSrc );
410 LIBCOM_API int epicsStdCall epicsTimeToGMTM (
411  struct tm * pDest, unsigned long * pNSecDest, const epicsTimeStamp * pSrc );
413 LIBCOM_API int epicsStdCall epicsTimeFromTM (
414  epicsTimeStamp * pDest, const struct tm * pSrc, unsigned long nSecSrc );
416 LIBCOM_API int epicsStdCall epicsTimeFromGMTM (
417  epicsTimeStamp * pDest, const struct tm * pSrc, unsigned long nSecSrc );
425 LIBCOM_API int epicsStdCall epicsTimeToTimespec (
426  struct timespec * pDest, const epicsTimeStamp * pSrc );
428 LIBCOM_API int epicsStdCall epicsTimeFromTimespec (
429  epicsTimeStamp * pDest, const struct timespec * pSrc );
436 LIBCOM_API int epicsStdCall epicsTimeToTimeval (
437  struct timeval * pDest, const epicsTimeStamp * pSrc );
439 LIBCOM_API int epicsStdCall epicsTimeFromTimeval (
440  epicsTimeStamp * pDest, const struct timeval * pSrc );
448 LIBCOM_API double epicsStdCall epicsTimeDiffInSeconds (
449  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight );/* left - right */
451 LIBCOM_API void epicsStdCall epicsTimeAddSeconds (
452  epicsTimeStamp * pDest, double secondsToAdd ); /* adds seconds to *pDest */
459 LIBCOM_API int epicsStdCall epicsTimeEqual (
460  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
462 LIBCOM_API int epicsStdCall epicsTimeNotEqual (
463  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
465 LIBCOM_API int epicsStdCall epicsTimeLessThan (
466  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
468 LIBCOM_API int epicsStdCall epicsTimeLessThanEqual (
469  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
471 LIBCOM_API int epicsStdCall epicsTimeGreaterThan (
472  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
474 LIBCOM_API int epicsStdCall epicsTimeGreaterThanEqual (
475  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
479 LIBCOM_API size_t epicsStdCall epicsTimeToStrftime (
480  char * pBuff, size_t bufLength, const char * pFormat, const epicsTimeStamp * pTS );
481 
483 LIBCOM_API void epicsStdCall epicsTimeShow (
484  const epicsTimeStamp *, unsigned interestLevel );
485 
491 LIBCOM_API int epicsStdCall epicsTime_localtime ( const time_t * clock, struct tm * result );
493 LIBCOM_API int epicsStdCall epicsTime_gmtime ( const time_t * clock, struct tm * result );
502 LIBCOM_API epicsUInt64 epicsMonotonicResolution(void);
505 LIBCOM_API epicsUInt64 epicsMonotonicGet(void);
508 #ifdef EPICS_EXPOSE_LIBCOM_MONOTONIC_PRIVATE
509 LIBCOM_API void osdMonotonicInit(void);
510 #endif
511 
512 #ifdef __cplusplus
513 }
514 #endif /* __cplusplus */
515 
516 /* inline member functions ,*/
517 #ifdef __cplusplus
518 
519 /* epicsTimeEvent */
520 
521 inline epicsTimeEvent::epicsTimeEvent (const int &number) :
522  eventNumber(number) {}
523 
524 inline epicsTimeEvent::operator int () const
525 {
526  return this->eventNumber;
527 }
528 
529 
530 /* epicsTime */
531 
532 inline epicsTime epicsTime::operator - ( const double & rhs ) const
533 {
534  return epicsTime::operator + ( -rhs );
535 }
536 
537 inline epicsTime epicsTime::operator += ( const double & rhs )
538 {
539  *this = epicsTime::operator + ( rhs );
540  return *this;
541 }
542 
543 inline epicsTime epicsTime::operator -= ( const double & rhs )
544 {
545  *this = epicsTime::operator + ( -rhs );
546  return *this;
547 }
548 
549 inline bool epicsTime::operator == ( const epicsTime & rhs ) const
550 {
551  if ( this->secPastEpoch == rhs.secPastEpoch && this->nSec == rhs.nSec ) {
552  return true;
553  }
554  return false;
555 }
556 
557 inline bool epicsTime::operator != ( const epicsTime & rhs ) const
558 {
559  return !epicsTime::operator == ( rhs );
560 }
561 
562 inline bool epicsTime::operator >= ( const epicsTime & rhs ) const
563 {
564  return ! ( *this < rhs );
565 }
566 
567 inline bool epicsTime::operator > ( const epicsTime & rhs ) const
568 {
569  return ! ( *this <= rhs );
570 }
571 
572 inline epicsTime & epicsTime::operator = ( const local_tm_nano_sec & rhs )
573 {
574  return *this = epicsTime ( rhs );
575 }
576 
577 inline epicsTime & epicsTime::operator = ( const gm_tm_nano_sec & rhs )
578 {
579  return *this = epicsTime ( rhs );
580 }
581 
582 inline epicsTime & epicsTime::operator = ( const struct timespec & rhs )
583 {
584  *this = epicsTime ( rhs );
585  return *this;
586 }
587 
588 inline epicsTime & epicsTime::operator = ( const epicsTimeStamp & rhs )
589 {
590  *this = epicsTime ( rhs );
591  return *this;
592 }
593 
594 inline epicsTime & epicsTime::operator = ( const l_fp & rhs )
595 {
596  *this = epicsTime ( rhs );
597  return *this;
598 }
599 
600 inline epicsTime & epicsTime::operator = ( const time_t_wrapper & rhs )
601 {
602  *this = epicsTime ( rhs );
603  return *this;
604 }
605 #endif /* __cplusplus */
606 
607 #endif /* epicsTimehInclude */
Network Time Protocol timestamp.
Definition: epicsTime.cpp:452
LIBCOM_API int epicsStdCall epicsTimeEqual(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
left equals right
Definition: epicsTime.cpp:1066
LIBCOM_API int epicsStdCall epicsTimeGetEvent(epicsTimeStamp *pDest, int eventNumber)
Get time of event eventNumber into *pDest.
pvac::PutEvent result
Definition: clientSync.cpp:117
LIBCOM_API int epicsStdCall epicsTimeFromTimeval(epicsTimeStamp *pDest, const struct timeval *pSrc)
Set epicsTimeStamp from struct timeval
Definition: epicsTime.cpp:1038
LIBCOM_API int epicsStdCall epicsTimeToTimespec(struct timespec *pDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to struct timespec
Definition: epicsTime.cpp:1008
LIBCOM_API epicsUInt64 epicsMonotonicGet(void)
Fetch monotonic counter, returns the number of nanoseconds since some unspecified time...
Definition: osdMonotonic.c:29
LIBCOM_API int epicsStdCall epicsTimeFromTimespec(epicsTimeStamp *pDest, const struct timespec *pSrc)
Set epicsTimeStamp from struct timespec
Definition: epicsTime.cpp:1018
void osdMonotonicInit(void)
Definition: osdMonotonic.c:19
LIBCOM_API double epicsStdCall epicsTimeDiffInSeconds(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
Time difference between left and right in seconds.
Definition: epicsTime.cpp:1048
unsigned int epicsUInt32
Definition: epicsTypes.h:43
LIBCOM_API void epicsStdCall epicsTimeShow(const epicsTimeStamp *, unsigned interestLevel)
Dump current state to stdout.
Definition: epicsTime.cpp:1129
epicsUInt32 secPastEpoch
seconds since 0000 Jan 1, 1990
Definition: epicsTime.h:34
unsigned long long epicsUInt64
Definition: epicsTypes.h:45
LIBCOM_API int epicsStdCall epicsTimeFromTM(epicsTimeStamp *pDest, const struct tm *pSrc, unsigned long nSecSrc)
Set epicsTimeStamp from struct tm in local time zone.
Definition: epicsTime.cpp:982
LIBCOM_API int epicsStdCall epicsTimeGetCurrent(epicsTimeStamp *pDest)
Get current time into *pDest.
struct epicsTimeStamp epicsTimeStamp
EPICS time stamp, for use from C code.
LIBCOM_API int epicsStdCall epicsTime_localtime(const time_t *clock, struct tm *result)
Break down a time_t into a struct tm in the local timezone.
Definition: osdTime.cpp:61
LIBCOM_API int epicsStdCall epicsTimeToGMTM(struct tm *pDest, unsigned long *pNSecDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to struct tm in UTC/GMT.
Definition: epicsTime.cpp:969
LIBCOM_API int epicsStdCall epicsTimeNotEqual(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
left not equal to right
Definition: epicsTime.cpp:1075
LIBCOM_API size_t epicsStdCall epicsTimeToStrftime(char *pBuff, size_t bufLength, const char *pFormat, const epicsTimeStamp *pTS)
Convert epicsTimeStamp to string. See epicsTime::strftime()
Definition: epicsTime.cpp:1120
bool operator<(shared_ptr< T > const &a, shared_ptr< U > const &b) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:778
LIBCOM_API int epicsStdCall epicsTimeGreaterThanEqual(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
right was not before left
Definition: epicsTime.cpp:1111
LIBCOM_API int epicsStdCall epicsTime_gmtime(const time_t *clock, struct tm *result)
Break down a time_t into a struct tm in the UTC timezone.
Definition: osdTime.cpp:55
LIBCOM_API epicsUInt64 epicsMonotonicResolution(void)
Monotonic time resolution, may not be accurate. Returns the minimum non-zero time difference between ...
Definition: osdMonotonic.c:24
LIBCOM_API int epicsStdCall epicsTimeLessThanEqual(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
right was no later than left
Definition: epicsTime.cpp:1093
BSD and SRV5 Unix timestamp.
Definition: epicsTime.h:52
LIBCOM_API int epicsStdCall epicsTimeToTM(struct tm *pDest, unsigned long *pNSecDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to struct tm in local time zone.
Definition: epicsTime.cpp:956
LIBCOM_API int epicsStdCall epicsTimeLessThan(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
left was before right
Definition: epicsTime.cpp:1084
LIBCOM_API int epicsStdCall epicsTimeFromGMTM(epicsTimeStamp *pDest, const struct tm *pSrc, unsigned long nSecSrc)
Set epicsTimeStamp from struct tm in UTC/GMT.
Definition: epicsTime.cpp:995
LIBCOM_API int epicsTimeGetMonotonic(epicsTimeStamp *pDest)
Get monotonic time into *pDest.
EPICS time stamp, for use from C code.
Definition: epicsTime.h:33
LIBCOM_API void epicsStdCall epicsTimeAddSeconds(epicsTimeStamp *pDest, double secondsToAdd)
Add some number of seconds to dest.
Definition: epicsTime.cpp:1057
LIBCOM_API int epicsTimeGetCurrentInt(epicsTimeStamp *pDest)
Get current time into *pDest (ISR-safe)
LIBCOM_API int epicsStdCall epicsTimeToTimeval(struct timeval *pDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to struct timeval
Definition: epicsTime.cpp:1028
Defined by POSIX Real Time.
Definition: osdTime.h:21
LIBCOM_API int epicsStdCall epicsTimeGreaterThan(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
left was after right
Definition: epicsTime.cpp:1102
LIBCOM_API int epicsStdCall epicsTimeToTime_t(time_t *pDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to ANSI C time_t.
Definition: epicsTime.cpp:933
LIBCOM_API int epicsTimeGetEventInt(epicsTimeStamp *pDest, int eventNumber)
Get time of event eventNumber into *pDest (ISR-safe)
LIBCOM_API int epicsStdCall epicsTimeFromTime_t(epicsTimeStamp *pDest, time_t src)
Convert ANSI C time_t to epicsTimeStamp.
Definition: epicsTime.cpp:944
bool operator!=(const epics::pvData::shared_vector< A > &a, const epics::pvData::shared_vector< B > &b)
Definition: sharedVector.h:978
epicsUInt32 nsec
nanoseconds within second
Definition: epicsTime.h:35
bool operator==(const epics::pvData::shared_vector< A > &a, const epics::pvData::shared_vector< B > &b)
Definition: sharedVector.h:967