/******************************************************************************* * File Name : Key.c * Description : * Created on : 2020Äê11ÔÂ10ÈÕ * Author : www.hido-studio.com *******************************************************************************/ /******************************************************************************* * Include Files * *******************************************************************************/ #include "Key.h" #include "GPIO.h" #include "HIDO_Debug.h" /******************************************************************************* * Macro * *******************************************************************************/ /******************************************************************************* * Type Definition * *******************************************************************************/ typedef enum { PRESS_STATE_UP = 0, /* °´¼üÊÍ·Å״̬ */ PRESS_STATE_DOWN_DELAY, /* °´¼ü°´ÏÂÑÓʱ״̬(È¥¶¶) */ PRESS_STATE_DOWN, /* °´¼ü°´Ï */ PRESS_STATE_UP_DELAY, /* °´¼üÊÍ·ÅÑÓʱ״̬(È¥¶¶) */ }E_PressState; /******************************************************************************* * Local Variable * *******************************************************************************/ static TIM_HandleTypeDef *l_pstKeyScanTimerHandle = HIDO_NULL; static ST_GPIO l_astKeyPin[KEY_ID_MAX]; static HIDO_UINT16 l_au16KeyPress[KEY_ID_MAX]; static E_PressState l_aeKeyPressState[KEY_ID_MAX]; static HIDO_UINT32 l_au32KeyPressDelayTick[KEY_ID_MAX]; /******************************************************************************* * Local Function Declaration * *******************************************************************************/ /******************************************************************************* * Local Function * *******************************************************************************/ /******************************************************************************* * Global Function * *******************************************************************************/ /******************************************************************************* * Function Name : Key_EventFromISR * Description : ÕâÀïÊÇÒ»¸öÐ麯Êý£¬ÐèÒªÉϲãʵÏÖ * Input : _eID: °´¼ü * Input : _eEvent: ʼþ * Output : None * Return : None * Author : www.hido-studio.com * Modified Date: : 2020Äê11ÔÂ10ÈÕ *******************************************************************************/ __weak HIDO_VOID Key_EventFromISR(E_KeyID _eID, E_KeyEvent _eEvent) { HIDO_Debug("Key Event %u-%u\r\n", _eID, _eEvent); } /******************************************************************************* * Function Name : Key_10MsISR * Description : °´¼üɨÃ趨ʱÖжϴ¦Àíº¯Êý * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2020Äê11ÔÂ10ÈÕ *******************************************************************************/ void Key_10MsISR(void) { HIDO_UINT32 i = 0; /* ¹¦Äܼü */ for (i = 0; i < KEY_ID_MAX; i++) { /* °´¼ü±»°´Ï */ if ((l_astKeyPin[i].m_pstGPIOx->IDR & l_astKeyPin[i].m_u16GPIOPin) == l_au16KeyPress[i]) { /* ¸üÐÂ״̬ */ switch(l_aeKeyPressState[i]) { case PRESS_STATE_UP: { l_aeKeyPressState[i] = PRESS_STATE_DOWN_DELAY; l_au32KeyPressDelayTick[i] = 0; break; } case PRESS_STATE_DOWN_DELAY: { l_au32KeyPressDelayTick[i] += 10; if(l_au32KeyPressDelayTick[i] > 50) { l_aeKeyPressState[i] = PRESS_STATE_DOWN; l_au32KeyPressDelayTick[i] = 0; /* °´¼ü±»°´Ï£¬Í¨ÖªÉϲã */ Key_EventFromISR((E_KeyID)i, KEY_EVENT_DOWN); } break; } case PRESS_STATE_UP_DELAY: { l_aeKeyPressState[i] = PRESS_STATE_DOWN; break; } case PRESS_STATE_DOWN: { l_au32KeyPressDelayTick[i] += 10; if(3000 == l_au32KeyPressDelayTick[i]) { Key_EventFromISR((E_KeyID)i, KEY_EVENT_DOWN_3S); } break; } default: { break; } } } /* °´¼üËÉ¿ª */ else { switch (l_aeKeyPressState[i]) { case PRESS_STATE_DOWN_DELAY: { l_aeKeyPressState[i] = PRESS_STATE_UP; break; } case PRESS_STATE_DOWN: { l_aeKeyPressState[i] = PRESS_STATE_UP_DELAY; l_au32KeyPressDelayTick[i] = 0; break; } case PRESS_STATE_UP_DELAY: { l_au32KeyPressDelayTick[i] += 10; if(l_au32KeyPressDelayTick[i] > 50) { l_aeKeyPressState[i] = PRESS_STATE_UP; l_au32KeyPressDelayTick[i] = 0; /* °´¼ü±»ÊÍ·Å£¬Í¨ÖªÉϲã */ Key_EventFromISR((E_KeyID)i, KEY_EVENT_UP); } break; } default: { break; } } } } } /******************************************************************************* * Function Name : Key_PinRegister * Description : ×¢²á°´¼ü¹Ü½Å * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2020Äê11ÔÂ10ÈÕ *******************************************************************************/ HIDO_INT32 Key_PinRegister(E_KeyID _eID, HIDO_VOID *_pGPIO, HIDO_UINT16 _u16Pin, HIDO_UINT16 _u16Press) { if(_eID >= KEY_ID_MAX) { return HIDO_ERR; } l_astKeyPin[_eID].m_pstGPIOx = (GPIO_TypeDef *)_pGPIO; l_astKeyPin[_eID].m_u16GPIOPin = _u16Pin; l_au16KeyPress[_eID] = _u16Press; return HIDO_OK; } /******************************************************************************* * Function Name : Key_TimerRegister * Description : ×¢²á°´¼üɨÃ趨ʱÆ÷ * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2020Äê11ÔÂ10ÈÕ *******************************************************************************/ HIDO_INT32 Key_TimerRegister(HIDO_VOID *_pTimerHandle) { l_pstKeyScanTimerHandle = (TIM_HandleTypeDef *)_pTimerHandle; return HIDO_OK; } /******************************************************************************* * Function Name : Key_Init * Description : °´¼ü³õʼ»¯ * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2020Äê11ÔÂ10ÈÕ *******************************************************************************/ HIDO_INT32 Key_Init(void) { HIDO_UINT32 i = 0; for (i = 0; i < KEY_ID_MAX; i++) { l_aeKeyPressState[i] = PRESS_STATE_UP; } /* Æô¶¯É¨Ã趨ʱÆ÷ */ HAL_TIM_Base_Start_IT(l_pstKeyScanTimerHandle); return HIDO_OK; }