#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; } } }