#include "mainwindow.h" #include #include #include "./ui_mainwindow.h" using namespace iflytop; using namespace std; static MainWindow *m_mainWindow; #define TAG "MainWindow" 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; } static const uint32_t str2int(QString str) { // 如果0x开头,按16进制转换 // 如果0b开头,按2进制转换 // 否则按10进制转换 // 去除掉str中_ str.remove("_"); if (str.startsWith("0x")) { return str.toUInt(nullptr, 16); } else if (str.startsWith("0b")) { // remove 0b str.remove(0, 2); return str.toUInt(nullptr, 2); } else { return str.toUInt(nullptr, 10); } } void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QString text; text.append(msg); m_mainWindow->append_log_signal(text); } void MainWindow::append_log_slot(QString text) { ui->logbrowser->append(text); } void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t regadd, int32_t rwflag) { DispalyRegIterm *regitem = new DispalyRegIterm(); { auto *label = new QLabel(parent); label->setObjectName(QString::fromUtf8("label")); label->setText(QString(fmt("%s(0x%04x)", regname, regadd))); QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Expanding); sizePolicy1.setHorizontalStretch(0); sizePolicy1.setVerticalStretch(0); sizePolicy1.setHeightForWidth(label->sizePolicy().hasHeightForWidth()); label->setSizePolicy(sizePolicy1); label->setMinimumSize(QSize(100, 0)); label->setMaximumSize(QSize(16777215, 16777215)); ui->reg_table->addWidget(label, off, 0, 1, 1); regitem->label = label; } { auto *textbrowser = new QTextBrowser(parent); textbrowser->setObjectName(QString::fromUtf8("textbrowser")); textbrowser->setEnabled(true); textbrowser->setText(QString("demo")); QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(textbrowser->sizePolicy().hasHeightForWidth()); textbrowser->setSizePolicy(sizePolicy); textbrowser->setMaximumSize(QSize(16777215, 16777215)); ui->reg_table->addWidget(textbrowser, off, 1, 1, 1); regitem->regBrowser = textbrowser; } { auto *textEdit = new QTextEdit(parent); textEdit->setObjectName(QString::fromUtf8("textEdit")); textEdit->setEnabled(true); QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(textEdit->sizePolicy().hasHeightForWidth()); textEdit->setSizePolicy(sizePolicy); textEdit->setMaximumSize(QSize(16777215, 16777215)); ui->reg_table->addWidget(textEdit, off, 2, 1, 1); regitem->regEditer = textEdit; } { // new button auto *button = new QPushButton(parent); button->setObjectName(QString::fromUtf8("button")); button->setText(QString("Write")); QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(button->sizePolicy().hasHeightForWidth()); button->setSizePolicy(sizePolicy); // connect(this, connect(button, &QPushButton::clicked, [this, regadd](bool) { // QString regval_str = m_regdisplayer[regadd]->regEditer->toPlainText(); uint32_t regval = str2int(regval_str); ZLOGI(TAG, "write reg 0x%04x %d", regadd, regval); uint32_t readbackval = 0; auto ecode = Xsync::Ins().reg_write(regadd, regval, readbackval); if (ecode == kxs_ec_success) { ZLOGI(TAG, "write reg 0x%04x %d success", regadd, regval); m_regdisplayer[regadd]->regvalcache = regval; m_regdisplayer[regadd]->regBrowser->setText(QString::number(regval, 16)); } else { ZLOGE(TAG, "write reg 0x%04x %d fail,ecode:%s", regadd, regval, xs_error_code_2_str(ecode)); } }); regitem->writerButton = button; ui->reg_table->addWidget(button, off, 3, 1, 1); } m_regdisplayer[regadd] = regitem; } void MainWindow::construct_reg_table() { // int regoff = 1; push_reg(ui->gridLayoutWidget, regoff++, "reg1", 0x1000, 0); push_reg(ui->gridLayoutWidget, regoff++, "reg1", 0x1001, 0); push_reg(ui->gridLayoutWidget, regoff++, "reg1", 0x1002, 0); push_reg(ui->gridLayoutWidget, regoff++, "reg1", 0x1003, 0); push_reg(ui->gridLayoutWidget, regoff++, "reg1", 0x1004, 0); // 设置table的高度 auto qrect = ui->gridLayoutWidget->geometry(); qrect.setHeight(31 * regoff - 1); ui->gridLayoutWidget->setGeometry(qrect); } // MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); m_mainWindow = this; construct_reg_table(); connect(this, SIGNAL(append_log_signal(QString)), this, SLOT(append_log_slot(QString))); qInstallMessageHandler(log_output); m_thread.reset(new ZQThread("test", [this]() { mainWindowsRun(); })); m_thread->start(); // m_xsync.reset(new Xsync()); Xsync::Ins().initialize(XSyncUdpFactoryImpl::Ins()); } MainWindow::~MainWindow() { delete ui; } #define XS_ASSERT(exptr) \ { \ auto ecode = exptr; \ while (!(ecode == kxs_ec_success)) { \ ZLOGE(TAG, "do: %s fail,ecode:%d", #exptr, ecode); \ ZQThread::sleep(1); \ } \ } void MainWindow::on_RefreshRegsButton_clicked() { // ZLOGI(TAG, "on_refreshRegsButton_clicked"); QtConcurrent::run([this]() { bool suc = true; for (auto ® : m_regdisplayer) { uint32_t regValue = 0; auto ecode = Xsync::Ins().reg_read(reg.first, regValue); if (ecode == kxs_ec_success) { ZLOGI(TAG, "reg_read %x success", reg.first); reg.second->regvalcache = regValue; reg.second->regBrowser->setText(QString::number(regValue, 16)); } else { ZLOGE(TAG, "reg_read %x fail,ecode:%s", reg.first, xs_error_code_2_str(ecode)); suc = false; break; } } if (suc) { ZLOGI(TAG, "readreg end..."); } else { ZLOGI(TAG, "readreg error"); } }); // xs_error_code_t ecode = Xsync::Ins().reg_write(0xABCDDCBA, 0x12345678); // ZLOGI(TAG, "reg_write ecode:%s", xs_error_code_2_str(ecode)); } void MainWindow::on_ClearLogButton_clicked() { // ui->logbrowser->clear(); } void MainWindow::on_Connect2XsyncButton_clicked() { // ZLOGI(TAG, "connect %s", ui->IpInput->text().toStdString().c_str()); xs_error_code_t ecode = Xsync::Ins().connect(ui->IpInput->text().toStdString()); ZLOGI(TAG, "connect %s ecode:%s", ui->IpInput->text().toStdString().c_str(), xs_error_code_2_str(ecode)); } void MainWindow::mainWindowsRun() { // XSyncUdpFactoryImpl::Ins()->initialize(); // auto xsudp = XSyncUdpFactoryImpl::Ins()->createXSUDP(); // XS_ASSERT(xsudp->initialize("0.0.0.0", 9999)); // xsudp->startReceive([this, xsudp](XsyncNetAdd &from, uint8_t *data, size_t length) { // // ZLOGI(TAG, "receive from <%s:%d> (%d) :%s", from.ip.c_str(), from.port, data, length); // xsudp->sendto(from, "hello\n", 5, NULL); // }); }