增加8104协议,修复雷达关闭即卡死的bug,希望这是最后一次

This commit is contained in:
kkkjtr 2025-09-09 13:26:53 +08:00
parent f440f80db4
commit 799d48d0ed
25 changed files with 214 additions and 154 deletions

View File

@ -106,8 +106,9 @@ static void gps_TaskHandle(void *param){
osMutexRelease(gps_data.mutex);
//nmea_info2pos(&gps_data.info, &gps_data.dpos);
gps_data.flow_num++;
DEBUG("%03d,Lat:%.09f,Lon:%.09f,Sig:%d,Fix:%d,RL=%d\n\n",
it++, gps_data.latitude, gps_data.longitude, gps_data.info.sig, gps_data.info.fix, gps_rev_len
DEBUG("%03d,Lat:%.09f,Lon:%.09f,Sig:%d,Fix:%d,elv:%.09f,PDOP:%.09f,HDOP:%.09f,VDOP:%.09f,inview:%d,inuse:%d,speed:%.09f,direction:%.09f,Sat1Sig:%d,Sat2Sig:%d,Sat3Sig:%d,Sat4Sig:%d,Sat5Sig:%d,RL=%d\n\n",
it++, gps_data.latitude, gps_data.longitude, gps_data.info.sig, gps_data.info.fix, gps_data.info.elv, gps_data.info.PDOP, gps_data.info.HDOP, gps_data.info.VDOP, gps_data.info.satinfo.inview, gps_data.info.satinfo.inuse, gps_data.info.speed, gps_data.info.direction,
gps_data.info.satinfo.sat[0].sig, gps_data.info.satinfo.sat[1].sig, gps_data.info.satinfo.sat[2].sig, gps_data.info.satinfo.sat[3].sig, gps_data.info.satinfo.sat[4].sig, gps_rev_len
);
if((gps_data.info.fix == 1)||(gps_data.info.sig == 0)){ // 不可用

View File

@ -251,7 +251,7 @@ typedef union{
uint32_t IO_TX_brake :1; // 1:正常 0:刹车
uint32_t A_brake :1; // 1:自动刹车,0:手动刹车
uint32_t A_Speed_Cut :1; // 1:自动减速,0:手动减速
uint32_t P_Radar_EN :1; // 1:雷达使能,0:雷达禁止
uint32_t P_Radar_EN :2; // 1:雷达使能,0:雷达禁止
uint32_t retain2 : 3;// 保留10位
};
uint32_t val32;

View File

@ -53,13 +53,13 @@ typedef struct{
uint8_t CarPlateColor;//车牌颜色,按照 JT/T415-2006 的 5.4.12
uint8_t RadarEN; // 雷达使能位, 0 代表关闭, 1 代表开启
uint8_t ManagerACC; // 管理员模式油门0~100%
uint8_t TouristACC; // 游客模式油门0~100%
uint8_t SpeedCutACC; // 自动减速油门0~100%
uint16_t BrakeLimit; //前进刹车距离
uint16_t SpeedCutLimit; // 前进自动减速刹车距离
uint16_t BrakeLimit_B; // 后退刹车距离
uint16_t SpeedCutLimit_B; // 后退自动减速刹车距离
uint32_t ManagerACC; // 管理员模式油门0~100%
uint32_t TouristACC; // 游客模式油门0~100%
uint32_t SpeedCutACC; // 自动减速油门0~100%
uint32_t BrakeLimit; //前进刹车距离
uint32_t SpeedCutLimit; // 前进自动减速刹车距离
uint32_t BrakeLimit_B; // 后退刹车距离
uint32_t SpeedCutLimit_B; // 后退自动减速刹车距离
uint8_t Ban_Fence_Polygon_Delay_OFF; // 禁止围栏延时关闭时间, 单位秒
}set_TermParam_t;
@ -131,6 +131,14 @@ typedef struct {
uint16_t received_packets;// 已接收数据包数量
} UpdateStatus_t;
// 终端参数转化描述结构体
typedef struct {
uint32_t param_id; // 参数ID
size_t offset; // 在set_TermParam_t中的偏移量
uint8_t param_size; // 参数大小
_Bool need_swap; // 是否需要字节序转换
} ParamDescriptor;
// 声明全局变量(在.c文件中定义
extern UpdateStatus_t update_status;
extern osMutexId_t update_mutex;
@ -218,10 +226,23 @@ _Bool update_manager_is_active(void);
*/
_Bool update_manager_is_complete(void);
/**
* @brief
*/
void update_manager_no_update(void);
/**
* @brief set_TermParam_t TermParamlist_t
* @param set_param
* @return NULL
*/
TermParamlist_t* convert_set_term_param_to_list(const set_TermParam_t* set_param);
/**
* @brief
* @param head
*/
void free_param_list(TermParamlist_t* head);
#endif // JT808_SET_TERM_PARAM_H_

View File

@ -87,6 +87,10 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){
}
case ID_GetTermParams:{// 查询终端参数
Result->Rsp_flow_num = Result->msg_head.msg_flow_num;
Result->Rsp_msg_id = Result->msg_head.msg_id;
jt808_pkg_send(ID_GetTermParamsResp, 0);// 发送终端通用应答
break;
}
case ID_GetSpecificTermParams:{// 查询指定终端参数

View File

@ -78,13 +78,67 @@ static int jt808_BodyPackage(JT808_2013_MsgFrame_t *p_MsgFrame, MessageID_t Msg_
break;
}
case ID_GetTermParamsResp:{ // 查询终端参数应答
// p_MsgFrame->msg_head.msgbody_attr.msgbodylen = sizeof(GetTermParamsResp_t);// 消息体长度
// GetTermParamsResp_t *get_term_params_resp = (GetTermParamsResp_t *)jt808_realloc(p_MsgFrame->p_msg_body, sizeof(GetTermParamsResp_t));
// if(get_term_params_resp == NULL){
// JT808_DEBUG("[%s,%s] malloc failed \r\n", __FUNCTION__,__LINE__);
// return -1;
// }
// p_MsgFrame->p_msg_body = (void *)get_term_params_resp;
// 将 set_term_param 转换为链表形式
TermParamlist_t* param_list = convert_set_term_param_to_list(&jt808_term_param_item.set_term_param);
if (param_list == NULL) {
JT808_DEBUG("[%s,%s] convert_set_term_param_to_list failed \r\n", __FUNCTION__,__LINE__);
return -1;
}
// 计算参数总数和消息体长度
uint8_t param_total_num = 0;
uint16_t msgbody_len = 3; // msg_flow_num(2) + param_Total_num(1)
TermParamlist_t* current = param_list;
while (current != NULL) {
param_total_num++;
// 每个参数项参数ID(4) + 参数长度(1) + 参数值(变长)
msgbody_len += 4 + 1 + current->param_len;
current = current->next;
}
// 分配消息体缓冲区
uint8_t* msg_body_buf = (uint8_t*)jt808_malloc(msgbody_len);
if(msg_body_buf == NULL){
JT808_DEBUG("[%s,%s] malloc failed for msg_body_buf \r\n", __FUNCTION__,__LINE__);
free_param_list(param_list);
return -1;
}
// 序列化消息体
uint16_t offset = 0;
// 1. 消息流水号 (2字节)
uint16_t flow_num_be = Swap16(PrsResult.Rsp_flow_num);
memcpy(msg_body_buf + offset, &flow_num_be, 2);
offset += 2;
// 2. 参数总数 (1字节)
msg_body_buf[offset++] = param_total_num;
// 3. 参数项列表
current = param_list;
while (current != NULL) {
// 参数ID (4字节大端)
memcpy(msg_body_buf + offset, &current->param_id, 4);
offset += 4;
// 参数长度 (1字节)
msg_body_buf[offset++] = current->param_len;
// 参数值 (变长)
memcpy(msg_body_buf + offset, current->param_value, current->param_len);
offset += current->param_len;
current = current->next;
}
// 释放参数链表
free_param_list(param_list);
// 设置消息体长度
p_MsgFrame->msg_head.msgbody_attr.msgbodylen = msgbody_len;
p_MsgFrame->p_msg_body =msg_body_buf;
break;
}
case ID_GetTermAttrResp:{ // 查询终端属性应答

View File

@ -39,6 +39,98 @@ UpdateStatus_t update_status = {
};
// 参数描述数组
static const ParamDescriptor param_descriptors[] = {
{ID_HeartBeatInterval, offsetof(set_TermParam_t, HeartBeatInterval), sizeof(uint32_t), 0},
{ID_RadarEN, offsetof(set_TermParam_t, RadarEN), sizeof(uint8_t), 0},
{ID_ManagerACC, offsetof(set_TermParam_t, ManagerACC), sizeof(uint32_t), 0},
{ID_TouristACC, offsetof(set_TermParam_t, TouristACC), sizeof(uint32_t), 0},
{ID_SpeedCutACC, offsetof(set_TermParam_t, SpeedCutACC), sizeof(uint32_t), 0},
{ID_BrakeLimit, offsetof(set_TermParam_t, BrakeLimit), sizeof(uint32_t), 1},
{ID_SpeedCutLimit, offsetof(set_TermParam_t, SpeedCutLimit), sizeof(uint32_t), 1},
{ID_BrakeLimit_B, offsetof(set_TermParam_t, BrakeLimit_B), sizeof(uint32_t), 1},
{ID_SpeedCutLimit_B, offsetof(set_TermParam_t, SpeedCutLimit_B), sizeof(uint32_t), 1},
{ID_Ban_Fence_Polygon_Delay_OFF, offsetof(set_TermParam_t, Ban_Fence_Polygon_Delay_OFF), sizeof(uint8_t), 0},
};
// 释放参数链表
void free_param_list(TermParamlist_t* head) {
TermParamlist_t* current = head;
while (current != NULL) {
TermParamlist_t* next = current->next;
if (current->param_value != NULL) {
jt808_free(current->param_value);
}
jt808_free(current);
current = next;
}
}
// 添加参数到链表
static TermParamlist_t* add_param_to_list(TermParamlist_t* tail,
uint32_t param_id,
const void* param_value,
uint8_t param_len) {
TermParamlist_t* new_node = (TermParamlist_t*)jt808_malloc(sizeof(TermParamlist_t));
if (new_node == NULL) return NULL;
new_node->param_id = Swap32(param_id); // 参数ID转换为大端
new_node->param_len = param_len;
new_node->param_value = jt808_malloc(param_len);
if (new_node->param_value == NULL) {
jt808_free(new_node);
return NULL;
}
memcpy(new_node->param_value, param_value, param_len);
new_node->next = NULL;
if (tail != NULL) {
tail->next = new_node;
}
return new_node;
}
// 简化的参数转换函数
TermParamlist_t* convert_set_term_param_to_list(const set_TermParam_t* set_param) {
TermParamlist_t* head = NULL;
TermParamlist_t* tail = NULL;
// 获取参数描述符数量
size_t num_params = sizeof(param_descriptors) / sizeof(param_descriptors[0]);
for (size_t i = 0; i < num_params; i++) {
const ParamDescriptor* desc = &param_descriptors[i];
const void* param_ptr = (const uint8_t*)set_param + desc->offset;
// 处理需要字节序转换的参数
if (desc->need_swap) {
if (desc->param_size == sizeof(uint16_t)) {
uint16_t value = *(const uint16_t*)param_ptr;
uint16_t be_value = Swap32(value);
param_ptr = &be_value;
}
// 可以添加其他大小的参数处理
}
// 添加参数到链表
TermParamlist_t* new_tail = add_param_to_list(tail, desc->param_id, param_ptr, desc->param_size);
if (new_tail == NULL) {
free_param_list(head);
return NULL;
}
if (head == NULL) {
head = new_tail;
}
tail = new_tail;
}
return head;
}
static void __cm_fota_cb(cm_fota_error_e error)
{
JT808_DEBUG("[FOTA] error code is %d\r\n", error);
@ -402,30 +494,7 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le
}
case ID_RadarEN:{// TODO: 雷达使能位
// JT808_DEBUG("RadarEN=%d", radar_en);
jt808_term_param_item.set_term_param.RadarEN = param_val32 & 0xFF;
if(2 == jt808_term_param_item.set_term_param.RadarEN)
{
JT808_DEBUG("radar ok\r\n");
sys_sta.P_Radar_EN=2;
}
else if(1 == jt808_term_param_item.set_term_param.RadarEN)
{
sys_sta.P_Radar_EN=1;
}
else if(0 == jt808_term_param_item.set_term_param.RadarEN)
{
JT808_DEBUG("radar ok\r\n");
sys_sta.P_Radar_EN=0;
}
jt808_term_param_item.set_term_param.RadarEN = param_val32 & 0xFF;
break;
}
default:{
@ -610,8 +679,12 @@ void jt808_LocReport_param_update(void){
// lat = 34939236;
// lng = 121369446;
flag=jt808_is_fence_empty();
if(0 == flag)
{
JT808_DEBUG("list not null\r\n");
JT808_DEBUG("list not null\r\n");
}
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));
@ -693,7 +766,6 @@ void jt808_LocReport_param_update(void){
}
JT808_DEBUG("list null\r\n");
}
osMutexRelease(term_param_mutex);
@ -840,48 +912,6 @@ void Autoreport_param_Task(void *arg){
}
}
/* if(count_Sec == 90)
{
int ret = 0;
cm_fota_set_ota_plan(CM_FOTA_ASR_PLAN_MINI_INTEGRATE);
cm_fota_res_callback_register((cm_fota_result_callback)__cm_fota_cb);
ret = cm_fota_set_url("https://youyuanmao.oss-cn-shanghai.aliyuncs.com/system_patch.bin"); //仅作为示例url不可使用
cm_fs_system_info_t fs_info = {0, 0};
cm_fs_getinfo(&fs_info);
//文件系统剩余空间为0时不建议执行升级关键文件系统操作可能会失败
if (0 == fs_info.free_size)
{
JT808_DEBUG("insufficient space left in the file system");
return;
}
cm_fota_info_t info = {0};
cm_fota_read_config(&info);
if (CM_FOTA_TYPE_HTTP_HTTPS == info.fixed_info.fota_mode)
{
JT808_DEBUG("HTTP server [%s]", info.fixed_info.url);
}
else if (CM_FOTA_TYPE_FTP == info.fixed_info.fota_mode)
{
JT808_DEBUG("FTP server [%s] [%s] [%s]", info.fixed_info.url, info.fixed_info.username, info.fixed_info.passwd);
}
else
{
JT808_DEBUG("HTTP server error");
return;
}
osDelay(200);
cm_fota_exec_upgrade();
}
*/
count_Sec++;
osDelay(1000/5); // 1S
}
@ -931,7 +961,7 @@ void jt808_set_term_param_init(void){
// memcpy(jt808_term_param_item.big_term_attr_resp.term_ICCID+4, jt808_term_param_item.phone_BCDnum, 6); // 终端手机号码 但是你照这个来云端收到的iccid全是因为BCDnum参数本身没有初始化
char str_hw_ver[] = "1.0.0"; // 硬件版本
char str_fw_ver[] = "1.2.2"; // 固件版本 原本为1.0.0
char str_fw_ver[] = "1.2.3"; // 固件版本 原本为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)); // 硬件版本
@ -957,7 +987,7 @@ void jt808_set_term_param_init(void){
}else{
jt808_term_param_item.set_term_param.HeartBeatInterval = 30; // 心跳包间隔(秒)
#if 1
char ServerAddr[] ="47.99.118.34"; // 三一服务器地址 106.15.224.140 测试服务器地址 47.99.118.34
char ServerAddr[] ="106.15.224.140"; // 三一服务器地址 106.15.224.140 测试服务器地址 47.99.118.34
uint32_t ServerPort = 5000; // 服务器端口
#else
char ServerAddr[] ="106.14.30.23"; // 生产服务器地址

View File

@ -2,7 +2,8 @@
#define _RADAR_H
#include "cm_os.h"
#define RADAR_BUFF_MAX 9
//#define RADAR_STA jt808_term_param_item.set_term_param.RadarEN // 雷达使能位, 0 代表关闭, 1 代表开启
typedef struct radar_daraframe{
volatile uint16_t Front_data;

View File

@ -15,7 +15,7 @@
#include "local_tts.h"
#define RADAR_DEBUG_ENABLE 0
#define RADAR_DEBUG_ENABLE 1
#if RADAR_DEBUG_ENABLE
#include "app_uart.h"
@ -27,8 +27,7 @@
static osThreadId_t os_RADAR_ThreadId;
radar_data_t radar_data;
osMutexId_t radar_mutex; // 互斥锁
uint8_t old_state = 0;
/******************************************************************************
* Name: CRC-16/MODBUS
* Poly: 0x8005 ( x16+x15+x2+1 )
@ -132,9 +131,14 @@ static void RADAR_TaskHandle(void *param){
uint8_t temp_count =0;
uint32_t time_count =0;
while(1){
// sys_sta.P_Radar_EN=jt808_term_param_item.set_term_param.RadarEN;
if(old_state != jt808_term_param_item.set_term_param.RadarEN)
{
sys_sta.P_Radar_EN = jt808_term_param_item.set_term_param.RadarEN;
}
DEBUG("radar task init\r\n");
if(0==sys_sta.P_Radar_EN)
{
sys_sta.A_Speed_Cut =0; // 清空自动减速状态
@ -167,7 +171,7 @@ static void RADAR_TaskHandle(void *param){
// 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);
DEBUG("radar 1\r\n"); // 任务结束
// DEBUG("radar 1\r\n"); // 任务结束
}else{
sys_sta.A_Speed_Cut =0; // 清空自动减速状态
sys_sta.A_brake =0; // 清空自动刹车状态
@ -175,9 +179,6 @@ static void RADAR_TaskHandle(void *param){
}
}
else if (2==sys_sta.P_Radar_EN)
@ -189,7 +190,7 @@ static void RADAR_TaskHandle(void *param){
if(time_count>=400)
{
sys_sta.P_Radar_EN=1;
sys_sta.P_Radar_EN = 1;
time_count=0;
@ -200,7 +201,7 @@ static void RADAR_TaskHandle(void *param){
}
old_state = jt808_term_param_item.set_term_param.RadarEN;
osMutexRelease(radar_mutex);
osDelay(140/5); // 140ms
}

View File

@ -14,7 +14,7 @@
#include "attr_broadcast.h"
#define TCP_CLIENT_ENABLE 1
#define TCP_CLIENT_ENABLE 0
#if TCP_CLIENT_ENABLE
#include "app_uart.h"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,10 +0,0 @@
ML307A-DSLN/ML307A-GCLN/ML307A-GSLN/ML305A-DS等型号均可在1.4.2版本至1.4.3版本上进行跨SDK版本最小系统FOTA升级升级方法参见《固件升级开发指导手册》
受限于模组flash剩余空间较少ML307A-GCLN无法通过常规的最小系统FOTA的方式从SDK 1.4.2版本升级至SDK1.4.3版本,需在调整升级包切片大小的基础上进行升级,方式如下
基础升级包基础制作方式参见《固件升级开发指导手册》
制作升级包时,除使用基础支持方式外,需要使用-s命令将升级包切片大小设置为0x20000即添加命令-s 20000示例如下
adiff.exe system_old.img system_new.img system_patch.bin -a1 user_app user_app.bin -m -s 20000
受限于模组flash剩余空间不足ML307A-DCLN/ML305A-DC无法通过最小系统FOTA的方式从SDK 1.4.2版本升级至SDK1.4.3版本

Binary file not shown.

Binary file not shown.

View File

@ -1,24 +0,0 @@
[Image_List]
Number_of_Images = 4
1_Image_Enable = 1
1_Image_Image_ID = 0x30
1_Image_Path = system.img
1_Image_Flash_Entry_Address = 0x00024000
1_Image_ID_Name = 1
2_Image_Enable = 1
2_Image_Image_ID = 0x31
2_Image_Path = app.bin
2_Image_Flash_Entry_Address = 0x006DD000
2_Image_ID_Name = 2
3_Image_Enable = 1
3_Image_Image_ID = 0x32
3_Image_Path = cusapp.bin
3_Image_Flash_Entry_Address = 0x008DD000
3_Image_ID_Name = 3
4_Image_Enable = 1
4_Image_Image_ID = 0x33
4_Image_Path = logoapp.bin
4_Image_Flash_Entry_Address = 0x009DD000
4_Image_ID_Name = 4

View File

@ -1,6 +0,0 @@
@echo off
del /s /q /f fbf_dfota.bin
del /s /q /f a\patchfolder\*
FBFMake_CF_V1.5.exe -o fbf_dfota.bin -f system.img -r 147456 -d 0x10000 -a a -b b

View File

@ -1,6 +0,0 @@
@echo off
del /s /q /f fbf_dfota.bin
del /s /q /f a\patchfolder\*
FBFMake_CF_V1.6-150.exe -f config -d 0x10000 -a a -b b -o fbf_dfota.bin -q

View File

@ -1,6 +0,0 @@
@echo off
del /s /q /f fbf_dfota.bin
del /s /q /f a\patchfolder\*
FBFMake_CF_V1.6-150.exe -o fbf.bin -f config -a a -b a

BIN
tools/adiff/system_new.img Normal file

Binary file not shown.

BIN
tools/adiff/system_old.img Normal file

Binary file not shown.

Binary file not shown.

BIN
tools/adiff/user_app.bin Normal file

Binary file not shown.