重构语音TTS播放框架,修复gps定位成功后系统异常复位问题 zsxfly20250307

This commit is contained in:
zsx 2025-03-07 16:30:36 +08:00
parent a603926c44
commit 96f140a6f3
8 changed files with 399 additions and 133 deletions

View File

@ -14,12 +14,19 @@
#include "gps_config.h"
#include "local_tts.h"
#if 0
#include "app_uart.h"
#define DEBUG(fmt, args...) app_printf("[GPS]" fmt, ##args)
#else
#include "app_uart.h"
#define DEBUG(fmt, ...)
#endif
#define GPS_URAT CM_UART_DEV_1
#define GPS_RX_IOMUX UART1_RX_IOMUX
#define GPS_TX_IOMUX UART1_TX_IOMUX
#define GPS_BUF_LEN 1024
#define GPS_BUF_LEN 512
static int gps_rev_len = 0;
static char gps_rev_data[GPS_BUF_LEN] = {0};
@ -45,7 +52,7 @@ void trace(const char *str, int str_size){
*/
void error(const char *str, int str_size){
// app_printf("\r\nError: ");
// cm_uart_write(CM_UART_DEV_0, (void*)str, str_size, 1000);
// uart0_send_msg((uint8_t*)str, str_size, 0);
}
/**
@ -80,16 +87,15 @@ static void gps_TaskHandle(void *param){
if(gps_uart_sem != NULL){
osSemaphoreAcquire(gps_uart_sem, osWaitForever);//阻塞
}
temp_len = cm_uart_read(GPS_URAT, (void*)&gps_rev_data[gps_rev_len], GPS_BUF_LEN, 1000);
temp_len = cm_uart_read(GPS_URAT, (void*)&gps_rev_data[gps_rev_len], GPS_BUF_LEN - gps_rev_len, 1000);
gps_rev_len += temp_len;
if(gps_rev_len > 480){
if(gps_rev_len > 370){
nmea_parse(&parser, gps_rev_data, gps_rev_len, &gps_data.info);
nmea_info2pos(&gps_data.info, &gps_data.dpos);
gps_data.flow_num++;
// app_printf(
// "[GPS]:%03d,Lat:%.02f,Lon:%.02f,Sig:%d,Fix:%d,RL=%d\n",
// it++, gps_data.info.lat, gps_data.info.lon, gps_data.info.sig, gps_data.info.fix, gps_rev_len
// );
DEBUG("%03d,Lat:%.02f,Lon:%.02f,Sig:%d,Fix:%d,RL=%d\n",
it++, gps_data.info.lat, gps_data.info.lon, gps_data.info.sig, gps_data.info.fix, gps_rev_len
);
if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用
gps_flag =0;
@ -127,6 +133,7 @@ static void gps_uart_event_callback(void *param, uint32_t type){
if (CM_UART_EVENT_TYPE_RX_OVERFLOW & type){
/* 收到溢出事件,触发其他线程处理溢出事件 */
osSemaphoreRelease(gps_uart_sem);
// msg.msg_type = type;
// if (uart_event_queue != NULL){//向队列发送数据
@ -193,9 +200,9 @@ void gps_config_close(void){
cm_uart_dev_e dev = GPS_URAT;
if(0 == cm_uart_close(dev)){
app_printf("uart%d close is ok\n", dev);
DEBUG("uart%d close is ok\n", dev);
}else{
app_printf("uart%d close is error\n", dev);
DEBUG("uart%d close is error\n", dev);
}
}

View File

@ -67,6 +67,7 @@ int32_t get_voltage(adc_chx_t chx){
return 0;
}
// cm_gpio_set_level(CM_GPIO_NUM_20, 1); //恢复默认状态
DEBUG("CH%d voltage:%d\n",chx ,voltage);
return voltage;
}
@ -76,6 +77,7 @@ uint32_t ACC_Dmax =(((ACC_OUT_Voltage_MAX*ACC_OUT_RES_DOWN)/(ACC_OUT_RES_UP+ACC_
// 获取输入油门百分比unit:%)(踏板信号)
uint16_t get_in_acc_percent(void){
uint16_t acc_voltage =get_voltage(ADC_acc);
DEBUG("acc_voltage:%d\n",acc_voltage);
if(acc_voltage < 900){
return 0;
}else if(acc_voltage > 3800){
@ -93,6 +95,18 @@ void set_out_acc_percent(uint8_t percent){//1000000设置频率为10KHz
}
}
// // 设置输出油门大小
// void set_out_acc_percent(uint8_t percent){//1000000设置频率为10KHz
// static uint32_t last_period_h = 0;
// uint32_t period_h = (ACC_Dmin+((ACC_Dmax-ACC_Dmin)*(percent))/100);
// if(last_period_h != period_h){
// last_period_h = period_h;
// if(0 != cm_pwm_open_ns(CM_PWM_DEV_0,ACC_OUT_PERIOD_US,period_h){
// DEBUG("pwm0 open error\n");
// }
// }
// }
const uint16_t coulomp_voltage_table[11] = {
BAT_LEVEL_0PERCENT_VOLT,
BAT_LEVEL_10PERCENT_VOLT,
@ -149,6 +163,7 @@ void control_out_task(void *argument){
while(1){
uint16_t in_acc_percent= get_in_acc_percent();
// DEBUG("in_acc_percent:%d\n\n",in_acc_percent);
if(BAT_Message.Runing_Time < 0xFFFF){
BAT_Message.Runing_Time++;
@ -162,7 +177,7 @@ void control_out_task(void *argument){
Voltage_update_count=0;
temp_bat_voltage = 0;
}
in_acc_percent =80;
// in_acc_percent =80;
if(in_acc_percent >= 80){ // 油门大于80%时,
if(BAT_Message.Deep_ACC_Time < 0xFFFF){
BAT_Message.Deep_ACC_Time++;
@ -249,24 +264,24 @@ void control_out_task(void *argument){
if((0 == sys_sta.MAG_MODE)||(0 == sys_sta.PLT_MODE)){ // 管理模式
DEBUG("\n\nMAG_MODE\r\n\n");
// local_tts_set(5, 7, CM_LOCAL_TTS_DIGIT_AUTO);
local_tts_text_play("管理员模式",0,0);
local_tts_text_play("管理员模式",0,1);
}else{ // 退出管理员模式
DEBUG("\n\nPLT_MODE\r\n\n");
// local_tts_set(10, 7, CM_LOCAL_TTS_DIGIT_AUTO);
local_tts_text_play("退出管理员模式",0,0);
local_tts_text_play("退出管理员模式",0,1);
}
}
if((sys_sta.IO_RX_back == 0)&&((1 == sys_sta.O_door_lock) || (0 == sys_sta.MAG_MODE ))){ // 倒车模式
back_timecount++;
// DEBUG("back_timecount:%d\r\n\n",back_timecount);
if(back_timecount > _out_UPDETE_TIME*10){ // 3秒播报倒车提示语一次
back_timecount = 0;
DEBUG("\n\n>>>>>>>>>>>>back time play.......... \r\n\n");
// local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
local_tts_text_play("请注意倒车!",0,1); // 忙时自动取消倒车提示语
}
}
// if((sys_sta.IO_RX_back == 0)&&((1 == sys_sta.O_door_lock) || (0 == sys_sta.MAG_MODE ))){ // 倒车模式
// back_timecount++;
// // DEBUG("back_timecount:%d\r\n\n",back_timecount);
// if(back_timecount > _out_UPDETE_TIME*10){ // 3秒播报倒车提示语一次
// back_timecount = 0;
// DEBUG("\n\n>>>>>>>>>>>>back time play.......... \r\n\n");
// // local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
// local_tts_text_play("请注意倒车!",0,0); // 忙时自动取消倒车提示语
// }
// }
//油门控制
if((1 == sys_sta.O_door_lock) || (0 == sys_sta.MAG_MODE )){
@ -282,7 +297,8 @@ void control_out_task(void *argument){
acc_percent = (in_acc_percent * SYS_CONF_MANAGER_ACC) / 100.0;
}
set_out_acc_percent(acc_percent);
// DEBUG("acc_percent:%d\r\n",acc_percent);
DEBUG("in_acc_percent:%d ,acc_percent:%d \r\n",in_acc_percent, acc_percent);
DEBUG("SYS_CONF_SPEED_CUT_ACC:%d,SYS_CONF_TOURIST_ACC:%d,SYS_CONF_MANAGER_ACC:%d\r\n",SYS_CONF_SPEED_CUT_ACC,SYS_CONF_TOURIST_ACC,SYS_CONF_MANAGER_ACC);
}else{
cm_gpio_set_level(OUT_Door_lock, 0); // 关闭电门锁
set_out_acc_percent(0);

View File

@ -152,12 +152,13 @@ void my_appimg_enter(char *param){
DEBUG("heap total:%d,remain:%d\n",stats.total_size,stats.free);
}
local_tts_init();
// local_tts_mute(0);// 取消静音
local_tts_mute(0);// 取消静音
local_tts_volume(50); // 设置音量为55
// local_tts_set(7, 7, CM_LOCAL_TTS_DIGIT_AUTO);
local_tts_text_play("设备已开机",0,0);
local_tts_text_play("已开机",0,0);
control_out_init();
jt808_set_term_param_init();
// /*
if( 0 ){
while(1){
@ -193,7 +194,7 @@ void my_appimg_enter(char *param){
// local_tts_text_play("轻盈步伐,让流逝的永远流逝,让脚下的路延伸到尽头,依一素颜,走自己该走的路..…",0,0);
// osDelay(25000/5);
local_tts_volume(5);
local_tts_volume(15);
// local_tts_set(2, 2, CM_LOCAL_TTS_DIGIT_AUTO);
cm_gpio_set_level(CM_GPIO_NUM_0, 1);
local_tts_text_play("测试0",0 ,1);
@ -236,16 +237,15 @@ void my_appimg_enter(char *param){
local_tts_volume(100);
// local_tts_set(6, 0, CM_LOCAL_TTS_DIGIT_AUTO);
cm_gpio_set_level(CM_GPIO_NUM_0, 1);
local_tts_text_play("测试16",0 ,1);
local_tts_text_play("测试17",0 ,1); // 不可打断
local_tts_text_play("测试18",0 ,1);
local_tts_text_play("测试16",0 ,0);
local_tts_text_play("测试17",0 ,0); // 不可打断
local_tts_text_play("测试18",0 ,0);
cm_gpio_set_level(CM_GPIO_NUM_0, 0);
local_tts_text_play("测试19",0 ,0);
osDelay(5000/5);
}
}
// */
jt808_set_term_param_init();
jt808_init();
tcp_client_init();
gps_config_init();

View File

@ -393,6 +393,64 @@ void jt808_Autoreport_param_stop(void){
void jt808_set_term_param_init(void){
memset(&jt808_term_param_item,0,sizeof(Term_Param_item_t));
do{ // 终端属性参数初始化
jt808_term_param_item.big_term_attr_resp.term_type = Swap16(0); // 终端类型
memcpy(jt808_term_param_item.big_term_attr_resp.manufacturer_id, "LAT01", 5); // 制造商ID
memcpy(jt808_term_param_item.big_term_attr_resp.term_model, jt808_term_param_item.big_reg_info.term_model, 20); // 终端型号
memcpy(jt808_term_param_item.big_term_attr_resp.term_id, jt808_term_param_item.big_reg_info.term_id, 7); // 终端ID
memcpy(jt808_term_param_item.big_term_attr_resp.term_ICCID+4, jt808_term_param_item.phone_BCDnum, 6); // 终端手机号码
char str_hw_ver[] = "1.0.0"; // 硬件版本
char str_fw_ver[] = "1.0.0"; // 固件版本
jt808_term_param_item.big_term_attr_resp.hw_ver_len = strlen(str_hw_ver); // 硬件版本长度
jt808_term_param_item.big_term_attr_resp.fw_ver_len = strlen(str_fw_ver); // 固件版本长度
memcpy(jt808_term_param_item.big_term_attr_resp.str_hw_ver, str_hw_ver, strlen(str_hw_ver)); // 硬件版本
memcpy(jt808_term_param_item.big_term_attr_resp.str_fw_ver, str_fw_ver, strlen(str_fw_ver)); // 固件版本
jt808_term_param_item.big_term_attr_resp.GnssModule_attr = 0x03; // GNSS模块属性
jt808_term_param_item.big_term_attr_resp.CommModule_attr = 0x01; // 通信模块属性
}while(0);
do{// 授权信息初始化
char str_auth[]="auth code error..."; // 授权码
jt808_term_param_item.big_auth_info.str_auth_code = jt808_malloc(strlen(str_auth)+1); // 授权码
if(jt808_term_param_item.big_auth_info.str_auth_code == NULL){
JT808_DEBUG("malloc auth_code failed\r\n");
}
memcpy(jt808_term_param_item.big_auth_info.str_auth_code, str_auth, strlen(str_auth)+1); // 授权码
JT808_DEBUG("auth_code:%d,%s\r\n",strlen(jt808_term_param_item.big_auth_info.str_auth_code), jt808_term_param_item.big_auth_info.str_auth_code);
// jt808_free(jt808_term_param_item.big_auth_info.str_auth_code);
// jt808_term_param_item.big_auth_info.str_auth_code = NULL;
}while(0);
do{// 终端参数初始化
jt808_term_param_item.set_term_param.HeartBeatInterval = 30; // 心跳包间隔(秒)
// char ServerAddr[] ="47.99.118.34"; // 测试服务器地址
// uint32_t ServerPort = 5000; // 服务器端口
char ServerAddr[] ="106.14.30.23"; // 生产服务器地址
uint32_t ServerPort = 5000; // 服务器端口
// memset(jt808_term_param_item.set_term_param.MainServerAddr, 0, 50);
memcpy(jt808_term_param_item.set_term_param.MainServerAddr, ServerAddr, strlen(ServerAddr)+1); // 主服务器地址
jt808_term_param_item.set_term_param.ServerPort = ServerPort; // 服务器端口
jt808_term_param_item.set_term_param.DefaultTimeReportInterval = 60; // 默认时间上报间隔(秒)
jt808_term_param_item.set_term_param.InflexionAngle = 0; // 俯仰角(度)
jt808_term_param_item.set_term_param.MaxSpeed = 0; // 最大速度(km/h)
jt808_term_param_item.set_term_param.ProvinceID = 0; // 省域ID
jt808_term_param_item.set_term_param.CityID = 0; // 市域ID
jt808_term_param_item.set_term_param.CarPlateNum[0] = 0; // 车牌号码
jt808_term_param_item.set_term_param.CarPlateColor = 0; // 车牌颜色
jt808_term_param_item.set_term_param.RadarEN =1; // 雷达使能位, 0 代表关闭, 1 代表开启
jt808_term_param_item.set_term_param.ManagerACC =100; // 管理员模式油门0~100%
jt808_term_param_item.set_term_param.TouristACC =50; // 游客模式油门0~100%
jt808_term_param_item.set_term_param.SpeedCutACC =20; // 自动减速油门0~100%
jt808_term_param_item.set_term_param.BrakeLimit =1200; //前进刹车距离
jt808_term_param_item.set_term_param.SpeedCutLimit =2000; // 前进自动减速刹车距离
jt808_term_param_item.set_term_param.BrakeLimit_B =1200; // 后退刹车距离
jt808_term_param_item.set_term_param.SpeedCutLimit_B =2000; // 后退自动减速刹车距离
}while(0);
do{// 位置信息上报初始化
memset(&jt808_term_param_item.big_loc_report.basic_info,0,sizeof(Loc_basic_info_t));
jt808_term_param_item.big_loc_report.basic_info.status.val32 = 0; // 状态信息
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.val32 = 0; // 报警标志
}while(0);
do{ // 设置终端手机号
char cm_iccid[32] = {0};
char get_iccid_ok = 0;
@ -454,55 +512,6 @@ void jt808_set_term_param_init(void){
char CarPlateNum[] ="京A12345"; // 车牌号码
memcpy(jt808_term_param_item.big_reg_info.car_plate_num, CarPlateNum, strlen(CarPlateNum)); // 车牌号码
}while(0);
do{ // 终端属性参数初始化
jt808_term_param_item.big_term_attr_resp.term_type = Swap16(0); // 终端类型
memcpy(jt808_term_param_item.big_term_attr_resp.manufacturer_id, "LAT01", 5); // 制造商ID
memcpy(jt808_term_param_item.big_term_attr_resp.term_model, jt808_term_param_item.big_reg_info.term_model, 20); // 终端型号
memcpy(jt808_term_param_item.big_term_attr_resp.term_id, jt808_term_param_item.big_reg_info.term_id, 7); // 终端ID
memcpy(jt808_term_param_item.big_term_attr_resp.term_ICCID+4, jt808_term_param_item.phone_BCDnum, 6); // 终端手机号码
char str_hw_ver[] = "1.0.0"; // 硬件版本
char str_fw_ver[] = "1.0.0"; // 固件版本
jt808_term_param_item.big_term_attr_resp.hw_ver_len = strlen(str_hw_ver); // 硬件版本长度
jt808_term_param_item.big_term_attr_resp.fw_ver_len = strlen(str_fw_ver); // 固件版本长度
memcpy(jt808_term_param_item.big_term_attr_resp.str_hw_ver, str_hw_ver, strlen(str_hw_ver)); // 硬件版本
memcpy(jt808_term_param_item.big_term_attr_resp.str_fw_ver, str_fw_ver, strlen(str_fw_ver)); // 固件版本
jt808_term_param_item.big_term_attr_resp.GnssModule_attr = 0x03; // GNSS模块属性
jt808_term_param_item.big_term_attr_resp.CommModule_attr = 0x01; // 通信模块属性
}while(0);
do{// 授权信息初始化
char str_auth[]="auth code error..."; // 授权码
jt808_term_param_item.big_auth_info.str_auth_code = jt808_malloc(strlen(str_auth)+1); // 授权码
if(jt808_term_param_item.big_auth_info.str_auth_code == NULL){
JT808_DEBUG("malloc auth_code failed\r\n");
}
memcpy(jt808_term_param_item.big_auth_info.str_auth_code, str_auth, strlen(str_auth)+1); // 授权码
JT808_DEBUG("auth_code:%d,%s\r\n",strlen(jt808_term_param_item.big_auth_info.str_auth_code), jt808_term_param_item.big_auth_info.str_auth_code);
// jt808_free(jt808_term_param_item.big_auth_info.str_auth_code);
// jt808_term_param_item.big_auth_info.str_auth_code = NULL;
}while(0);
do{// 终端参数初始化
jt808_term_param_item.set_term_param.HeartBeatInterval = 30; // 心跳包间隔(秒)
// char ServerAddr[] ="47.99.118.34"; // 测试服务器地址
// uint32_t ServerPort = 5000; // 服务器端口
char ServerAddr[] ="106.14.30.23"; // 生产服务器地址
uint32_t ServerPort = 5000; // 服务器端口
// memset(jt808_term_param_item.set_term_param.MainServerAddr, 0, 50);
memcpy(jt808_term_param_item.set_term_param.MainServerAddr, ServerAddr, strlen(ServerAddr)+1); // 主服务器地址
jt808_term_param_item.set_term_param.ServerPort = ServerPort; // 服务器端口
jt808_term_param_item.set_term_param.DefaultTimeReportInterval = 60; // 默认时间上报间隔(秒)
jt808_term_param_item.set_term_param.InflexionAngle = 0; // 俯仰角(度)
jt808_term_param_item.set_term_param.MaxSpeed = 0; // 最大速度(km/h)
jt808_term_param_item.set_term_param.ProvinceID = 0; // 省域ID
jt808_term_param_item.set_term_param.CityID = 0; // 市域ID
jt808_term_param_item.set_term_param.CarPlateNum[0] = 0; // 车牌号码
jt808_term_param_item.set_term_param.CarPlateColor = 0; // 车牌颜色
}while(0);
do{// 位置信息上报初始化
memset(&jt808_term_param_item.big_loc_report.basic_info,0,sizeof(Loc_basic_info_t));
jt808_term_param_item.big_loc_report.basic_info.status.val32 = 0; // 状态信息
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.val32 = 0; // 报警标志
}while(0);
PrsResult.term_param_item =&jt808_term_param_item;// 全局变量指针指向终端参数项
// JT808_DEBUG("auth_code:%s\r\n",PrsResult.term_param_item->big_auth_info.str_auth_code);

View File

@ -23,8 +23,10 @@
static osMessageQueueId_t local_tts_play_queue = NULL;
// static osMessageQueueId_t local_tts_free_sem_queue = NULL;
static osSemaphoreId_t local_tts_play_start_sem = NULL;
static osSemaphoreId_t local_tts_play_ok_sem = NULL;
static osSemaphoreId_t local_tts_play_stat_sem = NULL;
static osSemaphoreId_t local_tts_play_end_sem = NULL;
// static osSemaphoreId_t local_tts_play_stat_sem = NULL;
// static int32_t TTS_play_finish_flag = 0; //播放完成标志位 0-完成 !=0-未完成
typedef struct{
@ -89,13 +91,13 @@ void local_tts_set(int32_t speed, int32_t volume, cm_local_tts_digit_e mode){
// len=0时自动计算长度//interruptible =1时,表示允许被打断播放
int8_t local_tts_text_play(char *text, uint8_t len, uint8_t en_interruptible){
// return 0;
DEBUG("tts text:%s,len:%d,en_interruptible:%d \n", text, len, en_interruptible);
// DEBUG("tts text:%s,len:%d,en_interruptible:%d \n", text, len, en_interruptible);
tts_play_queue_t tts_play_queue = {0};
local_tts_mute(0); // 取消静音
if(0 == len || len > strlen(text)){
len = strlen(text);
DEBUG("tts text: len > len:%d \n", len);
// DEBUG("tts text: len > len:%d \n", len);
}
tts_play_queue.text = cm_malloc(len + 1);
if(tts_play_queue.text == NULL){
@ -106,7 +108,7 @@ int8_t local_tts_text_play(char *text, uint8_t len, uint8_t en_interruptible){
tts_play_queue.text[len] = '\0';
tts_play_queue.len = len;
tts_play_queue.en_interruptible = en_interruptible;
DEBUG("tts text:Put queue\n");
// DEBUG("tts text:Put queue\n");
if(local_tts_play_queue == NULL){
DEBUG("local_tts_play_queue is null\n");
cm_free(tts_play_queue.text);
@ -121,31 +123,74 @@ int8_t local_tts_text_play(char *text, uint8_t len, uint8_t en_interruptible){
return 0;
}
/* 离线TTS回调函数 */
static void __local_tts_callback(cm_local_tts_event_e event, void *param)
{
// /* 离线TTS回调函数 */
// static void __local_tts_callback(cm_local_tts_event_e event, void *param)
// {
// switch(event){
// case CM_LOCAL_TTS_EVENT_SYNTH_DATA:{
// // cm_local_tts_synth_data_t *data = (cm_local_tts_synth_data_t *)param;
// // DEBUG("[%s] SYNTH_DATA [%d] \n", data->user, data->len); //打印log操作较费时
// break;
// }
// case CM_LOCAL_TTS_EVENT_SYNTH_FAIL:
// case CM_LOCAL_TTS_EVENT_SYNTH_INTERRUPT:
// case CM_LOCAL_TTS_EVENT_SYNTH_FINISH:
// break;
// case CM_LOCAL_TTS_EVENT_PLAY_FAIL:
// DEBUG("[%s] PLAY_FAIL\n", (char *)param);
// break;
// case CM_LOCAL_TTS_EVENT_PLAY_INTERRUPT:
// DEBUG("[[%s] PLAY_INTERRUPT\n", (char *)param);
// // break;
// case CM_LOCAL_TTS_EVENT_PLAY_FINISH:{
// DEBUG("[PLAY_FINISH] %p=%x \n\n", param, *((osSemaphoreId_t *)param));
// osSemaphoreRelease(local_tts_play_ok_sem); // 释放发送成功应答信号量
// osSemaphoreRelease(local_tts_play_stat_sem);
// break;
// }
// default:
// break;
// }
// }
#define TTS_FRAME_BUFFER_SIZE (320 * 50 * 10) // (320 * 50 * 10)支持存放10秒数据可修改
typedef enum{
TTS_STATE_IDLE = 0, /*!< TTS空闲 */
TTS_STATE_WORKING, /*!< TTS工作中 */
TTS_STATE_SUSPEND, /*!< TTS播放中断 */
}tts_state_t;
typedef struct {
osSemaphoreId_t SemHandle; /* TTS播放信号量句柄 */
uint8_t play_state; /* TTS播放状态 */
uint8_t TtsPcmBuf[TTS_FRAME_BUFFER_SIZE]; /* TTS转码后的数据 */
uint32_t TtsPcmBufLen; /* 当前TTS已完成转码的数据长度 */
}tts_play_cfg_t;
tts_play_cfg_t tts_play_cfg;
static void tts_play_callback(cm_local_tts_event_e event, void *param){
switch(event){
case CM_LOCAL_TTS_EVENT_SYNTH_DATA:{
// cm_local_tts_synth_data_t *data = (cm_local_tts_synth_data_t *)param;
// DEBUG("[%s] SYNTH_DATA [%d] \n", data->user, data->len); //打印log操作较费时
cm_local_tts_synth_data_t *synth_data = (cm_local_tts_synth_data_t *)param;
if (TTS_FRAME_BUFFER_SIZE > (tts_play_cfg.TtsPcmBufLen + synth_data->len)){
memcpy (tts_play_cfg.TtsPcmBuf + tts_play_cfg.TtsPcmBufLen, (uint8_t *)synth_data->data, synth_data->len);
tts_play_cfg.TtsPcmBufLen = tts_play_cfg.TtsPcmBufLen + synth_data->len;
}
// DEBUG("SYNTH_DATA [%d] \n", synth_data->len);
break;
}
case CM_LOCAL_TTS_EVENT_SYNTH_FAIL:
case CM_LOCAL_TTS_EVENT_SYNTH_INTERRUPT:
case CM_LOCAL_TTS_EVENT_SYNTH_FINISH:
break;
case CM_LOCAL_TTS_EVENT_PLAY_FAIL:
DEBUG("[%s] PLAY_FAIL\n", (char *)param);
break;
case CM_LOCAL_TTS_EVENT_PLAY_INTERRUPT:
DEBUG("[[%s] PLAY_INTERRUPT\n", (char *)param);
// break;
case CM_LOCAL_TTS_EVENT_PLAY_FINISH:{
DEBUG("[PLAY_FINISH] %p=%x \n\n", param, *((osSemaphoreId_t *)param));
osSemaphoreRelease(local_tts_play_ok_sem); // 释放发送成功应答信号量
osSemaphoreRelease(local_tts_play_stat_sem);
break;
}
case CM_LOCAL_TTS_EVENT_PLAY_FINISH:
default:
break;
}
@ -153,9 +198,11 @@ static void __local_tts_callback(cm_local_tts_event_e event, void *param)
// 异步播放,播放完成后播放下一条 //TODO: 待优化(暂时方案,打断播放)
static osThreadFunc_t local_tts_play_task(void *arg){
// cm_audio_sample_param_t frame = {.sample_format = CM_AUDIO_SAMPLE_FORMAT_16BIT, .rate = CM_AUDIO_SAMPLE_RATE_8000HZ, .num_channels = CM_AUDIO_SOUND_MONO};
tts_play_queue_t tts_play_queue;
osStatus_t ret=0;
DEBUG("local_tts_play_task start\n");
while(1){
if(osOK == osMessageQueueGet(local_tts_play_queue, &tts_play_queue, NULL, osWaitForever)){ //
@ -175,33 +222,209 @@ static osThreadFunc_t local_tts_play_task(void *arg){
DEBUG("tts task: text= null\n");
continue;
}
if(0 == cm_local_tts_play_status()){ // 正在播放中
cm_local_tts_play_stop();// 停止播放
ret =osSemaphoreAcquire(local_tts_play_stat_sem, 30000/5);// 等待播放结束
if(osOK != ret){
DEBUG("local_tts_play_stat_sem:%d\n", ret);
}
// ret = cm_audio_player_stream_open(CM_AUDIO_PLAY_FORMAT_PCM, &frame); //从pipe中播放音频开启
// if(ret != osOK){
// DEBUG("cm_audio_player_stream_open error\n");
// continue;
// }
// DEBUG("tts task: play %s\n\n", tts_play_queue.text);
if(TTS_STATE_IDLE != tts_play_cfg.play_state){
// DEBUG("tts task: wait end\n");
osSemaphoreRelease(local_tts_play_end_sem); // 释放播放结束信号量
osSemaphoreAcquire(local_tts_play_ok_sem,(300/5));
}
// DEBUG("tts task: 00000000000\n\n");
cm_local_tts_play(tts_play_queue.text, tts_play_queue.len, __local_tts_callback, NULL);
// DEBUG("tts task: 1111111111\n\n");
// if(0 == tts_play_queue.en_interruptible){ // 不允许被打断播放
// DEBUG("tts task: 2222222222\n\n");
ret =osSemaphoreAcquire(local_tts_play_ok_sem, (0 == tts_play_queue.en_interruptible)?(30000/5):(2000/5));// 等待播放结束
if(osOK != ret){
DEBUG("local_tts_play_ok_sem:%d\n", ret);
}
// }else{
// osSemaphoreAcquire(local_tts_play_ok_sem, 300/5);
tts_play_cfg.TtsPcmBufLen = 0;
// DEBUG("tts_synth_start\n\n========\n");
ret = cm_local_tts_synth(tts_play_queue.text, tts_play_queue.len, tts_play_callback, NULL);
// DEBUG("tts_synth_end\n\n========\n");
if(ret != osOK){
DEBUG("cm_local_tts_synth error:%d\n", ret);
// cm_free(tts_play_queue.text);
}
osSemaphoreRelease(local_tts_play_start_sem); // 释放播放信号量
ret =osSemaphoreAcquire(local_tts_play_ok_sem, (0 == tts_play_queue.en_interruptible)?(12000/5):(300/5));// 等待播放结束
if(osOK != ret){
// DEBUG("local_tts_play_ok_sem\n");
}
DEBUG("tts task: play end\n");
// if(0 == cm_local_tts_play_status()){ // 正在播放中
// cm_local_tts_play_stop();// 停止播放
// ret =osSemaphoreAcquire(local_tts_play_stat_sem, 30000/5);// 等待播放结束
// if(osOK != ret){
// DEBUG("local_tts_play_stat_sem:%d\n", ret);
// }
// }
// DEBUG("tts task: 3333333333\n\n");
// // DEBUG("tts task: 00000000000\n\n");
// cm_local_tts_play(tts_play_queue.text, tts_play_queue.len, __local_tts_callback, NULL);
// // DEBUG("tts task: 1111111111\n\n");
// // if(0 == tts_play_queue.en_interruptible){ // 不允许被打断播放
// // DEBUG("tts task: 2222222222\n\n");
// ret =osSemaphoreAcquire(local_tts_play_ok_sem, (0 == tts_play_queue.en_interruptible)?(30000/5):(2000/5));// 等待播放结束
// if(osOK != ret){
// DEBUG("local_tts_play_ok_sem:%d\n", ret);
// }
// // }else{
// // osSemaphoreAcquire(local_tts_play_ok_sem, 300/5);
// // }
// // DEBUG("tts task: 3333333333\n\n");
cm_free(tts_play_queue.text);
tts_play_queue.text = NULL;
osDelay(5/5);
}
}
return 0;
}
static osThreadFunc_t __local_tts_play_task(void *param){
cm_audio_sample_param_t frame = {.sample_format = CM_AUDIO_SAMPLE_FORMAT_16BIT, .rate = CM_AUDIO_SAMPLE_RATE_8000HZ, .num_channels = CM_AUDIO_SOUND_MONO};
int32_t index = 0;
// bool isError = false; // 播放过程中是否有错误
osStatus_t ret=0;
DEBUG("__local_tts_play_task :start\n");
while(1){
osSemaphoreAcquire(local_tts_play_start_sem, osWaitForever);
tts_play_cfg.play_state = TTS_STATE_WORKING; // 正在播放中
// DEBUG("_play_task :start\n");
ret = cm_audio_player_stream_open(CM_AUDIO_PLAY_FORMAT_PCM, &frame); //从pipe中播放音频开启
if(ret != osOK){
DEBUG("cm_audio_player_stream_open error\n");
continue;
}
// isError = false;
index = 0;
while(index < tts_play_cfg.TtsPcmBufLen){/* 转码速度大于播放速度,故无需考虑播放速度大于转码速度情况的延迟等待问题 */
// DEBUG("_play_task :len:%d, index: %d\n",tts_play_cfg.TtsPcmBufLen, index);
if(index + 3200 <= tts_play_cfg.TtsPcmBufLen){/* 每200ms传10帧PCM数据 */
if(0 != cm_audio_player_stream_push(tts_play_cfg.TtsPcmBuf + index, 3200)){
// isError = true;
}
index += 3200;
}else{
if(index >= tts_play_cfg.TtsPcmBufLen){ // 播放完成
break;
}else{
if(0 != cm_audio_player_stream_push(tts_play_cfg.TtsPcmBuf + index, (tts_play_cfg.TtsPcmBufLen - index))){
// isError = true;
}
index = tts_play_cfg.TtsPcmBufLen;
}
}
if(osSemaphoreAcquire(local_tts_play_end_sem, 0) == osOK){ // 等待播放结束
// DEBUG("_play_task :wait end\n");
break;
}
osDelay(40);
}
cm_audio_player_stream_close();
osSemaphoreRelease(local_tts_play_ok_sem); // 释放发送成功应答信号量
tts_play_cfg.play_state = TTS_STATE_IDLE; // 播放结束
// DEBUG("_play_task :end\n");
}
return 0;
}
/*
int32_t local_tts_play(const char *text, int32_t len){
//需要判断当前是否处于播放过程中,处于播放过程中报错
if (CM_LOCAL_TTS_STATE_WORKING == cm_tts_play_cfg.state)
{
DEBUG(" TTS busy\n");
return -1;
}
if (NULL == cm_tts_play_cfg.TtsPcmBuf)
{
cm_tts_play_cfg.TtsPcmBuf = cm_malloc(CM_TTS_FRAME_BUFFER_SIZE);
if (NULL == cm_tts_play_cfg.TtsPcmBuf)
{
DEBUG("__%d__ cm_malloc() error",__LINE__);
return -1;
}
}
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_WORKING;
cm_audio_sample_param_t frame = {.sample_format = CM_AUDIO_SAMPLE_FORMAT_16BIT, .rate = CM_AUDIO_SAMPLE_RATE_8000HZ, .num_channels = CM_AUDIO_SOUND_MONO};
int32_t ret = cm_audio_player_stream_open(CM_AUDIO_PLAY_FORMAT_PCM, &frame); //从pipe中播放音频开启
if (-1 == ret){
DEBUG("%s() __%d__ cm_audio_player_stream_open0() error, ret is %d", __func__, __LINE__, ret);
// cm_audio_player_stream_close();
// ret = cm_audio_player_stream_open(CM_AUDIO_PLAY_FORMAT_PCM, &frame); //从pipe中播放音频开启
// if (-1 == ret){
// DEBUG("__%d__ stream_open1() error, ret: %d", __LINE__, ret);
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
return -1;
// }
}
if (NULL == cm_tts_play_cfg.SemHandle)
{
cm_tts_play_cfg.SemHandle = osSemaphoreNew(1, 0, NULL);
if (NULL == cm_tts_play_cfg.SemHandle)
{
DEBUG("__%d__ osSemaphoreNew0() error",__LINE__);
cm_audio_player_stream_close();
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
return -1;
}
}
if (NULL == cm_tts_play_cfg.SemHandle_ack)
{
cm_tts_play_cfg.SemHandle_ack = osSemaphoreNew(1, 0, NULL);
if (NULL == cm_tts_play_cfg.SemHandle_ack)
{
DEBUG("__%d__ osSemaphoreNew1() error",__LINE__);
cm_audio_player_stream_close();
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
return -1;
}
}
// 创建线程资源
if (NULL == cm_tts_play_cfg.TaskHandle)
{
osThreadAttr_t tts_task_attr = {0};
tts_task_attr.name = "tts_play_task";
tts_task_attr.stack_size = 2048;
tts_task_attr.priority= osPriorityNormal;
cm_tts_play_cfg.TaskHandle = osThreadNew(__cm_tts_play_task, 0, &tts_task_attr);
if (NULL == cm_tts_play_cfg.TaskHandle)
{
DEBUG("__%d__ osThreadNew() error", __LINE__);
cm_audio_player_stream_close();
cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE;
return -1;
}
}
cm_tts_play_cfg.user_cb = cb;
cm_tts_play_cfg.user_cb_param = cb_param;
cm_tts_play_cfg.TtsPcmBufLen = 0;
// cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_WORKING;
// DEBUG("tts_synth_start\n\n========\n");
ret = cm_local_tts_synth(text, len, __cm_tts_play_callback, cb_param);
// DEBUG("tts_synth_end\n\n========\n");
if (0 == ret)
{
osSemaphoreRelease(cm_tts_play_cfg.SemHandle);
}
if(cm_tts_play_cfg.SemHandle_ack != NULL)
{
osSemaphoreAcquire(cm_tts_play_cfg.SemHandle_ack, 3000/5);
}
return ret;
}
*/
// 初始化
void local_tts_init(void){
cm_gpio_cfg_t cfg = {0};
@ -226,18 +449,30 @@ void local_tts_init(void){
DEBUG("local_tts_init error\n");
}
if(local_tts_play_queue == NULL){
local_tts_play_queue = osMessageQueueNew(50, sizeof(tts_play_queue_t), NULL);
local_tts_play_queue = osMessageQueueNew(13, sizeof(tts_play_queue_t), NULL);
}
if(local_tts_play_start_sem == NULL){
local_tts_play_start_sem = osSemaphoreNew(1, 0, NULL);
}
if(local_tts_play_ok_sem == NULL){
local_tts_play_ok_sem = osSemaphoreNew(1, 0, NULL);
}
if(local_tts_play_stat_sem == NULL){
local_tts_play_stat_sem = osSemaphoreNew(1, 0, NULL);
if(local_tts_play_end_sem == NULL){
local_tts_play_end_sem = osSemaphoreNew(1, 0, NULL);
}
// if(local_tts_play_stat_sem == NULL){
// local_tts_play_stat_sem = osSemaphoreNew(1, 0, NULL);
// }
memset(tts_play_cfg.TtsPcmBuf, 0, TTS_FRAME_BUFFER_SIZE);
tts_play_cfg.TtsPcmBufLen = 0;
osThreadAttr_t local_tts_play_thread_attr = {
.name = "local_tts_play_thread",
.stack_size = 4096*4,
.priority = osPriorityNormal
};
osThreadNew((osThreadFunc_t)local_tts_play_task, NULL, &local_tts_play_thread_attr);
osThreadNew((osThreadFunc_t)__local_tts_play_task, NULL, &local_tts_play_thread_attr);
}

View File

@ -51,6 +51,9 @@
#include "cm_mem.h"
#define name_malloc(size) malloc(size)
#define name_free(ptr) free(ptr)
// #include "cm_mem.h"
// #define name_malloc(size) cm_malloc(size)
// #define name_free(ptr) cm_free(ptr)
// #define name_realloc(ptr, size) cm_realloc(ptr, size)
#endif /* __NMEA_CONFIG_H__ */

View File

@ -216,7 +216,7 @@ TCP_DISABLE:
DEBUG("NetwarK connected!\r\n");
// local_tts_set(5, 15, CM_LOCAL_TTS_DIGIT_AUTO);
local_tts_text_play("网络已连接",0,0);
local_tts_text_play("欢迎使用莱昂特智能终端设备...。",0,0); // 0:表示自动计算字符串长度,10000表示最大等待时间
// local_tts_text_play("欢迎使用莱昂特智能终端设备...。",0,0); // 0:表示自动计算字符串长度,10000表示最大等待时间
osSemaphoreAcquire(netconn_disconnect_sem, osWaitForever); // 等待断开连接信号
jt808_Autoreport_param_stop();//停止自动上报参数设置
led_set_event(EVENT_NETWORK_DISCONNECT); // 网络断开连接

View File

@ -32,20 +32,16 @@ static cm_tts_play_cfg_t cm_tts_play_cfg = {NULL, NULL, NULL, CM_LOCAL_TTS_STATE
static void __cm_tts_play_callback(cm_local_tts_event_e event, void *param)
{
switch(event)
{
case CM_LOCAL_TTS_EVENT_SYNTH_DATA:
{
switch(event){
case CM_LOCAL_TTS_EVENT_SYNTH_DATA:{
cm_local_tts_synth_data_t *synth_data = (cm_local_tts_synth_data_t *)param;
if (CM_TTS_FRAME_BUFFER_SIZE > (cm_tts_play_cfg.TtsPcmBufLen + synth_data->len))
{
if (CM_TTS_FRAME_BUFFER_SIZE > (cm_tts_play_cfg.TtsPcmBufLen + synth_data->len)){
memcpy (cm_tts_play_cfg.TtsPcmBuf + cm_tts_play_cfg.TtsPcmBufLen, (uint8_t *)synth_data->data, synth_data->len);
cm_tts_play_cfg.TtsPcmBufLen = cm_tts_play_cfg.TtsPcmBufLen + synth_data->len;
}
if (cm_tts_play_cfg.user_cb)
{
if (cm_tts_play_cfg.user_cb){
cm_tts_play_cfg.user_cb(event, param);
}
DEBUG("SYNTH_DATA [%d] \n", synth_data->len);
@ -236,9 +232,9 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c
cm_tts_play_cfg.user_cb_param = cb_param;
cm_tts_play_cfg.TtsPcmBufLen = 0;
// cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_WORKING;
// DEBUG("tts_synth_start\n\n========\n");
DEBUG("tts_synth_start\n\n========\n");
ret = cm_local_tts_synth(text, len, __cm_tts_play_callback, cb_param);
// DEBUG("tts_synth_end\n\n========\n");
DEBUG("tts_synth_end\n\n========\n");
if (0 == ret)
{
osSemaphoreRelease(cm_tts_play_cfg.SemHandle);