/******************************************************************** DMW_EpgDebug.c EPG Middleware debug functions Copyright 2004 Digital STREAM Technology, Inc. All Rights Reserved $Id: DMW_EpgDebug.c v1.00 2004/10 cafrii Exp $ ********************************************************************/ /*_____ I N C L U D E __________________________________________*/ #include "DMW_Platform.h" #include "DLIB_PSI.h" #include "DLIB_PSIP.h" #include "DLIB_PSIP_Monitor.h" #include "DLIB_PSIP_Parser.h" #include "DLIB_PSI_Monitor.h" #include "DLIB_PSI_Parser.h" #include "DHL_SYS.h" #include "DMW_EpgBasePriv.h" // one part channel indicator definition #include "DMW_CodeConv.h" // CodeConv °ü·Ã API #include "DMW_Dummy.h" //#include //#include #if COMMENT ____DEBUG______(){} #endif /*------------------------------------------------------- Configurations.. -------------------------------------------------------*/ #define DMW_UNIPRINT_ENABLED 1 /* DMW_UniPrint ¸ðµâÀÌ ÁغñµÇ¾î ÀÖÀ¸¸é 1 DMW_UniPrint ÇÔ¼ö´Â DMW_CodeConv.c ¿¡ ¸¸µé¾îÁ® Àֱ⠶§¹®¿¡ ÀÌ ÆÄÀÏÀÌ ÇÁ·ÎÁ§Æ®¿¡ Æ÷ÇԵǾî ÀÖÀ¸¸é 1·Î ¼³Á¤Çϰí, ¾Æ´Ï¶ó¸é 0À¸·Î ÇÏ¿© ÀÏ¹Ý DHL_OS_Printf·Î ´ë½ÅÇϵµ·Ï ÇÑ´Ù. µð¹ö±ëÀ» À§Çؼ­¶ó¸é DMW_CodeConv.c °¡ ÀÖÀ¸¸é Æí¸®ÇÏ´Ù. */ #define SYS_TIME_MODULE_ENABLED 1 /* DMW_SysTime.c ¸ðµâÀÌ ÇÁ·ÎÁ§Æ®¿¡ Æ÷ÇԵǾî ÀÖ°í, DMW_SysTime.h ÆÄÀÏÀÌ ÁغñµÇ¾î ÀÖÀ¸¸é 1.. */ #if SYS_TIME_MODULE_ENABLED #include "DMW_SysTime.h" /* STTÀÇ GPS timeÀ̳ª EITÀÇ ½Ã°£ Á¤º¸¸¦ ´Ù·ç±â À§Çؼ­ ÇÊ¿äÇÏ´Ù.. */ #endif #define SimplePrint DHL_OS_Printf #if SYS_TIME_MODULE_ENABLED /* cafrii 061106 add */ /* epg debug¿¡ »ç¿ëµÇ´Â time contextÀÌ´Ù. */ SysTimeContext g_EpgDebugTimeContext = { 0, /* BOOL bTimebaseAdjusted */ 630687600, /* 2000³â 1¿ù1ÀÏ Çѱ¹¿¡¼­ÀÇ UTC.. this will be updated by DMW_SetUTCTime */ 9, /* int nTimeZone; */ /* this will be updated to g_EpgDebugTimeZone */ 0, /* BOOL bDaylightSavingOn; */ /* 1:day light saving , 0: no day light saving */ 13, /* int GPS_UTC_offset; */ }; int g_EpgDebugTimeZone; void Dmc_SetDebugTimeZone(int time_zone) { if (time_zone < -12 || time_zone > 13) time_zone = 0; g_EpgDebugTimeZone = time_zone; DMW_SetLocalTimeZone(&g_EpgDebugTimeContext, time_zone); } #endif /* PSIP Å×À̺íÀÇ °¢Á¾ Ãâ·Â ÇÔ¼öµéÀº µð¹ö±× ¿ëÀ̸ç, ½Ç½Ã°£ Ãâ·Â¿ëÀ¸·Î ÃÖÀûÈ­ µÇÁö´Â ¾Ê¾ÒÀ½. µð¹ö±× âÀÇ È¿À²ÀûÀΠȰ¿ëÀ» À§ÇÏ¿© debug lineÀÇ prefix´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. »ç¿ë°¡´ÉÇÑ µÎ °è¿­ÀÇ ÇÔ¼öÁß, printf ¿Í DHL_OS_Printf Áß¿¡¼­ ÈÄÀÚ¸¦ »ç¿ëÇÑ´Ù. ÈÄÀÚ ÇÔ¼ö´Â Çʿ信 µû¶ó¼­ buffered print ´ë½Å Á÷Á¢ Ãâ·ÂÀ» ¼öÇàÇÒ ¼ö Àֱ⠶§¹®.. OS_UsePrintfSemaphore ÇÔ¼ö ÂüÁ¶.. */ int Dmc_PsipUniPrint(UINT8 *p, int numChar) { #if DMW_UNIPRINT_ENABLED extern int DMW_UniPrint(UINT16 *ucs, int len); #define SWAP16(c) ((((c) & 0xff) << 8U) | (((c) >> 8) & 0xff)) #endif UINT16 dummy = 0x1234; BOOL bLE = *(UINT8 *)&dummy == 0x12 ? FALSE : TRUE; int i; UINT16 *ucs = (UINT16 *)p; if (numChar < 0) { /* auto-detect length. */ for (i=0; i<256; i++) { /* max 256.. */ if (ucs[i] == 0) break; } numChar = i; } #if DMW_UNIPRINT_ENABLED if (bLE) { /* swap each codes.. */ for (i=0; i> 8) & 0xff); else SimplePrint("."); } else { if ((ucs[i] >> 8) == 0) SimplePrint("%c", ucs[i] & 0xff); else SimplePrint("."); } } #endif } char *Dmc_ChannelNumberString(int major, int minor, char *buf) { static char buf0[22]; /* ÃÖ´ë Å©±â.. */ if (buf == NULL) buf = buf0; if (minor == EPG_ONE_PART_CHANNEL_INDICATOR) sprintf(buf, "%d", major); else sprintf(buf, "%d-%d", major, minor); return buf; } /*----------------------- Dmc_ConvertKs2Mss KS ¿Ï¼ºÇü ¹®ÀÚ¿­À» MSS (MultipleStringStructure)·Î º¯È¯ÇÑ´Ù. MSS¸¦ À§ÇÑ ¹öÆÛ´Â ÀÚµ¿À¸·Î ÇÒ´çµÈ´Ù. (DHL_OS_Malloc) »ç¿ë ÈÄ caller°¡ OS_Free ÇØ¾ß ÇÔ. º¯È¯µÈ MSS´Â ÇÔ¼ö ÀÎÀÚ Æ÷ÀÎÅÍ¿Í ¸®Åϰª µÎ°¡Áö ¹æ½ÄÀ¸·Î ¸®ÅϵȴÙ. MSS Àüü ±æÀÌ´Â ÇÔ¼ö ÀÎÀÚ·Î ¸®ÅϵȴÙ. ¿¡·¯°¡ ¹ß»ýÇÒ °æ¿ì NULL ÀÌ ¸®ÅϵȴÙ. */ UINT8 *Dmc_ConvertKs2Mss(char *str, UINT8 **pMssPtr, int *pMssLen) { UINT8 *mss = NULL, *p; UINT16 *ucs; /* unicode string.. */ int len; /* string 1°³, segment 1°³ ÀÇ MSS¸¦ ¸¸µç´Ù. */ ucs = DMW_ConvKs2Uc(str, -1); /* KS ¹®ÀÚ¿­Àº null-terminated stringÀÌ´Ù. */ if (ucs == NULL) { DHL_OS_Printf("!! ConvKs2Mss: Ks2Uc conv err\n"); if (pMssPtr) *pMssPtr = NULL; if (pMssLen) *pMssLen = 0; return NULL; } /* UCS ±æÀ̸¦ °è»êÇÒ ¶§ strlenÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. unicode versionÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.. */ len = 0; while (ucs[len]) len++; len *= 2; /* DHL_OS_Printf(" converted ucs : %d bytes\n", len); */ mss = DHL_OS_Malloc(8 + len); /* 8 is MSS overhead in the simplest form */ if (mss == NULL) { DHL_OS_Printf("!! ConvKs2Mss: out of memory\n"); if (pMssPtr) *pMssPtr = NULL; if (pMssLen) *pMssLen = 0; DMW_FreeUcString(ucs); return NULL; } p = mss; *p++ = 1; /* number_strings */ *p++ = 'k'; /* ISO-639 language code´Â Çѱ¹¾î.. */ *p++ = 'o'; *p++ = 'r'; *p++ = 1; /* number_segments*/ *p++ = 0; /* compression_type: no compression */ *p++ = 0x3F; /* mode: 16-bit unicode */ *p++ = len; /* number_bytes */ memcpy(p, ucs, len); DMW_FreeUcString(ucs); if (pMssPtr) *pMssPtr = mss; if (pMssLen) *pMssLen = 8 + len; return mss; } /*----------------------- Dmc_ConvertMss2Ks MSS (MultipleStringStructure)¸¦ KS ¿Ï¼ºÇüÀ¸·Î º¯È¯ÇÑ´Ù. caller°¡ ÁöÁ¤ÇÑ ¹öÆÛ¸¦ »ç¿ëÇϸç, ¹öÆÛ Å©±â¸¦ ³Ñ¾î¼³ °æ¿ì truncate µÊ. MSS ¾È¿¡´Â ¿©·¯°³ÀÇ string ÀÌ Á¸ÀçÇÒ ¼ö Àִµ¥, instance´Â ÃßÃâÇϰíÀÚ ÇÏ´Â stringÀÇ instance ¹øÈ£ÀÌ´Ù. (0ºÎÅÍ ½ÃÀÛÇÏ´Â À妽º °ª) MSS¿¡ ¿øÇÏ´Â string instance°¡ ¾øÀ¸¸é statusNotFound °¡ ¸®ÅϵȴÙ. */ #define MAX_SEGMENT_STR_SIZE 256 /* cafrii 041126 add */ STATUS Dmc_ConvertMss2Ks(UINT8 *mssPtr, UINT16 mssLen, char *buf, int max_buflen, char *lang, int instance) { /* if 'lang' is non-NULL, lang should be ISO-639 language code. ex: "eng", "kor" if lang is NULL, instance should be 0 ~ mStringPtr->number_strings-1 string is filled upto max_buflen-1 and null-terminator is attached at tail of string. */ multipleStringPtr_t mStringPtr = NULL; msStringPtr_t p; INT32 j, pos; char string[MAX_SEGMENT_STR_SIZE]; DHL_RESULT err = DHL_OK; STATUS status = statusOK; /* cafrii 060609 init bugfix */ UINT8 *ks; if (buf == NULL || max_buflen < 1) return statusInvalidArgument; if (mssPtr == NULL) return statusInvalidArgument; buf[0] = 0; /* cafrii 060719 bugfix!! DS083 */ if (mssLen <= 0) { /* ±×³É empty stringÀ¸·Î ¸®ÅÏ. */ status = statusOK; goto label_exit; } /* mssLenÀÌ 0ÀÎ °æ¿ì mStringPtrÀÌ NULL À̸鼭 DHL_OK¸®ÅϵÊ. */ err = ParseMultipleString(mssPtr, mssLen, &mStringPtr); if (IsError(err) || mStringPtr == NULL) { /* cafrii 050315 change */ mStringPtr = NULL; /* cafrii 050315 add */ status = (err==DHL_FAIL_BAD_FORMAT ? statusPSIPError : statusOutOfMemory); goto label_exit; } if (lang && (lang[0] == 0 || lang[0] == ' ')) lang = NULL; if (lang) { UINT32 code; for (j=0; jnumber_strings; j++) { code = mStringPtr->msString[j].ISO639_language_code; if (((code>>16)&0xff) == (unsigned char)lang[0] && ((code>>8)&0xff) == (unsigned char)lang[1] && ((code)&0xff) == (unsigned char)lang[2]) { instance = j; break; } } } if (instance < 0 || instance >= mStringPtr->number_strings) { status = statusNotFound; goto label_exit; } p = & mStringPtr->msString[instance]; pos = 0; /* langcode = p->ISO639_language_code; */ /* SimplePrint("(%c%c%c) ", (char)(langcode >> 16), (char)(langcode >> 8), (char)(langcode)); */ for (j=0; jnumber_segments; j++) { switch (p->segment[j].compression_type) { case cm_None: /* ÁÖÀÇ!! compresse_string_byte°¡ address alignÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é ¿¡·¯°¡ ³¯Áöµµ ¸ð¸£°ÚÀ½.. */ if (p->segment[j].mode == tm_ISO10646_1_Page_0x00) { /* 0x00 */ /* ASCII, ISO Latin-1 (Roman) */ if (pos + p->segment[j].number_bytes < max_buflen) { memcpy(buf+pos, p->segment[j].compress_string_byte, p->segment[j].number_bytes); pos += p->segment[j].number_bytes; } else { /* cafrii 060314, º¹»çÇÒ ¼ö ÀÖ´Â ¸¸Å­¸¸ º¹»çÇÑ´Ù. */ int len = max_buflen - 1 - pos; memcpy(buf+pos, p->segment[j].compress_string_byte, len); pos += len; buf[pos] = 0; status = statusOK; /* is it better to notify warning? */ goto label_exit; } } else if (p->segment[j].mode == tm_ISO10646_1_16_bit) { /* 0x3F */ /* ISO/IEC 10646-1 mode (all) - KOREAN mode only */ #if 0 ks = DMW_ConvUc2Ks((UINT16 *)p->segment[j].compress_string_byte, p->segment[j].number_bytes/2); /* length °è»êÀº ±×³É 2·Î ³ª´®. Ȧ¼ö ÀÎ °æ¿ì ¸¶Áö¸·Àº À߸®³ª, Á¦´ë·Î µÈ code¶ó¸é */ /* Ç×»ó 2ÀÇ ¹è¼öÀÏ °ÍÀ̹ǷΠ¹®Á¦ ¾ø´Ù. */ #else // cafrii 090909 bugfix // host endian ÀÌ big endian ÀÌ ¾Æ´Ò ¼öµµ ÀÖÀ¸¹Ç·Î ±×³É UINT8* -> UINT16* castingÀº ÇÏ¸é ¾ÈµÊ. int t; UINT16 uc16buf[128 + 10]; // 128 À» ³ÑÁö ¾ÊÀ½. +10 Àº safe margin int segn = p->segment[j].number_bytes/2; // segment length should be even number UINT8 *segs = p->segment[j].compress_string_byte; for (t=0; tsegment[j].mode == 0x48) { /* ¿Ï¼ºÇü ÇѱÛ.. */ /* ±×³É Ãâ·ÂÇϸé Shell font°¡ Çѱ۷Πº¸¿©ÁÙ °ÍÀÓ.. */ if (pos + p->segment[j].number_bytes < max_buflen) { memcpy(buf+pos, p->segment[j].compress_string_byte, p->segment[j].number_bytes); pos += p->segment[j].number_bytes; } else { /* cafrii 060314, º¹»çÇÒ ¼ö ÀÖ´Â ¸¸Å­¸¸ º¹»çÇÑ´Ù. */ int len = max_buflen - 1 - pos; memcpy(buf+pos, p->segment[j].compress_string_byte, len); pos += len; /* ¸¶Áö¸· ±ÛÀÚ°¡ ÇѱÛÀÏ °æ¿ì 1byte À߸®¸é ÀÌ»óÇÏ°Ô Ç¥ÇöµÉ ¼ö ÀÖÀ½. */ buf[pos] = 0; status = statusOK; /* is it better to notify warning? */ goto label_exit; } } else { char errmsg[40]; int len; sprintf(errmsg, "!!Unsupported(%x)!!", p->segment[j].mode); len = strlen(errmsg); if (pos + len < max_buflen) { memcpy(buf+pos, errmsg, len); pos += len; } } break; case cm_Huffman_C4C5: case cm_Huffman_C6C7: #if 0 DecodeHuffmanString(p->segment[j].compress_string_byte, p->segment[j].number_bytes, p->segment[j].compression_type, string, MAX_SEGMENT_STR_SIZE); ks = DMW_ConvUc2Ks((UINT16 *)string, -1); if (pos + strlen((char *)ks) < max_buflen) { memcpy(buf+pos, ks, strlen((char *)ks)); pos += strlen((char *)ks); DMW_FreeKsString(ks); } else { /* cafrii 060314, º¹»çÇÒ ¼ö ÀÖ´Â ¸¸Å­¸¸ º¹»çÇÑ´Ù. */ int len = max_buflen - 1 - pos; memcpy(buf+pos, ks, len); DMW_FreeKsString(ks); pos += len; /* ¸¶Áö¸· ±ÛÀÚ°¡ ÇѱÛÀÏ °æ¿ì 1byte À߸®¸é ÀÌ»óÇÏ°Ô Ç¥ÇöµÉ ¼ö ÀÖÀ½. */ buf[pos] = 0; status = statusOK; /* is it better to notify warning? */ goto label_exit; } #else // cafrii 090909 bugfix // huffman codeÀÇ °æ¿ì´Â ascii range¸¸ compress °¡´ÉÇÔ. µû¶ó¼­ UC to ASCII º¯È¯ ºÒÇÊ¿ä. err = DecodeHuffmanString(p->segment[j].compress_string_byte, p->segment[j].number_bytes, p->segment[j].compression_type, string, MAX_SEGMENT_STR_SIZE); if (err) break; if (pos + strlen((char *)string) < (unsigned int)max_buflen) { memcpy(buf+pos, string, strlen(string)); pos += strlen(string); } else { /* º¹»çÇÒ ¼ö ÀÖ´Â ¸¸Å­¸¸ º¹»çÇÑ´Ù. */ int len = max_buflen - 1 - pos; memcpy(buf+pos, string, len); pos += len; /* ¸¶Áö¸· ±ÛÀÚ°¡ ÇѱÛÀÏ °æ¿ì 1byte À߸®¸é ÀÌ»óÇÏ°Ô Ç¥ÇöµÉ ¼ö ÀÖÀ½. */ buf[pos] = 0; status = statusOK; /* is it better to notify warning? */ goto label_exit; } #endif break; } } buf[pos] = 0; /* null terminate */ label_exit: if (mStringPtr) FreeMultipleString(mStringPtr); return status; } /*----------------------- Dmc_PrintMultipleString PSIP¿¡¼­ »ç¿ëÇÏ´Â multipleStringÀ» µð¹ö±ëÀÌ ÆíÇϵµ·Ï Ãâ·ÂÇØÁØ´Ù.. ÃÖÁ¾ Ãâ·ÂÀ» ÇÒ ¶§ »ç¿ëÇÏ´Â ÇÔ¼ö´Â DMW_UniPrint ·Î¼­, ÀÌ ÇÔ¼öÀÇ Ãâ·Â°¡´É ¿©ºÎ¿¡ µû¶ó ÀϺΠ±ÛÀÚ´Â Ãâ·ÂÀÌ ¾ÈµÈ´Ù. ¸¸¾à Unicode»óÅÂÀÇ code°ªÀ» º¸°í ½ÍÀ¸¸é PrintMultipleString ÇÔ¼ö¸¦ »ç¿ëÇ϶ó.. */ #define STR_SIZE 256 void Dmc_PrintMultipleString(UINT8 *buffer, UINT16 len, int indent, int detailLevel) { multipleStringPtr_t mStringPtr = NULL; INT32 i,j,k; UINT32 langcode; char string[STR_SIZE], tmp[64]; /* tmp´Â indent ¹öÆÛ ¿ë.. */ DHL_RESULT err; if (indent > 63) indent = 63; memset(tmp, ' ', indent); tmp[indent] = 0; /* cafrii 060719 bugfix! add check. DS083 */ if (buffer == NULL || len == 0) { SimplePrint("%s[null]\n", tmp); goto PrintMultipleStringExit; } /* lenÀÌ 0ÀÎ °æ¿ì mStringPtrÀÌ NULL À̸鼭 DHL_OK¸®ÅϵÊ. */ err = ParseMultipleString(buffer, len, &mStringPtr); if (IsError(err)) { /* cafrii 050315 change */ mStringPtr = NULL; /* cafrii 050315 add */ goto PrintMultipleStringExit; } if (mStringPtr == NULL) { SimplePrint("%s[None]\n", tmp); goto PrintMultipleStringExit; } for (i=0; inumber_strings; i++) { langcode = mStringPtr->msString[i].ISO639_language_code; SimplePrint("%s(%c%c%c) ", tmp, (char)(langcode >> 16), (char)(langcode >> 8), (char)(langcode)); for (j=0; jmsString[i].number_segments; j++) { switch (mStringPtr->msString[i].segment[j].compression_type) { case cm_None: /* ÁÖÀÇ!! compresse_string_byte°¡ address alignÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é ¿¡·¯°¡ ³¯Áöµµ ¸ð¸£°ÚÀ½.. */ if (mStringPtr->msString[i].segment[j].mode == tm_ISO10646_1_Page_0x00) /* 0x00 */ /* ASCII, ISO Latin-1 (Roman) */ for (k=0; kmsString[i].segment[j].number_bytes; k++) SimplePrint("%c", mStringPtr->msString[i].segment[j].compress_string_byte[k]); else if (mStringPtr->msString[i].segment[j].mode == tm_ISO10646_1_16_bit) /* 0x3F */ /* ISO/IEC 10646-1 mode (all) - KOREAN mode only */ Dmc_PsipUniPrint((UINT8*)(mStringPtr->msString[i].segment[j].compress_string_byte), mStringPtr->msString[i].segment[j].number_bytes/2); /* length °è»êÀº ±×³É 2·Î ³ª´®. Ȧ¼ö ÀÎ °æ¿ì ¸¶Áö¸·Àº À߸®³ª, Á¦´ë·Î µÈ code¶ó¸é Ç×»ó 2ÀÇ ¹è¼öÀÏ °ÍÀ̹ǷΠ¹®Á¦ ¾ø´Ù. */ else if (mStringPtr->msString[i].segment[j].mode == 0x48) /* ¿Ï¼ºÇü ÇѱÛ.. */ /* ±×³É Ãâ·ÂÇϸé Shell font°¡ Çѱ۷Πº¸¿©ÁÙ °ÍÀÓ.. */ for (k=0; kmsString[i].segment[j].number_bytes; k++) SimplePrint("%c", mStringPtr->msString[i].segment[j].compress_string_byte[k]); else SimplePrint("!!Unsupported(%x)!!", mStringPtr->msString[i].segment[j].mode); break; case cm_Huffman_C4C5: case cm_Huffman_C6C7: DecodeHuffmanString(mStringPtr->msString[i].segment[j].compress_string_byte, mStringPtr->msString[i].segment[j].number_bytes, mStringPtr->msString[i].segment[j].compression_type, string, STR_SIZE); Dmc_PsipUniPrint((UINT8 *)string, -1); /* DecodeÇÏ´Â ÇÔ¼ö°¡ SZ Çü½ÄÀ̹ǷΠ±æÀ̸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. */ break; } } SimplePrint("\n"); #if 0 if (detailLevel >= 1) { /* Á» ´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ Ãâ·ÂÇϰíÀÚ Çϸé 'PrintMultipleString' ¸¦ »ç¿ëÇ϶ó.. */ for (j=0; jmsString[i].number_segments; j++) { SimplePrint("%s [seg%d] comp_type %d, len %d\n", tmp, j, mStringPtr->msString[i].segment[j].compression_type, mStringPtr->msString[i].segment[j].number_bytes); SimplePrint("%s ", tmp); for (k=0; kmsString[i].segment[j].number_bytes; k++) SimplePrint("%02x ", mStringPtr->msString[i].segment[j].compress_string_byte[k]); SimplePrint("\n"); } } #endif } FreeMultipleString(mStringPtr); PrintMultipleStringExit: return; } /*----------------------- GpsTimeString/GpsTimeString2 GPS timeÀ» user time Çü½ÄÀ¸·Î º¯È¯Çؼ­ stringÀ¸·Î ¸¸µé¾îÁÖ´Â ÇÔ¼öÀÌ´Ù. caller°¡ stringÀúÀå¿¡ »ç¿ëµÉ buffer¸¦ ÁöÁ¤Çϴ°ÍÀÌ ±ÇÀåµÈ´Ù. Å©±â´Â ÀûÀýÇϰÔ.. ¸¸¾à °£´ÜÇÏ°Ô Å×½ºÆ®ÇÒ ¸ñÀûÀ̶ó¸é NULL·Î ÁöÁ¤ÇÏ¿© static buffer¸¦ »ç¿ëÇÒ ¼öµµ ÀÖÀ¸³ª ÀÌ °æ¿ì multiple instance¸¦ »ç¿ëÇÏÁö ¸øÇÔ¿¡ À¯ÀÇÇ϶ó.. */ char *GpsTimeString2(UINT32 gps, char *buf, int level) { #if SYS_TIME_MODULE_ENABLED /* 0: (3:20), 1: (3:20:15) 2: (4/19 3:20:15) 3: (2004/4/19 ¿ù 3:20:15) */ char *WdayString_k[7]={"ÀÏ", "¿ù", "È­", "¼ö", "¸ñ", "±Ý", "Åä"}; char *WdayString_e[7]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; static char _buf[100]; STime_t s; UINT32 utc; utc = DMW_ConvertGPS2UTC(&g_EpgDebugTimeContext, gps); DMW_ConvertUTC2LocalTime(&g_EpgDebugTimeContext, utc, &s); #if 0 /* verify test.. */ utc2 = DMW_ConvertLocalTime2UTC(&g_EpgDebugTimeContext, &s); if (utc != utc2) { printf("\n!!!! utc verify err\n"); } #endif if (buf == NULL) buf = _buf; if (level >= 4) sprintf(buf, "%d/%d/%d %s %2d:%02d:%02d [tz%+d]", s.year, s.month, s.day, s.wday<7?WdayString_e[s.wday]:"", s.hour, s.min, s.sec, g_EpgDebugTimeContext.nTimeZone); else if (level >= 3) sprintf(buf, "%d/%d/%d %s %2d:%02d:%02d", s.year, s.month, s.day, s.wday<7?WdayString_k[s.wday]:"", s.hour, s.min, s.sec); else if (level >= 2) sprintf(buf, "%d/%d %2d:%02d:%02d", s.month, s.day, s.hour, s.min, s.sec); else if (level >= 1) sprintf(buf, "%2d:%02d:%02d", s.hour, s.min, s.sec); else sprintf(buf, "%2d:%02d", s.hour, s.min); return buf; #else return "(NoSysTime API)"; #endif } char *GpsTimeString(UINT32 gps, char *buf) { return GpsTimeString2(gps, buf, 3); } /*----------------------- Dmc_PrintEit EitÀÇ Á¤º¸¸¦ º¸±âÁÁ°Ô Ãâ·ÂÇØÁØ´Ù. SysTime ¼³Á¤¿¡ µû¶ó ÇöÀç ½Ã°£ Ãâ·ÂÀÌ Á¤È®ÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ¸¸¾à EITÀÇ ¸ðµç ÀÚ¼¼ÇÑ Á¤º¸¸¦ Ãâ·ÂÇϱ⸦ ¿øÇϸé PrintEit ¸¦ »ç¿ëÇ϶ó.. */ void Dmc_PrintEit(eitPtr_t eitPtr, int indent, ettSectionPtr_t *ettArray) { /* indent´Â ¸Å ¶óÀÎÀÇ ¾Õ¿¡ ¸îÄ­À» µé¿©¾²±â¸¦ ÇÒ °ÍÀΰ¡ ÁöÁ¤ÇÏ´Â °ÍÀε¥, ÃÖ´ë 31±îÁö °¡´ÉÇÏ´Ù. */ INT32 i; char tmp[32], buf1[64], buf2[64]; /* tmp´Â µé¿©¾²±â¿ë, buf´Â TimeString¿ë */ if (indent > 31) indent = 31; memset(tmp, ' ', indent); tmp[indent] = 0; /* SimplePrint("\n%s------ EIT ------\n", tmp); */ SimplePrint("%sEIT source_id %d, ver %d, %d events\n", tmp, eitPtr->source_id, eitPtr->version_number, eitPtr->numEvents); for (i=0; inumEvents; i++) { SimplePrint("%s event[%d]: id: 0x%04X, %s ~ %s, ETM %d (%s)\n", tmp, i, eitPtr->event[i].event_id, GpsTimeString2(eitPtr->event[i].start_time, buf1, 2), GpsTimeString2(eitPtr->event[i].start_time + eitPtr->event[i].length_in_seconds, buf2, 1), /* eitPtr->event[i].start_time, eitPtr->event[i].length_in_seconds, */ eitPtr->event[i].ETM_location, eitPtr->event[i].ETM_location == ETM_none ? "None" : eitPtr->event[i].ETM_location == ETM_in_this_PTC ? "ThisPTC" : eitPtr->event[i].ETM_location == ETM_in_channel_TSID_PTC ? "ChannelTsidPTC" : "??" ); Dmc_PrintMultipleString(eitPtr->event[i].title, eitPtr->event[i].title_length, indent+6, 0); /* SimplePrint("%s desc_len %d\n", tmp, eitPtr->event[i].descriptor_length); */ /* 'ettArray'°¡ ÀÖÀ¸¸é °°ÀÌ ettµµ Ãâ·ÂÇÑ´Ù. ±×·±µ¥ ¿ø·¡ ¾ø´Â ettÀÎÁö, ¾ÆÁ÷ ¼ö½ÅÀÌ ´ú µÈ ettÀÎÁö ½±°Ô ¾Ë ¹æ¹ýÀÌ ¾ø´Ù. */ if (eitPtr->event[i].ETM_location != ETM_none && ettArray && ettArray[i]) { ettSectionPtr_t ettSectPtr = ettArray[i]; /* SimplePrint("%sETT ETM_id %08x, event %x, ver %d\n", tmp, ettSectPtr->ETM_id, (ettSectPtr->ETM_id>>2) & 0x3fff, */ /* ettSectPtr->version_number); */ Dmc_PrintMultipleString(ettSectPtr->extended_text_message, ettSectPtr->extended_text_message_length, indent+7, 0); /* ETT ETMÀº ÇÑÄ­ ´õ µé¿©¾²µµ·Ï ÇÏÀÚ.. */ } } } /*----------------------- Dmc_PrintEtt EttÀÇ Á¤º¸¸¦ º¸±âÁÁ°Ô Ãâ·ÂÇØÁØ´Ù. ¸¸¾à ETTÀÇ ¸ðµç ÀÚ¼¼ÇÑ Á¤º¸¸¦ Ãâ·ÂÇϱ⸦ ¿øÇϸé PrintEtt ¸¦ »ç¿ëÇ϶ó.. */ void Dmc_PrintEtt(ettSectionPtr_t ettSectPtr, int indent) { char tmp[32]; if (indent > 31) indent = 31; memset(tmp, ' ', indent); tmp[indent] = 0; /* SimplePrint("\n%s------ ETT Section ------\n", tmp); */ SimplePrint("%sETT ETM_id %08x, event %x, ver %d\n", tmp, ettSectPtr->ETM_id, (ettSectPtr->ETM_id>>2) & 0x3fff, ettSectPtr->version_number); Dmc_PrintMultipleString(ettSectPtr->extended_text_message, ettSectPtr->extended_text_message_length, indent+3, 0); } /*----------------------- Dmc_PrintRrt RrtÀÇ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. cafrii 060822, detail ¸ðµå¿¡¼­ ´õ ¸¹Àº Á¤º¸ Ãâ·ÂÇϰԲû ¼öÁ¤. */ void Dmc_PrintRrt(rrtSectionPtr_t rrt, int indent, BOOL bDetail) { int i, k; char ibuf[32]; int offset = 0; static char mssbuf[200]; STATUS status; if (indent > 31) indent = 31; memset(ibuf, ' ', indent); ibuf[indent] = 0; /* °£´ÜÇϰԴ ù¹øÂ° langcode¸¸ Ãâ·Â. */ status = Dmc_ConvertMss2Ks(rrt->rating_region_name, rrt->rating_region_name_length, mssbuf, 200, NULL, 0); SimplePrint("%s RRT ver %d, %d dims, region 0x%x { %s }\n", ibuf, (int)rrt->version_number, (int)rrt->dimensions_defined, rrt->rating_region, status ? "err" : mssbuf); if (bDetail) { /* ¸ðµç langcode¸¦ ´Ù Ãâ·ÂÇÑ´Ù. */ Dmc_PrintMultipleString(rrt->rating_region_name, rrt->rating_region_name_length, indent+6, 0); } for (i=0; idimensions_defined; i++) { rrtDimensionPtr_t dim = &rrt->dimension[i]; status = Dmc_ConvertMss2Ks(dim->dimension_name, dim->dimension_name_length, mssbuf, 200, "eng", 0); if (status) status = Dmc_ConvertMss2Ks(dim->dimension_name, dim->dimension_name_length, mssbuf, 200, "kor", 0); if (status) status = Dmc_ConvertMss2Ks(dim->dimension_name, dim->dimension_name_length, mssbuf, 200, NULL, 0); SimplePrint("%s [%d] grad %d, %d values, { %s }\n", ibuf, i, (int)dim->graduated_scale, (int)dim->values_defined, status ? "err" : mssbuf); if (bDetail) Dmc_PrintMultipleString(dim->dimension_name, dim->dimension_name_length, indent+8, 0); if (dim->first_value_empty) { offset = 1; SimplePrint("%s (%d) --\n", ibuf, 0); } for (k=0; kvalues_defined; k++) { rrtValuePtr_t value = &dim->value[k]; status = Dmc_ConvertMss2Ks(value->abbrev_rating_value, value->abbrev_rating_value_length, mssbuf, 200, "eng", 0); if (status) status = Dmc_ConvertMss2Ks(value->abbrev_rating_value, value->abbrev_rating_value_length, mssbuf, 200, "kor", 0); if (status) status = Dmc_ConvertMss2Ks(value->abbrev_rating_value, value->abbrev_rating_value_length, mssbuf, 200, NULL, 0); SimplePrint("%s (%d) %s { %s }\n", ibuf, k+offset, value->block_on ? "ON" : "--", status ? "err" : mssbuf); /* Ãß°¡ Á¤º¸ Ç¥½Ã.. */ if (bDetail) Dmc_PrintMultipleString(value->abbrev_rating_value, value->abbrev_rating_value_length, indent+10, 0); /* value_text Ç¥½Ã.. */ if (bDetail) { /* SimplePrint("%s text:\n", ibuf); */ Dmc_PrintMultipleString(value->rating_value, value->rating_value_length, indent+12, 0); } } } } /*----------------------- Dmc_SetGpsTimeSync ÀÌ ÇÔ¼ö´Â À§ÀÇ PrintEit ³»ÀÇ GPS ½Ã°£ Á¤º¸¸¦ Ç¥½ÃÇÒ¶§ÀÇ °¢Á¾ ȯ°æÀ» ¼³Á¤ÇÏ´Â ÇÔ¼öÀÌ´Ù. ÀÏ¹Ý ¹ü¿ëÇÔ¼ö´Â ¾Æ´Ï¶ó µð¹ö±ë ¿ëÀ̸ç, Application¿¡¼­´Â °¢ÀÚ µû·Î ¼³Á¤ÇÏ´Â Äڵ带 °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.. */ void Dmc_SetGpsTimeSync(sttSection_t *stt) { /* SysTime ¸ðµâÀ» »ç¿ëÇϱâ À§Çؼ­´Â ÀÌ ÇÔ¼ö·Î Àû¾îµµ 1ȸ ÃʱâÈ­¸¦ ½ÃÄÑÁà¾ß ÇÑ´Ù.. */ if (stt == NULL) return; #if SYS_TIME_MODULE_ENABLED /* cafrii 061106, use epg debug time context. user can use Dmc_SetDebugTimeZone to match system time zone. */ DMW_SetLocalTimeZone(&g_EpgDebugTimeContext, g_EpgDebugTimeZone); /* Seoul À¸·Î timezone ¼³Á¤.. */ #if 0 if (stt->daylight_savings.DS_status) /* ÇöÀç DS »óÅÂÀÌ¸é ¿ì¸®µµ Àû¿ë.. */ DMW_SetDayLightSaving(&g_EpgDebugTimeContext, TRUE); else DMW_SetDayLightSaving(&g_EpgDebugTimeContext, FALSE); #else /* for automatic daylight saving control.. */ DMW_SetDayLightSaving2(&g_EpgDebugTimeContext, stt->daylight_savings.DS_status ? 1 : 0, stt->daylight_savings.DS_day_of_month, stt->daylight_savings.DS_hour); #endif DMW_SetGPS_UTC_offset(&g_EpgDebugTimeContext, stt->GPS_UTC_offset); DMW_SetUTCTime(&g_EpgDebugTimeContext, DMW_ConvertGPS2UTC(&g_EpgDebugTimeContext, stt->system_time)); #endif } #if COMMENT ____DbgPrint________(){} #endif #if COMMENT ____SymbolLink________(){} #endif #if DMW_REGISTER_DEBUG_SYMBOL static DHL_SymbolTable _EpgDriverSymbols[] = { DHL_FNC_SYM_ENTRY(PrintPAT), DHL_FNC_SYM_ENTRY(PrintPMT), DHL_FNC_SYM_ENTRY(PrintSttSection), DHL_FNC_SYM_ENTRY(PrintMgtSection), DHL_FNC_SYM_ENTRY(PrintTvct), DHL_FNC_SYM_ENTRY(PrintCvct), DHL_FNC_SYM_ENTRY(PrintRrtSection), DHL_FNC_SYM_ENTRY(PrintEit), DHL_FNC_SYM_ENTRY(PrintEttSection), }; static DHL_SymbolTable _EpgDebugSymbols[] = { DHL_FNC_SYM_ENTRY(Dmc_PrintMultipleString), DHL_FNC_SYM_ENTRY(Dmc_PrintEit), DHL_FNC_SYM_ENTRY(Dmc_PrintEtt), DHL_FNC_SYM_ENTRY(Dmc_PrintRrt), DHL_FNC_SYM_ENTRY(Dmc_SetDebugTimeZone), /* cafrii 061106 add */ }; #endif void RegisterEpgDebugSymbols() { #if DMW_REGISTER_DEBUG_SYMBOL DHL_DBG_RegisterSymbols(_EpgDebugSymbols, DHL_NUMSYMBOLS(_EpgDebugSymbols)); DHL_DBG_RegisterSymbols(_EpgDriverSymbols, DHL_NUMSYMBOLS(_EpgDriverSymbols)); #endif } #if COMMENT ____TEST________(){} #endif /* cafrii 041126 add */ void TestConvKs2Mss(int number) { int i; char buf[100]; UINT8 *mss; int mss_len; if (number == 0) number = 20; for (i=0; i