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 *********************************************************************/
原文地址:https://www.cnblogs.com/jxndsfss/p/5169533.html