EPICS Base  7.0.5.1
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 * SPDX-License-Identifier: EPICS
7 * EPICS BASE is distributed subject to a Software License Agreement found
8 * in file LICENSE that is included with this distribution.
9 \*************************************************************************/
16 #ifndef epicsTimehInclude
17 #define epicsTimehInclude
18 
19 #include <time.h>
20 
21 #include "libComAPI.h"
22 #include "epicsTypes.h"
23 #include "osdTime.h"
24 #include "errMdef.h"
25 
27 #define POSIX_TIME_AT_EPICS_EPOCH 631152000u
28 
34 typedef struct epicsTimeStamp {
35  epicsUInt32 secPastEpoch;
36  epicsUInt32 nsec;
38 
43 #define TS_STAMP epicsTimeStamp
44 
45 
53 struct timespec; /* POSIX real time */
54 
62 struct timeval; /* BSD */
63 
71 struct l_fp; /* NTP timestamp */
72 
73 #ifdef __cplusplus
74 
81  struct tm ansi_tm;
82  unsigned long nSec;
83 };
84 
91  struct tm ansi_tm;
92  unsigned long nSec;
93 };
94 
104  time_t ts;
105 };
106 
112 class LIBCOM_API epicsTimeEvent
113 {
114 public:
115  epicsTimeEvent (const int &number);
116  operator int () const;
117 private:
118  int eventNumber;
119 };
120 
132 class LIBCOM_API epicsTime
133 {
134 public:
139 
141  epicsTime ();
142 
148  static epicsTime getEvent ( const epicsTimeEvent & );
156  static epicsTime getCurrent ();
164  static epicsTime getMonotonic ();
165 
170  operator epicsTimeStamp () const;
172  epicsTime ( const epicsTimeStamp & ts );
174  epicsTime & operator = ( const epicsTimeStamp & );
181  operator time_t_wrapper () const;
183  epicsTime ( const time_t_wrapper & );
185  epicsTime & operator = ( const time_t_wrapper & );
193  operator local_tm_nano_sec () const;
195  epicsTime ( const local_tm_nano_sec & );
197  epicsTime & operator = ( const local_tm_nano_sec & );
205  operator gm_tm_nano_sec () const;
207  epicsTime ( const gm_tm_nano_sec & );
209  epicsTime & operator = ( const gm_tm_nano_sec & );
217  operator struct timespec () const;
219  epicsTime ( const struct timespec & );
221  epicsTime & operator = ( const struct timespec & );
228  operator struct timeval () const;
230  epicsTime ( const struct timeval & );
232  epicsTime & operator = ( const struct timeval & );
239  operator l_fp () const;
241  epicsTime ( const l_fp & );
243  epicsTime & operator = ( const l_fp & );
251  operator struct _FILETIME () const;
253  epicsTime ( const struct _FILETIME & );
255  epicsTime & operator = ( const struct _FILETIME & );
262  double operator- ( const epicsTime & ) const;
265  epicsTime operator+ ( const double & ) const;
267  epicsTime operator- ( const double & ) const;
269  epicsTime operator+= ( const double & );
271  epicsTime operator-= ( const double & );
277  bool operator == ( const epicsTime & ) const;
280  bool operator != ( const epicsTime & ) const;
282  bool operator <= ( const epicsTime & ) const;
284  bool operator < ( const epicsTime & ) const;
286  bool operator >= ( const epicsTime & ) const;
288  bool operator > ( const epicsTime & ) const;
311  size_t strftime ( char * pBuff, size_t bufLength, const char * pFormat ) const;
312 
314  void show ( unsigned interestLevel ) const;
315 
316 private:
317  /*
318  * private because:
319  * a) application does not break when EPICS epoch is changed
320  * b) no assumptions about internal storage or internal precision
321  * in the application
322  * c) it would be easy to forget which argument is nanoseconds
323  * and which argument is seconds (no help from compiler)
324  */
325  epicsTime ( const unsigned long secPastEpoch, const unsigned long nSec );
326  void addNanoSec ( long nanoSecAdjust );
327 
328  unsigned long secPastEpoch; /* seconds since O000 Jan 1, 1990 */
329  unsigned long nSec; /* nanoseconds within second */
330 };
331 
332 extern "C" {
333 #endif /* __cplusplus */
334 
340 #define epicsTimeOK 0
341 
342 #define S_time_noProvider (M_time| 1) /*No time provider*/
343 
344 #define S_time_badEvent (M_time| 2) /*Bad event number*/
345 
346 #define S_time_badArgs (M_time| 3) /*Invalid arguments*/
347 
348 #define S_time_noMemory (M_time| 4) /*Out of memory*/
349 
350 #define S_time_unsynchronized (M_time| 5) /*Provider not synchronized*/
351 
352 #define S_time_timezone (M_time| 6) /*Invalid timezone*/
353 
354 #define S_time_conversion (M_time| 7) /*Time conversion error*/
355 
361 #define epicsTimeEventCurrentTime 0
362 #define epicsTimeEventBestTime -1
363 #define epicsTimeEventDeviceTime -2
364 
371 LIBCOM_API int epicsStdCall epicsTimeGetCurrent ( epicsTimeStamp * pDest );
373 LIBCOM_API int epicsStdCall epicsTimeGetEvent (
374  epicsTimeStamp *pDest, int eventNumber);
376 LIBCOM_API int epicsTimeGetMonotonic ( epicsTimeStamp * pDest );
386 LIBCOM_API int epicsTimeGetCurrentInt(epicsTimeStamp *pDest);
388 LIBCOM_API int epicsTimeGetEventInt(epicsTimeStamp *pDest, int eventNumber);
396 LIBCOM_API int epicsStdCall epicsTimeToTime_t (
397  time_t * pDest, const epicsTimeStamp * pSrc );
399 LIBCOM_API int epicsStdCall epicsTimeFromTime_t (
400  epicsTimeStamp * pDest, time_t src );
408 LIBCOM_API int epicsStdCall epicsTimeToTM (
409  struct tm * pDest, unsigned long * pNSecDest, const epicsTimeStamp * pSrc );
411 LIBCOM_API int epicsStdCall epicsTimeToGMTM (
412  struct tm * pDest, unsigned long * pNSecDest, const epicsTimeStamp * pSrc );
414 LIBCOM_API int epicsStdCall epicsTimeFromTM (
415  epicsTimeStamp * pDest, const struct tm * pSrc, unsigned long nSecSrc );
417 LIBCOM_API int epicsStdCall epicsTimeFromGMTM (
418  epicsTimeStamp * pDest, const struct tm * pSrc, unsigned long nSecSrc );
426 LIBCOM_API int epicsStdCall epicsTimeToTimespec (
427  struct timespec * pDest, const epicsTimeStamp * pSrc );
429 LIBCOM_API int epicsStdCall epicsTimeFromTimespec (
430  epicsTimeStamp * pDest, const struct timespec * pSrc );
437 LIBCOM_API int epicsStdCall epicsTimeToTimeval (
438  struct timeval * pDest, const epicsTimeStamp * pSrc );
440 LIBCOM_API int epicsStdCall epicsTimeFromTimeval (
441  epicsTimeStamp * pDest, const struct timeval * pSrc );
449 LIBCOM_API double epicsStdCall epicsTimeDiffInSeconds (
450  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight );/* left - right */
452 LIBCOM_API void epicsStdCall epicsTimeAddSeconds (
453  epicsTimeStamp * pDest, double secondsToAdd ); /* adds seconds to *pDest */
460 LIBCOM_API int epicsStdCall epicsTimeEqual (
461  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
463 LIBCOM_API int epicsStdCall epicsTimeNotEqual (
464  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
466 LIBCOM_API int epicsStdCall epicsTimeLessThan (
467  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
469 LIBCOM_API int epicsStdCall epicsTimeLessThanEqual (
470  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
472 LIBCOM_API int epicsStdCall epicsTimeGreaterThan (
473  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
475 LIBCOM_API int epicsStdCall epicsTimeGreaterThanEqual (
476  const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
480 LIBCOM_API size_t epicsStdCall epicsTimeToStrftime (
481  char * pBuff, size_t bufLength, const char * pFormat, const epicsTimeStamp * pTS );
482 
484 LIBCOM_API void epicsStdCall epicsTimeShow (
485  const epicsTimeStamp *, unsigned interestLevel );
486 
492 LIBCOM_API int epicsStdCall epicsTime_localtime ( const time_t * clock, struct tm * result );
494 LIBCOM_API int epicsStdCall epicsTime_gmtime ( const time_t * clock, struct tm * result );
503 LIBCOM_API epicsUInt64 epicsMonotonicResolution(void);
506 LIBCOM_API epicsUInt64 epicsMonotonicGet(void);
509 #ifdef EPICS_EXPOSE_LIBCOM_MONOTONIC_PRIVATE
510 LIBCOM_API void osdMonotonicInit(void);
511 #endif
512 
513 #ifdef __cplusplus
514 }
515 #endif /* __cplusplus */
516 
517 /* inline member functions ,*/
518 #ifdef __cplusplus
519 
520 /* epicsTimeEvent */
521 
522 inline epicsTimeEvent::epicsTimeEvent (const int &number) :
523  eventNumber(number) {}
524 
525 inline epicsTimeEvent::operator int () const
526 {
527  return this->eventNumber;
528 }
529 
530 
531 /* epicsTime */
532 
533 inline epicsTime epicsTime::operator - ( const double & rhs ) const
534 {
535  return epicsTime::operator + ( -rhs );
536 }
537 
538 inline epicsTime epicsTime::operator += ( const double & rhs )
539 {
540  *this = epicsTime::operator + ( rhs );
541  return *this;
542 }
543 
544 inline epicsTime epicsTime::operator -= ( const double & rhs )
545 {
546  *this = epicsTime::operator + ( -rhs );
547  return *this;
548 }
549 
550 inline bool epicsTime::operator == ( const epicsTime & rhs ) const
551 {
552  if ( this->secPastEpoch == rhs.secPastEpoch && this->nSec == rhs.nSec ) {
553  return true;
554  }
555  return false;
556 }
557 
558 inline bool epicsTime::operator != ( const epicsTime & rhs ) const
559 {
560  return !epicsTime::operator == ( rhs );
561 }
562 
563 inline bool epicsTime::operator >= ( const epicsTime & rhs ) const
564 {
565  return ! ( *this < rhs );
566 }
567 
568 inline bool epicsTime::operator > ( const epicsTime & rhs ) const
569 {
570  return ! ( *this <= rhs );
571 }
572 
574 {
575  return *this = epicsTime ( rhs );
576 }
577 
579 {
580  return *this = epicsTime ( rhs );
581 }
582 
583 inline epicsTime & epicsTime::operator = ( const struct timespec & rhs )
584 {
585  *this = epicsTime ( rhs );
586  return *this;
587 }
588 
590 {
591  *this = epicsTime ( rhs );
592  return *this;
593 }
594 
595 inline epicsTime & epicsTime::operator = ( const l_fp & rhs )
596 {
597  *this = epicsTime ( rhs );
598  return *this;
599 }
600 
602 {
603  *this = epicsTime ( rhs );
604  return *this;
605 }
606 #endif /* __cplusplus */
607 
608 #endif /* epicsTimehInclude */
Network Time Protocol timestamp.
Definition: epicsTime.h:62
LIBCOM_API double epicsStdCall epicsTimeDiffInSeconds(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
Time difference between left and right in seconds.
LIBCOM_API int epicsStdCall epicsTimeToGMTM(struct tm *pDest, unsigned long *pNSecDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to struct tm in UTC/GMT.
epicsTime operator-=(const double &)
subtract rhs seconds from lhs
Definition: epicsTime.h:544
C++ only ANSI C time_t.
Definition: epicsTime.h:103
C++ only ANSI C struct tm with nanoseconds, local timezone.
Definition: epicsTime.h:80
LIBCOM_API int epicsStdCall epicsTimeLessThanEqual(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
right was no later than left
double operator-(const epicsTime &) const
lhs minus rhs, in seconds
LIBCOM_API int epicsStdCall epicsTimeGreaterThan(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
left was after right
LIBCOM_API epicsUInt64 epicsMonotonicResolution(void)
Monotonic time resolution, may not be accurate. Returns the minimum non-zero time difference between ...
LIBCOM_API int epicsStdCall epicsTimeFromTime_t(epicsTimeStamp *pDest, time_t src)
Convert ANSI C time_t to epicsTimeStamp.
epicsTime & operator=(const epicsTimeStamp &)
Assign from epicsTimeStamp.
Definition: epicsTime.h:589
bool operator==(const epicsTime &) const
lhs equals rhs
Definition: epicsTime.h:550
LIBCOM_API int epicsStdCall epicsTimeGetEvent(epicsTimeStamp *pDest, int eventNumber)
Get time of event eventNumber into *pDest.
unsigned long nSec
nanoseconds extension
Definition: epicsTime.h:92
epicsUInt32 nsec
nanoseconds within second
Definition: epicsTime.h:36
LIBCOM_API int epicsStdCall epicsTimeEqual(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
left equals right
The core data types used by epics.
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
LIBCOM_API int epicsStdCall epicsTimeToTimespec(struct timespec *pDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to struct timespec
LIBCOM_API int epicsStdCall epicsTimeFromTimespec(epicsTimeStamp *pDest, const struct timespec *pSrc)
Set epicsTimeStamp from struct timespec
C++ time stamp object.
Definition: epicsTime.h:132
epicsTime operator+(const double &) const
lhs plus rhs seconds
bool operator>(const epicsTime &) const
lhs was after rhs
Definition: epicsTime.h:568
LIBCOM_API int epicsStdCall epicsTimeFromTimeval(epicsTimeStamp *pDest, const struct timeval *pSrc)
Set epicsTimeStamp from struct timeval
bool operator!=(const epicsTime &) const
lhs not equal to rhs
Definition: epicsTime.h:558
Exception: Bad field(s) in struct tm
Definition: epicsTime.h:138
unsigned long nSec
nanoseconds extension
Definition: epicsTime.h:82
epicsUInt32 secPastEpoch
seconds since 0000 Jan 1, 1990
Definition: epicsTime.h:35
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.
EPICS time stamp, for use from C code.
Definition: epicsTime.h:34
bool operator>=(const epicsTime &) const
rhs not before lhs
Definition: epicsTime.h:563
LIBCOM_API int epicsStdCall epicsTimeToTM(struct tm *pDest, unsigned long *pNSecDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to struct tm in local time zone.
C++ only ANSI C sruct tm with nanoseconds, UTC.
Definition: epicsTime.h:90
LIBCOM_API int epicsStdCall epicsTimeGetCurrent(epicsTimeStamp *pDest)
Get current time into *pDest.
BSD and SRV5 Unix timestamp.
Definition: epicsTime.h:53
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.
C++ Event number wrapper class.
Definition: epicsTime.h:112
LIBCOM_API epicsUInt64 epicsMonotonicGet(void)
Fetch monotonic counter, returns the number of nanoseconds since some unspecified time...
epicsTime operator+=(const double &)
add rhs seconds to lhs
Definition: epicsTime.h:538
epicsTimeEvent(const int &number)
Constructor.
Definition: epicsTime.h:522
LIBCOM_API void epicsStdCall epicsTimeShow(const epicsTimeStamp *, unsigned interestLevel)
Dump current state to stdout.
LIBCOM_API int epicsStdCall epicsTimeLessThan(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
left was before right
Defined by POSIX Real Time.
LIBCOM_API int epicsStdCall epicsTimeFromTM(epicsTimeStamp *pDest, const struct tm *pSrc, unsigned long nSecSrc)
Set epicsTimeStamp from struct tm in local time zone.
LIBCOM_API int epicsStdCall epicsTimeGreaterThanEqual(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
right was not before left
Exception: Time provider problem.
Definition: epicsTime.h:136
LIBCOM_API int epicsStdCall epicsTimeFromGMTM(epicsTimeStamp *pDest, const struct tm *pSrc, unsigned long nSecSrc)
Set epicsTimeStamp from struct tm in UTC/GMT.
LIBCOM_API int epicsTimeGetMonotonic(epicsTimeStamp *pDest)
Get monotonic time into *pDest.
LIBCOM_API int epicsStdCall epicsTimeNotEqual(const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight)
left not equal to right
LIBCOM_API int epicsTimeGetEventInt(epicsTimeStamp *pDest, int eventNumber)
Get time of event eventNumber into *pDest (ISR-safe)
LIBCOM_API size_t epicsStdCall epicsTimeToStrftime(char *pBuff, size_t bufLength, const char *pFormat, const epicsTimeStamp *pTS)
Convert epicsTimeStamp to string. See epicsTime::strftime()
LIBCOM_API void epicsStdCall epicsTimeAddSeconds(epicsTimeStamp *pDest, double secondsToAdd)
Add some number of seconds to dest.
LIBCOM_API int epicsStdCall epicsTimeToTime_t(time_t *pDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to ANSI C time_t.