This is Unofficial EPICS BASE Doxygen Site
timeStamp.cpp
Go to the documentation of this file.
1 /* timeStamp.cpp */
2 /*
3  * Copyright information and license terms for this software can be
4  * found in the file LICENSE that is included with the distribution
5  */
9 #include <cstddef>
10 #include <cstdlib>
11 #include <cstddef>
12 #include <string>
13 #include <cstdio>
14 
15 #include <epicsTime.h>
16 
17 #define epicsExportSharedSymbols
18 #include <pv/noDefaultMethods.h>
19 #include <pv/pvType.h>
20 #include <pv/timeStamp.h>
21 
22 namespace epics { namespace pvData {
23 
24 const int32 milliSecPerSec = 1000;
25 const int32 microSecPerSec = 1000000;
26 const int32 nanoSecPerSec = 1000000000;
28 
29 TimeStamp::TimeStamp(int64 secondsPastEpoch,int32 nanoseconds,int32 userTag)
30 : secondsPastEpoch(secondsPastEpoch),nanoseconds(nanoseconds),userTag(userTag)
31 {
32  normalize();
33 }
34 
36 {
37  if(nanoseconds>=0 && nanoseconds<nanoSecPerSec) return;
38  while(nanoseconds>=nanoSecPerSec) {
39  nanoseconds -= nanoSecPerSec;
40  secondsPastEpoch++;
41  }
42  while(nanoseconds<0) {
43  nanoseconds += nanoSecPerSec;
44  secondsPastEpoch--;
45  }
46 }
47 
48 void TimeStamp::fromTime_t(const time_t & tt)
49 {
50  epicsTimeStamp epicsTime;
51  epicsTimeFromTime_t(&epicsTime,tt);
52  secondsPastEpoch = epicsTime.secPastEpoch + posixEpochAtEpicsEpoch;
53  nanoseconds = epicsTime.nsec;
54 }
55 
56 void TimeStamp::toTime_t(time_t &tt) const
57 {
58  epicsTimeStamp epicsTime;
59  epicsTime.secPastEpoch = static_cast<epicsUInt32>(secondsPastEpoch-posixEpochAtEpicsEpoch);
60  epicsTime.nsec = nanoseconds;
61  epicsTimeToTime_t(&tt,&epicsTime);
62 }
63 
64 void TimeStamp::put(int64 milliseconds)
65 {
66  secondsPastEpoch = milliseconds/1000;
67  nanoseconds = (milliseconds%1000)*1000000;
68 }
69 
71 {
72  epicsTimeStamp epicsTime;
73  epicsTimeGetCurrent(&epicsTime);
74  secondsPastEpoch = epicsTime.secPastEpoch;
75  secondsPastEpoch += posixEpochAtEpicsEpoch;
76  nanoseconds = epicsTime.nsec;
77 }
78 
79 double TimeStamp::toSeconds() const
80 {
81  double value = static_cast<double>(secondsPastEpoch);
82  double nano = nanoseconds;
83  value += nano/1e9;
84  return value;
85 }
86 
87 int64 TimeStamp::diffInt(TimeStamp const & left,TimeStamp const&right )
88 {
89  int64 sl = left.secondsPastEpoch;
90  int32 nl = left.nanoseconds;
91  int64 sr = right.secondsPastEpoch;
92  int32 nr = right.nanoseconds;
93  int64 sdiff = sl - sr;
94  sdiff *= nanoSecPerSec;
95  sdiff += nl - nr;
96  return sdiff;
97 }
98 
99 bool TimeStamp::operator==(TimeStamp const &right) const
100 {
101  int64 sdiff = diffInt(*this,right);
102  if(sdiff==0) return true;
103  return false;
104 }
105 
106 bool TimeStamp::operator!=(TimeStamp const &right) const
107 {
108  int64 sdiff = diffInt(*this,right);
109  if(sdiff!=0) return true;
110  return false;
111 }
112 
113 bool TimeStamp::operator<=(TimeStamp const &right) const
114 {
115  int64 sdiff = diffInt(*this,right);
116  if(sdiff<=0) return true;
117  return false;
118 }
119 
120 bool TimeStamp::operator< (TimeStamp const &right) const
121 {
122  int64 sdiff = diffInt(*this,right);
123  if(sdiff<0) return true;
124  return false;
125 }
126 
127 bool TimeStamp::operator>=(TimeStamp const &right) const
128 {
129  int64 sdiff = diffInt(*this,right);
130  if(sdiff>=0) return true;
131  return false;
132 }
133 
134 bool TimeStamp::operator>(TimeStamp const &right) const
135 {
136  int64 sdiff = diffInt(*this,right);
137  if(sdiff>0) return true;
138  return false;
139 }
140 
141 double TimeStamp::diff(TimeStamp const & a,TimeStamp const & b)
142 {
143  double result = static_cast<double>(a.secondsPastEpoch - b.secondsPastEpoch);
144  result += (a.nanoseconds - b.nanoseconds)/1e9;
145  return result;
146 }
147 
148 
150 {
151  secondsPastEpoch += seconds;
152  return *this;
153 }
154 
156 {
157  secondsPastEpoch -= seconds;
158  return *this;
159 }
160 
162 {
163  int64 secs = static_cast<int64>(seconds);
164  int64 nano = static_cast<int64>((seconds - secs)*1e9);
165  nanoseconds += static_cast<int32>(nano);
166  if(nanoseconds>nanoSecPerSec) {
167  nanoseconds -= nanoSecPerSec;
168  secondsPastEpoch += 1;
169  } else if(nanoseconds<-nanoSecPerSec) {
170  nanoseconds += -nanoSecPerSec;
171  secondsPastEpoch -= 1;
172  }
173  secondsPastEpoch += secs;
174  return *this;
175 }
176 
178 {
179  return operator+=(-seconds);
180 }
181 
183 {
184  return secondsPastEpoch*1000 + nanoseconds/1000000;
185 }
186 
187 }}
epicsShareExtern const int32 nanoSecPerSec
Definition: timeStamp.h:24
Definition: link.h:174
pvac::PutEvent result
Definition: clientSync.cpp:117
double toSeconds() const
Definition: timeStamp.cpp:79
LIBCOM_API int epicsStdCall epicsTimeFromTime_t(epicsTimeStamp *pDest, time_t src)
Convert ANSI C time_t to epicsTimeStamp.
Definition: epicsTime.cpp:944
TimeStamp & operator-=(int64 seconds)
Definition: timeStamp.cpp:155
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
unsigned int epicsUInt32
Definition: epicsTypes.h:43
epicsUInt32 secPastEpoch
seconds since 0000 Jan 1, 1990
Definition: epicsTime.h:34
bool operator<=(TimeStamp const &) const
Definition: timeStamp.cpp:113
TimeStamp & operator+=(int64 seconds)
Definition: timeStamp.cpp:149
LIBCOM_API int epicsStdCall epicsTimeToTime_t(time_t *pDest, const epicsTimeStamp *pSrc)
Convert epicsTimeStamp to ANSI C time_t.
Definition: epicsTime.cpp:933
bool operator==(TimeStamp const &) const
Definition: timeStamp.cpp:99
void put(int64 secondsPastEpoch, int32 nanoseconds=0)
Definition: timeStamp.h:108
epicsShareExtern const int32 microSecPerSec
Definition: timeStamp.h:23
int epicsStdCall epicsTimeGetCurrent(epicsTimeStamp *pDest)
Get current time into *pDest.
epicsShareExtern const int32 milliSecPerSec
Definition: timeStamp.h:22
#define POSIX_TIME_AT_EPICS_EPOCH
The EPICS Epoch is 00:00:00 Jan 1, 1990 UTC.
Definition: epicsTime.h:26
int64_t int64
Definition: pvType.h:87
bool operator>=(TimeStamp const &) const
Definition: timeStamp.cpp:127
bool operator>(TimeStamp const &) const
Definition: timeStamp.cpp:134
EPICS time stamp, for use from C code.
Definition: epicsTime.h:33
static double diff(TimeStamp const &a, TimeStamp const &b)
Definition: timeStamp.cpp:141
epicsShareExtern const int64 posixEpochAtEpicsEpoch
Definition: timeStamp.h:25
bool operator!=(TimeStamp const &) const
Definition: timeStamp.cpp:106
EPICS time-stamps (epicsTimeStamp), epicsTime C++ class and C functions for handling wall-clock times...
void toTime_t(time_t &time) const
Definition: timeStamp.cpp:56
bool operator<(TimeStamp const &) const
Definition: timeStamp.cpp:120
void fromTime_t(const time_t &time)
Definition: timeStamp.cpp:48
int32_t int32
Definition: pvType.h:83
Methods for manipulating timeStamp.
Definition: timeStamp.h:43
epicsUInt32 nsec
nanoseconds within second
Definition: epicsTime.h:35