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 ...
随机推荐
- CRM-展示列表,分页功能
目录 一.admin (创建超级用户) 二.展示列表 三.分页(封装成类) 一.admin (创建超级用户) 1.注册: 1.创建一个超级管理员,使用如下命令: python manage.py ...
- 测试CentOS-7-x86_64-Minimal-1708.iso这种光盘安装效果
在dvd1光盘安装选择mininal时有292个包 [root@localhost ~]# rpm -qa|wc -l 292 [root@localhost ~]# 测试下使用mininal的iso ...
- pycharm操作
- 46 Simple Python Exercises (前20道题)
46 Simple Python Exercises This is version 0.45 of a collection of simple Python exercises construct ...
- tomcat 闪退问题排查
由于启动tomcat回出现闪退情况,看不到异常 解决方法: 一. 打开startup.bat文件,在最下面 在文本的最后敲上pause,保存后重新运行startup.bat,这时候窗口会留在桌面上(调 ...
- My Demos
Some elementary algorithms on discrete differential geometry http://www.cnblogs.com/yaoyansi/p/56350 ...
- idea导入svn项目
起初和导入git项目一样,file - new - project from version control - ,这后面选 subversion. 在打开的 checkout from subver ...
- Android编程-Activity
重要的回调函数: onCreate():初始化activity要用的其他的组件(可以是其他的activity和contentprovider之类).调用setContentView(),设定本Acti ...
- Java中final、finally、finalize有什么区别?
final.finally和finalize的区别是什么? final: 最终的意思,可以修饰类,方法和变量. 它修饰的类,不能被继承 它修饰的方法,不能被重写 它修饰的变量,不能被改变 finall ...
- 2018/12/19 20:55:58 螺纹钢豆粕PTA
螺纹钢M5中枢上升到M30级别,感觉向上的可能高..可是没有好的开仓位,那就不用硬要开仓,耐心等待自己熟悉的信号: PTA M5中枢扩展为M30中枢,目前M30向下一笔没结束: 豆粕等待当前日线下跌结 ...