因为红外遥控要占用的系统中断时间可能超过了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. JavaScript:通过id来进行元素的取得

    每一个HTML元素都使用id来进行一个标注,随后可以通过document.getElementById(“ID名称”)取得指定的ID元素对象,取得元素对象之后就可以对其进行操作. 但是document ...

  2. less 命令(转)

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  3. SourceTree工具进行提交合并代码步骤

    1.先安装SourceTree工具. beyong compare工具 2.在 SourceTree工具加载beyong compare插件 1.工具.选项.比较 2.就是修改.gitconfig文件 ...

  4. .Net内存优化的几点经验

    以前从来没有想过.Net开发居然存在内存无法释放的问题,总是认为GC给我处理好了一切.现在GIS二次开发结合三维球开发,没有想到存在如此严重的内存增长,很快内存就不够用了,导致系统各种不稳定.球体和三 ...

  5. cocos2dx 3.x(精灵的碰撞检测,点击移动与拖动精灵)

    // // MainScene.hpp // helloworld // // Created by apple on 16/9/19. // // #ifndef MainScene_hpp #de ...

  6. Java基础之创建窗口——使用SpringLayout管理器(TrySpringLayout)

    控制台程序. 可以把JFrame对象aWindow的内容面板的布局管理器设置为javax.swing.SpringLayout管理器. SpringLayout类定义的布局管理器根据javax.swi ...

  7. Java基础之序列化对象——反序列化对象(DeserializeObjects)

    控制台程序,使用如下代码能读入包含Junk对象的文件: import java.io.*; import java.nio.file.*; class DeserializeObjects { pub ...

  8. Java基础之写文件——将多个字符串写入到文件中(WriteProverbs)

    控制台程序,将一系列有用的格言写入到文件中. 本例使用通道把不同长度的字符串写入到文件中,为了方便从文件中恢复字符串,将每个字符串的长度写入到文件中紧靠字符串本身前面的位置,这可以告知在读取字符串之前 ...

  9. wampserver下修改mysql root用户的登录密码

    1.安装好wamp后,运行WampServer程序,进入MYSQL控制台; 2.进入控制台后,提示输入密码(不用输入任何密码,因为密码为空),按回车键进入; 3.输入“USE mysql;”然后回车, ...

  10. Lintcode: Sort Colors II

    Given an array of n objects with k different colors (numbered from 1 to k), sort them so that object ...