添加了Double和Float固定长度解析
This commit is contained in:
parent
26821f9543
commit
396a9e31b7
|
|
@ -2,6 +2,9 @@
|
|||
#include <QSpinBox>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include "TranslateBasic.h"
|
||||
|
||||
using namespace extract;
|
||||
|
||||
IntDelegate::IntDelegate(int min, int max)
|
||||
: _min_value(min), _max_value(max) {
|
||||
|
|
@ -32,7 +35,6 @@ void IntDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewIt
|
|||
editor->setGeometry(option.rect);
|
||||
}
|
||||
|
||||
#include "TranslateBasic.h"
|
||||
void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx)
|
||||
{
|
||||
auto new_inst = _rule_sequence.at(idx.row());
|
||||
|
|
@ -159,6 +161,12 @@ TranslateBasic::TranslateBasic()
|
|||
u_ptr = std::make_shared<BytesAsHex>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
this->_default_translate_rule = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsFloat>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
|
||||
u_ptr = std::make_shared<BytesAsDouble>();
|
||||
_extractor_types[u_ptr->name()] = u_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
|
||||
|
|
|
|||
|
|
@ -8,73 +8,9 @@
|
|||
#include <QTabWidget>
|
||||
|
||||
|
||||
BinaryStructView::BinaryStructView(QWidget* p /*= nullptr*/)
|
||||
StructuralRuleView::StructuralRuleView(QWidget* p /*= nullptr*/)
|
||||
:QWidget(p),
|
||||
_name_enter(new QLineEdit(this)),
|
||||
_base_type(new QComboBox(this)),
|
||||
_ends_set(new QComboBox(this)),
|
||||
_bin_layout(new QTableView(this)),
|
||||
_bin_model(new QStandardItemModel(this)),
|
||||
_struct_layout(new QTreeView(this)),
|
||||
_struct_model(new QStandardItemModel(this)),
|
||||
_translate_layout(new QTreeView(this)),
|
||||
_translate_model(new QStandardItemModel(this))
|
||||
_sequence_view(new SequenceRulesView(this)),
|
||||
_configs_stack(new QStackedWidget(this))
|
||||
{
|
||||
auto layout = new QGridLayout(this);
|
||||
//layout->setSpacing(10);
|
||||
layout->addWidget(new QLabel(tr("Unit Name:"), this));
|
||||
layout->addWidget(_name_enter, 0, 1);
|
||||
layout->addWidget(new QLabel(tr("Base On:"), this), 0, 2);
|
||||
layout->addWidget(_base_type, 0, 3);
|
||||
layout->addWidget(new QLabel(tr("Basedata Endian Appoint:"), this), 0, 4);
|
||||
layout->addWidget(_ends_set, 0, 5);
|
||||
auto btn = new QPushButton(tr("Save"), this);
|
||||
layout->addWidget(btn, 0, 6);
|
||||
|
||||
auto h_splitter = new QSplitter(Qt::Horizontal, this);
|
||||
layout->addWidget(h_splitter, 1, 0, 3, 7);
|
||||
|
||||
auto splitter = new QSplitter(Qt::Vertical, this);
|
||||
h_splitter->addWidget(splitter);
|
||||
auto translation_panel = new QGroupBox(tr("Translation Detail"), this);
|
||||
auto translation_layout = new QGridLayout(translation_panel);
|
||||
translation_layout->addWidget(this->_translate_layout);
|
||||
h_splitter->addWidget(translation_panel);
|
||||
|
||||
auto bin_panel = new QGroupBox(tr("Sequence Define"));
|
||||
auto bin_layout = new QGridLayout(bin_panel);
|
||||
bin_layout->addWidget(_bin_layout);
|
||||
splitter->addWidget(bin_panel);
|
||||
|
||||
auto struct_panel = new QGroupBox(tr("Structual Preview"), this);
|
||||
auto struct_layout = new QGridLayout(struct_panel);
|
||||
struct_layout->addWidget(_struct_layout);
|
||||
splitter->addWidget(struct_panel);
|
||||
|
||||
// =======================
|
||||
_base_type->addItems(QStringList()<<tr("Struct Based")<<tr("Union Based"));
|
||||
_ends_set->addItems(QStringList() << tr("little-endian") << tr("big-endian"));
|
||||
_bin_layout->setModel(_bin_model);
|
||||
_struct_layout->setModel(_struct_model);
|
||||
_translate_layout->setModel(this->_translate_model);
|
||||
|
||||
_bin_model->setHorizontalHeaderLabels(QStringList() << tr("Member Name") << tr("Logical Type") << tr("Base Type")
|
||||
<< tr("Bytes Offset") << tr("Bytes Count") << tr("Translate Type") << tr("Rule Custom") << tr("Result With"));
|
||||
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"单元标志")<< new QStandardItem(u8"数据")
|
||||
<< new QStandardItem(u8"UINT8") << new QStandardItem("0") << new QStandardItem("1*1")
|
||||
<< new QStandardItem(u8"直译") << new QStandardItem(u8"文本转换") << new QStandardItem(u8"To=16进制"));
|
||||
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"集合尺寸") << new QStandardItem(u8"数据")
|
||||
<< new QStandardItem(u8"UINT16") << new QStandardItem("0") << new QStandardItem(u8"2*1")
|
||||
<< new QStandardItem(u8"直译") << new QStandardItem(u8"数值提取") << new QStandardItem(u8"To=int,LSB=10"));
|
||||
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"变长数据") << new QStandardItem(u8"集合")
|
||||
<< new QStandardItem(u8"UINT8") << new QStandardItem("0") << new QStandardItem(u8"1*集合尺寸"));
|
||||
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"联合数据") << new QStandardItem(u8"联合")
|
||||
<< new QStandardItem(u8"X联合") << new QStandardItem("0") << new QStandardItem(u8"8*1"));
|
||||
|
||||
_struct_model->setHorizontalHeaderLabels(QStringList() << tr("Fields") << tr("Comment"));
|
||||
|
||||
|
||||
_translate_model->setHorizontalHeaderLabels(QStringList() << tr("Apply Condition") << tr("Translate Type") << tr("RuleBase") << tr("Result With"));
|
||||
_translate_model->appendRow(QList< QStandardItem*>() << new QStandardItem(u8"绑定") << new QStandardItem(u8"直译") << new QStandardItem(u8"数值转换") << new QStandardItem(u8"To=16进制"));
|
||||
_translate_model->appendRow(QList< QStandardItem*>() << new QStandardItem(u8"绑定") << new QStandardItem(u8"直译") << new QStandardItem(u8"数值转换") << new QStandardItem(u8"To=float,LSB=0.1"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,22 +4,17 @@
|
|||
#include <QStandardItemModel>
|
||||
#include <QTreeView>
|
||||
#include <QLineEdit>
|
||||
#include <QStackedWidget>
|
||||
#include "SequenceView.h"
|
||||
|
||||
class BinaryStructView : public QWidget
|
||||
class StructuralRuleView : public QWidget
|
||||
{
|
||||
private:
|
||||
QLineEdit *const _name_enter;
|
||||
QComboBox *const _base_type;
|
||||
QComboBox *const _ends_set;
|
||||
QTableView *const _bin_layout;
|
||||
QStandardItemModel* const _bin_model;
|
||||
QTreeView* const _struct_layout;
|
||||
QStandardItemModel* const _struct_model;
|
||||
QTreeView* const _translate_layout;
|
||||
QStandardItemModel* const _translate_model;
|
||||
SequenceRulesView *const _sequence_view;
|
||||
QStackedWidget *const _configs_stack;
|
||||
|
||||
public:
|
||||
BinaryStructView(QWidget* p = nullptr);
|
||||
StructuralRuleView(QWidget* p = nullptr);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
#include "TranslateBasic.h"
|
||||
|
||||
using namespace extract;
|
||||
using namespace convert;
|
||||
|
||||
AbstractExtractor::AbstractExtractor(const QString& name, DataType data)
|
||||
:_name_store(name), _type_store(data), _byte_offset(0), _byte_count(0) {
|
||||
}
|
||||
|
|
@ -321,3 +324,47 @@ std::shared_ptr<Serializable> DoubleWithLSB::newDefault() const
|
|||
{
|
||||
return std::make_shared<DoubleWithLSB>();
|
||||
}
|
||||
|
||||
QVariant BytesAsFloat::parse(const QByteArray& bytes) const
|
||||
{
|
||||
return *((float*)bytes.data());
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsFloat::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsFloat>();
|
||||
}
|
||||
|
||||
bool BytesAsFloat::setCountWithinParse(int bytes)
|
||||
{
|
||||
AbstractExtractor::setCountWithinParse(4);
|
||||
return true;
|
||||
}
|
||||
|
||||
BytesAsFloat::BytesAsFloat()
|
||||
:AbstractExtractor(NAME(BytesAsFloat), DataType::Flt32)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsDouble::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsDouble>();
|
||||
}
|
||||
|
||||
QVariant BytesAsDouble::parse(const QByteArray& bytes) const
|
||||
{
|
||||
return *((double*)bytes.data());
|
||||
}
|
||||
|
||||
bool BytesAsDouble::setCountWithinParse(int bytes)
|
||||
{
|
||||
AbstractExtractor::setCountWithinParse(8);
|
||||
return true;
|
||||
}
|
||||
|
||||
BytesAsDouble::BytesAsDouble()
|
||||
:AbstractExtractor(NAME(BytesAsDouble), DataType::Dbl64)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#include <QVariant>
|
||||
#include <QJsonObject>
|
||||
#include <memory>
|
||||
#include <QHash>
|
||||
|
||||
/// <summary>
|
||||
/// 序列化实体
|
||||
|
|
@ -26,7 +27,6 @@ public:
|
|||
virtual std::shared_ptr<Serializable> newDefault() const = 0;
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 内部使用的数据类型
|
||||
/// </summary>
|
||||
|
|
@ -38,6 +38,9 @@ enum class DataType {
|
|||
Dbl64,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 翻译单元抽象接口
|
||||
/// </summary>
|
||||
|
|
@ -76,123 +79,155 @@ public:
|
|||
virtual QVariant parse(const QByteArray& bytes) const = 0;
|
||||
};
|
||||
|
||||
class AbstractExtractor : public ExtractUnit {
|
||||
private:
|
||||
QString _name_store;
|
||||
DataType _type_store;
|
||||
int _byte_offset, _byte_count;
|
||||
namespace extract {
|
||||
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);
|
||||
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;
|
||||
// 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;
|
||||
};
|
||||
// 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();
|
||||
/// <summary>
|
||||
/// 转换源数值未16进制数值,默认分割方式
|
||||
/// </summary>
|
||||
class BytesAsHex : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsHex();
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
/// <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;
|
||||
};
|
||||
|
||||
/// <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;
|
||||
};
|
||||
|
||||
class BytesAsFloat : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsFloat();
|
||||
|
||||
/// <summary>
|
||||
/// 设置解析字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setCountWithinParse(int bytes) override;
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
class BytesAsDouble : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsDouble();
|
||||
|
||||
/// <summary>
|
||||
/// 设置解析字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setCountWithinParse(int bytes) override;
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
}
|
||||
|
||||
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>
|
||||
/// 数值转换抽象接口
|
||||
|
|
@ -204,36 +239,38 @@ public:
|
|||
virtual QString name() const = 0;
|
||||
virtual DataType inType() const = 0;
|
||||
virtual DataType outType() const = 0;
|
||||
virtual QVariant convert(const QVariant &value) const = 0;
|
||||
virtual QVariant convert(const QVariant& value) const = 0;
|
||||
};
|
||||
|
||||
class AbstractValueConvert : public ValueConvert {
|
||||
private:
|
||||
QString _name_store;
|
||||
DataType _in_type, _out_type;
|
||||
namespace convert {
|
||||
class AbstractValueConvert : public ValueConvert {
|
||||
private:
|
||||
QString _name_store;
|
||||
DataType _in_type, _out_type;
|
||||
|
||||
public:
|
||||
AbstractValueConvert(const QString &nm, DataType in, DataType out);
|
||||
public:
|
||||
AbstractValueConvert(const QString& nm, DataType in, DataType out);
|
||||
|
||||
QString name() const override;
|
||||
DataType inType() const override;
|
||||
DataType outType() const override;
|
||||
QString name() const override;
|
||||
DataType inType() const override;
|
||||
DataType outType() const override;
|
||||
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
};
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
};
|
||||
|
||||
|
||||
class DoubleWithLSB : public AbstractValueConvert {
|
||||
private:
|
||||
double _lsb_value;
|
||||
class DoubleWithLSB : public AbstractValueConvert {
|
||||
private:
|
||||
double _lsb_value;
|
||||
|
||||
public:
|
||||
DoubleWithLSB();
|
||||
public:
|
||||
DoubleWithLSB();
|
||||
|
||||
void setLSB(double lsbv);
|
||||
double getLSB() const;
|
||||
void setLSB(double lsbv);
|
||||
double getLSB() const;
|
||||
|
||||
QVariant convert(const QVariant& value) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
QVariant convert(const QVariant& value) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
}
|
||||
Loading…
Reference in New Issue