From 396a9e31b74be5277f4ac630f280acc1f7a7b8f5 Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 19 Jul 2025 00:38:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86Double=E5=92=8CFloat?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E9=95=BF=E5=BA=A6=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TranslateUI/SequenceView.cpp | 10 +- TranslateUI/StructView.cpp | 70 +------- TranslateUI/StructView.h | 17 +- TranslateUI/TranslateBasic.cpp | 47 ++++++ TranslateUI/TranslateBasic.h | 289 +++++++++++++++++++-------------- 5 files changed, 228 insertions(+), 205 deletions(-) diff --git a/TranslateUI/SequenceView.cpp b/TranslateUI/SequenceView.cpp index 9669251..1b282de 100644 --- a/TranslateUI/SequenceView.cpp +++ b/TranslateUI/SequenceView.cpp @@ -2,6 +2,9 @@ #include #include #include +#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(); _extractor_types[u_ptr->name()] = u_ptr; this->_default_translate_rule = u_ptr; + + u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; + + u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; } std::shared_ptr TranslateBasic::defaultRule() const diff --git a/TranslateUI/StructView.cpp b/TranslateUI/StructView.cpp index d4ec0ea..65cdbaf 100644 --- a/TranslateUI/StructView.cpp +++ b/TranslateUI/StructView.cpp @@ -8,73 +8,9 @@ #include -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()<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() << 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() << 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() << new QStandardItem(u8"变长数据") << new QStandardItem(u8"集合") - << new QStandardItem(u8"UINT8") << new QStandardItem("0") << new QStandardItem(u8"1*集合尺寸")); - _bin_model->appendRow(QList() << 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")); } diff --git a/TranslateUI/StructView.h b/TranslateUI/StructView.h index 7f943d6..1d9566e 100644 --- a/TranslateUI/StructView.h +++ b/TranslateUI/StructView.h @@ -4,22 +4,17 @@ #include #include #include +#include +#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); }; diff --git a/TranslateUI/TranslateBasic.cpp b/TranslateUI/TranslateBasic.cpp index 32ed005..e03c823 100644 --- a/TranslateUI/TranslateBasic.cpp +++ b/TranslateUI/TranslateBasic.cpp @@ -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 DoubleWithLSB::newDefault() const { return std::make_shared(); } + +QVariant BytesAsFloat::parse(const QByteArray& bytes) const +{ + return *((float*)bytes.data()); +} + +std::shared_ptr BytesAsFloat::newDefault() const +{ + return std::make_shared(); +} + +bool BytesAsFloat::setCountWithinParse(int bytes) +{ + AbstractExtractor::setCountWithinParse(4); + return true; +} + +BytesAsFloat::BytesAsFloat() + :AbstractExtractor(NAME(BytesAsFloat), DataType::Flt32) +{ + +} + +std::shared_ptr BytesAsDouble::newDefault() const +{ + return std::make_shared(); +} + +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) +{ + +} diff --git a/TranslateUI/TranslateBasic.h b/TranslateUI/TranslateBasic.h index dc9e4d7..98d6852 100644 --- a/TranslateUI/TranslateBasic.h +++ b/TranslateUI/TranslateBasic.h @@ -2,6 +2,7 @@ #include #include #include +#include /// /// 序列化实体 @@ -26,7 +27,6 @@ public: virtual std::shared_ptr newDefault() const = 0; }; - /// /// 内部使用的数据类型 /// @@ -38,6 +38,9 @@ enum class DataType { Dbl64, }; + + + /// /// 翻译单元抽象接口 /// @@ -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); - /// - /// 设置偏移字节数量 - /// - /// - virtual bool setOffsetFromPrevious(int bytes); - /// - /// 设置解析字节数量 - /// - /// - virtual bool setCountWithinParse(int bytes); + public: + AbstractExtractor(const QString& name, DataType data); + /// + /// 设置偏移字节数量 + /// + /// + virtual bool setOffsetFromPrevious(int bytes); + /// + /// 设置解析字节数量 + /// + /// + 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(";"); - -/// -/// 转换源数值未16进制数值,默认分割方式 -/// -class BytesAsHex : public AbstractExtractor { -public: - BytesAsHex(); - - QVariant parse(const QByteArray& bytes) const override; - std::shared_ptr newDefault() const override; -}; - -#include -/// -/// 转换源数值为位联合 -/// -class BytesAsBitCombine : public AbstractExtractor { -private: - QHash _switch_options; - -public: - BytesAsBitCombine(); - - bool setSwitchOption(int bit_index, const QString& keyword); - QHash 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 newDefault() const override; -}; - -/// -/// 转换源数据为整形 -/// -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 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; -/// -/// 转换源数据为字符串 -/// -class BytesAsString : public AbstractExtractor { -private: - QTextCodec* _conv_with = nullptr; -public: - BytesAsString(); + /// + /// 转换源数值未16进制数值,默认分割方式 + /// + class BytesAsHex : public AbstractExtractor { + public: + BytesAsHex(); + + QVariant parse(const QByteArray& bytes) const override; + std::shared_ptr newDefault() const override; + }; + + /// + /// 转换源数值为位联合 + /// + class BytesAsBitCombine : public AbstractExtractor { + private: + QHash _switch_options; + + public: + BytesAsBitCombine(); + + bool setSwitchOption(int bit_index, const QString& keyword); + QHash 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 newDefault() const override; + }; + + /// + /// 转换源数据为整形 + /// + 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 newDefault() const override; + }; + + /// + /// 转换源数据为字符串 + /// + 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 newDefault() const override; + }; + + class BytesAsFloat : public AbstractExtractor { + public: + BytesAsFloat(); + + /// + /// 设置解析字节数量 + /// + /// + virtual bool setCountWithinParse(int bytes) override; + + QVariant parse(const QByteArray& bytes) const override; + std::shared_ptr newDefault() const override; + }; + + class BytesAsDouble : public AbstractExtractor { + public: + BytesAsDouble(); + + /// + /// 设置解析字节数量 + /// + /// + virtual bool setCountWithinParse(int bytes) override; + + QVariant parse(const QByteArray& bytes) const override; + std::shared_ptr 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 newDefault() const override; -}; /// /// 数值转换抽象接口 @@ -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 newDefault() const override; -}; \ No newline at end of file + QVariant convert(const QVariant& value) const override; + std::shared_ptr newDefault() const override; + }; +} \ No newline at end of file