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.

881 lines
41 KiB

2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #include "mainwindow.h"
  2. #include <QDateTime>
  3. #include <QMessageBox>
  4. #include <QtConcurrent>
  5. #include <QtSerialPort/QSerialPort>
  6. #include <QtSerialPort/QSerialPortInfo>
  7. #include "./ui_mainwindow.h"
  8. #include "camera_light_src_timing_controller/qt_serial_datachannel.hpp"
  9. #include "logger.hpp"
  10. using namespace iflytop;
  11. using namespace clst;
  12. using namespace std;
  13. static MainWindow *m_mainWindow;
  14. static CLSTControler *m_clstc;
  15. QTimer *timer0;
  16. QTimer *timer1;
  17. QTimer *timer2;
  18. QTimer *timer3;
  19. QTimer *checkConnectTimer0;
  20. static bool m_connected = false;
  21. ZQThread *m_zqthread;
  22. #define TAG "MainWindow"
  23. static const char *fmt(const char *fmt, ...) {
  24. va_list args;
  25. va_start(args, fmt);
  26. static char buf[1024] = {0};
  27. vsnprintf(buf, sizeof(buf), fmt, args);
  28. va_end(args);
  29. return buf;
  30. }
  31. static const uint32_t str2int(QString str) {
  32. // 如果0x开头,??16进制转换
  33. // 如果0b开头,??2进制转换
  34. // 否则??10进制转换
  35. // 去除掉str中_
  36. str.remove("_");
  37. if (str.startsWith("0x")) {
  38. return str.toUInt(nullptr, 16);
  39. } else if (str.startsWith("0b")) {
  40. // remove 0b
  41. str.remove(0, 2);
  42. return str.toUInt(nullptr, 2);
  43. } else {
  44. return str.toUInt(nullptr, 10);
  45. }
  46. }
  47. // static QSerialPort G_SerialPort;
  48. // static QThread G_SerialPortThread;
  49. static QTDataChannel G_QTDataChannel;
  50. static const QString zaferror_to_str(zaf_error_code_t value) {
  51. if (value == kaf_ec_overtime) {
  52. return "通信超时";
  53. } else if (value == kaf_ec_device_notopen) {
  54. return "设备未打开";
  55. } else {
  56. return "未知错误";
  57. }
  58. }
  59. #define DO_NO_RET(action) \
  60. { \
  61. zaf_error_code_t ecode = action; \
  62. if (ecode != kaf_ec_success) { \
  63. dumpLog("do %s fail,%s", #action, zaferror_to_str(ecode).toStdString().c_str()); \
  64. displayInfo(false, zaferror_to_str(ecode)); \
  65. return; \
  66. } \
  67. }
  68. #define DO(action) \
  69. { \
  70. zaf_error_code_t ecode = action; \
  71. if (ecode != kaf_ec_success) { \
  72. dumpLog("do %s fail,%s", #action, zaferror_to_str(ecode).toStdString().c_str()); \
  73. displayInfo(false, zaferror_to_str(ecode)); \
  74. return ecode; \
  75. } \
  76. }
  77. void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
  78. // QString text;
  79. // text.append(msg);
  80. }
  81. // void MainWindow::append_log_slot(QString text) { ui->logbrowser->append(text); }
  82. void MainWindow::doinui_slot(QFunction func) {
  83. if (func.get()) func.get()();
  84. }
  85. zaf_error_code_t MainWindow::updatePage() {
  86. {
  87. float Freq;
  88. uint32_t PluseCnt;
  89. uint32_t SeqCtrlPluseCntMax;
  90. Freq = ui->InterClk_Freq_Text->text().toFloat();
  91. PluseCnt = ui->InterClk_PluseCnt_Text->text().toUInt();
  92. SeqCtrlPluseCntMax = ui->InterClk_SeqCtrlPluseCntMax_Text->text().toUInt();
  93. DO(m_clstc->InterClk_setFreq(Freq));
  94. DO(m_clstc->InterClk_setPluseCnt(PluseCnt));
  95. DO(m_clstc->InterClk_setSeqCtrlPluseCntMax(SeqCtrlPluseCntMax));
  96. }
  97. {
  98. ExtTriggerSrcType src;
  99. SigProcessMode mode;
  100. TriggerEdge edge;
  101. uint32_t coefficient;
  102. uint32_t bias;
  103. uint32_t division;
  104. uint32_t multiplication;
  105. uint32_t cnt;
  106. // TriInX_setSequentialControlPluseCntMax
  107. #define UPDATE(index) \
  108. src = ExtTriggerSrcType(ui->TriInX_SrcSelect_Val_##index->currentText().toStdString()); \
  109. coefficient = ui->TriInX_FileterCoefficient_Val_##index->text().toUInt(); \
  110. bias = ui->TriInX_FreqDetectBias_Val_##index->text().toUInt(); \
  111. mode = SigProcessMode(ui->TriInX_Mode_Val_##index->currentText().toStdString()); \
  112. edge = TriggerEdge(ui->TriInX_TriggerModeTriggerEdge_Val_##index->currentText().toStdString()); \
  113. division = ui->TriInX_TriggerModeFreqDivision_Val_##index->text().toUInt(); \
  114. multiplication = ui->TriInX_TriggerModeFreqMultiplication_Val_##index->text().toUInt(); \
  115. cnt = ui->TriInX_SequentialControlPluseCntMax_Val_##index->text().toUInt(); \
  116. DO(m_clstc->TriInX_setSrcSelect(index, src)); \
  117. DO(m_clstc->TriInX_setFileterCoefficient(index, coefficient)); \
  118. DO(m_clstc->TriInX_setFreqDetectBias(index, bias)); \
  119. DO(m_clstc->TriInX_setMode(index, mode)); \
  120. DO(m_clstc->TriInX_setTriggerModeTriggerEdge(index, edge)); \
  121. DO(m_clstc->TriInX_setTriggerModeFreqDivision(index, division)); \
  122. DO(m_clstc->TriInX_setTriggerModeFreqMultiplication(index, multiplication)); \
  123. DO(m_clstc->TriInX_setSequentialControlPluseCntMax(index, cnt));
  124. UPDATE(1);
  125. UPDATE(2);
  126. UPDATE(3);
  127. UPDATE(4);
  128. #undef UPDATE
  129. }
  130. {
  131. InternalSig src;
  132. uint32_t width;
  133. uint32_t offset;
  134. float duty;
  135. float freq;
  136. #define UPDATE(index) \
  137. src = InternalSig(ui->LightSrcX_TriSrc_##index->currentText().toStdString()); \
  138. width = ui->LightSrcX_TriggerModePluseWidth_##index->text().toUInt(); \
  139. offset = ui->LightSrcX_TriggerModeFirstPluseOffset_##index->text().toUInt(); \
  140. duty = ui->LightSrcX_LightIntensityDuty_##index->text().toFloat(); \
  141. freq = ui->LightSrcX_LightDriverFreq_##index->text().toFloat(); \
  142. DO(m_clstc->LightSrcX_setTriSrc(index, src)); \
  143. DO(m_clstc->LightSrcX_setTriggerModePluseWidth(index, width)); \
  144. DO(m_clstc->LightSrcX_setTriggerModeFirstPluseOffset(index, offset)); \
  145. DO(m_clstc->LightSrcX_setLightIntensityDuty(index, duty)); \
  146. DO(m_clstc->LightSrcX_setLightDriverFreq(index, freq));
  147. UPDATE(1);
  148. UPDATE(2);
  149. UPDATE(3);
  150. UPDATE(4);
  151. #undef UPDATE
  152. }
  153. {
  154. SigProcessMode mode;
  155. uint32_t offset;
  156. uint32_t bindstate1;
  157. uint32_t bindstate2;
  158. uint32_t bindstate3;
  159. uint32_t bindstate4;
  160. InternalSig sig;
  161. uint32_t reversal;
  162. #define UPDATE(index) \
  163. mode = SigProcessMode(ui->ShutterX_OutputCtrlMode_##index->currentText().toStdString()); \
  164. offset = ui->ShutterX_LtEnOffset_##index->text().toUInt(); \
  165. bindstate1 = ui->ShutterX_LtEnBind_val1_##index->checkState() == Qt::CheckState::Checked; \
  166. bindstate2 = ui->ShutterX_LtEnBind_val2_##index->checkState() == Qt::CheckState::Checked; \
  167. bindstate3 = ui->ShutterX_LtEnBind_val3_##index->checkState() == Qt::CheckState::Checked; \
  168. bindstate4 = ui->ShutterX_LtEnBind_val4_##index->checkState() == Qt::CheckState::Checked; \
  169. sig = InternalSig(ui->ShutterX_InSigSelect_##index->currentText().toStdString()); \
  170. reversal = ui->ShutterX_OutPolarityReversal_##index->checkState() == Qt::CheckState::Checked; \
  171. DO(m_clstc->ShutterX_setOutputCtrlMode(index, mode)); \
  172. DO(m_clstc->ShutterX_setLtEnOffset(index, offset)); \
  173. DO(m_clstc->ShutterX_setLtEnBind(index, 1, bindstate1)); \
  174. DO(m_clstc->ShutterX_setLtEnBind(index, 2, bindstate2)); \
  175. DO(m_clstc->ShutterX_setLtEnBind(index, 3, bindstate3)); \
  176. DO(m_clstc->ShutterX_setLtEnBind(index, 4, bindstate4)); \
  177. DO(m_clstc->ShutterX_setInSigSelect(index, sig)); \
  178. DO(m_clstc->ShutterX_setOutPolarityReversal(index, reversal));
  179. UPDATE(1);
  180. UPDATE(2);
  181. UPDATE(3);
  182. UPDATE(4);
  183. #undef UPDATE
  184. }
  185. return kaf_ec_success;
  186. }
  187. void MainWindow::refreshReadonlyPage0() {
  188. zaf_error_code_t ecode;
  189. if (!G_QTDataChannel.isOpen()) {
  190. return;
  191. }
  192. {
  193. float TriOutSignalFreq;
  194. DO_NO_RET(m_clstc->InterClk_readTriOutSignalFreq(TriOutSignalFreq));
  195. emit doinui_signal(QFunction([this, TriOutSignalFreq]() { //
  196. ui->InterClk_TriOutSignalFreq_Text->setText(QString::number(TriOutSignalFreq, 'f', 2));
  197. }));
  198. }
  199. }
  200. void MainWindow::refreshReadonlyPage1() {
  201. if (!G_QTDataChannel.isOpen()) {
  202. return;
  203. }
  204. {
  205. float infreq;
  206. float outfreq;
  207. #define UPDATE(index) \
  208. DO_NO_RET(m_clstc->TriInX_readInSignalFreq(index, infreq)); \
  209. DO_NO_RET(m_clstc->TriInX_readOutSignalFreq(index, outfreq)); \
  210. { \
  211. emit doinui_signal(QFunction([this, infreq, outfreq]() { \
  212. ui->TriInX_OutSignalFreq_Val_##index->setText(QString::number(outfreq, 'f', 2)); \
  213. ui->TriInX_InSignalFreq_Val_##index->setText(QString::number(infreq, 'f', 2)); \
  214. })); \
  215. }
  216. UPDATE(1);
  217. UPDATE(2);
  218. UPDATE(3);
  219. UPDATE(4);
  220. #undef UPDATE
  221. }
  222. }
  223. void MainWindow::refreshReadonlyPage2() {
  224. if (!G_QTDataChannel.isOpen()) {
  225. return;
  226. }
  227. // 刷新光源时序控制页面
  228. {
  229. float infreq;
  230. float outfreq;
  231. uint32_t state;
  232. #define UPDATE(index) \
  233. DO_NO_RET(m_clstc->LightSrcX_readInSigFreqDetect(index, infreq)); \
  234. DO_NO_RET(m_clstc->LightSrcX_readOutSigFreqDetect(index, outfreq)); \
  235. DO_NO_RET(m_clstc->LightSrcX_readLightSrcErrorState(index, state)); \
  236. { \
  237. emit doinui_signal(QFunction([this, infreq, outfreq, state]() { \
  238. ui->LightSrcX_InSigFreqDetect_##index->setText(QString::number(infreq, 'f', 2)); \
  239. ui->LightSrcX_OutSigFreqDetect_##index->setText(QString::number(outfreq, 'f', 2)); \
  240. ui->LightSrcX_LightSrcErrorState_##index->setText(QString::number(state)); \
  241. })); \
  242. }
  243. UPDATE(1);
  244. UPDATE(2);
  245. UPDATE(3);
  246. UPDATE(4);
  247. #undef UPDATE
  248. }
  249. }
  250. void MainWindow::refreshReadonlyPage3() {
  251. if (!G_QTDataChannel.isOpen()) {
  252. return;
  253. }
  254. }
  255. bool MainWindow::checkConnected() {
  256. if (!G_QTDataChannel.isOpen()) {
  257. return false;
  258. }
  259. uint32_t val;
  260. zaf_error_code_t ecode = m_clstc->reg_read(kreg_software_version, val);
  261. if (ecode != kaf_ec_success) {
  262. return false;
  263. }
  264. return true;
  265. }
  266. zaf_error_code_t MainWindow::refreshPage() {
  267. /*******************************************************************************
  268. * *
  269. *******************************************************************************/
  270. {
  271. float Freq;
  272. uint32_t PluseCnt;
  273. uint32_t SeqCtrlPluseCntMax;
  274. float TriOutSignalFreq;
  275. DO(m_clstc->InterClk_getFreq(Freq));
  276. DO(m_clstc->InterClk_getPluseCnt(PluseCnt));
  277. DO(m_clstc->InterClk_getSeqCtrlPluseCntMax(SeqCtrlPluseCntMax));
  278. DO(m_clstc->InterClk_readTriOutSignalFreq(TriOutSignalFreq));
  279. ui->InterClk_Freq_Text->setText(QString::number(Freq, 'f', 2));
  280. ui->InterClk_PluseCnt_Text->setText(QString::number(PluseCnt));
  281. ui->InterClk_SeqCtrlPluseCntMax_Text->setText(QString::number(SeqCtrlPluseCntMax));
  282. ui->InterClk_TriOutSignalFreq_Text->setText(QString::number(TriOutSignalFreq, 'f', 2));
  283. }
  284. /*******************************************************************************
  285. * *
  286. *******************************************************************************/
  287. {
  288. ExtTriggerSrcType src;
  289. SigProcessMode mode;
  290. TriggerEdge edge;
  291. uint32_t coefficient;
  292. uint32_t bias;
  293. uint32_t division;
  294. uint32_t multiplication;
  295. float infreq;
  296. float outfreq;
  297. uint32_t cnt;
  298. // TriInX_setSequentialControlPluseCntMax
  299. #define UPDATE(index) \
  300. DO(m_clstc->TriInX_getSrcSelect(index, src)); \
  301. DO(m_clstc->TriInX_getFileterCoefficient(index, coefficient)); \
  302. DO(m_clstc->TriInX_getFreqDetectBias(index, bias)); \
  303. DO(m_clstc->TriInX_getMode(index, mode)); \
  304. DO(m_clstc->TriInX_getTriggerModeTriggerEdge(index, edge)); \
  305. DO(m_clstc->TriInX_getTriggerModeFreqDivision(index, division)); \
  306. DO(m_clstc->TriInX_getTriggerModeFreqMultiplication(index, multiplication)); \
  307. DO(m_clstc->TriInX_readInSignalFreq(index, infreq)); \
  308. DO(m_clstc->TriInX_readOutSignalFreq(index, outfreq)); \
  309. DO(m_clstc->TriInX_getSequentialControlPluseCntMax(index, cnt)); \
  310. ui->TriInX_SrcSelect_Val_##index->setCurrentText(QString::fromStdString(src.toString())); \
  311. ui->TriInX_FileterCoefficient_Val_##index->setText(QString::number(coefficient)); \
  312. ui->TriInX_FreqDetectBias_Val_##index->setText(QString::number(bias)); \
  313. ui->TriInX_Mode_Val_##index->setCurrentText(QString::fromStdString(mode.toString())); \
  314. ui->TriInX_OutSignalFreq_Val_##index->setText(QString::number(outfreq, 'f', 2)); \
  315. ui->TriInX_InSignalFreq_Val_##index->setText(QString::number(infreq, 'f', 2)); \
  316. ui->TriInX_TriggerModeFreqDivision_Val_##index->setText(QString::number(division)); \
  317. ui->TriInX_TriggerModeFreqMultiplication_Val_##index->setText(QString::number(multiplication)); \
  318. ui->TriInX_TriggerModeTriggerEdge_Val_##index->setCurrentText(QString::fromStdString(edge.toString())); \
  319. ui->TriInX_SequentialControlPluseCntMax_Val_##index->setText(QString::number(cnt));
  320. UPDATE(1);
  321. UPDATE(2);
  322. UPDATE(3);
  323. UPDATE(4);
  324. #undef UPDATE
  325. }
  326. // 刷新光源时序控制页面
  327. {
  328. InternalSig src;
  329. uint32_t width;
  330. uint32_t offset;
  331. float duty;
  332. float freq;
  333. uint32_t state;
  334. float infreq;
  335. float outfreq;
  336. #define UPDATE(index) \
  337. DO(m_clstc->LightSrcX_getTriSrc(index, src)); \
  338. DO(m_clstc->LightSrcX_getTriggerModePluseWidth(index, width)); \
  339. DO(m_clstc->LightSrcX_getTriggerModeFirstPluseOffset(index, offset)); \
  340. DO(m_clstc->LightSrcX_getLightIntensityDuty(index, duty)); \
  341. DO(m_clstc->LightSrcX_getLightDriverFreq(index, freq)); \
  342. DO(m_clstc->LightSrcX_readLightSrcErrorState(index, state)); \
  343. DO(m_clstc->LightSrcX_readInSigFreqDetect(index, infreq)); \
  344. DO(m_clstc->LightSrcX_readOutSigFreqDetect(index, outfreq)); \
  345. ui->LightSrcX_TriSrc_##index->setCurrentText(QString::fromStdString(src.toString())); \
  346. ui->LightSrcX_TriggerModePluseWidth_##index->setText(QString::number(width)); \
  347. ui->LightSrcX_TriggerModeFirstPluseOffset_##index->setText(QString::number(offset)); \
  348. ui->LightSrcX_LightIntensityDuty_##index->setText(QString::number(duty, 'f', 2)); \
  349. ui->LightSrcX_LightDriverFreq_##index->setText(QString::number(freq, 'f', 2)); \
  350. ui->LightSrcX_LightSrcErrorState_##index->setText(QString::number(state)); \
  351. ui->LightSrcX_InSigFreqDetect_##index->setText(QString::number(infreq, 'f', 2)); \
  352. ui->LightSrcX_OutSigFreqDetect_##index->setText(QString::number(outfreq, 'f', 2));
  353. UPDATE(1);
  354. UPDATE(2);
  355. UPDATE(3);
  356. UPDATE(4);
  357. #undef UPDATE
  358. }
  359. {
  360. SigProcessMode mode;
  361. uint32_t offset;
  362. uint32_t bindstate1;
  363. uint32_t bindstate2;
  364. uint32_t bindstate3;
  365. uint32_t bindstate4;
  366. InternalSig sig;
  367. uint32_t reversal;
  368. // zaf_error_code_t ShutterX_setOutPolarityReversal(int32_t index, uint32_t reversal);
  369. #define UPDATE(index) \
  370. DO(m_clstc->ShutterX_getOutputCtrlMode(index, mode)); \
  371. DO(m_clstc->ShutterX_getLtEnOffset(index, offset)); \
  372. DO(m_clstc->ShutterX_getLtEnBind(index, 1, bindstate1)); \
  373. DO(m_clstc->ShutterX_getLtEnBind(index, 2, bindstate2)); \
  374. DO(m_clstc->ShutterX_getLtEnBind(index, 3, bindstate3)); \
  375. DO(m_clstc->ShutterX_getLtEnBind(index, 4, bindstate4)); \
  376. DO(m_clstc->ShutterX_getInSigSelect(index, sig)); \
  377. DO(m_clstc->ShutterX_getOutPolarityReversal(index, reversal)); \
  378. ui->ShutterX_OutputCtrlMode_##index->setCurrentText(QString::fromStdString(mode.toString())); \
  379. ui->ShutterX_LtEnOffset_##index->setText(QString::number(offset)); \
  380. ui->ShutterX_LtEnBind_val1_##index->setChecked(bindstate1 != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); \
  381. ui->ShutterX_LtEnBind_val2_##index->setChecked(bindstate2 != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); \
  382. ui->ShutterX_LtEnBind_val3_##index->setChecked(bindstate3 != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); \
  383. ui->ShutterX_LtEnBind_val4_##index->setChecked(bindstate4 != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); \
  384. ui->ShutterX_InSigSelect_##index->setCurrentText(QString::fromStdString(sig.toString())); \
  385. ui->ShutterX_OutPolarityReversal_##index->setChecked(reversal != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked);
  386. // ui->ShutterX_LtEnBind_val1_1->checkState()
  387. UPDATE(1);
  388. UPDATE(2);
  389. UPDATE(3);
  390. UPDATE(4);
  391. #undef UPDATE
  392. }
  393. return kaf_ec_success;
  394. }
  395. void MainWindow::constructUI() {
  396. /*******************************************************************************
  397. * serialPortCB *
  398. *******************************************************************************/
  399. const auto infos = QSerialPortInfo::availablePorts();
  400. for (const QSerialPortInfo &info : infos) {
  401. ui->serialPortCB->addItem(info.portName());
  402. }
  403. /*******************************************************************************
  404. * ?? *
  405. *******************************************************************************/
  406. ui->serialBaudrateCB->addItem("9600");
  407. ui->serialBaudrateCB->addItem("14400");
  408. ui->serialBaudrateCB->addItem("19200");
  409. ui->serialBaudrateCB->addItem("38400");
  410. ui->serialBaudrateCB->addItem("57600");
  411. ui->serialBaudrateCB->addItem("115200");
  412. ui->serialBaudrateCB->addItem("500000");
  413. ui->serialBaudrateCB->setCurrentIndex(6);
  414. /*******************************************************************************
  415. * *
  416. *******************************************************************************/
  417. connect(ui->serialPortRefreshKey, &QPushButton::clicked, this, [this](bool check) {
  418. ui->serialPortCB->clear();
  419. const auto infos = QSerialPortInfo::availablePorts();
  420. for (const QSerialPortInfo &info : infos) {
  421. ui->serialPortCB->addItem(info.portName());
  422. }
  423. });
  424. /*******************************************************************************
  425. * *
  426. *******************************************************************************/
  427. connect(ui->serialOpenKey, &QPushButton::clicked, this, [=](bool check) {
  428. // 打开串口
  429. if (ui->serialOpenKey->text() == "打开") {
  430. G_QTDataChannel.setPortName(ui->serialPortCB->currentText().toStdString());
  431. G_QTDataChannel.setBaudRate(ui->serialBaudrateCB->currentText().toInt());
  432. G_QTDataChannel.setDataBits(QSerialPort::Data8);
  433. G_QTDataChannel.setParity(QSerialPort::NoParity);
  434. G_QTDataChannel.setFlowControl(QSerialPort::NoFlowControl);
  435. G_QTDataChannel.setStopBits(QSerialPort::OneStop);
  436. if (!G_QTDataChannel.open()) {
  437. QMessageBox::about(NULL, "提示", "串口无法打开,串口不存在或已被占??");
  438. return;
  439. }
  440. ui->serialOpenKey->setText("关闭");
  441. // 下拉菜单控件使能
  442. ui->serialBaudrateCB->setEnabled(false);
  443. ui->serialPortCB->setEnabled(false);
  444. ui->serialPortRefreshKey->setEnabled(false);
  445. } else {
  446. G_QTDataChannel.close();
  447. ui->serialOpenKey->setText("打开");
  448. ui->serialBaudrateCB->setEnabled(true);
  449. ui->serialPortCB->setEnabled(true);
  450. ui->serialPortRefreshKey->setEnabled(true);
  451. }
  452. });
  453. /*******************************************************************************
  454. * *
  455. *******************************************************************************/
  456. connect(ui->refreshPageKey, &QPushButton::clicked, this, [=](bool check) { //
  457. zaf_error_code_t ecode = refreshPage();
  458. if (ecode != kaf_ec_success) return;
  459. dumpLog("刷新成功");
  460. displayInfo(true, "刷新成功");
  461. QMessageBox::about(NULL, "消息", "刷新成功");
  462. });
  463. connect(ui->UpdateCfg_Key, &QPushButton::clicked, this, [=](bool check) { //
  464. zaf_error_code_t ecode = updatePage();
  465. if (ecode != kaf_ec_success) return;
  466. ecode = refreshPage();
  467. if (ecode != kaf_ec_success) return;
  468. dumpLog("提交成功");
  469. displayInfo(true, "提交成功");
  470. QMessageBox::about(NULL, "消息", "提交成功");
  471. });
  472. /*******************************************************************************
  473. * *
  474. *******************************************************************************/
  475. connect(ui->storageConfigKey, &QPushButton::clicked, this, [=](bool check) { //
  476. DO(m_clstc->storageConfigs());
  477. dumpLog("保存配置成功");
  478. displayInfo(true, "保存配置成功");
  479. QMessageBox::about(NULL, "消息", "保存配置成功");
  480. });
  481. /*******************************************************************************
  482. * *
  483. *******************************************************************************/
  484. connect(ui->rebootDeviceKey, &QPushButton::clicked, this, [=](bool check) { //
  485. DO_NO_RET(m_clstc->reboot());
  486. dumpLog("重启设备成功");
  487. displayInfo(true, "重启设备成功");
  488. QMessageBox::about(NULL, "消息", "重启设备成功");
  489. });
  490. /*******************************************************************************
  491. * *
  492. *******************************************************************************/
  493. connect(ui->factoryResetKey, &QPushButton::clicked, this, [=](bool check) { //
  494. DO_NO_RET(m_clstc->factoryReset());
  495. dumpLog("恢复出厂设置成功");
  496. displayInfo(true, "恢复出厂设置成功");
  497. QMessageBox::about(NULL, "消息", "恢复出厂设置成功");
  498. });
  499. /*******************************************************************************
  500. * ?? *
  501. *******************************************************************************/
  502. ui->RegAdd->setText("0x00000000");
  503. connect(ui->regReadKey, &QPushButton::clicked, this, [=](bool check) { //
  504. uint32_t addr = str2int(ui->RegAdd->text());
  505. uint32_t value = 0;
  506. DO_NO_RET(m_clstc->reg_read(addr, value, 100));
  507. ui->regReadbakVal->setText(fmt("0x%08X", value));
  508. dumpLog(fmt("读取0x%04x成功", addr));
  509. });
  510. connect(ui->regWriteKey, &QPushButton::clicked, this, [=](bool check) { //
  511. uint32_t addr = str2int(ui->RegAdd->text());
  512. uint32_t value = str2int(ui->regWriteVal->text());
  513. uint32_t readkbak = 0;
  514. DO_NO_RET(m_clstc->reg_write(addr, value, readkbak, 100));
  515. ui->regReadbakVal->setText(fmt("0x%04x", readkbak));
  516. dumpLog(fmt("写入0x%08x成功", addr));
  517. });
  518. connect(ui->InterClk_trigger_Key, &QPushButton::clicked, this, [=](bool check) { //
  519. DO_NO_RET(m_clstc->InterClk_trigger());
  520. dumpLog(fmt("触发成功"));
  521. });
  522. connect(ui->InterClk_stop_Key, &QPushButton::clicked, this, [=](bool check) { //
  523. DO_NO_RET(m_clstc->InterClk_stop());
  524. dumpLog(fmt("停止触发成功"));
  525. });
  526. /*******************************************************************************
  527. * *
  528. *******************************************************************************/
  529. ui->TriInX_SrcSelect_Val_1->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
  530. ui->TriInX_SrcSelect_Val_1->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
  531. ui->TriInX_Mode_Val_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
  532. ui->TriInX_Mode_Val_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  533. ui->TriInX_TriggerModeTriggerEdge_Val_1->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
  534. ui->TriInX_TriggerModeTriggerEdge_Val_1->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
  535. ui->TriInX_SrcSelect_Val_2->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
  536. ui->TriInX_SrcSelect_Val_2->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
  537. ui->TriInX_Mode_Val_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
  538. ui->TriInX_Mode_Val_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  539. ui->TriInX_TriggerModeTriggerEdge_Val_2->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
  540. ui->TriInX_TriggerModeTriggerEdge_Val_2->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
  541. ui->TriInX_SrcSelect_Val_3->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
  542. ui->TriInX_SrcSelect_Val_3->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
  543. ui->TriInX_Mode_Val_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
  544. ui->TriInX_Mode_Val_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  545. ui->TriInX_TriggerModeTriggerEdge_Val_3->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
  546. ui->TriInX_TriggerModeTriggerEdge_Val_3->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
  547. ui->TriInX_SrcSelect_Val_4->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
  548. ui->TriInX_SrcSelect_Val_4->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
  549. ui->TriInX_Mode_Val_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
  550. ui->TriInX_Mode_Val_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  551. ui->TriInX_TriggerModeTriggerEdge_Val_4->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
  552. ui->TriInX_TriggerModeTriggerEdge_Val_4->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
  553. ui->TriInX_InSignalFreq_Val_1->setDisabled(true);
  554. ui->TriInX_InSignalFreq_Val_2->setDisabled(true);
  555. ui->TriInX_InSignalFreq_Val_3->setDisabled(true);
  556. ui->TriInX_InSignalFreq_Val_4->setDisabled(true);
  557. ui->TriInX_OutSignalFreq_Val_1->setDisabled(true);
  558. ui->TriInX_OutSignalFreq_Val_2->setDisabled(true);
  559. ui->TriInX_OutSignalFreq_Val_3->setDisabled(true);
  560. ui->TriInX_OutSignalFreq_Val_4->setDisabled(true);
  561. /*******************************************************************************
  562. * *
  563. *******************************************************************************/
  564. QStringList LightSrcX_TriSrc_QStringList;
  565. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::LOGIC0).toString()));
  566. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::LOGIC1).toString()));
  567. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER).toString()));
  568. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER_I1).toString()));
  569. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER_I2).toString()));
  570. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER_I3).toString()));
  571. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER_I4).toString()));
  572. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1).toString()));
  573. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1_I1).toString()));
  574. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1_I2).toString()));
  575. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1_I3).toString()));
  576. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1_I4).toString()));
  577. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2).toString()));
  578. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2_I1).toString()));
  579. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2_I2).toString()));
  580. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2_I3).toString()));
  581. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2_I4).toString()));
  582. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3).toString()));
  583. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3_I1).toString()));
  584. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3_I2).toString()));
  585. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3_I3).toString()));
  586. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3_I4).toString()));
  587. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4).toString()));
  588. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4_I1).toString()));
  589. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4_I2).toString()));
  590. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4_I3).toString()));
  591. LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4_I4).toString()));
  592. ui->LightSrcX_TriSrc_1->addItems(LightSrcX_TriSrc_QStringList);
  593. ui->LightSrcX_TriSrc_2->addItems(LightSrcX_TriSrc_QStringList);
  594. ui->LightSrcX_TriSrc_3->addItems(LightSrcX_TriSrc_QStringList);
  595. ui->LightSrcX_TriSrc_4->addItems(LightSrcX_TriSrc_QStringList);
  596. ui->LightSrcX_InSigFreqDetect_1->setDisabled(true);
  597. ui->LightSrcX_InSigFreqDetect_2->setDisabled(true);
  598. ui->LightSrcX_InSigFreqDetect_3->setDisabled(true);
  599. ui->LightSrcX_InSigFreqDetect_4->setDisabled(true);
  600. ui->LightSrcX_OutSigFreqDetect_1->setDisabled(true);
  601. ui->LightSrcX_OutSigFreqDetect_2->setDisabled(true);
  602. ui->LightSrcX_OutSigFreqDetect_3->setDisabled(true);
  603. ui->LightSrcX_OutSigFreqDetect_4->setDisabled(true);
  604. ui->LightSrcX_LightSrcErrorState_1->setDisabled(true);
  605. ui->LightSrcX_LightSrcErrorState_2->setDisabled(true);
  606. ui->LightSrcX_LightSrcErrorState_3->setDisabled(true);
  607. ui->LightSrcX_LightSrcErrorState_4->setDisabled(true);
  608. ui->LightSrcX_LightDriverFreq_1->setDisabled(false);
  609. ui->LightSrcX_LightDriverFreq_2->setDisabled(false);
  610. ui->LightSrcX_LightDriverFreq_3->setDisabled(false);
  611. ui->LightSrcX_LightDriverFreq_4->setDisabled(false);
  612. /*******************************************************************************
  613. * *
  614. *******************************************************************************/
  615. ui->ShutterX_OutputCtrlMode_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  616. ui->ShutterX_OutputCtrlMode_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  617. ui->ShutterX_OutputCtrlMode_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  618. ui->ShutterX_OutputCtrlMode_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  619. ui->ShutterX_OutputCtrlMode_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::BIND_MODE).toString()));
  620. ui->ShutterX_OutputCtrlMode_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::BIND_MODE).toString()));
  621. ui->ShutterX_OutputCtrlMode_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::BIND_MODE).toString()));
  622. ui->ShutterX_OutputCtrlMode_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::BIND_MODE).toString()));
  623. ui->ShutterX_InSigSelect_1->addItems(LightSrcX_TriSrc_QStringList);
  624. ui->ShutterX_InSigSelect_2->addItems(LightSrcX_TriSrc_QStringList);
  625. ui->ShutterX_InSigSelect_3->addItems(LightSrcX_TriSrc_QStringList);
  626. ui->ShutterX_InSigSelect_4->addItems(LightSrcX_TriSrc_QStringList);
  627. ui->InterClk_TriOutSignalFreq_Text->setDisabled(true);
  628. }
  629. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
  630. // G_SerialPort.moveToThread();
  631. // QObject::connect(&G_SerialPortThread, &QThread::started, &G_SerialPort, &QSerialPort::open);
  632. G_QTDataChannel.init();
  633. CLSTControler::ins()->initialize(&G_QTDataChannel);
  634. m_clstc = CLSTControler::ins();
  635. ui->setupUi(this);
  636. m_mainWindow = this;
  637. qRegisterMetaType<int32_t>("int32_t");
  638. qRegisterMetaType<uint32_t>("uint32_t");
  639. qRegisterMetaType<float>("float");
  640. qRegisterMetaType<function<void()>>("function<void()>");
  641. qRegisterMetaType<QFunction>("QFunction");
  642. // qInstallMessageHandler(log_output);
  643. connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
  644. constructUI();
  645. // 创建定时器
  646. timer0 = new QTimer(this);
  647. timer1 = new QTimer(this);
  648. timer2 = new QTimer(this);
  649. timer3 = new QTimer(this);
  650. checkConnectTimer0 = new QTimer(this);
  651. m_zqthread = new ZQThread("", [this]() {
  652. while (true) {
  653. static bool first = true;
  654. bool connect = checkConnected();
  655. if (m_connected != connect || first) {
  656. first = false;
  657. m_connected = connect;
  658. emit doinui_signal(QFunction([this, connect]() {
  659. if (connect) {
  660. ui->DeviceConnectStateTB->setText("已连接");
  661. ui->DeviceConnectStateTB->setStyleSheet("color: green");
  662. displayInfo(true, "连接成功");
  663. } else {
  664. ui->DeviceConnectStateTB->setText("未连接");
  665. ui->DeviceConnectStateTB->setStyleSheet("color: red");
  666. }
  667. if (m_connected) {
  668. refreshPage();
  669. }
  670. }));
  671. }
  672. refreshReadonlyPage0();
  673. refreshReadonlyPage1();
  674. refreshReadonlyPage2();
  675. refreshReadonlyPage3();
  676. std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  677. }
  678. });
  679. m_zqthread->start();
  680. // connect(timer0, &QTimer::timeout, this, [this]() { refreshReadonlyPage0(); });
  681. // connect(timer1, &QTimer::timeout, this, [this]() { refreshReadonlyPage1(); });
  682. // connect(timer2, &QTimer::timeout, this, [this]() { refreshReadonlyPage2(); });
  683. // connect(timer3, &QTimer::timeout, this, [this]() { refreshReadonlyPage3(); });
  684. // connect(checkConnectTimer0, &QTimer::timeout, this, [this]() { //
  685. // static bool connected = false;
  686. // bool connect = checkConnected();
  687. // if (connect) {
  688. // ui->DeviceConnectStateTB->setText("已连接");
  689. // ui->DeviceConnectStateTB->setStyleSheet("color: green");
  690. // } else {
  691. // ui->DeviceConnectStateTB->setText("未连接");
  692. // ui->DeviceConnectStateTB->setStyleSheet("color: red");
  693. // }
  694. // if (connected != connect) {
  695. // connected = connect;
  696. // if (connected) {
  697. // refreshPage();
  698. // }
  699. // }
  700. // });
  701. // timer0->setInterval(1100); // 每隔一秒触发一次
  702. // timer1->setInterval(1200); // 每隔一秒触发一次
  703. // timer2->setInterval(900); // 每隔一秒触发一次
  704. // timer3->setInterval(1000); // 每隔一秒触发一次
  705. // checkConnectTimer0->setInterval(100);
  706. // timer0->start();
  707. // timer1->start();
  708. // timer2->start();
  709. // timer3->start();
  710. // checkConnectTimer0->start();
  711. // m_clstc->regRawDataListener([this](uart_message_type_t type, uint8_t *data, size_t len) {
  712. // QString text;
  713. // if (type == kuart_raw_tx) {
  714. // text.append("TX: ");
  715. // for (size_t i = 0; i < len; i++) {
  716. // text.append(fmt("%02X ", data[i]));
  717. // }
  718. // } else if (type == kuart_raw_rx) {
  719. // text.append("RX: ");
  720. // for (size_t i = 0; i < len; i++) {
  721. // text.append(fmt("%02X ", data[i]));
  722. // }
  723. // }
  724. // emit doinui_signal(QFunction([this, text]() {
  725. // if (ui->instructionPreview->document()->lineCount() > 100) {
  726. // ui->instructionPreview->document()->clear();
  727. // }
  728. // ui->instructionPreview->append(text);
  729. // }));
  730. // });
  731. }
  732. void MainWindow::dumpLog(const char *fmt, ...) {
  733. va_list args;
  734. va_start(args, fmt);
  735. char buf[1024] = {0};
  736. vsnprintf(buf, sizeof(buf), fmt, args);
  737. // qDebug() << buf;
  738. va_end(args);
  739. QString text(buf);
  740. QString info;
  741. // zos_get_ticket
  742. info.append(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"));
  743. info.append(" [Info]:");
  744. info.append(text);
  745. static int id;
  746. // informationBrowser
  747. emit doinui_signal(QFunction([this, info]() {
  748. if (ui->instructionPreview->document()->lineCount() > 100) {
  749. ui->instructionPreview->document()->clear();
  750. }
  751. ui->instructionPreview->append(info);
  752. }));
  753. }
  754. void MainWindow::displayInfo(bool suc, QString info) {
  755. emit doinui_signal(QFunction([this, info, suc]() {
  756. static int cnt = 0;
  757. cnt++;
  758. QString _info;
  759. _info.append("[");
  760. _info.append(QString::number(cnt));
  761. _info.append("] ");
  762. _info.append(info);
  763. if (suc) {
  764. ui->informationBrowser->setStyleSheet("color: green");
  765. } else {
  766. ui->informationBrowser->setStyleSheet("color: red");
  767. }
  768. ui->informationBrowser->setText(_info);
  769. }));
  770. }
  771. MainWindow::~MainWindow() { delete ui; }