• board_key.h/board_key.c


      1 /*******************************************************************************
      2   Filename:       board_key.h
      3   Revised:        $Date: 2014-02-28 14:18:14 -0800 (Fri, 28 Feb 2014) $
      4   Revision:       $Revision: 37461 $
      5 
      6   Description:    This file contains the SRF06EB Key Service definitions
      7                   and prototypes.
      8 ********************************************************************************
      9             适用于按键单击检测及处理,不能检测及处理连按2次按键(双击)
     10 ********************************************************************************
     11 使用说明:
     12     1.在需要使用board_key.c的应用程序中包含board_key.h头文件。
     13         #include "board_key.h"
     14     2.在需要使用board_key.c的应用程序中定义按键事件,宏名根据实际应用修改。
     15         #define SBP_KEY_CHANGE_EVT                    0x0010
     16     3.在需要使用board_key.c的应用程序中声明按键回调函数及按键处理函数。
     17         static void SimpleBLEPeripheral_keyChangeHandler(uint8 keys);                // 按键回调
     18         static void SimpleBLEPeripheral_handleKeys(uint8_t shift, uint8_t keys);    // 按键处理
     19     4.在需要使用board_key.c的应用程序中定义按键回调函数及按键处理函数,消息结构体
     20         可能需要根据实际应用修改。
     21         void SimpleBLEPeripheral_keyChangeHandler(uint8 keys)
     22         {
     23           SimpleBLEPeripheral_enqueueMsg(SBP_KEY_CHANGE_EVT, keys);        // 在swi中发按键消息
     24         }
     25         static void SimpleBLEPeripheral_handleKeys(uint8_t shift, uint8_t keys)
     26         {
     27           (void)shift;  // Intentionally unreferenced parameter
     28 
     29           if (keys & Board_KEY_SELECT)
     30           {
     31             Board_blinkLed( Board_LED2, 250, 1 );                        // 闪烁周期500ms,闪烁1次
     32             return;
     33           }
     34           if (keys & Board_KEY_UP)
     35           {
     36             return;
     37           }
     38           if (keys & Board_KEY_RIGHT)
     39           {
     40             return;
     41           }
     42           if (keys & Board_KEY_SELECT)
     43           {
     44             return;
     45           }
     46           if (keys & Board_KEY_DOWN)
     47           {
     48             return;
     49           }
     50         }
     51     5.在应用程序中初始化按键,同时传入app层按建回调函数(发键值消息给task线程)
     52         Board_initKeys(SimpleBLEPeripheral_keyChangeHandler);
     53     6.在应用程序中的消息处理函数
     54         (如:static void SimpleBLEPeripheral_processAppMsg(sbpEvt_t *pMsg))
     55         中添加如下代码:
     56         case SBP_KEY_CHANGE_EVT:
     57               SimpleBLEPeripheral_handleKeys(0, pMsg->hdr.state);    // 在task线程处理按键
     58           break;
     59 ********************************************************************************
     60     原理说明:
     61         1.按键ISR中读取键值并保存键值                            // hwi线程
     62         2.按键回调函数发送键值消息                                // swi线程
     63         3.按键处理函数处理按键                                    // task线程
     64 *******************************************************************************/
     65 
     66 #ifndef BOARD_KEY_H
     67 #define BOARD_KEY_H
     68 
     69 #ifdef __cplusplus
     70 extern "C" {
     71 #endif
     72 
     73 /*********************************************************************
     74  * INCLUDES
     75  */
     76 
     77 /*********************************************************************
     78 *  EXTERNAL VARIABLES
     79 */
     80 
     81 /*********************************************************************
     82  * CONSTANTS
     83  */
     84 #define KEY_SELECT            0x0001
     85 #define KEY_UP                0x0002
     86 #define KEY_DOWN              0x0004
     87 #define KEY_LEFT              0x0008
     88 #define KEY_RIGHT             0x0010
     89    
     90 // Debounce timeout in milliseconds
     91 #define KEY_DEBOUNCE_TIMEOUT  200
     92 
     93 /*********************************************************************
     94  * TYPEDEFS
     95  */
     96 typedef void (*keysPressedCB_t)(uint8 keysPressed);
     97 
     98 /*********************************************************************
     99  * MACROS
    100  */
    101 
    102 /*********************************************************************
    103  * API FUNCTIONS
    104  */
    105 
    106 /*********************************************************************
    107  * @fn      Board_initKeys
    108  *
    109  * @brief   Enable interrupts for keys on GPIOs.
    110  *
    111  * @param   appKeyCB - application key pressed callback
    112  *
    113  * @return  none
    114  */
    115 void Board_initKeys(keysPressedCB_t appKeyCB);
    116 
    117 /*********************************************************************
    118 *********************************************************************/  
    119 
    120 #ifdef __cplusplus
    121 }
    122 #endif
    123 
    124 #endif /* BOARD_KEY_H */
      1 /*******************************************************************************
      2   Filename:       board_key.c
      3   Revised:        $Date: 2014-03-10 07:29:12 -0700 (Mon, 10 Mar 2014) $
      4   Revision:       $Revision: 37597 $
      5 
      6   Description:    This file contains the interface to the SRF06EB Key Service.
      7 *******************************************************************************/
      8 
      9 /*********************************************************************
     10  * INCLUDES
     11  */
     12 #include <stdbool.h>
     13 #include <ti/sysbios/knl/Clock.h>
     14 #include <ti/sysbios/family/arm/m3/Hwi.h>
     15 #include <ti/sysbios/knl/Semaphore.h>
     16 #include <ti/sysbios/knl/Queue.h>
     17 
     18 #include <ti/drivers/pin/PINCC26XX.h>
     19 
     20 #ifdef USE_ICALL
     21 #include <ICall.h>
     22 #endif
     23    
     24 #include <inc/hw_ints.h>
     25 #include "bcomdef.h"
     26 
     27 #include "util.h"
     28 #include "board_key.h"
     29 #include "Board.h"
     30 
     31 /*********************************************************************
     32  * TYPEDEFS
     33  */
     34 
     35 /*********************************************************************
     36  * LOCAL FUNCTIONS
     37  */
     38 static void Board_keyChangeHandler(UArg a0);
     39 static void Board_keyCallback(PIN_Handle hPin, PIN_Id pinId);
     40 
     41 /*******************************************************************************
     42  * EXTERNAL VARIABLES
     43  */
     44 
     45 /*********************************************************************
     46  * LOCAL VARIABLES
     47  */
     48 
     49 // Value of keys Pressed
     50 static uint8_t keysPressed;
     51 
     52 // Key debounce clock
     53 static Clock_Struct keyChangeClock;
     54 
     55 // Pointer to application callback
     56 keysPressedCB_t appKeyChangeHandler = NULL;
     57 
     58 // Memory for the GPIO module to construct a Hwi
     59 Hwi_Struct callbackHwiKeys;
     60 
     61 // PIN configuration structure to set all KEY pins as inputs with pullups enabled
     62 PIN_Config keyPinsCfg[] =
     63 {
     64     Board_KEY_SELECT    | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,
     65     Board_KEY_UP        | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,
     66     Board_KEY_DOWN      | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,
     67     Board_KEY_LEFT      | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,
     68     Board_KEY_RIGHT     | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,
     69     PIN_TERMINATE
     70 };
     71 
     72 PIN_State  keyPins;
     73 PIN_Handle hKeyPins;
     74 
     75 /*********************************************************************
     76  * PUBLIC FUNCTIONS
     77  */
     78 /*********************************************************************
     79  * @fn      Board_initKeys
     80  *
     81  * @brief   Enable interrupts for keys on GPIOs.
     82  *
     83  * @brief   task
     84  *
     85  * @param   appKeyCB - application key pressed callback
     86  *
     87  * @return  none
     88  */
     89 void Board_initKeys(keysPressedCB_t appKeyCB)
     90 {
     91   // Initialize KEY pins. Enable int after callback registered
     92   hKeyPins = PIN_open(&keyPins, keyPinsCfg);
     93   PIN_registerIntCb(hKeyPins, Board_keyCallback);
     94   
     95   PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_SELECT  | PIN_IRQ_NEGEDGE);
     96   PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_UP      | PIN_IRQ_NEGEDGE);
     97   PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_DOWN    | PIN_IRQ_NEGEDGE);
     98   PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_LEFT    | PIN_IRQ_NEGEDGE);
     99   PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_RIGHT   | PIN_IRQ_NEGEDGE);
    100 
    101 #ifdef POWER_SAVING
    102   //Enable wakeup
    103   PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_SELECT | PINCC26XX_WAKEUP_NEGEDGE);
    104   PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_UP | PINCC26XX_WAKEUP_NEGEDGE);
    105   PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_DOWN | PINCC26XX_WAKEUP_NEGEDGE);
    106   PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_LEFT | PINCC26XX_WAKEUP_NEGEDGE);
    107   PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_RIGHT | PINCC26XX_WAKEUP_NEGEDGE);
    108 #endif
    109   
    110   // Setup keycallback for keys
    111   Util_constructClock(&keyChangeClock, Board_keyChangeHandler,
    112                       KEY_DEBOUNCE_TIMEOUT, 0, false, 0);
    113 
    114   // Set the application callback
    115   appKeyChangeHandler = appKeyCB;
    116 }
    117 
    118 /*********************************************************************
    119  * @fn      Board_keyCallback
    120  *
    121  * @brief   Interrupt handler for Keys
    122  *
    123  * @brief   hwi
    124  *
    125  * @param   none
    126  *
    127  * @return  none
    128  */
    129 static void Board_keyCallback(PIN_Handle hPin, PIN_Id pinId)
    130 {
    131   keysPressed = 0;
    132 
    133   if ( PIN_getInputValue(Board_KEY_SELECT) == 0 )
    134   {
    135     keysPressed |= KEY_SELECT;
    136   }
    137 
    138   if ( PIN_getInputValue(Board_KEY_UP) == 0 )
    139   {
    140     keysPressed |= KEY_UP;
    141   }
    142 
    143   if ( PIN_getInputValue(Board_KEY_DOWN) == 0 )
    144   {
    145     keysPressed |= KEY_DOWN;
    146   }
    147 
    148   if ( PIN_getInputValue(Board_KEY_LEFT) == 0 )
    149   {
    150     keysPressed |= KEY_LEFT;
    151   }
    152 
    153   if ( PIN_getInputValue(Board_KEY_RIGHT) == 0 )
    154   {
    155     keysPressed |= KEY_RIGHT;
    156   }
    157 
    158   Util_startClock(&keyChangeClock);
    159 }
    160 
    161 /*********************************************************************
    162  * @fn      Board_keyChangeHandler
    163  *
    164  * @brief   Handler for key change
    165  *
    166  * @brief   swi
    167  *
    168  * @param   UArg a0 - ignored
    169  *
    170  * @return  none
    171  */
    172 static void Board_keyChangeHandler(UArg a0)
    173 {
    174   if (appKeyChangeHandler != NULL)
    175   {
    176     // Notify the application
    177     (*appKeyChangeHandler)(keysPressed);
    178   }
    179 }
    180 /*********************************************************************
    181 *********************************************************************/
  • 相关阅读:
    云钉一体应用创新:音视频如何带来灵活高效的协同体验
    正则表达式,去除非数字。js动态计算
    使用DbContext实体类访问数据库
    C#字符串去除特殊字符
    实体类赋值给控件,控件赋值给实体类
    List去除重复项。
    分页查询的sql语句
    js页面处理常见问题
    .net Table 导出Excel
    上传文件。普通和ftp
  • 原文地址:https://www.cnblogs.com/jxndsfss/p/5169533.html
Copyright © 2020-2023  润新知