/* ****************************************************************************** * * @file key.c * @brief key module * @ic sy8835 * * @version 1.0 * @date 2024/11/01 15:00:40 * @author Alex Xu * * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd. * All Rights Reserved * * History: * Revision Date Author Desc * 1.0.0 2024/11/01 Alex build this file ******************************************************************************/ /*_____ I N C L U D E S ____________________________________________________*/ #include "key.h" #include "system.h" #include "led.h" #include "sleep.h" #include "adc.h" #include "bat.h" #include "vox_module.h" #include "userapp.h" #include "hall.h" #include "discharge_module.h" #if KEY_ENABLE /******************************************************************************\ Macro definitions \******************************************************************************/ #define KEY_PRESS_500MS_CNT 20 //按键按下500ms(调用周期25ms) #define KEY_PRESS_2S_CNT 80 //按键按下计数2s(调用周期25ms) #define KEY_PRESS_5S_CNT 200 #define KEY_PRESS_8S_CNT 320 //按键按下计数8s(调用周期25ms) #define KEY_TWS_PAIR_TIMER 20 #define KEY_TWS_PAIR_CNT 5 #define KEY_TWS_PAIR_CLEAR_CNT 100 #define KEY_LL_TX_Interval 4 //Vox定时发送指令时间间隔 #define KEY_LL_TX_Interval_2 8 #define KEY_LIFT_CNT 20 //按键后VOUT输出5.2V持续时间,用于唤醒耳机,为之后的发码。 /******************************************************************************\ Variables definitions \******************************************************************************/ bit Key_Press_l_irq; bit Key_Press_ll_irq; KEY_EVENT_E Event_key; uint8_t Key_TWS_Pair_Tim; uint8_t Key_TWS_Clear_Pair_Tim; uint8_t Key_TWS_Pair_Cnt; uint16_t Key_Press_Debounce; uint8_t Key_Lift_Debounce; /******************************************************************************\ Functions definitions \******************************************************************************/ /* ******************************************************************************* * void Key_Handler(void) * * Description : Key Handler --- 主循环中调用,调用周期5ms。其中长按(按键时间大于2s)需要判断抬键动作才触发。 CoverStatus --- 充电仓盖子状态。(本函数提供对应Key事件标志位,后续应用待定) (调用周期20ms) * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ void Key_Handler(void) { static bit Key_Press_Flag; static bit Key_Lift_Flag; static bit nKey_Press_short_irq; static bit nKey_Press_2s_Flag; if( pmu_Info.pmu_Chip_STA & KEY_STA ) //Key的状态值:1:按下; { Key_Press_Debounce++; if( Key_Press_Debounce >= KEY_PRESS_8S_CNT ) //长按8s,VOX掉电 { Key_Press_ll_irq = TRUE; #ifdef _DEBUG_KEY printf("supper long 8s press.(line:%d)\r\n",(u16)__LINE__); #endif } else if( Key_Press_Debounce >= KEY_PRESS_2S_CNT ) //长按2s,需要抬键判断 { if( !nKey_Press_2s_Flag ) { nKey_Press_2s_Flag = TRUE; } } Key_Press_Flag = TRUE; Key_Lift_Flag = FALSE; } else { if( Key_Press_Flag ) { #if SLEEP_ENABLE Enter_Sleep_Cnt_Restart_Flag = TRUE; #endif Event_key = KEY_EVENT_Empty; Key_Press_Flag = FALSE; Key_Lift_Flag = TRUE; Key_Lift_Debounce = 0; if( (Key_Press_Debounce <= KEY_PRESS_500MS_CNT) ) //松开按键,按下时间小于500ms,则识别为短按,显示电量 { Key_Press_short_irq_led = TRUE; nKey_Press_short_irq = TRUE; #ifdef LED_DISPLAY LED_On_Flag = TRUE; #endif } else if( (Key_Press_Debounce < KEY_PRESS_5S_CNT) ) //按键时间大于2s小于5s则判断为长按2s。 { if( nKey_Press_2s_Flag ) { Key_Press_l_irq = TRUE; } } nKey_Press_2s_Flag = FALSE; #ifdef _DEBUG_KEY printf("Key lift(line:%d).\r\n",(u16)__LINE__); #endif } Key_Press_Debounce = 0; } if( Key_Lift_Flag && gBoost_Prepared_Flag ) { if( Key_Press_l_irq ) { if( !Boost_Open_Flag ) { Set_PMU_Boost_Vout(BOOST_VOUT_MAX); Set_PMU_Boost(ON); Boost_Open_Flag = TRUE; #ifdef _DEBUG_KEY printf("Boost Open Key.(line:%d)\r\n",(u16)__LINE__); #endif return; } #if VOX_ENABLE #ifdef VOX_ADT_ENABLE Vol_State = VOX_GET_INTO_BOX; Vor_State = VOX_GET_INTO_BOX; #else VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V #endif #endif if( Key_Lift_Debounce <= KEY_LIFT_CNT ) { Key_Lift_Debounce++; return; } Key_Press_l_irq = FALSE; /*todo*/ Event_key = KEY_EVENT_L_2S; Key_TWS_Pair_Tim = 0; #ifdef VOX_TX /*耳机配对*/ Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0x00; Vox_Get_BES_Addr_Flag[VOR_TYPE] = 0x00; #endif #ifdef _DEBUG_KEY printf("long 2s press\r\n"); #endif } /*长按8s,系统强制进shipmode.*/ if( Key_Press_ll_irq ) { if( !Boost_Open_Flag ) { Set_PMU_Boost_Vout(BOOST_VOUT_MAX); Set_PMU_Boost(ON); Boost_Open_Flag = TRUE; #ifdef _DEBUG_KEY printf("Boost Open Key.(line:%d)\r\n",(u16)__LINE__); #endif return; } #if VOX_ENABLE #ifdef VOX_ADT_ENABLE Vol_State = VOX_GET_INTO_BOX; Vor_State = VOX_GET_INTO_BOX; #else VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V #endif #endif if( Key_Lift_Debounce <= KEY_LIFT_CNT ) { Key_Lift_Debounce++; return; } Key_Press_ll_irq = FALSE; Key_TWS_Clear_Pair_Tim = 0; /*todo*/ Event_key = KEY_EVENT_LL_8S; #ifdef _DEBUG_KEY printf("supper long 8s press.(line:%d)\r\n",(u16)__LINE__); #endif } if( nKey_Press_short_irq ) { nKey_Press_short_irq = FALSE; /*todo*/ // Event_key = KEY_EVENT_SHORT; #ifdef _DEBUG_KEY printf("short press\r\n"); #endif } Key_Lift_Flag = FALSE; Boost_Open_Flag = FALSE; } #ifdef VOX_TX if ( CoverStatus == OPEN ) { if( Event_key == KEY_EVENT_L_2S ) //长按2s,充电仓发送配对指令。 { if( Key_TWS_Pair_Tim < 1 ) { #ifdef VOX_TX #if XUANHENG HandleTxCommand(CMD_TWS_GET_BTADDR,VOL_CHAN); #else HandleTxCommand(VHOUSE_CMD_PAIR,VOL_CHAN); //右耳发配对指令,区分耳机通道。 #endif #endif Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0x00; Vox_Get_BES_Addr_Flag[VOR_TYPE] = 0x00; #ifdef _DEBUG_KEY printf("Key Pair TX VOR(line:%d).\r\n",(uint16_t)__LINE__); #endif } else { if(Key_TWS_Pair_Cnt > KEY_TWS_PAIR_CNT) //耳机蓝牙地址置换超时10s,关闭蓝牙地址置换,开启VOX 5V。 { Key_TWS_Pair_Cnt = 0; #if XUANHENG HandleTxCommand(CMD_PAIRING_IMD,VOR_CHAN); HandleTxCommand(CMD_PAIRING_IMD,VOL_CHAN); #endif Event_key = KEY_EVENT_Empty; OpenCover_TX_Cmd_Flag = TRUE; #if VOX_ENABLE #ifdef VOX_ADT_ENABLE Vol_State = VOX_GET_INTO_BOX; Vor_State = VOX_GET_INTO_BOX; #else VOX_EN_Type(VOX_VOUT_Mode); //VOX Enable 5V #endif #endif #ifdef _DEBUG_KEY printf("Key Pair TimeOut(line:%d).\r\n",(uint16_t)__LINE__); #endif return; } else { if( Vox_Get_BES_Addr_Flag[VOL_TYPE] == 0x01 ) /*收到右耳回复的CMD3指令。*/ { #ifdef VOX_TX #if JIELI HandleTxCommand(VHOUSE_CMD_EXCH_TWS_BTADDR,VOR_CHAN); /*获取到右耳回复的CMD3指令,转发给左耳。*/ #elif ZHONGKE HandleTxCommand( VHOUSE_CMD_GET_TWS_BTADDR, VOR_CHAN ); /*获取到右耳回复的CMD3指令,转发给左耳。*/ #elif XUANHENG HandleTxCommand( CMD_TWS_SET_BTADDR, VOR_CHAN ); #endif #endif Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0x02; #ifdef _DEBUG_KEY printf("Key Pair Get VOR(line:%d).\r\n",(uint16_t)__LINE__); #endif } else if( Vox_Get_BES_Addr_Flag[VOL_TYPE] == 0x02 ) { if( Vox_Get_BES_Addr_Flag[VOR_TYPE] != 0x00 ) { #ifdef VOX_TX #if JIELI HandleTxCommand(VHOUSE_CMD_EXCH_TWS_BTADDR,VOL_CHAN); /*获取到右耳回复的CMD3指令,转发给左耳。*/ #elif ZHONGKE HandleTxCommand( VHOUSE_CMD_GET_TWS_BTADDR, VOL_CHAN ); /*获取到右耳回复的CMD3指令,转发给左耳。*/ #elif XUANHENG HandleTxCommand( CMD_TWS_SET_BTADDR, VOL_CHAN ); #endif #endif Vox_Get_BES_Addr_Flag[VOL_TYPE] = 0x00; Vox_Get_BES_Addr_Flag[VOR_TYPE] = 0x00; Key_TWS_Pair_Tim = 0; Key_TWS_Pair_Cnt = 0; Event_key = KEY_EVENT_Empty; OpenCover_TX_Cmd_Flag = TRUE; #if VOX_ENABLE #ifdef VOX_ADT_ENABLE Vol_State = VOX_NONE_IN_BOX; Vor_State = VOX_NONE_IN_BOX; #else VOX_EN_Type(VOX_ADT_Mode); //VOX Enable 5V #endif #endif #ifdef _DEBUG_KEY printf("Key Pair Get VOL(line:%d).\r\n",(uint16_t)__LINE__); #endif return; } else { #ifdef VOX_TX #if XUANHENG HandleTxCommand(CMD_TWS_GET_BTADDR,VOR_CHAN); #else HandleTxCommand(VHOUSE_CMD_PAIR,VOR_CHAN); //右耳发配对指令,区分耳机通道。 #endif #endif #ifdef _DEBUG_KEY printf("Key Pair TX VOL(line:%d).\r\n",(uint16_t)__LINE__); #endif } } } } if(Key_TWS_Pair_Tim > KEY_TWS_PAIR_TIMER) //3s重发一次。重发5次后超时 { Key_TWS_Pair_Cnt++; Key_TWS_Pair_Tim = 0; #ifdef _DEBUG_KEY printf("Key Pair Cnt:%d.(line:%d)\r\n",(uint16_t)Key_TWS_Pair_Cnt,(uint16_t)__LINE__); #endif } else { Key_TWS_Pair_Tim++; } } else if( Event_key == KEY_EVENT_LL_8S ) { if( Key_TWS_Clear_Pair_Tim < KEY_TWS_PAIR_CLEAR_CNT ) //每隔200ms发送一次,持续时间3s。 { if( !( Key_TWS_Clear_Pair_Tim % KEY_LL_TX_Interval_2 ) ) { #ifdef VOX_TX #if XUANHENG HandleTxCommand(CMD_CLEAR_PAIR,VOR_CHAN); #else HandleTxCommand(VHOUSE_CMD_CLEAR_PAIR,VOR_CHAN); #endif #endif } else if( !( Key_TWS_Clear_Pair_Tim % KEY_LL_TX_Interval ) ) { #ifdef VOX_TX #if XUANHENG HandleTxCommand(CMD_CLEAR_PAIR,VOL_CHAN); #else HandleTxCommand(VHOUSE_CMD_CLEAR_PAIR,VOL_CHAN); #endif #endif } Key_TWS_Clear_Pair_Tim++; } else { Event_key = KEY_EVENT_Empty; OpenCover_TX_Cmd_Flag = TRUE; Key_TWS_Clear_Pair_Tim = 0; #if VOX_ENABLE #ifdef VOX_ADT_ENABLE Vol_State = VOX_NONE_IN_BOX; Vor_State = VOX_NONE_IN_BOX; #else VOX_EN_Type(VOX_ADT_Mode); //VOX Enable 5V #endif #endif } } } #endif } #endif