diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index e017bb3..57adb29 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/libxsync b/libxsync index 2cc98f9..f3f3e6f 160000 --- a/libxsync +++ b/libxsync @@ -1 +1 @@ -Subproject commit 2cc98f9f617feb976e1f3f724489a1562dffb20d +Subproject commit f3f3e6ffe2f4badaf89a29003722c8772b82a738 diff --git a/mainwindow.cpp b/mainwindow.cpp index d05804e..5f49364 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -60,8 +60,9 @@ void MainWindow::doinui_slot(QFunction func) { if (func.get()) func.get()(); } -void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t regadd, int32_t rwflag) { +void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t regadd, int32_t rwflag, reg_val_type_t regvaltype) { DispalyRegIterm *regitem = new DispalyRegIterm(); + regitem->regvaltype = regvaltype; { auto *label = new QLabel(parent); label->setObjectName(QString::fromUtf8("label")); @@ -71,7 +72,7 @@ void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t sizePolicy1.setVerticalStretch(0); sizePolicy1.setHeightForWidth(label->sizePolicy().hasHeightForWidth()); label->setSizePolicy(sizePolicy1); - label->setMinimumSize(QSize(200, 0)); + label->setMinimumSize(QSize(250, 0)); label->setMaximumSize(QSize(16777215, 16777215)); ui->reg_table->addWidget(label, off, 0, 1, 1); regitem->label = label; @@ -80,7 +81,7 @@ void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t auto *textbrowser = new QTextBrowser(parent); textbrowser->setObjectName(QString::fromUtf8("textbrowser")); textbrowser->setEnabled(true); - textbrowser->setText(QString("demo")); + textbrowser->setText(QString("unset")); QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); @@ -129,8 +130,8 @@ void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t 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)); + m_regdisplayer[regadd]->regvalcache = readbackval; + updateUI_timeCodeInfo(regadd); } else { ZLOGE(TAG, "write reg 0x%04x %d fail,ecode:%s", regadd, regval, xs_error_code_2_str(ecode)); } @@ -143,18 +144,52 @@ void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t m_regdisplayer[regadd] = regitem; } +void MainWindow::updateUI_timeCodeInfo(uint32_t regoff) { + // m_regdisplayer[regoff]->regBrowser->setText("0x" + QString::number(regValue, 16)); + + uint32_t regval = m_regdisplayer[regoff]->regvalcache; + auto *regBrowser = m_regdisplayer[regoff]->regBrowser; + reg_val_type_t regvaltype = m_regdisplayer[regoff]->regvaltype; + + if (regvaltype == kreg_val_type_dotted_hex) { + regBrowser->setText(QString(fmt("%02x.%02x.%02x.%02x", (regval >> 0) & 0xff, (regval >> 8) & 0xff, (regval >> 16) & 0xff, (regval >> 24) & 0xff))); + } else if (regvaltype == kreg_val_type_dotted_decimal) { + regBrowser->setText(QString(fmt("%d.%d.%d.%d", (regval >> 0) & 0xff, (regval >> 8) & 0xff, (regval >> 16) & 0xff, (regval >> 24) & 0xff))); + } else if (regvaltype == kreg_val_type_str) { + char text[5] = {0}; + memcpy(text, ®val, 4); + regBrowser->setText(QString(text)); + } else if (regvaltype == kreg_val_type_hex) { + regBrowser->setText(QString(fmt("0x%08x", regval))); + } else if (regvaltype == kreg_val_type_decimal) { + regBrowser->setText(QString::number(regval, 10)); + } else if (regvaltype == kreg_val_type_binary) { + regBrowser->setText(QString::number(regval, 2)); + } +} + void MainWindow::construct_reg_table() { // int regoff = 1; - push_reg(ui->gridLayoutWidget, regoff++, "software_version", kxsync_reg_software_version, 0); - push_reg(ui->gridLayoutWidget, regoff++, "manufacturer0", kxsync_reg_manufacturer0, 0); - push_reg(ui->gridLayoutWidget, regoff++, "manufacturer1", kxsync_reg_manufacturer1, 0); - push_reg(ui->gridLayoutWidget, regoff++, "product_type_id", kxsync_reg_product_type_id, 0); - push_reg(ui->gridLayoutWidget, regoff++, "sn_id0", kxsync_reg_sn_id0, 0); - push_reg(ui->gridLayoutWidget, regoff++, "sn_id1", kxsync_reg_sn_id1, 0); - push_reg(ui->gridLayoutWidget, regoff++, "sn_id2", kxsync_reg_sn_id2, 0); - push_reg(ui->gridLayoutWidget, regoff++, "mac0", kxsync_reg_mac0, 0); - push_reg(ui->gridLayoutWidget, regoff++, "mac1", kxsync_reg_mac1, 0); + push_reg(ui->gridLayoutWidget, regoff++, "software_version", kxsync_reg_software_version, 0, kreg_val_type_dotted_decimal); + push_reg(ui->gridLayoutWidget, regoff++, "manufacturer0", kxsync_reg_manufacturer0, 0, kreg_val_type_str); + push_reg(ui->gridLayoutWidget, regoff++, "manufacturer1", kxsync_reg_manufacturer1, 0, kreg_val_type_str); + push_reg(ui->gridLayoutWidget, regoff++, "product_type_id", kxsync_reg_product_type_id, 0, kreg_val_type_decimal); + push_reg(ui->gridLayoutWidget, regoff++, "sn_id0", kxsync_reg_sn_id0, 0, kreg_val_type_dotted_hex); + push_reg(ui->gridLayoutWidget, regoff++, "sn_id1", kxsync_reg_sn_id1, 0, kreg_val_type_dotted_hex); + push_reg(ui->gridLayoutWidget, regoff++, "sn_id2", kxsync_reg_sn_id2, 0, kreg_val_type_dotted_hex); + push_reg(ui->gridLayoutWidget, regoff++, "mac0", kxsync_reg_mac0, 0, kreg_val_type_dotted_hex); + push_reg(ui->gridLayoutWidget, regoff++, "mac1", kxsync_reg_mac1, 0, kreg_val_type_dotted_hex); + + // kxsync_reg_stm32_ip + // kxsync_reg_stm32_gw + // kxsync_reg_stm32_netmask + // kxsync_reg_stm32_camera_sync_signal_count + + push_reg(ui->gridLayoutWidget, regoff++, "stm32_ip", kxsync_reg_stm32_ip, 0, kreg_val_type_dotted_decimal); + push_reg(ui->gridLayoutWidget, regoff++, "stm32_gw", kxsync_reg_stm32_gw, 0, kreg_val_type_dotted_decimal); + push_reg(ui->gridLayoutWidget, regoff++, "stm32_netmask", kxsync_reg_stm32_netmask, 0, kreg_val_type_dotted_decimal); + push_reg(ui->gridLayoutWidget, regoff++, "stm32_camera_sync_signal_count", kxsync_reg_stm32_camera_sync_signal_count, 0, kreg_val_type_decimal); // 设置table的高度 auto qrect = ui->gridLayoutWidget->geometry(); @@ -222,26 +257,16 @@ void MainWindow::on_RefreshRegsButton_clicked() { // if (ecode == kxs_ec_success) { ZLOGI(TAG, "reg_read %x success", reg.first); + m_regdisplayer[regoff]->regvalcache = regValue; + emit doinui_signal(QFunction([this, regoff, regValue]() { updateUI_timeCodeInfo(regoff); })); + } else { emit doinui_signal(QFunction([this, regoff, regValue]() { - m_regdisplayer[regoff]->regvalcache = regValue; - m_regdisplayer[regoff]->regBrowser->setText("0x" + QString::number(regValue, 16)); + m_regdisplayer[regoff]->regvalcache = 0; + m_regdisplayer[regoff]->regBrowser->setText("error"); })); - } 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(); @@ -260,3 +285,40 @@ void MainWindow::mainWindowsRun() { // // xsudp->sendto(from, "hello\n", 5, NULL); // }); } + +#define DO_XSYNC_FUNC(exptr) \ + { \ + auto ecode = exptr; \ + if (!(ecode == kxs_ec_success)) { \ + ZLOGE(TAG, "do: %s fail,ecode:[%d](%s)", #exptr, ecode, xs_error_code_2_str(ecode)); \ + return; \ + } else { \ + ZLOGI(TAG, "do: %s success", #exptr); \ + } \ + } + +void MainWindow::on_GenNewMac_clicked() { DO_XSYNC_FUNC(Xsync::Ins().generatorNewMac()); } +void MainWindow::on_FactoryReset_clicked() { DO_XSYNC_FUNC(Xsync::Ins().factoryReset()); } +void MainWindow::on_Reboot_clicked() { DO_XSYNC_FUNC(Xsync::Ins().reboot()); } +void MainWindow::on_ChangeNetCfg_clicked() { // + DO_XSYNC_FUNC(Xsync::Ins().changeNetworkConfig(ui->ChangeNetCfg_ip->text().toStdString(), ui->ChangeNetCfg_mask->text().toStdString(), ui->ChangeNetCfg_gateway->text().toStdString())); +} + +void MainWindow::on_WriteReg_clicked() { + uint32_t regadd = str2int(ui->RegAdd->text()); + uint32_t regval = str2int(ui->RegVal->text()); + + ZLOGI(TAG, "write reg 0x%08x %d", regadd, regval); + uint32_t readbakval = 0; + DO_XSYNC_FUNC(Xsync::Ins().reg_write(regadd, regval, readbakval)); + + ZLOGI(TAG, "write reg 0x%08x 0x%08x ,readback:0x%08x success", regadd, regval, readbakval); + ui->RegVal->setText(QString(fmt("0x%08x", readbakval))); +} +void MainWindow::on_ReadReg_clicked() { + uint32_t regadd = str2int(ui->RegAdd->text()); + uint32_t regval = 0; + DO_XSYNC_FUNC(Xsync::Ins().reg_read(regadd, regval)); + ZLOGI(TAG, "read reg 0x%08x 0x%08x success", regadd, regval); + ui->RegVal->setText(QString(fmt("0x%08x", regval))); +} diff --git a/mainwindow.h b/mainwindow.h index fe277b9..cb9056f 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -40,13 +40,23 @@ class MainWindow; } QT_END_NAMESPACE +typedef enum { + kreg_val_type_dotted_hex, // 点分16进制 + kreg_val_type_dotted_decimal, // 点分10进制 + kreg_val_type_str, + kreg_val_type_hex, + kreg_val_type_decimal, + kreg_val_type_binary, +} reg_val_type_t; + class DispalyRegIterm { public: - QLabel *label = 0; - QTextBrowser *regBrowser = 0; - QTextEdit *regEditer = 0; - QPushButton *writerButton = 0; - uint32_t regvalcache; + QLabel *label = 0; + QTextBrowser *regBrowser = 0; + QTextEdit *regEditer = 0; + QPushButton *writerButton = 0; + uint32_t regvalcache; + reg_val_type_t regvaltype; }; class MainWindow : public QMainWindow { @@ -65,7 +75,7 @@ class MainWindow : public QMainWindow { private: void construct_reg_table(); - void push_reg(QWidget *parent, int off, const char *regname, int32_t regadd, int32_t rwflag); + void push_reg(QWidget *parent, int off, const char *regname, int32_t regadd, int32_t rwflag, reg_val_type_t regvaltype); /******************************************************************************* * 日志 * *******************************************************************************/ @@ -75,6 +85,15 @@ class MainWindow : public QMainWindow { void on_RefreshRegsButton_clicked(); void on_ClearLogButton_clicked(); void on_Connect2XsyncButton_clicked(); + + void on_GenNewMac_clicked(); + void on_FactoryReset_clicked(); + void on_Reboot_clicked(); + void on_ChangeNetCfg_clicked(); + + void on_WriteReg_clicked(); + void on_ReadReg_clicked(); + void updateUI_timeCodeInfo_slot(QString); void updateUI_cameraSyncInfo_slot(QString); void updateUI_reg_slot(int32_t regadd, uint32_t regval); @@ -89,5 +108,6 @@ class MainWindow : public QMainWindow { private: void mainWindowsRun(); + void updateUI_timeCodeInfo(uint32_t regoff); }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index ae83b0f..7556776 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -18,7 +18,7 @@ 10 - 420 + 490 951 191 @@ -28,7 +28,7 @@ 10 - 380 + 450 91 31 @@ -72,109 +72,320 @@ false - + - 0 - 50 - 91 + 470 + 10 + 141 31 - - RefreshRegs + + + + + 620 + 10 + 141 + 31 + - + - 100 + 10 50 - 671 - 311 + 951 + 391 - - - 0 - 0 - - - - - 0 - 0 - - - - - 0 - 0 - - - - Qt::ScrollBarAlwaysOn - - - Qt::ScrollBarAlwaysOn + + 1 - - QAbstractScrollArea::AdjustIgnored - - - true - - - - - 0 - 0 - 652 - 1000 - - - - - 0 - 1000 - - - + + + 寄存器读写 + + - 20 + 110 10 - 581 - 91 + 671 + 311 - - - QLayout::SetNoConstraint + + + 0 + 0 + + + + + 0 + 0 + + + + + 0 + 0 + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAlwaysOn + + + QAbstractScrollArea::AdjustIgnored + + + true + + + + + 0 + 0 + 652 + 1000 + + + + + 0 + 1000 + - + + + + 20 + 10 + 581 + 91 + + + + + QLayout::SetNoConstraint + + + + + + + + + 10 + 10 + 91 + 31 + + + + RefreshRegs + + + + + + 基础功能 + + + + + 20 + 20 + 101 + 31 + + + + GenNewMac + + + + + + 20 + 60 + 101 + 31 + + + + FactoryReset + + + + + + 20 + 100 + 101 + 31 + + + + Reboot + + + + + + 20 + 140 + 101 + 31 + + + + ChangeNetCfg + + + + + + 130 + 140 + 111 + 31 + + + + + 75 + true + + + + 192.168.8.10 + + + false + + + + + + 250 + 140 + 111 + 31 + + + + + 75 + true + + + + 255.255.255.0 + + + false + + + + + + 370 + 140 + 111 + 31 + + + + + 75 + true + + + + 192.168.8.1 + + + false + + + + + + 20 + 180 + 101 + 31 + + + + WriteReg + + + + + + 20 + 220 + 101 + 31 + + + + ReadReg + + + + + + 130 + 200 + 111 + 31 + + + + + 75 + true + + + + 0x0 + + + false + + + + + + 250 + 200 + 111 + 31 + + + + + 75 + true + + + + 0 + + + false + - - - - - 470 - 10 - 141 - 31 - - - - - - - 620 - 10 - 141 - 31 - - diff --git a/src/xsync_udp_factory_impl.cpp b/src/xsync_udp_factory_impl.cpp index f598b0d..e23e791 100644 --- a/src/xsync_udp_factory_impl.cpp +++ b/src/xsync_udp_factory_impl.cpp @@ -5,6 +5,12 @@ #include // #include + +#define ENABLE_LOG +#ifdef ENABLE_LOG +#include "../src/logger.hpp" +#endif +#define TAG "XSYNC_UDP" #pragma comment(lib, "ws2_32") using namespace iflytop; @@ -104,7 +110,7 @@ xs_error_code_t XSUDP::receive(char* data, int32_t& length, XsyncNetAdd& from, i struct sockaddr_in sockaddr = {0}; timeval timeout; - timeout.tv_sec = overtimems / 1000; + timeout.tv_sec = overtimems; // 这个结构体的单位是ms,不是秒 timeout.tv_usec = 0; if (timeout.tv_sec == 0) { @@ -120,10 +126,11 @@ xs_error_code_t XSUDP::receive(char* data, int32_t& length, XsyncNetAdd& from, i data[length] = 0; if (ret < 0) { + // ZLOGI(TAG, "recvfrom error %d %s", ret, strerror(errno)); // if (errno == EWOULDBLOCK || errno == EAGAIN) { - return kxs_ec_overtime; + return kxs_ec_overtime; // } else { - // return kxs_ec_receive_fail; + // return kxs_ec_receive_fail; // } }