board_key.h/board_key.c
/*******************************************************************************
Filename: board_key.h
Revised: $Date: 2014-02-28 14:18:14 -0800 (Fri, 28 Feb 2014) $
Revision: $Revision: 37461 $ Description: This file contains the SRF06EB Key Service definitions
and prototypes.
********************************************************************************
适用于按键单击检测及处理,不能检测及处理连按2次按键(双击)
********************************************************************************
使用说明:
1.在需要使用board_key.c的应用程序中包含board_key.h头文件。
#include "board_key.h"
2.在需要使用board_key.c的应用程序中定义按键事件,宏名根据实际应用修改。
#define SBP_KEY_CHANGE_EVT 0x0010
3.在需要使用board_key.c的应用程序中声明按键回调函数及按键处理函数。
static void SimpleBLEPeripheral_keyChangeHandler(uint8 keys); // 按键回调
static void SimpleBLEPeripheral_handleKeys(uint8_t shift, uint8_t keys); // 按键处理
4.在需要使用board_key.c的应用程序中定义按键回调函数及按键处理函数,消息结构体
可能需要根据实际应用修改。
void SimpleBLEPeripheral_keyChangeHandler(uint8 keys)
{
SimpleBLEPeripheral_enqueueMsg(SBP_KEY_CHANGE_EVT, keys); // 在swi中发按键消息
}
static void SimpleBLEPeripheral_handleKeys(uint8_t shift, uint8_t keys)
{
(void)shift; // Intentionally unreferenced parameter if (keys & Board_KEY_SELECT)
{
Board_blinkLed( Board_LED2, 250, 1 ); // 闪烁周期500ms,闪烁1次
return;
}
if (keys & Board_KEY_UP)
{
return;
}
if (keys & Board_KEY_RIGHT)
{
return;
}
if (keys & Board_KEY_SELECT)
{
return;
}
if (keys & Board_KEY_DOWN)
{
return;
}
}
5.在应用程序中初始化按键,同时传入app层按建回调函数(发键值消息给task线程)
Board_initKeys(SimpleBLEPeripheral_keyChangeHandler);
6.在应用程序中的消息处理函数
(如:static void SimpleBLEPeripheral_processAppMsg(sbpEvt_t *pMsg))
中添加如下代码:
case SBP_KEY_CHANGE_EVT:
SimpleBLEPeripheral_handleKeys(0, pMsg->hdr.state); // 在task线程处理按键
break;
********************************************************************************
原理说明:
1.按键ISR中读取键值并保存键值 // hwi线程
2.按键回调函数发送键值消息 // swi线程
3.按键处理函数处理按键 // task线程
*******************************************************************************/ #ifndef BOARD_KEY_H
#define BOARD_KEY_H #ifdef __cplusplus
extern "C" {
#endif /*********************************************************************
* INCLUDES
*/ /*********************************************************************
* EXTERNAL VARIABLES
*/ /*********************************************************************
* CONSTANTS
*/
#define KEY_SELECT 0x0001
#define KEY_UP 0x0002
#define KEY_DOWN 0x0004
#define KEY_LEFT 0x0008
#define KEY_RIGHT 0x0010 // Debounce timeout in milliseconds
#define KEY_DEBOUNCE_TIMEOUT 200 /*********************************************************************
* TYPEDEFS
*/
typedef void (*keysPressedCB_t)(uint8 keysPressed); /*********************************************************************
* MACROS
*/ /*********************************************************************
* API FUNCTIONS
*/ /*********************************************************************
* @fn Board_initKeys
*
* @brief Enable interrupts for keys on GPIOs.
*
* @param appKeyCB - application key pressed callback
*
* @return none
*/
void Board_initKeys(keysPressedCB_t appKeyCB); /*********************************************************************
*********************************************************************/ #ifdef __cplusplus
}
#endif #endif /* BOARD_KEY_H */
/*******************************************************************************
Filename: board_key.c
Revised: $Date: 2014-03-10 07:29:12 -0700 (Mon, 10 Mar 2014) $
Revision: $Revision: 37597 $ Description: This file contains the interface to the SRF06EB Key Service.
*******************************************************************************/ /*********************************************************************
* INCLUDES
*/
#include <stdbool.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/family/arm/m3/Hwi.h>
#include <ti/sysbios/knl/Semaphore.h>
#include <ti/sysbios/knl/Queue.h> #include <ti/drivers/pin/PINCC26XX.h> #ifdef USE_ICALL
#include <ICall.h>
#endif #include <inc/hw_ints.h>
#include "bcomdef.h" #include "util.h"
#include "board_key.h"
#include "Board.h" /*********************************************************************
* TYPEDEFS
*/ /*********************************************************************
* LOCAL FUNCTIONS
*/
static void Board_keyChangeHandler(UArg a0);
static void Board_keyCallback(PIN_Handle hPin, PIN_Id pinId); /*******************************************************************************
* EXTERNAL VARIABLES
*/ /*********************************************************************
* LOCAL VARIABLES
*/ // Value of keys Pressed
static uint8_t keysPressed; // Key debounce clock
static Clock_Struct keyChangeClock; // Pointer to application callback
keysPressedCB_t appKeyChangeHandler = NULL; // Memory for the GPIO module to construct a Hwi
Hwi_Struct callbackHwiKeys; // PIN configuration structure to set all KEY pins as inputs with pullups enabled
PIN_Config keyPinsCfg[] =
{
Board_KEY_SELECT | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLUP,
Board_KEY_UP | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLUP,
Board_KEY_DOWN | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLUP,
Board_KEY_LEFT | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLUP,
Board_KEY_RIGHT | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLUP,
PIN_TERMINATE
}; PIN_State keyPins;
PIN_Handle hKeyPins; /*********************************************************************
* PUBLIC FUNCTIONS
*/
/*********************************************************************
* @fn Board_initKeys
*
* @brief Enable interrupts for keys on GPIOs.
*
* @brief task
*
* @param appKeyCB - application key pressed callback
*
* @return none
*/
void Board_initKeys(keysPressedCB_t appKeyCB)
{
// Initialize KEY pins. Enable int after callback registered
hKeyPins = PIN_open(&keyPins, keyPinsCfg);
PIN_registerIntCb(hKeyPins, Board_keyCallback); PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_SELECT | PIN_IRQ_NEGEDGE);
PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_UP | PIN_IRQ_NEGEDGE);
PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_DOWN | PIN_IRQ_NEGEDGE);
PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_LEFT | PIN_IRQ_NEGEDGE);
PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_RIGHT | PIN_IRQ_NEGEDGE); #ifdef POWER_SAVING
//Enable wakeup
PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_SELECT | PINCC26XX_WAKEUP_NEGEDGE);
PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_UP | PINCC26XX_WAKEUP_NEGEDGE);
PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_DOWN | PINCC26XX_WAKEUP_NEGEDGE);
PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_LEFT | PINCC26XX_WAKEUP_NEGEDGE);
PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_RIGHT | PINCC26XX_WAKEUP_NEGEDGE);
#endif // Setup keycallback for keys
Util_constructClock(&keyChangeClock, Board_keyChangeHandler,
KEY_DEBOUNCE_TIMEOUT, , false, ); // Set the application callback
appKeyChangeHandler = appKeyCB;
} /*********************************************************************
* @fn Board_keyCallback
*
* @brief Interrupt handler for Keys
*
* @brief hwi
*
* @param none
*
* @return none
*/
static void Board_keyCallback(PIN_Handle hPin, PIN_Id pinId)
{
keysPressed = ; if ( PIN_getInputValue(Board_KEY_SELECT) == )
{
keysPressed |= KEY_SELECT;
} if ( PIN_getInputValue(Board_KEY_UP) == )
{
keysPressed |= KEY_UP;
} if ( PIN_getInputValue(Board_KEY_DOWN) == )
{
keysPressed |= KEY_DOWN;
} if ( PIN_getInputValue(Board_KEY_LEFT) == )
{
keysPressed |= KEY_LEFT;
} if ( PIN_getInputValue(Board_KEY_RIGHT) == )
{
keysPressed |= KEY_RIGHT;
} Util_startClock(&keyChangeClock);
} /*********************************************************************
* @fn Board_keyChangeHandler
*
* @brief Handler for key change
*
* @brief swi
*
* @param UArg a0 - ignored
*
* @return none
*/
static void Board_keyChangeHandler(UArg a0)
{
if (appKeyChangeHandler != NULL)
{
// Notify the application
(*appKeyChangeHandler)(keysPressed);
}
}
/*********************************************************************
*********************************************************************/
board_key.h/board_key.c的更多相关文章
- APUE中fcntl.h的使用及O_SYNC在Mac与Ubuntu下的测试
此部分测试涉及到APUE V3中,第三章的图3-12到图3-14. 通过fcntl.h提供的功能,修改fd的文件属性,本处增加O_SYNC功能,并测试其效果. 本文涉及代码: tree ch3 ch3 ...
- 关于apue.3e中apue.h的使用
关于apue.3e中apue.h的使用 近来要学一遍APUE第三版,并于此开博做为记录. 先下载源文件: # url: http://http//www.apuebook.com/code3e.htm ...
- YYModel 源码解读(二)之NSObject+YYModel.h (1)
本篇文章主要介绍 _YYModelPropertyMeta 前边的内容 首先先解释一下前边的辅助函数和枚举变量,在写一个功能的时候,这些辅助的东西可能不是一开始就能想出来的,应该是在后续的编码过程中 ...
- YYModel 源码解读(一)之YYModel.h
#if __has_include(<YYModel/YYModel.h>) FOUNDATION_EXPORT double YYModelVersionNumber; FOUNDATI ...
- error RC1015: cannot open include file 'afxres.h' 解决办法
在为WindowsPhone8程序添加本地化的过程中遇到这个问题: 问题原因就是afxres.h文件缺失,下载它,放到VS安装目录下的VS\include目录下就可以了(选择目录的时候注意对应对版本) ...
- afxcomctl32.h与afxcomctl32.inl报错
afxcomctl32.h与afxcomctl32.inl报错 编译公司一个几年前的老项目,是从VC6.0升级到VS2005的. 1.编译时报缺少头文件,于是附件包含目录,于是出现了以下报错: 1&g ...
- C标准头文件<math.h>
定义域错误可以理解为超出了函数的适用范围,如果发生了定义域错误,设errno为EDOM 如果结果不能表示为double值,则发生值域错误,如果结果上溢,则函数返回HUGE_VAL的值,设errno为E ...
- C标准头文件<ctype.h>
主要包括了一些字符识别和转换函数 字符判断 isalnum() //函数原型 #include<ctype.h> int isalum(int c); 功能:如果输入的字符是字母(alph ...
- xcode中的.h和.m文件分别是什么意思?各有什么用?
.h 表示头文件,用来声明各种成员变量,方法,属性之类的.在import的时候用头文件. .m 主要用来实现.h 里声明的方法.举个例子,如果要写一个方法,你要在.h里先声明: - (void)myM ...
随机推荐
- Mysql--基础(一)
MySQL基础 一.数据库的操作 1.SQL分类: DDL(数据定义语言) :数据定义语言 - Data Definition Language,用来定义数据库的对象,如数据表.视图.索引等.常用 ...
- golang操作memcached 转自https://blog.csdn.net/weixin_37696997/article/details/78760397
go使用memcached需要第三方的驱动库,这里有一个库是memcached作者亲自实现的,代码质量效率肯定会有保障 1:安装 go get github.com/bradfitz/gomemcac ...
- 新安装mysql,如何提升mysql安全性
1.修改mysql默认端口,将3306修改为其他端口. 2.设定足够复杂的密码策略并指定访问IP(在user表中可以指定用户可访问的访问IP地址). 3.设定IP访问白名单. 4.设定root用户只能 ...
- 梯度消失(vanishing gradient)和梯度爆炸(exploding gradient)
转自https://blog.csdn.net/guoyunfei20/article/details/78283043 神经网络中梯度不稳定的根本原因:在于前层上的梯度的计算来自于后层上梯度的乘积( ...
- g2o
高翔博士 g2o的代码框架 https://www.cnblogs.com/gaoxiang12/p/5304272.html 图优化理论和g2o的引入 https://www.cnblogs.com ...
- 初学者常用的LINUX命令
测试初学者常用的LINUX命令 一.常用管理命令:1. shutdown -h now 关机命令2. shutdown -r now (reboot) 立即重启命令 3. clear 清屏命令 4. ...
- 获取geometry边界范围的示例代码
根据sqlserver geometry数据定义获取空间类型边界范围 --获取指定街道边界的xy最大最小值 ) '--街道编码 create table #temp_point(id int iden ...
- SQL查询某库所有的表所有的字段及字段的属性
then d.name else null end) 表名, a.colorder 字段序号, a.name 字段名, ( then '√'else '' end) 标识, ( then '√' el ...
- Docker CMD in detail
CMD CMD 指令就是用于指定默认的容器主进程的启动命令的,我们直接 docker run -it ubuntu 的话,会直接进入 bash.我们也可以在运行时指定运行别的命令,如 docker r ...
- 微信小程序web-view的简单思考和实践
微信小程序的组件web-view推出有一段时间了,这个组件的推出可以说是微信小程序开发的一个重要事件,让微信小程序不会只束缚在微信圈子里了,打开了一个口子,这个口子或许还比较小,但未来有无限可能. 简 ...