Files

229 lines
6.3 KiB
C

#include <stdio.h>
#include <string.h>
#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);
}
if(app_get_data_call_net_status()&&get_mqtt_connect_status()==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);
}