144 lines
4.6 KiB
C++
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
|