/***************************************************************************** ** Filename : keyboard_drive.c ** Project : ** Module : ** Processor : Freescale S12Z ** Date/Time : 2019-09-04, 9:00 ** Abstract : ** Contents : ** Author : mingyea ** http : ** mail : ** -------------------------------------------------------------------------- ** ** -------------------------------------------------------------------------- ******************************************************************************/ #include "common_types.h" #include "common_memory.h" #include "key_digital_driver.h" /***************************************************************************** * Include Files *****************************************************************************/ /***************************************************************************** * Defines *****************************************************************************/ /***************************************************************************** * Macros *****************************************************************************/ /***************************************************************************** * Type Defines *****************************************************************************/ /***************************************************************************** *Static Variable *****************************************************************************/ /***************************************************************************** *Global Variable *****************************************************************************/ /***************************************************************************** *Constant *****************************************************************************/ /***************************************************************************** *Function Prototype *****************************************************************************/ static key_digital_driver_s g_key_digital_driver; static void key_digital_driver_alone_checkio(u8 id); static void key_digital_driver_alone_up_task(u8 id); static void key_digital_driver_alone_task(u8 id); static void key_digital_driver_alone_shortdown_task(u8 id); static void key_digital_driver_alone_longdown_task(u8 id); static void key_digital_driver_alone_stick_task(u8 id); /***************************************************************************** |Prototype : |Called by : |Preconditions : - |Input parameters : None |Output parameters : None |Return value : None |Description : *****************************************************************************/ void key_digital_driver_init(void) { u8 i; key_digital_driver_cfg_init(); common_memory_clear((u8*)&g_key_digital_driver,sizeof(g_key_digital_driver)); for(i = 0; i < KEY_DIGITAL_DRIVER_KEY_TOTAL; i++) { g_key_digital_driver.digital_key[i].event = KEY_DIGITAL_EVENT_NULL; } } /***************************************************************************** |Prototype : |Called by : |Preconditions : - |Input parameters : None id 是邏輯id |Output parameters : None |Return value : None |Description : 越界保護,由key_digital_driver_alone_task來保證 *****************************************************************************/ static void key_digital_driver_alone_checkio(u8 id) { u8 l_ret; const key_digital_driver_cfg_tab_s *p_key_table; p_key_table = (const key_digital_driver_cfg_tab_s*)&g_key_digital_driver_cfg_tab[id]; #ifdef KEY_DIGITAL_DRIVER_DEBUG l_ret = key_digital_driver_cfg_debug_read_pin(id); #else l_ret = gpio_read_pin_input(p_key_table->gpio_base,p_key_table->pin_id); #endif g_key_digital_driver.digital_key[id].phy_cur_level = l_ret; if(l_ret == (u8)(p_key_table->valid_level)) { g_key_digital_driver.digital_key[id].logic_cur_level = 1u; } else { g_key_digital_driver.digital_key[id].logic_cur_level = 0u; } //變化時,計時清零 if(g_key_digital_driver.digital_key[id].phy_cur_level != g_key_digital_driver.digital_key[id].phy_pre_level) { g_key_digital_driver.digital_key[id].timecount = 0u; } g_key_digital_driver.digital_key[id].timecount++; g_key_digital_driver.digital_key[id].phy_pre_level = g_key_digital_driver.digital_key[id].phy_cur_level; g_key_digital_driver.digital_key[id].logic_pre_level = g_key_digital_driver.digital_key[id].logic_cur_level; } /***************************************************************************** |Prototype : |Called by : |Preconditions : - |Input parameters : None id 是邏輯id |Output parameters : None |Return value : None |Description : 越界保護,由key_digital_driver_alone_task來保證 *****************************************************************************/ static void key_digital_driver_alone_up_task(u8 id) { //key_digital_driver_cfg_tab_s *p_key_table; //p_key_table = (key_digital_driver_cfg_tab_s*)&g_key_digital_driver_cfg_tab[id]; #ifdef KEY_DIGITAL_INIT_INVALID if(KEY_DIGITAL_DRIVER_SUBSTATE_UP == g_key_digital_driver.digital_key[id].sub_state) #else if(1) #endif { if(g_key_digital_driver.digital_key[id].timecount>=g_key_digital_driver_cfg_tab[id].debounce_time)//g_key_cfg_times[KEY_DIGITAL_DITHERING_TIME_ID]) //p_key_table->debounce_time { //g_key_digital_driver.digital_key[id].timecount=0u; if(g_key_digital_driver.digital_key[id].logic_cur_level!=0u) //邏輯有效 { g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_INIT; g_key_digital_driver.digital_key[id].state = KEY_DIGITAL_DRIVER_STATE_SHORT_DOWN; g_key_digital_driver.digital_key[id].event |= KEY_DIGITAL_EVENT_PRESSED; } else { //g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_UP; } } } else { if(g_key_digital_driver.digital_key[id].timecount>=g_key_digital_driver_cfg_tab[id].debounce_time)//g_key_cfg_times[KEY_DIGITAL_DITHERING_TIME_ID]) /*PRQA S 2880*/ /*KEY_DIGITAL_INIT_INVALID关闭了*/ { g_key_digital_driver.digital_key[id].timecount=0u; if(g_key_digital_driver.digital_key[id].logic_cur_level!=0u) //邏輯有效 { g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_ERROR; } else { g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_UP; } } } } /***************************************************************************** |Prototype : |Called by : |Preconditions : - |Input parameters : None id 是邏輯id |Output parameters : None |Return value : None |Description : 越界保護,由key_digital_driver_alone_task來保證 *****************************************************************************/ static void key_digital_driver_alone_shortdown_task(u8 id) { //key_digital_driver_cfg_tab_s *p_key_table; //p_key_table = (key_digital_driver_cfg_tab_s*)&g_key_digital_driver_cfg_tab[id]; if(g_key_digital_driver.digital_key[id].logic_cur_level!=0u) //邏輯有效 { //長按有效 if(g_key_digital_driver.digital_key[id].timecount>=g_key_digital_driver_cfg_tab[id].long_down_time)//g_key_cfg_times[KEY_DIGITAL_LONGDOWN_TIMEOUT_ID]) { g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_INIT; g_key_digital_driver.digital_key[id].state = KEY_DIGITAL_DRIVER_STATE_LONG_DOWN; g_key_digital_driver.digital_key[id].event |= KEY_DIGITAL_EVENT_LONG_DOWN; } } else { //彈起 if(g_key_digital_driver.digital_key[id].timecount>=g_key_digital_driver_cfg_tab[id].debounce_time)//g_key_cfg_times[KEY_DIGITAL_DITHERING_TIME_ID]) { g_key_digital_driver.digital_key[id].timecount=0u; g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_UP; g_key_digital_driver.digital_key[id].state = KEY_DIGITAL_DRIVER_STATE_UP; g_key_digital_driver.digital_key[id].event = KEY_DIGITAL_EVENT_RELEASE; g_key_digital_driver.digital_key[id].event |= KEY_DIGITAL_EVENT_SHORT_DOWN_RELEASE; } } } /***************************************************************************** |Prototype : |Called by : |Preconditions : - |Input parameters : None id 是邏輯id |Output parameters : None |Return value : None |Description : 越界保護,由key_digital_driver_alone_task來保證 *****************************************************************************/ static void key_digital_driver_alone_longdown_task(u8 id) { //key_digital_driver_cfg_tab_s *p_key_table; //p_key_table = (key_digital_driver_cfg_tab_s*)&g_key_digital_driver_cfg_tab[id]; if(g_key_digital_driver.digital_key[id].logic_cur_level!=0u) //邏輯有效 { //卡住有效 if(g_key_digital_driver.digital_key[id].timecount>=g_key_digital_driver_cfg_tab[id].stick_time)//g_key_cfg_times[KEY_DIGITAL_STUCK_TIMEOUT_ID]) { g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_INIT; g_key_digital_driver.digital_key[id].state = KEY_DIGITAL_DRIVER_STATE_STICK; } } else { //彈起 if(g_key_digital_driver.digital_key[id].timecount>=g_key_digital_driver_cfg_tab[id].debounce_time)//g_key_cfg_times[KEY_DIGITAL_DITHERING_TIME_ID]) { g_key_digital_driver.digital_key[id].timecount=0u; g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_UP; g_key_digital_driver.digital_key[id].state = KEY_DIGITAL_DRIVER_STATE_UP; g_key_digital_driver.digital_key[id].event = KEY_DIGITAL_EVENT_RELEASE; } } } /***************************************************************************** |Prototype : |Called by : |Preconditions : - |Input parameters : None id 是邏輯id |Output parameters : None |Return value : None |Description : 越界保護,由key_digital_driver_alone_task來保證 *****************************************************************************/ static void key_digital_driver_alone_stick_task(u8 id) { //key_digital_driver_cfg_tab_s *p_key_table; //p_key_table = (key_digital_driver_cfg_tab_s*)&g_key_digital_driver_cfg_tab[id]; if(g_key_digital_driver.digital_key[id].logic_cur_level!=0u) //邏輯有效 { //卡住有效 if(g_key_digital_driver.digital_key[id].timecount>=g_key_digital_driver_cfg_tab[id].stick_time)//g_key_cfg_times[KEY_DIGITAL_STUCK_TIMEOUT_ID]) { g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_INIT; g_key_digital_driver.digital_key[id].state = KEY_DIGITAL_DRIVER_STATE_STICK; } } else { //彈起 if(g_key_digital_driver.digital_key[id].timecount>=g_key_digital_driver_cfg_tab[id].debounce_time)//g_key_cfg_times[KEY_DIGITAL_DITHERING_TIME_ID]) { g_key_digital_driver.digital_key[id].timecount=0u; g_key_digital_driver.digital_key[id].sub_state=KEY_DIGITAL_DRIVER_SUBSTATE_UP; g_key_digital_driver.digital_key[id].state = KEY_DIGITAL_DRIVER_STATE_UP; } } } /***************************************************************************** |Prototype : |Called by : |Preconditions : - |Input parameters : None id 是邏輯id |Output parameters : None |Return value : None |Description : *****************************************************************************/ static void key_digital_driver_alone_task(u8 id) { if(idgpio_base,p_key_table->pin_id); #endif g_key_digital_driver.digital_key[i].phy_cur_level = l_ret; #if 1 if(l_ret == (u8)(p_key_table->valid_level)) { g_key_digital_driver.digital_key[i].logic_cur_level = (u8)KEY_DIGITAL_DRIVER_LOGIC_VALID; } else { g_key_digital_driver.digital_key[i].logic_cur_level = (u8)KEY_DIGITAL_DRIVER_LOGIC_INIT; } #endif } } /***************************************************************************** |Prototype : |Called by : |Preconditions : - |Input parameters : None id 是邏輯id |Output parameters : None |Return value : None |Description : 轻量级判斷,是否按鍵有變化; 0表示沒有變化,1表示有變化 *****************************************************************************/ key_digital_driver_diff_e key_digital_driver_judge_diff_wakeup(void) { u8 i; key_digital_driver_diff_e l_result =KEY_DIGITAL_DRIVER_DIFF_NULL; for(i=0u;i