添加围栏参数可覆盖功能,添加远程恢复出厂和远程复位功能 zsxfly20250313

This commit is contained in:
zsx 2025-03-13 20:10:35 +08:00
parent 0a46927735
commit 812149db64
6 changed files with 108 additions and 67 deletions

View File

@ -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 get_in_acc_percent(void){
uint16_t acc_voltage =get_voltage(ADC_acc); uint16_t acc_voltage =get_voltage(ADC_acc);
DEBUG("acc_voltage:%d\n",acc_voltage); DEBUG("acc_voltage:%d\n",acc_voltage);
if(acc_voltage < 900){ if((acc_voltage < 900) || (acc_voltage > 4100)){
return 0; return 0;
}else if(acc_voltage > 3800){ }else if(acc_voltage > 3800){
return 100; return 100;

View File

@ -18,15 +18,16 @@ typedef enum {
ID_CityID = 0x0082, // WORD, 车辆所在的市域 ID ID_CityID = 0x0082, // WORD, 车辆所在的市域 ID
ID_CarPlateNum = 0x0083, //STRING, 公安交通管理部门颁发的机动车号牌 ID_CarPlateNum = 0x0083, //STRING, 公安交通管理部门颁发的机动车号牌
ID_CarPlateColor = 0x0084, //BYTE 车牌颜色,按照 JT/T415-2006 的 5.4.12 ID_CarPlateColor = 0x0084, //BYTE 车牌颜色,按照 JT/T415-2006 的 5.4.12
ID_RadarEN = 0xF001, //BYTE 雷达使能位, 0 代表关闭, 1 代表开启
ID_ManagerACC = 0xF002, //BYTE 管理员模式油门0~100% ID_ManagerACC = 0xF001, //BYTE 管理员模式油门0~100%
ID_TouristACC = 0xF003, //BYTE 游客模式油门0~100% ID_TouristACC = 0xF002, //BYTE 游客模式油门0~100%
ID_SpeedCutACC = 0xF004, //BYTE 自动减速油门0~100% ID_SpeedCutACC = 0xF003, //BYTE 自动减速油门0~100%
ID_BrakeLimit = 0xF005, //WORD 前进刹车距离 ID_BrakeLimit = 0xF004, //WORD 前进刹车距离
ID_SpeedCutLimit = 0xF006, //WORD 前进自动减速刹车距离 ID_SpeedCutLimit = 0xF005, //WORD 前进自动减速刹车距离
ID_BrakeLimit_B = 0xF007, //WORD 后退刹车距离 ID_BrakeLimit_B = 0xF006, //WORD 后退刹车距离
ID_SpeedCutLimit_B = 0xF008, //WORD 后退自动减速刹车距离 ID_SpeedCutLimit_B = 0xF007, //WORD 后退自动减速刹车距离
ID_Ban_Fence_Polygon_Delay_OFF = 0xF009, //BYTE 禁止围栏延时关闭时间, 单位秒 ID_Ban_Fence_Polygon_Delay_OFF = 0xF008, //BYTE 禁止围栏延时关闭时间, 单位秒
ID_RadarEN = 0xF009, //BYTE 雷达使能位, 0 代表关闭, 1 代表开启
}set_TermParamID_t; }set_TermParamID_t;
typedef struct{ typedef struct{
uint32_t HeartBeatInterval;// DWORD, 终端心跳发送间隔(s) uint32_t HeartBeatInterval;// DWORD, 终端心跳发送间隔(s)

View File

@ -67,11 +67,24 @@ int jt808_add_tail_fence_Polygon_area(uint32_t area_id ,uint16_t Area_att, uint1
} }
// TODO: 增加附加信息 // TODO: 增加附加信息
fence_Polygon_area_t *p_head =jt808_term_param_item.fence_polygon_area; fence_Polygon_area_t *p_head =jt808_term_param_item.fence_polygon_area;
fence_Polygon_area_t *p_prev =NULL;
while(p_head != NULL){ while(p_head != NULL){
if(p_head->Area_ID == area_id){ if(p_head->Area_ID == area_id){
// 已存在该消息ID if(p_prev == NULL){
return -2; 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; p_head = p_head->next;
} }
// 未找到该消息ID增加 // 未找到该消息ID增加

View File

@ -130,33 +130,45 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){
break; break;
} }
case ID_Set_Polygon_area:{// 设置多边形区域 case ID_Set_Polygon_area:{// 设置多边形区域
int ret = 0;
uint32_t Area_ID; // 区域ID uint32_t Area_ID; // 区域ID
uint16_t Area_att; // 区域属性 uint16_t Area_att; // 区域属性
uint16_t Area_Points_Num; // 区域内点的数量 uint16_t Area_Points_Num; // 区域内点的数量
memcpy(&Area_ID, ((uint8_t *)Prsmsg_body), 4); // 区域ID memcpy(&Area_ID, ((uint8_t *)Prsmsg_body), 4); // 区域ID
memcpy(&Area_att, ((uint8_t *)Prsmsg_body)+4, 2); // 区域属性 memcpy(&Area_att, ((uint8_t *)Prsmsg_body)+4, 2); // 区域属性
memcpy(&Area_Points_Num, ((uint8_t *)Prsmsg_body)+21, 2); // 区域点个数 memcpy(&Area_Points_Num, ((uint8_t *)Prsmsg_body)+21, 2); // 区域点个数
if(Swap16(Area_Points_Num) <= 120){ // 区域点个数有效
jt808_add_tail_fence_Polygon_area(Swap32(Area_ID), // 区域ID ret = jt808_add_tail_fence_Polygon_area(Swap32(Area_ID), // 区域ID
Swap16(Area_att), // 区域属性 Swap16(Area_att), // 区域属性
Swap16(Area_Points_Num), // 区域点个数 Swap16(Area_Points_Num), // 区域点个数
(AreaPoint_t *)(((uint8_t *)Prsmsg_body) + 23)); // 区域点坐标 (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_flow_num = Result->msg_head.msg_flow_num;
Result->Rsp_msg_id = Result->msg_head.msg_id; Result->Rsp_msg_id = Result->msg_head.msg_id;
Result->Rsp_result = Msg_ok;
jt808_pkg_send(ID_Term_GenResp, 0);// 发送终端通用应答 jt808_pkg_send(ID_Term_GenResp, 0);// 发送终端通用应答
break; break;
} }
case ID_Delete_Polygon_area:{// 删除多边形区域 case ID_Delete_Polygon_area:{// 删除多边形区域
int ret = 0;
uint8_t Area_ID_Num = ((uint8_t *)Prsmsg_body)[0]; // 区域ID个数 uint8_t Area_ID_Num = ((uint8_t *)Prsmsg_body)[0]; // 区域ID个数
Prsmsg_body = (void *)((uint8_t *)Prsmsg_body + 1); // 跳过1字节 Prsmsg_body = (void *)((uint8_t *)Prsmsg_body + 1); // 跳过1字节
Result->Rsp_result = Msg_ok;
for(int i = 0; i < Area_ID_Num; i++){ 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]); 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]);
// jt808_remove_fence_Polygon_area(Swap32(((uint32_t *)Prsmsg_body)[i])); if(ret != 0){
Result->Rsp_result = Msg_err;
break;
}
} }
Result->Rsp_flow_num = Result->msg_head.msg_flow_num; Result->Rsp_flow_num = Result->msg_head.msg_flow_num;
Result->Rsp_msg_id = Result->msg_head.msg_id; Result->Rsp_msg_id = Result->msg_head.msg_id;
Result->Rsp_result = Msg_ok;
jt808_pkg_send(ID_Term_GenResp, 0);// 发送终端通用应答 jt808_pkg_send(ID_Term_GenResp, 0);// 发送终端通用应答
break; break;
} }

View File

@ -16,6 +16,7 @@ Term_Param_item_t jt808_term_param_item; // 终端参数项
void jt808_Set_CarStatus(uint8_t status){ void jt808_Set_CarStatus(uint8_t status){
// (void)status; // (void)status;
// TODO: 车辆控制状态 // TODO: 车辆控制状态
if(status == 0x00){ // 车辆状态清除
sys_sta.O_door_lock = (status & 0x01)? 1 : 0; // 设置电门锁状态 sys_sta.O_door_lock = (status & 0x01)? 1 : 0; // 设置电门锁状态
sys_sta.PLT_MODE = (status & 0x02)? 1 : 0; // 平台设置的模式 //1:游客模式,0:管理模式 sys_sta.PLT_MODE = (status & 0x02)? 1 : 0; // 平台设置的模式 //1:游客模式,0:管理模式
sys_sta.P_Radar_EN = (status & 0x04)? 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.O_door_lock? 0x01 : 0); // 门锁状态
status |= (sys_sta.PLT_MODE? 0x02 : 0); // 平台设置模式 //1:游客模式,0:管理模式 status |= (sys_sta.PLT_MODE? 0x02 : 0); // 平台设置模式 //1:游客模式,0:管理模式
status |= (sys_sta.P_Radar_EN? 0x04 : 0); // 1:雷达使能,0:雷达禁止 status |= (sys_sta.P_Radar_EN? 0x04 : 0); // 1:雷达使能,0:雷达禁止
return status; 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){ 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){ switch(param_id){
case ID_HeartBeatInterval:{ 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; break;
} }
case ID_MainServerAddr:{ case ID_MainServerAddr:{
@ -149,27 +161,27 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le
break; break;
} }
case ID_ServerPort:{ 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; break;
} }
case ID_DefaultTimeReportInterval:{ 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; break;
} }
case ID_InflexionAngle:{ 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; break;
} }
case ID_MaxSpeed:{ 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; break;
} }
case ID_ProvinceID:{ 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; break;
} }
case ID_CityID:{ 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; break;
} }
case ID_CarPlateNum:{ case ID_CarPlateNum:{
@ -177,43 +189,43 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le
break; break;
} }
case ID_CarPlateColor:{ case ID_CarPlateColor:{
jt808_term_param_item.set_term_param.CarPlateColor =((uint8_t*)param)[0]; jt808_term_param_item.set_term_param.CarPlateColor =param_val32 & 0xFF;
break;
}
case ID_RadarEN:{// TODO: 雷达使能位
jt808_term_param_item.set_term_param.RadarEN =((uint8_t*)param)[0];
break; break;
} }
case ID_ManagerACC:{ // 管理员模式油门0~100% 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; break;
} }
case ID_TouristACC:{ // 游客模式油门0~100% 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; break;
} }
case ID_SpeedCutACC:{ // 自动减速油门0~100% 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; break;
} }
case ID_BrakeLimit:{ //前进刹车距离 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; break;
} }
case ID_SpeedCutLimit:{ // 前进自动减速刹车距离 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; break;
} }
case ID_BrakeLimit_B:{ // 后退刹车距离 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; break;
} }
case ID_SpeedCutLimit_B:{ // 后退自动减速刹车距离 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; break;
} }
case ID_Ban_Fence_Polygon_Delay_OFF:{ // 禁止围栏报警延时关闭时间, 单位秒 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; break;
} }
default:{ default:{
@ -381,43 +393,46 @@ void jt808_LocReport_param_update(void){
// 更新当前所在位置区域ID // 更新当前所在位置区域ID
uint32_t lat = nmea_ndeg2degree(gps_data.info.lat) * 1e6; uint32_t lat = nmea_ndeg2degree(gps_data.info.lat) * 1e6;
uint32_t lng = nmea_ndeg2degree(gps_data.info.lon) * 1e6; uint32_t lng = nmea_ndeg2degree(gps_data.info.lon) * 1e6;
// lat = 44939236; // lat = 44939236;
// lng = 121369446; // lng = 121369446;
// lat = 34939236; // lat = 34939236;
// lng = 121369446; // 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_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)); Rsp_Bigban_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0002, lat, lng));
if(Rsp_Bigscenic_Fence_Polygon_area_ID == 0){ // 在景区围栏 if((1 == sys_sta.O_door_lock) || (0 == sys_sta.MAG_MODE )){ // 系统运行中
scenic_Fence_Polygon_count++; Rsp_locked_condition = 0; // 复位锁车状态
if(scenic_Fence_Polygon_count >= 10){
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; 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{ }else{
scenic_Fence_Polygon_count = 0; 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; ban_Fence_Polygon_count = 0;
delay_off_count = 0;
} }
} }
} }

View File

@ -15,7 +15,7 @@
#include "local_tts.h" #include "local_tts.h"
#define RADAR_DEBUG_ENABLE 1 #define RADAR_DEBUG_ENABLE 0
#if RADAR_DEBUG_ENABLE #if RADAR_DEBUG_ENABLE
#include "app_uart.h" #include "app_uart.h"