104 lines
3.2 KiB
C
104 lines
3.2 KiB
C
#ifndef DATATYPE_H
|
|
#define DATATYPE_H
|
|
#include <QObject>
|
|
#include <QDataStream>
|
|
#include <QByteArray>
|
|
#include <QDebug>
|
|
#include <QBuffer>
|
|
#include <QBuffer>
|
|
#include <QDataStream>
|
|
#include <QByteArray>
|
|
#include <QDebug>
|
|
|
|
struct DataPacket
|
|
{
|
|
quint8 frameHeader; // 帧头 (1 byte)
|
|
quint32 packetSeq; // 包序号 (4 bytes)
|
|
quint16 dataLength; // 数据块长度 (2 bytes)
|
|
quint8 batteryLevel; // 电量 (1 byte)
|
|
quint8 channelCount; // 通道数量 (1 byte)
|
|
qint16 pitchAngle; // 俯仰角 (2 bytes)
|
|
qint16 rollAngle; // 滚动角 (2 bytes)
|
|
qint16 yawAngle; // 偏航角 (2 bytes)
|
|
quint16 ecg; // 心电 (2 bytes)
|
|
quint16 spo2; // 血氧 (2 bytes)
|
|
quint8 reserved1; // 预留1 (1 byte)
|
|
quint8 reserved2; // 预留2 (1 byte)
|
|
quint8 reserved3; // 预留3 (1 byte)
|
|
quint8 reserved4; // 预留4 (1 byte)
|
|
|
|
QByteArray dataBlock; // 数据块 (192 bytes 或 6 bytes)
|
|
quint8 syncSource; // 同步触发源 (1 byte)
|
|
quint8 syncSeq; // 同步触发序号 (1 byte)
|
|
quint8 checksum; // 校验和 (1 byte)
|
|
quint16 packetTail; // 包尾 (2 bytes)
|
|
|
|
// 序列化头部
|
|
void serializeHeader(QDataStream &out )
|
|
{
|
|
out <<frameHeader <<packetSeq << dataLength << batteryLevel << channelCount
|
|
<< pitchAngle << rollAngle << yawAngle << ecg << spo2
|
|
<< reserved1 << reserved2 << reserved3 << reserved4;
|
|
}
|
|
|
|
// 序列化整个数据包
|
|
QByteArray serialize()
|
|
{
|
|
QByteArray buffer;
|
|
QBuffer bufferDevice(&buffer);
|
|
bufferDevice.open(QIODevice::WriteOnly);
|
|
|
|
QDataStream out(&bufferDevice);
|
|
out.setVersion(QDataStream::Qt_5_13);
|
|
|
|
serializeHeader(out); // 序列化头部,但不包括校验和
|
|
out.writeRawData(dataBlock.data(), dataBlock.size());
|
|
out << syncSource << syncSeq;
|
|
out << checksum;
|
|
out << packetTail;
|
|
return buffer;
|
|
}
|
|
|
|
// 反序列化整个数据包
|
|
void deserialize(const QByteArray &buffer) {
|
|
QBuffer bufferDevice(const_cast<QByteArray*>(&buffer));
|
|
bufferDevice.open(QIODevice::ReadOnly);
|
|
|
|
QDataStream in(&bufferDevice);
|
|
in.setVersion(QDataStream::Qt_5_13);
|
|
|
|
in >>frameHeader >> packetSeq >> dataLength >> batteryLevel >> channelCount
|
|
>> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2
|
|
>> reserved1 >> reserved2 >> reserved3 >> reserved4;
|
|
|
|
dataBlock.resize(dataLength);
|
|
in.readRawData(dataBlock.data(), dataLength);
|
|
|
|
in >> syncSource >> syncSeq;
|
|
|
|
in >> checksum;
|
|
|
|
in >> packetTail;
|
|
|
|
|
|
}
|
|
|
|
void deserializeHeader(const QByteArray &buffer)
|
|
{
|
|
QBuffer bufferDevice(const_cast<QByteArray*>(&buffer));
|
|
bufferDevice.open(QIODevice::ReadOnly);
|
|
|
|
QDataStream in(&bufferDevice);
|
|
in.setVersion(QDataStream::Qt_5_13);
|
|
|
|
in >>frameHeader>> packetSeq >> dataLength >> batteryLevel >> channelCount
|
|
>> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2
|
|
>> reserved1 >> reserved2 >> reserved3 >> reserved4;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // DATATYPE_H
|