Files
gcs-nf/App/ToolsUI/Payload/dev/payload_protocol.h
T
2026-06-15 08:18:27 +08:00

144 lines
4.6 KiB
C++

#ifndef PAYLOAD_PROTOCOL_H
#define PAYLOAD_PROTOCOL_H
#include <QObject>
#include <QVector>
#include <QByteArray>
#include <QString>
#include <QList>
#include <QArrayData>
#include <QtGlobal>
#include <stdexcept>
namespace payload_protocol {
// 设备类型枚举
enum class DeviceType : quint8 {
UV_WARNING = 0x02, // 紫外告警设备
RADAR_WARNING = 0x03, // 雷达告警设备 (协议中未明确给出,假设为0x03)
JAMMER = 0x04 // 干扰弹设备 (协议中未明确给出,假设为0x04)
};
// 通信方向
enum class Direction {
UPLINK, // 上行:地面站 -> 靶机 -> 载荷
DOWNLINK // 下行:载荷 -> 靶机 -> 地面站
};
// 校验类型
enum class ChecksumType {
ADDITIVE, // 累加和校验(紫外、雷达告警)
DUAL_ADD_XOR // 双校验:累加和+异或(干扰弹)
};
// 协议异常类 - 使用 QString
class ProtocolException : public std::runtime_error {
public:
explicit ProtocolException(const QString& message)
: std::runtime_error(message.toStdString()) {}
};
// 基础帧结构 - 使用 QByteArray
struct BaseFrame {
virtual ~BaseFrame() = default;
virtual QByteArray serialize() const = 0;
virtual bool deserialize(const QByteArray& data) = 0;
virtual bool validateChecksum(const QByteArray& data) const = 0;
};
// 校验计算工具类
class ChecksumCalculator {
public:
// 计算累加和校验(取低8位)
static quint8 calculateAdditiveChecksum(const QByteArray& data,
qint32 start = 0,
qint32 length = 0) {
if (length == 0) length = data.size();
quint16 sum = 0;
for (qint32 i = start; i < start + length && i < data.size(); ++i) {
sum += static_cast<quint8>(data.at(i));
}
return static_cast<quint8>(sum & 0xFF);
}
// 计算异或校验
static quint8 calculateXorChecksum(const QByteArray& data,
qint32 start = 0,
qint32 length = 0) {
if (length == 0) length = data.size();
quint8 xor_value = 0;
for (qint32 i = start; i < start + length && i < data.size(); ++i) {
xor_value ^= static_cast<quint8>(data.at(i));
}
return xor_value;
}
// 验证累加和校验
static bool verifyAdditiveChecksum(const QByteArray& data,
qint32 checksum_pos) {
if (checksum_pos >= data.size()) return false;
quint8 calculated = calculateAdditiveChecksum(data, 0, checksum_pos);
return calculated == static_cast<quint8>(data.at(checksum_pos));
}
// 验证双校验(累加和+异或)
static bool verifyDualChecksum(const QByteArray& data,
qint32 additive_pos,
qint32 xor_pos) {
if (additive_pos >= data.size() || xor_pos >= data.size()) return false;
quint8 calc_additive = calculateAdditiveChecksum(data, 0, additive_pos);
quint8 calc_xor = calculateXorChecksum(data, 0, additive_pos);
return (calc_additive == static_cast<quint8>(data.at(additive_pos))) &&
(calc_xor == static_cast<quint8>(data.at(xor_pos)));
}
};
// 帧头常量定义
namespace FrameHeaders {
// 紫外告警帧头
constexpr quint8 UV_HEADER1 = 0xDD;
constexpr quint8 UV_HEADER2 = 0x77;
// 雷达告警帧头 (EB 90,注意字节序)
constexpr quint8 RADAR_HEADER1 = 0xEB;
constexpr quint8 RADAR_HEADER2 = 0x90;
// 干扰弹上行帧头
constexpr quint8 JAMMER_UPLINK_HEADER1 = 0xE8;
constexpr quint8 JAMMER_UPLINK_HEADER2 = 0xD7;
// 干扰弹下行帧头
constexpr quint8 JAMMER_DOWNLINK_HEADER1 = 0xE6;
constexpr quint8 JAMMER_DOWNLINK_HEADER2 = 0xD5;
}
// 协议版本信息
struct ProtocolVersion {
quint8 major;
quint8 minor;
quint16 year;
quint8 month;
static ProtocolVersion current() {
return {1, 0, 2025, 12}; // 基于文档日期 2025年12月
}
};
// 接口要求结构 - 使用 QList 替代 std::vector
struct InterfaceRequirements {
quint8 serial_port; // 串口号
quint32 baud_rate; // 波特率
QList<quint8> pins; // 使用针脚
InterfaceRequirements() : serial_port(0), baud_rate(0) {}
InterfaceRequirements(quint8 port, quint32 baud, const QList<quint8>& pin_list)
: serial_port(port), baud_rate(baud), pins(pin_list) {}
};
} // namespace payload_protocol
#endif // PAYLOAD_PROTOCOL_H