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

6 months ago
#include "gpio_switch.h"
#include "sw_timer.h"
#include "gpio_state_led.h"
#if 1
5 months ago
#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
6 months ago
#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},
5 months ago
{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},
6 months ago
};
static void Gpio_Switch_Check_Process(void);
5 months ago
static void Gpio_Switch_TestCallback(KEY_LIST key);
6 months ago
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void Gpio_Switch_Port_Initialization(void)
{
5 months ago
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);
}
6 months ago
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;
}
}
5 months ago
static void Gpio_Switch_TestCallback(KEY_LIST key)
{
printf("%d key push\r\n", key);
}
6 months ago
///////////////////////////////////////////////////////////////////////////////////////////////////////////
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)
{
5 months ago
KeyCheckInfo[i].LongPush_Callback(i);
6 months ago
}
}
}
}
else
{
if(KeyCheckInfo[i].isLongKeyPush == false)
{
if(KeyCheckInfo[i].nCheckCount >= KeyCheckInfo[i].nPushCount)
{
if(KeyCheckInfo[i].Push_Callback != NULL)
{
5 months ago
KeyCheckInfo[i].Push_Callback(i);
6 months ago
}
}
}
if(KeyCheckInfo[i].Release_Callback != NULL)
{
5 months ago
KeyCheckInfo[i].Release_Callback(i);
6 months ago
}
KeyCheckInfo[i].isPush = false;
KeyCheckInfo[i].isLongKeyPush = false;
KeyCheckInfo[i].nCheckCount = 0;
}
}
}