You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

324 lines
14 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "mainwindow.h"
  2. #include <QDateTime>
  3. #include <QtConcurrent>
  4. #include "./ui_mainwindow.h"
  5. using namespace iflytop;
  6. using namespace std;
  7. static MainWindow *m_mainWindow;
  8. #define TAG "MainWindow"
  9. static const char *fmt(const char *fmt, ...) {
  10. va_list args;
  11. va_start(args, fmt);
  12. static char buf[1024] = {0};
  13. vsnprintf(buf, sizeof(buf), fmt, args);
  14. va_end(args);
  15. return buf;
  16. }
  17. static const uint32_t str2int(QString str) {
  18. // 如果0x开头,按16进制转换
  19. // 如果0b开头,按2进制转换
  20. // 否则按10进制转换
  21. // 去除掉str中_
  22. str.remove("_");
  23. if (str.startsWith("0x")) {
  24. return str.toUInt(nullptr, 16);
  25. } else if (str.startsWith("0b")) {
  26. // remove 0b
  27. str.remove(0, 2);
  28. return str.toUInt(nullptr, 2);
  29. } else {
  30. return str.toUInt(nullptr, 10);
  31. }
  32. }
  33. void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
  34. QString text;
  35. text.append(msg);
  36. m_mainWindow->append_log_signal(text);
  37. }
  38. void MainWindow::append_log_slot(QString text) { ui->logbrowser->append(text); }
  39. void MainWindow::updateUI_timeCodeInfo_slot(QString text) { ui->TimecodeDisplayer->setText(text); }
  40. void MainWindow::updateUI_cameraSyncInfo_slot(QString text) { ui->CameraSyncIndex->setText(text); }
  41. void MainWindow::updateUI_reg_slot(int32_t regadd, uint32_t regval) {
  42. auto it = m_regdisplayer.find(regadd);
  43. if (it != m_regdisplayer.end()) {
  44. ZLOGI(TAG, "updateUI_reg_slot %x %d", regadd, regval);
  45. it->second->regBrowser->setText(QString::number(regval, 16));
  46. }
  47. }
  48. void MainWindow::doinui_slot(QFunction func) {
  49. if (func.get()) func.get()();
  50. }
  51. void MainWindow::push_reg(QWidget *parent, int off, const char *regname, int32_t regadd, int32_t rwflag, reg_val_type_t regvaltype) {
  52. DispalyRegIterm *regitem = new DispalyRegIterm();
  53. regitem->regvaltype = regvaltype;
  54. {
  55. auto *label = new QLabel(parent);
  56. label->setObjectName(QString::fromUtf8("label"));
  57. label->setText(QString(fmt("%s(0x%04x)", regname, regadd)));
  58. QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Expanding);
  59. sizePolicy1.setHorizontalStretch(0);
  60. sizePolicy1.setVerticalStretch(0);
  61. sizePolicy1.setHeightForWidth(label->sizePolicy().hasHeightForWidth());
  62. label->setSizePolicy(sizePolicy1);
  63. label->setMinimumSize(QSize(250, 0));
  64. label->setMaximumSize(QSize(16777215, 16777215));
  65. ui->reg_table->addWidget(label, off, 0, 1, 1);
  66. regitem->label = label;
  67. }
  68. {
  69. auto *textbrowser = new QTextBrowser(parent);
  70. textbrowser->setObjectName(QString::fromUtf8("textbrowser"));
  71. textbrowser->setEnabled(true);
  72. textbrowser->setText(QString("unset"));
  73. QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  74. sizePolicy.setHorizontalStretch(0);
  75. sizePolicy.setVerticalStretch(0);
  76. sizePolicy.setHeightForWidth(textbrowser->sizePolicy().hasHeightForWidth());
  77. textbrowser->setSizePolicy(sizePolicy);
  78. textbrowser->setMaximumSize(QSize(16777215, 16777215));
  79. ui->reg_table->addWidget(textbrowser, off, 1, 1, 1);
  80. regitem->regBrowser = textbrowser;
  81. }
  82. {
  83. auto *textEdit = new QTextEdit(parent);
  84. textEdit->setObjectName(QString::fromUtf8("textEdit"));
  85. textEdit->setEnabled(true);
  86. QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  87. sizePolicy.setHorizontalStretch(0);
  88. sizePolicy.setVerticalStretch(0);
  89. sizePolicy.setHeightForWidth(textEdit->sizePolicy().hasHeightForWidth());
  90. textEdit->setSizePolicy(sizePolicy);
  91. textEdit->setMaximumSize(QSize(16777215, 16777215));
  92. ui->reg_table->addWidget(textEdit, off, 2, 1, 1);
  93. regitem->regEditer = textEdit;
  94. }
  95. {
  96. // new button
  97. auto *button = new QPushButton(parent);
  98. button->setObjectName(QString::fromUtf8("button"));
  99. button->setText(QString("Write"));
  100. QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  101. sizePolicy.setHorizontalStretch(0);
  102. sizePolicy.setVerticalStretch(0);
  103. sizePolicy.setHeightForWidth(button->sizePolicy().hasHeightForWidth());
  104. button->setSizePolicy(sizePolicy);
  105. // connect(this,
  106. connect(button, &QPushButton::clicked, [this, regadd](bool) { //
  107. QString regval_str = m_regdisplayer[regadd]->regEditer->toPlainText();
  108. uint32_t regval = str2int(regval_str);
  109. ZLOGI(TAG, "write reg 0x%04x %d", regadd, regval);
  110. uint32_t readbackval = 0;
  111. auto ecode = Xsync::Ins().reg_write(regadd, regval, readbackval);
  112. if (ecode == kxs_ec_success) {
  113. ZLOGI(TAG, "write reg 0x%04x %d success", regadd, regval);
  114. m_regdisplayer[regadd]->regvalcache = readbackval;
  115. updateUI_timeCodeInfo(regadd);
  116. } else {
  117. ZLOGE(TAG, "write reg 0x%04x %d fail,ecode:%s", regadd, regval, xs_error_code_2_str(ecode));
  118. }
  119. });
  120. regitem->writerButton = button;
  121. ui->reg_table->addWidget(button, off, 3, 1, 1);
  122. }
  123. m_regdisplayer[regadd] = regitem;
  124. }
  125. void MainWindow::updateUI_timeCodeInfo(uint32_t regoff) {
  126. // m_regdisplayer[regoff]->regBrowser->setText("0x" + QString::number(regValue, 16));
  127. uint32_t regval = m_regdisplayer[regoff]->regvalcache;
  128. auto *regBrowser = m_regdisplayer[regoff]->regBrowser;
  129. reg_val_type_t regvaltype = m_regdisplayer[regoff]->regvaltype;
  130. if (regvaltype == kreg_val_type_dotted_hex) {
  131. regBrowser->setText(QString(fmt("%02x.%02x.%02x.%02x", (regval >> 0) & 0xff, (regval >> 8) & 0xff, (regval >> 16) & 0xff, (regval >> 24) & 0xff)));
  132. } else if (regvaltype == kreg_val_type_dotted_decimal) {
  133. regBrowser->setText(QString(fmt("%d.%d.%d.%d", (regval >> 0) & 0xff, (regval >> 8) & 0xff, (regval >> 16) & 0xff, (regval >> 24) & 0xff)));
  134. } else if (regvaltype == kreg_val_type_str) {
  135. char text[5] = {0};
  136. memcpy(text, &regval, 4);
  137. regBrowser->setText(QString(text));
  138. } else if (regvaltype == kreg_val_type_hex) {
  139. regBrowser->setText(QString(fmt("0x%08x", regval)));
  140. } else if (regvaltype == kreg_val_type_decimal) {
  141. regBrowser->setText(QString::number(regval, 10));
  142. } else if (regvaltype == kreg_val_type_binary) {
  143. regBrowser->setText(QString::number(regval, 2));
  144. }
  145. }
  146. void MainWindow::construct_reg_table() { //
  147. int regoff = 1;
  148. push_reg(ui->gridLayoutWidget, regoff++, "software_version", kxsync_reg_software_version, 0, kreg_val_type_dotted_decimal);
  149. push_reg(ui->gridLayoutWidget, regoff++, "manufacturer0", kxsync_reg_manufacturer0, 0, kreg_val_type_str);
  150. push_reg(ui->gridLayoutWidget, regoff++, "manufacturer1", kxsync_reg_manufacturer1, 0, kreg_val_type_str);
  151. push_reg(ui->gridLayoutWidget, regoff++, "product_type_id", kxsync_reg_product_type_id, 0, kreg_val_type_decimal);
  152. push_reg(ui->gridLayoutWidget, regoff++, "sn_id0", kxsync_reg_sn_id0, 0, kreg_val_type_dotted_hex);
  153. push_reg(ui->gridLayoutWidget, regoff++, "sn_id1", kxsync_reg_sn_id1, 0, kreg_val_type_dotted_hex);
  154. push_reg(ui->gridLayoutWidget, regoff++, "sn_id2", kxsync_reg_sn_id2, 0, kreg_val_type_dotted_hex);
  155. push_reg(ui->gridLayoutWidget, regoff++, "mac0", kxsync_reg_mac0, 0, kreg_val_type_dotted_hex);
  156. push_reg(ui->gridLayoutWidget, regoff++, "mac1", kxsync_reg_mac1, 0, kreg_val_type_dotted_hex);
  157. // kxsync_reg_stm32_ip
  158. // kxsync_reg_stm32_gw
  159. // kxsync_reg_stm32_netmask
  160. // kxsync_reg_stm32_camera_sync_signal_count
  161. push_reg(ui->gridLayoutWidget, regoff++, "stm32_ip", kxsync_reg_stm32_ip, 0, kreg_val_type_dotted_decimal);
  162. push_reg(ui->gridLayoutWidget, regoff++, "stm32_gw", kxsync_reg_stm32_gw, 0, kreg_val_type_dotted_decimal);
  163. push_reg(ui->gridLayoutWidget, regoff++, "stm32_netmask", kxsync_reg_stm32_netmask, 0, kreg_val_type_dotted_decimal);
  164. push_reg(ui->gridLayoutWidget, regoff++, "stm32_camera_sync_signal_count", kxsync_reg_stm32_camera_sync_signal_count, 0, kreg_val_type_decimal);
  165. // 设置table的高度
  166. auto qrect = ui->gridLayoutWidget->geometry();
  167. qrect.setHeight(31 * regoff - 1);
  168. ui->gridLayoutWidget->setGeometry(qrect);
  169. }
  170. //
  171. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
  172. ui->setupUi(this);
  173. m_mainWindow = this;
  174. construct_reg_table();
  175. qInstallMessageHandler(log_output);
  176. qRegisterMetaType<int32_t>("int32_t");
  177. qRegisterMetaType<uint32_t>("uint32_t");
  178. qRegisterMetaType<function<void()>>("function<void()>");
  179. qRegisterMetaType<QFunction>("QFunction");
  180. XSyncUdpFactoryImpl::Ins()->initialize();
  181. connect(this, SIGNAL(append_log_signal(QString)), this, SLOT(append_log_slot(QString)));
  182. connect(this, SIGNAL(updateUI_timeCodeInfo_signal(QString)), this, SLOT(updateUI_timeCodeInfo_slot(QString)));
  183. connect(this, SIGNAL(updateUI_cameraSyncInfo_signal(QString)), this, SLOT(updateUI_cameraSyncInfo_slot(QString)));
  184. connect(this, SIGNAL(updateUI_reg_signal(int32_t, uint32_t)), this, SLOT(updateUI_reg_slot(int32_t, uint32_t)));
  185. connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
  186. m_thread.reset(new ZQThread("test", [this]() { mainWindowsRun(); }));
  187. m_thread->start();
  188. // m_xsync.reset(new Xsync());
  189. Xsync::Ins().initialize(XSyncUdpFactoryImpl::Ins());
  190. Xsync::Ins().regOnTimecodeMsg([this](xysnc_timecode_t *timecode_msg) { //
  191. xysnc_timecode_t timecode = *timecode_msg;
  192. QString text = QString(fmt("%02d:%02d:%02d:%02d", timecode.hour, timecode.minute, timecode.second, timecode.frame));
  193. updateUI_timeCodeInfo_signal(text);
  194. });
  195. Xsync::Ins().regOnCameraSyncMsg([this](xysnc_camera_sync_data_t *camera_sync_msg) { //
  196. xysnc_camera_sync_data_t camera_sync_data = *camera_sync_msg;
  197. updateUI_cameraSyncInfo_signal(QString(fmt("%d", camera_sync_data.frameIndex)));
  198. });
  199. }
  200. MainWindow::~MainWindow() { delete ui; }
  201. #define XS_ASSERT(exptr) \
  202. { \
  203. auto ecode = exptr; \
  204. while (!(ecode == kxs_ec_success)) { \
  205. ZLOGE(TAG, "do: %s fail,ecode:%d", #exptr, ecode); \
  206. ZQThread::sleep(1); \
  207. } \
  208. }
  209. void MainWindow::on_RefreshRegsButton_clicked() { //
  210. ZLOGI(TAG, "on_refreshRegsButton_clicked");
  211. // int32_t _t1, uint32_t _t2
  212. QtConcurrent::run([this]() {
  213. bool suc = true;
  214. for (auto &reg : m_regdisplayer) {
  215. uint32_t regValue = 0;
  216. auto ecode = Xsync::Ins().reg_read(reg.first, regValue);
  217. int regoff = reg.first;
  218. if (ecode == kxs_ec_success) {
  219. ZLOGI(TAG, "reg_read %x success", reg.first);
  220. m_regdisplayer[regoff]->regvalcache = regValue;
  221. emit doinui_signal(QFunction([this, regoff, regValue]() { updateUI_timeCodeInfo(regoff); }));
  222. } else {
  223. emit doinui_signal(QFunction([this, regoff, regValue]() {
  224. m_regdisplayer[regoff]->regvalcache = 0;
  225. m_regdisplayer[regoff]->regBrowser->setText("error");
  226. }));
  227. }
  228. }
  229. });
  230. }
  231. void MainWindow::on_ClearLogButton_clicked() { //
  232. ui->logbrowser->clear();
  233. }
  234. void MainWindow::on_Connect2XsyncButton_clicked() { //
  235. ZLOGI(TAG, "connect %s", ui->IpInput->text().toStdString().c_str());
  236. xs_error_code_t ecode = Xsync::Ins().connect(ui->IpInput->text().toStdString());
  237. ZLOGI(TAG, "connect %s ecode:%s", ui->IpInput->text().toStdString().c_str(), xs_error_code_2_str(ecode));
  238. }
  239. void MainWindow::mainWindowsRun() { //
  240. // auto xsudp = XSyncUdpFactoryImpl::Ins()->createXSUDP();
  241. // XS_ASSERT(xsudp->initialize("0.0.0.0", 9999));
  242. // xsudp->startReceive([this, xsudp](XsyncNetAdd &from, uint8_t *data, size_t length) {
  243. // // ZLOGI(TAG, "receive from <%s:%d> (%d) :%s", from.ip.c_str(), from.port, data, length);
  244. // xsudp->sendto(from, "hello\n", 5, NULL);
  245. // });
  246. }
  247. #define DO_XSYNC_FUNC(exptr) \
  248. { \
  249. auto ecode = exptr; \
  250. if (!(ecode == kxs_ec_success)) { \
  251. ZLOGE(TAG, "do: %s fail,ecode:[%d](%s)", #exptr, ecode, xs_error_code_2_str(ecode)); \
  252. return; \
  253. } else { \
  254. ZLOGI(TAG, "do: %s success", #exptr); \
  255. } \
  256. }
  257. void MainWindow::on_GenNewMac_clicked() { DO_XSYNC_FUNC(Xsync::Ins().generatorNewMac()); }
  258. void MainWindow::on_FactoryReset_clicked() { DO_XSYNC_FUNC(Xsync::Ins().factoryReset()); }
  259. void MainWindow::on_Reboot_clicked() { DO_XSYNC_FUNC(Xsync::Ins().reboot()); }
  260. void MainWindow::on_ChangeNetCfg_clicked() { //
  261. DO_XSYNC_FUNC(Xsync::Ins().changeNetworkConfig(ui->ChangeNetCfg_ip->text().toStdString(), ui->ChangeNetCfg_mask->text().toStdString(), ui->ChangeNetCfg_gateway->text().toStdString()));
  262. }
  263. void MainWindow::on_WriteReg_clicked() {
  264. uint32_t regadd = str2int(ui->RegAdd->text());
  265. uint32_t regval = str2int(ui->RegVal->text());
  266. ZLOGI(TAG, "write reg 0x%08x %d", regadd, regval);
  267. uint32_t readbakval = 0;
  268. DO_XSYNC_FUNC(Xsync::Ins().reg_write(regadd, regval, readbakval));
  269. ZLOGI(TAG, "write reg 0x%08x 0x%08x ,readback:0x%08x success", regadd, regval, readbakval);
  270. ui->RegVal->setText(QString(fmt("0x%08x", readbakval)));
  271. }
  272. void MainWindow::on_ReadReg_clicked() {
  273. uint32_t regadd = str2int(ui->RegAdd->text());
  274. uint32_t regval = 0;
  275. DO_XSYNC_FUNC(Xsync::Ins().reg_read(regadd, regval));
  276. ZLOGI(TAG, "read reg 0x%08x 0x%08x success", regadd, regval);
  277. ui->RegVal->setText(QString(fmt("0x%08x", regval)));
  278. }