/* DMW_PsiEngine.h DST TV MW PSI Scan Module PSI Scan Core Engine implementation Copyright 2006~2010 Digital STREAM Technology, Inc. All Rights Reserved */ #ifndef __DMW_PSI_ENGINE_H__ #define __DMW_PSI_ENGINE_H__ #include "DMW_PsiConfig.h" #include "DMW_PsiTypes.h" #include "DMW_PsiAPI.h" #ifdef __cplusplus extern "C" { #endif #if COMMENT ____Overview____(){} #endif #if COMMENT ____PortInfo____(){} #endif /* Transport stream Port Context TS ÀԷ ä³Î ´ç Çϳª¾¿ Á¸Àç. ÇØ´ç TS ÀԷ ä³ÎÀÇ µ¿ÀÛ ÇöÀç Port´Â stateless À̰í, ÀÔ·Â event¿¡ µû¶ó¼­ ÇØ´çµÇ´Â µ¿ÀÛÀ» ÇÏ´Â ±¸Á¶ÀÌ´Ù. Áï PAT¸¦ ¹ÞÀ¸¸é PMT¸¦ monitorÇÏÁö, ÇöÀç pat_received_state µî°ú °°Àº state º¯¼ö°¡ ¾ø´Ù. */ struct S_PSIM_TASK_t; typedef struct { tDHL_TSD tsd; S_PSIM_USER_INPUT input; //struct S_PSIM_TASK_t *context; // back link //------- int n_active_monitors; // ÇöÀç °¡µ¿ ÁßÀÎ ÃÑ psi monitor °¹¼ö. int max_monitors; // ÃÖ´ë »ç¿ë °¡´ÉÇÑ monitor °¹¼ö. //------- // program change monitor int last_event_id; //------- // psi monitor controls tDHL_PSI_ControlHandle patPsiCtl; int num_programs; // number of below pmtPsiCtlArray. // ¿¹¿Ü »óȲ¿¡¼± num_programs°¡ 0ÀÏ °æ¿ìµµ ÀÖÀ½. tDHL_PSI_ControlHandle *pmtPsiCtlArray; //------- // psip monitor controls tDHL_PSI_ControlHandle mgtPsiCtl, sttPsiCtl, tvctPsiCtl, cvctPsiCtl, rrtPsiCtl, easPsiCtl; // source_id UINT16 source_id; // source id of subchannel which is being downloaded. // óÀ½ psi scan ½ÃÀÛÇÒ ¶§¿¡´Â user inputÀÇ source_id ¿Í µ¿ÀÏÇϰÚÁö¸¸ // ½Ã°£ÀÌ Áö³ª¸é¼­ subchannelÀÌ complete°¡ µÇ¸é // ´Ù¸¥ subchannel·Î ÀÚµ¿ °Ë»ö ÀüȯµÉ ¶§ º¯°æµÈ´Ù. tDHL_PSI_ControlHandle eitPsiCtl[128]; tDHL_PSI_ControlHandle ettPsiCtl[128]; tDHL_PSI_ControlHandle ettvPsiCtl; // channel-ett } S_PSIM_PORT; #if COMMENT ____State____(){} #endif /* module state. multi-tuner°¡ Áö¿øµÇ¾î¾ß ÇÑ´Ù¸é psi moduleÀÇ »óź¸´Ù´Â °¢ tunerÀÇ »óŰ¡ ´õ Áß¿äÇϹǷÎ, »ç½Ç »ç¿ëµÇÁö ¾ÊÀ½. ÀÌ ºÎºÐÀº ¾ÕÀ¸·Îµµ »ç¿ëµÇÁö ¾ÊÀ» °Í °°À½. */ typedef enum { ePSIM_MODULE_STATE_Init, ePSIM_MODULE_STATE_Idle, //ePSIM_MODULE_STATE_Scanning, // scanning ÀÛ¾÷Àº °¢ Æ÷Æ®º°·Î °¢°¢ ÁøÇàµÇ¹Ç·Î // taskÀÇ state·Î º¸±ä ¾î·Æ´Ù. } E_PSIM_MODULE_STATE; #if COMMENT ____Context____(){} #endif #define PSI_ENGINE_MAGICKEY 0x31415926 /* PSI engineÀÇ context ÇöÀç·Î¼­´Â module state¿Í port Á¤º¸ »ÓÀÌ´Ù. */ typedef struct { UINT32 magic; // valid marker E_PSIM_MODULE_STATE state; S_PSIM_PORT tsport[MAX_TS_INPUT]; } S_PSIM_CONTEXT; #if COMMENT ____TaskCommand____(){} #endif /* API ¶Ç´Â event¿¡¼­ psi engine task·Î Àü´ÞÇÏ´Â ¸í·É. */ typedef enum { // command from external clients ePSIM_CMD_ScanStart = 0x10, // [0] tDHL_TSD *tsd // [1] S_PSIM_USER_INPUT *input ePSIM_CMD_ScanStop, // [0] tDHL_TSD *tsd // [1] -- ePSIM_CMD_DeleteTables, // [0] int id (rf). if id is 0, delete all tables. // [1] -- // event from HAL/driver ePSIM_CMD_TableReceived, // [0] S_PSIM_PORT *tsport // [1] tDHL_PSIDataArray *desc //ePSIM_CMD_PatReceived, // belows are internal use. ePSIM_CMD_Init, ePSIM_CMD_Exit, } E_PSIM_CMD; #if COMMENT ____Task____(){} #endif STATUS PSITASK_Init(void *pModuleContext); STATUS PSITASK_SendCommand(E_PSIM_CMD cmd_id, UINT32 payload_0, UINT32 payload_1, BOOL bWait); BOOL PSITASK_IsPsiTask(void); #if COMMENT ____Engine____(){} #endif E_PSIM_MODULE_STATE PSIE_GetModuleState(S_PSIM_CONTEXT *pContext); void PSIE_ChangeModuleState(S_PSIM_CONTEXT *pContext, E_PSIM_MODULE_STATE newState); STATUS PSIE_StartPsiScan(S_PSIM_CONTEXT *pContext, tDHL_TSD tsd, S_PSIM_USER_INPUT *input); STATUS PSIE_StopPsiScan(S_PSIM_CONTEXT *pContext, tDHL_TSD tsd); STATUS PSIE_StopAllPsiScan(S_PSIM_CONTEXT *pContext); STATUS PSIE_DeleteTables(S_PSIM_CONTEXT *pContext, int id); STATUS PSIE_ProcessReceivedTable(S_PSIM_CONTEXT *pContext, S_PSIM_PORT *tsport, tDHL_PSI_DataArray *desc); void PSIE_DoPeridicProcessing(S_PSIM_CONTEXT *pContext); #define PSIM_WAIT_FOREVER ((UINT32)-1) UINT32 PSIE_GetTimeout(S_PSIM_CONTEXT *pContext); S_PSIM_CONTEXT *PSIE_InitEngine(void); S_PSIM_CONTEXT *PSIE_GetEngine(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif // __DMW_PSI_ENGINE_H__