From ea5e2ba1e92f38faa11a5f7d34e2c083b116ae50 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 15 Apr 2024 11:48:40 +0800 Subject: [PATCH] update --- CMakeLists.txt | 2 +- libzqt/zui/z_reg_table_list_box.cpp | 148 +++++++++++++++++++++++++++++++++--- libzqt/zui/z_reg_table_list_box.hpp | 46 +++++++---- libzqt/zui/zqui.cpp | 72 ++++++++++++++++++ libzqt/zui/zqui.hpp | 73 ++++++++++++++++++ libzqt/zui/zui.hpp | 3 +- mainwindow.cpp | 77 +++++++++---------- mainwindow.h | 11 +-- 8 files changed, 355 insertions(+), 77 deletions(-) create mode 100644 libzqt/zui/zqui.cpp create mode 100644 libzqt/zui/zqui.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 01674ac..4d3d7dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,8 +39,8 @@ set(PROJECT_SOURCES libzqt/zui/z_function_list_box.cpp libzqt/zui/zq_vtab_page.cpp - libzqt/zui/z_reg_table_list_box.cpp + libzqt/zui/zqui.cpp ) diff --git a/libzqt/zui/z_reg_table_list_box.cpp b/libzqt/zui/z_reg_table_list_box.cpp index d53025e..27f2b2a 100644 --- a/libzqt/zui/z_reg_table_list_box.cpp +++ b/libzqt/zui/z_reg_table_list_box.cpp @@ -1,11 +1,29 @@ #include "z_reg_table_list_box.hpp" +#include "logger.hpp" +#include "zqui.hpp" + using namespace iflytop; using namespace std; + +#define TAG "ZRegTableListBox" + +static const char *fmt(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + static char buf[1024] = {0}; + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + return buf; +} + /*********************************************************************************************************************** * ZRegItem * ***********************************************************************************************************************/ -ZRegItem::ZRegItem(QWidget *parent, QString &title, int addr, ZRegItem::reg_flag_t flag) : QFrame(parent) { +ZRegItem::ZRegItem(QWidget *parent, QString &title, int addr, uint32_t flag) : QFrame(parent) { + m_flag = flag; + m_addr = addr; + m_layout = new QHBoxLayout(parent); this->setLayout(m_layout); m_layout->setMargin(0); @@ -14,6 +32,7 @@ ZRegItem::ZRegItem(QWidget *parent, QString &title, int addr, ZRegItem::reg_flag m_horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); m_lable = new QLabel(title, this); m_val = new QLineEdit(this); + m_InfoVal = new QLineEdit(this); m_writeButton = new QPushButton("写", this); m_readButton = new QPushButton("读", this); @@ -21,19 +40,27 @@ ZRegItem::ZRegItem(QWidget *parent, QString &title, int addr, ZRegItem::reg_flag m_lable->setMinimumSize(50, 30); m_val->setMinimumSize(100, 30); + m_InfoVal->setMinimumSize(30, 30); + m_InfoVal->setMaximumSize(30, 30); m_writeButton->setMinimumSize(100, 30); m_readButton->setMinimumSize(100, 30); m_layout->addWidget(m_lable); m_layout->addWidget(m_val); + m_layout->addWidget(m_InfoVal); m_layout->addItem(m_horizontalSpacer); m_layout->addWidget(m_readButton); m_layout->addWidget(m_writeButton); } + /*********************************************************************************************************************** * ZRegTableList * ***********************************************************************************************************************/ -ZRegTableList::ZRegTableList(QWidget *parent, const QString &title) : QGroupBox(title) { + +ZRegTableList::ZRegTableList(QWidget *parent, const QString &title) // + : QGroupBox(title) { + // + // fatherLayout m_layout = new QVBoxLayout(this); this->setLayout(m_layout); @@ -41,29 +68,128 @@ ZRegTableList::ZRegTableList(QWidget *parent, const QString &title) : QGroupBox( // add FunctionList to m_funcBox = new ZQFunctionListBox(this, "", 4); - m_funcBox->newFunc("读全部", {}, [this](int argn, const char **args) { - for (auto &item : m_regMap) { - } - }); + // 预设方法 + m_funcBox->newFunc("读全部", {}, [this](int argn, const char **args) { readAll(); }); m_layout->addWidget(m_funcBox); // add box to parent - m_regBox = new QGroupBox("寄存器列表", this); + m_regBox = new QGroupBox("寄存器列表", this); m_regBoxLayout = new QVBoxLayout(this); m_regBox->setLayout(m_regBoxLayout); m_layout->addWidget(m_regBox); - } -void ZRegTableList::regOnException(function onException) {} -void ZRegTableList::addReg(QString title, int addr, ZRegItem::reg_flag_t flag) { +void ZRegTableList::addReg(QString title, int addr, uint32_t flag) { ZRegItem *item = new ZRegItem(this, title, addr, flag); m_regBoxLayout->addWidget(item); + + // m_writeButton + + connect(item->m_writeButton, &QPushButton::clicked, this, [item, this](bool check) { + int32_t writeval; + QString val = item->m_val->text(); + writeval = reformatRegVal(val, item->m_flag); + try { + m_writereg_fn(item->m_addr, writeval); + ZQUI::ins()->doinui([item]() { + item->m_InfoVal->setText("OK"); + item->m_InfoVal->setStyleSheet("color:green"); + }); + } catch (...) { + ZQUI::ins()->doinui([item]() { + item->m_InfoVal->setText("Fail"); + item->m_InfoVal->setStyleSheet("color:red"); + }); + } + }); + + connect(item->m_readButton, &QPushButton::clicked, this, [item, this](bool check) { + int32_t readval; + try { + m_readreg_fn(item->m_addr, &readval); + QString displayval = formatRegVal(readval, item->m_flag); + QLineEdit *displayiterm = item->m_val; + ZQUI::ins()->doinui([item, displayval]() { + item->m_val->setText(displayval); + item->m_InfoVal->setText("OK"); + item->m_InfoVal->setStyleSheet("color:green"); + }); + } catch (...) { + ZQUI::ins()->doinui([item]() { + item->m_InfoVal->setText("Fail"); + item->m_InfoVal->setStyleSheet("color:red"); + }); + } + }); + m_regMap[title] = item; } void ZRegTableList::addSpacer() { m_layout->addItem(new QSpacerItem(20, 100, QSizePolicy::Minimum, QSizePolicy::Expanding)); m_regBoxLayout->addItem(new QSpacerItem(20, 100, QSizePolicy::Minimum, QSizePolicy::Expanding)); -} \ No newline at end of file +} + +void ZRegTableList::readAll() { + ZQUI::ins()->instructionPreviewClear(); + for (auto it = m_regMap.begin(); it != m_regMap.end(); it++) { + ZRegItem *item = it.value(); + int32_t val; + try { + ZQUI::ins()->instructionPreviewShow("try read reg %s", it.key().toStdString().c_str()); + m_readreg_fn(item->m_addr, &val); + QString displayval = formatRegVal(val, item->m_flag); + QLineEdit *displayiterm = item->m_val; + ZQUI::ins()->doinui([displayiterm, displayval]() { displayiterm->setText(displayval); }); + } catch (std::zexception &e) { + ZQUI::ins()->doinui([item]() {item->hide();}); + + } + } +} + +void ZRegTableList::initializeRegOperation(write_reg_func_t write_reg_fn, read_reg_func_t read_reg_fn) { + m_writereg_fn = write_reg_fn; + m_readreg_fn = read_reg_fn; +} + +QString ZRegTableList::formatRegVal(int32_t val, uint32_t flag) { + QString str; + + if (ZRegItem::khex & flag) { + str = QString(fmt("0x%08x", val)); + } else if (ZRegItem::kdec & flag) { + str = QString::number(val, 10); + } else if (ZRegItem::kstr & flag) { + char text[5] = {0}; + memcpy(text, &val, 4); + str = QString(text); + } else if (ZRegItem::kbinary & flag) { + str = QString::number(val, 2); + } else if (ZRegItem::kdotted_hex & flag) { + str = QString(fmt("%02x.%02x.%02x.%02x", (val >> 0) & 0xff, (val >> 8) & 0xff, (val >> 16) & 0xff, (val >> 24) & 0xff)); + } else if (ZRegItem::kdotted_decimal & flag) { + str = QString(fmt("%d.%d.%d.%d", (val >> 0) & 0xff, (val >> 8) & 0xff, (val >> 16) & 0xff, (val >> 24) & 0xff)); + } + return str; +} +int32_t ZRegTableList::reformatRegVal(QString valstr, uint32_t flag) { + int32_t val = 0; + if (ZRegItem::khex & flag) { + val = valstr.toInt(nullptr, 16); + } else if (ZRegItem::kdec & flag) { + val = valstr.toInt(nullptr, 10); + } else if (ZRegItem::kstr & flag) { + val = valstr.at(0).toLatin1() | (valstr.at(1).toLatin1() << 8) | (valstr.at(2).toLatin1() << 16) | (valstr.at(3).toLatin1() << 24); + } else if (ZRegItem::kbinary & flag) { + val = valstr.toInt(nullptr, 2); + } else if (ZRegItem::kdotted_hex & flag) { + QStringList list = valstr.split("."); + val = (list[0].toInt(nullptr, 16) << 0) | (list[1].toInt(nullptr, 16) << 8) | (list[2].toInt(nullptr, 16) << 16) | (list[3].toInt(nullptr, 16) << 24); + } else if (ZRegItem::kdotted_decimal & flag) { + QStringList list = valstr.split("."); + val = (list[0].toInt(nullptr, 10) << 0) | (list[1].toInt(nullptr, 10) << 8) | (list[2].toInt(nullptr, 10) << 16) | (list[3].toInt(nullptr, 10) << 24); + } + return val; +} diff --git a/libzqt/zui/z_reg_table_list_box.hpp b/libzqt/zui/z_reg_table_list_box.hpp index 6d39a67..ad8ec53 100644 --- a/libzqt/zui/z_reg_table_list_box.hpp +++ b/libzqt/zui/z_reg_table_list_box.hpp @@ -57,37 +57,45 @@ class ZRegItem : public QFrame { Q_OBJECT public: typedef enum { - kr = 1 << 0, - kw = 1 << 1, - krw = kr | kw, - khex = 1 << 2, - kdec = 1 << 3, - kfloat = 1 << 4, - kstr = 1 << 5, - kbinary = 1 << 6, + kr = 1 << 0, + kw = 1 << 1, + krw = kr | kw, + khex = 1 << 2, + kdec = 1 << 3, // 10进制 + kstr = 1 << 5, // 字符串 + kbinary = 1 << 6, // 二进制 + kdotted_hex = 1 << 7, // 点分十六进制 + kdotted_decimal = 1 << 8, // 点分十进制 } reg_flag_t; - private: + public: QHBoxLayout *m_layout = nullptr; QLabel *m_lable; QLineEdit *m_val; + QLineEdit *m_InfoVal; + QPushButton *m_writeButton; QPushButton *m_readButton; QSpacerItem *m_horizontalSpacer; - QString m_title; - int m_addr; - reg_flag_t m_flag; + QString m_title; + int m_addr; + uint32_t m_flag; public: - ZRegItem(QWidget *parent, QString &title, int addr, ZRegItem::reg_flag_t flag); + ZRegItem(QWidget *parent, QString &title, int addr, uint32_t flag); + // void hide(); }; class ZRegTableList : public QGroupBox { Q_OBJECT public: - function m_onException; + typedef function write_reg_func_t; + typedef function read_reg_func_t; + + write_reg_func_t m_writereg_fn; + read_reg_func_t m_readreg_fn; private: /** @@ -113,8 +121,14 @@ class ZRegTableList : public QGroupBox { public: ZRegTableList(QWidget *parent, const QString &title); - void regOnException(function onException); - void addReg(QString title, int addr, ZRegItem::reg_flag_t flag); + void initializeRegOperation(write_reg_func_t write_reg_fn, read_reg_func_t read_reg_fn); + + void addReg(QString title, int addr, uint32_t flag); void addSpacer(); + + private: + void readAll(); + QString formatRegVal(int32_t val, uint32_t flag); + int32_t reformatRegVal(QString valstr, uint32_t flag); }; } // namespace iflytop diff --git a/libzqt/zui/zqui.cpp b/libzqt/zui/zqui.cpp new file mode 100644 index 0000000..f0178e7 --- /dev/null +++ b/libzqt/zui/zqui.cpp @@ -0,0 +1,72 @@ +#include "zqui.hpp" + +using namespace std; +#define TAG "ZQUI" + +/*********************************************************************************************************************** + * PreviewShow * + ***********************************************************************************************************************/ +ZQUI *ZQUI::ins() { + static ZQUI instance; + return &instance; +} + +void ZQUI::instructionPreviewShow(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + char buf[1024] = {0}; + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + QString text(buf); + if (m_instructionPreviewShow) m_instructionPreviewShow(text); +} + +void ZQUI::instructionPreviewClear() { + if (m_instructionPreviewClear) m_instructionPreviewClear(); +} + +void ZQUI::reportPreviewShow(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + char buf[1024] = {0}; + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + QString text(buf); + if (m_reportPreviewShow) m_reportPreviewShow(text); +} + +void ZQUI::blockDataUploadPreviewShow(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + char buf[1024] = {0}; + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + QString text(buf); + if (m_blockDataUploadPreviewShow) m_blockDataUploadPreviewShow(text); +} +void ZQUI::rawDataPreviewShow(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + char buf[1024] = {0}; + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + QString text(buf); + if (m_rawDataPreviewShow) m_rawDataPreviewShow(text); +} + +void ZQUI::initialize() { + qRegisterMetaType("int32_t"); + qRegisterMetaType("uint32_t"); + qRegisterMetaType("float"); + qRegisterMetaType>("function"); + qRegisterMetaType("QFunction"); + connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction))); +} +void ZQUI::doinui(function dowhat) { + emit doinui_signal(QFunction([dowhat]() { + if (dowhat) dowhat(); + })); +} +void ZQUI::doinui_slot(QFunction func) { + if (func.get()) func.get()(); +} diff --git a/libzqt/zui/zqui.hpp b/libzqt/zui/zqui.hpp new file mode 100644 index 0000000..567f321 --- /dev/null +++ b/libzqt/zui/zqui.hpp @@ -0,0 +1,73 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../QFunction.hpp" + +class ZQUI : public QObject { + Q_OBJECT + public: + typedef std::function display_func_t; + + std::function m_instructionPreviewShow; + std::function m_reportPreviewShow; + std::function m_blockDataUploadPreviewShow; + std::function m_rawDataPreviewShow; + std::function m_instructionPreviewClear; + + public: + static ZQUI *ins(); + + void initialize(); + void doinui(std::function dowhat); + + void instructionPreviewShow(const char *fmt, ...); + void reportPreviewShow(const char *fmt, ...); + void blockDataUploadPreviewShow(const char *fmt, ...); + void rawDataPreviewShow(const char *fmt, ...); + void instructionPreviewClear(); + + void setInstructionPreviewShow(std::function func) { m_instructionPreviewShow = func; } + void setReportPreviewShow(std::function func) { m_reportPreviewShow = func; } + void setBlockDataUploadPreviewShow(std::function func) { m_blockDataUploadPreviewShow = func; } + void setRawDataPreviewShow(std::function func) { m_rawDataPreviewShow = func; } + void setInstructionPreviewClear(std::function func) { m_instructionPreviewClear = func; } + + private slots: + void doinui_slot(QFunction); + + signals: + void doinui_signal(QFunction); +}; diff --git a/libzqt/zui/zui.hpp b/libzqt/zui/zui.hpp index 616cd62..97cd32f 100644 --- a/libzqt/zui/zui.hpp +++ b/libzqt/zui/zui.hpp @@ -2,4 +2,5 @@ #include "z_function_list_box.hpp" #include "zq_vtab_page.hpp" -#include "z_reg_table_list_box.hpp" \ No newline at end of file +#include "z_reg_table_list_box.hpp" +#include "zqui.hpp" \ No newline at end of file diff --git a/mainwindow.cpp b/mainwindow.cpp index de00136..0b65b87 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -52,30 +52,14 @@ void MainWindow::doinui_slot(QFunction func) { * PreviewShow * ***********************************************************************************************************************/ -void MainWindow::instructionPreviewShow(const char *fmt, ...) { - va_list args; - va_start(args, fmt); - char buf[1024] = {0}; - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - QString text(buf); +void MainWindow::instructionPreviewShow(QString text) { QString info; - info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz ")); info.append(" |"); info.append(text); emit doinui_signal(QFunction([this, info]() { ui->instructionPreview->append(info); })); } - -void MainWindow::instructionPreviewClear() { ui->instructionPreview->document()->clear(); } - -void MainWindow::reportPreviewShow(const char *fmt, ...) { - va_list args; - va_start(args, fmt); - char buf[1024] = {0}; - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - QString text(buf); +void MainWindow::reportPreviewShow(QString text) { QString info; info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz ")); @@ -87,14 +71,7 @@ void MainWindow::reportPreviewShow(const char *fmt, ...) { ui->reportPreview->append(info); })); } - -void MainWindow::blockDataUploadPreviewShow(const char *fmt, ...) { - va_list args; - va_start(args, fmt); - char buf[1024] = {0}; - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - QString text(buf); +void MainWindow::blockDataUploadPreviewShow(QString text) { QString info; info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz ")); @@ -106,13 +83,7 @@ void MainWindow::blockDataUploadPreviewShow(const char *fmt, ...) { ui->uploadDataPreview->append(info); })); } -void MainWindow::rawDataPreviewShow(const char *fmt, ...) { - va_list args; - va_start(args, fmt); - char buf[1024] = {0}; - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - QString text(buf); +void MainWindow::rawDataPreviewShow(QString text) { QString info; info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); @@ -124,7 +95,10 @@ void MainWindow::rawDataPreviewShow(const char *fmt, ...) { ui->rawDataPreview->append(info); })); } -// uploadDataPreview + +void MainWindow::instructionPreviewClear() { + doinui_signal(QFunction([this]() { ui->instructionPreview->clear(); })); +} #pragma pack(push, 1) typedef struct { @@ -301,6 +275,12 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi qRegisterMetaType>("function"); qRegisterMetaType("QFunction"); connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction))); + ZQUI::ins()->initialize(); + ZQUI::ins()->setBlockDataUploadPreviewShow([this](QString text) { blockDataUploadPreviewShow(text); }); + ZQUI::ins()->setInstructionPreviewShow([this](QString text) { instructionPreviewShow(text); }); + ZQUI::ins()->setReportPreviewShow([this](QString text) { reportPreviewShow(text); }); + ZQUI::ins()->setRawDataPreviewShow([this](QString text) { rawDataPreviewShow(text); }); + ZQUI::ins()->setInstructionPreviewClear([this]() { instructionPreviewClear(); }); /** * @brief 页面逻辑初始化 @@ -317,18 +297,18 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi IflytopCanbusMaster::ins()->regOnRawData([this](raw_data_type_t type, uint8_t *hex, uint32_t hexlen) { if (type == kcmd_cmd) { - rawDataPreviewShow("[CMD ] %s", zhex2str(hex, hexlen).c_str()); + ZQUI::ins()->rawDataPreviewShow("[CMD ] %s", zhex2str(hex, hexlen).c_str()); } else if (type == kcmd_receipt) { - rawDataPreviewShow("[RECEIPT] %s", zhex2str(hex, hexlen).c_str()); + ZQUI::ins()->rawDataPreviewShow("[RECEIPT] %s", zhex2str(hex, hexlen).c_str()); } else if (type == kcmd_report) { - rawDataPreviewShow("[REPORT ] %s", zhex2str(hex, hexlen).c_str()); + ZQUI::ins()->rawDataPreviewShow("[REPORT ] %s", zhex2str(hex, hexlen).c_str()); } }); } MainWindow::~MainWindow() { delete ui; } void MainWindow::processException(const zexception &e) { // - instructionPreviewShow("%s", e.what()); + ZQUI::ins()->instructionPreviewShow("%s", e.what()); } void MainWindow::constructAppUI() { @@ -341,7 +321,7 @@ void MainWindow::constructAppUI() { for (size_t i = 1; i < 255; i++) { try { IflytopCanbusMaster::ins()->ping(i); - instructionPreviewShow("module :%d isOnline", i); + ZQUI::ins()->instructionPreviewShow("module :%d isOnline", i); } catch (const zexception &e) { if (e.ecode() != ke_overtime) { processException(e); @@ -349,7 +329,7 @@ void MainWindow::constructAppUI() { } } } - instructionPreviewShow("ScanModuleEnd"); + ZQUI::ins()->instructionPreviewShow("ScanModuleEnd"); }); tab->addSpacer(); } @@ -358,9 +338,20 @@ void MainWindow::constructAppUI() { ZQVTabPage *tab = new ZQVTabPage(ui->buttonTabWidget, "寄存器操作"); ZRegTableList *tableBox = new ZRegTableList(tab, "寄存器操作"); - tableBox->addReg("123", 1, ZRegItem::krw); - tableBox->addReg("234", 1, ZRegItem::krw); - tableBox->addReg("345", 1, ZRegItem::krw); + tableBox->initializeRegOperation( + [this](int32_t add, int32_t val) { // + return true; + }, + [this](int32_t add, int32_t *val) { // + *val = add; + return true; + }); + + // tableBox->add + + tableBox->addReg("123", 1, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("234", 2, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("345", 3, ZRegItem::krw | ZRegItem::kdec); tableBox->addSpacer(); tab->addSpacer(); diff --git a/mainwindow.h b/mainwindow.h index 15b6dcb..da1b9d0 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -90,11 +90,12 @@ class MainWindow : public QMainWindow { private: static void log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg); - void instructionPreviewShow(const char *fmt, ...); - void instructionPreviewClear(); - void reportPreviewShow(const char *fmt, ...); - void blockDataUploadPreviewShow(const char *fmt, ...); - void rawDataPreviewShow(const char *fmt, ...); + + void instructionPreviewClear(); + void instructionPreviewShow(QString info); + void reportPreviewShow(QString info); + void blockDataUploadPreviewShow(QString info); + void rawDataPreviewShow(QString info); void displayWave(int16_t wave1, int16_t wave2, int16_t wave3);