You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
3.8 KiB

6 months ago
#include "gpio_switch.h"
#include "sw_timer.h"
#include "gpio_state_led.h"
#if 1
#define GPIO_PUSH_SW1_PORT (Pn_Type*)PB
#define GPIO_PUSH_SW1_PIN_NUM 8
#else
#define GPIO_PUSH_SW1_PORT (Pn_Type*)PF
#define GPIO_PUSH_SW1_PIN_NUM 6
#endif
typedef struct
{
Pn_Type* Port;
uint8_t Pin;
uint32_t nPushCount;
uint32_t nLongPushCount;
GPIO_SW_CALLBACK_FN Push_Callback;
GPIO_SW_CALLBACK_FN LongPush_Callback;
GPIO_SW_CALLBACK_FN Release_Callback;
//////////////////////////////////////////////////////////
bool isPush;
bool isLongKeyPush;
uint32_t nCheckCount;
}KEY_CHECK;
static KEY_CHECK KeyCheckInfo[KEY_PUSH_SW_MAX] =
{
{GPIO_PUSH_SW1_PORT, GPIO_PUSH_SW1_PIN_NUM, DEFAULT_KEY_PUSH_COUNT, DEFAULT_LONGKEY_PUSH_COUNT, NULL, NULL, NULL, false, false, 0},
};
static void Gpio_Switch_Check_Process(void);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void Gpio_Switch_Port_Initialization(void)
{
HAL_GPIO_ConfigOutput((Pn_Type*)GPIO_PUSH_SW1_PORT, GPIO_PUSH_SW1_PIN_NUM, INPUT);
HAL_GPIO_ConfigPullup((Pn_Type*)GPIO_PUSH_SW1_PORT, GPIO_PUSH_SW1_PIN_NUM, PUPDx_EnablePU);
HAL_GPIO_SetDebouncePin((Pn_Type*)GPIO_PUSH_SW1_PORT, GPIO_PUSH_SW1_PIN_NUM, DBCLK_HCLK64);
SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 1, Gpio_Switch_Check_Process);
}
void Gpio_Swtich_Set_PushCount(KEY_LIST key, uint32_t Push_Count, uint32_t LongPush_Count)
{
if(key < KEY_PUSH_SW_MAX)
{
KeyCheckInfo[key].nPushCount = Push_Count;
KeyCheckInfo[key].nLongPushCount = LongPush_Count;
}
}
void Gpio_Swtich_Set_Callback(KEY_LIST key, GPIO_SW_CALLBACK_FN Push_Callback, GPIO_SW_CALLBACK_FN LongPush_Callback, GPIO_SW_CALLBACK_FN Release_Callback)
{
if(key < KEY_PUSH_SW_MAX)
{
KeyCheckInfo[key].Push_Callback = Push_Callback;
KeyCheckInfo[key].LongPush_Callback = LongPush_Callback;
KeyCheckInfo[key].Release_Callback = Release_Callback;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
static void Gpio_Switch_Check_Process(void)
{
uint8_t i;
for(i = 0 ; i < KEY_PUSH_SW_MAX ; i++)
{
if(TESTBIT(HAL_GPIO_ReadPin(KeyCheckInfo[i].Port), KeyCheckInfo[i].Pin) == 0)
{
if(KeyCheckInfo[i].isPush != true)
{
KeyCheckInfo[i].isPush = true;
KeyCheckInfo[i].isLongKeyPush = false;
KeyCheckInfo[i].nCheckCount = 0;
}
else
{
KeyCheckInfo[i].nCheckCount++;
if((KeyCheckInfo[i].nCheckCount >= KeyCheckInfo[i].nLongPushCount) && (KeyCheckInfo[i].isLongKeyPush == false))
{
KeyCheckInfo[i].isLongKeyPush = true;
if(KeyCheckInfo[i].LongPush_Callback != NULL)
{
KeyCheckInfo[i].LongPush_Callback();
}
}
}
}
else
{
if(KeyCheckInfo[i].isLongKeyPush == false)
{
if(KeyCheckInfo[i].nCheckCount >= KeyCheckInfo[i].nPushCount)
{
if(KeyCheckInfo[i].Push_Callback != NULL)
{
KeyCheckInfo[i].Push_Callback();
}
}
}
if(KeyCheckInfo[i].Release_Callback != NULL)
{
KeyCheckInfo[i].Release_Callback();
}
KeyCheckInfo[i].isPush = false;
KeyCheckInfo[i].isLongKeyPush = false;
KeyCheckInfo[i].nCheckCount = 0;
}
}
}