comSysNtp.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* comSysNtp.c - vxcom NTP clock module */
  2. /* Copyright (c) 2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01b,29jun01,nel  Add code to indirect interface through function ptr
  7.                  interface.
  8. 01a,20jun01,nel  created
  9. */
  10. /*
  11. DESCRIPTION
  12. This module defines comSysGetTime so that the NTP library is used to get 
  13. an acurate system time, rather than relying on the system time which may 
  14. be inacurate.
  15. INCLUDE FILES: VxWorks.h, stdio.h, sntpclib.h, CIOlib.h
  16. */
  17. /* includes */
  18. #include "vxWorks.h"
  19. #include "stdio.h"
  20. #include "sntpcLib.h"
  21. /* locals */
  22. static int comSysInit = FALSE;
  23. static unsigned long  comSysAdjustment = 0;
  24. static unsigned long  comSysLastTime = 0;
  25. static char *  pComSysTimeServer  = NULL;
  26. static unsigned int comSysTimeout = 5;
  27. /* forward declarations */
  28. int sysClkRateGet (void);
  29. void comSysSetTimeGetPtr (unsigned long (*pPtr)(void));
  30. /**************************************************************************
  31. *
  32. * comSysNtpTimeAdjust - Gets's the NTP adjustment needed to correct the
  33. *                    system clock.
  34. *
  35. * This function get's the NTP time and calculates the adjustment needed to
  36. * bring the system clock into line with the NTP time. The value is stored
  37. * and used by comSysTimeGet. If the system clock is modified outside VxCOM
  38. * the function must be called afterwards to ensure that VxCOM functions
  39. * correctly.
  40. *
  41. * RETURNS: N/A
  42. *
  43. */
  44. void comSysNtpTimeAdjust
  45.     (
  46.     time_t *      pCurrent /* Pointer to current time or NULL */
  47.     )
  48.     {
  49.     struct timespec ntpTime;
  50.     comSysInit = FALSE;
  51.     if (sntpcTimeGet
  52.         (pComSysTimeServer, 
  53.          sysClkRateGet () * comSysTimeout, 
  54.          &ntpTime) == OK)
  55.         {
  56.         time_t current;
  57.         if (pCurrent == NULL)
  58.             pCurrent = &current;
  59.         time (pCurrent);
  60.         comSysAdjustment = ntpTime.tv_sec - *pCurrent;
  61.         comSysInit = TRUE;
  62.         }
  63.     else
  64.         {
  65.         /* The adjustment failed so default to using system clock */
  66.         comSysAdjustment = 0;
  67.         }
  68.     comSysLastTime = 0;
  69.     }
  70. /**************************************************************************
  71. *
  72. * comSysNtpTimeGet - returns the time in seconds since Jan 1, 1970
  73. *
  74. * This function returns the time in seconds since Jan 1, 1970. It get's
  75. * this time by using the NTP time of a known server.
  76. *
  77. * RETURNS: the time in seconds since Jan 1, 1970.
  78. *
  79. */
  80. unsigned long comSysNtpTimeGet (void)
  81.     {
  82.     time_t current;
  83.     time (&current);
  84.     
  85.     /* Check to see if adjustment has been made. If not get the NTP time */
  86.     /* and set adjustment. */
  87.     if (!comSysInit)
  88.         {
  89.         comSysNtpTimeAdjust (&current);
  90.         }
  91.     /* check the time hasn't gotten out of step */
  92.     if (comSysLastTime > current)
  93.         {
  94.         comSysNtpTimeAdjust (&current);
  95.         }
  96.     comSysLastTime = current;
  97.     return current + comSysAdjustment;
  98.     }
  99. /**************************************************************************
  100. *
  101. * comSysNtpInit - Initialize the NTP Time module.
  102. *
  103. * Initializes the NTP Time module and installs the module into comSysLib
  104. * to be used in place of the existing time module. 
  105. *
  106. * RETURNS: N/A
  107. *
  108. */
  109. void comSysNtpInit 
  110.     (
  111.     int  broadcast,  /* use broadcast to get server */
  112.     char *  pServer,  /* server name or IP address */
  113.     unsigned int timeout /* timeout */
  114.     )
  115.     {
  116.     comSysSetTimeGetPtr (comSysNtpTimeGet);
  117.     if (broadcast)
  118.         {
  119.         pComSysTimeServer = NULL;
  120.         }
  121.     else
  122.         {
  123.         pComSysTimeServer = pServer;
  124.         }
  125.     comSysTimeout = timeout;
  126.     }