#define AIC_THIS_FILE 0x888888
+#define SUPPORT_OPUS 1
#include <aic_errno.h>
#include <aic_init.h>
#include <aic_osa_ex.h>
#include <serial_inc.h>
#include "aic_osa.h"
#include "app_audio.h"
-#include "helios_ringbuf.h"
+#include "bk_ringbuf.h"
#include "bk_websocket.h"
#include "AI_AMP_2_5.h"
#include "bk_key.h"
+#include "aic_srv_tele_sim.h"
+#include <gpio_inc.h>
+#if SUPPORT_OPUS
#include "opus/guixin/opus_interface.h"
+#endif
#include "dev_authentication.h"
+#include "imsl_vad.h"
+#include "aic_srv_tele_ex.h"
+#include "power_supply.h"
+#include "sysoff.h"
// #include "opus/include/opus.h"
-char dev_imei[20] = {0};
+u8 current_card_id = 0;
+u8 Close_flag = 0;
typedef enum
{
inbound_attributes_format_PCM,
inbound_attributes_format_OPUS,
}inbound_attributes_format_type;
inbound_attributes_format_type inbound_attributes_format = inbound_attributes_format_PCM;
+AI_AMP_2_5_cfg vc_cfg;
+volatile char app_audio_flag = 0;
+volatile char audio_stop_flag = 0;
+int32_t bk_audio_start_callback(void *p_param, uint32_t size);
+#define VAD_RB_LEN 16*1024
+bk_ring_buf_t *VAD_rb_data = NULL;
+int VAD_status = 0;//VAD状态
char VC_mode = 0;//0:短按连续问答模式 1:长按录音模式
#define ai_VC_task_priority 35
static aos_thread_id AI_AMP_task_id = 0;
static u32 AI_VC_client_websocket_handle = 0;
static u32* ai_uart_handle;
static aos_thread_id AI_VC_send_task_id = 0;
+char AI_VC_send_task_flag = 0;
static aos_thread_id AI_VC_read_task_id = 0;
+volatile char AI_VC_read_task_flag = 0;
static aos_queue_ptr AI_VC_send_queue = NULL;
static aos_thread_id AI_VC_play_task_id = 0;
+volatile char AI_VC_play_task_flag = 0;
static aos_queue_ptr AI_VC_play_queue = NULL;
-static char VC_Play_flag = 0;
+volatile static char VC_Play_flag = 0;
+//volatile static char AI_VC_play_queue_lock = 0;
static aos_thread_id AI_VC_record_task_id = 0;
+volatile char AI_VC_record_task_flag = 0;
static aos_queue_ptr AI_VC_record_tmp_queue = NULL;
+
+static void AI_VC_send_task(void *thread_input);//websocket 发送线程
+static void AI_VC_read_task(void *thread_input);//websocket 读线程
+static void AI_VC_play_task(void *thread_input);//音频播放线程
+static void AI_VC_record_task(void *thread_input);//录音线程
+static void AI_client_VC_synthesis(char *str);
+static void AI_VC_put_record_data(char *data,u32 len);
WebSocketClient *AI_client_VC = NULL;
static u32 close_timerout = 0;
static u32 VC_pingping_timerout = 0;
static void AI_VC_send_satrt(void);
static aos_status AI_VC_send_data(char *data,u32 len,u8 AIC_WEBSOCKET_OPCODE);
VC_state_type VC_state = VC_State_None;
-static void AI_VC_send_task(void *thread_input);//websocket 发送线程
-static void AI_VC_read_task(void *thread_input);//websocket 读线程
+
static void AI_VC_put_play_data(char *data,u32 len);//音频数据入队播放
//关闭录音
void VC_record_End(void);
static void websocket_deconnect_VC(void);
#include <stdio.h>
#include <stdlib.h>
-
-#define SCALE_FACTOR 10000 // 用于缩放的因子
-// 高级声学回声消除算法(基于NLMS),不使用浮点运算
-void aec(short *input_signal, short *reference_signal, short *output_signal, int num_samples, int filter_length) {
- int *filter_weights = (int *)calloc(filter_length, sizeof(int));
- if (filter_weights == NULL) {
- fprintf(stderr, "内存分配失败\n");
- return;
- }
-
- int mu = 5000; // 步长因子,相当于浮点的0.5 * SCALE_FACTOR
- int delta = 1; // 正则化参数,避免分母为零
-
- for (int n = filter_length; n < num_samples; n++) {
- int echo_estimate = 0;
- // 计算估计的回声
- for (int i = 0; i < filter_length; i++) {
- echo_estimate += filter_weights[i] * reference_signal[n - i - 1];
- }
- echo_estimate /= SCALE_FACTOR;
-
- // 计算误差信号(消除回声后的信号)
- output_signal[n] = input_signal[n] - (echo_estimate);
-
- // 计算参考信号的能量
- int energy = 0;
- for (int i = 0; i < filter_length; i++) {
- energy += reference_signal[n - i - 1] * reference_signal[n - i - 1];
- }
-
- // 使用NLMS算法更新滤波器权重
- int step = (mu * SCALE_FACTOR) / (energy + delta);
- for (int i = 0; i < filter_length; i++) {
- filter_weights[i] += (step * output_signal[n] * reference_signal[n - i - 1]) / SCALE_FACTOR;
- }
- }
-
- free(filter_weights);
-}
int play_data_len = 0;
//关闭音频播放
void VC_Play_End(void);
{
if(imei == NULL)
return -1;
- strcpy(imei,dev_imei);
+ strcpy(imei,vc_cfg.dev_imei);
return 0;
}
int bk_printf(const char *format, ...)
{
int ret=0;
- int bk_printf_count = 3*2048;
+ int bk_printf_count = 10*1024;
va_list args;
char *out = NULL;
out = aic_zalloc(bk_printf_count);
}
uart_write(ai_uart_handle,"\r\n", 2);
}
+int save_VC_cfg(void)
+{
+ FILE *fp = NULL;
+ char *vc_cfg_tmp = aic_malloc(sizeof(vc_cfg));
+ if(!vc_cfg_tmp)
+ {
+ bk_printf("save_VC_cfg malloc error");
+ return -1;
+ }
+ bk_printf("save_VC_cfg !");
+
+ int count_t = 5;
+ int read_tmp = 0;
+ int write_len = 1;
+ while (count_t--)
+ {
+ fp = fopen("C:/VC_cfg.bin","w+");
+ write_len = fwrite(&vc_cfg,1,sizeof(vc_cfg),fp);
+ fclose(fp);
+ fp = fopen("C:/VC_cfg.bin","r");
+ read_tmp = fread(vc_cfg_tmp,1,sizeof(vc_cfg),fp);
+ fclose(fp);
+ if(memcmp(vc_cfg_tmp,&vc_cfg,sizeof(vc_cfg))==0)
+ break;
+ bk_printf("save_VC_cfg 保存出错了!write_len:%d,read_tmp:%d",write_len,read_tmp);
+ }
+
+
+
+ aic_free(vc_cfg_tmp);
+ return 0;
+}
+void reset_VC_cfg(void)
+{
+ vc_cfg.start_flag = 0xaaaa;
+ vc_cfg.end_flag = 0xaaaa;
+ vc_cfg.dev_type = DEV_FX1_H;//产品
+ //vc_cfg.dev_type = DEV_ADS;//奥德赛
+ //strcpy(vc_cfg.server_ip,"amp.raisound.com");//服务器地址
+ strcpy(vc_cfg.server_ip,"115.190.94.208:22080");//服务器地址
+ vc_cfg.VC_mode =0;//对话模式
+ strcpy(vc_cfg.power_on_tone,"你好,请问您有什么需要我帮忙的吗?");//开机提示词
+ vc_cfg.VC_record_TYPE = VC_record_TYPE_PCM;//录音格式
+ vc_cfg.VC_play_TYPE = VC_play_TYPE_PCM;//播放格式
+ vc_cfg.VC_record_samplerate = 16000;//录音采样率
+ vc_cfg.VC_play_samplerate = 16000;//播放采样率
+ vc_cfg.is_VAD = 1;//=1打开vad打断
+ vc_cfg.speech_rate = 0;//语速配置
+ vc_cfg.vad_silence = 200;//vad断句时间 ms
+ vc_cfg.VC_TTS_volume = 50;//音量
+}
+int init_VC_cfg(void)
+{
+ FILE *fp = NULL;
+ fp = fopen("C:/VC_cfg.bin","r");
+ bk_printf("init_VC_cfg:fp:%p",fp);
+ //reset_VC_cfg();
+ if(fp)
+ {
+ int fread_len ;
+ fread_len = fread(&vc_cfg,1,sizeof(vc_cfg),fp);
+ bk_printf("init_VC_cfg:fread_len:%d,start_flag:0x%x,end_flag:0x%x",fread_len,vc_cfg.start_flag,vc_cfg.end_flag);
+ if(vc_cfg.start_flag == 0xaaaa && vc_cfg.end_flag == 0xaaaa)//已经有数据
+ {
+ bk_printf("init_VC_cfg:获取配置正常。vc_cfg.VC_TTS_volume:%d",vc_cfg.VC_TTS_volume);
+ }else if(vc_cfg.start_flag == 0xaaaa && vc_cfg.end_flag != 0xaaaa)//结构体新增参数
+ {
+
+ }else //if(vc_cfg.start_flag != 0xaaaa && vc_cfg.end_flag != 0xaaaa)//m没有配置,要初始化配置
+ {
+ bk_printf("init_VC_cfg:没有配置");
+ reset_VC_cfg();
+ }
+ fclose(fp);
+ }
+ return 0;
+}
+
+int check_text(char *text,int ret_str_len)
+{
+ //bk_printf("check_text:text:%s",text);
+ if(ret_str_len >60)
+ return -1;
+ int ret = -1;
+ unsigned char is_save_VC_cfg = 0;
+ char tmp_data[70] = {0};
+ int tmp_data_len = 0;
+ if(strstr(text,"声音改"))
+ {
+ if(strstr(text,"男"))
+ {
+
+ }
+ }
+ if(strstr(text,"音量"))
+ {
+ if(strstr(text,"加")||(strstr(text,"大")&&!strstr(text,"太")) || (strstr(text,"太小")))
+ {
+ vc_cfg.VC_TTS_volume +=10;
+ if(vc_cfg.VC_TTS_volume > 100)
+ {
+ vc_cfg.VC_TTS_volume = 100;
+ AI_AMP_MSG_put("音量已最大。",strlen("音量已最大。"),VC_TTS_PLAY);
+ //AI_TTS_str
+ }else{
+
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"配置成功,当前音量%d。",vc_cfg.VC_TTS_volume);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }
+ app_audio_set_master_volume(15*vc_cfg.VC_TTS_volume/100);
+ is_save_VC_cfg = 1;
+ ret = 0;
+ goto RET;
+ }else if(strstr(text,"减")||(strstr(text,"小")&&!strstr(text,"太")) || (strstr(text,"太大")))
+ {
+ vc_cfg.VC_TTS_volume -=10;
+ if(vc_cfg.VC_TTS_volume < 0)
+ {
+ vc_cfg.VC_TTS_volume = 0;
+ AI_AMP_MSG_put("音量已最小。",strlen("音量已最小。"),VC_TTS_PLAY);
+ //AI_TTS_str
+ }else{
+
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"配置成功,当前音量%d。",vc_cfg.VC_TTS_volume);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }
+ app_audio_set_master_volume(15*vc_cfg.VC_TTS_volume/100);
+ is_save_VC_cfg = 1;
+ ret = 0;
+ goto RET;
+ }
+ }
+ if(strstr(text,"查询"))
+ {
+ if(strstr(text,"信号"))
+ {
+
+ ts_radio_signal_info_t p_signal_info;
+ int32_t ret = 0;
+
+ ret = aic_srv_tele_radio_get_signal_info_sync(current_card_id, &p_signal_info);
+ bk_printf("信号查询:current_card_id = %d,signal_level = %d, signal_level_val = %d, signal_strength= %d.", current_card_id,
+ p_signal_info.signal_level, p_signal_info.signal_level_val, p_signal_info.signal_strength);
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前信号%ld。",p_signal_info.signal_level_val);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ ret = 0;
+ goto RET;
+ }else if(strstr(text,"电量"))
+ {
+ struct psy_info psy_info;
+ get_psy_info(&psy_info);
+
+ bk_printf("电量查询:psy_name:%s bat_vol:%d bat_cap:%d chg_status%d chg_type:%d bat_min_voltage:%d bat_max_voltage:%d\n",
+
+ psy_info.psy_name,
+ psy_info.bat_current_voltage,
+ psy_info.bat_capacity,
+ psy_info.bat_chg_status,
+ psy_info.bat_chg_type,
+ psy_info.bat_min_voltage,
+ psy_info.bat_max_voltage);
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前电量为百分之%d。",psy_info.bat_capacity);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ ret = 0;
+ goto RET;
+ }else if(strstr(text,"设备号"))
+ {
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前设备号为:%s。",vc_cfg.dev_imei);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ ret = 0;
+ goto RET;
+ }else if(strstr(text,"卡号"))
+ {
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前卡号为:%s。",vc_cfg.ICCID);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ ret = 0;
+ goto RET;
+ }else if(strstr(text,"版本号"))
+ {
+ if(vc_cfg.dev_type == DEV_ADS)
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前版本号为:%s_%s。","ADS_",BK_VERSION);
+ else
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前版本号为:%s。",BK_VERSION);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ ret = 0;
+ goto RET;
+ }else if(strstr(text,"服务器地址"))
+ {
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"服务器地址:%s。",vc_cfg.server_ip);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ ret = 0;
+ goto RET;
+ }
+ }
+ if(strstr(text,"说话") || strstr(text,"讲话")|| strstr(text,"语速") )
+ {
+ if(strstr(text,"太慢") || strstr(text,"快点") || strstr(text,"快一点"))
+ {
+ vc_cfg.speech_rate +=10;
+ if(vc_cfg.speech_rate >50)
+ {
+ vc_cfg.speech_rate = 50;
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"语速已经是最快了。");
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }else
+ {
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"明白,语速已经调快了,当前语速是%d。",vc_cfg.speech_rate);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }
+ is_save_VC_cfg = 1;
+ ret = 0;
+ goto RET;
+ }else if(strstr(text,"太快") || strstr(text,"慢点") || strstr(text,"慢一点"))
+ {
+ vc_cfg.speech_rate -=10;
+ if(vc_cfg.speech_rate < -50)
+ {
+ vc_cfg.speech_rate = -50;
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"语速已经是最慢了。");
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }else
+ {
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"明白,语速已经调慢了,当前语速是%d。",vc_cfg.speech_rate);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }
+ is_save_VC_cfg = 1;
+ ret = 0;
+ goto RET;
+ }
+ }
+ if(ret_str_len<20 && (strstr(text,"聆听") || strstr(text,"明天") ))
+ {
+ if(strstr(text,"慢") && !strstr(text,"太"))
+ {
+ vc_cfg.vad_silence += 200;
+ if(vc_cfg.vad_silence>2000)
+ {
+ vc_cfg.vad_silence = 2000;
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"已经是最慢了。");
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }else
+ {
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"配置成功,当前语音断句速度是%d毫秒。",vc_cfg.vad_silence);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }
+ is_save_VC_cfg = 1;
+ ret = 0;
+ goto RET;
+ }
+ if(strstr(text,"快") && !strstr(text,"太"))
+ {
+ vc_cfg.vad_silence -= 200;
+ if(vc_cfg.vad_silence < 100)
+ {
+ vc_cfg.vad_silence = 100;
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"已经是最快了。");
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }else
+ {
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"配置成功,当前语音断句速度是%d毫秒。",vc_cfg.vad_silence);
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+ }
+ is_save_VC_cfg = 1;
+ ret = 0;
+ goto RET;
+ }
+ }
+ if(ret_str_len<16 && (strstr(text,"再见") || strstr(text,"拜拜") || strstr(text,"关闭对话")))
+ {
+ tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"再见了,我会想你的。");
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY_CLOSE);
+
+ }
+ if(ret_str_len<16 && (strstr(text,"关机") ))
+ {
+ AI_AMP_MSG_put(tmp_data,tmp_data_len,POWER_OFF);
+ }
+RET:
+ if(is_save_VC_cfg == 1)
+ save_VC_cfg();
+ return ret;
+}
//发送tts播放接口
static void AI_client_VC_synthesis(char *str)
{
}
AI_VC_send_data(json_str,strlen(json_str),AIC_WEBSOCKET_OPCODE_TEXT_FRAME);//发送数据
// 输出 JSON 字符串
- bk_printf("%s\n", json_str);
+ //bk_printf("%s\n", json_str);
// 释放内存
free(json_str);
// 创建 payload 对象
cJSON *payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "device_id", "12569874564165");
+ cJSON_AddStringToObject(payload, "device_id", vc_cfg.dev_imei);
cJSON_AddStringToObject(payload, "user_agent", "AudioClient/1.0");
// 创建 dialog_attributes 对象
cJSON *dialog_attributes = cJSON_CreateObject();
- cJSON_AddStringToObject(dialog_attributes, "provider", "coze");
+ if(vc_cfg.dev_type == DEV_ADS)
+ {
+ cJSON_AddStringToObject(dialog_attributes, "provider", "ads_coze");
+ }else
+ cJSON_AddStringToObject(dialog_attributes, "provider", "coze");
+
// 创建 dialog_attributes 下的 cfg 对象
cJSON *dialog_cfg = cJSON_CreateObject();
// 创建 custom_variables 对象
cJSON *custom_variables = cJSON_CreateObject();
- cJSON_AddStringToObject(custom_variables, "name", "小瑞");
+ cJSON_AddStringToObject(custom_variables, "name", "食梦貘");
cJSON_AddItemToObject(dialog_cfg, "custom_variables", custom_variables);
// 创建 greeting 对象
// 创建 bot_option 对象
cJSON *bot_option = cJSON_CreateObject();
- cJSON_AddBoolToObject(bot_option, "use_workflow", 1);
- cJSON_AddStringToObject(bot_option, "bot_id", "7486697248416989193");
- cJSON_AddStringToObject(bot_option, "workflow_id", "7486698347416649778");
+ // cJSON_AddBoolToObject(bot_option, "use_workflow", 1);//小瑞
+ // cJSON_AddStringToObject(bot_option, "bot_id", "7486697248416989193");
+ // cJSON_AddStringToObject(bot_option, "workflow_id", "7486698347416649778");
+ // cJSON_AddBoolToObject(bot_option, "use_workflow", 1);
+ // cJSON_AddStringToObject(bot_option, "bot_id", "7491256313561825332");//食梦貘
+ // cJSON_AddStringToObject(bot_option, "workflow_id", "7508598451564150820");
+ if(vc_cfg.dev_type == DEV_ADS)
+ {
+ cJSON_AddBoolToObject(bot_option, "use_workflow", 0);//奥德赛
+ cJSON_AddStringToObject(bot_option, "bot_id", "7507478798502625295");//奥德赛
+ cJSON_AddStringToObject(bot_option, "workflow_id", "");
+
+ }else
+ {
+ cJSON_AddBoolToObject(bot_option, "use_workflow", 1);
+ cJSON_AddStringToObject(bot_option, "bot_id", "7491256313561825332");//食梦貘
+ cJSON_AddStringToObject(bot_option, "workflow_id", "7508598451564150820");
+ }
cJSON_AddItemToObject(dialog_cfg, "bot_option", bot_option);
cJSON_AddItemToObject(dialog_attributes, "cfg", dialog_cfg);
cJSON_AddNumberToObject(outbound_cfg, "bit_rate", 16);
cJSON_AddNumberToObject(outbound_cfg, "channel", 1);
cJSON_AddNumberToObject(outbound_cfg, "volume", 100);
- cJSON_AddNumberToObject(outbound_cfg, "speech_rate", 0);
- cJSON_AddNumberToObject(outbound_cfg, "chunk_interval_ms", 50);
- cJSON_AddStringToObject(outbound_cfg, "voice", "7426720361733013513");
- cJSON_AddStringToObject(outbound_cfg, "voice", "ICL_zh_female_huoponvhai_tob");
+ cJSON_AddNumberToObject(outbound_cfg, "speech_rate", vc_cfg.speech_rate);
+ cJSON_AddNumberToObject(outbound_cfg, "chunk_interval_ms", 20);
+ //cJSON_AddStringToObject(outbound_cfg, "voice", "7426720361733013513");
+ //cJSON_AddStringToObject(outbound_cfg, "voice", "ICL_zh_female_huoponvhai_tob");
+ if(vc_cfg.dev_type == DEV_ADS)
+ cJSON_AddStringToObject(outbound_cfg, "voice", "zh_female_mengyatou_mars_bigtts");
+ else
+ cJSON_AddStringToObject(outbound_cfg, "voice", "zh_female_meituojieer_moon_bigtts");
+
+
cJSON_AddItemToObject(outbound_attributes, "cfg", outbound_cfg);
cJSON_AddItemToObject(payload, "outbound_attributes", outbound_attributes);
// 创建 inbound_attributes 对象
cJSON *inbound_attributes = cJSON_CreateObject();
cJSON_AddStringToObject(inbound_attributes, "provider", "volcengine");
- if(VC_mode == 0)//连续对话模式
+ if(VC_mode == 0 && vc_cfg.is_VAD == 0)//连续对话模式
cJSON_AddBoolToObject(inbound_attributes, "disable_vad", 0);
else
cJSON_AddBoolToObject(inbound_attributes, "disable_vad", 1);
- cJSON_AddNumberToObject(inbound_attributes, "vad_silence", 500);
+ cJSON_AddNumberToObject(inbound_attributes, "vad_silence", vc_cfg.vad_silence);
// 创建 interrupt_options 对象
cJSON *interrupt_options = cJSON_CreateObject();
char *json_str = cJSON_Print(root);
if (json_str) {
//remove_whitespace(json_str);
- bk_printf("json_str:%s",json_str);
+ //bk_printf("json_str:%s",json_str);
AI_VC_send_data(json_str,strlen(json_str),AIC_WEBSOCKET_OPCODE_TEXT_FRAME);//发送数据
//Audio.Create 开始发送音频
static void AI_VC_send_audio_create(void)
{
+ VC_state = VC_State_SpeechStart;//开始说
// 创建根对象
cJSON *root = cJSON_CreateObject();
if (root == NULL) {
//Audio.Completed 结束发送音频
static void AI_VC_send_audio_completed(void)
{
+ VC_state = VC_State_SpeechEnd;//说结束
// 创建根对象
cJSON *root = cJSON_CreateObject();
if (root == NULL) {
free(json_str);
cJSON_Delete(root);
}
+//打断
+static void AI_VC_send_cancel(void)
+{
+ // 创建根对象
+ cJSON *root = cJSON_CreateObject();
+ if (root == NULL) {
+ bk_printf("Failed to create root object.\n");
+ return ;
+ }
+
+ // 设置 "event" 字段
+ cJSON_AddStringToObject(root, "event", "cancel");
+
+ // 创建 "payload" 对象
+ cJSON *payload = cJSON_CreateObject();
+ if (payload == NULL) {
+ bk_printf("Failed to create payload object.\n");
+ cJSON_Delete(root);
+ return ;
+ }
+ // 将 "payload" 对象添加到根对象中
+ cJSON_AddItemToObject(root, "payload", payload);
+
+ // 将 JSON 对象转换为字符串
+ char *json_str = cJSON_Print(root);
+ if (json_str == NULL) {
+ bk_printf("Failed to print JSON object.\n");
+ cJSON_Delete(root);
+
+ }
+ AI_VC_send_data(json_str,strlen(json_str),AIC_WEBSOCKET_OPCODE_TEXT_FRAME);//发送数据
+
+
+ // 释放内存
+ free(json_str);
+ cJSON_Delete(root);
+}
//TTS播放
static void VC_TTS_Play(const char *str)
{
bk_printf("VC_TTS_Play:%s",str);
+ if(AI_TTS_str)
+ {
+ aic_free(AI_TTS_str);
+ AI_TTS_str = NULL;
+ }
AI_TTS_str = aic_zalloc(strlen(str)+1);
strcpy(AI_TTS_str,str);
//VC_record_End();
websocket_deconnect_VC();
AI_VC_start();
}
-
//pinpin发送
void AI_VC_send_ping_ping(void)
{
AI_VC_send_data("ping",strlen("ping"),AIC_WEBSOCKET_OPCODE_TEXT_FRAME);//发送数据
}
-//连接websocket
-static int websocket_connect_VC(void)
-{
- //连接服务器
- if(AI_client_VC == NULL)
- {
- //AI_client_VC = init_websocket_client("ws://118.145.158.207:22086/vc/coze?is_auth=0",NULL);
- AI_client_VC = init_websocket_client("ws://118.145.158.207:22086/vc/chat?is_auth=0",NULL);
- }
- //创建发送线程
- if(AI_VC_send_task_id == 0)
- {
- AI_VC_send_task_id = aos_create_thread(
- "AI_VC_send",
- AI_VC_send_task,
- &AI_VC_send_task_id,
- 1024*16,
- 0,
- NULL,
- ai_VC_task_priority,
- AOS_AUTO_START);
- }
- //创建发送队列
- if(AI_VC_send_queue == NULL)
- {
- AI_VC_send_queue = aos_create_queue("AI_VC_send_queue",
- sizeof(AI_VC_send_queue_t),
- 200);
- }
- //创建读线程
- if(AI_VC_read_task_id == 0)
- {
- AI_VC_read_task_id = aos_create_thread(
- "AI_VC_read",
- AI_VC_read_task,
- &AI_VC_read_task_id,
- 4096u,
- 0,
- NULL,
- ai_VC_task_priority,
- AOS_AUTO_START);
- }
- return 0;
-
-}
-static void websocket_deconnect_VC(void)
+
+
+u16 opus_remain_buf[640];
+u32 opus_remain_size = 0;
+static void AI_VC_send_task(void *thread_input)//websocket 发送线程
{
- bk_printf("websocket_deconnect_VC!!!!!!!!!!!!");
- // if(AI_VC_client_websocket_handle)//断开服务器
- // {
- // aic_websocket_disconnect(AI_VC_client_websocket_handle,5000);
- // aic_websocket_delete(AI_VC_client_websocket_handle,5000);
- // AI_VC_client_websocket_handle = 0;
- // }
-
- //销毁发送线程
- if(AI_VC_send_task_id != 0)
- {
- aos_delete_thread(AI_VC_send_task_id);
- AI_VC_send_task_id = 0;
- }
- //销毁发送队列
- if(AI_VC_send_queue != NULL)
+ AI_VC_send_queue_t AI_VC_send_queue_data;
+ bk_printf("AI_VC_send_task go......");
+ int ret = 0;
+ AI_VC_send_task_flag = 1;
+ while(1)
{
- char count_t= 200;
- AI_VC_send_queue_t AI_VC_send_queue_data_t;
- while(count_t--)//清空队列数据
+ if(AI_VC_send_task_flag == 2)//要退出了
+ break;
+
+ if(AI_VC_send_queue && aos_recv_from_queue(AI_VC_send_queue,&AI_VC_send_queue_data,AOS_NO_WAIT) == AOS_SUCCESS)
{
- if(aos_recv_from_queue(AI_VC_send_queue,&AI_VC_send_queue_data_t,AOS_NO_WAIT) == AOS_SUCCESS)
+
+ if(AI_client_VC && AI_VC_send_queue_data.data)
{
- if(AI_VC_send_queue_data_t.data)
- aic_free(AI_VC_send_queue_data_t.data);
- }
- else{
- break;
- }
- }
- aos_delete_queue(AI_VC_send_queue);
- AI_VC_send_queue = NULL;
- }
- //销毁读线程
- if(AI_VC_read_task_id != 0)
- {
- aos_delete_thread(AI_VC_read_task_id);
- AI_VC_read_task_id = 0;
- }
- if(AI_client_VC)
- {
- close_websocket_client(AI_client_VC);
- AI_client_VC = NULL;
- }
-
-}
-//websocket 发送数据,AIC_WEBSOCKET_OPCODE = AIC_WEBSOCKET_OPCODE_TEXT_FRAME发送字符串,
-//AIC_WEBSOCKET_OPCODE =AIC_WEBSOCKET_OPCODE_BINARY_FRAME发送二进制
-static aos_status AI_VC_send_data(char *data,u32 len,u8 AIC_WEBSOCKET_OPCODE)
-{
- if(AI_VC_send_queue == NULL)
- return AOS_ERROR;
- AI_VC_send_queue_t AI_VC_send_queue_data;
- AI_VC_send_queue_data.data = aic_malloc(len+1);
- memset(AI_VC_send_queue_data.data ,0,len+1);
- if(!AI_VC_send_queue_data.data)
- {
- bk_printf("AI_VC_send_data aic_malloc ERROR!!!!!!!!!!");
- return AOS_ERROR;
- }
- memcpy(AI_VC_send_queue_data.data,data,len);
- AI_VC_send_queue_data.len=len;
- AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE=AIC_WEBSOCKET_OPCODE;
- if(AI_VC_send_queue && AOS_SUCCESS!=aos_send_to_queue(AI_VC_send_queue,&AI_VC_send_queue_data,AOS_NO_WAIT))
- {
-
- aic_free(AI_VC_send_queue_data.data);
- return AOS_ERROR;
- }
-
- return AOS_SUCCESS;
-}
-u16 opus_remain_buf[640];
-u32 opus_remain_size = 0;
-static void AI_VC_send_task(void *thread_input)//websocket 发送线程
-{
- AI_VC_send_queue_t AI_VC_send_queue_data;
- bk_printf("AI_VC_send_task go......");
- int ret = 0;
- while(1)
- {
- if(AI_VC_send_queue && aos_recv_from_queue(AI_VC_send_queue,&AI_VC_send_queue_data,AOS_WAIT_FOREVER) == AOS_SUCCESS)
- {
-
- if(AI_client_VC && AI_VC_send_queue_data.data)
- {
- VC_pingping_timerout = 5;
+ VC_pingping_timerout = 4;
if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_BINARY_FRAME &&inbound_attributes_format == inbound_attributes_format_OPUS)
{
+ #if SUPPORT_OPUS
u8 *opus_data =aic_zalloc(AI_VC_send_queue_data.len);
u8 *pcm_data =aic_zalloc(opus_remain_size+AI_VC_send_queue_data.len);
- struct opus_dec_param dec_inparam;
+ //struct opus_dec_param dec_inparam;
struct opus_enc_param enc_inparam;
u32 opus_count = 0;
u32 pcm_count = 0;
opus_remain_size = 0;
if(opus_data)
{
+
enc_inparam.input = (int16_t*)(pcm_data);//PCM数据
enc_inparam.input_size = pcm_count;
enc_inparam.output = (int8_t*)opus_data;
// ret = aic_opus_decode(&dec_inparam);
// audio_data(pcm_data,dec_inparam.outputfrms_size,25);
////aos_sleep(10);
- //bk_printf("OPUS:inputfrm_count:%d,opus_remain_size:%d,pcm_len:%d,dec_pcm_len:%d,opus_count:%d",\
+ //bk_printf("OPUS:inputfrm_count:%d,opus_remain_size:%d,pcm_len:%d,dec_pcm_len:%d,opus_count:%d",
// dec_inparam.inputfrm_count,opus_remain_size,AI_VC_send_queue_data.len,dec_inparam.outputfrms_size,opus_count);
if(opus_data)
aic_free(opus_data);
if(pcm_data)
aic_free(pcm_data);
+
}else
{
bk_printf("opus alloc ERROR!!!!!!!!!!!");
}
-
+ #endif
}else//正常pcm
{
ret = send_websocket_message(AI_client_VC,AI_VC_send_queue_data.data,AI_VC_send_queue_data.len,
}
if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_TEXT_FRAME )
- bk_printf("VCVC:send ret=%d,len=%d,str=%s",ret,AI_VC_send_queue_data.len,AI_VC_send_queue_data.data);
- // else if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_BINARY_FRAME )
- // bk_printf("VCVC:send ret=%d,len=%d",ret,AI_VC_send_queue_data.len);
+ bk_printf("send ret=%d,len=%d,str=%s",ret,AI_VC_send_queue_data.len,AI_VC_send_queue_data.data);
+ else if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_BINARY_FRAME )
+ {
+ audio_data(AI_VC_send_queue_data.data,AI_VC_send_queue_data.len,21);
+ bk_printf("send ret=%d,len=%d",ret,AI_VC_send_queue_data.len);
+ }
+
aic_free(AI_VC_send_queue_data.data);
}else
{
bk_printf("AI_VC_send ERROR:close_websocket_client = %d",AI_client_VC);
+ break;
}
+
}else
{
aos_sleep(1);
}
}
-
+ bk_printf("AI_VC_send_task exit......");
+ AI_VC_send_task_flag = 3;
}
-static u8 recv_buff[20*1024];
+
+
+#define recv_buff_mxa_len 20*1024
static void AI_VC_read_task(void *thread_input)//websocket 读线程
{
-
int status;
+ static u8 *recv_buff = NULL;
+ if(recv_buff == NULL)
+ {
+ recv_buff = aic_malloc(recv_buff_mxa_len);
+ }
+ if(recv_buff == NULL)
+ {
+ bk_printf("AI_VC_read_task aic_malloc ERROR!!!!!!!!!!!!!!!!!!......");
+ return;
+ }
WebSocketMessageType code;
bk_printf("AI_VC_read_task go......");
+ AI_VC_read_task_flag = 1;
while (1) {
//if(AI_VC_client_websocket_handle!=0)
//bk_printf("AI_VC_read_task ...");
+ if(AI_VC_read_task_flag>=2)
+ break;
if(AI_client_VC)
{
- memset(recv_buff,0,sizeof(recv_buff));
+ memset(recv_buff,0,recv_buff_mxa_len);
// status = aic_websocket_recv(AI_VC_client_websocket_handle, recv_buff, sizeof(recv_buff),
// &code, AOS_WAIT_FOREVER,&result_val);
//bk_printf("AI_VC_read_task 1");
- status = receive_websocket_message(AI_client_VC,recv_buff,sizeof(recv_buff),&code);
+ status = receive_websocket_message(AI_client_VC,recv_buff,recv_buff_mxa_len,&code);
//bk_printf("AI_VC_read_task 2");
if(status>0)
{
if(code == WS_TEXT)//字符串
{
//bk_printf("AI_VC_read_task 3");
- bk_printf("VCVC:read TEXT:status:%d,data:%s\n",status,recv_buff);
+ bk_printf("read TEXT:status:%d,data:%s\n",status,recv_buff);
if(strstr(recv_buff,"\"started\""))//开始
{
- if(VC_mode == 0)//连续对话模式
- VC_state = VC_State_Listening;
+
if(AI_TTS_str)
{
AI_client_VC_synthesis(AI_TTS_str);
VC_state = VC_State_TTSStart;
}else
{
- if(VC_mode == 1)//长按模式
+
+ if(VC_mode == 1)//长按模式,或者本地vad模式
+ {
AI_VC_send_audio_create();
+ }else if(VC_mode == 0 )//连续对话模式
+ VC_state = VC_State_Listening;
+
}
}else if(strstr(recv_buff,"\"asr.started\""))//asr开始
{
- if(VC_mode == 1)//长按模式
- VC_state = VC_State_Listening;
+ if(VC_mode == 1 || vc_cfg.is_VAD ==1)//长按模式
+ VC_state = VC_State_SpeechIng;
+ }else if(strstr(recv_buff,"\"asr.result\""))
+ {
+ //bk_printf("asr.result!!");
+ char *str_tmp = strstr(recv_buff,"\"content\":\"");
+ if(str_tmp)
+ {
+ //bk_printf("content!!");
+ str_tmp += strlen("\"content\":\"");
+ int str_tmp_len = str_count(str_tmp,'\"');
+
+ int ret = check_text(str_tmp,str_tmp_len) ;
+ //识别到有命令词,退出
+ if(ret == 0)
+ break;
+ }
}
else if(strstr(recv_buff,"\"vad.active\""))//vad触发
{
}
else if(code == WS_BINARY)//二进制
{
- //bk_printf("VCVC:read BIN status:%d,code:%d\n",status,code);
- // if(status<1000)
+
+ // for(int i = 0;i<4;i++)
// {
- // bk_printf("VCVC:read :status:%d,code:%d,result_val:%d,data:%s\n",status,code,result_val,recv_buff);
+ // audio_data(recv_buff+status/4*i,status/4,24);
+ // //bk_printf("recv_buff len = %d",status/4);
+ // aos_sleep(1);
// }
+ // if(status%4)
+ // {
+ // audio_data(recv_buff+status/4*4,status%4,24);
+ // aos_sleep(1);
+ // }
+ //bk_printf("read BIN status:%d,code:%d!!!!!!",status,code);
+
AI_VC_put_play_data(recv_buff,status);//音频调试1
play_data_len+=status;
}
- }else if(status <0)//报错,关闭连接
+ }else// if(status == -1)//报错,关闭连接
{
- bk_printf("AI_VC_read_task:vc连接断开了");
-
- AI_AMP_MSG_put("vc连接断开了",strlen("vc连接断开了"),VC_CONNECT_ERROR);
+ aos_sleep(1);
+ if(AI_client_VC != NULL)
+ {
+ bk_printf("AI_VC_read_task:vc连接断开了");
+ AI_AMP_MSG_put("vc连接断开了",strlen("vc连接断开了"),VC_CONNECT_ERROR);
+ }else{
+ bk_printf("AI_VC_read_task:客户端主动断开连接了");
+ }
+
+ break;
}
aos_sleep(1);
}else
{
bk_printf("AI_VC_read_task:error AI_VC_client_websocket_handle=%d\n",AI_VC_client_websocket_handle);
- aos_sleep(100);
+ break;
}
// bk_printf("AI_VC_read_task ..... \n");
- // aos_sleep(5000);
+ // aos_sleep(5000);
+ }
+ if(recv_buff)
+ {
+ aic_free(recv_buff);
+ recv_buff = NULL;
+ }
+ bk_printf("AI_VC_read_task exit\n");
+ AI_VC_read_task_flag=3;
+}
+u8 vrecord_buf[3500 + 4];
+static void AI_VC_record_task(void *thread_input)//录音线程
+{
+
+ //bk_stream_record_start();
+ int vad_status_t = 0;
+ int ret = 0;
+ bk_printf("AI_VC_record_task go......");
+ if(app_audio_flag == 0)
+ {
+ app_audio_param_t param;
+ param.channel = 1;
+ param.format = ASTREAM_FORMAT_PCM;
+ param.sample_rate = 16000;
+ param.flag = 0;
+ param.bit_rate = 0;
+ play_data_len = 0;
+ app_audio_flag = 1;
+ ret = app_audio_start(APP_AUDIO_TYPE_STREAM_DUPLEX, ¶m, bk_audio_start_callback);//初始化音频
+ bk_printf("app_audio_start ret=%d",ret);
+ app_logi("AI_VC_record_task app_audio_start ret=%d",ret);
+ }
+ AI_VC_audio_queue_t AI_VC_play_record_data;
+ AI_VC_record_task_flag = 1;
+ while(1)
+ {
+ if(AI_VC_record_task_flag >= 2)
+ break;
+ //bk_printf("AI_VC_record_task 1 ");
+ ret = app_audio_read(APP_AUDIO_TYPE_STREAM_DUPLEX,
+ vrecord_buf, 3200, 1010);
+ // u32 timer_ms = aos_get_tickcount();
+ // bk_printf("%d:ret=%d",timer_ms,ret);
+ //bk_printf("AI_VC_record_task app_audio_read len = %d,VC_state = %d",ret,VC_state);
+ if(ret<=0)
+ {
+ //bk_printf("AI_VC_record_task continue len = %d,VC_state = %d",ret,VC_state);
+ aos_sleep(1);
+ continue;
+ }
+ audio_data(vrecord_buf,ret,23);
+ if(vc_cfg.is_VAD == 1)//VAD逻辑:先判断有没有有效数据,触发了有效数据才发送
+ {
+
+ // 每次获得语音后调用, 语音长度最好小于100ms
+ // wave为u8*或void*指针时需要 / 2
+ run_vad((int16_t *)vrecord_buf, ret / 2);
+ vad_status_t = vad_detect();
+ //bk_printf("VAD:vad_status_t:%d",vad_status_t);
+
+ if (vad_status_t == 2) {
+ vad_clear();
+ if(VAD_status == 1)//清空buff
+ {
+ bk_rb_clear(VAD_rb_data);
+ AI_VC_put_record_data(vrecord_buf,ret);
+ }
+ VAD_status = 2;
+
+ }else if(vad_status_t == 1 )//检测到说话
+ {
+ if(VAD_status ==0)//第一次检测到说话
+ {
+
+ int rb_len_t = bk_rb_data_len(VAD_rb_data);
+ bk_printf("VAD:检测到说话了,回溯音频大小:%d,VC_state:%d",rb_len_t,VC_state);
+ while(bk_rb_data_len(VAD_rb_data))//清空缓存数据
+ {
+ unsigned char *vad_r_tmp = aic_malloc(1280);
+ if(vad_r_tmp)
+ {
+ unsigned int r_len = bk_rb_read(VAD_rb_data,vad_r_tmp,1280);
+ //AI_VC_send_data(vad_r_tmp,r_len,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);//发送缓冲数据
+ AI_VC_put_record_data(vad_r_tmp,r_len);//入队缓冲数据
+ aic_free(vad_r_tmp);
+ }
+ }
+ VAD_status = 1;
+ }
+ AI_VC_put_record_data(vrecord_buf,ret);
+ //bk_printf("VAD:检测到说话了");
+ }else if(vad_status_t == 0 )//m没有说话
+ {
+ //把音频入队,缓存回溯数据
+ if(VAD_rb_data)
+ {
+ if(VAD_RB_LEN - bk_rb_data_len(VAD_rb_data) >= ret)//缓存够
+ {
+ bk_rb_write(VAD_rb_data,vrecord_buf,ret);
+ }else//缓存太大,需要出队处理
+ {
+ unsigned char *vad_tmp = aic_malloc(ret);
+ if(vad_tmp)
+ {
+ bk_rb_read(VAD_rb_data,vad_tmp,ret);
+ aic_free(vad_tmp);
+ }
+ //bk_printf("缓存太大,先出队");
+ bk_rb_write(VAD_rb_data,vrecord_buf,ret);
+ }
+ }
+
+ }
+ u32 count_tmp = 0;
+ if(AI_VC_record_tmp_queue)
+ aos_get_queue_used_count(AI_VC_record_tmp_queue,&count_tmp);
+ //bk_printf("count_tmp:%d,VC_state:%d",count_tmp,VC_state);
+ if(count_tmp>0)//有有效录音数据
+ {
+ if(VC_state >= VC_State_TTSStart)//
+ {
+ VC_state = VC_State_None;
+ bk_printf("VAD:vad_status_t:%d",vad_status_t);
+ bk_printf("VAD:发送打断对话");
+ AI_AMP_MSG_put(0,0,VC_Cancel);//发送打断
+ }
+ else if(VC_state == VC_State_SpeechIng )//可以发数据了
+ {
+ char count_tmp = 200;
+ while(count_tmp --)
+ {
+ if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有有效录音数据
+ {
+ audio_data(AI_VC_play_record_data.data,AI_VC_play_record_data.len,22);
+ AI_VC_send_data(AI_VC_play_record_data.data,AI_VC_play_record_data.len,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
+ aic_free(AI_VC_play_record_data.data);
+ }else
+ break;
+ }
+ }
+ else if(VC_state == VC_State_Listening )
+ {
+ AI_VC_send_audio_create();//发送开始音频
+ bk_printf("VAD:发送开始音频");
+ }
+
+ }else//没录音数据
+ {
+ if(VC_state == VC_State_SpeechIng )//开始说话,且没数据
+ {
+ AI_VC_send_audio_completed();//发送停止音频、、目前还是会有数据下发
+ bk_printf("VAD:发送停止音频");
+ bk_printf("VAD:vad_status_t:%d",vad_status_t);
+ }
+ VAD_status = 0;
+ }
+
+
+ continue;
+ }
+
+ //AI_VC_put_play_data(vrecord_buf,ret);//音频调试0
+
+ if(AI_VC_record_tmp_queue == NULL)
+ continue;
+ if(VC_state == VC_State_None)//开启的时候,先缓存音频
+ {
+ AI_VC_put_record_data(vrecord_buf,ret);
+ }
+ //else if(VC_state >= VC_State_Listening && VC_state<VC_State_TTSStart)//正常录音
+ else if(VC_state >= VC_State_Listening )//正常录音
+ {
+ char count_t = 200;
+ while(count_t--)
+ {
+ if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有录音数据
+ {
+ AI_VC_send_data(AI_VC_play_record_data.data,AI_VC_play_record_data.len,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
+ aic_free(AI_VC_play_record_data.data);
+ }else
+ break;
+ }
+ AI_VC_send_data(vrecord_buf,ret,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
+ //bk_printf("AI_VC_record_task send_data len = %d",ret);
+ }else
+ {
+ char count_t = 200;
+ while(count_t--)//清掉缓存
+ {
+ if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有录音数据
+ {
+ aic_free(AI_VC_play_record_data.data);
+ }else
+ break;
+ }
+ }
}
+ AI_VC_record_task_flag = 3;
+ bk_printf("AI_VC_record_task exit.....");
+ //app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
+}
+
+char play_tmp_d[320] = {0};
+static void AI_VC_play_task(void *thread_input)//音频播放线程
+{
+ int ret=0;
+ //bk_stream_play_start();
+ AI_VC_audio_queue_t AI_VC_play_queue_data;
+ aos_status queue_ret = AOS_ERROR;
+ AI_VC_play_task_flag = 1;
+ bk_printf("AI_VC_play_task go......");
+ if(app_audio_flag == 0)
+ {
+ app_audio_param_t param;
+ param.channel = 1;
+ param.format = ASTREAM_FORMAT_PCM;
+ param.sample_rate = 16000;
+ param.flag = 0;
+ param.bit_rate = 0;
+ play_data_len = 0;
+ app_audio_flag = 1;
+ ret = app_audio_start(APP_AUDIO_TYPE_STREAM_DUPLEX, ¶m, bk_audio_start_callback);//初始化音频
+ bk_printf("app_audio_start ret=%d",ret);
+ app_logi("AI_VC_play_task app_audio_start ret=%d",ret);
+ }
+ while(1)
+ {
+ if(AI_VC_play_task_flag >=2)
+ break;
+ //app_logi("app_audio_write0!!\r\n");
+ if(VC_Play_flag ==1 && AI_VC_play_queue )
+ {
+ queue_ret = aos_recv_from_queue(AI_VC_play_queue,&AI_VC_play_queue_data,AOS_NO_WAIT);
+ if( queue_ret== AOS_SUCCESS)
+ {
+ if( AI_VC_play_queue_data.data)
+ {
+ ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
+ AI_VC_play_queue_data.data, AI_VC_play_queue_data.len, 2000);
+
+ if (ret < 0)
+ bk_printf("app_audio_write error, ret=%d\n", ret);
+
+
+ aic_free(AI_VC_play_queue_data.data);
+ if(VC_state == VC_State_End)
+ {
+ u32 count_tmp = 0;
+ if(AI_VC_play_queue)
+ aos_get_queue_used_count(AI_VC_play_queue,&count_tmp);
+ bk_printf("VC_State_End:count_tmp = %d",count_tmp);
+ if(count_tmp <= 0 )//播放完了
+ {
+ VC_END_play_timerout = 1;
+ }
+ }
+ continue;//正常有数据就不执行下面写0
+ }else
+ {
+ bk_printf("AI_VC_play ERROR:AI_client_VC = %d",AI_client_VC);
+ break;
+
+ }
+
+ }
+ }
+ //没数据的时候也要写0x00
+ {
+ //bk_printf("AI_VC_play_task no data ");
+ memset(play_tmp_d,0,sizeof(play_tmp_d));
+ //app_logi("app_audio_write0:write 0");
+ ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
+ play_tmp_d, sizeof(play_tmp_d), AOS_WAIT_FOREVER);
+ // app_logi("app_audio_write3:write 0");
+
+ }
+ }
+ AI_VC_play_task_flag = 3;
+ bk_printf("AI_VC_play_task exit......");
+ //app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
+}
+
+
+
+//连接websocket
+static int websocket_connect_VC(void)
+{
+ //连接服务器
+ if(AI_client_VC == NULL)
+ {
+ //AI_client_VC = init_websocket_client("ws://118.145.158.207:22086/vc/coze?is_auth=0",NULL);
+ char *url = aic_malloc(512);//[100] = "ws://118.145.158.207:22086/vc/chat?is_auth=0";
+ int url_len = 0;
+ if(!url)
+ return -1;
+ url_len =snprintf(url,511,"ws://%s/vc/chat?is_auth=0",vc_cfg.server_ip);
+ url[url_len] = 0;
+ AI_client_VC = init_websocket_client(url,NULL);
+ bk_printf("连接服务器 url:%s",url);
+ aic_free(url);
+ }
+ //创建发送线程
+ if(AI_VC_send_task_id == 0)
+ {
+ AI_VC_send_task_id = aos_create_thread(
+ "AI_VC_send",
+ AI_VC_send_task,
+ &AI_VC_send_task_id,
+ 1024*16,
+ 0,
+ NULL,
+ ai_VC_task_priority,
+ AOS_AUTO_START);
+ bk_printf("创建发送线程 AI_VC_send_task_id:%d",AI_VC_send_task_id);
+ }
+ //创建发送队列
+ if(AI_VC_send_queue == NULL)
+ {
+ AI_VC_send_queue = aos_create_queue("AI_VC_send_queue",
+ sizeof(AI_VC_send_queue_t),
+ 200);
+ bk_printf("创建发送队列 AI_VC_send_queue:%d",AI_VC_send_queue);
+ }
+ //创建读线程
+ if(AI_VC_read_task_id == 0)
+ {
+ AI_VC_read_task_id = aos_create_thread(
+ "AI_VC_read",
+ AI_VC_read_task,
+ &AI_VC_read_task_id,
+ 4096u,
+ 0,
+ NULL,
+ ai_VC_task_priority,
+ AOS_AUTO_START);
+ bk_printf("创建读线程 AI_VC_read_task_id:%d",AI_VC_read_task_id);
+ }
+ return 0;
+
+}
+static void websocket_deconnect_VC(void)
+{
+ int count = 0;
+ bk_printf("websocket_deconnect_VC!!!!!!!!!!!!");
+ // if(AI_VC_client_websocket_handle)//断开服务器
+ // {
+ // aic_websocket_disconnect(AI_VC_client_websocket_handle,5000);
+ // aic_websocket_delete(AI_VC_client_websocket_handle,5000);
+ // AI_VC_client_websocket_handle = 0;
+ // }
+ if(AI_client_VC)//先断开再关闭读线程
+ {
+ close_websocket_client(AI_client_VC);
+ AI_client_VC = NULL;
+ }
+ //销毁发送线程
+ if(AI_VC_send_task_id != 0)
+ {
+ if(AI_VC_send_task_flag <3)
+ {
+ AI_VC_send_task_flag =2;//告诉线程要退出了
+ count = 300;
+ while (count--)
+ {
+ if(AI_VC_send_task_flag>=3)
+ break;
+ aos_sleep(1);
+
+ }
+ bk_printf("close AI_VC_send_task %d ...",count);
+
+ }
+ aos_delete_thread(AI_VC_send_task_id);
+ AI_VC_send_task_flag = 0;
+ AI_VC_send_task_id = 0;
+ }
+
+
+ //销毁读线程
+ if(AI_VC_read_task_id != 0)
+ {
+ if(AI_VC_read_task_flag<3)
+ {
+ AI_VC_read_task_flag =2;//告诉线程要退出了
+ count = 300;
+ while (count--)
+ {
+ if(AI_VC_read_task_flag>=3)
+ break;
+ aos_sleep(1);
+
+ }
+ bk_printf("close AI_VC_read_task %d ...",count);
+ }
+ aos_delete_thread(AI_VC_read_task_id);
+ AI_VC_read_task_flag = 0;
+ AI_VC_read_task_id = 0;
+ }
+
+
+}
+//websocket 发送数据,AIC_WEBSOCKET_OPCODE = AIC_WEBSOCKET_OPCODE_TEXT_FRAME发送字符串,
+//AIC_WEBSOCKET_OPCODE =AIC_WEBSOCKET_OPCODE_BINARY_FRAME发送二进制
+static aos_status AI_VC_send_data(char *data,u32 len,u8 AIC_WEBSOCKET_OPCODE)
+{
+ if(AI_VC_send_queue == NULL)
+ return AOS_ERROR;
+ AI_VC_send_queue_t AI_VC_send_queue_data;
+ AI_VC_send_queue_data.data = aic_malloc(len+1);
+ memset(AI_VC_send_queue_data.data ,0,len+1);
+ if(!AI_VC_send_queue_data.data)
+ {
+ bk_printf("AI_VC_send_data aic_malloc ERROR!!!!!!!!!!");
+ return AOS_ERROR;
+ }
+ memcpy(AI_VC_send_queue_data.data,data,len);
+ AI_VC_send_queue_data.len=len;
+ AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE=AIC_WEBSOCKET_OPCODE;
+ if(AI_VC_send_queue && AOS_SUCCESS!=aos_send_to_queue(AI_VC_send_queue,&AI_VC_send_queue_data,AOS_NO_WAIT))
+ {
+
+ aic_free(AI_VC_send_queue_data.data);
+ return AOS_ERROR;
+ }
+
+ return AOS_SUCCESS;
}
static void AI_VC_put_play_data(char *data,u32 len)
PUT_PLAY_ERROR:
aic_free(AI_VC_play_queue_data.data);
}
-char play_tmp_d[320] = {0};
-// u32 play_tmp_d_len = 0;
-// #define SAMPLE_RATE 16000 // 采样率,通常为 44100 Hz
-// #define DURATION 2 // 音频时长,单位为秒
-// #define FREQUENCY 440 // 音频频率,单位为 Hz
-// #define AMPLITUDE 32767 // 音频振幅,16 位有符号整数的最大值
-// #define num_samples SAMPLE_RATE * DURATION // 计算总采样数
-// short bk_audio_data[num_samples+4096]; // 定义音频数据数组
-// #include <stdio.h>
-// #include <math.h>
-
-static void AI_VC_play_task(void *thread_input)//音频播放线程
-{
- int ret=0;
- //bk_stream_play_start();
- AI_VC_audio_queue_t AI_VC_play_queue_data;
-
- while(1)
- {
- if(VC_Play_flag ==1 && AI_VC_play_queue && aos_recv_from_queue(AI_VC_play_queue,&AI_VC_play_queue_data,AOS_NO_WAIT) == AOS_SUCCESS)
- {
- if( AI_VC_play_queue_data.data)
- {
-
- // int audio_play_time = AI_VC_play_queue_data.len*1000/32000+1;
- ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
- AI_VC_play_queue_data.data, AI_VC_play_queue_data.len, 2000);
- //audio_data(AI_VC_play_queue_data.data,AI_VC_play_queue_data.len,20);
- if (ret < 0)
- bk_printf("app_audio_write error, ret=%d\n", ret);
- // for(int i = 0;i<=AI_VC_play_queue_data.len/sizeof(play_tmp_d);i++)//分段写,一次写入小于640会出问题
- // {
- // int play_tmp_d_len = sizeof(play_tmp_d);
- // memset(play_tmp_d,0,play_tmp_d_len);
-
- // if(i == AI_VC_play_queue_data.len/sizeof(play_tmp_d))//最后一段
- // {
- // play_tmp_d_len = AI_VC_play_queue_data.len - i*play_tmp_d_len;
- // }
- // memcpy(play_tmp_d,AI_VC_play_queue_data.data+i*play_tmp_d_len,play_tmp_d_len);
- // ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
- // play_tmp_d, play_tmp_d_len, AOS_WAIT_FOREVER);
- // bk_printf("AI_VC_play_task:write len = %d",play_tmp_d_len);
- // }
-
-
- aic_free(AI_VC_play_queue_data.data);
- if(VC_state == VC_State_End)
- {
- u32 count_tmp = 0;
- if(AI_VC_play_queue)
- aos_get_queue_used_count(AI_VC_play_queue,&count_tmp);
- bk_printf("VC_State_End:count_tmp = %d",count_tmp);
- if(count_tmp <= 0 )//播放完了
- {
- VC_END_play_timerout = 1;
- }
- }
- }else
- {
- bk_printf("AI_VC_play ERROR:AI_client_VC = %d",AI_client_VC);
- }
-
- }else//没数据的时候也要写0x00
- {
- //bk_printf("AI_VC_play_task no data ");
- memset(play_tmp_d,0,sizeof(play_tmp_d));
- ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
- play_tmp_d, sizeof(play_tmp_d), AOS_WAIT_FOREVER);
-
- }
- }
- //app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
-}
//打开音频播放
void VC_Play_Start(void)
aic_free(AI_VC_record_queue_data.data);
}
-u8 vrecord_buf[3500 + 4];
-static void AI_VC_record_task(void *thread_input)//录音线程
-{
-
- //bk_stream_record_start();
- int ret = 0;
- bk_printf("AI_VC_record_task go......");
- AI_VC_audio_queue_t AI_VC_play_record_data;
- while(1)
- {
- //bk_printf("AI_VC_record_task 1 ");
- ret = app_audio_read(APP_AUDIO_TYPE_STREAM_DUPLEX,
- vrecord_buf, 3200, 1010);
- // u32 timer_ms = aos_get_tickcount();
- // bk_printf("%d:ret=%d",timer_ms,ret);
-
- if(ret<=0)
- {
- //bk_printf("AI_VC_record_task continue len = %d,VC_state = %d",ret,VC_state);
- aos_sleep(1);
- continue;
- }
- //AI_VC_put_play_data(vrecord_buf,ret);//音频调试0
- audio_data(vrecord_buf,ret,23);
- if(AI_VC_record_tmp_queue == NULL)
- continue;
- if(VC_state == VC_State_None)//开启的时候,先缓存音频
- {
- AI_VC_put_record_data(vrecord_buf,ret);
- }else if(VC_state >= VC_State_Listening )//正常录音
- {
- char count_t = 200;
- while(count_t--)
- {
- if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有录音数据
- {
- AI_VC_send_data(AI_VC_play_record_data.data,AI_VC_play_record_data.len,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
- aic_free(AI_VC_play_record_data.data);
- }else
- break;
- }
- AI_VC_send_data(vrecord_buf,ret,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
- //bk_printf("AI_VC_record_task send_data len = %d",ret);
- }else
- {
- char count_t = 200;
- while(count_t--)//清掉缓存
- {
- if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有录音数据
- {
- aic_free(AI_VC_play_record_data.data);
- }else
- break;
- }
- }
-
- }
- aos_sleep(1);
- bk_printf("AI_VC_record_task end.....");
- //app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
-}
+
+
//打开录音
void VC_record_Start(void)
"AI_VC_record",
AI_VC_record_task,
&AI_VC_record_task_id,
- 4096u,
+ 1024*16,
0,
NULL,
ai_VC_task_priority,
sizeof(AI_VC_audio_queue_t),
200);
}
+ //创建VAD回溯缓冲buf
+ if(vc_cfg.is_VAD == 1 && VAD_rb_data == NULL)
+ {
+ VAD_rb_data = bk_rb_create(VAD_RB_LEN);
+ if(!VAD_rb_data )
+ {
+ bk_printf("VAD_rb_data error!申请失败");
+ }
+ }
+
}
//关闭录音
void VC_record_End(void)
// aos_delete_queue(AI_VC_record_tmp_queue);
// AI_VC_record_tmp_queue = NULL;
}
-
+ //删除VAD回溯缓冲buf
+ if(VAD_rb_data != NULL)
+ {
+ bk_rb_destroy(&VAD_rb_data);
+ }
}
static void AI_VC_1S_timeout(void *param)
if(VC_END_play_timerout<=0)
{
if(VC_mode == 0)
- VC_state = VC_State_Listening;//重新开始了
+ {
+ if(Close_flag == 1)
+ {
+ Close_flag = 0;
+ AI_AMP_MSG_put(0,0,VC_CLOSE);
+ }else
+ {
+ VAD_status = 0;
+ VC_state = VC_State_Listening;//重新开始了
+ }
+
+ }
else
AI_AMP_MSG_put(0,0,VC_CLOSE);
//AI_AMP_MSG_put(0,0,VC_RECORD_START);//开启录音
bk_msg_printf("VC_END_play_timerout=%d",VC_END_play_timerout);
}
}
- if(AI_VC_play_queue)
- {
- int play_queue_count = 0;
- aos_get_queue_used_count(AI_VC_play_queue,&play_queue_count);
- bk_msg_printf("AI_VC_send_queue:play_queue_count=%d",play_queue_count);
- }
+ // if(AI_VC_play_queue)
+ // {
+ // int play_queue_count = 0;
+ // aos_get_queue_used_count(AI_VC_play_queue,&play_queue_count);
+ // bk_msg_printf("AI_VC_send_queue:play_queue_count=%d",play_queue_count);
+ // }
}
void AI_key_press(void)
{
+ static u64 timer_ms = 0;
+
+ u64 timer_ms_tmp = aos_get_tickcount();
+ if(timer_ms_tmp-timer_ms<1000)//每次触发小于1000ms不响应
+ return;
+ timer_ms = timer_ms_tmp;
bk_printf("AI_key_press");
AI_VC_Close();
+
VC_state = VC_State_None;
VC_record_Start() ;
AI_VC_start();
-
-
+ int ret = 0;
+ ret = audio_play_tone(3,300);//播放提示音,测试用
+ app_logi("audio_play_tone ret = %d\r\n",ret);
+ aos_sleep(1);
}
void AI_key_release(void)
{
}
void AI_key_long_press(void)
{
- AI_VC_Close();
bk_printf("AI_key_long_press");
+
}
-void pwk_key_release(void)
+void AI_key_long_release(void)
{
- bk_printf("pwk_key_release");
+ bk_printf("AI_key_long_release");
if(VC_mode == 1)//长按模式
AI_VC_send_audio_completed();
+}
+void pwk_key_release(void)
+{
+ bk_printf("pwk_key_release");
+ AI_VC_Close();
}
+int32_t bk_audio_stop_callback(void *p_param, uint32_t size)
+{
+ app_event_audio_t * p_app_event;
+ p_app_event = (app_event_audio_t *)p_param;
+ bk_printf("bk_audio_stop_callback:event_id:%d",p_app_event->event_id);
+ app_logi("bk_audio_stop_callback:event_id:%d",p_app_event->event_id);
+ switch (p_app_event->event_id)
+ {
+ case APP_EVENT_AUDIO_STREAM_DUPLEX_FINISH:
+ /* code */
+ audio_stop_flag= 1;
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+}
+int32_t bk_audio_start_callback(void *p_param, uint32_t size)
+{
+ app_event_audio_t * p_app_event;
+ p_app_event = (app_event_audio_t *)p_param;
+ bk_printf("bk_audio_start_callback:event_id:%d",p_app_event->event_id);
+ app_logi("bk_audio_start_callback:event_id:%d",p_app_event->event_id);
+ // switch (p_app_event->event_id)
+ // {
+ // case APP_EVENT_AUDIO_STREAM_DUPLEX_FINISH:
+ // /* code */
+ // audio_stop_flag= 1;
+ // break;
+
+ // default:
+ // break;
+ // }
+
+ return 0;
+}
void AI_VC_start(void)
{
int ret = 0;
param.flag = 0;
param.bit_rate = 0;
play_data_len = 0;
- ret = app_audio_start(APP_AUDIO_TYPE_STREAM_DUPLEX, ¶m, NULL);//初始化音频
- app_audio_set_master_volume(2);
+ if(app_audio_flag == 0)
+ {
+ app_audio_flag = 1;
+ ret = app_audio_start(APP_AUDIO_TYPE_STREAM_DUPLEX, ¶m, bk_audio_start_callback);//初始化音频
+ bk_printf("app_audio_start ret=%d",ret);
+ app_logi("app_audio_start ret=%d",ret);
+ }
+ // aic_gpio_output(GPIO_25,GPIO_OUTPUT_LVL_HIGH );//led
+ // aic_gpio_output(GPIO_30,GPIO_OUTPUT_LVL_HIGH );//led
+ // aic_gpio_output(GPIO_31,GPIO_OUTPUT_LVL_HIGH );//led
+ // aic_gpio_output(GPIO_GPO_8,GPIO_OUTPUT_LVL_HIGH );//马达
+ // aic_gpio_output(GPIO_GPO_1,GPIO_OUTPUT_LVL_LOW );//马达
+ // aic_gpio_output(GPIO_20,GPIO_OUTPUT_LVL_HIGH );//马达
+ //app_audio_set_master_volume(8);
// if (ret) {
// bk_printf("AI_VC_start app_audio_start error");
// return;
}
if(inbound_attributes_format == inbound_attributes_format_OPUS)
{
+ #if SUPPORT_OPUS
//int err;
if (opus_encoder_h == NULL)
{
//opus_decoder_h = opus_decoder_create(16000, 1, &err);
}
+ #endif
}
-
+ if(vc_cfg.is_VAD == 1)
+ {
+
+
+ // 启用VAD时初始化
+ struct VadConfig conf;
+ conf.sil_threshold = 63;
+ conf.energy_threshold = 10000;
+ conf.min_speech_length = 240;
+ conf.silence_detect_length = 300;
+ conf.rule1_min_tailing_silence = 480;
+ conf.rule2_min_tailing_silence = vc_cfg.vad_silence ;
+ conf.rule3_min_tailing_silence = vc_cfg.vad_silence;
+ conf.vad_log_level = 2;
+ init_vad(&conf);
+ VAD_status = 0;
+
+
+
+ }
VC_record_Start();
- VC_Play_Start();//音频调试1
- websocket_connect_VC();//音频调试1
- aos_sleep(5);
- AI_VC_send_satrt();//音频调试1
+ VC_Play_Start();//
+ websocket_connect_VC();//
+ //aos_sleep(5);
+ AI_VC_send_satrt();//
close_timerout = 0;
}
void AI_VC_Close(void)
{
+ int count;
+ // aic_gpio_output(GPIO_25,GPIO_OUTPUT_LVL_LOW );
+ // aic_gpio_output(GPIO_30,GPIO_OUTPUT_LVL_LOW );
+ // aic_gpio_output(GPIO_31,GPIO_OUTPUT_LVL_LOW );
+ // aic_gpio_output(GPIO_GPO_8,GPIO_OUTPUT_LVL_LOW );
+ // aic_gpio_output(GPIO_GPO_1,GPIO_OUTPUT_LVL_LOW);
+ // aic_gpio_output(GPIO_20,GPIO_OUTPUT_LVL_LOW );
+ if(vc_cfg.is_VAD == 1)
+ {
+ // 不使用或暂停使用VAD时调用
+ free_vad();
+ VAD_status = 0;
+ }
+
bk_printf("AI_VC_Close!!!!!!!!!!!!");
- //é\94\80æ¯\81å\8f\91é\80\81线程
+ //é\94\80æ¯\81å½\95é\9f³线程
if(AI_VC_record_task_id != 0)
{
- aos_delete_thread(AI_VC_record_task_id);
- AI_VC_record_task_id = 0;
+ if(AI_VC_record_task_flag <3)
+ {
+ AI_VC_record_task_flag =2;//告诉线程要退出了
+ count = 300;
+ while (count--)
+ {
+ if(AI_VC_record_task_flag>=3)
+ break;
+ aos_sleep(1);
+
+ }
+ bk_printf("close AI_VC_record_task %d ...",count);
+ }
+ aos_delete_thread(AI_VC_record_task_id);
+ AI_VC_record_task_flag = 0;
+ AI_VC_record_task_id = 0;
}
//销毁录音缓存队列
if(AI_VC_record_tmp_queue != NULL)
//销毁播放线程
if(AI_VC_play_task_id != 0)
{
+ if(AI_VC_play_task_flag <3)
+ {
+ AI_VC_play_task_flag =2;//告诉线程要退出了
+ count = 300;
+ while (count--)
+ {
+ if(AI_VC_play_task_flag>=3)
+ break;
+ aos_sleep(1);
+
+ }
+ bk_printf("close AI_VC_play_task %d ...",count);
+ //app_logi("close AI_VC_play_task %d ...",count);
+
+ }
+
aos_delete_thread(AI_VC_play_task_id);
+ AI_VC_play_task_flag = 0;
AI_VC_play_task_id = 0;
}
//销毁发送队列
bk_printf("AI_VC_Close2!!!!!!!!!!!!");
websocket_deconnect_VC();
+ //销毁发送队列,不在websocket_deconnect_VC里调用,避免重连需要发指令
+ if(AI_VC_send_queue != NULL)
+ {
+ char count_t= 200;
+ AI_VC_send_queue_t AI_VC_send_queue_data_t;
+ while(count_t--)//清空队列数据
+ {
+ if(aos_recv_from_queue(AI_VC_send_queue,&AI_VC_send_queue_data_t,AOS_NO_WAIT) == AOS_SUCCESS)
+ {
+ if(AI_VC_send_queue_data_t.data)
+ aic_free(AI_VC_send_queue_data_t.data);
+ }
+ else{
+ break;
+ }
+ }
+ aos_delete_queue(AI_VC_send_queue);
+ AI_VC_send_queue = NULL;
+ }
bk_printf("AI_VC_Close3!!!!!!!!!!!!");
if(AI_TTS_str)
{
close_timerout = 0;
if(inbound_attributes_format == inbound_attributes_format_OPUS)
{
+ #if SUPPORT_OPUS
// if(opus_encoder_h)
// opus_encoder_destroy(opus_encoder_h);
// opus_encoder_h = NULL;
aic_free(opus_decoder_h);
opus_decoder_h = NULL;
}
+ #endif
+ }
+ bk_printf("app_audio_stop1");
+ //app_logi("app_audio_stop1");
+ if(app_audio_flag == 1)
+ {
+ app_audio_flag = 0;
+ audio_stop_flag = 0;
+ app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, bk_audio_stop_callback);//要在销毁线程之后
+ int audio_count = 300;
+ while(audio_count--)
+ {
+ if(audio_stop_flag == 1)//关成功了
+ break;
+ aos_sleep(1);
+ }
+ bk_printf("app_audio_stop2 audio_count:%d",audio_count);
}
- app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);//要在销毁线程之后
+ //app_logi("app_audio_stop2");
+
+
}
aos_status AI_AMP_MSG_put(const char *data,u32 len,AI_AMP_MSG_Type MSG_Type)
{
static void AI_AMP_2_5_task(void *thread_input)//做逻辑线程
{
- char count = 20;
+ char count = 30;
boolean pdp_activated ;
AI_AMP_MSG_queue_t AI_AMP_msg = {0};
+
+ init_VC_cfg();
+ app_audio_set_master_volume(15*vc_cfg.VC_TTS_volume/100);
while(count --)
{
pdp_activated = aic_is_default_pdp_activated();
if(pdp_activated == TRUE)
break;
bk_printf("AI_AMP_2_5_init 等待注网..... \n");
+ audio_play_tone(3,200);//播放提示音,测试用
aos_sleep(1000);
}
- aic_srv_tele_radio_get_current_slot_imei_sync(dev_imei);
- bk_printf("IMEI:%s",dev_imei);
+
+ current_card_id = aic_srv_tele_sim_get_current_card_sync();
+ aic_srv_tele_radio_get_current_slot_imei_sync(vc_cfg.dev_imei);
+ bk_printf("IMEI:%s",vc_cfg.dev_imei);
+ aic_srv_tele_sim_get_iccid_sync(current_card_id,vc_cfg.ICCID);
+ bk_printf("vc_cfg.ICCID:%s",vc_cfg.ICCID);
dev_authentication_init();
aic_network_enable_pdp_nic_capdump();//打开网络调试log
- char *tts_str = "你好!我是小瑞";
- VC_TTS_Play(tts_str);//开启vc播放tts
+ // while(1)
+ // {
+ // aos_sleep(1000);
+ // }
+
+ VC_TTS_Play(vc_cfg.power_on_tone);//开启vc播放tts
while (1) {
if(AI_AMP_task_queue)
{
aos_recv_from_queue(AI_AMP_task_queue,&AI_AMP_msg,AOS_WAIT_FOREVER) ;
switch (AI_AMP_msg.MSG_Type)
{
+
+ case POWER_OFF://关机
+ AI_VC_Close();
+ //播放关机提示音
+ sysoff_shutdown();
+ break;
+ case VC_Cancel://打断
+ //发送打断
+ //AI_VC_send_cancel();//发送打断,发送完打断还有发开始音频
+ //app_logi("interruption!!!!!!!!!!!!!!!!!!!!!");
+ VC_Play_End();
+ VC_state = VC_State_None;
+ websocket_deconnect_VC();
+ websocket_connect_VC();//重连
+ AI_VC_send_satrt();//发送开始
+
+
+ break;
case VC_CLOSE:
AI_VC_Close();
break;
case VC_RECORD_END:
VC_record_End();
break;
-
+ case VC_TTS_PLAY:
+ if(AI_AMP_msg.data!=NULL)
+ VC_TTS_Play(AI_AMP_msg.data);
+ break;
+ case VC_TTS_PLAY_CLOSE:
+ if(AI_AMP_msg.data!=NULL)
+ {
+ VC_TTS_Play(AI_AMP_msg.data);
+ Close_flag = 1;
+ }
+
+
+ break;
case VC_CONNECT_ERROR://连接错误
AI_VC_Close();
}
break;
case AI_KEY_PRESS:
+
AI_key_press();
break;
case AI_KEY_LONG_PRESS:
AI_key_long_press();
break;
+ case AI_KEY_LONG_RELEASE:
+ AI_key_long_release();
+ break;
case PWK_KEY_RELEASE:
pwk_key_release();
break;
*/
ai_uart_handle = uart_open(1);
aic_assert(ai_uart_handle);
-
-
-
/* change baudrate */
uart_set_baud_rate(ai_uart_handle, 921600);
+
//创建AI_AMP_task队列
if(AI_AMP_task_queue == NULL)
{
4096u,
0,
NULL,
- ai_VC_task_priority-3,
+ ai_VC_task_priority,
AOS_AUTO_START);
return AIC_SUCCESS;
/*****************************************************************************/
/* */
-/* Copyright 2024 by AICXTEK TECHNOLOGIES CO.,LTD. All rights reserved. */
+/* Copyright 2025 by AICXTEK TECHNOLOGIES CO.,LTD. All rights reserved. */
/* */
/*****************************************************************************/
/* @@Platform: GX306 */
/* @@Author: */
/* @@Version: */
-/* @@Time: 2024/8/17 17:02:52 */
+/* @@Time: 2025/5/13 17:00:19 */
#ifndef __PIN_CFG_H__
#define __PIN_CFG_H__
{REG_PG1_PAD_CTRL_RFCTRL1, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_CP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
{REG_IOMUX_RFCTRL2, BIT_FUNC_SEL(0)},//RFCTRL3
{REG_PG1_PAD_CTRL_RFCTRL2, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_CP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_RFCTRL3, BIT_FUNC_SEL(3)},//KEYOUT
-{REG_PG1_PAD_CTRL_RFCTRL3, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_CL},
+{REG_IOMUX_RFCTRL3, BIT_FUNC_SEL(3)},//GPIO27_AUDIO_PA_EN,ACTIVE LOW
+{REG_PG1_PAD_CTRL_RFCTRL3, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
{REG_IOMUX_RFCTRL4, BIT_FUNC_SEL(4)},//U1TXD
{REG_PG1_PAD_CTRL_RFCTRL4, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
{REG_IOMUX_RFCTRL5, BIT_FUNC_SEL(4)},//U1RXD
{REG_IOMUX_RFCTRL7, BIT_FUNC_SEL(1)},//RFFE_SDA
{REG_PG1_PAD_CTRL_RFCTRL7, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_CP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
/* Group2 */
-{REG_IOMUX_IIS_MCLK, BIT_FUNC_SEL(0)},//IIS_MCLK
-{REG_PG2_PAD_CTRL_IIS_MCLK, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_IIS_MCLK, BIT_FUNC_SEL(3)},//GPIO20_MOT_EN1
+{REG_PG2_PAD_CTRL_IIS_MCLK, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
{REG_IOMUX_IIS_CLK, BIT_FUNC_SEL(0)},//IIS_CLK
{REG_PG2_PAD_CTRL_IIS_CLK, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
{REG_IOMUX_IIS_LRCLK, BIT_FUNC_SEL(0)},//IIS_LRCLK
{REG_IOMUX_UART1_TXD, BIT_FUNC_SEL(0)},//DEBUG_TXD
{REG_PG2_PAD_CTRL_UART1_TXD, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
/* Group3 */
-{REG_IOMUX_SSP_CS1, BIT_FUNC_SEL(3)},//KEYOUT
-{REG_PG3_PAD_CTRL_SSP_CS1, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_CL},
-{REG_IOMUX_SSP_CLK, BIT_FUNC_SEL(4)},// IIC.SDA.INF3
-{REG_PG3_PAD_CTRL_SSP_CLK, BIT_PAD_DRV(2)|BIT_PAD_SSPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_SSP_CS0, BIT_FUNC_SEL(4)},// IIC.SCL.INF3
-{REG_PG3_PAD_CTRL_SSP_CS0, BIT_PAD_DRV(2)|BIT_PAD_SSPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_SSP_MISO, BIT_FUNC_SEL(3)},//KEYIN
-{REG_PG3_PAD_CTRL_SSP_MISO, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
-{REG_IOMUX_SSP_MOSI, BIT_FUNC_SEL(3)},//KEYOUT
-{REG_PG3_PAD_CTRL_SSP_MOSI, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_CL},
-{REG_IOMUX_AUX_CLK0, BIT_FUNC_SEL(3)},//KEYIN
-{REG_PG3_PAD_CTRL_AUX_CLK0, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_SSP_CS1, BIT_FUNC_SEL(3)},//2210_WAKE_6824
+{REG_PG3_PAD_CTRL_SSP_CS1, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_SSP_CLK, BIT_FUNC_SEL(3)},//NC
+{REG_PG3_PAD_CTRL_SSP_CLK, BIT_PAD_DRV(2)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_SSP_CS0, BIT_FUNC_SEL(3)},//NC
+{REG_PG3_PAD_CTRL_SSP_CS0, BIT_PAD_DRV(2)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_SSP_MISO, BIT_FUNC_SEL(3)},//NC
+{REG_PG3_PAD_CTRL_SSP_MISO, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_SSP_MOSI, BIT_FUNC_SEL(3)},//NC
+{REG_PG3_PAD_CTRL_SSP_MOSI, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_AUX_CLK0, BIT_FUNC_SEL(5)},//IIS_MCLK
+{REG_PG3_PAD_CTRL_AUX_CLK0, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
/* Group4 */
{REG_PG4_PAD_CTRL_PSRAM_RWDS, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_NONE|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
{REG_PG4_PAD_CTRL_PSRAM_DQ7, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_NONE|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
{REG_PG4_PAD_CTRL_PSRAM_DM, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_NONE|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
{REG_PG4_PAD_CTRL_PSRAM_RESETB, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_NONE|BIT_PAD_SLP_PX|BIT_PAD_SLP_CH},
/* Group5 */
-{REG_IOMUX_GPO0, BIT_FUNC_SEL(4)},//NETLIGHT
+{REG_IOMUX_GPO0, BIT_FUNC_SEL(4)},//TP_EN_GPO0
{REG_PG5_PAD_CTRL_GPO0, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
-{REG_IOMUX_GPO1, BIT_FUNC_SEL(1)},//UART0_DTR
-{REG_PG5_PAD_CTRL_GPO1, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
-{REG_IOMUX_EIU_INT4, BIT_FUNC_SEL(4)},//UART0_RI
-{REG_PG5_PAD_CTRL_EIU_INT4, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_EIU_INT5, BIT_FUNC_SEL(4)},//UART0_DCD
-{REG_PG5_PAD_CTRL_EIU_INT5, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_EIU_INT6, BIT_FUNC_SEL(4)},//reserved
+{REG_IOMUX_GPO1, BIT_FUNC_SEL(4)},//MOT_EN_REV_GPO1
+{REG_PG5_PAD_CTRL_GPO1, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_EIU_INT4, BIT_FUNC_SEL(0)},//KEY3_INT4
+{REG_PG5_PAD_CTRL_EIU_INT4, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_EIU_INT5, BIT_FUNC_SEL(4)},//GPO3_INT5_TPQ1
+{REG_PG5_PAD_CTRL_EIU_INT5, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_EIU_INT6, BIT_FUNC_SEL(5)},//IIC3_SDA
{REG_PG5_PAD_CTRL_EIU_INT6, BIT_PAD_DRV(1)|BIT_PAD_SSPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_EIU_INT7, BIT_FUNC_SEL(4)},//reserved
+{REG_IOMUX_EIU_INT7, BIT_FUNC_SEL(5)},//IIC3_SCL
{REG_PG5_PAD_CTRL_EIU_INT7, BIT_PAD_DRV(1)|BIT_PAD_SSPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
{REG_IOMUX_SWD_CLK, BIT_FUNC_SEL(0)},//SWD_CLK
{REG_PG5_PAD_CTRL_SWD_CLK, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
{REG_PG6_PAD_CTRL_PMIC_INT, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_IE},
{REG_IOMUX_CHIP_SLEEP, BIT_FUNC_SEL(0)},//CHIP_SLEEP
{REG_PG6_PAD_CTRL_CHIP_SLEEP, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
-{REG_IOMUX_UART0_TXD, BIT_FUNC_SEL(0)},//UART0_TXD
-{REG_PG6_PAD_CTRL_UART0_TXD, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_UART0_RXD, BIT_FUNC_SEL(0)},//UART0_RXD
-{REG_PG6_PAD_CTRL_UART0_RXD, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
-{REG_IOMUX_UART0_CTS, BIT_FUNC_SEL(0)},//UART0_CTS
-{REG_PG6_PAD_CTRL_UART0_CTS, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_UART0_RTS, BIT_FUNC_SEL(0)},//UART0_RTS
-{REG_PG6_PAD_CTRL_UART0_RTS, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
+{REG_IOMUX_UART0_TXD, BIT_FUNC_SEL(4)},//MOT_EN_FWD_GPO
+{REG_PG6_PAD_CTRL_UART0_TXD, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_UART0_RXD, BIT_FUNC_SEL(4)},//STATUS_GPO9
+{REG_PG6_PAD_CTRL_UART0_RXD, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_UART0_CTS, BIT_FUNC_SEL(1)},//G_EINT_INT6_GPO1
+{REG_PG6_PAD_CTRL_UART0_CTS, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_UART0_RTS, BIT_FUNC_SEL(4)},//GPO11_INT7_TPQ2
+{REG_PG6_PAD_CTRL_UART0_RTS, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
{REG_IOMUX_EIU_INT0, BIT_FUNC_SEL(0)},//U_BOOT_KEY_KEYIN
{REG_PG6_PAD_CTRL_EIU_INT0, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
-{REG_IOMUX_EIU_INT3, BIT_FUNC_SEL(0)},//SIM0_DET
-{REG_PG6_PAD_CTRL_EIU_INT3, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_EIU_INT3, BIT_FUNC_SEL(4)},//CODEC_VDD_EN_GPO13
+{REG_PG6_PAD_CTRL_EIU_INT3, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
{REG_IOMUX_EIU_INT2, BIT_FUNC_SEL(0)},//USB_VBUS_INT
{REG_PG6_PAD_CTRL_EIU_INT2, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_PX|BIT_PAD_SLP_IE},
/* Group7 */
{REG_IOMUX_CAM_SPI_D0, BIT_FUNC_SEL(0)},//CAM_SI0
{REG_PG7_PAD_CTRL_CAM_SPI_D0, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
{REG_IOMUX_GPIO0, BIT_FUNC_SEL(0)},//CAM_PWDN
-{REG_PG7_PAD_CTRL_GPIO0, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_PG7_PAD_CTRL_GPIO0, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
{REG_IOMUX_CAM_SPI_CLK, BIT_FUNC_SEL(0)},//CAM_SCK
{REG_PG7_PAD_CTRL_CAM_SPI_CLK, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_GPIO1, BIT_FUNC_SEL(0)},//KEYIN
-{REG_PG7_PAD_CTRL_GPIO1, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_GPIO1, BIT_FUNC_SEL(0)},//CAM_RST0
+{REG_PG7_PAD_CTRL_GPIO1, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
{REG_IOMUX_CAM_SPI_D1, BIT_FUNC_SEL(0)},//CAM_SI1
{REG_PG7_PAD_CTRL_CAM_SPI_D1, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
/* Group8 */
{REG_IOMUX_SIM_DAT, BIT_FUNC_SEL(0)},//SIM0_DAT
{REG_PG9_PAD_CTRL_SIM_DAT, BIT_PAD_DRV(1)|BIT_PAD_SSPU|BIT_PAD_SLP_CP|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
/* Group10 */
-{REG_IOMUX_CAN_TXD, BIT_FUNC_SEL(4)},//SIM1_RST
-{REG_PG10_PAD_CTRL_CAN_TXD, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_CP|BIT_PAD_SLP_PX|BIT_PAD_SLP_CH},
-{REG_IOMUX_CAN_RXD, BIT_FUNC_SEL(4)},//SIM1_DAT
-{REG_PG10_PAD_CTRL_CAN_RXD, BIT_PAD_DRV(1)|BIT_PAD_SSPU|BIT_PAD_SLP_CP|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_CAN_STBY, BIT_FUNC_SEL(4)},//SIM1_CLK
-{REG_PG10_PAD_CTRL_CAN_STBY, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_CP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_CAN_TXD, BIT_FUNC_SEL(6)},//LED1_GPIO30
+{REG_PG10_PAD_CTRL_CAN_TXD, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_CAN_RXD, BIT_FUNC_SEL(6)},//LED2_GPIO32
+{REG_PG10_PAD_CTRL_CAN_RXD, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_CAN_STBY, BIT_FUNC_SEL(6)},//LED0_GPIO25
+{REG_PG10_PAD_CTRL_CAN_STBY, BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
/* Group11 */
-{REG_IOMUX_SPI_LCD_SDI, BIT_FUNC_SEL(6)},//GPIO2
+{REG_IOMUX_SPI_LCD_SDI, BIT_FUNC_SEL(6)},//NC
{REG_PG11_PAD_CTRL_SPI_LCD_SDI, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_SPI_LCD_SDO, BIT_FUNC_SEL(0)},//SPI_LCD_SIO
+{REG_IOMUX_SPI_LCD_SDO, BIT_FUNC_SEL(5)},//SPI_D0
{REG_PG11_PAD_CTRL_SPI_LCD_SDO, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_SPI_LCD_DCX, BIT_FUNC_SEL(0)},//SPI_LCD_SDC
+{REG_IOMUX_SPI_LCD_DCX, BIT_FUNC_SEL(5)},//SPI_D1
{REG_PG11_PAD_CTRL_SPI_LCD_DCX, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_SPI_LCD_CS, BIT_FUNC_SEL(0)},//SPI_LCD_CS
-{REG_PG11_PAD_CTRL_SPI_LCD_CS, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_SPI_LCD_CLK, BIT_FUNC_SEL(0)},//SPI_LCD_CLK
+{REG_IOMUX_SPI_LCD_CS, BIT_FUNC_SEL(5)},//SPI_D2
+{REG_PG11_PAD_CTRL_SPI_LCD_CS, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
+{REG_IOMUX_SPI_LCD_CLK, BIT_FUNC_SEL(5)},//SPI_CLK
{REG_PG11_PAD_CTRL_SPI_LCD_CLK, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_LCD_FMARK, BIT_FUNC_SEL(0)},//LCD_FMARK
-{REG_PG11_PAD_CTRL_LCD_FMARK, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_LCD_RSTN, BIT_FUNC_SEL(3)},//WAKEOUT(default GPIO)/LCD_RSTN
-{REG_PG11_PAD_CTRL_LCD_RSTN, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_LCD_FMARK, BIT_FUNC_SEL(5)},//SPI_D3
+{REG_PG11_PAD_CTRL_LCD_FMARK, BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
+{REG_IOMUX_LCD_RSTN, BIT_FUNC_SEL(5)},//SPI_CS
+{REG_PG11_PAD_CTRL_LCD_RSTN, BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_PX|BIT_PAD_SLP_CH},
};
dig_pin_cfg_t g_dig_pinlist0[] = {
{GP202_IIC_CLK, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPU},
{GP202_IO_MUX_IIC_DAT, BIT_FUNC_SEL(0)},//pmic IIC SDA
{GP202_IIC_DAT, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPU},
-{GP202_IO_MUX_GPIO0, BIT_FUNC_SEL(2)},//ADC0
-{GP202_GPIO0, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_PX},
-{GP202_IO_MUX_GPIO1, BIT_FUNC_SEL(2)},//ADC1
+{GP202_IO_MUX_GPIO0, BIT_FUNC_SEL(0)},//KEY1
+{GP202_GPIO0, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPU},
+{GP202_IO_MUX_GPIO1, BIT_FUNC_SEL(0)},//PIN96_TPQ0
{GP202_GPIO1, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_PX},
-{GP202_IO_MUX_GPIO2, BIT_FUNC_SEL(1)},//RTC_IN
-{GP202_GPIO2, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_PX},
-{GP202_IO_MUX_GPIO3, BIT_FUNC_SEL(0)},//KEYIN
+{GP202_IO_MUX_GPIO2, BIT_FUNC_SEL(0)},//NC
+{GP202_GPIO2, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPD},
+{GP202_IO_MUX_GPIO3, BIT_FUNC_SEL(0)},//KEY2
{GP202_GPIO3, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPU},
{GP202_IO_MUX_GPIO4, BIT_FUNC_SEL(0)},//NC
{GP202_GPIO4, BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPD},