diff --git a/custom/GPS/src/gps_config.c b/custom/GPS/src/gps_config.c index 28d1e23..b970d12 100644 --- a/custom/GPS/src/gps_config.c +++ b/custom/GPS/src/gps_config.c @@ -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); } } diff --git a/custom/control_out/src/control_out.c b/custom/control_out/src/control_out.c index a68e644..5dd555f 100644 --- a/custom/control_out/src/control_out.c +++ b/custom/control_out/src/control_out.c @@ -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); diff --git a/custom/custom_main/src/custom_main.c b/custom/custom_main/src/custom_main.c index 179bd63..961f016 100644 --- a/custom/custom_main/src/custom_main.c +++ b/custom/custom_main/src/custom_main.c @@ -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(); diff --git a/custom/jt808/src/jt808_set_TermParam.c b/custom/jt808/src/jt808_set_TermParam.c index 08fd33d..8e141b9 100644 --- a/custom/jt808/src/jt808_set_TermParam.c +++ b/custom/jt808/src/jt808_set_TermParam.c @@ -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); diff --git a/custom/local_tts/src/local_tts.c b/custom/local_tts/src/local_tts.c index e1ebe4a..60e8614 100644 --- a/custom/local_tts/src/local_tts.c +++ b/custom/local_tts/src/local_tts.c @@ -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); } diff --git a/custom/nmealib/inc/nmea/config.h b/custom/nmealib/inc/nmea/config.h index f3bf4b4..f2a6d63 100644 --- a/custom/nmealib/inc/nmea/config.h +++ b/custom/nmealib/inc/nmea/config.h @@ -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__ */ diff --git a/custom/tcp_client/src/tcp_client.c b/custom/tcp_client/src/tcp_client.c index 2a3b6e2..41d1703 100644 --- a/custom/tcp_client/src/tcp_client.c +++ b/custom/tcp_client/src/tcp_client.c @@ -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); // 网络断开连接 diff --git a/src/cm_lib/cm_tts_play/cm_tts_play.c b/src/cm_lib/cm_tts_play/cm_tts_play.c index e5f1251..1103cf6 100644 --- a/src/cm_lib/cm_tts_play/cm_tts_play.c +++ b/src/cm_lib/cm_tts_play/cm_tts_play.c @@ -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);