diff --git a/custom/GPS/src/gps_config.c b/custom/GPS/src/gps_config.c index 5aa856d..28d1e23 100644 --- a/custom/GPS/src/gps_config.c +++ b/custom/GPS/src/gps_config.c @@ -86,10 +86,10 @@ static void gps_TaskHandle(void *param){ 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 - ); + // 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 + // ); if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用 gps_flag =0; diff --git a/custom/control_out/inc/control_out.h b/custom/control_out/inc/control_out.h index f1a0261..062ef6e 100644 --- a/custom/control_out/inc/control_out.h +++ b/custom/control_out/inc/control_out.h @@ -3,12 +3,72 @@ #include "cm_os.h" #include "cm_gpio.h" +#define BAT_SxP1 4 // 电池四串一并 +#define BAT_VOLT(_Volt) (_Volt * BAT_SxP1) //电压单位转换 +#define BAT_Low_VOLT BAT_VOLT(105) //10.5V x 4 = 42V +#define BAT_Full_VOLT BAT_VOLT(144) //14.4V x 4 = 57.6V +// #define BAT_LEVEL_0PERCENT_VOLT BAT_VOLT(105) // 0%:(105~110]=(42.0V~44.0V] +// #define BAT_LEVEL_10PERCENT_VOLT BAT_VOLT(113) // 10%:(110~113]=(44.0V~45.2V] +// #define BAT_LEVEL_20PERCENT_VOLT BAT_VOLT(116) // 20%:(113~116]=(45.2V~46.4V] +// #define BAT_LEVEL_30PERCENT_VOLT BAT_VOLT(119) // 30%:(116~119]=(46.4V~47.6V] +// #define BAT_LEVEL_40PERCENT_VOLT BAT_VOLT(122) // 40%:(119~122]=(47.6V~48.8V] +// #define BAT_LEVEL_50PERCENT_VOLT BAT_VOLT(125) // 50%:(122~125]=(48.8V~50.0V] +// #define BAT_LEVEL_60PERCENT_VOLT BAT_VOLT(128) // 60%:(125~128]=(50.0V~51.2V] +// #define BAT_LEVEL_70PERCENT_VOLT BAT_VOLT(131) // 70%:(128~131]=(51.2V~52.4V] +// #define BAT_LEVEL_80PERCENT_VOLT BAT_VOLT(134) // 80%:(131~134]=(52.4V~53.6V] +// #define BAT_LEVEL_90PERCENT_VOLT BAT_VOLT(137) // 90%:(134~137]=(53.6V~54.8V] +// #define BAT_LEVEL_100PERCENT_VOLT BAT_VOLT(144) //100%:(137~144]=(54.8V~57.6V] + +// 内阻 20mΩ * 4 =80mΩ // 线损 10A 0.1V + +#define BAT_LEVEL_0PERCENT_VOLT BAT_VOLT(105) // 0% +#define BAT_LEVEL_10PERCENT_VOLT BAT_VOLT(107) // 10% +#define BAT_LEVEL_20PERCENT_VOLT BAT_VOLT(109) // 20% +#define BAT_LEVEL_30PERCENT_VOLT BAT_VOLT(111) // 30% +#define BAT_LEVEL_40PERCENT_VOLT BAT_VOLT(113) // 40% +#define BAT_LEVEL_50PERCENT_VOLT BAT_VOLT(115) // 50% +#define BAT_LEVEL_60PERCENT_VOLT BAT_VOLT(117) // 60% +#define BAT_LEVEL_70PERCENT_VOLT BAT_VOLT(119) // 70% +#define BAT_LEVEL_80PERCENT_VOLT BAT_VOLT(121) // 80% +#define BAT_LEVEL_90PERCENT_VOLT BAT_VOLT(123) // 90% +#define BAT_LEVEL_100PERCENT_VOLT BAT_VOLT(144) //100% + + +// 充电状态 +typedef enum { + Bat_Low_STA=(1<<0), + Bat_30_STA=(1<<1), + Bat_60_STA=(1<<2), + Bat_80_STA=(1<<3), + Bat_100_STA=(1<<4), + Bat_NotCharge_STA=(1<<5), + Bat_Charge_STA=(1<<6), +} BAT_STA_t; + + +typedef struct BAT_Message{ + uint8_t Bat_STA; + uint8_t Bat_Percent; // 42=42% + uint8_t Bat_Low_Volt_count; // 低压计数 + uint16_t Bat_Voltage; // 480=48.0V + uint16_t Runing_Time; // 系统运行时间 + uint16_t Deep_ACC_Time; // 深踩油门时间 +} BAT_Message_t; + +#if 0 #define ACC_RES_UP 10000 #define ACC_RES_DOWN 3300 #define VIN_RES_UP 240000 #define VIN_RES_DOWN 3300 +#else +#define ACC_RES_UP 47000 +#define ACC_RES_DOWN 20000 + +#define VIN_RES_UP 94000 +#define VIN_RES_DOWN 3300 +#endif // ACC 输出设置 #define ACC_OUT_RES_UP 5100 @@ -66,7 +126,7 @@ typedef struct{ } sys_sta_t; extern sys_sta_t sys_sta; - +extern BAT_Message_t BAT_Message; void control_out_init(void); diff --git a/custom/control_out/src/control_out.c b/custom/control_out/src/control_out.c index 14e477a..e88c5c9 100644 --- a/custom/control_out/src/control_out.c +++ b/custom/control_out/src/control_out.c @@ -37,12 +37,12 @@ SYS_CONF_t sys_conf ={ }; sys_sta_t sys_sta; - typedef enum { ADC_power = 0, ADC_acc = 1, }adc_chx_t; +// 获取电压值 unit:mV int32_t get_voltage(adc_chx_t chx){ int32_t voltage = 0; if(chx == ADC_acc){ @@ -93,16 +93,103 @@ void set_out_acc_percent(uint8_t percent){//1000000设置频率为10KHz } } +const uint16_t coulomp_voltage_table[11] = { + BAT_LEVEL_0PERCENT_VOLT, + BAT_LEVEL_10PERCENT_VOLT, + BAT_LEVEL_20PERCENT_VOLT, + BAT_LEVEL_30PERCENT_VOLT, + BAT_LEVEL_40PERCENT_VOLT, + BAT_LEVEL_50PERCENT_VOLT, + BAT_LEVEL_60PERCENT_VOLT, + BAT_LEVEL_70PERCENT_VOLT, + BAT_LEVEL_80PERCENT_VOLT, + BAT_LEVEL_90PERCENT_VOLT, + BAT_LEVEL_100PERCENT_VOLT, +}; + +uint8_t pmu_voltage_to_percent(uint32_t volt){//电压转百分比 + uint8_t i, percent; + float step, base; + if((volt < coulomp_voltage_table[0])){ + return 0; + } + if((volt >= coulomp_voltage_table[10])){ + return 100; + } + + for (i = 0; i < 10; i++) { + if((volt < coulomp_voltage_table[i+1]) && (volt >= coulomp_voltage_table[i])){ + step = (coulomp_voltage_table[i+1] - coulomp_voltage_table[i]) / 10.0; + base = coulomp_voltage_table[i]; + percent = (10 * i) + (volt - base) / step; + // DEBUG("\n\ni:%d,volt:%d,step:%02.2f,base:%02.2f,percent:%d\n\n",i,volt,step,base,percent); + return (uint8_t)percent; + } + } + return 0; +} #define _out_UPDETE_TIME 10 static uint32_t back_timecount = 0; static uint8_t door_lock_last_status = 0; static uint8_t S_MODE_last_status = 1; +BAT_Message_t BAT_Message; + +// 门锁状态更新标志 +bool GRB_Door_lock_updata=0; +uint16_t Voltage_lag_count; +uint16_t Voltage_update_count; +float temp_bat_voltage=0; void control_out_task(void *argument){ cm_gpio_level_e level = 0; while(1){ + + uint16_t in_acc_percent= get_in_acc_percent(); + + if(BAT_Message.Runing_Time < 0xFFFF){ + BAT_Message.Runing_Time++; + } + + temp_bat_voltage += get_voltage(ADC_power) / 100; + + Voltage_update_count++; + if(Voltage_update_count >= (1000/_out_UPDETE_TIME)){//1s + BAT_Message.Bat_Voltage = temp_bat_voltage / Voltage_update_count; + Voltage_update_count=0; + temp_bat_voltage = 0; + } + in_acc_percent =80; + if(in_acc_percent >= 80){ // 油门大于80%时, + if(BAT_Message.Deep_ACC_Time < 0xFFFF){ + BAT_Message.Deep_ACC_Time++; + } + Voltage_lag_count++; + if(Voltage_lag_count >= (2000/_out_UPDETE_TIME)){//2s + Voltage_lag_count=0; + BAT_Message.Bat_Percent = pmu_voltage_to_percent(BAT_Message.Bat_Voltage); + } + if(BAT_Message.Bat_Percent < 12){ + BAT_Message.Bat_Low_Volt_count++; + } + }else{ + Voltage_lag_count=0; + } + + if(BAT_Message.Bat_Percent < 7){ + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_Low_STA; + }else if(BAT_Message.Bat_Percent < 30){ // 7~30% + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_30_STA; + }else if(BAT_Message.Bat_Percent < 60){ // 30~60% + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_60_STA; + }else if(BAT_Message.Bat_Percent < 80){ // 60~80% + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_80_STA; + }else{ + BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_100_STA; + } + // DEBUG("Bat_Percent:%d,Bat_Voltage:%d,Bat_STA:%X\r\n",BAT_Message.Bat_Percent,BAT_Message.Bat_Voltage,BAT_Message.Bat_STA); + // DEBUG("ADC_acc:%dmV\r\n",get_voltage(ADC_acc)); // DEBUG("ADC_power:%dmV\r\n\n",get_voltage(ADC_power)); // 系统模式状态 @@ -184,12 +271,12 @@ void control_out_task(void *argument){ uint8_t acc_percent =0; if((1 == sys_sta.MAG_MODE)&&(1 == sys_sta.PLT_MODE )){ // 游客模式 if(sys_sta.A_Speed_Cut){ // 自动减速 - acc_percent = (get_in_acc_percent() * sys_conf.Speed_Cut_sLim) / 100.0; + acc_percent = (in_acc_percent * sys_conf.Speed_Cut_sLim) / 100.0; }else{ - acc_percent = (get_in_acc_percent() * sys_conf.Tourist_sLim) / 100.0; + acc_percent = (in_acc_percent * sys_conf.Tourist_sLim) / 100.0; } }else{ // 管理员模式 - acc_percent = (get_in_acc_percent() * sys_conf.Manager_sLim) / 100.0; + acc_percent = (in_acc_percent * sys_conf.Manager_sLim) / 100.0; } set_out_acc_percent(acc_percent); // DEBUG("acc_percent:%d\r\n",acc_percent); diff --git a/custom/custom.mk b/custom/custom.mk index 1bbc31a..8bc38d0 100644 --- a/custom/custom.mk +++ b/custom/custom.mk @@ -10,5 +10,5 @@ include $(CUSTOM_DIR)/jt808/jt808.mk include $(CUSTOM_DIR)/tcp_client/tcp_client.mk include $(CUSTOM_DIR)/control_out/control_out.mk include $(CUSTOM_DIR)/local_tts/local_tts.mk -# include $(CUSTOM_DIR)/radar/radar.mk +include $(CUSTOM_DIR)/radar/radar.mk endif \ No newline at end of file diff --git a/custom/custom_main/src/app_uart.c b/custom/custom_main/src/app_uart.c index 876358c..1caf76b 100644 --- a/custom/custom_main/src/app_uart.c +++ b/custom/custom_main/src/app_uart.c @@ -15,7 +15,7 @@ #include "app_uart.h" #include "app_common.h" - +#include "radar.h" #define APP_UART_TASK_PRIORITY osPriorityNormal @@ -41,7 +41,7 @@ #define UART_BUF_LEN 1024 -static int rx_rev_len = 0; +// static int rx_rev_len = 0; static char rx_rev_data[UART_BUF_LEN] = {0}; static osThreadId_t os_UART_RX_ThreadId = NULL; //串口数据接收、解析任务Handle @@ -60,18 +60,21 @@ typedef struct{ static void Uart_RX_TaskHandle(void *param){ int temp_len = 0; - while (1){ - if (uart_rx_sem != NULL){ + while(1){ + if(uart_rx_sem != NULL){ osSemaphoreAcquire(uart_rx_sem, osWaitForever);//阻塞 } - temp_len = cm_uart_read(APP_URAT, (void*)&rx_rev_data[rx_rev_len], UART_BUF_LEN, 1000); - rx_rev_len += temp_len; - if (rx_rev_len < UART_BUF_LEN){ // 处理数据 + temp_len = cm_uart_read(APP_URAT, (void*)&rx_rev_data[0], UART_BUF_LEN, 1000); + radar_CheckData(rx_rev_data, temp_len); // 接收数据处理 - memset((void*)rx_rev_data, 0, rx_rev_len); - temp_len = 0; - rx_rev_len = 0; - } + // temp_len = cm_uart_read(APP_URAT, (void*)&rx_rev_data[rx_rev_len], UART_BUF_LEN, 1000); + // rx_rev_len += temp_len; + // if (rx_rev_len < UART_BUF_LEN){ // 处理数据 + + // memset((void*)rx_rev_data, 0, rx_rev_len); + // temp_len = 0; + // rx_rev_len = 0; + // } // app_printf("uart rev data len = %d\n", rx_rev_len); // if (uart_rx_sem != NULL && (strstr(rx_rev_data, "\r\n"))){ diff --git a/custom/custom_main/src/custom_main.c b/custom/custom_main/src/custom_main.c index 8a73a66..1535d7d 100644 --- a/custom/custom_main/src/custom_main.c +++ b/custom/custom_main/src/custom_main.c @@ -22,6 +22,7 @@ #include "jt808_pkg_transmit.h" #include "tcp_client.h" #include "control_out.h" +#include "radar.h" #include "local_tts.h" @@ -240,6 +241,7 @@ void my_appimg_enter(char *param){ jt808_init(); tcp_client_init(); gps_config_init(); + radar_init();// 雷达测离初始化 while(1){ osDelay(1000/5); } diff --git a/custom/jt808/inc/jt808_config.h b/custom/jt808/inc/jt808_config.h index 70e6a95..47f34f3 100644 --- a/custom/jt808/inc/jt808_config.h +++ b/custom/jt808/inc/jt808_config.h @@ -12,7 +12,8 @@ #include "app_uart.h" #define JT808_DEBUG(fmt, args...) app_printf("[JT808]" fmt, ##args) #else -#define JT808_DEBUG(fmt, arg...) +#include "app_uart.h" +#define JT808_DEBUG(fmt, ...) #endif diff --git a/custom/jt808/inc/jt808_protocol.h b/custom/jt808/inc/jt808_protocol.h index cdc9f5f..67449bf 100644 --- a/custom/jt808/inc/jt808_protocol.h +++ b/custom/jt808/inc/jt808_protocol.h @@ -154,11 +154,11 @@ typedef struct { uint8_t manufacturer_id[5];// 制造商ID, 固定5个字节 uint8_t term_model[20];// 终端型号, 固定20个字节, 位数不足后补0x00 uint8_t term_id[7];// 终端ID, 固定7个字节, 位数不足后补0x00 - uint8_t term_ICCID[10];// ICCID, + uint8_t term_ICCID[10];// ICCID uint8_t hw_ver_len;// 终端硬件版本号长度 - uint8_t *str_hw_ver;// 终端硬件版本号 + uint8_t str_hw_ver[5];// 终端硬件版本号 uint8_t fw_ver_len;// 终端固件版本号长度 - uint8_t *str_fw_ver;// 终端固件版本号 + uint8_t str_fw_ver[5];// 终端固件版本号 uint8_t GnssModule_attr;// GNSS模块属性 uint8_t CommModule_attr;// 通讯模块属性 }GetTermAttrResp_t; diff --git a/custom/jt808/inc/jt808_set_TermParam.h b/custom/jt808/inc/jt808_set_TermParam.h index 2dea156..0c7f1d4 100644 --- a/custom/jt808/inc/jt808_set_TermParam.h +++ b/custom/jt808/inc/jt808_set_TermParam.h @@ -45,6 +45,8 @@ typedef enum{ NetworkQuantityID = 0x30,// 无线通信网络信号强度, BYTE GnssSatellitesID = 0x31,// GNSS 定位卫星数, BYTE CustomInformationLengthID = 0xE0,// 后续自定义信息长度, BYTE + BAT_VoltageID = 0xE1, // 电池电压, 0.1V WORD + BAT_PercentageID = 0xE2, // 电池电量, % BYTE }addi_infoID_t; // big_标记的参数需以大端方式存储,需手动转换为大端 @@ -54,6 +56,7 @@ typedef struct {// 终端参数项 Term_RegInfo_t big_reg_info; // 注册信息 Term_Auth_t big_auth_info; // 终端鉴权信息 set_TermParam_t set_term_param; // 设置终端参数 + GetTermAttrResp_t big_term_attr_resp; // 终端属性查询响应 GetSpecificTermParams_t big_specific_params; // 解析出的待查询指定终端参数列表 Term_Ctrl_t big_ctrl_info; // 解析出的终端控制信息 Term_Upgrade_t big_upgrade_info; // 解析出的升级信息 diff --git a/custom/jt808/src/jt808_msg_parse.c b/custom/jt808/src/jt808_msg_parse.c index 6807323..2e5ed13 100644 --- a/custom/jt808/src/jt808_msg_parse.c +++ b/custom/jt808/src/jt808_msg_parse.c @@ -67,6 +67,7 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){ } case ID_GetTermAttr:{// 查询终端属性 + jt808_pkg_send(ID_GetTermAttrResp, 0);// 发送查询终端属性应答,设置本消息无发送应答 break; } case ID_Term_Upgrade:{// 下发终端升级包 @@ -83,7 +84,9 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){ } case ID_TxtMsgdelivery:{// 文本信息下发 uint8_t device_volume, speed, volume, mode; - + uint8_t txt_flag = ((uint8_t *)Prsmsg_body)[0]; + JT808_DEBUG("ID_TxtMsgdelivery:%x\r\n", txt_flag); + Prsmsg_body = (void *)((uint8_t *)Prsmsg_body + 1); // 跳过标志位 device_volume =10*(((uint8_t *)Prsmsg_body)[0]-'0') + (((uint8_t *)Prsmsg_body)[1]-'0'); speed =10*(((uint8_t *)Prsmsg_body)[3]-'0') + (((uint8_t *)Prsmsg_body)[4]-'0'); volume =10*(((uint8_t *)Prsmsg_body)[6]-'0') + (((uint8_t *)Prsmsg_body)[7]-'0'); @@ -114,10 +117,14 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){ break; } case ID_Car_Ctrl:{// 车辆控制 - jt808_Set_CarStatus(((uint8_t *)Prsmsg_body)[0]); // 设置车辆状态 + if(Result->msg_head.msgbody_attr.msgbodylen == 1){ // 车辆控制 + jt808_Set_CarStatus(((uint8_t *)Prsmsg_body)[0]); // 设置车辆状态 + Result->Rsp_result = Msg_ok; + }else{ + Result->Rsp_result = Msg_invalid; + } Result->Rsp_flow_num = Result->msg_head.msg_flow_num; Result->Rsp_msg_id = Result->msg_head.msg_id; - Result->Rsp_result = Msg_ok; jt808_pkg_send(ID_Car_CtrlResp, 0);// 发送车辆控制应答,设置本消息无发送应答 break; } diff --git a/custom/jt808/src/jt808_msg_pkg.c b/custom/jt808/src/jt808_msg_pkg.c index d185d01..a420de3 100644 --- a/custom/jt808/src/jt808_msg_pkg.c +++ b/custom/jt808/src/jt808_msg_pkg.c @@ -85,13 +85,14 @@ static int jt808_BodyPackage(JT808_2013_MsgFrame_t *p_MsgFrame, MessageID_t Msg_ break; } case ID_GetTermAttrResp:{ // 查询终端属性应答 - // p_MsgFrame->msg_head.msgbody_attr.msgbodylen = sizeof(GetTermAttrResp_t);// 消息体长度 - // GetTermAttrResp_t *get_term_attr_resp = (GetTermAttrResp_t *)jt808_realloc(p_MsgFrame->p_msg_body, sizeof(GetTermAttrResp_t)); - // if(get_term_attr_resp == NULL){ - // JT808_DEBUG("[%s,%s] malloc failed \r\n", __FUNCTION__,__LINE__); - // return -1; - // } - // p_MsgFrame->p_msg_body = (void *)get_term_attr_resp; + p_MsgFrame->msg_head.msgbody_attr.msgbodylen = sizeof(GetTermAttrResp_t);// 消息体长度 + GetTermAttrResp_t *get_term_attr_resp = (GetTermAttrResp_t *)jt808_malloc(p_MsgFrame->msg_head.msgbody_attr.msgbodylen); + if(get_term_attr_resp == NULL){ + JT808_DEBUG("[%s,%s] malloc failed \r\n", __FUNCTION__,__LINE__); + return -1; + } + memcpy(get_term_attr_resp, &PrsResult.term_param_item->big_term_attr_resp, sizeof(GetTermAttrResp_t)); // 复制查询终端属性应答内容 + p_MsgFrame->p_msg_body = (void *)get_term_attr_resp; break; } case ID_Term_UpgradeResult:{ // 终端升级结果通知 diff --git a/custom/jt808/src/jt808_set_TermParam.c b/custom/jt808/src/jt808_set_TermParam.c index 3233f47..00d16a6 100644 --- a/custom/jt808/src/jt808_set_TermParam.c +++ b/custom/jt808/src/jt808_set_TermParam.c @@ -132,12 +132,85 @@ int jt808_updateLocBasicInfo(Loc_basic_info_t *loc_basic_info){ return 0; } +// 增加附加信息(队尾增加) +void jt808_LocReport_add_tail_addi_info(uint8_t msg_id){ + // TODO: 增加附加信息 + Loc_addi_info_t *p_head =jt808_term_param_item.big_loc_report.addi_info; + while(p_head != NULL){ + if(p_head->msg_id == msg_id){ + // 已存在该消息ID + return; + } + p_head = p_head->next; + } + // 未找到该消息ID,增加 + p_head = (Loc_addi_info_t *)jt808_malloc(sizeof(Loc_addi_info_t)); + if(p_head == NULL){ + JT808_DEBUG("[%s,%s] malloc failed \r\n", __FUNCTION__,__LINE__); + return; + } + if(jt808_term_param_item.big_loc_report.addi_info == NULL){ + jt808_term_param_item.big_loc_report.addi_info = p_head; + }else{ + Loc_addi_info_t *p_tail =jt808_term_param_item.big_loc_report.addi_info; + while(p_tail->next != NULL){ + p_tail = p_tail->next; + } + p_tail->next = p_head; + } + p_head->msg_id = msg_id; + p_head->next = NULL; + + // TODO: 增加附加信息 + switch(msg_id){ + case BAT_VoltageID:{ + // 电池电压, 0.1V WORD + p_head->msg_len = 2; + p_head->msg = (void *)(&BAT_Message.Bat_Voltage); + break; + } + case BAT_PercentageID:{ + // 电池电量 , % BYTE + p_head->msg_len = 1; + p_head->msg = (void *)(&BAT_Message.Bat_Percent); + break; + } + default:{ + // TODO: 未知消息ID + jt808_free(p_head); + break; + } + } +} + + // 移除附加信息(指定消息ID) +void jt808_LocReport_remove_addi_info(uint8_t msg_id){ + Loc_addi_info_t *p_head =jt808_term_param_item.big_loc_report.addi_info; + Loc_addi_info_t *p_prev =NULL; + while(p_head != NULL){ + if(p_head->msg_id == msg_id){ + if(p_prev == NULL){ + jt808_term_param_item.big_loc_report.addi_info = p_head->next; + }else{ + p_prev->next = p_head->next; + } + jt808_free(p_head); + break; + } + p_prev = p_head; + p_head = p_head->next; + } +} + osThreadFunc_t Autoreport_param_ThreadId; void Autoreport_param_Task(void *arg){ uint32_t count_Sec = 0;// 计数器 nmeaTIME beiJingTime; // 北京时间 + jt808_LocReport_add_tail_addi_info(BAT_VoltageID); // 增加电池电压信息 + jt808_LocReport_add_tail_addi_info(BAT_PercentageID); // 增加电池电量信息 + while(1){ // TODO: 自动上报参数 // 1. 位置基本信息 @@ -158,7 +231,7 @@ void Autoreport_param_Task(void *arg){ jt808_term_param_item.big_loc_report.basic_info.status.val32 = 0; // 清除状态信息 jt808_term_param_item.big_loc_report.basic_info.status.positioning = (((gps_data.info.fix == 1)||(gps_data.info.sig == 0)) ? 0 : 1); // 0:未定位,1:已定位 - jt808_term_param_item.big_loc_report.basic_info.status.acc =sys_sta.O_door_lock; // 1:电门锁打开,0:电门锁关闭 + jt808_term_param_item.big_loc_report.basic_info.status.acc =((1==sys_sta.O_door_lock)||(0==sys_sta.MAG_MODE)); // 1:电门锁打开,0:电门锁关闭 jt808_term_param_item.big_loc_report.basic_info.status.MAG_MODE =sys_sta.MAG_MODE;// 1:游客模式,0:管理模式 jt808_term_param_item.big_loc_report.basic_info.status.PLT_MODE =sys_sta.PLT_MODE; // 1:游客模式,0:管理模式 jt808_term_param_item.big_loc_report.basic_info.status.IO_RX_back =sys_sta.IO_RX_back; // 1:正常 0:倒车 @@ -179,6 +252,9 @@ void Autoreport_param_Task(void *arg){ if(0 == (count_Sec % jt808_term_param_item.set_term_param.HeartBeatInterval)){ if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用// 未定位时发送心跳包 jt808_pkg_send(ID_Term_HB,0); // 发送心跳包 // 不接收应答 + // jt808_pkg_send(ID_LocReport, 0); // 发送位置信息上报包 + // JT808_DEBUG("Bat_Percent:%d,Bat_Voltage:%d,Bat_STA:%X\r\n",BAT_Message.Bat_Percent,BAT_Message.Bat_Voltage,BAT_Message.Bat_STA); + // jt808_pkg_send(ID_GetTermAttrResp, 0); // 发送终端属性查询应答包 }else{ jt808_pkg_send(ID_LocReport,10000/5); // 发送位置信息上报包 } @@ -274,8 +350,23 @@ 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){ @@ -287,7 +378,7 @@ void jt808_set_term_param_init(void){ // jt808_term_param_item.big_auth_info.str_auth_code = NULL; }while(0); do{// 终端参数初始化 - jt808_term_param_item.set_term_param.HeartBeatInterval = 30; // 心跳包间隔(秒) + jt808_term_param_item.set_term_param.HeartBeatInterval = 3; // 心跳包间隔(秒) char ServerAddr[] ="47.99.118.34"; // 车牌号码 uint32_t ServerPort = 5000; // 服务器端口 // char ServerAddr[] ="36.137.226.30"; // 车牌号码 diff --git a/custom/local_tts/src/local_tts.c b/custom/local_tts/src/local_tts.c index 27a6e79..df6cf4a 100644 --- a/custom/local_tts/src/local_tts.c +++ b/custom/local_tts/src/local_tts.c @@ -22,7 +22,7 @@ static osMessageQueueId_t local_tts_play_queue = NULL; // static osMessageQueueId_t local_tts_free_sem_queue = 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_stat_sem = NULL; // static int32_t TTS_play_finish_flag = 0; //播放完成标志位 0-完成 !=0-未完成 typedef struct{ @@ -137,10 +137,11 @@ static void __local_tts_callback(cm_local_tts_event_e event, void *param) break; case CM_LOCAL_TTS_EVENT_PLAY_INTERRUPT: DEBUG("[[%s] PLAY_INTERRUPT\n", (char *)param); - break; + // 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: @@ -172,22 +173,25 @@ static osThreadFunc_t local_tts_play_task(void *arg){ DEBUG("tts task: text= null\n"); continue; } - if(0 == cm_local_tts_play_stop()){ // 停止播放 - ret =osSemaphoreAcquire(local_tts_play_ok_sem, 30000/5);// 等待播放结束 + 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_ok_sem:%d\n", ret); + DEBUG("local_tts_play_stat_sem:%d\n", ret); } } // 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){ // 不允许被打断播放 + // if(0 == tts_play_queue.en_interruptible){ // 不允许被打断播放 // DEBUG("tts task: 2222222222\n\n"); - ret =osSemaphoreAcquire(local_tts_play_ok_sem, 30000/5);// 等待播放结束 + ret =osSemaphoreAcquire(local_tts_play_ok_sem, (0 == tts_play_queue.en_interruptible)?(30000/5):(300/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; @@ -225,6 +229,9 @@ void local_tts_init(void){ 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); + } osThreadAttr_t local_tts_play_thread_attr = { .name = "local_tts_play_thread", .stack_size = 4096*4, diff --git a/custom/radar/src/radar.c b/custom/radar/src/radar.c index 6f42e69..5eb08fb 100644 --- a/custom/radar/src/radar.c +++ b/custom/radar/src/radar.c @@ -118,6 +118,7 @@ void radar_CheckData(uint8_t *data, uint16_t data_len){ radar_data.radar_id = data[0]; radar_data.distance = ((uint16_t)data[3] << 8 ) | data[4]; radar_AUTO_BrakeORSpeedCut(radar_data.radar_id ,radar_data.distance); + DEBUG("radar_id:%#02x,distance:%d", radar_data.radar_id, radar_data.distance); radar_CMDReceive_cnt++; } } @@ -138,9 +139,9 @@ static void RADAR_TaskHandle(void *param){ } // 进入游客模式开启雷达 //管理员模式优先于游客模式 - if(((0 != sys_sta.O_door_lock) && ((1 == sys_sta.MAG_MODE)||(1 == sys_sta.PLT_MODE ))) && sys_sta.P_Radar_EN){ + if(((0 != sys_sta.O_door_lock) && ((1 == sys_sta.MAG_MODE)&&(1 == sys_sta.PLT_MODE ))) && sys_sta.P_Radar_EN){ // 根据倒车状态确定雷达ID - DEBUG("SendCMD:ID=%#02x", (0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front); + // DEBUG("SendCMD:ID=%#02x", (0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front); radar_Sendcmd((0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front, RADAR_MODE_Real); } osDelay(140/5); // 140ms diff --git a/custom/tcp_client/src/tcp_client.c b/custom/tcp_client/src/tcp_client.c index 48857fb..9edc81a 100644 --- a/custom/tcp_client/src/tcp_client.c +++ b/custom/tcp_client/src/tcp_client.c @@ -11,7 +11,7 @@ #include "app_common.h" #include "local_tts.h" -#define TCP_CLIENT_ENABLE 1 +#define TCP_CLIENT_ENABLE 0 #if TCP_CLIENT_ENABLE #include "app_uart.h" 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 fbacdfb..e5f1251 100644 --- a/src/cm_lib/cm_tts_play/cm_tts_play.c +++ b/src/cm_lib/cm_tts_play/cm_tts_play.c @@ -20,6 +20,7 @@ typedef struct { osThreadId_t TaskHandle; /* TTS播放管理句柄 */ osSemaphoreId_t SemHandle; /* TTS播放信号量句柄 */ + osSemaphoreId_t SemHandle_ack; /* TTS播放信号量句柄 */ cm_local_tts_state_e state; /* TTS播放状态 */ uint8_t *TtsPcmBuf; /* TTS转码后的数据 */ uint32_t TtsPcmBufLen; /* 当前TTS已完成转码的数据长度 */ @@ -27,7 +28,7 @@ typedef struct { void* user_cb_param; /* 回调函数中的参数,由上层应用设置 */ } cm_tts_play_cfg_t; -static cm_tts_play_cfg_t cm_tts_play_cfg = {NULL, NULL, CM_LOCAL_TTS_STATE_IDLE, NULL, 0, NULL, NULL}; +static cm_tts_play_cfg_t cm_tts_play_cfg = {NULL, NULL, NULL, CM_LOCAL_TTS_STATE_IDLE, NULL, 0, NULL, NULL}; static void __cm_tts_play_callback(cm_local_tts_event_e event, void *param) { @@ -69,7 +70,7 @@ static void __cm_tts_play_task(void *param) { osSemaphoreAcquire(cm_tts_play_cfg.SemHandle, osWaitForever); } - + osSemaphoreRelease(cm_tts_play_cfg.SemHandle_ack); int32_t index = 0; bool isError = false; //播放过程中是否有错误 @@ -78,6 +79,9 @@ static void __cm_tts_play_task(void *param) { DEBUG("play_task :len:%d, index: %d\n",cm_tts_play_cfg.TtsPcmBufLen, index); + if(CM_LOCAL_TTS_STATE_IDLE == cm_tts_play_cfg.state){ + break; + } /* 每200ms传10帧PCM数据 */ if (index + 3200 <= cm_tts_play_cfg.TtsPcmBufLen) { @@ -104,11 +108,13 @@ static void __cm_tts_play_task(void *param) index = cm_tts_play_cfg.TtsPcmBufLen; } } - osDelay(40); } cm_audio_player_stream_close(); + cm_tts_play_cfg.TtsPcmBufLen = 0; + cm_free(cm_tts_play_cfg.TtsPcmBuf); + cm_tts_play_cfg.TtsPcmBuf = NULL; if (cm_tts_play_cfg.user_cb) { @@ -122,10 +128,7 @@ static void __cm_tts_play_task(void *param) } } cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE; - cm_tts_play_cfg.TtsPcmBufLen = 0; - cm_free(cm_tts_play_cfg.TtsPcmBuf); - cm_tts_play_cfg.TtsPcmBuf = NULL; //cm_heap_stats_t stats = {0}; //cm_mem_get_heap_stats(&stats); @@ -169,6 +172,7 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c 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中播放音频(开启) @@ -179,6 +183,7 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c // 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; // } } @@ -189,8 +194,21 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c if (NULL == cm_tts_play_cfg.SemHandle) { - DEBUG("__%d__ osSemaphoreNew() error",__LINE__); + 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; } } @@ -209,6 +227,7 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c { DEBUG("__%d__ osThreadNew() error", __LINE__); cm_audio_player_stream_close(); + cm_tts_play_cfg.state = CM_LOCAL_TTS_STATE_IDLE; return -1; } } @@ -216,15 +235,20 @@ int32_t cm_local_tts_play(const char *text, int32_t len, cm_local_tts_callback c 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"); + // 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"); + // 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; }