自主协议库编译通过
This commit is contained in:
169
mmslib/util/stdtime_mms_utctime.c
Normal file
169
mmslib/util/stdtime_mms_utctime.c
Normal file
@@ -0,0 +1,169 @@
|
||||
/*****************************************************************************/
|
||||
/* SISCO SOFTWARE MODULE HEADER **********************************************/
|
||||
/*****************************************************************************/
|
||||
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||||
/* 2006 All Rights Reserved */
|
||||
/* */
|
||||
/* MODULE NAME : stdtime_mms_utctime.c */
|
||||
/* PRODUCT(S) : Standard Time Management Library */
|
||||
/* */
|
||||
/* MODULE DESCRIPTION: */
|
||||
/* Support for MMS UTC TIME conversions to/from STDTIME */
|
||||
/* */
|
||||
/* MODIFICATION LOG: */
|
||||
/* Date Who Rev Comments */
|
||||
/* -------- --- --- ----------------------------------------------------- */
|
||||
/* 02/20/08 JRB 02 Simplified StdTimeToMmsUtcTime (fixes rounding bug). */
|
||||
/* Simplified MmsUtcTimeToStdTime. */
|
||||
/* Delete StdTimeFields functions. */
|
||||
/* 10/05/06 RLH 01 Created */
|
||||
/*****************************************************************************/
|
||||
|
||||
|
||||
#include "stdtime.h"
|
||||
#include "stdtime_mms_utctime.h"
|
||||
|
||||
|
||||
/*** MmsUtcTime initialization function **************************************/
|
||||
|
||||
|
||||
STDTIME_MMS_UTC_TIME StdTimeApiZeroMmsUtcTime ()
|
||||
{
|
||||
STDTIME_MMS_UTC_TIME zero = {0};
|
||||
|
||||
return zero;
|
||||
|
||||
} /* StdTimeApiZeroMmsUtcTime */
|
||||
|
||||
|
||||
/*** MmsUtcTime functions ****************************************************/
|
||||
|
||||
|
||||
/*-***************************************************************************/
|
||||
/* StdTimeToMmsUtcTime */
|
||||
/* convert: StdTime structure to MMS_UTC_TIME */
|
||||
/* method: convert to TIMETYPE, then calculate binary fraction of second */
|
||||
/*****************************************************************************/
|
||||
|
||||
STDTIME_RC StdTimeToMmsUtcTime (
|
||||
const STDTIME * /*I*/ pStdTime,
|
||||
STDTIME_MMS_UTC_TIME * /*O*/ pMmsUtcTime)
|
||||
{
|
||||
QUADLIB_I64 qFrac;
|
||||
QUADLIB_I64 qRem;
|
||||
QUADLIB_I64 q10_7;
|
||||
QUADLIB_I64 q2_24;
|
||||
time_t timet;
|
||||
int32_t nsec;
|
||||
|
||||
STDTIME_ENUM_FUNC (StdTimeToMmsUtcTime)
|
||||
|
||||
|
||||
if (pMmsUtcTime == NULL)
|
||||
{
|
||||
STDTIME_RET_EC (null_argument);
|
||||
}
|
||||
|
||||
if STDTIME_IFNOT (StdTimeToTimeTypeEx (pStdTime, &timet, &nsec))
|
||||
{
|
||||
STDTIME_RET_RC;
|
||||
}
|
||||
|
||||
/* Init qFrac to number of 100-nsec intervals. */
|
||||
QUADLIB_I64_HI(qFrac) = 0;
|
||||
QUADLIB_I64_LO(qFrac) = nsec / 100;
|
||||
|
||||
QUADLIB_I64_HI(q10_7) = 0;
|
||||
QUADLIB_I64_LO(q10_7) = 10000000;
|
||||
|
||||
QUADLIB_I64_HI(q2_24) = 0;
|
||||
QUADLIB_I64_LO(q2_24) = 0x1000000;
|
||||
|
||||
/* multiply by range of UTC fraction */
|
||||
|
||||
QUADLIB_I64_MUL_EQ (qFrac, q2_24);
|
||||
|
||||
/* divide out number of 100-ns intervals */
|
||||
/* as 100-ns intervals approaches 10_7, frac approaches 2_24 */
|
||||
|
||||
qFrac = QuadLibI64DivMod (qFrac, q10_7, &qRem);
|
||||
|
||||
/* assign UTC values to output argument */
|
||||
|
||||
pMmsUtcTime->secs = (int32_t) timet;
|
||||
pMmsUtcTime->fraction = (int32_t) QUADLIB_I64_LO(qFrac);
|
||||
pMmsUtcTime->qflags = 0; /* IS THIS CORRECT ? */
|
||||
|
||||
STDTIME_RET_OK;
|
||||
|
||||
} /* StdTimeToMmsUtcTime */
|
||||
|
||||
|
||||
/*-***************************************************************************/
|
||||
/* MmsUtcTimeToStdTime */
|
||||
/* convert: MMS_UTC_TIME to StdTime structure */
|
||||
/*****************************************************************************/
|
||||
|
||||
STDTIME_RC MmsUtcTimeToStdTime (
|
||||
const STDTIME_MMS_UTC_TIME * /*I*/ pMmsUtcTime,
|
||||
STDTIME * /*O*/ pStdTime)
|
||||
{
|
||||
QUADLIB_I64 qFrac;
|
||||
QUADLIB_I64 qRem;
|
||||
QUADLIB_I64 q10_7;
|
||||
QUADLIB_I64 q2_24;
|
||||
int32_t nsec; /* nanoseconds */
|
||||
|
||||
STDTIME_ENUM_FUNC (MmsUtcTimeToStdTime)
|
||||
|
||||
if (pStdTime == NULL)
|
||||
{
|
||||
STDTIME_RET_EC (null_argument);
|
||||
}
|
||||
|
||||
*pStdTime = ZeroStdTime ();
|
||||
|
||||
if (pMmsUtcTime == NULL)
|
||||
{
|
||||
STDTIME_RET_EC (null_argument);
|
||||
}
|
||||
|
||||
/* Convert fraction to nsec, then call TimeTypeExToStdTime. */
|
||||
|
||||
/* obtain number of binary fractional units */
|
||||
|
||||
QUADLIB_I64_HI(q10_7) = 0;
|
||||
QUADLIB_I64_LO(q10_7) = 10000000;
|
||||
|
||||
QUADLIB_I64_HI(q2_24) = 0;
|
||||
QUADLIB_I64_LO(q2_24) = 0x1000000;
|
||||
|
||||
QUADLIB_I64_HI(qFrac) = 0;
|
||||
QUADLIB_I64_LO(qFrac) = pMmsUtcTime->fraction;
|
||||
|
||||
|
||||
/* multiply by range of 100-ns intervals */
|
||||
|
||||
QUADLIB_I64_MUL_EQ (qFrac, q10_7);
|
||||
|
||||
/* divide out number of binary fractional units */
|
||||
/* as fractional units approach 2**24, frac approaches 10**7 */
|
||||
|
||||
qFrac = QuadLibI64DivMod (qFrac, q2_24, &qRem);
|
||||
|
||||
if (QUADLIB_I64_LO(qRem) >= (10000000 / 2))
|
||||
{
|
||||
QUADLIB_I64_LO(qFrac)++; /* ROUND UP */
|
||||
}
|
||||
|
||||
nsec = (QUADLIB_I32_CASTI64 (qFrac)) * 100;
|
||||
|
||||
/* Convert and put result at pointer pStdTime. */
|
||||
if STDTIME_IFNOT (TimeTypeExToStdTime (pMmsUtcTime->secs, nsec, pStdTime))
|
||||
{
|
||||
STDTIME_RET_RC;
|
||||
}
|
||||
STDTIME_RET_OK;
|
||||
|
||||
} /* MmsUtcTimeToStdTime */
|
||||
|
||||
Reference in New Issue
Block a user