Files

274 lines
7.8 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
#define NFC_TX_CLICK_GAP 2000/5
#define NFC_TX_CLICK_COUNT 5
static unsigned char key_down_event = 0;
static unsigned char nfc_tx_click_count = 0;
static u32 nfc_tx_last_click_time = 0;
extern void app_nfc_tx_mode_start(void);
static int key_mic_register_short_click(void)
{
u32 now = ql_rtos_get_systicks();
if (nfc_tx_click_count == 0 ||
(u32)(now - nfc_tx_last_click_time) > NFC_TX_CLICK_GAP) {
nfc_tx_click_count = 1;
} else {
nfc_tx_click_count++;
}
nfc_tx_last_click_time = now;
printf("NFC TX key clicks:%u/%u\r\n",
nfc_tx_click_count, NFC_TX_CLICK_COUNT);
if (nfc_tx_click_count >= NFC_TX_CLICK_COUNT) {
nfc_tx_click_count = NFC_TX_CLICK_COUNT;
app_nfc_tx_mode_start();
return 1;
}
/* Keep the first click's existing voice action. Suppress clicks 2-4 so
* a rapid NFC gesture does not repeatedly start/interrupt voice work. */
return nfc_tx_click_count > 1;
}
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){
nfc_tx_click_count = 0;
//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){
int nfc_click_handled = key_mic_register_short_click();
//休眠唤醒其它线程
if(app_get_app_sleep_flag()==0){
app_set_app_operation(1);
}
if (!nfc_click_handled) {
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){
nfc_tx_click_count = 0;
power_down_status = 1;
/* Shutdown audio must own the codec. Stop VAD and any
* interrupted TTS before queueing the power-off prompt. */
stop_player_func();
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);
}