From 812149db645a0dfc7b5177d924d3437a2d88d0d7 Mon Sep 17 00:00:00 2001 From: zsx <1543588107@qq.com> Date: Thu, 13 Mar 2025 20:10:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9B=B4=E6=A0=8F=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=8F=AF=E8=A6=86=E7=9B=96=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BF=9C=E7=A8=8B=E6=81=A2=E5=A4=8D=E5=87=BA?= =?UTF-8?q?=E5=8E=82=E5=92=8C=E8=BF=9C=E7=A8=8B=E5=A4=8D=E4=BD=8D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20zsxfly20250313?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- custom/control_out/src/control_out.c | 2 +- custom/jt808/inc/jt808_set_TermParam.h | 19 ++-- custom/jt808/src/jt808_electronic_fence.c | 17 +++- custom/jt808/src/jt808_msg_parse.c | 30 +++++-- custom/jt808/src/jt808_set_TermParam.c | 105 ++++++++++++---------- custom/radar/src/radar.c | 2 +- 6 files changed, 108 insertions(+), 67 deletions(-) diff --git a/custom/control_out/src/control_out.c b/custom/control_out/src/control_out.c index 3d288f6..5cfeb9b 100644 --- a/custom/control_out/src/control_out.c +++ b/custom/control_out/src/control_out.c @@ -78,7 +78,7 @@ uint32_t ACC_Dmax =(((ACC_OUT_Voltage_MAX*ACC_OUT_RES_DOWN)/(ACC_OUT_RES_UP+ACC_ 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){ + if((acc_voltage < 900) || (acc_voltage > 4100)){ return 0; }else if(acc_voltage > 3800){ return 100; diff --git a/custom/jt808/inc/jt808_set_TermParam.h b/custom/jt808/inc/jt808_set_TermParam.h index 454fc36..c62b6a5 100644 --- a/custom/jt808/inc/jt808_set_TermParam.h +++ b/custom/jt808/inc/jt808_set_TermParam.h @@ -18,15 +18,16 @@ typedef enum { ID_CityID = 0x0082, // WORD, 车辆所在的市域 ID ID_CarPlateNum = 0x0083, //STRING, 公安交通管理部门颁发的机动车号牌 ID_CarPlateColor = 0x0084, //BYTE 车牌颜色,按照 JT/T415-2006 的 5.4.12 - ID_RadarEN = 0xF001, //BYTE 雷达使能位, 0 代表关闭, 1 代表开启 - ID_ManagerACC = 0xF002, //BYTE 管理员模式油门0~100% - ID_TouristACC = 0xF003, //BYTE 游客模式油门0~100% - ID_SpeedCutACC = 0xF004, //BYTE 自动减速油门0~100% - ID_BrakeLimit = 0xF005, //WORD 前进刹车距离 - ID_SpeedCutLimit = 0xF006, //WORD 前进自动减速刹车距离 - ID_BrakeLimit_B = 0xF007, //WORD 后退刹车距离 - ID_SpeedCutLimit_B = 0xF008, //WORD 后退自动减速刹车距离 - ID_Ban_Fence_Polygon_Delay_OFF = 0xF009, //BYTE 禁止围栏延时关闭时间, 单位秒 + + ID_ManagerACC = 0xF001, //BYTE 管理员模式油门0~100% + ID_TouristACC = 0xF002, //BYTE 游客模式油门0~100% + ID_SpeedCutACC = 0xF003, //BYTE 自动减速油门0~100% + ID_BrakeLimit = 0xF004, //WORD 前进刹车距离 + ID_SpeedCutLimit = 0xF005, //WORD 前进自动减速刹车距离 + ID_BrakeLimit_B = 0xF006, //WORD 后退刹车距离 + ID_SpeedCutLimit_B = 0xF007, //WORD 后退自动减速刹车距离 + ID_Ban_Fence_Polygon_Delay_OFF = 0xF008, //BYTE 禁止围栏延时关闭时间, 单位秒 + ID_RadarEN = 0xF009, //BYTE 雷达使能位, 0 代表关闭, 1 代表开启 }set_TermParamID_t; typedef struct{ uint32_t HeartBeatInterval;// DWORD, 终端心跳发送间隔(s) diff --git a/custom/jt808/src/jt808_electronic_fence.c b/custom/jt808/src/jt808_electronic_fence.c index ca867e4..42023b3 100644 --- a/custom/jt808/src/jt808_electronic_fence.c +++ b/custom/jt808/src/jt808_electronic_fence.c @@ -67,11 +67,24 @@ int jt808_add_tail_fence_Polygon_area(uint32_t area_id ,uint16_t Area_att, uint1 } // TODO: 增加附加信息 fence_Polygon_area_t *p_head =jt808_term_param_item.fence_polygon_area; + fence_Polygon_area_t *p_prev =NULL; while(p_head != NULL){ if(p_head->Area_ID == area_id){ - // 已存在该消息ID - return -2; + if(p_prev == NULL){ + jt808_term_param_item.fence_polygon_area = p_head->next; + }else{ + p_prev->next = p_head->next; + } + p_head->Area_ID = 0; + p_head->Area_att = 0; + p_head->Area_Points_Num = 0; + if(p_head->Area_Points != NULL){ + jt808_free(p_head->Area_Points); + } + jt808_free(p_head); + break; } + p_prev = p_head; p_head = p_head->next; } // 未找到该消息ID,增加 diff --git a/custom/jt808/src/jt808_msg_parse.c b/custom/jt808/src/jt808_msg_parse.c index 9ff6e23..f7e8ca4 100644 --- a/custom/jt808/src/jt808_msg_parse.c +++ b/custom/jt808/src/jt808_msg_parse.c @@ -130,33 +130,45 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){ break; } case ID_Set_Polygon_area:{// 设置多边形区域 + int ret = 0; uint32_t Area_ID; // 区域ID uint16_t Area_att; // 区域属性 uint16_t Area_Points_Num; // 区域内点的数量 memcpy(&Area_ID, ((uint8_t *)Prsmsg_body), 4); // 区域ID memcpy(&Area_att, ((uint8_t *)Prsmsg_body)+4, 2); // 区域属性 memcpy(&Area_Points_Num, ((uint8_t *)Prsmsg_body)+21, 2); // 区域点个数 - - jt808_add_tail_fence_Polygon_area(Swap32(Area_ID), // 区域ID - Swap16(Area_att), // 区域属性 - Swap16(Area_Points_Num), // 区域点个数 - (AreaPoint_t *)(((uint8_t *)Prsmsg_body) + 23)); // 区域点坐标 + if(Swap16(Area_Points_Num) <= 120){ // 区域点个数有效 + ret = jt808_add_tail_fence_Polygon_area(Swap32(Area_ID), // 区域ID + Swap16(Area_att), // 区域属性 + Swap16(Area_Points_Num), // 区域点个数 + (AreaPoint_t *)(((uint8_t *)Prsmsg_body) + 23)); // 区域点坐标 + if(ret == 0){ + Result->Rsp_result = Msg_ok; + }else{ + Result->Rsp_result = Msg_err; + } + }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_Term_GenResp, 0);// 发送终端通用应答 break; } case ID_Delete_Polygon_area:{// 删除多边形区域 + int ret = 0; uint8_t Area_ID_Num = ((uint8_t *)Prsmsg_body)[0]; // 区域ID个数 Prsmsg_body = (void *)((uint8_t *)Prsmsg_body + 1); // 跳过1字节 + Result->Rsp_result = Msg_ok; for(int i = 0; i < Area_ID_Num; i++){ - jt808_remove_fence_Polygon_area(((uint8_t *)Prsmsg_body)[i]<<24 | ((uint8_t *)Prsmsg_body)[i+1]<<16 | ((uint8_t *)Prsmsg_body)[i+2]<<8 | ((uint8_t *)Prsmsg_body)[i+3]); - // jt808_remove_fence_Polygon_area(Swap32(((uint32_t *)Prsmsg_body)[i])); + ret = jt808_remove_fence_Polygon_area(((uint8_t *)Prsmsg_body)[i]<<24 | ((uint8_t *)Prsmsg_body)[i+1]<<16 | ((uint8_t *)Prsmsg_body)[i+2]<<8 | ((uint8_t *)Prsmsg_body)[i+3]); + if(ret != 0){ + Result->Rsp_result = Msg_err; + break; + } } 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_Term_GenResp, 0);// 发送终端通用应答 break; } diff --git a/custom/jt808/src/jt808_set_TermParam.c b/custom/jt808/src/jt808_set_TermParam.c index ee87b1e..8433ed3 100644 --- a/custom/jt808/src/jt808_set_TermParam.c +++ b/custom/jt808/src/jt808_set_TermParam.c @@ -16,6 +16,7 @@ Term_Param_item_t jt808_term_param_item; // 终端参数项 void jt808_Set_CarStatus(uint8_t status){ // (void)status; // TODO: 车辆控制状态 + if(status == 0x00){ // 车辆状态清除 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:雷达禁止 @@ -28,6 +29,7 @@ uint8_t jt808_Get_CarStatus(void){ status |= (sys_sta.O_door_lock? 0x01 : 0); // 门锁状态 status |= (sys_sta.PLT_MODE? 0x02 : 0); // 平台设置模式 //1:游客模式,0:管理模式 status |= (sys_sta.P_Radar_EN? 0x04 : 0); // 1:雷达使能,0:雷达禁止 + return status; } @@ -139,9 +141,19 @@ static int jt808_load_TermParam(void){ // 设置终端参数 int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_len){ + uint32_t param_val32 = 0; + if(param_len == 1){ + param_val32 = ((uint8_t *)param)[0]; + }else if(param_len == 2){ + param_val32 = (((uint8_t *)param)[0] << 8) | ((uint8_t *)param)[1]; + }else if(param_len == 4){ + param_val32 = (((uint8_t *)param)[0] << 24) | (((uint8_t *)param)[1] << 16) | (((uint8_t *)param)[2] << 8) | ((uint8_t *)param)[3]; + } + + JT808_DEBUG("param_id = 0x%04X, param_val32 = 0x%04X == %d\r\n", param_id, param_val32, param_val32); switch(param_id){ case ID_HeartBeatInterval:{ - jt808_term_param_item.set_term_param.HeartBeatInterval =Swap32(*(uint32_t*)param); + jt808_term_param_item.set_term_param.HeartBeatInterval =param_val32; break; } case ID_MainServerAddr:{ @@ -149,27 +161,27 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le break; } case ID_ServerPort:{ - jt808_term_param_item.set_term_param.ServerPort =Swap32(*(uint32_t*)param); + jt808_term_param_item.set_term_param.ServerPort =param_val32; break; } case ID_DefaultTimeReportInterval:{ - jt808_term_param_item.set_term_param.DefaultTimeReportInterval =Swap32(*(uint32_t*)param); + jt808_term_param_item.set_term_param.DefaultTimeReportInterval =param_val32; break; } case ID_InflexionAngle:{ - jt808_term_param_item.set_term_param.InflexionAngle =Swap32(*(uint32_t*)param); + jt808_term_param_item.set_term_param.InflexionAngle =param_val32; break; } case ID_MaxSpeed:{ - jt808_term_param_item.set_term_param.MaxSpeed =Swap32(*(uint32_t*)param); + jt808_term_param_item.set_term_param.MaxSpeed =param_val32; break; } case ID_ProvinceID:{ - jt808_term_param_item.set_term_param.ProvinceID =Swap16(*(uint16_t*)param); + jt808_term_param_item.set_term_param.ProvinceID =param_val32; break; } case ID_CityID:{ - jt808_term_param_item.set_term_param.CityID =Swap16(*(uint16_t*)param); + jt808_term_param_item.set_term_param.CityID =param_val32; break; } case ID_CarPlateNum:{ @@ -177,43 +189,43 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le break; } case ID_CarPlateColor:{ - jt808_term_param_item.set_term_param.CarPlateColor =((uint8_t*)param)[0]; - break; - } - case ID_RadarEN:{// TODO: 雷达使能位 - jt808_term_param_item.set_term_param.RadarEN =((uint8_t*)param)[0]; + jt808_term_param_item.set_term_param.CarPlateColor =param_val32 & 0xFF; break; } case ID_ManagerACC:{ // 管理员模式油门0~100% - jt808_term_param_item.set_term_param.ManagerACC =((uint8_t*)param)[0]; + jt808_term_param_item.set_term_param.ManagerACC =param_val32 & 0xFF; break; } case ID_TouristACC:{ // 游客模式油门0~100% - jt808_term_param_item.set_term_param.TouristACC =((uint8_t*)param)[0]; + jt808_term_param_item.set_term_param.TouristACC =param_val32 & 0xFF; break; } case ID_SpeedCutACC:{ // 自动减速油门0~100% - jt808_term_param_item.set_term_param.SpeedCutACC =((uint8_t*)param)[0]; + jt808_term_param_item.set_term_param.SpeedCutACC =param_val32 & 0xFF; break; } case ID_BrakeLimit:{ //前进刹车距离 - jt808_term_param_item.set_term_param.BrakeLimit =Swap16(*(uint16_t*)param); + jt808_term_param_item.set_term_param.BrakeLimit =param_val32 & 0xFFFF; break; } case ID_SpeedCutLimit:{ // 前进自动减速刹车距离 - jt808_term_param_item.set_term_param.SpeedCutLimit =Swap16(*(uint16_t*)param); + jt808_term_param_item.set_term_param.SpeedCutLimit =param_val32 & 0xFFFF; break; } case ID_BrakeLimit_B:{ // 后退刹车距离 - jt808_term_param_item.set_term_param.BrakeLimit_B =Swap16(*(uint16_t*)param); + jt808_term_param_item.set_term_param.BrakeLimit_B =param_val32 & 0xFFFF; break; } case ID_SpeedCutLimit_B:{ // 后退自动减速刹车距离 - jt808_term_param_item.set_term_param.SpeedCutLimit_B =Swap16(*(uint16_t*)param); + jt808_term_param_item.set_term_param.SpeedCutLimit_B =param_val32 & 0xFFFF; break; } case ID_Ban_Fence_Polygon_Delay_OFF:{ // 禁止围栏报警延时关闭时间, 单位秒 - jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF =((uint8_t*)param)[0]; + jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF =param_val32 & 0xFF; + break; + } + case ID_RadarEN:{// TODO: 雷达使能位 + jt808_term_param_item.set_term_param.RadarEN =param_val32 & 0xFF; break; } default:{ @@ -381,43 +393,46 @@ void jt808_LocReport_param_update(void){ // 更新当前所在位置区域ID uint32_t lat = nmea_ndeg2degree(gps_data.info.lat) * 1e6; uint32_t lng = nmea_ndeg2degree(gps_data.info.lon) * 1e6; - // lat = 44939236; // lng = 121369446; // lat = 34939236; // lng = 121369446; - - if(1 == sys_sta.O_door_lock){ // 电门锁打开, - Rsp_locked_condition = 0; // 复位锁车状态 - } Rsp_Bigscenic_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0001, lat, lng)); Rsp_Bigban_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0002, lat, lng)); - if(Rsp_Bigscenic_Fence_Polygon_area_ID == 0){ // 在景区围栏 - scenic_Fence_Polygon_count++; - if(scenic_Fence_Polygon_count >= 10){ + if((1 == sys_sta.O_door_lock) || (0 == sys_sta.MAG_MODE )){ // 系统运行中 + Rsp_locked_condition = 0; // 复位锁车状态 + + if(Rsp_Bigscenic_Fence_Polygon_area_ID == 0){ // 在景区围栏 + scenic_Fence_Polygon_count++; + if(scenic_Fence_Polygon_count >= 10){ + scenic_Fence_Polygon_count = 0; + local_tts_text_play("您已离开景区!",0,0); + } + }else{ scenic_Fence_Polygon_count = 0; - local_tts_text_play("您已离开景区!",0,0); + } + if(Rsp_Bigban_Fence_Polygon_area_ID != 0){ + delay_off_count++; + if(delay_off_count >= jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF){ // 30S + delay_off_count = 0; + sys_sta.O_door_lock = 0; // 锁车 + Rsp_locked_condition = 1; // 锁车状态 + local_tts_text_play("已锁车,请联系管理员解除禁止入内限制!",0,0); + } + ban_Fence_Polygon_count++; + if(ban_Fence_Polygon_count >= 10){ // 7S + ban_Fence_Polygon_count = 0; + local_tts_text_play("您已进入禁区,请尽快离开!",0,0); + } + }else{ + delay_off_count = 0; + ban_Fence_Polygon_count = 0; } }else{ scenic_Fence_Polygon_count = 0; - } - if(Rsp_Bigban_Fence_Polygon_area_ID != 0){ - delay_off_count++; - if(delay_off_count >= jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF){ // 30S - delay_off_count = 0; - sys_sta.O_door_lock = 0; // 锁车 - Rsp_locked_condition = 1; // 锁车状态 - local_tts_text_play("已锁车,请联系管理员解除禁止入内限制!",0,0); - } - ban_Fence_Polygon_count++; - if(ban_Fence_Polygon_count >= 10){ // 7S - ban_Fence_Polygon_count = 0; - local_tts_text_play("您已进入禁区,请尽快离开!",0,0); - } - }else{ - delay_off_count = 0; ban_Fence_Polygon_count = 0; + delay_off_count = 0; } } } diff --git a/custom/radar/src/radar.c b/custom/radar/src/radar.c index a44a87e..ce0be5b 100644 --- a/custom/radar/src/radar.c +++ b/custom/radar/src/radar.c @@ -15,7 +15,7 @@ #include "local_tts.h" -#define RADAR_DEBUG_ENABLE 1 +#define RADAR_DEBUG_ENABLE 0 #if RADAR_DEBUG_ENABLE #include "app_uart.h"