#include #include #include "ql_rtos.h" #include "ql_gpio.h" #include "ql_uart.h" #include "app_inc.h" #define KEY_PIN_WAKEUP_MIC GPIO_PIN_NO_53 #define KEY_PIN_ALARM GPIO_PIN_NO_84 static unsigned char key_press_mic_counter = 0; static int key_press_mic_time = 0; static int key_press_mic_status = 0;//0 弹起状态 1按下状态 static unsigned char key_press_alarm_counter = 0; static int key_press_alarm_time = 0; static int key_press_alarm_status = 0;//0 弹起状态 1按下状态 int key_start_leave = 0; static ql_sem_t key_press_sem = NULL; u8 power_down_status = 0; extern int fota_start; #define KEY_WAIT_TIME 50/5 #define KEY_LONG_PRESS_1S 1000/5 #define KEY_LONG_PRESS_1_5S 1500/5 #define KEY_LONG_PRESS_3S 3000/5 #define KEY_LONG_PRESS_5S 5000/5 #define KEY_LONG_PRESS_10S 10000/5 static unsigned char key_down_event = 0; static void key_press_mic(void *args) { unsigned char level = 0; ql_pwrkey_intc_enable(0); if(fota_start==1 || get_sleep_mode() || power_down_status==2) goto key_press_mic_exit; //如果正在录音状态不处理 level = ql_get_pwrkey_status(); if (1 == level) { key_press_mic_counter++; key_press_mic_time = ql_rtos_get_systicks(); printf("key_press_mic down:%d\n", key_press_mic_counter); } key_down_event = 1; ql_rtos_semaphore_release(key_press_sem); key_press_mic_exit: ql_pwrkey_intc_enable(1); } static void key_press_alarm(void *args) { PIN_LEVEL_E value; ql_eint_disable_wakeup(KEY_PIN_ALARM); if(fota_start==1 || get_sleep_mode() || power_down_status==2) goto key_press_alarm_exit; ql_gpio_get_level(KEY_PIN_ALARM, &value); if (PIN_LEVEL_LOW == value) { key_press_alarm_counter++; key_press_alarm_time = ql_rtos_get_systicks(); printf("key_press_alarm down:%d\n", key_press_alarm_counter); } key_down_event = 1; ql_rtos_semaphore_release(key_press_sem); key_press_alarm_exit: ql_eint_enable_wakeup(KEY_PIN_ALARM, PIN_FALLING_EDGE); } static void key_thread_entry(void *parameter) { unsigned char level = 0; unsigned char volume = 0; unsigned char pre_key_press_mic_counter = 0; unsigned char pre_key_press_alarm_counter = 0; PIN_LEVEL_E value; while (1) { ql_rtos_semaphore_wait(key_press_sem, 0xFFFFFFFF); #if 1 if(key_down_event){ key_down_event = 0; app_set_app_operation(1); } #endif if(key_press_mic_counter!=0 && pre_key_press_mic_counter!=key_press_mic_counter&&key_press_mic_status==0){ printf("key_press_mic_counter:%d\r\n", key_press_mic_counter); pre_key_press_mic_counter = key_press_mic_counter; key_press_mic_time = ql_rtos_get_systicks(); }else if(key_press_mic_counter>0){ level = ql_get_pwrkey_status();//1 按键 if(level) level = 0; else level = 1; if(level!=0){ //up key_press_mic_status = 0; if(ql_rtos_get_systicks() - key_press_mic_time > KEY_LONG_PRESS_3S){ //app_play_tips_file(10); // power_down_status = 1; ql_rtos_task_sleep_s(3); ql_power_down(1); } else if(ql_rtos_get_systicks() - key_press_mic_time > KEY_WAIT_TIME){ //休眠唤醒其它线程 if(app_get_app_sleep_flag()==0){ app_set_app_operation(1); } int mic_pdp = app_get_data_call_net_status(); int mic_mqtt = get_mqtt_connect_status(); printf("[NET-GATE] mic pdp=%d mqtt=%d action=%s\r\n", mic_pdp, mic_mqtt, !mic_pdp ? "blocked_no_pdp" : (mic_mqtt != 1 ? "blocked_mqtt_offline" : "start_voice")); if(mic_pdp && mic_mqtt == 1){ if(tts_play_interrupt_func()==-2){ app_play_tips_file(2); } }else{ app_play_tips_file(2); } } key_press_mic_time = ql_rtos_get_systicks(); key_press_mic_counter = 0; pre_key_press_mic_counter = 0; }else{ //一直按着 if(key_press_mic_status==0){ key_press_mic_status = 1;//表示已经按下了 } if(ql_rtos_get_systicks() - key_press_mic_time > KEY_LONG_PRESS_3S && power_down_status==0){ power_down_status = 1; app_play_tips_file(10); power_down_status = 2; //ql_rtos_task_sleep_s(3); //ql_power_down(1); } } } if(key_press_alarm_counter!=0 && pre_key_press_alarm_counter!=key_press_alarm_counter&&key_press_alarm_status==0){ printf("key_press_alarm_counter:%d\r\n", key_press_alarm_counter); pre_key_press_alarm_counter = key_press_alarm_counter; key_press_alarm_time = ql_rtos_get_systicks(); }else if(key_press_alarm_counter>0){ ql_gpio_get_level(KEY_PIN_ALARM, &value); if(value!=PIN_LEVEL_LOW){//up key_press_alarm_status = 0; if(ql_rtos_get_systicks() - key_press_alarm_time > KEY_LONG_PRESS_3S){ build_alarm(); } else if(ql_rtos_get_systicks() - key_press_alarm_time > KEY_WAIT_TIME){ if(!vad_audio_is_recording()&&key_start_leave==0&&get_mqtt_connect_status()==1){ key_start_leave = 1; build_leave_to_parent(); }else{ key_start_leave = 0; app_play_tips_file(2); } } key_press_alarm_time = ql_rtos_get_systicks(); key_press_alarm_counter = 0; pre_key_press_mic_counter = 0; }else{ //一直按着 if(key_press_alarm_status==0){ key_press_alarm_status = 1;//表示已经按下了 //先停掉音频播放线程 if(key_start_leave==0&&!vad_audio_is_recording()){ stop_player_func(); } } } } ql_rtos_task_sleep_ms(10); if(app_get_app_sleep_flag()==1){ ql_rtos_semaphore_release(key_press_sem); } } } /*实现长按关机*/ void app_aofei_key_init(void) { #if 1 ql_gpio_init(KEY_PIN_WAKEUP_MIC,PIN_DIRECTION_IN,PIN_PULL_PU,PIN_LEVEL_HIGH); ql_eint_register(KEY_PIN_WAKEUP_MIC, PIN_FALLING_EDGE, PIN_PULL_PU, NULL, key_press_mic); ql_eint_enable_wakeup(KEY_PIN_WAKEUP_MIC, PIN_FALLING_EDGE); #endif ql_pwrkey_register_irq(key_press_mic); ql_pwrkey_intc_enable(1); //enable pwrkey intc ql_gpio_init(KEY_PIN_ALARM,PIN_DIRECTION_IN,PIN_PULL_PU,PIN_LEVEL_HIGH); ql_eint_register(KEY_PIN_ALARM, PIN_FALLING_EDGE, PIN_PULL_PU, NULL, key_press_alarm); ql_eint_enable_wakeup(KEY_PIN_ALARM, PIN_FALLING_EDGE); ql_rtos_semaphore_create(&key_press_sem, 0); ql_task_t appTaskRef = NULL; ql_rtos_task_create(&appTaskRef, 1024*4, 100, "appkey", key_thread_entry, NULL); }