/*******************************************************************************
|
* 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;
|
}
|