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

DVD

开发平台:

C/C++

  1. #include <stdio.h> 
  2. #include <string.h>
  3. #include "gendef.h"
  4. #include "dmd.h"
  5. #include "osp.h"
  6. #include "sipsi.h"
  7. #include "appltype.h"
  8. #include "db.h"
  9. #include "db.h"
  10. #include "search.h"
  11. #include "flash.h"
  12. #include "avplay.h"
  13. #include "kb_dc.h"
  14. #include "kb_machblue_client_task.h"
  15. INT32 g_srchMode;
  16. KB_SINitStruct  g_srchNit;
  17. KB_SISdtStruct  g_srchSDT[100];
  18. KB_SIPatStruct  g_srchPAT;
  19. KB_SIPmtStruct  g_srchPMT;
  20. KB_DBPrgNode     gSrchPrg[KB_DB_MAX_PGM_NODE];
  21. static T_SEARCH_PARA gSrchApp;         
  22. enum
  23. {
  24. SrchPat,
  25. SrchSDT,
  26. SrchPMT
  27. };
  28. struct HintDisplay_struct
  29. {
  30.     char *info;
  31.     char *englishinfo;
  32.     unsigned char hinttype;
  33.     unsigned char index;
  34. }_HintDisplay[];
  35. //}_HintDisplay[] =
  36. //{
  37. // {"信号不良", "Weak signal", 0, KB_SEARCH_HINT1},
  38. //};
  39. static INT32 g_WholeNetFreqs[] =
  40. {
  41. 107, 115, 123, 131, 139, 147, 155, 163, 171, 179, 187, 195, 203, 211,
  42. 219, 227, 235, 243, 251, 259, 267, 275, 283, 291, 299, 307, 315, 323, 
  43. 331, 339, 347, 355, 363, 371, 379, 387, 395, 403, 411, 419, 427, 435, 
  44. 443, 451, 459, 467, 474, 482, 490, 498, 506, 514, 522, 530, 538, 546, 
  45. 554, 562, 570, 578, 586, 594, 602, 610, 618, 626, 634, 642, 650, 658, 
  46. 666, 674, 682, 690, 698, 706, 714, 722, 730, 738, 746, 754, 762, 770, 
  47. 778, 786, 794, 802, 810, 818, 826, 834, 842, 850, 858
  48. };
  49. //#define WHOLE_NET_FREQ_SUM  (95)
  50. static int _iRefSvcNums;
  51. static KB_SIRefSvcCell _astNvodCell[KB_SI_MAX_REF_SVC_NUMS];
  52. static int _iTotalShiftSvcNums;
  53. //static unsigned long _alShiftSvc[KB_SI_MAX_REF_SVC_NUMS * KB_SI_MAX_SHIFT_SVC_NUMS];
  54. static UINT16 bCurrentFreqDtvNum;
  55. static UINT16 bCurrentFreqMusicNum;
  56. static KB_DMDTunerParameters gSrchFre[WHOLE_NET_FREQ_SUM];
  57. static UINT8 gSrchFreInx = 0;
  58. static UINT8 gSrchFreNum =0 ;
  59. static UINT32 gSrchTaskID;
  60. static UINT32 gSrchQueID;
  61. enum{PMTPID_GET_FIRST, PMTPID_GET_NEXT};
  62. static unsigned short KD_GetPmtPid(unsigned short i_nCallOpt, unsigned short * pmtPid, 
  63.                              unsigned short * pmtPgmno);
  64. static void KD_SRCHHandleNit(void);
  65. static void KD_SrchNvodInit(void);
  66. static void KD_SrchHandleNovd(KB_SISdtStruct * i_pstSdt, int i_nNum);
  67. static void KD_SrchAdjustNvod(void);
  68. static void KD_SrchDis(UINT32 nPara1, UINT32 nPara2, UINT8 nDisTypeEx, 
  69.                          UINT8 nDisType);
  70. static void  KD_SrchTask(void);
  71. static INT32 KD_SrchHandleMsg(KB_OSPMsgNode *i_pstMsg);
  72. static void KD_SrchToNext(void);
  73. static void KD_SrchSetFre(UINT8 srchMode);
  74. static void KD_SrchSaveResult(void);
  75. static void KD_Srchend(void);
  76. INT32 KB_SEARCHInit(void)
  77. {
  78.     int nReturn;
  79.     
  80. gSrchApp.tsParams.frequency = 0;
  81. gSrchApp.tsParams.details.qam.symbolRatekSs      = 0;
  82. gSrchApp.tsParams.details.qam.modulation      = 0;
  83. gSrchApp.srchMode  = KB_SEARCH_IN_NET;
  84. gSrchApp.srchState = KB_SEARCH_UNACTIVE;
  85. gSrchApp.pat         = NULL;
  86. gSrchApp.pmtCpt      = KB_DB_DTV_FAILURE;
  87.     gSrchApp.sdtCpt      = KB_DB_DTV_FAILURE;
  88. gSrchApp.nitCpt      = KB_DB_DTV_FAILURE;
  89. gSrchApp.dtvNum   = 0;
  90. gSrchApp.radNum   = 0;
  91. gSrchApp.svcIDnum = 0;
  92. memset(gSrchFre,0,sizeof(gSrchFre));
  93. gSrchFreInx = 0;          
  94. gSrchFreNum =0 ;          
  95.     nReturn = KB_OSPQueInit("SEAQ", 64, &gSrchQueID);
  96.     if (nReturn != Ret_OK)
  97.     {
  98.         return RETFIAL1;
  99.     }
  100.     
  101.     nReturn = KB_OSPTaskInit("SEAT", 64 * 1024, (void (*)(void*))KD_SrchTask, 
  102.                        SEARCH_PRIORITY, NULL, &gSrchTaskID);
  103.     if (nReturn != Ret_OK)
  104.     {
  105.         return RETFIAL1;
  106.     }
  107.     return RETOK;
  108. }
  109. static void KD_SrchTask(void)
  110. {
  111.     KB_OSPMsgNode msgNode;
  112.     int nReturn;
  113.     while (1)
  114.     {
  115.         nReturn = KB_OSPMsgGet(gSrchQueID, KB_Wait, 0, (KB_OSPMsgNode *)&msgNode);
  116. if(nReturn != Ret_OK)
  117. {            
  118. continue;
  119. }
  120.         KD_SrchHandleMsg(&msgNode);
  121.     }
  122. }
  123. void KB_SEARCHCreate(void)
  124. {
  125. gSrchApp.srchState = KB_SEARCH_WAITING_CNT;
  126. gSrchApp.pat         = NULL;
  127. gSrchApp.pmtCpt      = KB_DB_DTV_FAILURE;
  128.     gSrchApp.sdtCpt      = KB_DB_DTV_FAILURE;
  129. gSrchApp.nitCpt      = KB_DB_DTV_FAILURE;
  130. gSrchApp.dtvNum   = 0;
  131. gSrchApp.radNum   = 0;
  132. gSrchApp.svcIDnum = 0;
  133. memset(gSrchFre,0,sizeof(gSrchFre));
  134. gSrchFreInx = 0;
  135. gSrchFreNum = 0;
  136. KB_DBE2pCfgInfoRefresh(DTVPRG);
  137. KB_DBE2pCfgInfoRefresh(RADIOPRG);
  138. KB_DBE2pCfgInfoRefresh(DATAPRG);
  139. switch(gSrchApp.srchMode)
  140. {
  141. case KB_SEARCH_IN_TS://手动
  142. KB_DBGetAllPrgConfig();
  143. break;
  144. case KB_SEARCH_IN_NET:
  145. case KB_SEARCH_IN_WHOLE_NET:
  146. KB_DBResetDtvInfo(BufferSave);
  147. KB_DBResetRadInfo(BufferSave);
  148. KB_DBResetDataInfo(BufferSave);
  149. KB_DBResetChnnlInfo(BufferSave);
  150. KB_FlashErase(KB_DB_SECTOR);
  151. KD_SrchNvodInit();     
  152. break;
  153. default:
  154. break;
  155. }
  156.     KD_SrchSetFre(gSrchApp.srchMode);
  157. if (gSrchApp.srchMode != KB_SEARCH_IN_NET)
  158. {
  159. KD_SrchToNext();
  160. }
  161. }
  162. void KB_SEARCHSetPara(unsigned char i_cSearchMode,
  163.    unsigned long i_lFreq, unsigned long i_lSymb, 
  164.    unsigned short i_nQam)
  165. {
  166. if(i_cSearchMode == KB_SEARCH_IN_WHOLE_NET) 
  167. {
  168. gSrchApp.srchMode = KB_SEARCH_IN_WHOLE_NET;
  169. g_srchMode = KB_SEARCH_IN_WHOLE_NET;
  170. }
  171. else 
  172. {
  173. gSrchApp.tsParams.type = DMD_TYPE_QAM;
  174.        gSrchApp.tsParams.inversion = INVERSION_AUTO;
  175. gSrchApp.tsParams.frequency = i_lFreq;
  176. gSrchApp.tsParams.details.qam.symbolRatekSs = i_lSymb;
  177. gSrchApp.tsParams.details.qam.modulation = (unsigned char)i_nQam;
  178. if(i_cSearchMode == KB_SEARCH_IN_TS)
  179. {
  180. gSrchApp.srchMode = KB_SEARCH_IN_TS;
  181. g_srchMode = KB_SEARCH_IN_TS;
  182. }
  183. else
  184. {
  185. gSrchApp.srchMode = KB_SEARCH_IN_NET;
  186. g_srchMode = KB_SEARCH_IN_NET;
  187. }
  188. }
  189. }
  190. INT32 KB_SEARCHHandleMsg(KB_OSPMsgNode *i_pstMsg)
  191. {
  192.     int nReturn;
  193.     nReturn = KB_OSPMsgSend(gSrchQueID, i_pstMsg);
  194.     return RETOK;
  195. }
  196. void KD_SrchParseInit(unsigned short i_lFreq, unsigned short i_lSymb, 
  197.  unsigned char i_lQam)
  198. {
  199. unsigned short loop;
  200. for(loop = 0; loop < KB_DB_MAX_PGM_NODE; loop ++)
  201. {
  202. gSrchPrg[loop].freq = i_lFreq;
  203. gSrchPrg[loop].symb = i_lSymb;
  204. gSrchPrg[loop].qam  = i_lQam;
  205. gSrchPrg[loop].PATVersion = KB_DB_UNKNOWN_VERSION;
  206. gSrchPrg[loop].SDTVersion = KB_DB_UNKNOWN_VERSION;
  207. gSrchPrg[loop].PMTVersion = KB_DB_UNKNOWN_VERSION;
  208. }
  209. }
  210. void KD_SrchParseTable(unsigned char i_cTableType, void * i_pstTable, 
  211.  unsigned short i_nSvcNum)
  212. {
  213. KB_SIPatStruct    * pat;
  214. KB_SISdtStruct    * sdt;
  215. KB_SIPmtStruct    * pmt;
  216. int len;
  217. unsigned short i, j; 
  218. switch(i_cTableType)
  219. {
  220. case SrchPat:
  221. pat = (KB_SIPatStruct *)i_pstTable;
  222. for(j=0; j<i_nSvcNum; j++)
  223. {
  224.          for(i = 0; i < pat->num; i ++)
  225. {
  226. if (gSrchPrg[j].SerID == pat->program[i].program_number)
  227. {
  228.      gSrchPrg[j].PATVersion = pat->version_number;
  229.      gSrchPrg[j].PMTPid     = pat->program[i].program_map_PID;
  230. break;
  231. }
  232. }
  233. }
  234. break;
  235. case SrchSDT:
  236. sdt = (KB_SISdtStruct *)i_pstTable;
  237. for(i = 0; i < i_nSvcNum; i ++)
  238. {
  239. len = strlen((char*)sdt[i].chinese.service_name);
  240. if(len >= 20)
  241. {
  242. len = 18;
  243. }
  244. if(sdt[i].chinese.service_name[0] != '')
  245. {
  246. memcpy(gSrchPrg[i].name, sdt[i].chinese.service_name, len); 
  247. }
  248. else
  249. {
  250. if(sdt[i].english.service_name[0] != '')
  251. {
  252. memcpy(gSrchPrg[i].name, sdt[i].english.service_name, len); 
  253. }
  254. else
  255. {
  256. strcpy(gSrchPrg[i].name, "数字电视");   
  257. }
  258. }
  259. gSrchPrg[i].name[len ] = '';
  260. gSrchPrg[i].name[len + 1 ] = '';
  261. gSrchPrg[i].SDTVersion   = sdt[i].version_number;
  262. gSrchPrg[i].service_type = sdt[i].service_type; 
  263. //printf("-=gSrchPrg[%d].service_type=0x%x=-n", i, gSrchPrg[i].service_type);
  264. gSrchPrg[i].SerID= sdt[i].service_id;
  265. gSrchPrg[i].TSID         = sdt[i].TSID;
  266. }
  267. break;
  268. case SrchPMT:
  269. pmt = (KB_SIPmtStruct *)i_pstTable;
  270. for(i = 0; i < i_nSvcNum; i ++)
  271. {
  272. if(gSrchPrg[i].SerID== pmt->program_number) 
  273. {
  274. unsigned short loop;
  275. gSrchPrg[i].PCR_Pid    = pmt->PCR_PID;
  276. gSrchPrg[i].PMTVersion = pmt->version_number;
  277. if(pmt->CA_descriptor_buffer_len == 0)
  278. {
  279. gSrchPrg[i].bCAFlag = KB_DB_PGM_UNENCRYPT;
  280. }
  281. else
  282. {
  283. gSrchPrg[i].bCAFlag = KB_DB_PGM_ENCRYPT;
  284. }
  285. gSrchPrg[i].Audio_Pid = 0;
  286. gSrchPrg[i].Video_Pid = 0;
  287.                 for(loop = 0; loop < pmt->num; loop ++)
  288. {
  289. switch(pmt->stream[loop].stream_type)
  290. {
  291. case 1:
  292. case 2:
  293. if(gSrchPrg[i].Video_Pid != 0)
  294. {
  295. break;
  296. }
  297. gSrchPrg[i].Video_Pid = pmt->stream[loop].elementary_PID;
  298. if(pmt->stream[loop].CA_descriptor_buffer_len > 0)
  299. {
  300. gSrchPrg[i].bCAFlag = KB_DB_PGM_ENCRYPT;
  301. }
  302. break;
  303. case 3:
  304. case 4:
  305. if(gSrchPrg[i].Audio_Pid != 0) 
  306. {
  307. break;
  308. }
  309. gSrchPrg[i].Audio_Pid = pmt->stream[loop].elementary_PID;
  310. if(pmt->stream[loop].CA_descriptor_buffer_len > 0)
  311. {
  312. gSrchPrg[i].bCAFlag = KB_DB_PGM_ENCRYPT;
  313. }
  314. break;
  315. default :
  316. break;
  317. }
  318. }
  319. break;
  320. }
  321. }
  322. break;
  323. default:
  324. break;
  325. }
  326. }
  327. static INT32  KD_SrchHandleMsg(KB_OSPMsgNode *i_pstMsg)
  328. {
  329. switch(i_pstMsg->Word1)
  330. {
  331. case MOD_TUNER:
  332. //printf("-=MOD_TUNER:i_pstMsg->Word2=%d=-n", i_pstMsg->Word2);
  333. switch(i_pstMsg->Word2)
  334. {
  335. case DMD_CALLBACK_SIGNAL_CONNECTED:
  336. if (((gSrchApp.srchState == KB_SEARCH_WAITING_CNT)
  337.      && (gSrchApp.srchMode != KB_SEARCH_IN_NET))
  338. || ((gSrchApp.srchState == KB_SEARCH_WAITING_CNT)
  339.     && (gSrchApp.srchMode == KB_SEARCH_IN_NET)
  340.     && (gSrchApp.nitCpt == KB_DB_DTV_SUCCESS )))
  341. {
  342. KB_SIGetSdt(-1, 100, g_srchSDT, KB_SI_RECEIVE_ONCE, -1);
  343. gSrchApp.srchState = KB_SEARCH_WAITING_SDT;
  344. }
  345. break;
  346. case DMD_CALLBACK_SIGNAL_LOST:   //丢失连接
  347. if((gSrchApp.srchState == KB_SEARCH_WAITING_CNT) 
  348. || (gSrchApp.srchState == KB_SEARCH_WAITING_PAT) 
  349. || (gSrchApp.srchState == KB_SEARCH_WAITING_SDT)
  350. || (gSrchApp.srchState == KB_SEARCH_WAITING_PMT)
  351. || (gSrchApp.srchState == KB_SEARCH_WAITING_NIT)) 
  352. {
  353. if ((gSrchApp.srchMode == KB_SEARCH_IN_TS)
  354. /*|| ((gSrchApp.srchMode == KB_SEARCH_IN_NET)
  355.           && (gSrchApp.nitCpt != KB_DB_DTV_SUCCESS ))*/)
  356. {
  357.                  KD_SrchDis(0, 0, KB_SEARCH_HINT0, KB_SEARCH_DIS_HELPHINT);
  358. gSrchApp.srchState = KB_SEARCH_WAITING_EXIT;
  359. }
  360. else if (/*(gSrchApp.srchMode == KB_SEARCH_IN_TS)
  361. || */((gSrchApp.srchMode == KB_SEARCH_IN_NET)
  362.           && (gSrchApp.nitCpt != KB_DB_DTV_SUCCESS )))
  363. {
  364. KD_SrchDis(0, 0, KB_SEARCH_HINT1, KB_SEARCH_DIS_HELPHINT);
  365. gSrchApp.srchState = KB_SEARCH_WAITING_EXIT;
  366. }
  367. else
  368. {
  369. //added by whale 07/03/04
  370. KD_SrchDis(0, 0, KB_SEARCH_HINT2, KB_SEARCH_DIS_HELPHINT);
  371. KD_SrchToNext();
  372. }
  373. }
  374. break;
  375. default:
  376. break;
  377. }
  378. break;
  379. case MOD_SIPSI:
  380. //printf("-=MOD_SIPSI:i_pstMsg->Word2=%d=-n", i_pstMsg->Word2);
  381. switch(i_pstMsg->Word2)
  382. {
  383. case KB_SI_MSG_NIT_DONE:  
  384.   if ((gSrchApp.srchState == KB_SEARCH_WAITING_NIT)
  385. && (gSrchApp.srchMode == KB_SEARCH_IN_NET))
  386. {  
  387.   gSrchApp.nitCpt = KB_DB_DTV_SUCCESS;
  388. KD_SRCHHandleNit();
  389. KD_SrchToNext();
  390. }
  391. break;
  392. case KB_SI_MSG_NIT_TIMEOUT:           
  393.   if ((gSrchApp.srchState == KB_SEARCH_WAITING_NIT)
  394. && (gSrchApp.srchMode == KB_SEARCH_IN_NET))
  395. {
  396.                  KD_SrchDis(0, 0, KB_SEARCH_HINT3, KB_SEARCH_DIS_HELPHINT);
  397. gSrchApp.srchState = KB_SEARCH_WAITING_EXIT;
  398. }
  399. break;
  400. case KB_SI_MSG_PAT_DONE:      
  401. if(gSrchApp.srchState == KB_SEARCH_WAITING_PAT)
  402. {
  403. unsigned short ret, pmtPid, pmtPgmno;
  404. KB_DBRET dbRet;
  405. //KB_SIPmtStruct *pPmt=NULL;
  406. gSrchApp.pat = (KB_SIPatStruct *)i_pstMsg->Word3;
  407. KD_SrchParseTable(SrchPat, (void *)i_pstMsg->Word3, 
  408.                     gSrchApp.svcIDnum);
  409. dbRet = KB_DBSaveChlPatVer(
  410. (UINT16)(gSrchFre[gSrchFreInx-1].frequency / 100),
  411. (UINT16)gSrchApp.pat->version_number);
  412. if (KB_SEARCH_IN_TS == gSrchApp.srchMode)
  413. {
  414. KD_SrchDis(60, 0, KB_SEARCH_DISABLED, KB_SEARCH_DIS_PLANHINT);
  415. }
  416. ret = KD_GetPmtPid(PMTPID_GET_FIRST, &pmtPid, &pmtPgmno);
  417. if(ret != KB_DB_DTV_SUCCESS)    
  418. {
  419. KD_SrchToNext();
  420. }
  421. else
  422. {
  423. KB_SIGetPmt(pmtPid, pmtPgmno, &g_srchPMT,KB_SI_RECEIVE_ONCE, -1);
  424. gSrchApp.srchState = KB_SEARCH_WAITING_PMT;
  425. }
  426. }
  427. break;
  428. case KB_SI_MSG_PAT_TIMEOUT:
  429. if(gSrchApp.srchState == KB_SEARCH_WAITING_PAT)
  430. {
  431. KD_SrchDis(0, 0, KB_SEARCH_HINT4, KB_SEARCH_DIS_HELPHINT);
  432. KD_SrchToNext();
  433. }
  434. break;
  435. case KB_SI_MSG_SDT_DONE:
  436. if(gSrchApp.srchState == KB_SEARCH_WAITING_SDT)
  437. {
  438. KB_SISdtStruct        *pSdt;
  439. //KB_SIPatStruct        *pPat;
  440. KB_DBRET  ret;
  441. gSrchApp.sdtCpt = KB_DB_DTV_SUCCESS;
  442.       gSrchApp.srchState = KB_SEARCH_WAITING_PAT;
  443.   pSdt = (KB_SISdtStruct *)i_pstMsg->Word3;
  444.                 
  445. gSrchApp.svcIDnum = (UINT16)i_pstMsg->Word4;
  446. KD_SrchParseTable(SrchSDT, (void *)i_pstMsg->Word3,
  447.                 gSrchApp.svcIDnum);
  448.         ret = KB_DBSaveChlInfo(0,pSdt->OrgNetID,pSdt->TSID,
  449. (UINT16)(gSrchFre[gSrchFreInx-1].frequency / 100),
  450. (UINT16)gSrchFre[gSrchFreInx-1].details.qam.symbolRatekSs,
  451.         gSrchFre[gSrchFreInx-1].details.qam.modulation);
  452. ret = KB_DBSaveChlSdtVer(
  453. (UINT16)(gSrchFre[gSrchFreInx-1].frequency / 100),
  454. (UINT16)pSdt->version_number);
  455. KD_SrchHandleNovd((KB_SISdtStruct *)i_pstMsg->Word3, (int)i_pstMsg->Word4);
  456. KB_SIGetPat(&g_srchPAT, KB_SI_RECEIVE_ONCE, -1);
  457. if (KB_SEARCH_IN_TS == gSrchApp.srchMode)
  458. {
  459. KD_SrchDis(30, 0, KB_SEARCH_DISABLED, KB_SEARCH_DIS_PLANHINT);
  460. }
  461. }
  462. break;
  463. case KB_SI_MSG_SDT_TIMEOUT:  
  464. if(gSrchApp.srchState == KB_SEARCH_WAITING_SDT)
  465. {
  466. KD_SrchDis(0, 0, KB_SEARCH_HINT6, KB_SEARCH_DIS_HELPHINT);
  467. KD_SrchToNext();
  468. }
  469. break;
  470. case KB_SI_MSG_PMT_TIMEOUT:
  471. if (gSrchApp.srchState == KB_SEARCH_WAITING_PMT)
  472. {
  473. KD_SrchDis(0, 0, KB_SEARCH_HINT5, KB_SEARCH_DIS_HELPHINT);
  474. }
  475. case KB_SI_MSG_PMT_DONE:  
  476. if (gSrchApp.srchState == KB_SEARCH_WAITING_PMT)
  477. {
  478. unsigned short ret, pmtPid, pmtPgmno;
  479. if (i_pstMsg->Word2 == KB_SI_MSG_PMT_DONE)
  480. {
  481. KD_SrchParseTable(SrchPMT, (void *)i_pstMsg->Word3, 
  482.                 gSrchApp.svcIDnum);
  483. }
  484. ret = KD_GetPmtPid(PMTPID_GET_NEXT, &pmtPid, &pmtPgmno);
  485. if(ret != KB_DB_DTV_SUCCESS)
  486. {
  487. gSrchApp.pmtCpt = KB_DB_DTV_SUCCESS;
  488. KD_SrchAdjustNvod();
  489. KD_SrchSaveResult();
  490. KD_SrchToNext();
  491. }
  492. else
  493. {
  494. KB_SIGetPmt(pmtPid, pmtPgmno, &g_srchPMT, KB_SI_RECEIVE_ONCE, -1);
  495. gSrchApp.srchState = KB_SEARCH_WAITING_PMT;
  496. }
  497. }
  498. break;
  499. }
  500. break;
  501. case J_TIME_MODULE:
  502. break;
  503. default:
  504. break;
  505. }
  506. return KB_DB_DTV_SUCCESS;
  507. }
  508. void KB_SEARCHDestroy(void)
  509. {
  510. KB_SIStopAllSection();
  511. KB_DMDDropSignal();
  512.     KD_SrchDis(0, 0, KB_SEARCH_DISABLED, KB_SEARCH_DIS_CLEAN);
  513. }
  514. static void KD_SRCHHandleNit(void)
  515. {
  516. KB_DBNetInfo NetworkInfo;
  517. UINT16 i;
  518. gSrchFreNum = g_srchNit.num;
  519. for(i=0; i<gSrchFreNum; i++)
  520. {
  521. gSrchFre[i].type = DMD_TYPE_QAM;
  522. gSrchFre[i].inversion = INVERSION_AUTO;
  523. gSrchFre[i].frequency = g_srchNit.network[i].frequency / 10;
  524. gSrchFre[i].details.qam.modulation = g_srchNit.network[i].modulation;
  525. gSrchFre[i].details.qam.symbolRatekSs = g_srchNit.network[i].symbol_rate/10;
  526. gSrchFre[i].details.qam.fec_inner = g_srchNit.network[i].FEC_inner;
  527. }
  528. NetworkInfo.NitVersion = g_srchNit.version_number;
  529. memcpy(NetworkInfo.NetworkName,g_srchNit.network_name,20);
  530. NetworkInfo.NetworkName[21] = '';
  531. NetworkInfo.NetworkName[20] = '';
  532. KB_DBSaveNitInfo(&NetworkInfo);
  533. }
  534. static unsigned short KD_GetPmtPid(unsigned short i_nCallOpt, unsigned short * pmtPid, 
  535.                                     unsigned short * pmtPgmno)
  536. {
  537. static unsigned short count;
  538. if(i_nCallOpt == PMTPID_GET_FIRST)
  539. {
  540. count = 0;
  541. }
  542. if(count >= gSrchApp.pat->num)
  543. return KB_DB_DTV_FAILURE;
  544. while(gSrchApp.pat->program[count].program_number == 0)
  545. {
  546. count ++;
  547. if(count >= gSrchApp.pat->num)
  548. return KB_DB_DTV_FAILURE;
  549. }
  550. *pmtPid   = gSrchApp.pat->program[count].program_map_PID;
  551.        *pmtPgmno = gSrchApp.pat->program[count].program_number;
  552. count ++;
  553. return KB_DB_DTV_SUCCESS;
  554. }
  555. static void KD_SrchNvodInit(void)
  556. {
  557. _iRefSvcNums = _iTotalShiftSvcNums = 0;
  558. }
  559. static void KD_SrchHandleNovd(KB_SISdtStruct * i_pstSdt, int i_nNum)
  560. {
  561. int i;
  562. int loop;
  563. if(i_nNum > 1000)
  564. return;
  565. for(i = 0; i < i_nNum; i ++)
  566. {
  567. if(i_pstSdt[i].service_type == 0x04)
  568. {
  569. if(_iRefSvcNums >= KB_SI_MAX_REF_SVC_NUMS)
  570. {
  571. continue;
  572. }
  573. if( i_pstSdt[i].TimeShiftedNum == 0 ||
  574. i_pstSdt[i].TimeShiftedNum >= KB_SI_MAX_SHIFT_SVC_NUMS)
  575. {
  576. continue;
  577. }
  578. for(loop = 0; loop < _iRefSvcNums; loop ++)
  579. {
  580. if(i_pstSdt[i].service_id == _astNvodCell[loop].refScvId)
  581. {
  582. break;
  583. }
  584. }
  585. if(loop < _iRefSvcNums)
  586. {
  587. continue;
  588. }
  589. _astNvodCell[_iRefSvcNums].refScvId = i_pstSdt[i].service_id;
  590. _astNvodCell[_iRefSvcNums].freq = (UINT16)(gSrchApp.tsParams.frequency / 100);
  591. _astNvodCell[_iRefSvcNums].symb = (UINT16)gSrchApp.tsParams.details.qam.symbolRatekSs;
  592. _astNvodCell[_iRefSvcNums].qam  = gSrchApp.tsParams.details.qam.modulation;
  593. _astNvodCell[_iRefSvcNums].shiftSvcNum = i_pstSdt[i].TimeShiftedNum;
  594.             memcpy((char*)_astNvodCell[_iRefSvcNums].refScvName,(char*)i_pstSdt[i].chinese.service_name,18);
  595. _astNvodCell[_iRefSvcNums].refScvName[18]='';
  596. _astNvodCell[_iRefSvcNums].refScvName[19]='';
  597.             
  598. if(_astNvodCell[_iRefSvcNums].shiftSvcNum > 0)
  599. {
  600. _astNvodCell[_iRefSvcNums].TsID = i_pstSdt[i].TimeShift[0].TS_ID;
  601. }
  602. else
  603. {
  604. _astNvodCell[_iRefSvcNums].TsID = 0;
  605. }
  606. for(loop = 0; loop < _astNvodCell[_iRefSvcNums].shiftSvcNum; loop ++)
  607. {
  608. _astNvodCell[_iRefSvcNums].shiftSvc[loop].tsId = i_pstSdt[i].TimeShift[loop].TS_ID;
  609. _astNvodCell[_iRefSvcNums].shiftSvc[loop].netId = i_pstSdt[i].TimeShift[loop].OrgnetID;
  610. _astNvodCell[_iRefSvcNums].shiftSvc[loop].svcId = i_pstSdt[i].TimeShift[loop].ServiceID;
  611. }
  612. _iRefSvcNums ++;
  613. }
  614. #if 0
  615. else if(i_pstSdt[i].service_type == 0x05)
  616. {
  617. if(_iTotalShiftSvcNums >= KB_SI_MAX_REF_SVC_NUMS * KB_SI_MAX_SHIFT_SVC_NUMS)
  618. continue;
  619. _alShiftSvc[_iTotalShiftSvcNums] = 
  620. ( ((UINT32)i_pstSdt[i].service_id << 16) & 0xffff0000 ) | (UINT32)i_pstSdt[i].reference_service_id;
  621. _iTotalShiftSvcNums ++;
  622. }
  623. #endif
  624. }
  625. }
  626. static void KD_SrchAdjustNvod(void)
  627. {
  628. int i;
  629. //unsigned long temp;
  630. //int loop, j;
  631. //int sum;
  632. //KB_SIRefSvcCell refSvc;
  633. #if 0
  634. sum = 0;
  635. memset(&refSvc,0,sizeof(KB_SIRefSvcCell));
  636. for(i = 0; i < _iRefSvcNums; i ++)
  637. {
  638. refSvc.refScvId = _astNvodCell[i].refScvId;
  639. refSvc.TsID = _astNvodCell[i].TsID;
  640. refSvc.freq = _astNvodCell[i].freq;
  641. refSvc.symb = _astNvodCell[i].symb;
  642. refSvc.qam  = _astNvodCell[i].qam;
  643. refSvc.shiftSvcNum = 0;
  644.         strcpy((char*)refSvc.refScvName,(char*)_astNvodCell[i].refScvName);
  645.         
  646. for(j = 0; j < _astNvodCell[i].shiftSvcNum; j ++)
  647. {
  648. temp = ( ((UINT32)_astNvodCell[i].shiftSvc[j].svcId << 16) & 0xffff0000 ) | (UINT32)_astNvodCell[i].refScvId;
  649. for(loop = 0; loop < _iTotalShiftSvcNums; loop ++)
  650. {
  651. if(temp == _alShiftSvc[loop])
  652. break;
  653. }
  654. if(loop < _iTotalShiftSvcNums)
  655. {
  656. refSvc.shiftSvc[refSvc.shiftSvcNum].tsId = _astNvodCell[i].shiftSvc[j].tsId;
  657. refSvc.shiftSvc[refSvc.shiftSvcNum].netId = _astNvodCell[i].shiftSvc[j].netId;
  658. refSvc.shiftSvc[refSvc.shiftSvcNum].svcId = _astNvodCell[i].shiftSvc[j].svcId;
  659. refSvc.shiftSvcNum ++;
  660. }
  661. }
  662. if(refSvc.shiftSvcNum > 0)
  663. {
  664. memcpy(&_astNvodCell[sum], &refSvc, sizeof(KB_SIRefSvcCell));
  665. sum ++;
  666. }
  667. }
  668. _iRefSvcNums = sum;
  669. #endif
  670. for(i = 0; i < _iRefSvcNums; i ++)
  671. {
  672. KB_DBSaveNvodInfo(_astNvodCell[i]);
  673. }
  674. }
  675. /****///wisco
  676. int dtv_NUM,radio_NUM;
  677. int get_dtv_num(void)
  678. {
  679. int tv_no;
  680. tv_no = dtv_NUM;
  681. dtv_NUM = 0;
  682. return tv_no;
  683. }
  684. int get_radio_num(void)
  685. {
  686. int r_no;
  687. r_no = radio_NUM;
  688. radio_NUM = 0;
  689. return r_no;
  690. }
  691. /****/
  692. static void KD_SrchDis(UINT32 nPara1, UINT32 nPara2, UINT8 nDisTypeEx, 
  693.                          UINT8 nDisType)
  694. {    
  695. //int i;
  696. //int count;
  697.     KB_OSPMsgNode msgNode;
  698. memset(&msgNode,0,sizeof(KB_OSPMsgNode));
  699.     switch(nDisType)
  700.     {
  701.     case KB_SEARCH_DIS_PGMNUM:         
  702.  {
  703.   KB_OSPMsgNode movie_msg;
  704.      printf("-=KB_SEARCH_DIS_PGMNUM=-n");
  705.             msgNode.Word1 = J_AV_SEARCH_MODULE;
  706.      msgNode.Word2 = KB_SEARCH_MSG_UPDATE_AVPGM_NUM;
  707.           msgNode.Word3 = nPara1;
  708.      msgNode.Word4= nPara2;
  709.             dtv_NUM = (int)msgNode.Word3;
  710.             radio_NUM= (int)msgNode.Word4;
  711.      //send msg to movie client
  712.      movie_msg.Word1= KB_MOVIE_LC_TO_MOVIE;
  713.      movie_msg.Word2=20;
  714.      kb_machblue_task_post(&movie_msg);
  715.       }
  716.         break;
  717.     case KB_SEARCH_DIS_HELPHINT: 
  718. printf("-=KB_SEARCH_DIS_HELPHINT: nDisTypeEx=%d=-n", nDisTypeEx);
  719.         {
  720. msgNode.Word1 = J_AV_SEARCH_MODULE;
  721.    msgNode.Word2 = KB_SEARCH_MSG_UPDATE_HINT;
  722.    msgNode.Word3 = nDisTypeEx;
  723. if (nDisTypeEx!=2)
  724. {
  725. //send msg to movie client
  726. KB_OSPMsgNode movie_msg;
  727. movie_msg.Word1= KB_MOVIE_LC_TO_MOVIE;
  728. movie_msg.Word2=msgNode.Word3;
  729. kb_machblue_task_post(&movie_msg);
  730. }
  731. else
  732. {
  733. //send msg to movie client
  734. KB_OSPMsgNode movie_msg;
  735. movie_msg.Word1= KB_MOVIE_LC_TO_MOVIE;
  736. movie_msg.Word2=20;
  737. kb_machblue_task_post(&movie_msg);
  738. }
  739.         }
  740.         break;
  741.     case KB_SEARCH_DIS_PLANHINT:
  742. printf("-=KB_SEARCH_DIS_PLANHINT, nPara1:%ld=-n", nPara1);
  743.         {
  744. if (0 == nPara2)
  745. {
  746.             msgNode.Word1 = J_AV_SEARCH_MODULE;
  747.             msgNode.Word2 = KB_SEARCH_MSG_UPDATE_PROGRESS;
  748.             msgNode.Word3 = (UINT32)nPara1;
  749.             //KB_MENUTranslateMsg(&msgNode);
  750. }
  751.         }
  752.         break;
  753. case KB_SEARCH_DIS_FREQ:
  754. printf("-=KB_SEARCH_DIS_FREQ:nPara2=%ld=-n", nPara2);
  755. {
  756. if (0 == nPara1)
  757. {
  758.  KB_OSPMsgNode movie_msg;
  759.  
  760.         msgNode.Word1 = J_AV_SEARCH_MODULE;
  761.         msgNode.Word2 = KB_SEARCH_MSG_UPDATE_FREQ;
  762.         msgNode.Word3 = (UINT32)nPara2;
  763.        
  764.  //send msg to movie client
  765.  movie_msg.Word1= KB_MOVIE_LC_TO_MOVIE;
  766.  movie_msg.Word2=msgNode.Word3;
  767.  kb_machblue_task_post(&movie_msg);
  768. }
  769. }
  770. break;
  771. default:
  772. break;
  773.     }
  774. }
  775. static void   KD_SrchSetFre(UINT8 nSrchMode)
  776. {
  777. UINT8 i;
  778.     KB_DMDTunerParameters tTs;
  779. switch(nSrchMode)
  780. {
  781.   case  KB_SEARCH_IN_TS:
  782. gSrchFre[0] = gSrchApp.tsParams;
  783. gSrchFreNum   = 1;
  784. gSrchFre[0].frequency=gSrchApp.tsParams.frequency;
  785. gSrchFre[0].type = DMD_TYPE_QAM;
  786. gSrchFre[0].inversion = INVERSION_AUTO;
  787. gSrchFre[0].details.qam.symbolRatekSs = 6875;
  788. gSrchFre[0].details.qam.modulation = QAM_64;
  789. break;
  790. case KB_SEARCH_IN_NET:
  791. KB_SIStopAllSection();
  792. KB_DMDGetSignalParameters(&tTs);
  793.         if (memcmp(&tTs,&gSrchApp.tsParams,sizeof(KB_DMDTunerParameters)) != 0)
  794.         {
  795. KB_DMDDropSignal();
  796. //printf("-=KD_SrchSetFre:gSrchApp.tsParams.frequency=%ld=-n", gSrchApp.tsParams.frequency);
  797. KB_DMDConnectSignal(&gSrchApp.tsParams);
  798.         }
  799. KB_SIGetNit(0x10, &g_srchNit, KB_SI_RECEIVE_ONCE, -1);
  800. gSrchApp.srchState = KB_SEARCH_WAITING_NIT;
  801. break;
  802. case KB_SEARCH_IN_WHOLE_NET:
  803. gSrchFreNum   = WHOLE_NET_FREQ_SUM;
  804. for(i=0; i<gSrchFreNum; i++)
  805. {
  806. gSrchFre[i].frequency = g_WholeNetFreqs[i]* 1000;
  807. gSrchFre[i].type = DMD_TYPE_QAM;
  808.     gSrchFre[i].inversion = INVERSION_AUTO;
  809. gSrchFre[i].details.qam.symbolRatekSs = 6875;
  810. gSrchFre[i].details.qam.modulation = QAM_64;
  811. }
  812. break;
  813. default:
  814. break;
  815. }
  816. }
  817. static void KD_SrchToNext(void)
  818. {
  819. UINT8  bHintProgress;
  820. UINT32 wFreqToShow;
  821. if (gSrchFreInx < gSrchFreNum )
  822. {
  823. wFreqToShow = gSrchFre[gSrchFreInx].frequency/100;
  824.     KD_SrchDis(0,wFreqToShow,KB_SEARCH_DISABLED,KB_SEARCH_DIS_FREQ);
  825. bHintProgress = gSrchFreInx + 1;
  826. if (bHintProgress != gSrchFreNum)
  827. {
  828. bHintProgress = (bHintProgress * 100)/ (gSrchFreNum ) ;
  829. KD_SrchDis(bHintProgress, 0, KB_SEARCH_DISABLED, KB_SEARCH_DIS_PLANHINT);
  830. }
  831. else
  832. {
  833. if (gSrchApp.srchMode == KB_SEARCH_IN_WHOLE_NET)
  834. {
  835. bHintProgress = ((gSrchFreInx * 100) + 50)/ (gSrchFreNum ) ;
  836. KD_SrchDis(bHintProgress, 0, KB_SEARCH_DISABLED, KB_SEARCH_DIS_PLANHINT);
  837. }
  838. }
  839. KD_SrchParseInit(
  840. (unsigned short)(gSrchFre[gSrchFreInx].frequency/100),
  841. (unsigned short)(gSrchFre[gSrchFreInx].details.qam.symbolRatekSs), 
  842. (unsigned char)gSrchFre[gSrchFreInx].details.qam.modulation);
  843. KB_SIStopAllSection();
  844. bCurrentFreqDtvNum =0;
  845. bCurrentFreqMusicNum =0;
  846. KB_DMDDropSignal();
  847. //printf("-=KD_SrchToNext:gSrchFre[%d].frequency=%ld=-n", gSrchFreInx, gSrchFre[gSrchFreInx].frequency);
  848. gSrchApp.tsParams = gSrchFre[gSrchFreInx];
  849. KB_DMDConnectSignal(&gSrchFre[gSrchFreInx]);
  850. gSrchApp.srchState = KB_SEARCH_WAITING_CNT;
  851. gSrchFreInx++;
  852. }
  853. else
  854. {
  855. KD_Srchend();
  856. }
  857. }
  858. static void KD_SrchSaveResult(void)
  859. {
  860. KB_DBAddPrgInfo(gSrchPrg,gSrchApp.svcIDnum,
  861.                 &bCurrentFreqDtvNum,&bCurrentFreqMusicNum);
  862. gSrchApp.dtvNum += bCurrentFreqDtvNum;
  863. gSrchApp.radNum += bCurrentFreqMusicNum;
  864.     //因此, search搜索完成界面,只有视频、音频的更新
  865.        KD_SrchDis(bCurrentFreqDtvNum, bCurrentFreqMusicNum, KB_SEARCH_DISABLED, 
  866.               KB_SEARCH_DIS_PGMNUM);    
  867. }
  868. static void KD_Srchend(void)
  869. {
  870. gSrchApp.srchState = KB_SEARCH_WAITING_EXIT;
  871. KD_SrchAdjustNvod();
  872. KD_SrchDis(100, 0, KB_SEARCH_DISABLED, KB_SEARCH_DIS_PLANHINT);
  873.      //KD_SrchDis(0, 0, KB_SEARCH_HINT7, KB_SEARCH_DIS_HELPHINT);
  874. KB_DBSavePrgInfo(1);
  875. switch(gSrchApp.srchMode)
  876. {
  877. case KB_SEARCH_IN_TS:     
  878. KD_SrchDis(0, 0, KB_SEARCH_HINT8, KB_SEARCH_DIS_HELPHINT);
  879. break;
  880. case KB_SEARCH_IN_NET: 
  881. KD_SrchDis(0, 0, KB_SEARCH_HINT9, KB_SEARCH_DIS_HELPHINT);
  882. break;
  883. case KB_SEARCH_IN_WHOLE_NET:
  884. KD_SrchDis(0, 0, KB_SEARCH_HINT10, KB_SEARCH_DIS_HELPHINT);
  885. break;
  886. default:
  887. break;
  888. }
  889. KB_DTVSetPreChnnl();
  890. }
  891. INT32 *KB_SrchGetWholeFreq(void)
  892. {
  893. return g_WholeNetFreqs;
  894. }
  895. KB_DMDTunerParameters *KB_SrchGetSrchFre(void)
  896. {
  897.  return gSrchFre;
  898. }
  899. T_SEARCH_PARA *KB_SrchGetSrchApp(void)
  900. {
  901. return  &gSrchApp;    
  902. }
  903. //added by whale 07/07/12 start
  904. int KB_SrchGetNvodRefSrvNum(void)
  905. {
  906. return _iRefSvcNums;
  907. }
  908. //added by whale 07/07/12 end
  909. /* EOF */