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

DVD

开发平台:

C/C++

  1. #include "stpio.h"
  2. #include "string.h"
  3. #include "stdevice.h"
  4. #include "stcommon.h"
  5. #include "osp.h"
  6. #include "errors.h"
  7. #include "db.h"
  8. #include <gendef.h>
  9. #include <keydef.h>
  10. #include <ir.h>
  11. #include <stblast.h>
  12. #include <stcommon.h>
  13. #include <message.h>
  14. #include <task.h>
  15. #include "irp.h"
  16. void IRCEvtCallback
  17. (
  18. STEVT_CallReason_t Reason,
  19. const ST_DeviceName_t RegistrantName,
  20. STEVT_EventConstant_t Event,
  21. const void *EventData,
  22. const void *SubscriberData_p
  23. );
  24. static void IRCTask(void *Param_p);
  25. static UINT8 SwapByte(UINT8 data);
  26. KB_KeyCallBack gKeyCallBackFunc;
  27. extern UINT32  BlasterSemaphore_p;
  28. static UINT8 bIRCEnabled;
  29. extern STBLAST_Handle_t    BLAST_Handle;
  30. RetValue KB_IRInit(void)
  31. {  
  32. UINT32 error;
  33. UINT32 taskid;
  34. error = blaster_EvtInit();
  35. if ( error != RETOK )
  36. {
  37. STTBX_Print(("InitEvt for BLAST failn"));
  38. return error;
  39. }
  40. error = blaster_Init();
  41. if ( error != RETOK )
  42. {
  43. STTBX_Print(("InitBlast failn"));
  44. return error;
  45. }
  46.     
  47.     KB_OSPTaskInit("IRT", 0x2000, (void(*)(void *))IRCTask, 
  48.                          IRC_PRIORITY, NULL, &taskid);
  49. bIRCEnabled = 1;
  50. gKeyCallBackFunc = NULL;
  51. return (RETOK);
  52. }
  53. KB_KeyCallBack KB_IRCallBack(KB_KeyCallBack callback)
  54. {
  55.     KB_KeyCallBack tPreCallBack;
  56. tPreCallBack = gKeyCallBackFunc;
  57. gKeyCallBackFunc = callback;
  58.     return tPreCallBack;
  59. }
  60. #if 1   
  61. #define SCAN_FREQEN2  (1)
  62. #define IR_SCAN_INTERVAL_TIME (120)
  63. static U32 Cmd,oldCmd;   
  64. static UINT8    oldCmdFlag = 0;
  65. static void IRCTask(void *Param_p)
  66. {
  67.     U32             NumReceived;
  68.     ST_ErrorCode_t  ST_ErrorCode= ST_NO_ERROR;
  69. static UINT16 nScanTime = 0;
  70.     while(1)
  71.     {    
  72. NumReceived = 0;
  73.         ST_ErrorCode = STBLAST_Receive(BLAST_Handle, &Cmd, 1, &NumReceived, IR_SCAN_INTERVAL_TIME);
  74. printf("n[Han]:NumReceived 0x%x",NumReceived);
  75. KB_OSPSemGet(BlasterSemaphore_p, KB_Wait, 0);
  76.         if(ST_ErrorCode == ST_NO_ERROR && NumReceived)
  77.         {
  78. /****************  NEC Protocol Data Format   ****************
  79. **
  80. ** Address and Command are transmitted twice.
  81. ** The second time all bits are inverted and 
  82. ** can be used for verification of the received message
  83. ** |<---------->|<---------->|<---------->|<---------->|
  84. ** |LSB      MSB|LSB      MSB|LSB      MSB|LSB      MSB|
  85. **    Address      ^Address     Command      ^Command   
  86. **
  87. ** When we use, only keep the Command.
  88. ****************************************************************/
  89. /* Remove the Address and ^Address from the key code */
  90.             Cmd &= 0xFFFF;
  91.             
  92.             /* 
  93.               ** Validate the Key ID by ensuring that the upper and lower
  94.               ** bytes are complementary.
  95.               */
  96.             if( ((Cmd & 0xFF) ^ ((Cmd >>8) & 0xFF)) == 0xFF ) 
  97.             {
  98. Cmd = (Cmd >> 8) & 0xFF;
  99. Cmd = SwapByte(Cmd);
  100. if (oldCmdFlag)
  101. {
  102. if (oldCmd == Cmd)
  103. {
  104. if(nScanTime >= SCAN_FREQEN2)
  105. {
  106. nScanTime = 0;
  107. if((gKeyCallBackFunc != NULL) && (bIRCEnabled == 1))
  108. {
  109. gKeyCallBackFunc(KEY_PRESS, Cmd);
  110.      }
  111. }
  112. else
  113. {
  114. nScanTime++;
  115. }
  116. }
  117. else
  118. {
  119. oldCmd = Cmd;
  120. oldCmdFlag = 1;
  121. nScanTime = 0;
  122. }
  123. }
  124. else
  125. {
  126. oldCmd = Cmd;
  127. oldCmdFlag = 1;
  128. nScanTime = 0;
  129. if((gKeyCallBackFunc != NULL) && (bIRCEnabled == 1))
  130. {
  131. gKeyCallBackFunc(KEY_PRESS, Cmd);
  132. }
  133. }
  134.             }
  135.         }
  136. else if ((ST_ErrorCode == ST_NO_ERROR) && (! NumReceived))
  137. {
  138. if (oldCmdFlag)
  139. {
  140. if((gKeyCallBackFunc != NULL) && (bIRCEnabled == 1))
  141. {
  142. gKeyCallBackFunc(KEY_RELEASE, oldCmd);
  143. }
  144. oldCmd = 0;
  145. oldCmdFlag = 0;
  146. nScanTime = 0;
  147. }
  148. else
  149. {
  150. nScanTime = 0;
  151. }
  152. }
  153.     }
  154. }
  155. #endif
  156. void IRCEvtCallback(  STEVT_CallReason_t Reason,
  157.                             const ST_DeviceName_t RegistrantName,
  158.                             STEVT_EventConstant_t Event,
  159.                             const void *EventData,
  160.                             const void *SubscriberData_p)
  161. {
  162. switch (Event)
  163.     {
  164.         case STBLAST_READ_DONE_EVT:
  165. KB_OSPSemSet(BlasterSemaphore_p);
  166.             break;
  167.         default:
  168.             break;
  169.     }
  170. }
  171. /* 对一个字节的高低位互换 */
  172. static UINT8 SwapByte(UINT8 data)
  173. {
  174. int i;
  175. UINT8 tmp = 0;
  176. for(i=0; i<4; i++)
  177. {
  178. tmp |= ((data >> i) & 0x01) << (7-i);
  179. tmp |= ((data >> (7-i)) & 0x01) << i;
  180. }
  181. return tmp;
  182. }
  183. /* EOF */