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.
149 lines
4.8 KiB
149 lines
4.8 KiB
#include "gpio_switch.h"
|
|
#include "sw_timer.h"
|
|
#include "gpio_state_led.h"
|
|
|
|
|
|
|
|
#if 1
|
|
#define GPIO_PUSH_SW1_PORT (Pn_Type*)PC
|
|
#define GPIO_PUSH_SW1_PIN_NUM 0
|
|
|
|
#define GPIO_PUSH_SW2_PORT (Pn_Type*)PC
|
|
#define GPIO_PUSH_SW2_PIN_NUM 1
|
|
|
|
#define GPIO_PUSH_SW3_PORT (Pn_Type*)PC
|
|
#define GPIO_PUSH_SW3_PIN_NUM 2
|
|
|
|
#define GPIO_PUSH_SW4_PORT (Pn_Type*)PC
|
|
#define GPIO_PUSH_SW4_PIN_NUM 3
|
|
#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},
|
|
{GPIO_PUSH_SW2_PORT, GPIO_PUSH_SW2_PIN_NUM, DEFAULT_KEY_PUSH_COUNT, DEFAULT_LONGKEY_PUSH_COUNT, NULL, NULL, NULL, false, false, 0},
|
|
{GPIO_PUSH_SW3_PORT, GPIO_PUSH_SW3_PIN_NUM, DEFAULT_KEY_PUSH_COUNT, DEFAULT_LONGKEY_PUSH_COUNT, NULL, NULL, NULL, false, false, 0},
|
|
{GPIO_PUSH_SW4_PORT, GPIO_PUSH_SW4_PIN_NUM, DEFAULT_KEY_PUSH_COUNT, DEFAULT_LONGKEY_PUSH_COUNT, NULL, NULL, NULL, false, false, 0},
|
|
};
|
|
|
|
|
|
static void Gpio_Switch_Check_Process(void);
|
|
static void Gpio_Switch_TestCallback(KEY_LIST key);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
void Gpio_Switch_Port_Initialization(void)
|
|
{
|
|
uint8_t i;
|
|
for(i = 0 ; i < KEY_PUSH_SW_MAX ; i++)
|
|
{
|
|
HAL_GPIO_ConfigOutput((Pn_Type*)KeyCheckInfo[i].Port, KeyCheckInfo[i].Pin, INPUT);
|
|
HAL_GPIO_ConfigPullup((Pn_Type*)KeyCheckInfo[i].Port, KeyCheckInfo[i].Pin, PUPDx_EnablePU);
|
|
HAL_GPIO_SetDebouncePin((Pn_Type*)KeyCheckInfo[i].Port, KeyCheckInfo[i].Pin, DBCLK_HCLK64);
|
|
|
|
Gpio_Swtich_Set_Callback(i, Gpio_Switch_TestCallback, NULL, NULL);
|
|
}
|
|
|
|
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_TestCallback(KEY_LIST key)
|
|
{
|
|
printf("%d key push\r\n", key);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
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(i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(KeyCheckInfo[i].isLongKeyPush == false)
|
|
{
|
|
if(KeyCheckInfo[i].nCheckCount >= KeyCheckInfo[i].nPushCount)
|
|
{
|
|
if(KeyCheckInfo[i].Push_Callback != NULL)
|
|
{
|
|
KeyCheckInfo[i].Push_Callback(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(KeyCheckInfo[i].Release_Callback != NULL)
|
|
{
|
|
KeyCheckInfo[i].Release_Callback(i);
|
|
}
|
|
KeyCheckInfo[i].isPush = false;
|
|
KeyCheckInfo[i].isLongKeyPush = false;
|
|
KeyCheckInfo[i].nCheckCount = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
|