kunlang_tbox/include/business/tbox/tbox_data_manager.h

750 lines
22 KiB
C
Raw Normal View History

2025-12-11 09:08:35 +08:00
#pragma once
#include <linux/can.h>
#include <algorithm>
#include <cstdint>
#include <cstring>
#include <mutex>
#include <string>
#include <vector>
#include "utils.h"
// 整车数据
struct VehicleData
{
uint8_t vehicle_status; // 车辆状态
uint8_t charge_status; // 充电状态
uint8_t run_mode; // 运行模式
uint16_t speed; // 车速
uint32_t mileage; // 累计里程
uint16_t total_voltage; // 总电压
uint16_t total_current; // 总电流
uint8_t soc; // 电池SOC
uint8_t dc_dc_status; // DC-DC状态
uint8_t gear; // 档位
uint16_t insulation_resistance; // 绝缘电阻
uint8_t accel_pedal; // 油门踏板
uint8_t brake_pedal; // 制动踏板
VehicleData() { std::memset(this, 0xFF, sizeof(VehicleData)); }
// TLV 编码
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
// 类型固定为 0x01整车数据
result.push_back(0x01);
// 按字段顺序打包数据
result.push_back(vehicle_status);
result.push_back(charge_status);
result.push_back(run_mode);
result.push_back((speed >> 8) & 0xFF); // 高字节
result.push_back(speed & 0xFF); // 低字节
result.push_back((mileage >> 24) & 0xFF);
result.push_back((mileage >> 16) & 0xFF);
result.push_back((mileage >> 8) & 0xFF);
result.push_back(mileage & 0xFF);
result.push_back((total_voltage >> 8) & 0xFF);
result.push_back(total_voltage & 0xFF);
result.push_back((total_current >> 8) & 0xFF);
result.push_back(total_current & 0xFF);
result.push_back(soc);
result.push_back(dc_dc_status);
result.push_back(gear);
result.push_back((insulation_resistance >> 8) & 0xFF);
result.push_back(insulation_resistance & 0xFF);
result.push_back(accel_pedal);
result.push_back(brake_pedal);
return result;
}
};
// 电机数据
struct MotorData
{
uint8_t seq; // 驱动电机序号
uint8_t status; // 电机状态
uint8_t controller_temp; // 控制器温度
uint16_t speed; // 转速
uint16_t torque; // 转矩
uint8_t motor_temp; // 电机温度
uint16_t input_voltage; // 控制器输入电压
uint16_t dc_current; // 控制器直流母线电流
MotorData() { std::memset(this, 0xFF, sizeof(MotorData)); }
// 编码单个电机
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(seq);
result.push_back(status);
result.push_back(controller_temp);
result.push_back((speed >> 8) & 0xFF);
result.push_back(speed & 0xFF);
result.push_back((torque >> 8) & 0xFF);
result.push_back(torque & 0xFF);
result.push_back(motor_temp);
result.push_back((input_voltage >> 8) & 0xFF);
result.push_back(input_voltage & 0xFF);
result.push_back((dc_current >> 8) & 0xFF);
result.push_back(dc_current & 0xFF);
return result;
}
};
struct VehicleMotors
{
std::vector<MotorData> motors; // 驱动电机列表
VehicleMotors() { motors.resize(2); } // 默认支持 2 台电机
// 编码整个驱动电机信息体 (0x02)
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x02); // 类型标识
result.push_back(static_cast<uint8_t>(motors.size())); // 电机数量
for (const auto& m : motors)
{
auto motor_bytes = m.encode();
result.insert(result.end(), motor_bytes.begin(), motor_bytes.end());
}
return result;
}
};
// 车辆位置信息
struct VehiclePosition
{
uint8_t status; // 定位状态位
uint32_t longitude; // 经度 × 10^6
uint32_t latitude; // 纬度 × 10^6
uint16_t heading; // 方向 0~359, 精度0.1°
VehiclePosition() { std::memset(this, 0xFF, sizeof(VehiclePosition)); }
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x05); // 类型标识
result.push_back(status); // 状态字节
// 经度
result.push_back((longitude >> 24) & 0xFF);
result.push_back((longitude >> 16) & 0xFF);
result.push_back((longitude >> 8) & 0xFF);
result.push_back(longitude & 0xFF);
// 纬度
result.push_back((latitude >> 24) & 0xFF);
result.push_back((latitude >> 16) & 0xFF);
result.push_back((latitude >> 8) & 0xFF);
result.push_back(latitude & 0xFF);
// 方向
result.push_back((heading >> 8) & 0xFF);
result.push_back(heading & 0xFF);
return result;
}
};
// 极值数据
struct ExtremeData
{
uint8_t highest_voltage_subsys; // 最高电压子系统号
uint16_t highest_voltage_cell; // 最高电压单体代号
uint16_t highest_voltage_value; // 电池单体电压最高值
uint8_t lowest_voltage_subsys; // 最低电压子系统号
uint16_t lowest_voltage_cell; // 最低电压单体代号
uint16_t lowest_voltage_value; // 电池单体电压最低值
uint8_t highest_temp_subsys; // 最高温度子系统号
uint8_t highest_temp_probe; // 最高温度探针序号
uint8_t highest_temp_value; // 最高温度值
uint8_t lowest_temp_subsys; // 最低温度子系统号
uint8_t lowest_temp_probe; // 最低温度探针序号
uint8_t lowest_temp_value; // 最低温度值
ExtremeData() { std::memset(this, 0xFF, sizeof(ExtremeData)); }
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x06); // 类型标识
result.push_back(highest_voltage_subsys);
result.push_back((highest_voltage_cell >> 8) & 0xFF);
result.push_back(highest_voltage_cell & 0xFF);
result.push_back((highest_voltage_value >> 8) & 0xFF);
result.push_back(highest_voltage_value & 0xFF);
result.push_back(lowest_voltage_subsys);
result.push_back((lowest_voltage_cell >> 8) & 0xFF);
result.push_back(lowest_voltage_cell & 0xFF);
result.push_back((lowest_voltage_value >> 8) & 0xFF);
result.push_back(lowest_voltage_value & 0xFF);
result.push_back(highest_temp_subsys);
result.push_back(highest_temp_probe);
result.push_back(highest_temp_value);
result.push_back(lowest_temp_subsys);
result.push_back(lowest_temp_probe);
result.push_back(lowest_temp_value);
return result;
}
};
// 报警数据
struct AlarmData
{
uint8_t highest_level; // 最高报警等级
uint32_t common_flags; // 通用报警标志
uint8_t n1; // 可充电储能装置故障总数
std::vector<uint32_t> battery_fault_codes; // 电池故障代码列表 (4*N1)
uint8_t n2; // 驱动电机故障总数
std::vector<uint32_t> motor_fault_codes; // 驱动电机故障代码列表 (4*N2)
uint8_t n3; // 发动机故障总数
std::vector<uint32_t> engine_fault_codes; // 发动机故障代码列表 (4*N3)
uint8_t n4; // 其他故障总数
std::vector<uint32_t> other_fault_codes; // 其他故障代码列表 (4*N4)
uint8_t n5; // 普通故障总数
std::vector<uint32_t> normal_fault_codes; // 普通故障代码列表 (4*N5)
AlarmData() : highest_level(0xFF), common_flags(0xFFFFFFFF), n1(0), n2(0), n3(0), n4(0), n5(0)
{
// 清空所有 vector防止残留旧数据
battery_fault_codes.clear();
motor_fault_codes.clear();
engine_fault_codes.clear();
other_fault_codes.clear();
normal_fault_codes.clear();
}
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x07); // 类型标识
result.push_back(highest_level);
// 通用报警标志DWORD
result.push_back((common_flags >> 24) & 0xFF);
result.push_back((common_flags >> 16) & 0xFF);
result.push_back((common_flags >> 8) & 0xFF);
result.push_back(common_flags & 0xFF);
// 电池故障
result.push_back(n1);
for (uint32_t code : battery_fault_codes)
{
result.push_back((code >> 24) & 0xFF);
result.push_back((code >> 16) & 0xFF);
result.push_back((code >> 8) & 0xFF);
result.push_back(code & 0xFF);
}
// 驱动电机故障
result.push_back(n2);
for (uint32_t code : motor_fault_codes)
{
result.push_back((code >> 24) & 0xFF);
result.push_back((code >> 16) & 0xFF);
result.push_back((code >> 8) & 0xFF);
result.push_back(code & 0xFF);
}
// 发动机故障
result.push_back(n3);
for (uint32_t code : engine_fault_codes)
{
result.push_back((code >> 24) & 0xFF);
result.push_back((code >> 16) & 0xFF);
result.push_back((code >> 8) & 0xFF);
result.push_back(code & 0xFF);
}
// 其他故障
result.push_back(n4);
for (uint32_t code : other_fault_codes)
{
result.push_back((code >> 24) & 0xFF);
result.push_back((code >> 16) & 0xFF);
result.push_back((code >> 8) & 0xFF);
result.push_back(code & 0xFF);
}
// 普通故障
result.push_back(n5);
for (uint32_t code : normal_fault_codes)
{
result.push_back((code >> 24) & 0xFF);
result.push_back((code >> 16) & 0xFF);
result.push_back((code >> 8) & 0xFF);
result.push_back(code & 0xFF);
}
return result;
}
};
// 故障池
struct FaultPool
{
struct FaultItem
{
uint32_t code; // 故障码(唯一)
uint8_t ecu; // 来自哪个 ECU
uint8_t level; // 故障等级
uint64_t last_seen_ts; // 上次收到该故障的时间
};
mutable std::mutex mutex;
std::vector<FaultItem> items;
// 新故障 or 刷新已有故障
void add_or_update(uint8_t ecu, uint8_t level, uint32_t code)
{
std::lock_guard<std::mutex> lock(mutex);
uint64_t now = common::get_timestamp_ms();
for (auto& f : items)
{
if (f.code == code && f.ecu == ecu)
{
f.level = level;
f.last_seen_ts = now;
return;
}
}
// 新故障
items.push_back({code, ecu, level, now});
}
// 超时自动清除故障(例如 500ms 未收到 → 故障消失)
void purge_timeout(uint64_t timeout_ms)
{
std::lock_guard<std::mutex> lock(mutex);
uint64_t now = common::get_timestamp_ms();
items.erase(std::remove_if(items.begin(), items.end(),
[&](const FaultItem& f) { return (now - f.last_seen_ts > timeout_ms); }),
items.end());
}
// 获取快照(线程安全)
std::vector<FaultItem> snapshot() const
{
std::lock_guard<std::mutex> lock(mutex);
return items; // 拷贝副本
}
};
// 可充电储能装置电压数据
struct BatteryUnit
{
uint16_t voltage; // 单体电池电压
BatteryUnit() : voltage(0xFFFF) {} // 默认无效
};
struct StorageSubsystem
{
uint8_t subsystem_id; // 可充电储能子系统号
uint16_t voltage; // 储能装置总电压
uint16_t current; // 储能装置总电流
uint16_t total_cells; // 单体电池总数
uint16_t start_cell_index; // 本帧起始电池序号
uint16_t frame_cells; // 本帧单体电池数量
std::vector<BatteryUnit> cells; // 单体电池电压列表
StorageSubsystem()
: subsystem_id(0xFF), voltage(0xFFFF), current(0xFFFF), total_cells(0), start_cell_index(0xFFFF), frame_cells(0)
{
cells.clear(); // 空容器,防止脏数据
}
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(subsystem_id);
result.push_back((voltage >> 8) & 0xFF);
result.push_back(voltage & 0xFF);
result.push_back((current >> 8) & 0xFF);
result.push_back(current & 0xFF);
result.push_back((total_cells >> 8) & 0xFF);
result.push_back(total_cells & 0xFF);
result.push_back((start_cell_index >> 8) & 0xFF);
result.push_back(start_cell_index & 0xFF);
result.push_back((frame_cells >> 8) & 0xFF);
result.push_back(frame_cells & 0xFF);
for (const auto& cell : cells)
{
result.push_back((cell.voltage >> 8) & 0xFF);
result.push_back(cell.voltage & 0xFF);
}
return result;
}
};
struct StorageVoltageData
{
static constexpr uint8_t kSubsystemCount = 1; // 现实世界:只有 1 个储能系统
uint8_t subsystem_count; // 对外上报给 GB32960 的字段
StorageSubsystem subsystem; // 唯一子系统
StorageVoltageData() : subsystem_count(kSubsystemCount)
{
// 协议现实EV 默认 1
subsystem.subsystem_id = 1;
subsystem.start_cell_index = 1;
}
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x08); // 类型标识
result.push_back(subsystem_count);
auto sub_bytes = subsystem.encode();
result.insert(result.end(), sub_bytes.begin(), sub_bytes.end());
return result;
}
};
// 可充电储能装置温度数据
struct TemperatureProbe
{
uint8_t temp; // 温度值
TemperatureProbe() : temp(0xFF) {} // 默认无效
};
struct StorageTempSubsystem
{
uint8_t subsystem_id; // 可充电储能子系统号
uint16_t probe_count; // 温度探针个数
std::vector<TemperatureProbe> probes; // 探针列表
StorageTempSubsystem() : subsystem_id(0xFF), probe_count(0)
{
probes.clear(); // 空容器,防止脏数据
}
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(subsystem_id);
result.push_back((probe_count >> 8) & 0xFF);
result.push_back(probe_count & 0xFF);
for (const auto& p : probes) { result.push_back(p.temp); }
return result;
}
};
struct StorageTempData
{
static constexpr uint8_t kSubsystemCount = 1;
uint8_t subsystem_count; // 可充电储能子系统个数
StorageTempSubsystem subsystem; // 唯一子系统
StorageTempData() : subsystem_count(kSubsystemCount)
{
subsystem.subsystem_id = 1; // 与电压侧保持一致
}
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x09); // 类型标识
result.push_back(subsystem_count);
auto sub_bytes = subsystem.encode();
result.insert(result.end(), sub_bytes.begin(), sub_bytes.end());
return result;
}
};
// 驱动/制动数据
struct DriveBrakeData
{
uint16_t speed; // 车速
uint16_t reserved1; // 预留
uint16_t accel_opening; // 油门开度
uint16_t torque; // 扭矩
uint16_t brake_opening; // 制动踏板开度
uint16_t deceleration; // 减速度
uint8_t parking_status; // 驻车状态反馈
uint16_t wheel_speed1; // 轮速1
uint16_t wheel_speed2; // 轮速2
uint16_t wheel_speed3; // 轮速3
uint16_t wheel_speed4; // 轮速4
uint8_t reserved_status1; // 预留状态1
uint8_t reserved_status2; // 预留状态2
uint8_t reserved_status3; // 预留状态3
uint16_t reserved_status4; // 预留状态4
uint16_t reserved_status5; // 预留状态5
uint16_t reserved_status6; // 预留状态6
DriveBrakeData() { std::memset(this, 0xFF, sizeof(DriveBrakeData)); }
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x85); // 类型标识
auto pushWord = [&](uint16_t val)
{
result.push_back((val >> 8) & 0xFF);
result.push_back(val & 0xFF);
};
// 按顺序编码
pushWord(speed);
pushWord(reserved1);
pushWord(accel_opening);
pushWord(torque);
pushWord(brake_opening);
pushWord(deceleration);
result.push_back(parking_status);
pushWord(wheel_speed1);
pushWord(wheel_speed2);
pushWord(wheel_speed3);
pushWord(wheel_speed4);
result.push_back(reserved_status1);
result.push_back(reserved_status2);
result.push_back(reserved_status3);
pushWord(reserved_status4);
pushWord(reserved_status5);
pushWord(reserved_status6);
return result;
}
};
// 轮胎数据
struct TireInfo
{
uint8_t position; // 轮胎位置
uint16_t pressure; // 胎压
uint8_t temperature; // 胎温
uint16_t angle; // 转向角度
uint8_t warning; // 轮胎预警
uint8_t reserved1; // 预留状态1
uint8_t reserved2; // 预留状态2
uint16_t reserved3; // 预留状态3
uint16_t reserved4; // 预留状态4
TireInfo() { std::memset(this, 0xFF, sizeof(TireInfo)); }
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(position);
result.push_back((pressure >> 8) & 0xFF);
result.push_back(pressure & 0xFF);
result.push_back(temperature);
result.push_back((angle >> 8) & 0xFF);
result.push_back(angle & 0xFF);
result.push_back(warning);
result.push_back(reserved1);
result.push_back(reserved2);
result.push_back((reserved3 >> 8) & 0xFF);
result.push_back(reserved3 & 0xFF);
result.push_back((reserved4 >> 8) & 0xFF);
result.push_back(reserved4 & 0xFF);
return result;
}
};
struct TireData
{
uint8_t tire_count; // 轮胎数量
std::vector<TireInfo> tires; // 轮胎列表
TireData() : tire_count(0) { tires.clear(); }
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x86); // 类型标识
result.push_back(tire_count);
for (const auto& t : tires)
{
auto tire_bytes = t.encode();
result.insert(result.end(), tire_bytes.begin(), tire_bytes.end());
}
return result;
}
};
// 前域开关数据
struct FrontSwitchData
{
std::vector<uint8_t> switches; // 0x01 ~ 0x17 共 23 个参数
FrontSwitchData()
{
switches.resize(0x17, 0xFF); // 默认全部无效
}
void setParam(uint8_t id, uint8_t value)
{
if (id >= 1 && id <= 0x17) { switches[id - 1] = value; }
}
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
// 先统计有效参数
uint8_t count = 0;
for (auto v : switches)
if (v != 0xFF) ++count;
// 如果一个有效开关都没有
if (count == 0) return result;
result.reserve(2 + count * 2);
result.push_back(0x87); // 类型标识
result.push_back(count); // 实际参数个数
for (uint8_t id = 1; id <= 0x17; ++id)
{
uint8_t v = switches[id - 1];
if (v == 0xFF) continue;
result.push_back(id);
result.push_back(v);
}
return result;
}
};
// 整车数据补充
struct VehicleFullData
{
uint8_t control_mode; // 车辆控制模式
uint8_t emergency_btn; // 紧急按钮状态
uint16_t speed_limit; // 车辆限速
uint8_t lock_status; // 锁车状态
uint32_t total_charge; // 车辆累计充电量
uint8_t reserved1; // 预留状态1
uint8_t reserved2; // 预留状态2
uint8_t reserved3; // 预留状态3
uint16_t reserved4; // 预留状态4
uint16_t reserved5; // 预留状态5
uint16_t reserved6; // 预留状态6
VehicleFullData() { std::memset(this, 0xFF, sizeof(VehicleFullData)); }
std::vector<uint8_t> encode() const
{
std::vector<uint8_t> result;
result.push_back(0x88); // 类型标识
result.push_back(control_mode);
result.push_back(emergency_btn);
// WORD 高字节在前
result.push_back((speed_limit >> 8) & 0xFF);
result.push_back(speed_limit & 0xFF);
result.push_back(lock_status);
// DWORD 高字节在前
result.push_back((total_charge >> 24) & 0xFF);
result.push_back((total_charge >> 16) & 0xFF);
result.push_back((total_charge >> 8) & 0xFF);
result.push_back(total_charge & 0xFF);
result.push_back(reserved1);
result.push_back(reserved2);
result.push_back(reserved3);
result.push_back((reserved4 >> 8) & 0xFF);
result.push_back(reserved4 & 0xFF);
result.push_back((reserved5 >> 8) & 0xFF);
result.push_back(reserved5 & 0xFF);
result.push_back((reserved6 >> 8) & 0xFF);
result.push_back(reserved6 & 0xFF);
return result;
}
};
// 数据结构体定义
extern VehicleData current_vehicle_data;
extern std::mutex vehicle_data_mutex;
extern VehicleMotors current_vehicle_motors;
extern std::mutex vehicle_motors_mutex;
extern VehiclePosition current_vehicle_position;
extern std::mutex vehicle_position_mutex;
extern ExtremeData current_extreme_data;
extern std::mutex extreme_data_mutex;
extern AlarmData current_alarm_data;
extern std::mutex alarm_data_mutex;
extern StorageVoltageData current_storage_voltage_data;
extern std::mutex storage_voltage_mutex;
extern StorageTempData current_storage_temp_data;
extern std::mutex storage_temp_mutex;
extern std::vector<uint8_t> current_autodata;
extern std::mutex autodata_mutex;
extern DriveBrakeData current_drive_brake_data;
extern std::mutex drive_brake_mutex;
extern TireData current_tire_data;
extern std::mutex tire_data_mutex;
extern FrontSwitchData current_front_switch_data;
extern std::mutex front_switch_mutex;
extern VehicleFullData current_vehicle_full_data;
extern std::mutex vehicle_full_mutex;
void handle_can_msg(const can_frame& frame); // 处理 CAN 消息
std::vector<uint8_t> buildTboxRealtimePayload();