sr_time.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:16k
源码类别:

DVD

开发平台:

C/C++

  1. /**********************************************************************************
  2. File Name   : sr_time.c
  3. Description : Time / Date Manager
  4. COPYRIGHT (C) STMicroelectronics 2004
  5. Date               Modification                                             Name
  6. ----               ------------                                             ----
  7. 8/18/2004        Created                                                  Louie
  8. <$ModMark> (do not move/delete)
  9. ***********************************************************************************/
  10. #ifndef __SR_TIME_C__ /* Prevent multiple inclusion of the file */
  11. #define __SR_TIME_C__
  12. /* C++ support */
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. /* Includes ----------------------------------------------------------------- */
  17. #include <string.h>
  18. #include <time.h>
  19. #include "stcommon.h"
  20. #include "stdio.h"
  21. #include "sr_time.h"
  22. #include <debug.h>
  23. #include <task.h>
  24. #include "tbx.h"
  25. #include "usif.h"
  26. #include "usifORG.h"
  27. #include"db.h"//lsp 07/3/14
  28. /* Private Types ------------------------------------------------------------ */
  29. /* Private Constants -------------------------------------------------------- */
  30. /* UTC time in unix format: number of seconds elapsed since January 1, 1970 */
  31. #define U32_UTC_JANUARY_01_2004_1200_00AM 0x3FF36300
  32. #define IS_LEAP_YEAR(Y)     ( ((Y)>0) && !((Y)%4) && ( ((Y)%100) || !((Y)%400) ) )
  33. /* Private Variables (static) ------------------------------------------------ */
  34. static U32 currentUTCtime;
  35. static task_t*  ptidTimMgrTask;
  36. //static   char monString[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", 
  37. //      "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
  38. static   char monString[12][3] = {"1", "2", "3", "4", "5", "6", 
  39.       "7", "8", "9", "10", "11", "12"};
  40. //static   char WeekString[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
  41. static   char WeekString[7][2] = {"7", "1", "2", "3", "4", "5", "6"};
  42. //static   U32 daysPerMon[12]={31,28,31,30,31,30,31,31,30,31,30,31};//lsp 07/3/14
  43. static U32 monthToDaysInYear[13] = {
  44. 0,31,59,90,120,151,181,212,243,273,304,334,365
  45. };
  46. static semaphore_t tim_SemLock;
  47. /* Global Variables --------------------------------------------------------- */
  48. static int timeDateUserOffset;
  49. signed char xpdrTimeRef;
  50. //extern void SRUIF_UpdateBoxInfo(void);
  51. /* Private Macros ----------------------------------------------------------- */
  52. /* Private Function prototypes ---------------------------------------------- */
  53. static void TIM_ManagerProcess(void *pvParam);
  54. static ST_ErrorCode_t TIM_Protect(void);
  55. static ST_ErrorCode_t TIM_UnProtect(void);
  56. /* Functions ---------------------------------------------------------------- */
  57. /*-----------------------------------------------------------------------------
  58.  * Function : TIM_Protect
  59.  *            Protect by semaphore shared data
  60.  *            Do the initialisation if needed.
  61.  * Input    : N/A
  62.  * Output   : N/A
  63.  * Return   : ErrCode
  64.  * -------------------------------------------------------------------------- */
  65. static ST_ErrorCode_t TIM_Protect(void)
  66. {
  67.     static BOOL tim_SemInit = FALSE;
  68.     /* First check if init of the semaphore is already done                   */
  69.     if (tim_SemInit == FALSE)
  70.     {
  71.         /* Init the semaphore to 1 and wait on the semaphore is the same as   */
  72.         /* setting directly the semaphore to 0.                               */
  73.         semaphore_init_fifo(&tim_SemLock, 0);
  74.         /* We are now in critical section                                     */
  75.         tim_SemInit = TRUE;
  76.     }
  77.     else
  78.     {
  79.         semaphore_wait(&tim_SemLock);
  80.     }
  81.     return ST_NO_ERROR;
  82. } /* TIM_Proctect */
  83. /*------------------------------------------------------------------------------
  84.  * Function : TIM_UnProtect
  85.  *            Protect by semaphore shared data
  86.  * Input    : N/A
  87.  * Output   : N/A
  88.  * Return   : ErrCode
  89.  * -------------------------------------------------------------------------- */
  90. static ST_ErrorCode_t TIM_UnProtect(void)
  91. {
  92.     /* Wake up locked task on semaphore (if any)                              */
  93.     semaphore_signal(&tim_SemLock);
  94.     return ST_NO_ERROR;
  95. } /* TIM_UnProctect */
  96. /*******************************************************************************
  97. Name        : S R T I M _ I n i t ( v o i d ) 
  98. Description : <$functionDescription>
  99. Parameters  : 
  100. Assumptions :
  101. Limitations : 
  102. Returns     : (ST_ErrorCode_t) <$returnDescription>
  103. *******************************************************************************/
  104. ST_ErrorCode_t SRTIM_Init(void)
  105. {
  106. currentUTCtime = 0; /* time not set */
  107. /*if(pstBoxInfo)
  108. {
  109. timeDateUserOffset = pstBoxInfo->timeDateUserOffset;
  110. xpdrTimeRef = pstBoxInfo->xpdrTimeRef;
  111. }
  112. else*/
  113. {
  114. //timeDateUserOffset = 0;//masked by lsp 07/3/14
  115.        timeDateUserOffset=(int)KB_DBGetTimeDateUserOffset();//lsp 07/3/14
  116.        printf("nSRTIM_Init(void)    timeDateUserOffset=%un",timeDateUserOffset);
  117. //end lsp 07/3/14
  118. xpdrTimeRef = INVALID_LINK;
  119. }
  120. if ((ptidTimMgrTask = task_create(TIM_ManagerProcess,
  121.          0,
  122.         1024, //TMTM * 4,
  123.         5,
  124.         "timemgr_task",
  125.         0)) == (task_t *) 0)
  126. {
  127.         STTBX_Print(( "Failed to start Time Manager processn"));
  128.      }
  129.      else
  130.      {
  131.         STTBX_Print(( "nSuccessfully started Time Manager processn"));
  132.      }
  133. return ST_NO_ERROR;
  134. }/* End of   S R T I M _ I n i t ( v o i d ) ( ) */
  135. static void TIM_ManagerProcess(void *pvParam)
  136. {
  137. if(debugconnected())
  138. {
  139. currentUTCtime = (U32) time(NULL);
  140. }
  141. else
  142. currentUTCtime = 0;
  143. while(1)
  144. {
  145. task_delay(ST_GetClocksPerSecond());
  146. /* run every second */
  147. if(currentUTCtime) 
  148. {
  149. TIM_Protect();
  150. currentUTCtime++;
  151. TIM_UnProtect();
  152. }
  153. }
  154. }
  155. //*****************************************************************************
  156. //名称:YMDtoMJD
  157. //
  158. //功能:将YMD时间转换成MJD时间
  159. //
  160. //输入:long Y  年long M  月long D  日
  161. //
  162. //返回:将转换好的字符串赋给MJD
  163. //注      :short &MJD  MJD时间
  164. //*****************************************************************************
  165. void YMDtoMJD(unsigned long Y,unsigned long M,unsigned long D, unsigned short *MJD)
  166. {
  167. long L;
  168. if( M ==  1 || M == 2)
  169. L = 1; 
  170. else 
  171. L = 0;
  172. *MJD = (unsigned short)(14956 +D + (((Y-1900) - L)*36525)/100 + ((M + 1 + L* 12)*306001)/10000);
  173. return;
  174. }
  175. //*****************************************************************************
  176. //名称:GetWeekDay
  177. //
  178. //功能:从输入的MJD时间得到今天是星期几
  179. //
  180. //输入:MJD时间
  181. //
  182. //返回: 0--周日, 1--周一; ..., 6
  183. //*****************************************************************************
  184. char GetWeekDay(unsigned short MJD)
  185. {
  186. char week_day;
  187. week_day = (MJD + 3) % 7;
  188. return week_day;
  189. }
  190. //*****************************************************************************
  191. //名称:GetWeekDay
  192. //
  193. //功能:从输入的MJD时间得到今天是星期几
  194. //
  195. //输入:MJD时间
  196. //
  197. //返回: 0--周日, 1--周一; ..., 6
  198. //*****************************************************************************
  199. int ConvertTimeStampToDateString(U32 timeStamp, char* out)
  200. {
  201.    U32 year, month, day;
  202.    U32 fullMinutes, fullHours, 
  203.     fullDays, fullDaysSince1968, 
  204.     numOfLeapYears, daysSinceCurLeapYear, 
  205.     fullYears, daysSinceStartOfYear, daysToMonth;
  206.    unsigned short MJD;
  207.    int week_day=-1;
  208.    if(timeStamp == 0)
  209.    {
  210.     strcpy(out, "*******");
  211.     return week_day;
  212.    }
  213.    
  214. fullMinutes = timeStamp / 60;
  215. fullHours = fullMinutes / 60;
  216. fullDays = fullHours / 24;
  217. fullDaysSince1968 = fullDays + 365 + 366;
  218. numOfLeapYears = fullDaysSince1968 / ((4 * 365) + 1);
  219. daysSinceCurLeapYear = fullDaysSince1968 % ((4 * 365) + 1);
  220. if((daysSinceCurLeapYear >= (31 + 29))) numOfLeapYears++;
  221. fullYears = (fullDaysSince1968 - numOfLeapYears) / 365;
  222. daysSinceStartOfYear = fullDaysSince1968 - (fullYears * 365) - numOfLeapYears;
  223. if((daysSinceCurLeapYear <= 365) && (daysSinceCurLeapYear >= 60)) daysSinceStartOfYear++;
  224. year = 1900 + fullYears + 68;
  225. month = 13;
  226. daysToMonth = 366;
  227. while (daysSinceStartOfYear < daysToMonth)
  228. {
  229. month--;
  230. daysToMonth = monthToDaysInYear[month];
  231. if((month >= 2) && ((year % 4) == 0)) daysToMonth++;
  232. }
  233. month++;
  234. day = daysSinceStartOfYear - daysToMonth + 1;
  235. YMDtoMJD(year,month,day, &MJD);
  236. week_day=(int)GetWeekDay(MJD);
  237. sprintf(out, "%s %02d %s %02d", WeekString[week_day],day, monString[month - 1], year%2000);
  238. return week_day;
  239. //sprintf(out, "%02d%s%02d", day, monString[month - 1], year%2000);
  240. }
  241. void ConvertTimeStampToTimeString(U32 timeStamp, char* out)
  242. {
  243.     U32 days, hours, minutes;
  244.    if(timeStamp == 0)
  245.    {
  246.     strcpy(out, "--:--");
  247.     return;
  248.    }
  249.     days = timeStamp / 86400;
  250.     timeStamp = timeStamp % 86400;
  251.     hours = timeStamp /3600;
  252.     timeStamp = timeStamp % 3600;
  253.     minutes = timeStamp / 60;
  254.     sprintf(out, "%02d:%02d", hours, minutes);    
  255. }
  256. //*****************************************************************************
  257. //名称:ConvertTimeStampToHHMMSS
  258. //
  259. //功能:将时间转换成"HH:MM:SS"的格式输出
  260. //
  261. //输入:当前的格林威治时间
  262. //
  263. //返回:将转换好的字符串赋给out
  264. //注      :返回的时间字符串是当前时区的当地时间
  265. //*****************************************************************************
  266. void ConvertTimeStampToHHMMSS(U32 timeStamp, char* out)
  267. {
  268.     U32 days, hours, minutes, seconds;
  269. if(timeStamp == 0)
  270. {
  271. strcpy(out, "0:00:00");
  272. return;
  273. }
  274.     days = timeStamp / 86400;
  275.     timeStamp = timeStamp % 86400;
  276.     hours = timeStamp /3600;
  277.     timeStamp = timeStamp % 3600;
  278.     minutes = timeStamp / 60;
  279.     seconds = timeStamp % 60;
  280.     sprintf(out, "%d:%02d:%02d", hours, minutes, seconds);    
  281. }
  282. //*****************************************************************************
  283. //名称:ConvertTimeStampToDate
  284. //
  285. //功能:将32位时间转换成年月日输出
  286. //
  287. //输入:32位时间
  288. //
  289. //输出:年月日
  290. //
  291. //返回:0--周日, 1--周一; ..., 6
  292. //*****************************************************************************
  293. int ConvertTimeStampToDate(U32 timeStamp, U32 *year,  U32 *month, U32 *day)
  294. {
  295.    U32 y, m, d;
  296.    U32 fullMinutes, fullHours, 
  297.     fullDays, fullDaysSince1968, 
  298.     numOfLeapYears, daysSinceCurLeapYear, 
  299.     fullYears, daysSinceStartOfYear, daysToMonth;
  300.    unsigned short MJD;
  301.    int week_day;
  302.    if(timeStamp == 0)
  303.    {
  304.     return -1;
  305.    }
  306.    
  307. fullMinutes = timeStamp / 60;
  308. fullHours = fullMinutes / 60;
  309. fullDays = fullHours / 24;
  310. fullDaysSince1968 = fullDays + 365 + 366;
  311. numOfLeapYears = fullDaysSince1968 / ((4 * 365) + 1);
  312. daysSinceCurLeapYear = fullDaysSince1968 % ((4 * 365) + 1);
  313. if((daysSinceCurLeapYear >= (31 + 29))) numOfLeapYears++;
  314. fullYears = (fullDaysSince1968 - numOfLeapYears) / 365;
  315. daysSinceStartOfYear = fullDaysSince1968 - (fullYears * 365) - numOfLeapYears;
  316. if((daysSinceCurLeapYear <= 365) && (daysSinceCurLeapYear >= 60)) daysSinceStartOfYear++;
  317. y = 1900 + fullYears + 68;
  318. m = 13;
  319. daysToMonth = 366;
  320. while (daysSinceStartOfYear < daysToMonth)
  321. {
  322. m--;
  323. daysToMonth = monthToDaysInYear[m];
  324. if((m >= 2) && ((y % 4) == 0)) daysToMonth++;
  325. }
  326. m++;
  327. d = daysSinceStartOfYear - daysToMonth + 1;
  328. YMDtoMJD(y,m,d, &MJD);
  329. week_day=(int)GetWeekDay(MJD);
  330. *year = y;
  331. *month = m;
  332. *day = d;
  333. return week_day;
  334. }
  335. //*****************************************************************************
  336. //名称:ConvertTimeStampToTime
  337. //
  338. //功能:将32位时间转换成时分秒输出
  339. //
  340. //输入:32位时间
  341. //
  342. //输出:时分秒
  343. //
  344. //返回:无
  345. //*****************************************************************************
  346. void ConvertTimeStampToTime(U32 timeStamp, U32 *hour, U32 *min, U32 *sec)
  347. {
  348.     U32 d, h, m, s;
  349.     d = timeStamp / 86400;
  350.     timeStamp = timeStamp % 86400;
  351.     h = timeStamp /3600;
  352.     timeStamp = timeStamp % 3600;
  353.     m = timeStamp / 60;
  354.     s = timeStamp % 60;
  355.     *hour = h;
  356.     *min = m;
  357.     *sec = s;
  358. }
  359. U32 GetU32CurrentTimeDate(void)
  360. {
  361. U32 retVal = 0;
  362. TIM_Protect();
  363. if(currentUTCtime) 
  364. retVal = currentUTCtime + timeDateUserOffset;
  365. TIM_UnProtect();
  366. return retVal;
  367. }
  368. void SetU32CurrentTimeDate(U32 newTimeDate)
  369. {
  370. TIM_Protect();
  371. timeDateUserOffset = newTimeDate - (int) currentUTCtime;
  372. TIM_UnProtect();
  373. //SRUIF_UpdateBoxInfo();
  374. }
  375. void SetU32UTC(U32 newUTC)
  376. {
  377. TIM_Protect();
  378. currentUTCtime = newUTC;
  379. TIM_UnProtect();
  380. }
  381. U32 GetU32UTC(void* dummy)
  382. {
  383. U32 retVal;
  384. TIM_Protect();
  385. retVal = currentUTCtime;
  386. TIM_UnProtect();
  387. return retVal;
  388. }
  389. int GetTimeDateUserOffset(void)
  390. {
  391. U32 retVal;
  392. TIM_Protect();
  393. retVal = timeDateUserOffset;
  394. TIM_UnProtect();
  395. return retVal;
  396.  }
  397. void SetTimeDateUserOffset(int newOffset)
  398. {
  399. TIM_Protect();
  400. timeDateUserOffset = newOffset;
  401. TIM_UnProtect();
  402. }
  403. void SetCurrentTime(U8 hours, U8 minutes, U8 seconds)
  404. {
  405. U32 timeStamp = GetU32CurrentTimeDate();
  406. timeStamp = timeStamp/(60 * 60 * 24); /* reference to 1200am of the same day */
  407. timeStamp = timeStamp * (60 * 60 * 24);
  408. timeStamp += (hours % 24) * 3600;
  409. timeStamp += (minutes % 60) * 60;
  410. timeStamp += (seconds % 60);
  411. SetU32CurrentTimeDate(timeStamp);
  412. }
  413. void SetCurrentDate(U16 year, U8 month, U8 date)
  414. {
  415. U32 timeStamp = GetU32CurrentTimeDate();
  416. //U32 timeStamp = 0;
  417. //U32  temp;//lsp 07/3/14
  418. U32 fullDays, curHours, fullHours, curMins, fullMins, curSecs, numDays;
  419. //if(year < 2004) return;//masked by lsp 07/3/14
  420. if(year <4) return;
  421. /* Extract the current time of the day */
  422. fullMins = timeStamp / 60;
  423. curSecs = timeStamp - (60 * fullMins);
  424. fullHours = fullMins / 60;
  425. curMins = fullMins - (60 * fullHours);
  426. fullDays = fullHours / 24;
  427. curHours = fullHours - (24 * fullDays);
  428. #if 0     /* BLOCK COMMENTED OUT by Louie on 1/3/2005 */
  429. /* Move the reference to Jan 01 2004 and add the current time */
  430. timeStamp += U32_UTC_JANUARY_01_2004_1200_00AM;
  431. /* add the number of years since 2004 in seconds, taking into account leap years */
  432. while(temp > 2004)
  433. timeStamp += (IS_LEAP_YEAR(--temp)?366:365) * (60 * 60 * 24);
  434. temp = month - 1;
  435. while(temp > 0)
  436. timeStamp += daysPerMon[--temp] * (60 * 60 * 24);
  437. timeStamp += ((date > daysPerMon[month - 1])?daysPerMon[month - 1]:date) * (60 * 60 * 24);
  438. if(IS_LEAP_YEAR(year) && (month > 2)) timeStamp += (60 * 60 * 24);
  439. if(IS_LEAP_YEAR(year) && (month ==2)&&date >=29) 
  440. {
  441.        timeStamp += (60 * 60 * 24);
  442.        }
  443. #else
  444. numDays = 365 * (year - 70) + monthToDaysInYear[month -1] + (date - 1);
  445. numDays += ((year - 69) / 4);
  446. if(((month - 1) > 1) && ((year % 4) == 0)) numDays++;
  447. timeStamp = curSecs + 60 * curMins + 3600 * (curHours + 24 * numDays); 
  448. #endif /* BLOCK COMMENT */
  449. SetU32CurrentTimeDate(timeStamp);
  450. }
  451. U32 MJDtoUNIX(const U8* pMjdData)
  452. {
  453.     #define MJD_1970     40587
  454.     U32 temp;
  455.     temp =  (*(pMjdData) * 0x100) + (U8) *(pMjdData + 1);
  456.     if(temp > MJD_1970)
  457.     {
  458.     temp = temp - MJD_1970; /* number of days since January 1, 1970 */
  459.     temp = temp * 60 * 60 * 24;   /* number of days (in seconds unit) */   
  460.     temp += PackedBcd24ToSeconds((U8*) (pMjdData + 2));
  461.     return temp;
  462.     }
  463. return 0;
  464. }
  465. U32 PackedBcd24ToSeconds(const U8* pBcd24BitTime)
  466. {
  467.     U32 temp = 0;
  468.     U8 byteTemp, byteTemp2;
  469.     byteTemp = (U8) *(pBcd24BitTime);
  470.     byteTemp2 = ((byteTemp >> 4) * 10) + (byteTemp & 0x0F);
  471.     temp += (byteTemp2) * 60 * 60;
  472.     byteTemp = (U8) *(pBcd24BitTime + 1);
  473.     byteTemp2 = ((byteTemp >> 4) * 10) + (byteTemp & 0x0F);
  474.     temp += (byteTemp2) * 60;
  475.     byteTemp = (U8) *(pBcd24BitTime + 2);
  476.     byteTemp2 = ((byteTemp >> 4) * 10) + (byteTemp & 0x0F);
  477.     temp += (byteTemp2);
  478.     return temp;
  479. }
  480. /* end C++ support */
  481. #ifdef __cplusplus
  482. }
  483. #endif
  484. #endif  /* #ifndef __SR_TIME_C__  */
  485. /* ----------------------------- End of file (sr_time.c) ------------------------- */