239 lines
5.6 KiB
C++
239 lines
5.6 KiB
C++
#pragma once
|
||
#include <QVariant>
|
||
#include <QJsonObject>
|
||
#include <memory>
|
||
|
||
/// <summary>
|
||
/// 序列化实体
|
||
/// </summary>
|
||
class Serializable {
|
||
public:
|
||
virtual ~Serializable() = default;
|
||
/// <summary>
|
||
/// 反序列化
|
||
/// </summary>
|
||
/// <param name="obj"></param>
|
||
virtual void loadFrom(const QJsonObject& obj) = 0;
|
||
/// <summary>
|
||
/// 序列化
|
||
/// </summary>
|
||
/// <param name="obj"></param>
|
||
virtual void saveTo(QJsonObject& obj) const = 0;
|
||
/// <summary>
|
||
/// 创建默认副本
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual std::shared_ptr<Serializable> newDefault() const = 0;
|
||
};
|
||
|
||
|
||
/// <summary>
|
||
/// 内部使用的数据类型
|
||
/// </summary>
|
||
enum class DataType {
|
||
ValueSequenceString,
|
||
TextString,
|
||
Int64, // 64位整形或无符号整形
|
||
Flt32,
|
||
Dbl64,
|
||
};
|
||
|
||
/// <summary>
|
||
/// 翻译单元抽象接口
|
||
/// </summary>
|
||
class ExtractUnit : public Serializable {
|
||
public:
|
||
virtual ~ExtractUnit() = default;
|
||
|
||
/// <summary>
|
||
/// 单元名称
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual QString name() const = 0;
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual DataType outType() const = 0;
|
||
|
||
/// <summary>
|
||
/// 从上一个单元字节偏移字节数量
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual int offsetFromPrevious() const = 0;
|
||
/// <summary>
|
||
/// 解析所用的字节数量
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
virtual int countWithinParse() const = 0;
|
||
|
||
/// <summary>
|
||
/// 执行解析过程
|
||
/// </summary>
|
||
/// <param name="bytes"></param>
|
||
/// <returns></returns>
|
||
virtual QVariant parse(const QByteArray& bytes) const = 0;
|
||
};
|
||
|
||
class AbstractExtractor : public ExtractUnit {
|
||
private:
|
||
QString _name_store;
|
||
DataType _type_store;
|
||
int _byte_offset, _byte_count;
|
||
|
||
public:
|
||
AbstractExtractor(const QString& name, DataType data);
|
||
/// <summary>
|
||
/// 设置偏移字节数量
|
||
/// </summary>
|
||
/// <param name="bytes"></param>
|
||
virtual bool setOffsetFromPrevious(int bytes);
|
||
/// <summary>
|
||
/// 设置解析字节数量
|
||
/// </summary>
|
||
/// <param name="bytes"></param>
|
||
virtual bool setCountWithinParse(int bytes);
|
||
|
||
// ExtractUnit ===========================
|
||
QString name() const override;
|
||
virtual DataType outType() const;
|
||
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>
|
||
/// 转换源数值未16进制数值,默认分割方式
|
||
/// </summary>
|
||
class BytesAsHex : public AbstractExtractor {
|
||
public:
|
||
BytesAsHex();
|
||
|
||
QVariant parse(const QByteArray& bytes) const override;
|
||
std::shared_ptr<Serializable> newDefault() const override;
|
||
};
|
||
|
||
#include <QHash>
|
||
/// <summary>
|
||
/// 转换源数值为位联合
|
||
/// </summary>
|
||
class BytesAsBitCombine : public AbstractExtractor {
|
||
private:
|
||
QHash<int, QString> _switch_options;
|
||
|
||
public:
|
||
BytesAsBitCombine();
|
||
|
||
bool setSwitchOption(int bit_index, const QString& keyword);
|
||
QHash<int, QString> switchOptions() const;
|
||
virtual void clearOptions();
|
||
|
||
// ExtractUnit ============================
|
||
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;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 转换源数据为整形
|
||
/// </summary>
|
||
class BytesAsInteger : public AbstractExtractor {
|
||
private:
|
||
bool unsigned_mark = false;
|
||
|
||
public:
|
||
BytesAsInteger();
|
||
|
||
void setUnsignedMark(bool ste);
|
||
bool unsignedMark() const;
|
||
|
||
// ExtractUnit ============================
|
||
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;
|
||
};
|
||
|
||
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
|
||
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
|
||
/// <summary>
|
||
/// 转换源数据为字符串
|
||
/// </summary>
|
||
class BytesAsString : public AbstractExtractor {
|
||
private:
|
||
QTextCodec* _conv_with = nullptr;
|
||
|
||
public:
|
||
BytesAsString();
|
||
|
||
void setStrCodec(QTextCodec* ins);
|
||
QString codecName() const;
|
||
|
||
// ExtractUnit ============================
|
||
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;
|
||
};
|
||
|
||
/// <summary>
|
||
/// 数值转换抽象接口
|
||
/// </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;
|
||
};
|
||
|
||
|
||
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;
|
||
}; |