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

DVD

开发平台:

C/C++

  1. #include <string.h>
  2. #include "epg.h"
  3. #include "sipsi.h"
  4. #include "db.h"
  5. #include "appltype.h"
  6. #include "dmd.h"
  7. #include "timeclk.h"
  8. #include "db.h"
  9. #include "kb_machblue_client_task.h"
  10. #include "Machblue_defines.h"
  11. #include "Avplay.h"
  12. #include "Nvod.h"
  13. extern KB_DMDTunerParameters CurrentSignal;
  14. static UINT32 gEPGTaskID;
  15. static UINT32 gEpgQueID;
  16. static KB_EPGSchInfo gEpgSchInfo[KB_EPG_MAX_TS_NUM];
  17. static KB_SIEitSch       gEpgSCH[KB_EPG_MAX_TS_NUM][KB_EPG_MAX_SCH];
  18. static KB_EpgPFInfo gEpgPFInfo;
  19. static KB_SIEitPF *gpEpgPF;
  20. static INT32 gEpgToNvod;
  21. static KB_SIEitSchEvent *gEpgSCHEvent;
  22. static time_t epgTime;
  23. static KB_EPGCallBackFunc gpEpgCallback;
  24. static void EpgMsgDisPatch(KB_OSPMsgNode *pInMsg);
  25. static INT32 EpgGetFreeSchNum(UINT32 TsNum);
  26. static INT32 KD_EPGGetSchInfoNumByServiceId(UINT32 TsNum, UINT32 nSvcID);
  27. static void  EpgHandlerEvent(KB_OSPMsgNode *pInMsg);
  28. static INT32 EpgResetPF(void);
  29. static INT32 EpgResetSCH(UINT32 nTsNum, INT32 nSrvNum);
  30. static void  EpgResetUnusedSCH(UINT32 TsNum,
  31.                                    INT32  nSvcCnt, 
  32.                                            UINT32 *pSvcID);
  33. static void  EpgHandleSI(KB_OSPMsgNode *pInMsg);
  34. static INT32 EpgSortSCH(UINT32  TsNum,
  35.                           KB_SIEitSch *pSCHInfo, 
  36.                                      INT32 nEvtNum);
  37. static void  KD_EpgTask(void);
  38. static void QuickSort(KB_SIEitSchEvent *pList, int nLow, int nHigh);
  39. static int Partition(KB_SIEitSchEvent *pList, int nLow, int nHigh);
  40. static UINT8 KB_EPG_GetFreeEpgSchInfo(void);
  41. extern mb_error_t KB_mb_PF_Update(KB_SIEitPF *Cur_ptEitPf,KB_SIEitPF *Fol_ptEitPf);
  42. extern void KB_MENUTranslateMsg(KB_OSPMsgNode* pInMsg);
  43. INT32 KB_EPGGetEITPF(UINT32 nSvcID)
  44. {
  45.     //KB_OSPMsgNode msgNode;
  46.     
  47.     EpgResetPF();    
  48.     KB_SIGetEitPF(nSvcID , KB_SI_EIT_CURRENT_TS,
  49.                       gEpgPFInfo.pPresent,
  50.                       gEpgPFInfo.pFollow, 
  51.                       KB_SI_RECEIVE_ONCE, 
  52.                       -1);
  53.     gEpgPFInfo.nEnable    = FALSE;
  54.     gEpgPFInfo.nSvcID = nSvcID;
  55.     gEpgPFInfo.nState     = EPG_Receiving;
  56.     return RETOK;
  57. }
  58. INT32 KB_EPGGetSch(UINT32 nTsId, INT32 nSvcCnt, UINT32 *pSvcID)
  59. {
  60.     UINT32 i, nNumber, CurrentTsNum;
  61.     KB_OSPMsgNode msgNode;
  62.     
  63.     if (nSvcCnt < 0 || nSvcCnt > KB_EPG_MAX_SCH
  64.         || pSvcID == NULL)
  65.     {
  66.         return RETFAIL3;
  67.     }
  68.     CurrentTsNum = KB_EPG_GetCurrentTsNum();
  69.     if (CurrentTsNum >= KB_EPG_MAX_TS_NUM)
  70.     {
  71.         printf("nKB_EPGGetSch::Serious Error.CurrentTs is NULLn");
  72.         return RETFAIL3;
  73.     }
  74.     
  75.     if (nTsId != gEpgSchInfo[CurrentTsNum].nTsId)
  76.     {
  77.         printf("nKB_EPGGetSch::Serious Error.Ts(%d) is not CurrentTsn", nTsId);
  78.         return RETFAIL3;
  79.     }
  80.     else
  81.     {
  82.         //printf("nKB_EPGGetSch::CurrentTs(%d) search! SrvNum(%d)n", 
  83.         //        nTsId, nSvcCnt);
  84.         EpgResetUnusedSCH(CurrentTsNum, nSvcCnt, pSvcID);
  85.     }
  86.     
  87.     for (i = 0; i < nSvcCnt; i++)
  88.     {
  89.         nNumber = KD_EPGGetSchInfoNumByServiceId(CurrentTsNum, *(pSvcID + i));
  90.         if (nNumber != 0xFFFFFFFF)
  91.         {
  92.             switch (gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nState)
  93.             {
  94.             case EPG_Empty:
  95.             case EPG_Timeout:
  96.                 KB_SIGetEitSCH(*(pSvcID + i),
  97.                                     gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].pDataStruct);
  98.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nEnable    = FALSE;
  99.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nState     = EPG_Receiving;
  100.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nSvcID = *(pSvcID + i);
  101.                 break;            
  102.             case EPG_Recieved: 
  103.                 msgNode.Word1 = J_EPG_MODULE;
  104.                 msgNode.Word2 = EPG_MSG_SCHEDULE_DONE;
  105.                 msgNode.Word3 = (UINT32)(gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].pDataStruct);
  106.                 msgNode.Word4 = *(pSvcID + i);
  107.                 if (gpEpgCallback)
  108.                 {
  109.                     gpEpgCallback(&msgNode);
  110.                 }   
  111.                 break;
  112.             case EPG_Receiving:
  113.                 KB_SIStopEitSCH(*(pSvcID + i)); 
  114.                 KB_SIGetEitSCH(*(pSvcID + i),
  115.                                  gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].pDataStruct);
  116.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nEnable    = FALSE;
  117.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nState     = EPG_Receiving;
  118.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nSvcID = *(pSvcID + i);
  119.                 break;
  120.                 
  121.             default:
  122.                 break;
  123.             }
  124.         }
  125.         else
  126.         {
  127.             nNumber = (UINT32)EpgGetFreeSchNum(CurrentTsNum);
  128.             if (nNumber != 0xFFFFFFFF)
  129.             {
  130.                 //printf("nKB_EPGGetSch::start to search ShiftSrv(%d)n", 
  131.                         //*(pSvcID + i));
  132.                 KB_SIGetEitSCH(*(pSvcID + i),
  133.                                  gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].pDataStruct);  
  134.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nEnable = FALSE;
  135.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nState  = EPG_Receiving;
  136.                 gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nSvcID = *(pSvcID + i);
  137.             }
  138.         }
  139.     }
  140.     return RETOK;
  141. }
  142. KB_EPGCallBackFunc KB_EpgCallBack(KB_EPGCallBackFunc callback)
  143. {
  144.     KB_EPGCallBackFunc ptPreCallback;
  145.     ptPreCallback  = gpEpgCallback;
  146.     gpEpgCallback = callback;
  147.     return ptPreCallback;
  148. }
  149. INT32 KB_EPGStopAllEITPF(void)
  150. {
  151.     KB_SIStopEitPF(KB_SI_STOP_ALL, KB_SI_EIT_CURRENT_TS);    
  152.         
  153.     EpgResetPF();
  154.     return RETOK;
  155. }
  156. INT32 KB_EPGStopAllSCH()
  157. {
  158.     INT32 i, j;
  159.     KB_SIStopEitSCH(KB_SI_STOP_ALL);
  160.     
  161.     //gEpgSchInfo.nTsId = 0xFFFFFFFF;
  162.         
  163.     for (i = 0; i < KB_EPG_MAX_TS_NUM; i++)
  164.     {
  165.         for (j = 0; j < KB_EPG_MAX_SCH; j++)
  166.         {
  167.             EpgResetSCH(i, j);
  168.         }
  169.     }
  170.     return RETOK;
  171. }
  172. #if 0
  173. INT32 KB_EPGStopOneTsAllSCH(UINT32 TsNum)
  174. {
  175.     INT32 i;
  176.     KB_SIStopEitSCH(KB_SI_STOP_ALL);
  177.     
  178.     //gEpgSchInfo.nTsId = 0xFFFFFFFF;
  179.         
  180.     for (i = 0; i < KB_EPG_MAX_SCH; i++)
  181.     {
  182.         EpgResetSCH(TsNum, i);
  183.     }
  184.     
  185.     return RETOK;
  186. }
  187. #endif
  188. INT32 KD_EPGStopPF(UINT32 nSvcID)
  189. {
  190.     KB_SIStopEitPF(nSvcID, KB_SI_EIT_CURRENT_TS);            
  191.     EpgResetPF();
  192.     return RETOK;
  193. }
  194. INT32 KB_EPGStopOneSrvSCH(UINT32 TsNum, UINT32 nSvcID)
  195. {
  196.     int i;    
  197.         
  198.     if (TsNum >= KB_EPG_MAX_TS_NUM)
  199.     {
  200.         return RETFIAL1;
  201.     }
  202.         
  203.     for (i = 0; i < KB_EPG_MAX_SCH; i++)
  204.     {
  205.         if (gEpgSchInfo[TsNum].nSchInfo[i].nEnable == FALSE
  206.             && gEpgSchInfo[TsNum].nSchInfo[i].nSvcID == nSvcID)
  207.         {
  208.             KB_SIStopEitSCH(nSvcID);            
  209.             EpgResetSCH(TsNum, i);
  210.             return RETOK;
  211.         }        
  212.     }
  213.     return RETFIAL1;
  214. }
  215. INT32 KD_EPGTaskInit(void)
  216. {
  217.     int i, j;
  218.     unsigned short  PrgNO;
  219.     unsigned char   PrgType;
  220.     KB_DBPrgInfo    PrgInfo;
  221.     KB_DBChnnlInfo  ChnnlInfo;
  222.     UINT8           Track;
  223.     UINT8           Volume;
  224.     UINT8           LockFlag;
  225.     
  226.     KB_OSPQueInit("EPG", 128, &gEpgQueID);
  227.     KB_OSPTaskInit("EPG",1024 * 32,(void (*)(void*))KD_EpgTask,EPG_PRIORITY,NULL,&gEPGTaskID);
  228.     KB_SIRegisterEitCallBack(EpgHandleSI);
  229.     
  230.     gpEpgPF            = NULL;
  231.     gEpgSCHEvent = NULL;
  232.     gpEpgCallback      = NULL;
  233.     gEpgToNvod   = FALSE;
  234.     memset(gEpgSchInfo, 0, (sizeof(KB_EPGSchInfo)*KB_EPG_MAX_TS_NUM));
  235.     
  236.     gpEpgPF = KB_OSPMalloc(sizeof(KB_SIEitPF) * 2);        
  237.     if (gpEpgPF == NULL)
  238.     {
  239.         return RETFAIL2;
  240.     }
  241.     else
  242.     {
  243.         gEpgPFInfo.nTsId        = 0xFFFFFFFF;
  244.         gEpgPFInfo.nEnable      = TRUE;
  245.         gEpgPFInfo.nState       = EPG_Empty;
  246.         gEpgPFInfo.nSvcID   = 0xFFFFFFFF;
  247.         gEpgPFInfo.pPresent = gpEpgPF;
  248.         gEpgPFInfo.pFollow  = gpEpgPF+ 1;
  249.     }
  250.     
  251.     for (i = 0; i < KB_EPG_MAX_TS_NUM; i++)
  252.     {
  253.         for (j = 0; j < KB_EPG_MAX_SCH; j++)
  254.         {
  255.             gEpgSCH[i][j].service_id = 0xffff;
  256.             gEpgSCH[i][j].num        = 0xffff;
  257.             gEpgSCH[i][j].ptEvent    = NULL;
  258.         }
  259.     }
  260.     
  261.     
  262.     gEpgSCHEvent = KB_OSPMalloc(sizeof(KB_SIEitSchEvent) * KB_EPG_MAX_TS_NUM * KB_EPG_MAX_SCH * KB_SI_MAX_EVENT_NUM_PER_SERVICE);        
  263.     if (gEpgSCHEvent == NULL)
  264.     {
  265.         return RETFAIL2;
  266.     }
  267.     else
  268.     {
  269.         for (i = 0; i < KB_EPG_MAX_TS_NUM; i++)
  270.         {
  271.             gEpgSchInfo[i].nTsId = 0xFFFFFFFF;
  272.             gEpgSchInfo[i].nCurrentTsTag = FALSE;
  273.         
  274.             for (j = 0; j < KB_EPG_MAX_SCH; j++)
  275.         {   
  276.                 gEpgSchInfo[i].nSchInfo[j].nEnable      = TRUE;
  277.                 gEpgSchInfo[i].nSchInfo[j].nState       = EPG_Empty;
  278.                 gEpgSchInfo[i].nSchInfo[j].nSvcID   = 0xFFFFFFFF;
  279.                 gEpgSchInfo[i].nSchInfo[j].pDataStruct = &gEpgSCH[i][j];
  280.                 gEpgSchInfo[i].nSchInfo[j].pDataStruct->ptEvent = gEpgSCHEvent 
  281.                                                                      + i*KB_EPG_MAX_SCH*KB_SI_MAX_EVENT_NUM_PER_SERVICE
  282.                                                                      + j*KB_SI_MAX_EVENT_NUM_PER_SERVICE;
  283.         }
  284.         }
  285.         
  286.         KB_DBGetCurPrgInfo(&PrgNO, &PrgType);
  287.         KB_DBGetPrgInfo(PrgNO, 
  288.                           PrgType, 
  289.                           &PrgInfo, 
  290.                           &ChnnlInfo, 
  291.                           &Track, 
  292.                           &Volume, 
  293.                           &LockFlag);
  294.         KB_EPG_SetCurrentTsNum(ChnnlInfo.TSID);
  295.         printf("nKD_EPGTaskInit::sizeof(gEpgSchInfo)(%d), sizeof(gEpgSCH)(%d), sizeof(gEpgSCHEvent)(%d)",
  296.                 sizeof(gEpgSchInfo), sizeof(gEpgSCH), (sizeof(KB_SIEitSchEvent) * KB_EPG_MAX_TS_NUM * KB_EPG_MAX_SCH * KB_SI_MAX_EVENT_NUM_PER_SERVICE));
  297.         return RETOK;
  298.     }
  299. }
  300. static INT32 EpgGetFreeSchNum(UINT32 TsNum)
  301. {
  302.     INT32 i, nNumber;
  303.     if (TsNum >= KB_EPG_MAX_TS_NUM)
  304.     {
  305.         printf("nEpgGetFreeSchNum::serious error! input TsNum(%d) is too large.",
  306.                 TsNum);
  307.         return 0xFFFFFFFF;
  308.     }
  309.     nNumber = 0xFFFFFFFF; 
  310.     for (i = 0; i < KB_EPG_MAX_SCH; i++)
  311.     {
  312.         if (gEpgSchInfo[TsNum].nSchInfo[i].nEnable == TRUE)
  313.         {
  314.             nNumber = i;
  315.             break;
  316.         }
  317.     }
  318.     if (0xFFFFFFFF == nNumber)
  319.     {
  320.         for (i = 0; i < KB_EPG_MAX_SCH; i++)
  321.         {
  322.             EpgResetSCH(TsNum, i);
  323.         }
  324.         nNumber = 0;
  325.     }
  326.     
  327.     return nNumber;
  328. }
  329. KB_EPGDayInfo *KD_EPGGetSCH(UINT32 TsNum, INT32 nSvcID, INT32 nWeekday)
  330. {
  331. int i;
  332.     
  333.     if (TsNum >= KB_EPG_MAX_TS_NUM)
  334.     {
  335.         printf("nKD_EPGGetSCH::serious error! input TsNum(%d) is too large.",
  336.                 TsNum);
  337.         return NULL;
  338.     }
  339.     
  340. for(i=0; i<KB_EPG_MAX_SCH; i++)
  341. {        
  342. if(gEpgSchInfo[TsNum].nSchInfo[i].nSvcID == nSvcID)
  343. {
  344. return &gEpgSchInfo[TsNum].nSchInfo[i].nDayInfo[nWeekday];
  345. }
  346. }
  347.        return NULL;
  348. }
  349. static INT32 KD_EPGGetSchInfoNumByServiceId(UINT32 TsNum, UINT32 nSvcID)
  350. {
  351.     INT32 i, nNumber;
  352.     nNumber = 0xFFFFFFFF;
  353.     if (TsNum >= KB_EPG_MAX_TS_NUM)
  354.     {
  355.         printf("nKD_EPGGetSchInfoNumByServiceId::serious error! input TsNum(%d) is too large.",
  356.                 TsNum);
  357.         return 0xFFFFFFFF;
  358.     }
  359.     
  360.     for (i = 0; i < KB_EPG_MAX_SCH; i++)
  361.     {
  362.         if (gEpgSchInfo[TsNum].nSchInfo[i].nSvcID == nSvcID)
  363.         {
  364.             nNumber = i;
  365.             break;
  366.         }
  367.     }    
  368.     return nNumber;
  369. }
  370. static void EpgHandlerEvent(KB_OSPMsgNode *pInMsg)
  371. {
  372.     KB_OSPMsgNode msgNode;
  373.     KB_SIEitPF *ptEitPf;
  374.     KB_SIEitSch *ptEitSch = NULL;
  375. INT32 nNumber;
  376.     UINT32 CurrentTsNum;
  377.     CurrentTsNum = KB_EPG_GetCurrentTsNum();
  378.     if ((UINT32)(-1) == CurrentTsNum)
  379.     {
  380.         printf("nEpgHandlerEvent::CurrentTsNum ERROR!n");
  381.         return;
  382.     }
  383.     
  384.     switch (pInMsg->Word1)
  385.     {
  386.       case MOD_SIPSI:
  387.         
  388.         msgNode.Word1 = J_EPG_MODULE;
  389.         if (pInMsg->Word2 >= KB_SI_MSG_EIT_PF_DONE
  390.             && pInMsg->Word2 <= KB_SI_MSG_EIT_SCHEDULE_TIMEOUT)
  391.         {
  392.             switch (pInMsg->Word2)
  393.             {
  394.             case KB_SI_MSG_EIT_PF_DONE:
  395.                 ptEitPf = (KB_SIEitPF*)pInMsg->Word3;
  396.                 if (ptEitPf != NULL)
  397.                 {
  398.                     gEpgPFInfo.nState = EPG_Recieved;
  399.                 }
  400.                 ptEitPf = (KB_SIEitPF*)pInMsg->Word4;
  401.   KB_mb_PF_Update((KB_SIEitPF*)pInMsg->Word3,(KB_SIEitPF*)pInMsg->Word4);
  402.                 break;
  403.             case KB_SI_MSG_EIT_PF_TIMEOUT:
  404.                 ptEitPf = (KB_SIEitPF*)pInMsg->Word3;
  405.                 if (ptEitPf != NULL)
  406.                 {
  407.                   gEpgPFInfo.nState = EPG_Timeout;
  408.                 }
  409.                 break;
  410.                 
  411.             case KB_SI_MSG_EIT_SCHEDULE_EVENT_DONE:
  412.                 //EpgSortSCH((KB_SIEitSch *)pInMsg->Word3, pInMsg->Word4);
  413.                 break;
  414.                 
  415.             case KB_SI_MSG_EIT_SCHEDULE_DONE:
  416.   ptEitSch = (KB_SIEitSch*)pInMsg->Word3;
  417.                     EpgSortSCH(CurrentTsNum, ptEitSch, ptEitSch->num);
  418.                     //printf("nEpgHandlerEvent::epg_task get KB_SI_MSG_EIT_SCHEDULE_DONE, SrvId(%d), num(%d)",
  419.                            // pInMsg->Word4, ptEitSch->num);
  420.                 nNumber = KD_EPGGetSchInfoNumByServiceId(KB_EPG_GetCurrentTsNum(), 
  421.                                                                  pInMsg->Word4);
  422.                 if (nNumber != 0xFFFFFFFF)
  423.                 {                    
  424.                     gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nState = EPG_Recieved;
  425.                 }
  426.                      {
  427. KB_OSPMsgNode movie_msg;
  428. movie_msg.Word1=KB_MOVIE_SCHEDULE_CREATE;
  429. movie_msg.Word2=pInMsg->Word4;
  430. kb_machblue_task_post(&movie_msg);
  431. }
  432.                 break;
  433.             case KB_SI_MSG_EIT_SCHEDULE_TIMEOUT:
  434.                 nNumber = KD_EPGGetSchInfoNumByServiceId(KB_EPG_GetCurrentTsNum(), 
  435.                                                                  pInMsg->Word4);
  436.                 if (nNumber != 0xFFFFFFFF)
  437.                 {
  438.                     gEpgSchInfo[CurrentTsNum].nSchInfo[nNumber].nState = EPG_Timeout;
  439.                 }
  440.                 break;
  441.                 
  442.             default:
  443.                 break;
  444.             }
  445.             if (pInMsg->Word2 != KB_SI_MSG_EIT_SCHEDULE_EVENT_DONE)
  446.             {
  447.                 msgNode.Word2 = pInMsg->Word2 - KB_SI_MSG_EIT_PF_DONE;
  448.                 msgNode.Word3 = pInMsg->Word3;
  449.                 msgNode.Word4 = pInMsg->Word4;
  450.                 //EpgMsgDisPatch
  451.                 if (gpEpgCallback)
  452.                 {
  453.                     if (EPG_MSG_SCHEDULE_DONE == msgNode.Word2)
  454.                     {
  455.                         //printf("nEpgHandlerEvent::now send EPG_MSG_SCHEDULE_DONE to osd, SrvId(%d)",
  456.                         //        pInMsg->Word4);
  457.                     }
  458.                     gpEpgCallback(&msgNode);
  459.                 }   
  460.             }
  461.         }                
  462.         
  463.          break;
  464.       default:
  465.          break;
  466.     }
  467. }
  468. static INT32 EpgResetPF()
  469. {
  470.     gEpgPFInfo.nTsId        = 0xFFFFFFFF;    
  471.     gEpgPFInfo.nEnable      = TRUE;
  472.     gEpgPFInfo.nState       = EPG_Empty;
  473.     gEpgPFInfo.nSvcID   = 0xFFFFFFFF;
  474.     memset(gEpgPFInfo.pPresent, 0, sizeof(KB_SIEitPF));
  475.     memset(gEpgPFInfo.pFollow, 0, sizeof(KB_SIEitPF));
  476.     
  477.     return RETOK;
  478. }
  479. static INT32 EpgResetSCH(UINT32 nTsNum, INT32 nSrvNum)
  480. {
  481. UINT16   loop  =  0;
  482. if (nTsNum >= KB_EPG_MAX_TS_NUM)
  483. {
  484.     printf("nEpgResetSCH::serious error! nTsNum(%d) is too large!", nTsNum);
  485.     return RETFIAL1;
  486. }
  487. gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].nEnable      = TRUE;
  488. gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].nState       = EPG_Empty;
  489. gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].nSvcID   = 0xFFFFFFFF;
  490. if (gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].pDataStruct->num > KB_SI_MAX_EVENT_NUM_PER_SERVICE)
  491. {
  492. gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].pDataStruct->num = KB_SI_MAX_EVENT_NUM_PER_SERVICE;
  493. }
  494. for (loop = 0; loop < gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].pDataStruct->num; loop++)
  495. {
  496. if (NULL != (gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].pDataStruct->ptEvent + loop)->chinese.text)
  497. {
  498. KB_OSPFree((gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].pDataStruct->ptEvent + loop)->chinese.text);
  499. (gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].pDataStruct->ptEvent + loop)->chinese.text = NULL;
  500. }
  501. }
  502. gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].pDataStruct->num = 0;
  503. gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].pDataStruct->service_id = 65535;
  504. memset(gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].nDayInfo, 
  505.         0, 
  506.         sizeof(gEpgSchInfo[nTsNum].nSchInfo[nSrvNum].nDayInfo));
  507. return RETOK;
  508. }
  509. static void  EpgResetUnusedSCH(UINT32 TsNum, 
  510.                                    INT32  nSvcCnt, 
  511.                                            UINT32 *pSvcID)
  512. {
  513.     int i, j;
  514.     if (TsNum >= KB_EPG_MAX_TS_NUM)
  515.     {
  516.         printf("nEpgResetSCH::serious error! nTsNum(%d) is too large!", TsNum);
  517.         return;
  518.     }
  519.     for (i = 0; i < KB_EPG_MAX_SCH; i++)
  520.     {
  521.         for (j = 0; j < nSvcCnt; j++)
  522.         {
  523.             if (gEpgSchInfo[TsNum].nSchInfo[i].nSvcID == *(pSvcID + j))
  524.             {
  525.                 break;
  526.             }
  527.         }
  528.         if (j == nSvcCnt && gEpgSchInfo[TsNum].nSchInfo[i].nEnable == FALSE)
  529.         {
  530.             KB_SIStopEitSCH(gEpgSchInfo[TsNum].nSchInfo[i].nSvcID);            
  531.             EpgResetSCH(TsNum, i);
  532.         }
  533.     }
  534. }
  535. static void EpgHandleSI(KB_OSPMsgNode *pInMsg)
  536. {
  537.     KB_OSPMsgSend(gEpgQueID, pInMsg);
  538. }
  539. static INT32 EpgSortSCH(UINT32  TsNum,
  540.                            KB_SIEitSch *pSCHInfo, 
  541.                                              INT32 nEvtNum)
  542. {
  543.     //KB_OSPMsgNode msgNode;
  544. KB_SIEitSchEvent *pList;
  545. int i;
  546.     struct tm tmNow;
  547. time_t now;
  548. int count = 0,weekday = -1,index;
  549.     //KB_SIEitSchEvent *ptFirstList;
  550.     //struct tm tmFirst;
  551. //printf("-=service_id=%x, nEvtNum=%d=-n", pSCHInfo->service_id, nEvtNum);
  552. if(nEvtNum == 0)
  553.     {
  554.         printf("nEpgSortSCH::nEvtNum is NULL!");
  555. return RETFAIL3;
  556.     }
  557.     if (TsNum >= KB_EPG_MAX_TS_NUM)
  558.     {
  559.         printf("nEpgSortSCH::serious error.TsNum(%d) is too large", TsNum);
  560.     }
  561. pList = pSCHInfo->ptEvent;
  562. QuickSort(pList, 0, (int)nEvtNum-1);
  563. for(i=0;i<KB_EPG_MAX_SCH;i++)
  564. {
  565. if(gEpgSchInfo[TsNum].nSchInfo[i].nSvcID == (UINT32)pSCHInfo->service_id)
  566. {
  567. index = i;
  568. break;
  569. }
  570. }
  571. if(i == KB_EPG_MAX_SCH)
  572.     {
  573.         printf("nEpgSortSCH::serious error. SrvId proved to be not exist!");
  574. return RETFIAL1;
  575.     }
  576. for(i=0;i<nEvtNum;i++)
  577. {
  578.         now = KB_TimeGMTTime(pList[i].start_time);
  579.         tmNow = *localtime(&now);
  580. if(tmNow.tm_wday != weekday)
  581. {
  582. gEpgSchInfo[TsNum].nSchInfo[index].nDayInfo[tmNow.tm_wday].ptEvent = &pList[i];
  583. if(weekday != -1)
  584. {
  585. gEpgSchInfo[TsNum].nSchInfo[index].nDayInfo[weekday].nEventCount = count;
  586. count = 0;
  587. }
  588. weekday = tmNow.tm_wday; 
  589. }   
  590.         count++;
  591. }
  592. gEpgSchInfo[TsNum].nSchInfo[index].nDayInfo[weekday].nEventCount = count;
  593. /* msgNode.Word1 = J_EPG_MODULE;
  594.     msgNode.Word2 = EPG_MSG_SCHEDULE_EVENT_DONE;
  595.     msgNode.Word3 = count;//0;
  596.     msgNode.Word4 = gEpgSchInfo.nSchInfo[index].nSvcID;
  597.     if (gpEpgCallback)
  598.     {
  599.         gpEpgCallback(&msgNode);
  600.     }   
  601. */
  602.     return RETOK;
  603. }
  604. static void QuickSort(KB_SIEitSchEvent *pList, int nLow, int nHigh) 
  605. {
  606.     int nSort;                              
  607.     if (nLow < nHigh)
  608.     {
  609.         nSort = Partition(pList, nLow, nHigh);
  610.         QuickSort(pList, nLow, nSort-1);
  611.         QuickSort(pList, nSort+1, nHigh);
  612.     }
  613. }
  614. static int Partition(KB_SIEitSchEvent *pList, int nLow, int nHigh)
  615. {
  616.     KB_SIEitSchEvent nSort;
  617.     UINT8 text[KB_SI_MAX_EVENT_TEXT_LEN + 1];
  618.     time_t PivotKey,TempKey;
  619.     int low,high;
  620.     nSort.chinese.text = text;
  621.     
  622.     low = nLow;
  623.     high = nHigh;
  624.     nSort = pList[nLow];
  625.     PivotKey = nSort.start_time;
  626.     
  627.     while (low < high)
  628.     {
  629.         TempKey = pList[high].start_time;
  630.      while (low<high && TempKey >=PivotKey)
  631.      {
  632.      --high;               
  633.             TempKey = pList[high].start_time;
  634.      }
  635.         pList[low] = pList[high];
  636.         TempKey = pList[low].start_time;
  637.      while (low<high && TempKey<=PivotKey)
  638.      {
  639.      ++low;
  640.             TempKey = pList[low].start_time;
  641.      }
  642.         pList[high] = pList[low];
  643.     }
  644.     
  645.     pList[low] = nSort;
  646.     return low; 
  647. }
  648. INT32 KB_EPGToNvod(INT32 nMute)
  649. {
  650.     if (nMute == TRUE || nMute == FALSE)
  651.     {
  652.         gEpgToNvod = nMute;
  653.     }
  654.     return RETOK;
  655. }
  656. void* KB_EPGGetMemAddress(void)
  657. {
  658.     return gEpgSCHEvent;
  659. }
  660. INT32 KB_EPGInit(void)
  661. {
  662.     INT32 nReturn;
  663.     
  664.     nReturn = KD_EPGTaskInit();
  665.     return nReturn;
  666. }
  667. INT32 KB_EPGCreate(void)
  668. {
  669.     KB_SIGetTime(&epgTime);       
  670.     KB_EpgCallBack(EpgMsgDisPatch);
  671.     return RETOK;
  672. }
  673. INT32 KB_EPGDestroy(void)
  674. {
  675.     return RETOK;
  676. }
  677. static void EpgMsgDisPatch(KB_OSPMsgNode *pInMsg)
  678. {
  679. KB_MENUTranslateMsg(pInMsg);
  680. }
  681. static void KD_EpgTask(void)
  682. {
  683.     int i, nReturn;
  684.     KB_OSPMsgNode msgNode;
  685.     i = 1;
  686.     while (i)
  687.     {
  688.         nReturn = KB_OSPMsgGet(gEpgQueID, KB_Wait, 0, &msgNode);
  689.         if (nReturn != Ret_OK)
  690.         {
  691.             continue;
  692.         }        
  693.         if (gEpgToNvod)
  694.         {
  695.             KD_NVODHandleMsg2(&msgNode);
  696.         }
  697.         else
  698.         {
  699.             EpgHandlerEvent(&msgNode);
  700.         }
  701.     }
  702. }
  703. KB_EPGDayInfo *KB_EPGGetSchInfo(UINT16 TsId, INT32 nSvcID, INT32 nWeekday)
  704. {
  705.     UINT32 TsNum;
  706.     
  707.     TsNum = KB_EPG_GetTsNumFromTsId(TsId);
  708.     
  709.     if ((UINT32)(-1) == TsNum)
  710.     {
  711.         return NULL;
  712.     }
  713.     else
  714. {
  715.         return KD_EPGGetSCH(TsNum, nSvcID, nWeekday);
  716.     }
  717. }
  718. INT32 KB_EPGHandleMsg(KB_OSPMsgNode *pInMsg)
  719. {
  720.    switch (pInMsg->Word1)
  721.     {
  722.       case MOD_SIPSI:
  723.         {
  724. switch(pInMsg->Word2)
  725. {
  726. case KB_SI_MSG_TDT_DONE:
  727. KB_TimeSetCurTime(*((time_t*)pInMsg->Word3));
  728. }
  729. break;
  730. }
  731.  }
  732.         KB_DTVHandleMsg(pInMsg);
  733.         break;
  734.     case MOD_TUNER:
  735.         KB_DTVAVHandleMsg(pInMsg);
  736.         break;
  737.         
  738.     default:
  739.         break;
  740.     }
  741.     return RETOK;    
  742. }
  743. UINT32 KB_EPGGetPrgSCH(unsigned short nPrgType,unsigned short i_nChannel)
  744. {
  745. INT32 nSvcID[KB_EPG_MAX_SCH] = {0};
  746.     INT32  nSvcID2;
  747.     UINT16 nTsID;
  748.     UINT32 nFreq;
  749.     UINT32 nSymbol;
  750.     UINT8  qamtype;
  751.     if (0 == KB_DBGetPrgTotal((UINT8)nPrgType))
  752.     {
  753.         printf("nKB_EPGGetPrgSCH::KB_DBGetPrgTotal return 0. No Services, no search!");
  754.         return -1;
  755.     }
  756. nSvcID[0] = KB_DBGetSvcIDByNO(nPrgType, i_nChannel - 1);
  757.    if (nSvcID[0] != KB_DB_INVALID_PROGRAMNO)
  758.     {
  759.     KB_DBGetChnlInfoByPrgNO(nPrgType, i_nChannel, &nFreq, &nSymbol,  &qamtype);         
  760.     KB_DBGetTsIDByFre(&nTsID, nFreq / 100000);
  761.     nSvcID2 = KB_DBGetSvc2_TSID(nTsID, nPrgType, 
  762.                                     &nSvcID[1], KB_EPG_MAX_SCH - 1,
  763.                                     &nSvcID[0], 1);
  764.         KB_EPGGetSch((UINT32)nTsID, nSvcID2 + 1, (UINT32*)nSvcID);
  765.     }
  766. return nSvcID[0];
  767. }
  768. UINT32 KB_EPG_GetCurrentTsNum(void)
  769. {
  770.     int i;
  771.     for(i = 0; i < KB_EPG_MAX_TS_NUM; i++)
  772.     {
  773.         if (TRUE == gEpgSchInfo[i].nCurrentTsTag)
  774.         {
  775.             return i;
  776.         }
  777.     }
  778.     return (UINT32)(-1);
  779. }
  780. #if 0
  781. void KB_EPG_CurrentInfo(void)
  782. {
  783.     int i, j;
  784.     for (i = 0; i < 7; i++)
  785.     {
  786.         printf("nn----------Srv(%d), totalNum(%d)------------", i, gEpgSchInfo[KB_EPG_GetCurrentTsNum()].nSchInfo[i].pDataStruct->num);
  787.         for (j = 0; j < 7; j++)
  788.         {
  789.             printf("n-----day(%d), EventNum(%d)", j, gEpgSchInfo[KB_EPG_GetCurrentTsNum()].nSchInfo[i].nDayInfo[j].nEventCount);
  790.         }
  791.     }
  792.     return;
  793. }
  794. #endif
  795. UINT32 KB_EPG_GetTsNumFromTsId(UINT16 TsId)
  796. {
  797.     int i;
  798.     for(i = 0; i < KB_EPG_MAX_TS_NUM; i++)
  799.     {
  800.         if (TsId == (UINT16)gEpgSchInfo[i].nTsId)
  801.         {
  802.             return i;
  803.         }
  804.     }
  805.     return (UINT32)(-1);
  806. }
  807. UINT32 KB_EPG_GetTsIdFromTsNum(UINT32 TsNum)
  808. {
  809.     if (TsNum < KB_EPG_MAX_TS_NUM)
  810.     {
  811.         return gEpgSchInfo[TsNum].nTsId;
  812.     }
  813.     else
  814.     {
  815.         printf("nKB_EPG_GetTsIdFromTsNum::input error TsNum(%d)", TsNum);
  816.         return 0xFFFFFFFF;
  817.     }
  818. }
  819. //当其他模块切换ts流的时候,要记得通知EPG设置当前流标志
  820. INT32 KB_EPG_SetCurrentTsNum(UINT32 TsId)
  821. {
  822.     UINT8  i;
  823.     UINT32 preTsNum, NowTsNum;
  824.     preTsNum = KB_EPG_GetCurrentTsNum();
  825.     
  826.     //将原当前流标志修改;如果是第一次搜索,当前流还没有设置
  827.     if ((UINT32)(-1) != preTsNum)
  828.     {
  829.         gEpgSchInfo[preTsNum].nCurrentTsTag = FALSE;
  830.     }
  831.     for (i = 0; i < KB_EPG_MAX_TS_NUM; i++)
  832.     {
  833.         if (gEpgSchInfo[i].nTsId == TsId)
  834.         {
  835.             //该ts流已经申请了gEpgSchInfo,修改当前流标志后return
  836.             gEpgSchInfo[i].nCurrentTsTag = TRUE;
  837.             return RET_OK;
  838.         }
  839.     }
  840.     //该ts流未申请gEpgSchInfo
  841.     NowTsNum = KB_EPG_GetFreeEpgSchInfo();
  842.     
  843.     if (0xFF == NowTsNum)
  844.     {
  845.         printf("nKB_EPG_SetCurrentTsNum::KB_EPG_GetFreeEpgSchInfo fail!n");
  846.         return RET_FAIL;
  847.     }
  848.     else
  849.     {
  850.         gEpgSchInfo[NowTsNum].nTsId         = TsId;
  851.         gEpgSchInfo[NowTsNum].nCurrentTsTag = TRUE;
  852.         return RET_OK;
  853.     }
  854.     
  855. }
  856. static UINT8 KB_EPG_GetFreeEpgSchInfo(void)
  857. {
  858.     UINT8 i, ret = 0xFF;
  859.     
  860.     for (i = 0; i < KB_EPG_MAX_TS_NUM; i++)
  861.     {
  862.         if (0xFFFFFFFF == gEpgSchInfo[i].nTsId)
  863.         {
  864.             ret = i;
  865.             break;
  866.         }
  867.     }
  868.     return ret;
  869. }
  870. void KB_EPG_ResetSchInfoByTsid(UINT16 TsId)
  871. {
  872.     UINT8  i = 0;
  873.     UINT8  j = 0;
  874.     UINT32 TsIndex = 0xffffffff;
  875.     //对全体复位的预先处理
  876.     if (0xffff == TsId)
  877.     {
  878.         for (i = 0; i < KB_EPG_MAX_TS_NUM; i++)
  879.         {
  880.             for (j = 0; j < KB_EPG_MAX_SCH; j++)
  881.             {
  882.                 EpgResetSCH(i, j);
  883.             }
  884.         }
  885.         return;
  886.     }
  887.     TsIndex = KB_EPG_GetTsNumFromTsId(TsId);
  888.     if (TsIndex >= KB_EPG_MAX_TS_NUM)
  889.     {
  890.         printf("nKB_EPG_ResetSchInfoByTsid::input tsid(%d) donot register in gEpgSchInfo");
  891.         return;
  892.     }
  893.     for (i = 0; i < KB_EPG_MAX_SCH; i++)
  894.     {
  895.         EpgResetSCH(TsIndex, i);
  896.     }
  897.     
  898.     return;
  899. }
  900. UINT16 KB_EPG_GetCurrentTsid(void)
  901. {
  902.     UINT16 CurTsid = 0xffff;
  903.     UINT32 TmpTsid = 0xffffffff;
  904.     UINT32 EpgTsIndex = 0xffffffff;
  905.     
  906.     if (0 == CurrentSignal.frequency
  907.         || RET_OK != KB_DBGetTsIDByFre(&CurTsid, CurrentSignal.frequency))
  908.     {
  909.         printf("nKB_EPG_GetCurrentTsid::CurrentSignal fre(%ld) error", 
  910.                 CurrentSignal.frequency);
  911.         return 0xffff;
  912.     }
  913.     
  914.     EpgTsIndex = KB_EPG_GetCurrentTsNum();
  915.     TmpTsid = KB_EPG_GetTsIdFromTsNum(EpgTsIndex);
  916.     if (0xffffffff == TmpTsid || TmpTsid != (UINT32)CurTsid)
  917.     {
  918.         KB_EPG_SetCurrentTsNum((UINT32)CurTsid);
  919.     }
  920.     
  921.     return CurTsid;
  922. }
  923. /* EOF */