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.

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