diff --git a/custom/control_out/inc/control_out.h b/custom/control_out/inc/control_out.h index 4d7fa92..2ffdc86 100644 --- a/custom/control_out/inc/control_out.h +++ b/custom/control_out/inc/control_out.h @@ -139,6 +139,11 @@ typedef struct{ extern sys_sta_t sys_sta; extern BAT_Message_t BAT_Message; + +extern uint16_t g_car_ctrl_timer; // 定时时间(单位由平台定义) +extern uint16_t g_car_ctrl_timer; // 剩余时间(单位由平台定义) +extern uint16_t g_car_ctrl_interval; // 本地播报间隔(单位由平台定义) + void control_out_init(void); #endif //__CONTROL_OUT_H__ \ No newline at end of file diff --git a/custom/jt808/src/jt808_msg_parse.c b/custom/jt808/src/jt808_msg_parse.c index 20fa984..9b0454a 100644 --- a/custom/jt808/src/jt808_msg_parse.c +++ b/custom/jt808/src/jt808_msg_parse.c @@ -268,12 +268,17 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){ break; } case ID_Car_Ctrl:{// 车辆控制 - if(Result->msg_head.msgbody_attr.msgbodylen == 1){ // 车辆控制 - jt808_Set_CarStatus(((uint8_t *)Prsmsg_body)[0]); // 设置车辆状态 + if(Result->msg_head.msgbody_attr.msgbodylen >= 5){ // 车辆控制 + jt808_Set_CarStatus((uint8_t *)Prsmsg_body); // 设置车辆状态 Result->Rsp_result = Msg_ok; + }else if(Result->msg_head.msgbody_attr.msgbodylen == 1) { + JT808_DEBUG("WARN: Received 1-byte car control, consider upgrading platform\n"); + uint8_t temp[5] = {((uint8_t *)Prsmsg_body)[0], 0, 0, 0, 0}; + jt808_Set_CarStatus(temp); + Result->Rsp_result = Msg_ok; }else{ - Result->Rsp_result = Msg_invalid; - } + Result->Rsp_result = Msg_invalid; + } Result->Rsp_flow_num = Result->msg_head.msg_flow_num; Result->Rsp_msg_id = Result->msg_head.msg_id; jt808_pkg_send(ID_Car_CtrlResp, 0);// 发送车辆控制应答,设置本消息无发送应答 diff --git a/custom/jt808/src/jt808_set_TermParam.c b/custom/jt808/src/jt808_set_TermParam.c index ad1bee9..1eb5771 100644 --- a/custom/jt808/src/jt808_set_TermParam.c +++ b/custom/jt808/src/jt808_set_TermParam.c @@ -262,25 +262,32 @@ void update_manager_check_timeout(void) { osMutexRelease(update_mutex); } -// 控制车辆状态 -void jt808_Set_CarStatus(uint8_t status){ - // (void)status; - // TODO: 车辆控制状态 - if(status & 0x80){ // 恢复厂设置 - jt808_delete_TermParam(); // 删除终端参数文件 - jt808_delete_Fence_area(); // 删除围栏区域文件 - local_tts_text_play("即将重启系统",0,0); // 语音播报 - osDelay(7000/5); - cm_pm_reboot(); // 重启系统 - } - if(status & 0x70){ // 重启系统 - local_tts_text_play("即将重启系统",0,0); // 语音播报 - osDelay(7000/5); - cm_pm_reboot(); // 重启系统 - } - sys_sta.O_door_lock = (status & 0x01)? 1 : 0; // 设置电门锁状态 - sys_sta.PLT_MODE = (status & 0x02)? 1 : 0; // 平台设置的模式 //1:游客模式,0:管理模式 -// sys_sta.P_Radar_EN = (status & 0x04)? 1 : 0; // 1:雷达使能,0:雷达禁止 +// 控制车辆状态,参数为5字节数据:byte0控制位,byte1-2定时时间(大端),byte3-4播报间隔(大端) +void jt808_Set_CarStatus(const uint8_t status[5]) { + uint8_t ctrl = status[0]; + uint16_t timer = (status[1] << 8) | status[2]; + uint16_t interval = (status[3] << 8) | status[4]; + + // 保存定时时间和播报间隔到系统状态(需确保sys_sta中有对应成员) + sys_sta.timer_value = timer; + sys_sta.broadcast_interval = interval; + + // 原有控制逻辑(基于ctrl字节) + if(ctrl & 0x80) { // 恢复出厂设置 + jt808_delete_TermParam(); // 删除终端参数文件 + jt808_delete_Fence_area(); // 删除围栏区域文件 + local_tts_text_play("即将重启系统", 0, 0); + osDelay(7000 / 5); + cm_pm_reboot(); + } + if(ctrl & 0x70) { // 重启系统(任意位) + local_tts_text_play("即将重启系统", 0, 0); + osDelay(7000 / 5); + cm_pm_reboot(); + } + sys_sta.O_door_lock = (ctrl & 0x01) ? 1 : 0; // 电门锁 + sys_sta.PLT_MODE = (ctrl & 0x02) ? 1 : 0; // 平台模式 + // sys_sta.P_Radar_EN = (ctrl & 0x04) ? 1 : 0; // 雷达使能(注释未用) } // 获取车辆状态