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

DVD

开发平台:

C/C++

  1. #include "kb_dc_pub.h"
  2. #include "kb_dc_task.h"
  3. #include "kb_dc.h"
  4. #include "kb_machblue_client.h"
  5. #include "kb_machblue_client_task.h"
  6. #include "swf.h"
  7. static UINT32 kb_dc_queueID;
  8. static UINT32 _realtime_adver_timer = 0xffffffff;
  9. static unsigned short curCfgTsID = 0x1fff;
  10. extern mb_error_t kb_machblue_movie_close(BOOL Menu_Exit);
  11. void AdverTimerCallback(void);
  12. void movieInfoPrint(KB_MovieInfoNode *Info)
  13. {
  14. DCDebug2("n movieInfoPrint:Infoaddr=%x", Info);
  15. DCDebug2("n InfoPrint]: pid=[%d], fMid=[%d], name=[%s], size=[%d]...n", Info->st_MovieInfo.m_nPid, Info->st_MovieInfo.m_nFirstModuleId, Info->st_MovieInfo.m_strName, Info->st_MovieInfo.m_nSize);
  16. }
  17. BOOL KB_DcDataGet(KB_MovieInfoNode *pInfo)
  18. {
  19.      pInfo->st_MovieInfo.m_pData=KBDcMalloc((mb_size_t)pInfo->st_MovieInfo.m_nSize);
  20.      if(pInfo->st_MovieInfo.m_pData==NULL)
  21.      {
  22.      if(pInfo->st_MovieInfo.m_dataGet==kb_dc_data_searching)
  23. pInfo->st_MovieInfo.m_dataGet=kb_dc_data_no;
  24.         return FALSE;
  25.      }
  26.      if(kb_dc_getMovie(pInfo)==FALSE)
  27.      {
  28.      if(pInfo->st_MovieInfo.m_dataGet==kb_dc_data_searching)
  29. pInfo->st_MovieInfo.m_dataGet=kb_dc_data_no;
  30. mb_free(pInfo->st_MovieInfo.m_pData);
  31.          DCDebug1("n[Machblue]:Client get movie adver data error.");
  32.          return FALSE;
  33.      }   
  34.      KB_XmlParse((char*)pInfo->st_MovieInfo.m_pData, pInfo->st_MovieInfo.m_nSize);
  35.      mb_free(pInfo->st_MovieInfo.m_pData);
  36.      pInfo->st_MovieInfo.m_dataGet=kb_dc_data_searched;
  37.      return TRUE;
  38. }
  39. BOOL KB_DcMovieGet(KB_MovieInfoNode *pInfo)
  40. {
  41. pInfo->st_MovieInfo.m_pData=mb_malloc((mb_size_t)pInfo->st_MovieInfo.m_nSize);
  42. if(kb_dc_getMovie(pInfo)==FALSE)
  43. {
  44. if(pInfo->st_MovieInfo.m_dataGet==kb_dc_data_searching)
  45. pInfo->st_MovieInfo.m_dataGet=kb_dc_data_no;
  46. mb_free(pInfo->st_MovieInfo.m_pData);
  47. DCDebug1("n[Machblue]:Client get movie adver data error.");
  48. return FALSE;
  49. }   
  50. pInfo->st_MovieInfo.m_dataGet=kb_dc_data_searched;
  51. return TRUE;
  52. }
  53. void KB_DcMsgSend(KB_OSPMsgNode *msg)
  54. {
  55. KB_OSPRet ret;
  56.   ret=KB_OSPMsgSend(kb_dc_queueID,msg);
  57. if(ret!=RET_OK)
  58. DCDebug1("nKB_DcMsgSend error.");
  59. }
  60. void KB_DcTask(void)
  61. {
  62. time_t curTime, end_time, last_check_time=0;
  63. KB_OSPRet status;
  64. KB_OSPMsgNode msg;
  65. KB_MovieInfoNode *movieInfo=NULL;
  66. unsigned short curTSID,curServiceID;
  67. BOOL playret;
  68. static bool updateInfo=false,update=false;
  69. unsigned char verSTB=0,verDC=0;
  70. unsigned long year,month,day,hour,minter,second;
  71. int testCnt =0;
  72. int x;
  73. _realtime_adver_timer = KB_TimerCreate(KB_TIMER_REPEAT, (KB_TIMER_FUNC_POINTER)AdverTimerCallback, NULL);
  74. KB_TimeGetCurTime(&curTime);
  75. last_check_time = curTime;
  76. while(1)
  77. {
  78. KB_OSPTaskDelay(2000);
  79. KB_TimeGetCurTime(&curTime);
  80. #if 0
  81. ConvertTimeStampToDate(curTime,&year,&month,&day);
  82. ConvertTimeStampToTime(curTime,&hour,&minter,&second);
  83. DCDebug2("n KB_DcTask:current time[%d],year[%d],month[%d],day[%d],hour[%d],minter[%d],second[%d]",curTime,year,month,day,hour,minter,second);
  84. #endif
  85. //定时去激活版本的监测
  86. if(curTime-last_check_time > 60)
  87. {
  88. DCDebug2("nnn*******it is time to check configure file version!*****nnn");
  89. last_check_time = curTime;
  90. #ifdef KB_DC_TEST_2
  91. {
  92. if((++testCnt)%4==0)
  93. kb_dc_CfgVerSaveTest();
  94. }
  95. #endif
  96. msg.Word1=kb_dc_version_check;
  97. goto SWITCH;
  98. }
  99. status=KB_OSPMsgGet(kb_dc_queueID, KD_NoWait,0, &msg);
  100. if(status!=Ret_OK) KBDcMemset(&msg, 0x00, sizeof(KB_OSPMsgNode));
  101. movieInfo=KB_GetXmlMovieInfoHead();
  102. while(movieInfo!=NULL)
  103. {
  104. DCDebug3("n m_dataGet=%d m_cfgType=%d      name=%s", movieInfo->st_MovieInfo.m_dataGet, movieInfo->st_MovieInfo.m_cfgType, movieInfo->st_MovieInfo.m_strName);
  105. //数据广播数据文件
  106. if(((movieInfo->st_MovieInfo.m_cfgType==kb_dc_data_broadcast)||
  107.      (movieInfo->st_MovieInfo.m_cfgType==kb_dc_data_vote))&&
  108.    (movieInfo->st_MovieInfo.m_dataGet==kb_dc_data_no))
  109. {
  110. movieInfo->st_MovieInfo.m_dataGet=kb_dc_data_searching;
  111. msg.Word1=kb_db_data_get;
  112. msg.Word2=(UINT32)movieInfo;
  113. break;
  114. }
  115. //交互广告影片文件
  116. else if((movieInfo->st_MovieInfo.m_cfgType==kb_dc_adv_alter)&&
  117.          (movieInfo->st_MovieInfo.m_dataGet==kb_dc_data_no))
  118. {
  119. movieInfo->st_MovieInfo.m_dataGet=kb_dc_data_searching;
  120. msg.Word1=kb_dc_movie_get;
  121. msg.Word2=(UINT32)movieInfo;
  122. break;
  123. }
  124. //界面更新影片文件
  125. else if((movieInfo->st_MovieInfo.m_cfgType==kb_dc_swf_update)&&
  126.          (movieInfo->st_MovieInfo.m_dataGet==kb_dc_data_no))
  127. {
  128. verDC=movieInfo->st_MovieInfo.m_reserve2;
  129. //下发的版本号无效
  130. if((verDC==0)||(verDC==255))
  131. {
  132. movieInfo->st_MovieInfo.m_dataGet=kb_dc_data_searched;
  133. }
  134. else
  135. {
  136. if(movieInfo->st_MovieInfo.m_reserve1==kb_movie_adve_logo)
  137. verSTB=KB_SWF_VersionGet(0);
  138. else
  139. verSTB=KB_SWF_VersionGet(1);
  140. //if(((verSTB>=250)&&(verSTB!=verDC))||(verSTB<verDC))
  141. if(verSTB!=verDC)
  142. {
  143. update=true;
  144. movieInfo->st_MovieInfo.m_dataGet=kb_dc_data_searching;
  145. msg.Word1=kb_dc_movie_get;
  146. msg.Word2=(UINT32)movieInfo;
  147. break;
  148. }
  149. else
  150. {
  151. DCDebug2("n 无效版本: verSTB=%d   verDC=%d", verSTB, verDC);
  152. movieInfo->st_MovieInfo.m_dataGet=kb_dc_data_searched;
  153. }
  154. }
  155. }
  156. //插播广告
  157. else if(movieInfo->st_MovieInfo.m_cfgType==kb_dc_adv_rt)
  158. {
  159. if(KB_DTVGetCurPrgInfo(&curTSID,&curServiceID)==FALSE)
  160. {
  161. DCDebug1("nKB_DcTask get current program information error.");
  162. }
  163. else
  164. {
  165. DCDebug2("n curTSID=%x   curServiceID=%x   m_serviceID=%x   m_tsID=%x", curTSID,curServiceID,  movieInfo->st_MovieInfo.m_serviceID, movieInfo->st_MovieInfo.m_tsID);
  166. //if((movieInfo->st_MovieInfo.m_tsID==curTSID)&&(movieInfo->st_MovieInfo.m_serviceID==curServiceID))
  167. if(movieInfo->st_MovieInfo.m_serviceID==curServiceID&&movieInfo->st_MovieInfo.m_tsID==curTSID)
  168. {
  169. end_time = movieInfo->st_MovieInfo.m_nStartTime + (movieInfo->st_MovieInfo.m_nTimeStep*(movieInfo->st_MovieInfo.m_nTimesPlayed-1) + 10);
  170. DCDebug2("n curTime[%d] vs [%d]st_MovieInfo.m_nStartTime----end_time[%d]", curTime,  movieInfo->st_MovieInfo.m_nStartTime, end_time);
  171. if( (curTime>movieInfo->st_MovieInfo.m_nStartTime)&&(curTime<=end_time) )
  172. {
  173. x =  (curTime - movieInfo->st_MovieInfo.m_nStartTime)%(movieInfo->st_MovieInfo.m_nTimeStep);
  174. DCDebug2("n x=%d",x);
  175. if((x>=0)&&(x<=10))
  176. {
  177. msg.Word1 = kb_dc_movie_play;
  178. msg.Word2=(UINT32)movieInfo;
  179. break;
  180. }
  181. }
  182. }
  183. }
  184. }
  185. movieInfo=movieInfo->m_pNext;
  186. }
  187. SWITCH:
  188. if(KB_DC_FilterStatGet()==FILTER_COLSED)
  189. {
  190. DCDebug2("n FilterStat is FILTER_COLSED, continue!!!");
  191. continue;
  192. }
  193. switch(msg.Word1)
  194. {
  195. //搜索业务配置文件
  196. case kb_dc_servcfg_get:
  197. DCDebug2("n ---kb_dc_servcfg_get recieved----");
  198. KB_DC_FilterStatSet(FILTER_RUNNING);
  199. if(kb_dc_getMainFreqCfg()==0)
  200. {
  201. DCDebug1("n kb_dc_getMainFreqCfg failure!");
  202. break;
  203. }
  204. KB_DC_FilterStatSet(FILTER_READY);
  205. break;
  206. case kb_dc_version_check:
  207. DCDebug2("n -----kb_dc_version_check received!-----");
  208. {
  209. unsigned char *xmlBuf=NULL;
  210. unsigned long xmlLen=0;
  211. KB_DC_FilterStatSet(FILTER_RUNNING);
  212. if(kb_dc_CfgDiiCheck()<=0)
  213. {
  214. DCDebug2("n dii version not changed , break!");
  215. break;
  216. }
  217. updateInfo=false;
  218. update=false;
  219. ResetXmlStbInfo(); /*先清空*/
  220. xmlBuf = kb_dc_getCfgXml(&xmlLen);
  221. if(xmlBuf!=NULL) 
  222. {
  223. KB_XmlParse((char*)xmlBuf, xmlLen);
  224. KBDcFree(xmlBuf);
  225. xmlBuf=NULL;
  226. }
  227. }
  228. break;
  229. case kb_dc_movie_play:
  230. DCDebug2("n -----kb_dc_movie_play received!-----");
  231.        if(kb_movie_playStatusGet()==kb_movie_closed)
  232. {
  233. playret =kb_machblue_TSMovie2((KB_MovieInfoNode*)msg.Word2);
  234. if(playret)
  235. {
  236. KB_MovieInfoNode *pInfo=NULL;
  237. int duration;
  238. pInfo = (KB_MovieInfoNode *)msg.Word2;
  239. duration = pInfo->st_MovieInfo.m_nDuration;
  240. DCDebug4("nr -----duration=%d", duration);
  241. KB_TimerEnable(_realtime_adver_timer, duration*1000);
  242. }
  243. }
  244. break;
  245. case kb_dc_movie_get:
  246. DCDebug2("n -----kb_dc_movie_get received!-----");
  247. KB_DcMovieGet((KB_MovieInfoNode*)msg.Word2);
  248. break;
  249. case kb_db_data_get:
  250. DCDebug2("n #####kb_db_data_get received!msg.Word2=%x#####", msg.Word2);
  251. KB_DcDataGet((KB_MovieInfoNode*)msg.Word2);
  252. break;
  253. case kb_dc_filter_close:
  254. KB_DC_FilterStop();
  255. KB_DC_FilterStatSet(FILTER_COLSED);
  256. break;
  257. case kb_dc_filter_start:
  258. KB_DC_FilterStart();
  259. break;
  260. }
  261. if((!updateInfo)&&update)
  262. {
  263. movieInfo=KB_GetXmlMovieInfoHead();
  264. if(movieInfo!=NULL)
  265. updateInfo=true;
  266. while(movieInfo!=NULL)
  267. {
  268. if((movieInfo->st_MovieInfo.m_cfgType==kb_dc_swf_update)&&
  269.    (movieInfo->st_MovieInfo.m_dataGet!=kb_dc_data_searched))
  270. {
  271. updateInfo=false;
  272. break;
  273. }
  274. movieInfo=movieInfo->m_pNext;
  275. }
  276. if(updateInfo)
  277. {
  278. KB_MovieInfoNode *tmpInfo=NULL,*p1=tmpInfo,*p2;
  279. KB_DBRET updateRet;
  280. movieInfo=KB_GetXmlMovieInfoHead();
  281. while(movieInfo!=NULL)
  282. {
  283. //生成链表
  284. if((movieInfo->st_MovieInfo.m_cfgType==kb_dc_swf_update)&&
  285.    (movieInfo->st_MovieInfo.m_pData!=NULL))
  286. {
  287. p2 = (KB_MovieInfoNode*)KBDcMalloc(sizeof(KB_MovieInfoNode));
  288. KBDcMemcpy(p2, movieInfo, sizeof(KB_MovieInfoNode));
  289. //p2->st_MovieInfo.m_pData=(unsigned char*)mb_malloc(p2->st_MovieInfo.m_nSize);
  290. //mb_memcpy(p2->st_MovieInfo.m_pData,movieInfo->st_MovieInfo.m_pData,p2->st_MovieInfo.m_nSize);
  291. if(tmpInfo==NULL)
  292. {
  293. tmpInfo=p2;
  294. p1=tmpInfo;
  295. p1->m_pNext=NULL;
  296. }
  297. else
  298. {
  299. p1->m_pNext=p2;
  300. p1=p2;
  301. p1->m_pNext=NULL;
  302. }
  303. }
  304. movieInfo=movieInfo->m_pNext;
  305. }
  306. kb_machblue_updatePlay();
  307. updateRet=KB_SWF_Update(tmpInfo);
  308. if(kb_movie_playStatusGet()==kb_movie_playing)
  309. {
  310. if(updateRet==RET_OK)
  311. KB_MB_lc_2_movie_word_Post_Task(1);
  312. else
  313. KB_MB_lc_2_movie_word_Post_Task(0);
  314. }
  315. while(tmpInfo!=NULL)
  316. {
  317. KBDcFree(tmpInfo->st_MovieInfo.m_pData);
  318. tmpInfo->st_MovieInfo.m_pData = NULL;
  319. p1=tmpInfo;
  320. tmpInfo=tmpInfo->m_pNext;
  321. KBDcFree(p1);
  322. }
  323. }
  324. }
  325. }
  326. }
  327. void KB_DcTaskInit(void)
  328. {
  329. UINT32 TaskId;
  330. KB_OSPTaskInit("KB_DcTask", 8*1024,
  331.  (void(*)(void *))KB_DcTask, 1*16,
  332.  NULL, &TaskId);
  333. KB_OSPQueInit("kb_dc_queueID", 128, &kb_dc_queueID);
  334. }
  335. void AdverTimerCallback(void)
  336. {
  337. DCDebug4("rnn ----------------_realtime_adver_timer expired-------------------n");
  338. KB_TimerDisable(_realtime_adver_timer );
  339. kb_machblue_movie_close(TRUE);
  340. }
  341. void Kb_clearAderTimer(void)
  342. {
  343. KB_TimerDisable(_realtime_adver_timer );
  344. }
  345. void KB_DCStop_Service(void)
  346. {
  347. KB_DC_FilterStop();
  348. KB_DC_FilterStatSet(FILTER_COLSED);
  349. }
  350. void KB_DCStart_Service(void)
  351. {
  352. KB_DC_FilterStart();
  353. KB_DC_FilterStatSet(FILTER_RUNNING);
  354. }
  355. void kb_dc_LoadCurTs(void)
  356. {
  357. unsigned short curTSID,curServiceID;
  358. KB_DTVGetCurPrgInfo(&curTSID,&curServiceID);
  359. curCfgTsID=curTSID;
  360. }
  361. unsigned short kb_dc_GetCurTS(void)
  362. {
  363. return curCfgTsID;
  364. }
  365. BOOL kb_dc_FreqIsChanged(void)
  366. {
  367. unsigned short curTSID,curServiceID;
  368. KB_DTVGetCurPrgInfo(&curTSID,&curServiceID);
  369. if(curCfgTsID!=curTSID)
  370. return TRUE;
  371. else 
  372. return FALSE;
  373. }
  374. //activate service configure xml info
  375. void kb_dc_ServCfgGetActivate(void)
  376. {
  377. KB_OSPMsgNode msg;
  378. msg.Word1=kb_dc_servcfg_get;
  379. KB_DcMsgSend(&msg);
  380. }