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 ...
随机推荐
- Ubuntu 16下单机安装配置zookeeper和kafka
网上其他的没有一个能直接照做完成的,我这个也是看了些帖子,整出来的怕以后忘记 建议连接工具:Bitvise SSH Client 一.安装配置zookeeper 下载zookeeper 3.4.13: ...
- idea 启动项目提示 Command line is too long. Shorten command line for Application or also for Spring Boot default configuration.
在.idea 文件夹中打开workspace.xml文件找到<component name="PropertiesComponent">,在标签里加一行 <pr ...
- [JAVA]字节流拷贝文件
import java.io.*; public class CopyFile { public static void main(String[] args) { //1.创建源 File in = ...
- TCP/IP 通信
TCP/IP 通信又叫socket 通信,是基于TCP/IP协调面向连接的一个数据传输技术.是属于OSI国际标准的传输层,三次握手 提供数据,有序,安全,端到端的传输和接收.它有三个主要协议:传输控制 ...
- 没有可用软件包 libgdiplus 解决方法
1.下载 epel-release-7-11.noarch.rpm wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel ...
- 机器学习实战ch04 关于python版本所支持的文本格式问题
函数定义中: def spamTest(): docList=[]; classList = []; fullText =[] for i in range(1,26):# print('cycle ...
- squid 3.5 window x64
下载1: https://download.csdn.net/download/runliuv/11131620 下载2: 链接: https://pan.baidu.com/s/1A_o_Xvg1y ...
- ROS tf
一.节点中使用(cpp,python) 1. ros wiki 提供的tutorials 2. https://blog.csdn.net/start_from_scratch/article/det ...
- python基础知识17---装饰器2
函数式编程复习: def map_test(func,array): array_new=[] for i in array: array_new.append(func(i)) return arr ...
- ubuntu16.04 HyperLedger Fabric 1.2.0 开发环境搭建
安装准备 1. 安装git.cRUL.gcc/g++和make $ sudo apt-get update $ sudo apt-get install build-essential git cur ...