Preserve main GNSS and volume behavior while porting verified TLS, receive fixes and full-handshake optimizations. Add MQTT connection diagnostics and route MQTT through banban.api.talkingq.com:1883. Include migration documentation and regression tools. Firmware builds and package checks passed; user confirmed new-board connectivity after switching the MQTT host to the domain.
234 lines
6.6 KiB
C
234 lines
6.6 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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
|
|
|
|
|
|
|