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 ...
随机推荐
- idea 编译 内存不足
- linux的基本操作(一)
一.Linux组成 1.1:Linux各模块介绍 内核:是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序. Shell:是系统的用户界面,提供了用户和内核进行交互操作的一种接口.它接收 ...
- .net core2.0获取host的方法
Example there's an given url: http://localhost:4800/account/login 获取整个url地址: 在页面(cstml)中 Microsoft.A ...
- IntelliJ IDEA 下载安装以及破解
转载自:http://blog.csdn.net/my_jack/article/details/69248495 IDEA开发工具是java语言开发的集成环境,IntelliJ在业界被公认为最好的j ...
- Git 基础和原理
Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 Git 的时候,请努力分清你对其它版本管理系统的已 ...
- securecrt 方向键乱码解决
1 下载安装包rlwrap: rlwrap-0.30.tar.gz http://utopia.knoware.nl/~hlub/uck/rlwrap/ 2 install rlwrap ...
- Kong(V1.0.2) Clustering Reference
介绍 Kong集群允许您通过添加更多的机器来处理更多的传入请求来水平扩展系统.它们将共享相同的配置,因为它们指向相同的数据库.指向相同数据存储的Kong节点将是相同Kong集群的一部分. 您需要在Ko ...
- python笔记(三)---文件读写、修改文件内容、处理json、函数
文件读写(一) #r 只读,打开文件不存在的话,会报错 #w 只写,会清空原来文件的内容 #a 追加写,不会请求,打开的文件不存在的话,也会帮你新建的一个文件 print(f.read()) #获取到 ...
- Butterknife--Android Butterknife使用方法总结(转)
原文链接:http://blog.csdn.net/donkor_/article/details/77879630 前言: ButterKnife是一个专注于Android系统的View注入框架,以 ...
- UIView和CALayer区别
(1)首先UIView可以响应用户的触摸事件,Layer不可以. (2)View中frame getter方法,bounds和center,UIView并没有做什么工作:它只是简单的各自调用它底层的C ...