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

DVD

开发平台:

C/C++

  1. //*****************************************************************************
  2. //FileName:kb_machblue_task.c
  3. //
  4. //Description:Machblue client task.
  5. //
  6. //Author:steven
  7. //
  8. //Date: 2007.03.17
  9. //
  10. //Version: v1.0
  11. //*****************************************************************************
  12. #include "osp.h"
  13. #include "nvod.h"
  14. #include "kb_dc.h"
  15. #include "kb_dc_task.h"
  16. #include "kb_porting.h"
  17. #include "stcommon.h"
  18. #include "machblue_customer.h"
  19. #include "machblue_defines.h"
  20. #include "machblue_porting_core.h"
  21. #include "kb_machblue_client.h"
  22. #include "kb_machblue_client_task.h"
  23. #include "kb_machblue_client_lc.h"
  24. #include "kb_machblue_client_data.h"
  25. #define KB_MB_MSG_COUNT 20
  26. static unsigned long _kb_mb_msgIndex=0;
  27. static kb_movie_msg_t _kb_mb_msg[KB_MB_MSG_COUNT];
  28. static mb_semaphore_t  _kb_mQueueSem;
  29. static message_queue_t  *pQueue=NULL;
  30. /**
  31.  * machblue client task post
  32.  * send message to client task
  33.  *
  34.  * key  < key value from remote >
  35.  *
  36.  * @return MB_SUCCESS, MB_FAILURE otherwise.
  37.  */
  38. mb_error_t kb_machblue_task_post(KB_OSPMsgNode *msg)
  39. {
  40. #if 1
  41. KB_OSPRet ret;
  42.   ret=KB_OSPMsgSend((unsigned long)pQueue,msg);
  43. if(ret!=RET_OK)
  44. mb_printf("nkb_machblue_task_post error.");
  45. #else
  46. unsigned char index;
  47. BOOL eLoop=FALSE;
  48. KB_OSPMsgNode * pMessage;
  49. clock_t timeout;
  50. while(1)
  51. {
  52. for(index=0;index<KB_MB_MSG_COUNT;index++)
  53. {
  54. if(_kb_mb_msg[index].used==FALSE)
  55. {
  56. eLoop=TRUE;
  57. break;
  58. }
  59. }
  60. if(eLoop)
  61. break;
  62. }
  63. mb_semaphore_wait(_kb_mQueueSem);
  64. timeout=time_plus(time_now(),3*ST_GetClocksPerSecondLow());
  65.      pMessage = (KB_OSPMsgNode *)message_claim_timeout((message_queue_t*)pQueue,&timeout);
  66. if(pMessage == NULL)
  67. {
  68. mb_printf("n[Machblue]:kb_machblue_task_post error.");
  69. mb_semaphore_signal(_kb_mQueueSem);
  70. return MB_FAILURE;
  71. }
  72. _kb_mb_msg[index].msg.Word1=pMessage->Word1=msg->Word1;
  73. _kb_mb_msg[index].msg.Word2=pMessage->Word2=msg->Word2;
  74. _kb_mb_msg[index].msg.Word3=pMessage->Word3=msg->Word3;
  75. _kb_mb_msg[index].msg.Word4=pMessage->Word4=_kb_mb_msgIndex++;
  76. _kb_mb_msg[index].used=TRUE;
  77. message_send((message_queue_t*)pQueue, (void*)pMessage);
  78. mb_semaphore_signal(_kb_mQueueSem);
  79. return MB_SUCCESS;
  80. #endif
  81. }
  82. /**
  83.  * machblue client task wait
  84.  * wait message  whic sent to client task
  85.  *
  86.  * pMsg < buffer which storage client msg information >
  87.  *
  88.  * @return MB_SUCCESS, MB_FAILURE otherwise.
  89.  */
  90. mb_error_t kb_machblue_task_wait(KB_OSPMsgNode *pMsg)
  91. {
  92. void* pMessage;
  93. if(pMsg == NULL)
  94. {
  95. mb_printf("n[Machblue]:Msg get no wait NULL.");
  96. return MB_FAILURE;
  97. }
  98. mb_semaphore_wait(_kb_mQueueSem);
  99. pMessage = message_receive_timeout((message_queue_t*)pQueue,(clock_t*)TIMEOUT_IMMEDIATE);
  100. if(pMessage != NULL)
  101. {
  102. pMsg->Word1=((KB_OSPMsgNode *)pMessage)->Word1;
  103. pMsg->Word2=((KB_OSPMsgNode *)pMessage)->Word2;
  104. pMsg->Word3=((KB_OSPMsgNode *)pMessage)->Word3;
  105. pMsg->Word4=((KB_OSPMsgNode *)pMessage)->Word4;
  106. message_release((message_queue_t*)pQueue, pMessage);
  107. mb_semaphore_signal(_kb_mQueueSem);
  108. return MB_SUCCESS;
  109. }
  110. else
  111. {
  112. mb_semaphore_signal(_kb_mQueueSem);
  113. return MB_FAILURE;
  114. }
  115. }
  116. /**
  117.  * machblue client task release msg buf
  118.  *
  119.  * pMsg < buffer which storage client msg information >
  120.  *
  121.  * @return None.
  122.  */
  123. void kb_machblue_task_releaseMsg(KB_OSPMsgNode *pMsg)
  124. {
  125. unsigned char index;
  126. for(index=0;index<KB_MB_MSG_COUNT;index++)
  127. {
  128. if(_kb_mb_msg[index].msg.Word4==pMsg->Word4)
  129. {
  130. _kb_mb_msg[index].used=FALSE;
  131. break;
  132. }
  133. }
  134. }
  135. /**
  136.  * machblue client task 
  137.  * @return None.
  138.  */
  139. void kb_machblue_task(void)
  140. {
  141. KB_OSPMsgNode msg,msg2;
  142. unsigned short tsID,serviceID;
  143. while(1)
  144. {
  145. KB_OSPTaskDelay(10);
  146. //
  147. //if(kb_machblue_task_wait(&msg)==MB_FAILURE)
  148. if(KB_OSPMsgGet((unsigned long)pQueue,KB_Wait,(unsigned long)TIMEOUT_INFINITY,&msg)!=Ret_OK)
  149. continue;
  150.               switch(msg.Word1)
  151. {
  152. //key event
  153. case KB_MOVIE_KEY_REQUEST:
  154. kb_machblue_key(msg.Word2);
  155. break;
  156. case KB_MOVIE_LC_TO_CCODE:
  157. kb_machblue_localConnection((kb_lc_attributes_t*)msg.Word2);
  158. break;
  159. case KB_MOVIE_LC_TO_MOVIE:
  160. KB_Machblue_LC_To_Movie(msg.Word2);
  161. break;
  162. case KB_MOVIE_SCHEDULE_CREATE:
  163. kb_machblue_create_schedule(msg.Word2);
  164. break;
  165. case KB_MOVIE_PROMPT_TO_MOVIE:
  166. kb_machblue_lc_2_prompt((char*)msg.Word2);
  167. break;
  168. case KB_MOVIE_NVOD_TO_MOVIE:
  169. {
  170. mb_error_t ret;
  171. UINT32 word;
  172. UINT8 pNum;
  173. KB_NVOD_Info *Address[KB_NVOD_MAX_TS_NUM];
  174. if (KB_DBGetNvodNum()>0)
  175. {
  176. mb_printf("n[machblue]enter nvod taskn");
  177. KB_NVOD_GetValidFreInfo(&pNum,Address);
  178. mb_printf("n[machblue]after KB_NVOD_GetValidFreInfo pNum = %dn",pNum);
  179. ret = kb_machblue_service_list_NVOD_init(pNum,Address);
  180. if (ret != MB_SUCCESS)
  181. word = 0;
  182. else 
  183. word = 1;
  184. }
  185. else
  186. word = 0;
  187. mb_printf("n[machblue]enter nvod task word  = %dn",word);
  188. KB_MB_lc_2_movie_word_Post_Task(word);
  189. }
  190. break;
  191. case KB_CLIENT_FRE_SWITCH:
  192. KB_OSPTaskDelay(500);
  193. //search xml info
  194.      msg2.Word1=kb_dc_version_check;
  195.      KB_DcMsgSend(&msg2);
  196. KB_DTVGetCurPrgInfo(&tsID,&serviceID);
  197. KB_EPG_SetCurrentTsNum(tsID);
  198.                  //KB_EPG_ResetSchInfoByTsid(tsID);
  199.                  KB_SIStopEitSCH(KB_SI_STOP_ALL);
  200. //kb_mb_event_schedule_reset();
  201. kb_machblue_search_schedule();
  202. //KB_OTA_NewChannel();
  203. break;
  204. default:
  205. break;
  206. }
  207. kb_machblue_task_releaseMsg(&msg);
  208. }
  209. }
  210. /**
  211.  * init machblue client task
  212.  * @return MB_SUCCESS, MB_FAILURE otherwise.
  213.  */
  214. mb_error_t kb_machblue_task_init(void)
  215. {
  216. KB_OSPRet ret;
  217. unsigned char index;
  218. unsigned long taskID;
  219. mb_semaphore_create(&_kb_mQueueSem,1);
  220. //create queue
  221. pQueue=message_create_queue_timeout(sizeof(KB_OSPMsgNode),2000);
  222. ret=KB_OSPTaskInit("mb_client",16*1024,(void (*)(void*))kb_machblue_task,5*16,NULL,&taskID);
  223. if(ret!=Ret_OK)
  224. {
  225. mb_printf("n[Machblue]:kb_machblue_task_init error.");
  226. return MB_FAILURE;
  227. }
  228. for(index=0;index<KB_MB_MSG_COUNT;index++)
  229. {
  230. _kb_mb_msg[index].used=FALSE;
  231. }
  232. return MB_SUCCESS;
  233. }