/**************************************************************************** * NAME: DMW_SysTime.c *---------------------------------------------------------------------------- * Copyright (c) 2003 DST Inc. *---------------------------------------------------------------------------- * CREATED_BY: DIGITAL STREAM Technology Inc. * CREATION_DATE: 2003/09/15 * AUTHOR: Kyu-hong Park * REVISION: Ver 1.001 * DATE: *---------------------------------------------------------------------------- * PURPOSE: * - ½Ã½ºÅÛ ½Ã°£°ü·Ã ÇÔ¼ö ¹× ½Ã°£°æ°ú ÃøÁ¤ ÇÔ¼ö ±¸Çö *****************************************************************************/ #include "DMW_Platform.h" #include "DMW_SysTime.h" //#include DHL_MODULE("$stm", 1); /*------------------------------------------------------------------*/ #define DONT_USE_C_STD_LIB 1 /* multi °³¹ß ȯ°æ¿¡¼­´Â time() °ú °°Àº stdlib ÇÔ¼ö¸¦ Àý´ë »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. */ /*_____ D E F I N I T I O N ________________________________________________*/ #define DEF_TIME_OFFSET 630687600 /* 2000³â 1¿ù1ÀÏ Çѱ¹¿¡¼­ÀÇ UTC.. */ /* ¸ðµç API¿¡ »ç¿ëµÇ´Â SysTimeContext¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ»¶§ °øÅëÀ¸·Î »ç¿ëµÇ´Â µðÆúÆ® contextÀÌ´Ù. */ SysTimeContext g_DefaultSysTimeContext = { 0, /* BOOL bTimebaseAdjusted */ DEF_TIME_OFFSET, /* int nTimeSystemBase */ 9, /* int nTimeZone; */ 0, /* BOOL bDaylightSavingOn; */ /* 1: use daylight saving , 0: not use daylight saving */ 13, /* int GPS_UTC_offset; */ }; /*----------------------------- for debugging and testing.. */ const char *DayOfWeekString(int n) { /* n: [0 ~ 6] */ char *name[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", }; static char err[12]; if (n < 0 || n > 6) { sprintf(err, "?(%d)", n); return err; } return name[n]; } const char *STimeString(STime_t *s, char *buf) { static char _buf[64]; if (buf == NULL) buf = _buf; sprintf(buf, "%d/%d/%d %s %d:%02d:%02d", s->year, s->month, s->day, DayOfWeakString(s->wday), s->hour, s->min, s->sec); return buf; } /* http://www.leapsecond.com/java/gpsclock.htm Local time is the date/time reported by your PC (as seen by your web browser). If your PC clock is accurate to a second then the other time scales displayed above will also be accurate to within one second. UTC, Coordinated Universal Time, popularly known as GMT (Greenwich Mean Time), or Zulu time. Local time differs from UTC by the number of hours of your timezone. GPS, Global Positioning System time, is the atomic time scale implemented by the atomic clocks in the GPS ground control stations and the GPS satellites themselves. GPS time was zero at 0h 6-Jan-1980 and since it is not perturbed by leap seconds GPS is now ahead of UTC by 13 seconds. */ #if COMMENT ____UTC_Core_____(){} #endif /*====================================================================== // ANSI Ç¥ÁØ ÇÔ¼öÀÎ time()Àº ¹®¼­»ó UTC timeÀ» ¸®ÅÏÇÏ´Â °ÍÀ¸·Î µÇ¾î ÀÖ´Ù // ---- // The time function returns the number of seconds elapsed since midnight (00:00:00), // January 1, 1970, coordinated universal time, according to the system clock // ---- // ±×·¯³ª Ç÷§Æû »ó¿¡ RTC°¡ ¾ø±â ¶§¹®¿¡ Àý´ëÀûÀÎ °ªÀº Á¤È®ÇÏÁö ¾Ê´Ù. // ±×·¡¼­ time()¿¡¼­ ¸®ÅϵǴ °ª°úÀÇ Â÷À̸¦ ±â¾ïÇÏ¿© °ªÀ» º¸Á¤ÇÔÀ¸·Î½á // Set/Get time ÇÔ¼ö¸¦ ±¸ÇöÇÑ´Ù. // // Á¤ÀÇ: // UTC time = time() + timeSystemBase // // timeSystemBase = UTC_time_to_set - time() // // Âü°í // ½Ã½ºÅÛ¿¡ RTC°¡ ¾øÀ¸¹Ç·Î ºÎÆÃÈÄ ÃÖÃÊ 1ȸ SetUTCTime()À» ºÒ·¯¼­ ½Ã°£º¸Á¤À» // ÇØ Áà¾ß¸¸ ÇÑ´Ù. // */ /**************************************************************************** Function Name: DMW_SetUTCTime Description: UTC Time À¸·Î ½Ã½ºÅÛ ½Ã°£ ¼³Á¤ Note: ½Ã½ºÅÛ ½Ã°£À» º¯°æ°¡´ÉÇÒ ½Ã¿¡´Â ÀÌ ÇÔ¼ö¸¦ ¼öÁ¤ ÇÊ¿ä! *****************************************************************************/ void DMW_SetUTCTime(SysTimeContext *stc, UINT32 utc) { if (stc == NULL) stc = &g_DefaultSysTimeContext; stc->tickTimeAdjusted = DHL_OS_GetMsCount(); stc->nTimeSystemBase = utc; stc->bTimebaseAdjusted = TRUE; } /**************************************************************************** Function Name: DMW_GetUTCTime Description: UTC Time ¾ò¾î¿Å DMW_SetUTCTime ÀÌ Çѹøµµ È£ÃâµÇÁö ¾Ê¾Ò´Ù¸é À߸øµÈ °ªÀÌ ¸®Å쵃 °ÍÀÌ´Ù. Note: *****************************************************************************/ STATUS DMW_GetUTCTime(SysTimeContext *stc, UINT32 *utc) { long int now; if (stc == NULL) stc = &g_DefaultSysTimeContext; if (stc->bTimebaseAdjusted == FALSE) { if (utc) *utc = 0; dprint(0, "!! GetUTCTime: time not initialized\n"); /* cafrii 050315 add // Çѹøµµ ÃʱâÈ­ (set time)¸¦ ÇÏÁö ¾ÊÀº »óÅ¿¡¼­ get timeÀÌ ºÒ¸° °æ¿ìÀÌ´Ù. // ¿øÄ¢ÀûÀ¸·Î´Â ¿¡·¯ °ªÀ» ¸®ÅÏÇϰí, caller´Â ÀÌ ¸®ÅϰªÀ» Ç×»ó Ã¼Å©ÇØ¾ß ÇÑ´Ù. // ±×·±µ¥ application ¿¡¼­ ±×³É °£´ÜÇÏ°Ô set time Çϱâ Àü±îÁö´Â // time contextÀÇ µðÆúÆ® °ªÀ» »ç¿ëÇϱ⸦ ¿øÇÏ¸ç ¸®Åϰª ¿¡·¯ üũµµ Àß ÇÏÁö ¾Ê´Â °æ¿ì°¡ ¸¹´Ù. // context¿¡ µðÆúÆ® utc timeÀ» ¼³Á¤ÇØ ³õ¾Ò±â ¶§¹®¿¡ ÀÌ °ªÀ» »ç¿ëÇÒ ¼öµµ ÀÖÀ» °Í °°´Ù. // // ¸®ÅϰªÀº ¿¡·¯·Î ¸®ÅÏÇÏÁö¸¸, utc °ªÀº ´ë·« ºñ½ÁÇÏ°Ô ¼³Á¤Çؼ­ µ¹·ÁÁÖµµ·Ï ÇÑ´Ù. // time(0) Àº ºÎÆÃ ÀÌÈÄ °æ°úµÈ ½Ã°£ (ÃÊ) À̹ǷΠÀÌ °ªÀ» ´õÇØ¼­ ¸®ÅÏÇÏÀÚ. */ if (utc) *utc = (DHL_OS_GetMsCount()-0)/1000 + stc->nTimeSystemBase; return statusError; /* time not initialized.. */ } /* ¸¶Áö¸·À¸·Î SetUTC ÇÑ ÀÌÈÄÀÇ °æ°ú ½Ã°£À» ÀÌ¿ë. */ now = stc->nTimeSystemBase + (DHL_OS_GetMsCount()-stc->tickTimeAdjusted)/1000; if (utc) *utc = now; return statusOK; } #if COMMENT ____UTC_Conversion_____(){} #endif /**************************************************************************** Function Name: DMW_ConvertLocalTime2UTC Description: Local TimeÀ» UTC·Î º¯°æÇÔ. º¯È¯¿¡´Â ¿©·¯°¡Áö parameter°¡ ÇÊ¿äÇÏ´Ù. (time_zone, µî) ex: 2004³â 6¿ù 15ÀÏ --> 0x........ Note: STime_t::wday °ªÀº »ç¿ëµÇÁö ¾Ê´Â´Ù. °è»ê ¹æ½Ä: ¸ÕÀú 1980³â 1¿ù 1ÀÏ 0½Ã ÀÌÈÄ·Î ¸îÃʰ¡ µÇ´ÂÁö °è»êÀ» Çϰí, daylight saving °í·ÁÇÏ¿© 3600Ãʸ¦ º¸Á¤Çϰí, timezone °í·ÁÇÏ¿© n*3600 Ãʸ¦ º¸Á¤, ±×¸®°í ³ª¼­ 1980³â 1¿ù 6ÀÏ cafrii 081008, consider daylight savings. *****************************************************************************/ UINT32 DMW_ConvertLocalTime2UTC(SysTimeContext *stc, STime_t *s) { UINT32 utc=0; int leap; UINT32 i, tmp; char *msg1; BOOL bEffectiveDS = FALSE; UINT32 daytab[2][13] = { {365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; if (stc == NULL) stc = &g_DefaultSysTimeContext; /* exception handling by hschang, 2004/1/18 */ if(s->year<1980 || s->month<1 || s->day<1) { dprint(0, "!! ConvertLocalTime2UTC: invalid time, set to 0\n"); utc = 0; /* 1980/1/6 00:00:00 */ return utc; } if (stc->bDaylightSavingOn) { bEffectiveDS = stc->DS_status; if (stc->DS_day_of_month && stc->DS_day_of_month == s->day && /* we only consider matched date. */ stc->DS_hour <= s->hour) { bEffectiveDS = bEffectiveDS ? 0 : 1; } } tmp = s->year - 1980; /* ´©Àû °è»êÇØ¾ß ÇÒ ¿¬µµ ¼ö */ for(i=s->year-1; i>=1980; i--) /* ºñ±³°è»ê½Ã ¾à°£ÀÇ È¿À² Áõ´ë¸¦ À§Çؼ­ °Å²Ù·Î ¼À.. */ { leap = ((i%4==0)&&(i%100!=0)) || (i%400==0); utc += daytab[leap][0]*86400; } leap = (((s->year)%4==0)&&((s->year)%100!=0)) || ((s->year)%400==0); tmp = s->month - 1; for(i=1; i<(tmp+1); i++) utc += daytab[leap][i]*86400; /* ¿ì¸®°¡ ¿øÇÏ´Â ´Þ·Â³¯Â¥ ÀÌ»óÀÇ °ªÀÌ ¿Ã ¼öµµ ÀÖ´Ù. ÀÌÀ¯´Â host¿¡¼­ ´Þ·ÂÀ» °¡Áö°í ÀÖÁö ¾ÊÀ¸¹Ç·Î // ³¯Â¥¿¡ ´ëÇÑ exception handling (28, 29,30,31º¸´Ù Å«°Í)Àº ÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù. // ÇÏÁö¸¸, 0¿¡ ´ëÇÑ exception handlingÀº ¾Õ¿¡¼­ ¹Ì¸® ÇÏ¿©¾ß ÇÒ °Í °°´Ù. -hschang- */ tmp = s->day - 1; utc += 86400*tmp; utc += s->hour*3600; utc += s->min*60; utc += s->sec; /* daylightsaving°ú, timezone º¸Á¤Çϸ鼭 utc °¡ À½ÀÇ °ªÀ¸·Î ³»·Á°¡Áö ¾Êµµ·Ï °¢º°È÷ ÁÖÀÇÇ϶ó!! */ msg1 = "!! before 1980/1/6 !! reset to 0\n"; if (bEffectiveDS) { if (utc < 3600) { dprint(0, msg1); return 0; } utc -= 3600; } /* cafrii 041005 bugfix // timezoneÀÇ °ªÀÌ À½ÀÇ °ªÀÏ ¼ö ÀÖÀ¸¹Ç·Î utc¿Í Á÷Á¢ ºñ±³ÇÏ´Â °ÍÀº ¹®Á¦°¡ µÈ´Ù. // ¾ÆÁ÷ 1¿ù1ÀϺÎÅÍ 1¿ù6ÀϱîÁöÀÇ 5ÀÏ °£ÀÇ ¿©À¯ºÐÀÌ ÀÖÀ¸¹Ç·Î ÃÖ´ë +12½Ã°£±îÁö´Â ¹®Á¦ ¾øÀ¸¹Ç·Î // ¹Ù·Î '»¬¼À'À» ÇØµµ µÈ´Ù. */ utc -= stc->nTimeZone*3600; if (utc < 432000) { /* 1980/1/6 ÀÌÀüÀÇ ½Ã°£ÀÌ´Ù.. ¿¡·¯.. */ dprint(0, msg1); return 0; } else { utc -= 432000; } return utc; } /**************************************************************************** Function Name: DMW_ConvertUTC2LocalTime Description: UTC¸¦ Local TimeÀ¸·Î º¯°æÇÔ. Note: *****************************************************************************/ void DMW_ConvertUTC2LocalTime(SysTimeContext *stc, UINT32 utc_in, STime_t *t) { STime_t s; UINT32 utc = utc_in; UINT32 daytab[2][13] = { {365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; int acc_day; int i, leap; if (stc == NULL) stc = &g_DefaultSysTimeContext; /* timezone ¼³Á¤¿¡ µû¸¥ º¸Á¤À» ÇÑ´Ù. */ utc += (stc->nTimeZone * 3600); /* daylight saving¿¡ µû¸¥ º¸Á¤À» ÇÑ´Ù. */ /* note: À̰÷¿¡´Â trickÀÌ ÀÖ´Ù. DS_status°¡ 1À̶ó°í ÇÏ´õ¶óµµ month, day°¡ ÀÏÄ¡ÇÏ¸é µ¿ÀÛ¿©ºÎ°¡ ¹Ý´ë·Î µÇ¾î¾ß ÇÑ´Ù. ÇÏÁö¸¸ ½Ã°£ °è»êÀÌ ¿Ï·áµÇ±â Àü±îÁö´Â month, day ÀÏÄ¡ ¿©ºÎ¸¦ ¾Ë ¼ö ¾ø´Ù. Áï, ½Ã°£ °è»êÀ» ÇÏ·Á¸é daylight saving µ¿ÀÛ ¿©ºÎ°¡ °áÁ¤µÇ¾î¾ß Çϰí, µ¿ÀÛ ¿©ºÎ¸¦ °áÁ¤ÇÏ·Á¸é month, dayÀ» ¾Ë¾Æ¾ß ÇÏ´Â chicken & egg ¹®Á¦ÀÌ´Ù. ÇØ¹ýÀº, ¸ÕÀú month, day ÀÏÄ¡ ¿©ºÎ´Â ½Å°æ¾²Áö ¸»°í DS_status ¸¸À¸·Î °è»êÀ» Çϰí, °è»êÈÄ¿¡ month, day°¡ ÀÏÄ¡ÇÏ°Ô µÇ¸é ´Ù½Ã DS_status¸¦ ¹Ù²Ù¾î¼­ Çѹø ´õ °è»êÀ» ÇÑ´Ù. ¾î¶°ÇÑ °æ¿ì¿¡¶óµµ bDaylightSavingOn °¡ falseÀ̸é daylight savingÀº °áÄÚ µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. */ if (stc->bDaylightSavingOn && stc->DS_status) { utc += 3600; stc->bDaylightSavingActive = TRUE; } else stc->bDaylightSavingActive = FALSE; #if 1 /* 1980/1/1 ºÎÅÍ UTCÀÇ ±âÁØÀÎ 1980/1/6 ±îÁöÀÇ ½Ã°£À» ´õÇÑ ´ÙÀ½ // 1980³â ºÎÅÍ °è»êÇØ ³ª°¡¸é ÆíÇÏ´Ù. ±×·¯¸é UINT32 wrap-around·Î ÀÎÇÑ ¹ö±×¸¦ ÇÇÇÒ¼ö ÀÖ´Ù. */ utc += 432000; /* 5Àϰ£ÀÇ ÃÊ */ acc_day = -5; s.year = 1980; s.month = 1; s.day = 1; s.wday = 2; /* Tuesday: 1980³â 1¿ù 1ÀÏÀº È­¿äÀÏ */ s.hour = 0; s.min = 0; s.sec = 0; leap = 1; /* 1980³âÀº 4ÀÇ ¹è¼öÀ̹ǷΠÀ±³â.. */ #else /* ÀÌ ¹æ½ÄÀº 1981³â 1¿ù 1ÀÏ 0½Ã¸¦ ±âÁØÀ¸·Î °è»êÇϹǷΠ1980³â 1¿ù 6ÀÏ ºÎÅÍ // 1980³â 12¿ù ¸» ±îÁöÀÇ ±¸°£ µ¿¾È¿¡´Â UTC ½Ã°£ º¯È¯À» ¸øÇÏ´Â °áÁ¤ÀûÀÎ ´ÜÁ¡ÀÌ ÀÖ´Ù. // »ç¿ëÇÏÁö ¸»µµ·Ï ÇÏÀÚ. */ if (utc < 31190400) dprint(0, "!! utc before 1981/1/1 cannot be used!!\n"); acc_day=361; s.year = 1981; /* 1981/1/1 0:0:0 ¿¡¼­ºÎÅÍ °è»êÇØ ³ª°£´Ù */ s.month = 1; s.day = 1; s.wday = 4; /* Thurday */ s.hour = 0; s.min = 0; s.sec = 0; utc -= 31190400; /* 1980.1.6~1980.12.31±îÁöÀÇ ÃÊ. */ leap = 0; #endif /*while ((stime/(daytab[leap][0]*86400))>0) */ /* year¸¦ °è»ê */ while (utc >= (daytab[leap][0]*86400)) { utc -= daytab[leap][0]*86400; acc_day += daytab[leap][0]; s.year ++; leap = ((s.year%4==0)&&(s.year%100!=0))||(s.year%400==0); } /* month¸¦ °è»ê */ i=1; while (utc >= (daytab[leap][i]*86400)) { utc -= daytab[leap][i]*86400; acc_day += daytab[leap][i]; s.month ++; i++; } s.day += (utc/86400); acc_day += (utc/86400); utc = utc%86400; /* s.wday = acc_day%7; */ s.wday = (acc_day + 7) % 7; /* // cafrii 050315 fix // acc_dayÀÇ ÃʱⰪÀÌ -5 ºÎÅÍ ½ÃÀÛÇÏ¿© accumulated µÇ¾úÀ¸¹Ç·Î // ¾ÆÁ÷ 0 ÀÌÇÏÀÇ °ªÀ¸·Î ³²¾Æ ÀÖÀ» ¼öµµ ÀÖ´Ù. (¹°·Ð À߸øµÈ utc °ªÀÎ °æ¿ìÀÓ) // ±×·¡µµ wday¸¦ Á¤È®ÇÏ°Ô ¸®ÅÏÇÒ ¼ö ÀÖµµ·Ï Á¶Á¤À» ÇØÁÖÀÚ. */ s.hour = (utc/3600); /* cafrii 081008 add. // because day and hour is calculated, we can check daylight saving again. */ if (stc->bDaylightSavingOn && stc->DS_day_of_month && stc->DS_day_of_month == s.day && stc->DS_hour <= s.hour) { /* ÀÌ ÄÚµå´Â ÀÏÁ¾ÀÇ trickÀÌ´Ù. local timeÀ» °è»ê ÇØ º» °á°ú, DS in/out Á¶°Ç¿¡ ºÎÇյǾúÀ¸¹Ç·Î ½ÇÁ¦·Î´Â daylight saving µ¿ÀÛ ¿©ºÎ°¡ ¹Ý´ë°¡ µÇ¾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, DS_status°¡ 0(µ¿ÀÛ¾ÈÇÔ)À̾úÁö¸¸ day¿Í month°¡ ÀÏÄ¡Çϸé DS°¡ µ¿ÀÛÇØ¾ß Çϰí, DS_status°¡ 1(µ¿ÀÛ)À̾úÁö¸¸ day¿Í month°¡ ÀÏÄ¡Çϸé DS°¡ µ¿ÀÛÇÏ¸é ¾ÈµÈ´Ù. ´Ù½Ã °è»êÇØ¾ß ÇÏ´Â ºÒÆíÇÔÀÌ Àִµ¥, Àç±ÍÈ£ÃâÀ» »ç¿ëÇÏ¿© ½±°Ô ÇØ°á °¡´ÉÇÏ´Ù. ´Ü ¿ø·¡ »ç¿ëÁßÀÎ stc´Â °Çµå¸®¸é ¾ÈµÇ°í, cloneÀ» Çϳª ¸¸µé¾î¾ß ÇÑ´Ù. */ SysTimeContext stc_clone = *stc; /* consider daylight saving in/out condition. // re-calculate with modified parameter. */ stc_clone.DS_status = stc->DS_status ? 0 : 1; stc_clone.DS_day_of_month = 0; /* so as not to re-consider again. */ /* TIP: DS_day_of_month 󸮸¦ ¾ÈÇØÁÖ¸é ¹«ÇÑ ·çÇÁ¿¡ µé¾î°¥ ¼ö ÀÖ´Ù. ÁÖÀÇ.. */ DMW_ConvertUTC2LocalTime(&stc_clone, utc_in, t); /* ½ÇÁ¦·Î daylight savingÀÇ µ¿ÀÛ ¿©ºÎ flag¸¦ °»½Å. */ stc->bDaylightSavingActive = stc_clone.DS_status; return; } utc = utc%3600; s.min = (utc/60); s.sec = utc%60; if (t) *t = s; } /**************************************************************************** Function Name: DMW_SetLocalTime Description: Local Time À¸·Î ½Ã½ºÅÛ ½Ã°£ ¼³Á¤ Note: ½Ã½ºÅÛ ½Ã°£À» º¯°æ°¡´ÉÇÒ ½Ã¿¡´Â ÀÌ ÇÔ¼ö¸¦ ¼öÁ¤ ÇÊ¿ä! *****************************************************************************/ void DMW_SetLocalTime(SysTimeContext *stc, STime_t *t) { UINT32 utc; STime_t t2; utc = DMW_ConvertLocalTime2UTC(stc, t); DMW_SetUTCTime(stc, utc); /* verifying.. */ DMW_ConvertUTC2LocalTime(stc, utc, &t2); if (t->wday != t2.wday) { /* dprint(2, "SetLocalTime: original wday %d wrong. correct it to %d\n", t->wday, t2.wday); */ t->wday = t2.wday; /* wday is newly calculated.. so we copy it! */ } if (memcmp(t, &t2, sizeof(STime_t))) { char c1[50], c2[50]; dprint(0, "!! conversion err!! %s, %s\n", STimeString(t, c1), STimeString(&t2, c2)); } } void DMW_SetLocalTime2(SysTimeContext *stc, int year, int month, int day, int hour, int min, int sec) { STime_t system_time; system_time.year = year; system_time.month = month; system_time.day = day; system_time.hour = hour; system_time.min = min; system_time.sec = sec; DMW_SetLocalTime(stc, &system_time); } /**************************************************************************** Function Name: DMW_GetLocalTime Description: Local Time ½Ã°¢À» °¡Á®¿È. Note: *****************************************************************************/ int DMW_GetLocalTime(SysTimeContext *stc, STime_t *sys_time) { UINT32 utc; int err; if (stc == NULL) stc = &g_DefaultSysTimeContext; err = DMW_GetUTCTime(stc, &utc); DMW_ConvertUTC2LocalTime(stc, utc, sys_time); return err; } /**************************************************************************** Function Name: DMW_ConvertUTC2GPS Description: UTC¸¦ GPS·Î º¯°æÇÔ. Note: *****************************************************************************/ UINT32 DMW_ConvertUTC2GPS(SysTimeContext *stc, UINT32 UTC) { if (stc == NULL) stc = &g_DefaultSysTimeContext; return (UTC + (UINT32)stc->GPS_UTC_offset); } /**************************************************************************** Function Name: DMW_ConvertGPS2UTC Description: GPS¸¦ UTC·Î º¯°æÇÔ. Note: *****************************************************************************/ UINT32 DMW_ConvertGPS2UTC(SysTimeContext *stc, UINT32 GPS) { if (stc == NULL) stc = &g_DefaultSysTimeContext; if (GPS < (UINT32)(stc->GPS_UTC_offset)) { /* cafriii 040617 add */ /*ARZHNA, 090618, (UINT32)Ãß°¡ */ return 0; /* À½ÀÇ utc °ªÀº Áö¿øÇÏÁö ¾ÊÀ½.. */ } return (GPS - (UINT32)stc->GPS_UTC_offset); } #if COMMENT ____Param_Set____(){} #endif /**************************************************************************** Function Name: void DMW_SetLocalTimeZone(int time_zone) Description: Set Time Zone with Offset Hours Note: time_zone : -12 ~ +12 *****************************************************************************/ void DMW_SetLocalTimeZone(SysTimeContext *stc, int time_zone) { if (stc == NULL) stc = &g_DefaultSysTimeContext; if (time_zone<=12 && time_zone>=-12) stc->nTimeZone = time_zone; else dprint(0, "!! Time Zone %d out of range\n", time_zone); } /**************************************************************************** Function Name: int DMW_GetLocalTimeZone(void); Description: Get Time Zone with Offset Hours Note: time_zone : -12 ~ +12 *****************************************************************************/ int DMW_GetLocalTimeZone(SysTimeContext *stc) { if (stc == NULL) stc = &g_DefaultSysTimeContext; return stc->nTimeZone; } /**************************************************************************** Function Name: void DMW_SetDayLightSaving(char dayLightSavingOn) Description: Day Light Saving Áؼö ¿©ºÎ ¼³Á¤ ÁÖÀÇ: Áö±Ý ÇöÀç daylight savingÀ» °­Á¦·Î µ¿ÀÛ ½Ã۶ó´Â Àǹ̰¡ ¾Æ´Ï´Ù. "Áؼö"·Î ¼³Á¤ÇØ ³õÀ¸¸é, daylight savingÀÇ ½ÇÁ¦ µ¿ÀÛÀº stc³»ÀÇ DS_status¹× month, day µîÀÇ °ªµé·ÎºÎÅÍ ÀÚµ¿À¸·Î °áÁ¤µÈ´Ù. Note: *****************************************************************************/ void DMW_SetDayLightSaving(SysTimeContext *stc, BOOL dayLightSavingOn) { if (stc == NULL) stc = &g_DefaultSysTimeContext; stc->bDaylightSavingOn = dayLightSavingOn; /* daylight saving parameter´Â º¯°æÇÏÁö ¾Ê´Â´Ù. */ } /**************************************************************************** Function Name: BOOLEAN DMW_GetDayLightSaving(void) Description: Day Light Saving Áؼö ¿©ºÎ ÀÐÀ½. ÁÖÀÇ: ½ÇÁ¦·Î daylight saving ÀÌ µ¿ÀÛÇϰí ÀÖ´ÂÁöÀÇ ¿©ºÎ°¡ ¾Æ´Ï´Ù. Note: *****************************************************************************/ BOOL DMW_GetDayLightSaving(SysTimeContext *stc) { if (stc == NULL) stc = &g_DefaultSysTimeContext; return stc->bDaylightSavingOn; } /**************************************************************************** Function Name: DMW_SetDayLightSavingParam() / DMW_GetDayLightSavingParam() Description: Day Light Saving parameter ¼³Á¤ ¹× Á¶È¸. DS_day_of_month ¹× DS_hour parameter¸¦ °°ÀÌ »ç¿ë. Note: *****************************************************************************/ void DMW_SetDayLightSavingParam(SysTimeContext *stc, int status, int day, int hour) { if (stc == NULL) stc = &g_DefaultSysTimeContext; stc->DS_status = status; stc->DS_day_of_month = day; stc->DS_hour = hour; } void DMW_GetDayLightSavingParam(SysTimeContext *stc, int *pStatus, int *pDay, int *pHour) { if (stc == NULL) stc = &g_DefaultSysTimeContext; if (pStatus) *pStatus = stc->DS_status; if (pDay) *pDay = stc->DS_day_of_month; if (pHour) *pHour = stc->DS_hour; } /**************************************************************************** Function Name: DMW_CheckDayLightSavingActive() Description: DayLight Saving ÀÌ ÇöÀç µ¿ÀÛ ÁßÀÎÁöÀÇ »óŸ¦ ¸®ÅÏ. ½ÇÁ¦·Î ÀÌ ÇÔ¼ö°¡ ÇÊ¿äÇÑ °æ¿ì´Â ¸¹Áö ¾Ê´Ù. »ç¿ëÀÚ¿¡°Ô´Â ±×³É ÇöÀç ½Ã°£¸¸ º¸¿©ÁÖ´Â °ÍÀ¸·Î ÃæºÐÇÏ´Ù. ÁÖÀÇ: DMW_ConvertUTC2LocalTime() ½ÇÇà½Ã¿¡ ÀÌ Á¤º¸°¡ Á¤È®ÇÏ°Ô °áÁ¤µÈ´Ù. µû¶ó¼­ Á¤È®ÇÑ Á¤º¸¸¦ ¾òÀ¸·Á¸é ¸ÕÀú DMW_ConvertUTC2LocalTime()¸¦ È£ÃâÇϰí, ¹Ù·Î À̾ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù. Note: *****************************************************************************/ BOOL DMW_CheckDayLightSavingActive(SysTimeContext *stc) { if (stc == NULL) stc = &g_DefaultSysTimeContext; return stc->bDaylightSavingActive; } /**************************************************************************** Function Name: UINT8 DMW_GetGPS_UTC_offset(void) Description: GPS_UTC_offset °ªÀ» ¸®ÅÏ. Note: *****************************************************************************/ int DMW_GetGPS_UTC_offset(SysTimeContext *stc) { if (stc == NULL) stc = &g_DefaultSysTimeContext; return stc->GPS_UTC_offset; } /**************************************************************************** Function Name: void DMW_SetGPS_UTC_offset(UINT8 offset) Description: GPS_UTC_offset °ªÀ» ¼³Á¤ÇÔ. Note: *****************************************************************************/ void DMW_SetGPS_UTC_offset(SysTimeContext *stc, int offset) { if (stc == NULL) stc = &g_DefaultSysTimeContext; stc->GPS_UTC_offset = offset; } /* cafrii 050725 add */ void DMW_InvalidateSysTime(SysTimeContext *stc) { if (stc) stc->bTimebaseAdjusted = FALSE; /* ÀÌÈÄ GetUTCTime °ú °°Àº ÇÔ¼ö¸¦ ºÎ¸£¸é ¿¡·¯¸¦ ¸®ÅÏÇÒ °ÍÀÓ.. */ } #if COMMENT ____Util____(){} #endif /**************************************************************************** Function Name: STime_t DMW_ChangedTimeInfo(STime_t norm_time, int changed_sec ) Description: º¯È­µÈ ³¯Â¥/¿äÀÏ/½Ã°£ Á¤º¸¸¦ °¡Á®¿Å Note: *****************************************************************************/ void DMW_ChangedTimeInfo(STime_t *norm_time, int offset, STime_t *ret_time) { int utc; utc = DMW_ConvertLocalTime2UTC(NULL, norm_time); DMW_ConvertUTC2LocalTime(NULL, utc + offset, ret_time); } /**************************************************************************** Function Name: int DMW_GetTimeGap(STime_t start_time, STime_t end_time ) Description: µÎ ½Ã°£Á¤º¸ÀÇ Â÷¿¡ ´ëÇØ Ãʽð£À» ¹ÝȯÇÔ Note: ¸¸¾à end_time ÀÌ start_time º¸´Ù ¾Õ¼± °ú°ÅÀÇ ½Ã°£À̶ó¸é, °á°ú°ªÀÌ À½ÀÇ °ªÀÌ µÉ ¼ö ÀÖ´Ù. µû¶ó¼­ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ µÎ ½Ã°£Áß ¾î´À °ÍÀÌ ´õ ¹Ì·¡/°ú°ÅÀÎÁö üũÇÒ ¼öµµ ÀÖ´Ù. *****************************************************************************/ int DMW_GetTimeGap(STime_t *start_time, STime_t *end_time) { UINT32 utc1, utc2; utc1 = DMW_ConvertLocalTime2UTC(NULL, start_time); utc2 = DMW_ConvertLocalTime2UTC(NULL, end_time); return (INT32) (utc2 - utc1); } /*-------------------------------------------------------------------------------------*/ #if COMMENT ____Test____(){} #endif #if COMMENT void TestPrintSysTimeContext(SysTimeContext *stc) { if (stc == NULL) { stc = &g_DefaultSysTimeContext; dprint(2, " [DefaultSysTimeContext] 0x%x\n", stc); } dprint(2, " timebase %d\n", stc->nTimeSystemBase); dprint(2, " timezone %+d, dst %d\n", stc->nTimeZone, stc->bDaylightSavingOn); dprint(2, " GPS_UTC_offset %d\n", stc->GPS_UTC_offset); if (stc->bTimebaseAdjusted) { UINT32 utc; utc = DHL_OS_GetMsCount()/1000 + stc->nTimeSystemBase; dprint(2, " current utc: %d (0x%x)\n", utc, utc); } else dprint(2, " !! time not initialized..\n"); } /* ¾Æ·¡ Å×½ºÆ® ÇÔ¼öµéÀº µðÆúÆ® ŸÀÓ ÄÁÅØ½ºÆ® »ó¿¡¼­ µ¿ÀÛÇÔ. */ void TestSetLocalTime(int year, int month, int day, int hour, int min, int sec) { DMW_SetLocalTime2(NULL, year, month, day, hour, min, sec); } void TestPrintCurTime() { STime_t s; UINT32 utc; int err; err = DMW_GetLocalTime(NULL, &s); DMW_GetUTCTime(NULL, &utc); /*dprint(2, "%s %d/%d/%d %s %d:%02d:%02d [tz %+d] %s UTC 0x%x\n", err ? "!!err " : "", s.year, s.month, s.day, DayOfWeakString(s.wday), s.hour, s.min, s.sec, DMW_GetLocalTimeZone(NULL), DMW_GetDayLightSaving(NULL) ? "DS on" : "", utc);*/ } void TestPrintLocalTime() { TestPrintCurTime(); } extern TSD *Dmc_GetCurrentTsd(void); void TestTimeSync() { sttSectionPtr_t sttSectPtr; int err; /* STT¸¦ Çϳª ´Ù¿î·Îµå ¹Þ¾Æ¼­ System time¿¡ adjustÇÑ´Ù. // // µðÆúÆ® ÄÁÅØ½ºÆ®¿¡ Àû¿ëÇÑ´Ù. Á¦´ë·Î ÇÏ·Á¸é ÄÁÅØ½ºÆ®¸¦ Çϳª ¸¸µå´Â°Ô ÁÁ°Ú´Ù.. // // ½ÇÁ¦ Application¿¡¼­´Â STT¿¡ discontinuity°¡ ¹ß°ßµÇ¸é ÀÌ·± ÀÛ¾÷À» ÇØÁà¾ß ÇÒ °ÍÀÌ´Ù. // 1. ä³ÎÀÌ º¯°æµÇ¾úÀ» ¶§ (ä³Î¸¶´Ù STT ½Ã°èÀÇ ¿ÀÂ÷°¡ ÀÖÀ¸¹Ç·Î..) // 2. °°Àº ä³ÎÀε¥ PsiLostPacket °°Àº discontinuity·Î ÃßÁ¤µÇ´Â »óȲ ¹ß»ý½Ã (³ìÈ­ ½ºÆ®¸²À» Àç»ýÇÑ´ÙµçÁö.. ) // 3. ±×¸®°í Àß ¸ð¸£°ÚÀ¸¸é ÁÖ±âÀûÀ¸·Î ÀÌ·¯ÇÑ ±â´ÉÀ» ÇØ ÁÖ´Â°Ô ÁÁ´Ù. (¾à 1ºÐ?) */ DMW_SetLocalTimeZone(NULL, 9); /* TimeZoneÀº ºÎÆÃ½Ã 1ȸ, ¶Ç´Â »ç¿ëÀÚ°¡ º¯°æÇßÀ»¶§ 1ȸ¸¸ ÇØµµ µÈ´Ù. */ err = GetSttSection((TSD *)Dmc_GetCurrentTsd(), &sttSectPtr, 1000*3); if (err) { dprint("TestTimeSync: no STT!!\n"); return; } DMW_SetGPS_UTC_offset(NULL, sttSectPtr->GPS_UTC_offset); DMW_SetDayLightSaving(NULL, sttSectPtr->daylight_savings.DS_status); DMW_SetUTCTime(NULL, DMW_ConvertGPS2UTC(NULL, sttSectPtr->system_time)); FreeAtscTable(sttSectPtr); /* Àû¿ëµÈ »õ ½Ã°£À» Ç¥½Ã.. */ /* TestPrintLocalTime(); */ TestPrintSysTimeContext(NULL); } /* Å×½ºÆ® ÄÚµå ¿¹: 1Ãʸ¶´Ù ÇöÀç ½Ã°£ Ç¥½Ã // // DMW_SYS_SetTimer (7710, 1000, TestPrintCurTime, 0, 0) // // Å×½ºÆ® ÄÚµå ¿¹: 10ºÐ¿¡ Çѹø¾¿ STT sync¸¦ ¼öÇàÇÑ´Ù. // // DMW_SYS_SetTimer (7711, 10*60*1000, TestTimeSync, 0, 0) */ #endif /* 0 */ #if COMMENT ______DebugSymbol____(){} #endif #if DMW_REGISTER_DEBUG_SYMBOL static DHL_SymbolTable SysTimeSymbols[] = { /*---- functions */ /*---- variables */ //DHL_VAR_SYM_ENTRY(g_Trace_bSysTimeDebug), 0, }; #endif /* DMW_REGISTER_DEBUG_SYMBOL */ void DMW_RegisterSysTimeSymbols() { #if DMW_REGISTER_DEBUG_SYMBOL DHL_DBG_RegisterSymbols(SysTimeSymbols, DHL_NUMSYMBOLS(SysTimeSymbols)); #endif } /* Revision History ///////////////////////////////////////////////////////// 2.07 2005/3/15 GetUtcTime ¿¡¼­ timebaseAdjust µÇÁöµµ ¾ÊÀº »óÅÂÀÏ °æ¿ì µðÆúÆ® time °ªÀ» ÀÌ¿ëÇÏ¿© utc ±Ù»çÄ¡¸¦ ¸®ÅÏ ConvertLocalTime2UTC ¿¡¼­ acc_dayÀÇ ½ÃÀÛ°ªÀÌ -5¶ó¼­ utc = 0ÀÏ °æ¿ì¿Í °°Àº ¿¡·¯ »óȲ¿¡¼­ ¿äÀÏ º¯È¯ÀÌ Àß ¾ÈµÇ´Â ¹®Á¦ ¼öÁ¤ 2.06 DMW_SYS_XXX Standard ȣȯ API´Â ¸ðµÎ »èÁ¦.. ´õÀÌ»ó Áö¿øÇÏÁö ¾ÊÀ½. 2.05 2004/12/20 cafrii DMW_SYS_GetCurUtcTime Ãß°¡ (PodIf ¿¡¼­ »ç¿ë) 2.04 2004/11/02 cafrii DMW_SYS_GetTimeFromGPS ¹ö±× ¼öÁ¤ 2.03 2004/10/5 cafrii DMW_ConvertLocalTime2UTC ¿¡¼­ À½ÀÇ timezone °í·Á¾ÈÇÑ ¹ö±× 2.02 2004/6/17 cafrii DMW_ConvertGPS2UTC: prevent negative utc DMW_SYS_GetTimeFromGPS Ãß°¡ ±¸Çö 2.01 2004/6/15 cafrii Àüü ±¸Á¶ Á¤¸®, DMW_Timer.c ¿¡ ÀÖ´ø StdAPI¸¦ À̰÷¿¡ Æ÷ÆÃ Á¤¸®.. ver 2.000 - Date : 2003/10/21 WHO : Hyunsik Chang To Do : Timer »èÁ¦ ÇÊ¿ä. ¿©±â´Â ½Ã°è¸¸ ÀÖµµ·Ï! ver 1.001 - Date : 2003/09/15 WHO : K.H. Park To Do : UTC Time °ü·Ã Ãß°¡ ver 1.000 - Date : 2003/08/18 WHO : K.H. Park To Do : ½Ã½ºÅÛ ½Ã°£°ü·Ã ÇÔ¼ö ¹× ½Ã°£°æ°ú ÃøÁ¤ ÇÔ¼ö ±¸Çö ////////////////////////////////////////////////////////////////////////// */