因为红外遥控要占用的系统中断时间可能超过了80ms, 极有可能导致蓝牙断线, 特别是连续两次按键, 100%断线.

后来根据蓝牙技术群里的哥们提示, 觉得不能在一个中断中delay得太久, 只能用任务跟事件的情势来实现了.

首先原理是, 利用现有的SimpleBLEPeripheval的这个任务, 增加一个处理案件的事件.

#define SBP_CATCH_IRF_EVT   0x0008

接着写一个输入口的下降沿触发的中断:

volatile unsigned char readingISR=0;
#pragma vector = P0INT_VECTOR      
__interrupt void P0_ISR(void)   
{   
    key_nop();
    if(NOT_DISPLAYING==sysStatus)
    {
        if(Key_Check_Pin() == KEY_PRESS)   
        {         
        unsigned char IRCOM[7]={0,0,0,0,0,0,0};
        if(readingISR==0){
            readingISR=1;          
            readISROrigin(IRCOM);
            readingISR=0;
        }      
        }
    }  
    P0IFG &=~(1<<2);       //清除中断标志
    P0IF = 0;        //清除中断标志
    key_nop();
}

具体init的方法就不贴了.

readISROrigin(IRCOM)其实输入是没用的.

实际原本是在这个方法中捕捉输入的.

但是不是延时太长会断蓝牙么, 在这儿仅仅判断一下起始条件:

void readISROrigin(uint8* IRCOM)
{
    //unsigned char j,k,N=0;
    //EA = 0;
    disableP02Int();
    key_delay_140us(15);
    if (IRIN==1)
    {
        //EA =1;
        enableP02Int();
        return;
    }
    while (!IRIN)  //等变高       
    {key_delay_140us(1);}
    
    osal_start_timerEx(11, 8, 1);

}

红框的后半部分, 等升高, 具体的红外的协议, 就是一开始一个9.38ms的一个低电平, 然后一个4.24ms高电平, 表示开始, 具体多久我不管了, 没空.

总之捕捉到这个电平变换, 发送一个event, 这个event之前定义了是0x0008二进制数是从右边数第3个bit是1.

osal_start_timerEx(11, 8, 1);

其实正常的写法应该是用

osal_start_timerEx(simpleBLEPeripheral_TaskID, SBP_CATCH_IRF_EVT, 1);

最后内个1表示1ms后发消息.

然后就是在simpleBLEPeripheval.c里面处理event的方法里面, 增加对SBP_CATCH_IRF_EVT的响应.

uint16 SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
{

....

if(events & SBP_CATCH_IRF_EVT){
      uint8 ircom=ISR_BLANK_CODE;
      ircom=readISRP0_2();
      if(ircom==0){
          osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_CATCH_IRF_EVT, 1 );
     
      }else if(ircom==0xFF){
          osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_CATCH_IRF_EVT, 1 );   
          
      }else if(ircom!=ISR_BLANK_CODE){
          handleRemoteButtonPressed(ircom);
      }
      
    
      return (events ^ SBP_CATCH_IRF_EVT);
  }

...

}

先捕捉第1个字节:

if(ircom==0){
          osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_CATCH_IRF_EVT, 1 );
     ..

接着捕捉第2个字节:

}else if(ircom==0xFF){
          osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_CATCH_IRF_EVT, 1 );

第3个字节:

}else if(ircom!=ISR_BLANK_CODE){
          handleRemoteButtonPressed(ircom);
      }

第4个字节:

第4个字节不管了.

捕捉到第3个字节的时候, 就去比较是否是按键的红外编码:

void handleRemoteButtonPressed(uint8 code){
    if(NOT_DISPLAYING==sysStatus){
        switch(code){
        case RemoteButton1:
            sysStatus=DISPLAYING;
            playSentence(1);
        break;
        
        case RemoteButton2:
            sysStatus=DISPLAYING;
            playSentence(2);
        break;

....

}

比较如果有合适的, 就播放对应的字符串.

CC2541的任务与事件,以及红外捕捉.的更多相关文章

  1. js事件冒泡和捕捉

    (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...

  2. 【摘录自MDN】对事件冒泡和捕捉的解释

    当一个事件触发了一个有父元素的元素(例如我们的<video>时),现代浏览器运行两个不同的阶段 - 捕获阶段和冒泡阶段. 在捕获阶段: 浏览器检查元素的最外层祖先(<html> ...

  3. CListCtrl的LVN_KEYDOWN事件中怎么捕捉不到回车键?

    原文链接: http://computer-programming-forum.com/81-vc/c92ab6e6d6ac92bc.htm 楼主 How to handle the return k ...

  4. magento事件(event)的dispatchEvent(分发)和catchEvent(获取)

    当你需要扩展Magento的核心的功能时有两个选择: (1)重写(override)Magento的core classes (2)使用Magento的event-driven 机制 由于你只能重写一 ...

  5. 【使用 DOM】使用事件

    1. 使用简单事件处理器 可以用几种不同的方式处理事件.最直接的方式是用事件属性创建一个简单事件处理器(simple event handler).元素为它们支持的每一种事件都定义了一个事件属性.举个 ...

  6. 【温故而知新-Javascript】使用事件

    1. 使用简单事件处理器 可以用几种不同的方式处理事件.最直接的方式是用事件属性创建一个简单事件处理器(simple event handler).元素为它们支持的每一种事件都定义了一个事件属性.举个 ...

  7. Android中Preference的使用以及监听事件分析

    在Android系统源码中,绝大多数应用程序的UI布局采用了Preference的布局结构,而不是我们平时在模拟器中构建应用程序时使用的View布局结构,例如,Setting模块中布局.当然,凡事都有 ...

  8. android事件系列-onTouch事件与手势操作

    提示记忆:应用流程:在Activity中对控件执行 view.setOnTouchListener( OnTouchListener i);实现里面的OnTouchListener 接口中的方法,重点 ...

  9. Magento事件机制 - Magento Event/Observer

    为了扩展Magento的功能,我们可以重写Magento的代码,但因为代码只能被重写一次,所以当多个模块需要重写同一部分的代码时,就会引起冲突,好在Magento提供了另一种扩展功能的方法:事件机制, ...

随机推荐

  1. Mysql-5.6.30卸载

    Mysql-5.6.30卸载 一.删除相关文件 rm  -rf  /var/lib/mysql/mysql   (删除数据文件) rm  -f  /root/.mysql_secure    (删除缺 ...

  2. 解决MyEclipse吃内存以及卡死的方法

    前言:MyEclipse5.5 大小 139M:MyEclipse6.5 大小 451M:MyEclipse7.0 大小 649M!下载服务器又是国外的...下载速度累人也就罢了,只要你工作性能一流. ...

  3. Linux 使用 bg 和 fg 切换任务运行状态

    将Linux任务转换到后台执行 平时在运行 Linux 任务时,在任务运行时又想运行其它任务,那么可以把任务切换到后台运行. 使用 ctrl+z 可以把当前的任务转入到后台,这时任务并没有被中止,可使 ...

  4. [BS-24] UIImageView的contentMode属性

    UIImageView的contentMode属性   所有的UIView都有个contentMode属性,UIImageView继承自UIView,我们在使用UIImageView时,经常要考虑这些 ...

  5. Java 线程池的介绍以及工作原理

    在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1. 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗.2. 提高响应速度: ...

  6. python set add 导致问题 TypeError: unhashable type: 'list'

    问题复现 >>> a = set() >>> b = set() >>> b.add(1) >>> a.add(b) Trace ...

  7. Using Amazon API Gateway with microservices deployed on Amazon ECS

    One convenient way to run microservices is to deploy them as Docker containers. Docker containers ar ...

  8. JAX-WS(一)之使用wsgen从Java创建简单的WebService

    概念 JAX-WS2.0的全称Java API for XML-Based Web Service 2.0.JAX-WS2.0是对JAX-RPC1.0规范的扩展,是JAX-RPC1.1的后续版本,JA ...

  9. Git_Commands

  10. PostgreSQL 三节点集群故障模拟及恢复

    PostgreSQL 三节点集群故障模拟及恢复 (postgreSQL9.5.1) 正常状态: 10.2.208.10:node1:master 10.2.208.11:node2:standby1同 ...