因为红外遥控要占用的系统中断时间可能超过了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. c3p0参数解释

    #最常用配置#initialPoolSize:连接池初始化时创建的连接数,default : 3,取值应在minPoolSize与maxPoolSize之间 c3p0.initialPoolSize= ...

  2. 关于ios导航控制器的知识总结

    关于ios导航控制器的知识总结 添加了导航控制器后: 1.一个导航控制器会有一个顶部导航栏navigationbar和一个底部工具栏toolbar,它们是导航控制器navC的属性.且导航栏默认是不隐藏 ...

  3. ref 关键字修饰引用类型

    对于再分配引用对象的引用的操作,没有Ref修饰时是不能在外部生效的,只有有Ref修饰的引用参数才能使再分配操作应用于外部 侵删.

  4. mysql centeros 安装

    http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html linux mysql允许远程连接 1.登录数据库:my ...

  5. UITableView + UISearchBar 实现搜索功能

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  6. 使用已有PDB克隆PDB

    使用已有PDB克隆PDB $ sqlplus '/as sysdba' SQL*Plus: Release Production on Tue Jun :: Copyright (c) , , Ora ...

  7. C# 6.0的新变化

    自动属性初始化 (Initializers for auto-properties) 以前我们是这么写的 为一个默认值加一个后台字段是不是很不爽,现在我们可以这样写 只读属性的初始化(Getter-o ...

  8. system(linux) power on note

    读詹荣开文档摘 BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader Boot Loader执行全 ...

  9. 理解JDBC和JNDI

    下面的英文是我找过来的,因为是英文所以不敢翻译出来误导别人,但是它描述的确实恰到好处,比所谓网上的JNDI和JDBC云云的解释要精辟很多,如果遇到不认识的单词,用有道吧~~:) The Java Na ...

  10. GTA项目 三, 使用 bootstrap table展示界面,使得data和UI分离

    /** bootstrap-table - v1.5.0 - 2014-12-12* https://github.com/wenzhixin/bootstrap-table* Copyright ( ...