4G_module/custom/jt808/inc/jt808_set_TermParam.h

248 lines
9.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef JT808_SET_TERM_PARAM_H_
#define JT808_SET_TERM_PARAM_H_
#include "jt808_protocol.h"
#include "jt808_config.h"
#include "jt808_electronic_fence.h"
#pragma pack(1)
// 本地围栏配置结构(用于预置电子围栏)
typedef struct {
uint32_t area_id; // 围栏区域ID
uint16_t area_att; // 区域属性0x0001=景区围栏, 0x0002=禁停区围栏
uint16_t points_num; // 区域顶点数量
AreaPoint_t *points; // 区域顶点坐标支持4边形
} LocalFenceConfig_t;
// 终端参数设置项参数ID
typedef enum {
ID_HeartBeatInterval = 0x0001, // DWORD, 终端心跳发送间隔(s)
ID_MainServerAddr = 0x0013, //STRING, 主服务器地址,IP 或域名
ID_ServerPort = 0x0018, //DWORD, 服务器 TCP 端口
ID_DefaultTimeReportInterval = 0x0029, // DWORD, 缺省时间汇报间隔
ID_InflexionAngle = 0x0030, // DWORD, 拐点补传角度, < 180°
ID_MaxSpeed = 0x0055, // DWORD, 最高速度, km/h.
ID_ProvinceID = 0x0081, // WORD, 车辆所在的省域 ID
ID_CityID = 0x0082, // WORD, 车辆所在的市域 ID
ID_CarPlateNum = 0x0083, //STRING, 公安交通管理部门颁发的机动车号牌
ID_CarPlateColor = 0x0084, //BYTE 车牌颜色,按照 JT/T415-2006 的 5.4.12
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 代表开启 2代表临时关闭
}set_TermParamID_t;
typedef struct{
uint32_t HeartBeatInterval;// DWORD, 终端心跳发送间隔(s)
uint8_t MainServerAddr[20];//STRING, 主服务器地址,IP 或域名
uint32_t ServerPort;//DWORD, 服务器 TCP 端口
uint32_t DefaultTimeReportInterval;// DWORD, 缺省时间汇报间隔
uint32_t InflexionAngle;// DWORD, 拐点补传角度, < 180°
uint32_t MaxSpeed;// DWORD, 最高速度, km/h
uint16_t ProvinceID;// WORD, 车辆所在的省域 ID
uint16_t CityID;// WORD, 车辆所在的市域 ID
uint8_t CarPlateNum[10];//STRING, 公安交通管理部门颁发的机动车号牌
uint8_t CarPlateColor;//车牌颜色,按照 JT/T415-2006 的 5.4.12
uint8_t RadarEN; // 雷达使能位, 0 代表关闭, 1 代表开启
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;
// 支持的附加消息ID
typedef enum{
MileageID = 0x01,// 里程, 1/10km, 对应车上里程表读数, DWORD
OilMassID = 0x02,// 油量, 1/10L, 对应车上油量表读数, WORD
TachographSpeedID = 0x03,// 行驶记录功能获取的速度, 1/10km/h, WORD
AlarmCountID = 0x04,// 需要人工确认报警事件的 ID, 从 1 开始计数, WORD
OverSpeedAlarmID = 0x11,// 超速报警附加信息, BYTE or BYTE+DWORD
AccessAreaAlarmID = 0x12,// 进出区域/路线报警附加信息, BYTE+DWORD+BYTE
DrivingTimeAlarmID = 0x13,// 路段行驶时间不足/过长报警附加信息, DWORD+WORD+BYTE
VehicleSignalStatusID = 0x25,// 扩展车辆信号状态位, DWORD
IoStatusID = 0x2A,// IO 状态位, WORD
AnalogQuantityID = 0x2B,// 模拟量, DWORD
NetworkQuantityID = 0x30,// 无线通信网络信号强度, BYTE
GnssSatellitesID = 0x31,// GNSS 定位卫星数, BYTE
CustomInformationLengthID = 0xE0,// 后续自定义信息长度, BYTE
BAT_VoltageID = 0xE1, // 电池电压, 0.1V WORD
BAT_PercentageID = 0xE2, // 电池电量, % BYTE
Scenic_Fence_Polygon_area_ID = 0xE3, // 当前位置所在景区围栏多边形区域ID, DWORD
Ban_Fence_Polygon_area_ID = 0xE4, // 当前位置所在禁止围栏多边形区域ID, DWORD
Locked_Condition_ID = 0xE7, // 锁车状态, BYTE
}addi_infoID_t;
// big_标记的参数需以大端方式存储需手动转换为大端
typedef struct {// 终端参数项
uint8_t phone_BCDnum[6];// 终端手机号
uint16_t msg_flow_num;// 累加的消息流水号
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; // 解析出的升级信息
LocReport_t big_loc_report; // 位置信息汇报
LocTrackingCtrl_t big_loc_tracking_ctrl; // 临时位置跟踪控制
fence_Polygon_area_t *fence_polygon_area; // 围栏多边形区域
Data_SeriaNet_t big_data_up_SeriaNet; // 数据上行透传
}Term_Param_item_t;
#pragma pack()
// 更新状态枚举
typedef enum {
UPDATE_IDLE, // 空闲状态,无更新进行
UPDATE_REQUEST_SENT, // 更新请求已发送,等待响应
UPDATE_RECEIVING_DATA, // 正在接收数据
UPDATE_COMPLETE, // 最后一包数据接收完成
UPDATE_COMPLETED, // 更新完成
UPDATE_FAILED // 更新失败
} UpdateState_t;
// 更新类型
typedef enum {
UPDATE_TYPE_NONE = 0, // 无更新类型
UPDATE_TYPE_FENCE = 1, // 电子围栏更新
UPDATE_TYPE_ATTR = 2 // 景点更新
} UpdateType_t;
// 全局状态结构体
typedef struct {
UpdateState_t state; // 当前更新状态
UpdateType_t type; // 当前更新类型
uint32_t start_time; // 更新开始时间(系统滴答计数)
uint8_t retry_count; // 重试次数
uint16_t expected_packets;// 预期数据包数量
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;
extern Term_Param_item_t jt808_term_param_item;
extern osThreadFunc_t Autoreport_param_ThreadId;
extern uint8_t Rsp_locked_condition; // 锁车状态, BYTE
extern osMutexId_t Polygon_fence_mutex; // 多边形围栏互斥锁
// 控制车辆状态
void jt808_Set_CarStatus(uint8_t status);
// 获取车辆状态
uint8_t jt808_Get_CarStatus(void);
// 串口数据下传
int8_t jt808_data_down_SeriaNet(uint8_t type, uint8_t *data, uint16_t len);
// 串口数据上传
int8_t jt808_data_up_SeriaNet(uint8_t type, uint8_t *data, uint16_t len);
// 删除终端参数文件
void jt808_delete_TermParam(void);
// 设置终端参数
int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_len);
// 更新自动上报参数
void jt808_LocReport_param_update(void);
// 启动自动上报参数
void jt808_Autoreport_param_start(void);
// 停止自动上报参数
void jt808_Autoreport_param_stop(void);
// 初始化终端参数
void jt808_set_term_param_init(void);
// 函数声明
/**
* @brief 重置更新状态到初始值
*/
void update_manager_reset(void);
/**
* @brief 启动更新流程
* @param type 更新类型 (UPDATE_TYPE_FIRMWARE/UPDATE_TYPE_CONFIG)
*/
void update_manager_start(UpdateType_t type);
/**
* @brief 标记数据接收开始
* @param packet_count 预期接收的总数据包数量
*/
void update_manager_begin_receiving(uint16_t packet_count);
/**
* @brief 标记单个数据包接收完成
* @note 当接收包数达到预期值时自动标记为完成状态
*/
void update_manager_packet_received(void);
/**
* @brief 强制标记更新完成
*/
void update_manager_complete(void);
/**
* @brief 标记更新失败
*/
void update_manager_fail(void);
/**
* @brief 检查更新是否正在进行
* @return true 表示更新活跃中false 表示空闲/完成/失败
*/
_Bool update_manager_is_active(void);
/**
* @brief 检查更新状态是否为"最后一包数据接收完成"
* @return true 表示更新处于"最后一包数据接收完成"状态false 表示其他状态
*/
_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_