added conversion between epicsTime and win32 FILETIME

This commit is contained in:
Jeff Hill
2002-09-04 16:30:37 +00:00
parent f5cbac744e
commit 6ec7ac0e16
9 changed files with 224 additions and 86 deletions

View File

@@ -418,6 +418,104 @@ epicsTime::epicsTime (const aitTimeStamp &ts)
*this = epicsTime (this->secPastEpoch+secAdj, this->nSec+nSecAdj);
}
static const FILETIME epicsEpochInFileTime = { 0x18d64000, 0x01b41e2a };
static inline bool fileTimeGreaterThanOrEqual ( const FILETIME & lhs, const FILETIME & rhs )
{
if ( lhs.dwHighDateTime > rhs.dwHighDateTime ) {
return true;
}
else if ( lhs.dwHighDateTime < rhs.dwHighDateTime ) {
return false;
}
else if ( lhs.dwLowDateTime >= rhs.dwLowDateTime ) {
return true;
}
return false;
}
epicsTime::operator _FILETIME () const
{
static const DWORD dwordMax = 0xffffffff;
static const double ticksPerLowWord =
static_cast < double > ( dwordMax ) + 1;
static const double ftNanoSecPerTick = 100;
static const double ftTicksPerSec = 1e7;
// compute the ticks past the epics epoch in file time ticks
double ftTicks = this->secPastEpoch * ftTicksPerSec + this->nSec / ftNanoSecPerTick;
FILETIME ftTicksPastEpicsEpoch;
ftTicksPastEpicsEpoch.dwHighDateTime = static_cast < DWORD > ( ftTicks / ticksPerLowWord );
double lowPart = ftTicks - ftTicksPastEpicsEpoch.dwHighDateTime * ticksPerLowWord;
ftTicksPastEpicsEpoch.dwLowDateTime = static_cast < DWORD > ( lowPart );
// add the EPICS epoch offset
FILETIME result;
result.dwHighDateTime =
epicsEpochInFileTime.dwHighDateTime + ftTicksPastEpicsEpoch.dwHighDateTime;
if ( epicsEpochInFileTime.dwLowDateTime > dwordMax - ftTicksPastEpicsEpoch.dwLowDateTime ) {
// carry
result.dwHighDateTime++;
double tmp = epicsEpochInFileTime.dwLowDateTime;
tmp += ftTicksPastEpicsEpoch.dwLowDateTime;
result.dwLowDateTime = static_cast < DWORD > ( tmp - dwordMax );
}
else {
result.dwLowDateTime =
epicsEpochInFileTime.dwLowDateTime + ftTicksPastEpicsEpoch.dwLowDateTime;
}
return result;
}
epicsTime::epicsTime ( const _FILETIME & ts )
{
static const DWORD dwordMax = 0xffffffff;
if ( fileTimeGreaterThanOrEqual ( ts , epicsEpochInFileTime ) ) {
// remove epics epoch offset from the incoming file time
FILETIME ftTicksPastEpicsEpoch;
ftTicksPastEpicsEpoch.dwHighDateTime =
ts.dwHighDateTime - epicsEpochInFileTime.dwHighDateTime;
if ( ts.dwLowDateTime >= epicsEpochInFileTime.dwLowDateTime ) {
ftTicksPastEpicsEpoch.dwLowDateTime =
ts.dwLowDateTime - epicsEpochInFileTime.dwLowDateTime;
}
else {
// borrow
ftTicksPastEpicsEpoch.dwHighDateTime--;
ftTicksPastEpicsEpoch.dwLowDateTime =
( dwordMax - epicsEpochInFileTime.dwLowDateTime )
+ ts.dwLowDateTime + 1;
}
// adjust between file time ticks and EPICS time ticks
static const double ticksPerLowWord =
static_cast < double > ( dwordMax ) + 1;
static const double ftTicksPerSec = 1e7;
static const double epicsTicksPerSec = 1e9;
double ftTicksPastEpicsEpochFP =
ticksPerLowWord * ftTicksPastEpicsEpoch.dwHighDateTime +
ftTicksPastEpicsEpoch.dwLowDateTime;
double epicsTicksPastEpicsEpoch = ftTicksPastEpicsEpochFP *
( epicsTicksPerSec / ftTicksPerSec );
this->secPastEpoch = static_cast < unsigned long >
( epicsTicksPastEpicsEpoch / nSecPerSec );
double nSec = epicsTicksPastEpicsEpoch -
this->secPastEpoch * epicsTime::nSecPerSec;
this->nSec = static_cast < unsigned long > ( nSec );
}
else {
this->secPastEpoch = 0;
this->nSec = 0;
}
}
epicsTime & epicsTime::operator = ( const _FILETIME & rhs )
{
*this = epicsTime ( rhs );
return *this;
}
//
// epicsTime::ntpTimeStamp ()
//

View File

@@ -86,26 +86,26 @@ public:
class formatProblemWithStructTM {};
epicsTime ();
epicsTime (const epicsTime &t);
epicsTime ( const epicsTime & t );
static epicsTime getEvent (const epicsTimeEvent &event);
static epicsTime getEvent ( const epicsTimeEvent & );
static epicsTime getCurrent ();
// convert to and from EPICS epicsTimeStamp format
operator epicsTimeStamp () const;
epicsTime (const epicsTimeStamp &ts);
epicsTime operator = (const epicsTimeStamp &rhs);
epicsTime ( const epicsTimeStamp & ts );
epicsTime & operator = ( const epicsTimeStamp & );
// convert to and from ANSI time_t
operator time_t_wrapper () const;
epicsTime (const time_t_wrapper &tv);
epicsTime operator = (const time_t_wrapper &rhs);
epicsTime ( const time_t_wrapper & );
epicsTime & operator = ( const time_t_wrapper & );
// convert to and from ANSI Cs "struct tm" (with nano seconds)
// adjusted for the local time zone
operator local_tm_nano_sec () const;
epicsTime (const local_tm_nano_sec &ts);
epicsTime operator = (const local_tm_nano_sec &rhs);
epicsTime ( const local_tm_nano_sec & );
epicsTime & operator = ( const local_tm_nano_sec & );
// convert to ANSI Cs "struct tm" (with nano seconds)
// adjusted for GM time (UTC)
@@ -113,44 +113,49 @@ public:
// convert to and from POSIX RTs "struct timespec"
operator struct timespec () const;
epicsTime (const struct timespec &ts);
epicsTime operator = (const struct timespec &rhs);
epicsTime ( const struct timespec & );
epicsTime & operator = ( const struct timespec & );
// convert to and from BSDs "struct timeval"
operator struct timeval () const;
epicsTime (const struct timeval &ts);
epicsTime operator = (const struct timeval &rhs);
epicsTime ( const struct timeval & );
epicsTime & operator = ( const struct timeval & );
// convert to and from NTP timestamp format
operator ntpTimeStamp () const;
epicsTime (const ntpTimeStamp &ts);
epicsTime operator = (const ntpTimeStamp &rhs);
epicsTime ( const ntpTimeStamp & );
epicsTime & operator = ( const ntpTimeStamp & );
// convert to and from GDDs aitTimeStamp format
operator aitTimeStamp () const;
epicsTime (const aitTimeStamp &ts);
epicsTime operator = (const aitTimeStamp &rhs);
epicsTime ( const aitTimeStamp & );
epicsTime & operator = ( const aitTimeStamp & );
// convert to and from WIN32s FILETIME
operator struct _FILETIME () const;
epicsTime ( const struct _FILETIME & );
epicsTime & operator = ( const struct _FILETIME & );
// arithmetic operators
double operator- (const epicsTime &rhs) const; // returns seconds
epicsTime operator+ (const double &rhs) const; // add rhs seconds
epicsTime operator- (const double &rhs) const; // subtract rhs seconds
epicsTime operator+= (const double &rhs); // add rhs seconds
epicsTime operator-= (const double &rhs); // subtract rhs seconds
double operator- ( const epicsTime & ) const; // returns seconds
epicsTime operator+ ( const double & ) const; // add rhs seconds
epicsTime operator- ( const double & ) const; // subtract rhs seconds
epicsTime operator+= ( const double & ); // add rhs seconds
epicsTime operator-= ( const double & ); // subtract rhs seconds
// comparison operators
bool operator == (const epicsTime &rhs) const;
bool operator != (const epicsTime &rhs) const;
bool operator <= (const epicsTime &rhs) const;
bool operator < (const epicsTime &rhs) const;
bool operator >= (const epicsTime &rhs) const;
bool operator > (const epicsTime &rhs) const;
bool operator == ( const epicsTime & ) const;
bool operator != ( const epicsTime & ) const;
bool operator <= ( const epicsTime & ) const;
bool operator < ( const epicsTime & ) const;
bool operator >= ( const epicsTime & ) const;
bool operator > ( const epicsTime & ) const;
// convert current state to user-specified string
size_t strftime (char *pBuff, size_t bufLength, const char *pFormat) const;
size_t strftime ( char * pBuff, size_t bufLength, const char * pFormat ) const;
// dump current state to standard out
void show (unsigned interestLevel) const;
void show ( unsigned interestLevel ) const;
// useful public constants
static const unsigned secPerMin;
@@ -159,8 +164,6 @@ public:
static const unsigned nSecPerSec;
static const unsigned nSecPerUSec;
// depricated
static void synchronize ();
private:
// private because:
// a) application does not break when EPICS epoch is changed
@@ -169,11 +172,14 @@ private:
// c) it would be easy to forget which argument is nanoseconds
// and which argument is seconds (no help from compiler)
//
epicsTime (const unsigned long secPastEpoch, const unsigned long nSec);
void addNanoSec (long nanoSecAdjust);
epicsTime ( const unsigned long secPastEpoch, const unsigned long nSec );
void addNanoSec ( long nanoSecAdjust );
unsigned long secPastEpoch; // seconds since O000 Jan 1, 1990
unsigned long nSec; // nanoseconds within second
public:
static void synchronize (); // depricated
};
extern "C" {
@@ -189,68 +195,68 @@ extern "C" {
#define epicsTimeEventDeviceTime -2
/* convert to and from ANSI C's "time_t" */
epicsShareFunc int epicsShareAPI epicsTimeGetCurrent (epicsTimeStamp *pDest);
epicsShareFunc int epicsShareAPI epicsTimeGetCurrent ( epicsTimeStamp * pDest );
epicsShareFunc int epicsShareAPI epicsTimeGetEvent (
epicsTimeStamp *pDest, int eventNumber);
/* convert to and from ANSI C's "struct tm" with nano second */
epicsShareFunc int epicsShareAPI epicsTimeToTime_t (
time_t *pDest, const epicsTimeStamp *pSrc);
time_t * pDest, const epicsTimeStamp * pSrc );
epicsShareFunc int epicsShareAPI epicsTimeFromTime_t (
epicsTimeStamp *pDest, time_t src);
epicsTimeStamp * pDest, time_t src );
/*convert to and from ANSI C's "struct tm" with nano seconds */
epicsShareFunc int epicsShareAPI epicsTimeToTM (
struct tm *pDest, unsigned long *pNSecDest, const epicsTimeStamp *pSrc);
struct tm * pDest, unsigned long * pNSecDest, const epicsTimeStamp * pSrc );
epicsShareFunc int epicsShareAPI epicsTimeToGMTM (
struct tm *pDest, unsigned long *pNSecDest, const epicsTimeStamp *pSrc);
struct tm * pDest, unsigned long * pNSecDest, const epicsTimeStamp * pSrc );
epicsShareFunc int epicsShareAPI epicsTimeFromTM (
epicsTimeStamp *pDest, const struct tm *pSrc, unsigned long nSecSrc);
epicsTimeStamp * pDest, const struct tm * pSrc, unsigned long nSecSrc );
/* convert to and from POSIX RT's "struct timespec" */
epicsShareFunc int epicsShareAPI epicsTimeToTimespec (
struct timespec *pDest, const epicsTimeStamp *pSrc);
struct timespec * pDest, const epicsTimeStamp * pSrc );
epicsShareFunc int epicsShareAPI epicsTimeFromTimespec (
epicsTimeStamp *pDest, const struct timespec *pSrc);
epicsTimeStamp * pDest, const struct timespec * pSrc );
/* convert to and from BSD's "struct timeval" */
epicsShareFunc int epicsShareAPI epicsTimeToTimeval (
struct timeval *pDest, const epicsTimeStamp *pSrc);
struct timeval * pDest, const epicsTimeStamp * pSrc );
epicsShareFunc int epicsShareAPI epicsTimeFromTimeval (
epicsTimeStamp *pDest, const struct timeval *pSrc);
epicsTimeStamp * pDest, const struct timeval * pSrc );
/*arithmetic operations */
epicsShareFunc double epicsShareAPI epicsTimeDiffInSeconds (
const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight);/* left - right */
const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight );/* left - right */
epicsShareFunc void epicsShareAPI epicsTimeAddSeconds (
epicsTimeStamp *pDest, double secondsToAdd); /* adds seconds to *pDest */
epicsTimeStamp * pDest, double secondsToAdd ); /* adds seconds to *pDest */
/*comparison operations: returns (0,1) if (false,true) */
epicsShareFunc int epicsShareAPI epicsTimeEqual (
const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight);
const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
epicsShareFunc int epicsShareAPI epicsTimeNotEqual (
const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight);
const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight);
epicsShareFunc int epicsShareAPI epicsTimeLessThan (
const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight); /*true if left < right */
const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight); /*true if left < right */
epicsShareFunc int epicsShareAPI epicsTimeLessThanEqual (
const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight); /*true if left <= right) */
const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight); /*true if left <= right) */
epicsShareFunc int epicsShareAPI epicsTimeGreaterThan (
const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight); /*true if left < right */
const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight); /*true if left < right */
epicsShareFunc int epicsShareAPI epicsTimeGreaterThanEqual (
const epicsTimeStamp *pLeft, const epicsTimeStamp *pRight); /*true if left < right */
const epicsTimeStamp * pLeft, const epicsTimeStamp * pRight); /*true if left < right */
/*convert to ASCII string */
epicsShareFunc size_t epicsShareAPI epicsTimeToStrftime (
char *pBuff, size_t bufLength, const char *pFormat, const epicsTimeStamp *pTS);
char * pBuff, size_t bufLength, const char * pFormat, const epicsTimeStamp * pTS );
/* dump current state to standard out */
epicsShareFunc void epicsShareAPI epicsTimeShow (
const epicsTimeStamp *, unsigned interestLevel);
const epicsTimeStamp *, unsigned interestLevel );
/* OS dependent reentrant versions of the ANSI C interface because */
/* vxWorks gmtime_r interface does not match POSIX standards */
int epicsTime_localtime ( const time_t *clock, struct tm *result );
int epicsTime_gmtime ( const time_t *clock, struct tm *result );
int epicsTime_localtime ( const time_t * clock, struct tm * result );
int epicsTime_gmtime ( const time_t * clock, struct tm * result );
#ifdef __cplusplus
}
@@ -259,66 +265,66 @@ int epicsTime_gmtime ( const time_t *clock, struct tm *result );
/* epicsTime inline member functions ,*/
#ifdef __cplusplus
inline epicsTime epicsTime::operator - (const double &rhs) const
inline epicsTime epicsTime::operator - ( const double & rhs ) const
{
return epicsTime::operator + (-rhs);
return epicsTime::operator + ( -rhs );
}
inline epicsTime epicsTime::operator += (const double &rhs)
inline epicsTime epicsTime::operator += ( const double & rhs )
{
*this = epicsTime::operator + (rhs);
*this = epicsTime::operator + ( rhs );
return *this;
}
inline epicsTime epicsTime::operator -= (const double &rhs)
inline epicsTime epicsTime::operator -= ( const double & rhs )
{
*this = epicsTime::operator + (-rhs);
*this = epicsTime::operator + ( -rhs );
return *this;
}
inline bool epicsTime::operator == (const epicsTime &rhs) const
inline bool epicsTime::operator == ( const epicsTime & rhs ) const
{
if (this->secPastEpoch == rhs.secPastEpoch && this->nSec == rhs.nSec) {
if ( this->secPastEpoch == rhs.secPastEpoch && this->nSec == rhs.nSec ) {
return true;
}
return false;
}
inline bool epicsTime::operator != (const epicsTime &rhs) const
inline bool epicsTime::operator != ( const epicsTime & rhs ) const
{
return !epicsTime::operator == (rhs);
return !epicsTime::operator == ( rhs );
}
inline bool epicsTime::operator >= (const epicsTime &rhs) const
inline bool epicsTime::operator >= ( const epicsTime & rhs ) const
{
return ! ( *this < rhs );
}
inline bool epicsTime::operator > (const epicsTime &rhs) const
inline bool epicsTime::operator > ( const epicsTime & rhs ) const
{
return ! ( *this <= rhs );
}
inline epicsTime epicsTime::operator = (const local_tm_nano_sec &rhs)
inline epicsTime & epicsTime::operator = ( const local_tm_nano_sec & rhs )
{
return *this = epicsTime (rhs);
return *this = epicsTime ( rhs );
}
inline epicsTime epicsTime::operator = (const struct timespec &rhs)
inline epicsTime & epicsTime::operator = ( const struct timespec & rhs )
{
*this = epicsTime (rhs);
*this = epicsTime ( rhs );
return *this;
}
inline epicsTime epicsTime::operator = (const aitTimeStamp &rhs)
inline epicsTime & epicsTime::operator = ( const aitTimeStamp & rhs )
{
*this = epicsTime (rhs);
*this = epicsTime ( rhs );
return *this;
}
inline epicsTime epicsTime::operator = (const epicsTimeStamp &rhs)
inline epicsTime & epicsTime::operator = ( const epicsTimeStamp & rhs )
{
*this = epicsTime (rhs);
*this = epicsTime ( rhs );
return *this;
}
@@ -331,16 +337,16 @@ inline epicsTime::operator epicsTimeStamp () const
}
#ifdef NTP_SUPPORT
inline epicsTime epicsTime::operator = (const ntpTimeStamp &rhs)
inline epicsTime epicsTime::operator = ( const ntpTimeStamp & rhs )
{
*this = epicsTime (rhs);
return *this;
}
#endif
inline epicsTime epicsTime::operator = (const time_t_wrapper &rhs)
inline epicsTime & epicsTime::operator = ( const time_t_wrapper & rhs )
{
*this = epicsTime (rhs);
*this = epicsTime ( rhs );
return *this;
}
#endif /* __cplusplus */

View File

@@ -19,5 +19,14 @@
* causes `struct timespec' to be defined in more than one place.
*/
#include <inttypes.h>
/* from win32 */
typedef uint32_t DWORD;
typedef struct _FILETIME {
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
} FILETIME;
#endif /* ifndef osdTimeh */

View File

@@ -11,12 +11,18 @@
/*
* $Id$
*
* Author: Jeff Hill
*/
#ifndef osdTimeh
#define osdTimeh
/* NOOP */
#include <inttypes.h>
/* from win32 */
typedef uint32_t DWORD;
typedef struct _FILETIME {
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
} FILETIME;
#endif /* ifndef osdTimeh */

View File

@@ -17,6 +17,8 @@
#ifndef osdTimeh
#define osdTimeh
#include <inttypes.h>
/*
* I assume that this is never defined on VMS ?
*/
@@ -25,4 +27,11 @@ struct timespec {
long tv_nsec; /* nanoseconds within the second */
};
/* from win32 */
typedef uint32_t DWORD;
typedef struct _FILETIME {
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
} FILETIME;
#endif /* ifndef osdTimeh */

View File

@@ -16,12 +16,6 @@ extern "C" {
#include <time.h>
#include <errno.h>
#ifndef VC_EXTRALEAN
# define VC_EXTRALEAN
#endif
#ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
#endif
#include <winsock2.h>
#ifdef __cplusplus

View File

@@ -17,6 +17,8 @@
#ifndef osdTimeh
#define osdTimeh
#include <winsock2.h>
struct timespec {
time_t tv_sec; /* seconds since some epoch */
long tv_nsec; /* nanoseconds within the second */

View File

@@ -34,5 +34,12 @@ epicsShareFunc void epicsShareAPI
}
#endif /* __cplusplus */
/* from win32 */
typedef uint32_t DWORD;
typedef struct _FILETIME {
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
} FILETIME;
#endif /* ifndef osdTimeh */

View File

@@ -9,3 +9,10 @@
\*************************************************************************/
/* Following needed for struct timeval */
#include <sys/times.h>
/* from win32 */
typedef uint32_t DWORD;
typedef struct _FILETIME {
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
} FILETIME;