CC2541的任务与事件,以及红外捕捉.
因为红外遥控要占用的系统中断时间可能超过了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的任务与事件,以及红外捕捉.的更多相关文章
- js事件冒泡和捕捉
(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...
- 【摘录自MDN】对事件冒泡和捕捉的解释
当一个事件触发了一个有父元素的元素(例如我们的<video>时),现代浏览器运行两个不同的阶段 - 捕获阶段和冒泡阶段. 在捕获阶段: 浏览器检查元素的最外层祖先(<html> ...
- CListCtrl的LVN_KEYDOWN事件中怎么捕捉不到回车键?
原文链接: http://computer-programming-forum.com/81-vc/c92ab6e6d6ac92bc.htm 楼主 How to handle the return k ...
- magento事件(event)的dispatchEvent(分发)和catchEvent(获取)
当你需要扩展Magento的核心的功能时有两个选择: (1)重写(override)Magento的core classes (2)使用Magento的event-driven 机制 由于你只能重写一 ...
- 【使用 DOM】使用事件
1. 使用简单事件处理器 可以用几种不同的方式处理事件.最直接的方式是用事件属性创建一个简单事件处理器(simple event handler).元素为它们支持的每一种事件都定义了一个事件属性.举个 ...
- 【温故而知新-Javascript】使用事件
1. 使用简单事件处理器 可以用几种不同的方式处理事件.最直接的方式是用事件属性创建一个简单事件处理器(simple event handler).元素为它们支持的每一种事件都定义了一个事件属性.举个 ...
- Android中Preference的使用以及监听事件分析
在Android系统源码中,绝大多数应用程序的UI布局采用了Preference的布局结构,而不是我们平时在模拟器中构建应用程序时使用的View布局结构,例如,Setting模块中布局.当然,凡事都有 ...
- android事件系列-onTouch事件与手势操作
提示记忆:应用流程:在Activity中对控件执行 view.setOnTouchListener( OnTouchListener i);实现里面的OnTouchListener 接口中的方法,重点 ...
- Magento事件机制 - Magento Event/Observer
为了扩展Magento的功能,我们可以重写Magento的代码,但因为代码只能被重写一次,所以当多个模块需要重写同一部分的代码时,就会引起冲突,好在Magento提供了另一种扩展功能的方法:事件机制, ...
随机推荐
- Hibernate中in语句ids
Query query=session.createQuery("from User where id in (:ids)"); query.setParameterList(&q ...
- 使用weave实现跨主机docker容器互联
关于weave的原理不做细致的说明,如果想了解weave可以登陆官网:https://www.weave.works/ In this post,使用阿里云3台ECS服务器进行weave搭建,并测试搭 ...
- Maven 介绍
1.maven的用途maven是一个项目构建和管理的工具,提供了帮助管理 构建.文档.报告.依赖.scms.发布.分发的方法.可以方便的编译代码.进行依赖管理.管理二进制库等等.maven的好处在于可 ...
- shell eval用法
转自:http://blog.csdn.net/w_ww_w/article/details/7075867 eval可读取一连串的参数,然后再依参数本身的特性来执行.eval是shell内建命令,可 ...
- RouteOS软路由HotSpot热点认证网关添加白名单和黑名单
1.添加白名单和黑名单地址池 白名单IP地址池 172.18.10.0/24 黑名单IP地址池 172.18.20.0/24 2.添加IP网关 白名单网关 172.18.10.0/24 黑名单网关 1 ...
- C#线程系列讲座(4):同步与死锁
虽然线程可以在一定程度上提高程序运行的效率,但也会产生一些副作用.让我们先看看如下的代码: class Increment { private int n = 0; ...
- ZooKeeper -- 分布式开源协调服务
ZooKeeper是一个为分布式应用所设计的开源协调服务,适用于大型的分布式系统,可以提供统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等服务.ZooKeeper支持Java和C两种编程 ...
- Codeforce Round #221 Div2
每次的CF都是一把辛酸泪! 什么时候能打破这局面,昨天做着睡着了! 有时候有的题目也就差一线! 哎,! A:杠杆原理! B:算最后负的和! B:没弄出来当时就脑短路... C:事后写了个n*log(n ...
- nyist 596 谁是最好的Coder
http://acm.nyist.net/JudgeOnline/problem.php?pid=596 谁是最好的Coder 时间限制:1000 ms | 内存限制:65535 KB 难度:0 ...
- HDU 4816 Bathysphere(数学)(2013 Asia Regional Changchun)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 Problem Description The Bathysphere is a spheric ...