2025-07-14 17:35:53 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
#include <QVariant>
|
|
|
|
|
#include <QJsonObject>
|
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD>л<EFBFBD>ʵ<EFBFBD><CAB5>
|
|
|
|
|
/// </summary>
|
|
|
|
|
class Serializable {
|
|
|
|
|
public:
|
|
|
|
|
virtual ~Serializable() = default;
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="obj"></param>
|
2025-07-15 14:46:51 +00:00
|
|
|
|
virtual void loadFrom(const QJsonObject& obj) = 0;
|
2025-07-14 17:35:53 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD>л<EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="obj"></param>
|
2025-07-15 14:46:51 +00:00
|
|
|
|
virtual void saveTo(QJsonObject& obj) const = 0;
|
2025-07-14 17:35:53 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
virtual std::shared_ptr<Serializable> newDefault() const = 0;
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-15 15:00:11 +00:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20>ڲ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
enum class DataType {
|
2025-07-15 16:24:48 +00:00
|
|
|
|
ValueSequenceString,
|
2025-07-15 15:00:11 +00:00
|
|
|
|
TextString,
|
2025-07-17 16:17:39 +00:00
|
|
|
|
Int64, // 64λ<34><CEBB><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-15 15:00:11 +00:00
|
|
|
|
Flt32,
|
|
|
|
|
Dbl64,
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-14 17:35:53 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD>뵥Ԫ<EBB5A5><D4AA><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
|
|
|
|
|
/// </summary>
|
2025-07-15 15:00:11 +00:00
|
|
|
|
class ExtractUnit : public Serializable {
|
2025-07-14 17:35:53 +00:00
|
|
|
|
public:
|
2025-07-15 15:00:11 +00:00
|
|
|
|
virtual ~ExtractUnit() = default;
|
2025-07-14 17:35:53 +00:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
virtual QString name() const = 0;
|
|
|
|
|
|
2025-07-15 16:24:48 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
virtual DataType outType() const = 0;
|
|
|
|
|
|
2025-07-14 17:35:53 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ԫ<EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
virtual int offsetFromPrevious() const = 0;
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
virtual int countWithinParse() const = 0;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// ִ<>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="bytes"></param>
|
|
|
|
|
/// <returns></returns>
|
2025-07-15 14:46:51 +00:00
|
|
|
|
virtual QVariant parse(const QByteArray& bytes) const = 0;
|
2025-07-14 17:35:53 +00:00
|
|
|
|
};
|
|
|
|
|
|
2025-07-15 15:00:11 +00:00
|
|
|
|
class AbstractExtractor : public ExtractUnit {
|
2025-07-14 17:35:53 +00:00
|
|
|
|
private:
|
|
|
|
|
QString _name_store;
|
2025-07-15 16:24:48 +00:00
|
|
|
|
DataType _type_store;
|
2025-07-14 17:35:53 +00:00
|
|
|
|
int _byte_offset, _byte_count;
|
|
|
|
|
|
|
|
|
|
public:
|
2025-07-15 16:24:48 +00:00
|
|
|
|
AbstractExtractor(const QString& name, DataType data);
|
2025-07-14 17:35:53 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="bytes"></param>
|
|
|
|
|
virtual bool setOffsetFromPrevious(int bytes);
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="bytes"></param>
|
|
|
|
|
virtual bool setCountWithinParse(int bytes);
|
|
|
|
|
|
2025-07-15 15:00:11 +00:00
|
|
|
|
// ExtractUnit ===========================
|
2025-07-14 17:35:53 +00:00
|
|
|
|
QString name() const override;
|
2025-07-15 16:24:48 +00:00
|
|
|
|
virtual DataType outType() const;
|
2025-07-14 17:35:53 +00:00
|
|
|
|
int offsetFromPrevious() const override;
|
|
|
|
|
int countWithinParse() const override;
|
|
|
|
|
|
|
|
|
|
// Serializable ==============================
|
|
|
|
|
void loadFrom(const QJsonObject& obj) override;
|
|
|
|
|
void saveTo(QJsonObject& obj) const override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#define NAME(u) #u
|
|
|
|
|
#define INT32_SAVE(varx) obj[NAME(varx)] = varx;
|
|
|
|
|
#define INT32_PEAK(varx) varx = obj[NAME(varx)].toInt();
|
|
|
|
|
#define STRLIST_SAVE(list) obj[NAME(list)] = list.join(";");
|
|
|
|
|
#define STRLIST_PEAK(list) list = obj[NAME(list)].toString().split(";");
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// ת<><D7AA>Դ<EFBFBD><D4B4>ֵδ16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ĭ<EFBFBD>Ϸָʽ
|
|
|
|
|
/// </summary>
|
2025-07-15 15:00:11 +00:00
|
|
|
|
class BytesAsHex : public AbstractExtractor {
|
2025-07-14 17:35:53 +00:00
|
|
|
|
public:
|
|
|
|
|
BytesAsHex();
|
|
|
|
|
|
|
|
|
|
QVariant parse(const QByteArray& bytes) const override;
|
|
|
|
|
std::shared_ptr<Serializable> newDefault() const override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#include <QHash>
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// ת<><D7AA>Դ<EFBFBD><D4B4>ֵΪλ<CEAA><CEBB><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
2025-07-15 15:00:11 +00:00
|
|
|
|
class BytesAsBitCombine : public AbstractExtractor {
|
2025-07-14 17:35:53 +00:00
|
|
|
|
private:
|
|
|
|
|
QHash<int, QString> _switch_options;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
BytesAsBitCombine();
|
|
|
|
|
|
|
|
|
|
bool setSwitchOption(int bit_index, const QString& keyword);
|
|
|
|
|
QHash<int, QString> switchOptions() const;
|
|
|
|
|
virtual void clearOptions();
|
|
|
|
|
|
2025-07-15 15:00:11 +00:00
|
|
|
|
// ExtractUnit ============================
|
2025-07-14 17:35:53 +00:00
|
|
|
|
QVariant parse(const QByteArray& bytes) const override;
|
|
|
|
|
|
|
|
|
|
// Serializable ==============================
|
|
|
|
|
void loadFrom(const QJsonObject& obj) override;
|
|
|
|
|
void saveTo(QJsonObject& obj) const override;
|
|
|
|
|
std::shared_ptr<Serializable> newDefault() const override;
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-15 14:12:40 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// ת<><D7AA>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
2025-07-15 15:00:11 +00:00
|
|
|
|
class BytesAsInteger : public AbstractExtractor {
|
2025-07-14 17:35:53 +00:00
|
|
|
|
private:
|
|
|
|
|
bool unsigned_mark = false;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
BytesAsInteger();
|
|
|
|
|
|
|
|
|
|
void setUnsignedMark(bool ste);
|
|
|
|
|
bool unsignedMark() const;
|
|
|
|
|
|
2025-07-15 15:00:11 +00:00
|
|
|
|
// ExtractUnit ============================
|
2025-07-14 17:35:53 +00:00
|
|
|
|
bool setCountWithinParse(int bytes) override;
|
|
|
|
|
QVariant parse(const QByteArray& bytes) const override;
|
|
|
|
|
|
|
|
|
|
// Serializable ==============================
|
|
|
|
|
void loadFrom(const QJsonObject& obj) override;
|
|
|
|
|
void saveTo(QJsonObject& obj) const override;
|
|
|
|
|
std::shared_ptr<Serializable> newDefault() const override;
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-15 14:12:40 +00:00
|
|
|
|
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
|
|
|
|
|
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// ת<><D7AA>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>Ϊ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
/// </summary>
|
2025-07-15 15:00:11 +00:00
|
|
|
|
class BytesAsString : public AbstractExtractor {
|
2025-07-14 17:35:53 +00:00
|
|
|
|
private:
|
2025-07-15 14:46:51 +00:00
|
|
|
|
QTextCodec* _conv_with = nullptr;
|
2025-07-15 14:12:40 +00:00
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
BytesAsString();
|
|
|
|
|
|
2025-07-15 14:46:51 +00:00
|
|
|
|
void setStrCodec(QTextCodec* ins);
|
2025-07-15 14:12:40 +00:00
|
|
|
|
QString codecName() const;
|
|
|
|
|
|
2025-07-15 15:00:11 +00:00
|
|
|
|
// ExtractUnit ============================
|
2025-07-15 14:12:40 +00:00
|
|
|
|
QVariant parse(const QByteArray& bytes) const override;
|
|
|
|
|
|
|
|
|
|
// Serializable ==============================
|
|
|
|
|
void loadFrom(const QJsonObject& obj) override;
|
|
|
|
|
void saveTo(QJsonObject& obj) const override;
|
|
|
|
|
std::shared_ptr<Serializable> newDefault() const override;
|
2025-07-15 14:46:51 +00:00
|
|
|
|
};
|
|
|
|
|
|
2025-07-15 16:24:48 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><>ֵת<D6B5><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
class ValueConvert : public Serializable {
|
|
|
|
|
public:
|
|
|
|
|
virtual ~ValueConvert() = default;
|
|
|
|
|
|
|
|
|
|
virtual QString name() const = 0;
|
|
|
|
|
virtual DataType inType() const = 0;
|
|
|
|
|
virtual DataType outType() const = 0;
|
|
|
|
|
virtual QVariant convert(const QVariant &value) const = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class AbstractValueConvert : public ValueConvert {
|
|
|
|
|
private:
|
|
|
|
|
QString _name_store;
|
|
|
|
|
DataType _in_type, _out_type;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
AbstractValueConvert(const QString &nm, DataType in, DataType out);
|
|
|
|
|
|
|
|
|
|
QString name() const override;
|
|
|
|
|
DataType inType() const override;
|
|
|
|
|
DataType outType() const override;
|
|
|
|
|
|
|
|
|
|
void loadFrom(const QJsonObject& obj) override;
|
|
|
|
|
void saveTo(QJsonObject& obj) const override;
|
2025-07-17 16:17:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DoubleWithLSB : public AbstractValueConvert {
|
|
|
|
|
private:
|
|
|
|
|
double _lsb_value;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
DoubleWithLSB();
|
|
|
|
|
|
|
|
|
|
void setLSB(double lsbv);
|
|
|
|
|
double getLSB() const;
|
|
|
|
|
|
|
|
|
|
QVariant convert(const QVariant& value) const override;
|
|
|
|
|
std::shared_ptr<Serializable> newDefault() const override;
|
2025-07-15 16:24:48 +00:00
|
|
|
|
};
|