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.

449 lines
20 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
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. #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 *timer;
  16. #define TAG "MainWindow"
  17. static const char *fmt(const char *fmt, ...) {
  18. va_list args;
  19. va_start(args, fmt);
  20. static char buf[1024] = {0};
  21. vsnprintf(buf, sizeof(buf), fmt, args);
  22. va_end(args);
  23. return buf;
  24. }
  25. static const uint32_t str2int(QString str) {
  26. // 如果0x开头,??16进制转换
  27. // 如果0b开头,??2进制转换
  28. // 否则??10进制转换
  29. // 去除掉str中_
  30. str.remove("_");
  31. if (str.startsWith("0x")) {
  32. return str.toUInt(nullptr, 16);
  33. } else if (str.startsWith("0b")) {
  34. // remove 0b
  35. str.remove(0, 2);
  36. return str.toUInt(nullptr, 2);
  37. } else {
  38. return str.toUInt(nullptr, 10);
  39. }
  40. }
  41. // static QSerialPort G_SerialPort;
  42. // static QThread G_SerialPortThread;
  43. static QTDataChannel G_QTDataChannel;
  44. static const QString zaferror_to_str(zaf_error_code_t value) {
  45. if (value == kaf_ec_overtime) {
  46. return "操作超时";
  47. } else if (value == kaf_ec_device_notopen) {
  48. return "设备未打开";
  49. } else {
  50. return "未知错误";
  51. }
  52. }
  53. #define DO(action) \
  54. { \
  55. zaf_error_code_t ecode = action; \
  56. if (ecode != kaf_ec_success) { \
  57. dumpLog("do %s fail,%s", #action, zaferror_to_str(ecode).toStdString().c_str()); \
  58. return; \
  59. } \
  60. }
  61. void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
  62. // QString text;
  63. // text.append(msg);
  64. }
  65. // void MainWindow::append_log_slot(QString text) { ui->logbrowser->append(text); }
  66. void MainWindow::doinui_slot(QFunction func) {
  67. if (func.get()) func.get()();
  68. }
  69. void MainWindow::updatePage() {
  70. {
  71. float Freq;
  72. uint32_t PluseCnt;
  73. uint32_t SeqCtrlPluseCntMax;
  74. Freq = ui->InterClk_Freq_Text->text().toFloat();
  75. PluseCnt = ui->InterClk_PluseCnt_Text->text().toUInt();
  76. SeqCtrlPluseCntMax = ui->InterClk_SeqCtrlPluseCntMax_Text->text().toUInt();
  77. DO(m_clstc->InterClk_setFreq(Freq));
  78. DO(m_clstc->InterClk_setPluseCnt(PluseCnt));
  79. DO(m_clstc->InterClk_setSeqCtrlPluseCntMax(SeqCtrlPluseCntMax));
  80. }
  81. {
  82. ExtTriggerSrcType src;
  83. SigProcessMode mode;
  84. TriggerEdge edge;
  85. uint32_t coefficient;
  86. uint32_t bias;
  87. uint32_t division;
  88. uint32_t multiplication;
  89. #define UPDATE(index) \
  90. src = ExtTriggerSrcType(ui->TriInX_SrcSelect_Val_##index->currentText().toStdString()); \
  91. coefficient = ui->TriInX_FileterCoefficient_Val_##index->text().toUInt(); \
  92. bias = ui->TriInX_FreqDetectBias_Val_##index->text().toUInt(); \
  93. mode = SigProcessMode(ui->TriInX_Mode_Val_##index->currentText().toStdString()); \
  94. edge = TriggerEdge(ui->TriInX_TriggerModeTriggerEdge_Val_##index->currentText().toStdString()); \
  95. division = ui->TriInX_TriggerModeFreqDivision_Val_##index->text().toUInt(); \
  96. multiplication = ui->TriInX_TriggerModeFreqMultiplication_Val_##index->text().toUInt(); \
  97. DO(m_clstc->TriInX_setSrcSelect(index, src)); \
  98. DO(m_clstc->TriInX_setFileterCoefficient(index, coefficient)); \
  99. DO(m_clstc->TriInX_setFreqDetectBias(index, bias)); \
  100. DO(m_clstc->TriInX_setMode(index, mode)); \
  101. DO(m_clstc->TriInX_setTriggerModeTriggerEdge(index, edge)); \
  102. DO(m_clstc->TriInX_setTriggerModeFreqDivision(index, division)); \
  103. DO(m_clstc->TriInX_setTriggerModeFreqMultiplication(index, multiplication));
  104. UPDATE(1);
  105. UPDATE(2);
  106. UPDATE(3);
  107. UPDATE(4);
  108. #undef UPDATE
  109. }
  110. }
  111. void MainWindow::refreshReadonlyPage() {
  112. zaf_error_code_t ecode;
  113. {
  114. float TriOutSignalFreq;
  115. ecode = m_clstc->InterClk_readTriOutSignalFreq(TriOutSignalFreq);
  116. if (ecode != kaf_ec_success) return;
  117. ui->InterClk_TriOutSignalFreq_Text->setText(QString::number(TriOutSignalFreq, 'f', 2));
  118. }
  119. {
  120. float infreq;
  121. float outfreq;
  122. #define UPDATE(index) \
  123. DO(m_clstc->TriInX_readInSignalFreq(index, infreq)); \
  124. DO(m_clstc->TriInX_readOutSignalFreq(index, outfreq)); \
  125. ui->TriInX_OutSignalFreq_Val_##index->setText(QString::number(outfreq, 'f', 2)); \
  126. ui->TriInX_InSignalFreq_Val_##index->setText(QString::number(infreq, 'f', 2));
  127. UPDATE(1);
  128. UPDATE(2);
  129. UPDATE(3);
  130. UPDATE(4);
  131. #undef UPDATE
  132. }
  133. }
  134. void MainWindow::refreshPage() {
  135. {
  136. float Freq;
  137. uint32_t PluseCnt;
  138. uint32_t SeqCtrlPluseCntMax;
  139. float TriOutSignalFreq;
  140. DO(m_clstc->InterClk_getFreq(Freq));
  141. DO(m_clstc->InterClk_getPluseCnt(PluseCnt));
  142. DO(m_clstc->InterClk_getSeqCtrlPluseCntMax(SeqCtrlPluseCntMax));
  143. DO(m_clstc->InterClk_readTriOutSignalFreq(TriOutSignalFreq));
  144. ui->InterClk_Freq_Text->setText(QString::number(Freq, 'f', 2));
  145. ui->InterClk_PluseCnt_Text->setText(QString::number(PluseCnt));
  146. ui->InterClk_SeqCtrlPluseCntMax_Text->setText(QString::number(SeqCtrlPluseCntMax));
  147. ui->InterClk_TriOutSignalFreq_Text->setText(QString::number(TriOutSignalFreq, 'f', 2));
  148. }
  149. {
  150. ExtTriggerSrcType src;
  151. SigProcessMode mode;
  152. TriggerEdge edge;
  153. uint32_t coefficient;
  154. uint32_t bias;
  155. uint32_t division;
  156. uint32_t multiplication;
  157. float infreq;
  158. float outfreq;
  159. #define UPDATE(index) \
  160. DO(m_clstc->TriInX_getSrcSelect(index, src)); \
  161. DO(m_clstc->TriInX_getFileterCoefficient(index, coefficient)); \
  162. DO(m_clstc->TriInX_getFreqDetectBias(index, bias)); \
  163. DO(m_clstc->TriInX_getMode(index, mode)); \
  164. DO(m_clstc->TriInX_getTriggerModeTriggerEdge(index, edge)); \
  165. DO(m_clstc->TriInX_getTriggerModeFreqDivision(index, division)); \
  166. DO(m_clstc->TriInX_getTriggerModeFreqMultiplication(index, multiplication)); \
  167. DO(m_clstc->TriInX_readInSignalFreq(index, infreq)); \
  168. DO(m_clstc->TriInX_readOutSignalFreq(index, outfreq)); \
  169. ui->TriInX_SrcSelect_Val_##index->setCurrentText(QString::fromStdString(src.toString())); \
  170. ui->TriInX_FileterCoefficient_Val_##index->setText(QString::number(coefficient)); \
  171. ui->TriInX_FreqDetectBias_Val_##index->setText(QString::number(bias)); \
  172. ui->TriInX_Mode_Val_##index->setCurrentText(QString::fromStdString(mode.toString())); \
  173. ui->TriInX_OutSignalFreq_Val_##index->setText(QString::number(outfreq, 'f', 2)); \
  174. ui->TriInX_InSignalFreq_Val_##index->setText(QString::number(infreq, 'f', 2)); \
  175. ui->TriInX_TriggerModeFreqDivision_Val_##index->setText(QString::number(division)); \
  176. ui->TriInX_TriggerModeFreqMultiplication_Val_##index->setText(QString::number(multiplication)); \
  177. ui->TriInX_TriggerModeTriggerEdge_Val_##index->setCurrentText(QString::fromStdString(edge.toString()));
  178. UPDATE(1);
  179. UPDATE(2);
  180. UPDATE(3);
  181. UPDATE(4);
  182. #undef UPDATE
  183. }
  184. }
  185. void MainWindow::constructUI() {
  186. /*******************************************************************************
  187. * serialPortCB *
  188. *******************************************************************************/
  189. const auto infos = QSerialPortInfo::availablePorts();
  190. for (const QSerialPortInfo &info : infos) {
  191. ui->serialPortCB->addItem(info.portName());
  192. }
  193. /*******************************************************************************
  194. * ?? *
  195. *******************************************************************************/
  196. ui->serialBaudrateCB->addItem("9600");
  197. ui->serialBaudrateCB->addItem("14400");
  198. ui->serialBaudrateCB->addItem("19200");
  199. ui->serialBaudrateCB->addItem("38400");
  200. ui->serialBaudrateCB->addItem("57600");
  201. ui->serialBaudrateCB->addItem("115200");
  202. ui->serialBaudrateCB->setCurrentIndex(5);
  203. /*******************************************************************************
  204. * *
  205. *******************************************************************************/
  206. connect(ui->serialPortRefreshKey, &QPushButton::clicked, this, [this](bool check) {
  207. ui->serialPortCB->clear();
  208. const auto infos = QSerialPortInfo::availablePorts();
  209. for (const QSerialPortInfo &info : infos) {
  210. ui->serialPortCB->addItem(info.portName());
  211. }
  212. });
  213. /*******************************************************************************
  214. * *
  215. *******************************************************************************/
  216. connect(ui->serialOpenKey, &QPushButton::clicked, this, [=](bool check) {
  217. // 打开串口
  218. if (ui->serialOpenKey->text() == "打开") {
  219. G_QTDataChannel.setPortName(ui->serialPortCB->currentText().toStdString());
  220. G_QTDataChannel.setBaudRate(ui->serialBaudrateCB->currentText().toInt());
  221. G_QTDataChannel.setDataBits(QSerialPort::Data8);
  222. G_QTDataChannel.setParity(QSerialPort::NoParity);
  223. G_QTDataChannel.setFlowControl(QSerialPort::NoFlowControl);
  224. G_QTDataChannel.setStopBits(QSerialPort::OneStop);
  225. if (!G_QTDataChannel.open()) {
  226. QMessageBox::about(NULL, "提示", "串口无法打开,串口不存在或已被占??");
  227. return;
  228. }
  229. ui->serialOpenKey->setText("关闭");
  230. // 下拉菜单控件使能
  231. ui->serialBaudrateCB->setEnabled(false);
  232. ui->serialPortCB->setEnabled(false);
  233. ui->serialPortRefreshKey->setEnabled(false);
  234. } else {
  235. G_QTDataChannel.close();
  236. ui->serialOpenKey->setText("打开");
  237. ui->serialBaudrateCB->setEnabled(true);
  238. ui->serialPortCB->setEnabled(true);
  239. ui->serialPortRefreshKey->setEnabled(true);
  240. }
  241. });
  242. /*******************************************************************************
  243. * *
  244. *******************************************************************************/
  245. connect(ui->refreshPageKey, &QPushButton::clicked, this, [=](bool check) { //
  246. refreshPage();
  247. dumpLog("刷新成功");
  248. });
  249. connect(ui->UpdateCfg_Key, &QPushButton::clicked, this, [=](bool check) { //
  250. updatePage();
  251. refreshPage();
  252. dumpLog("提交成功");
  253. });
  254. /*******************************************************************************
  255. * *
  256. *******************************************************************************/
  257. connect(ui->storageConfigKey, &QPushButton::clicked, this, [=](bool check) { //
  258. DO(m_clstc->storageConfigs());
  259. dumpLog("保存配置成功");
  260. });
  261. /*******************************************************************************
  262. * *
  263. *******************************************************************************/
  264. connect(ui->rebootDeviceKey, &QPushButton::clicked, this, [=](bool check) { //
  265. DO(m_clstc->reboot());
  266. dumpLog("重启设备成功");
  267. });
  268. /*******************************************************************************
  269. * *
  270. *******************************************************************************/
  271. connect(ui->factoryResetKey, &QPushButton::clicked, this, [=](bool check) { //
  272. DO(m_clstc->factoryReset());
  273. dumpLog("恢复出厂设置成功");
  274. });
  275. /*******************************************************************************
  276. * ?? *
  277. *******************************************************************************/
  278. ui->RegAdd->setText("0x00000000");
  279. connect(ui->regReadKey, &QPushButton::clicked, this, [=](bool check) { //
  280. uint32_t addr = str2int(ui->RegAdd->text());
  281. uint32_t value = 0;
  282. DO(m_clstc->reg_read(addr, value, 100));
  283. ui->regReadbakVal->setText(fmt("0x%08X", value));
  284. dumpLog(fmt("读取0x%04x成功", addr));
  285. });
  286. connect(ui->regWriteKey, &QPushButton::clicked, this, [=](bool check) { //
  287. uint32_t addr = str2int(ui->RegAdd->text());
  288. uint32_t value = str2int(ui->regWriteVal->text());
  289. uint32_t readkbak = 0;
  290. DO(m_clstc->reg_write(addr, value, readkbak, 100));
  291. ui->regReadbakVal->setText(fmt("0x%04x", readkbak));
  292. dumpLog(fmt("写入0x%08x成功", addr));
  293. });
  294. connect(ui->InterClk_trigger_Key, &QPushButton::clicked, this, [=](bool check) { //
  295. DO(m_clstc->InterClk_trigger());
  296. dumpLog(fmt("触发成功"));
  297. });
  298. connect(ui->InterClk_stop_Key, &QPushButton::clicked, this, [=](bool check) { //
  299. DO(m_clstc->InterClk_stop());
  300. dumpLog(fmt("停止触发成功"));
  301. });
  302. /*******************************************************************************
  303. * *
  304. *******************************************************************************/
  305. ui->TriInX_SrcSelect_Val_1->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
  306. ui->TriInX_SrcSelect_Val_1->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
  307. ui->TriInX_Mode_Val_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
  308. ui->TriInX_Mode_Val_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  309. ui->TriInX_TriggerModeTriggerEdge_Val_1->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
  310. ui->TriInX_TriggerModeTriggerEdge_Val_1->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
  311. ui->TriInX_SrcSelect_Val_2->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
  312. ui->TriInX_SrcSelect_Val_2->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
  313. ui->TriInX_Mode_Val_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
  314. ui->TriInX_Mode_Val_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  315. ui->TriInX_TriggerModeTriggerEdge_Val_2->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
  316. ui->TriInX_TriggerModeTriggerEdge_Val_2->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
  317. ui->TriInX_SrcSelect_Val_3->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
  318. ui->TriInX_SrcSelect_Val_3->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
  319. ui->TriInX_Mode_Val_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
  320. ui->TriInX_Mode_Val_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  321. ui->TriInX_TriggerModeTriggerEdge_Val_3->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
  322. ui->TriInX_TriggerModeTriggerEdge_Val_3->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
  323. ui->TriInX_SrcSelect_Val_4->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
  324. ui->TriInX_SrcSelect_Val_4->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
  325. ui->TriInX_Mode_Val_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
  326. ui->TriInX_Mode_Val_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
  327. ui->TriInX_TriggerModeTriggerEdge_Val_4->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
  328. ui->TriInX_TriggerModeTriggerEdge_Val_4->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
  329. }
  330. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
  331. // G_SerialPort.moveToThread();
  332. // QObject::connect(&G_SerialPortThread, &QThread::started, &G_SerialPort, &QSerialPort::open);
  333. G_QTDataChannel.init();
  334. CLSTControler::ins()->initialize(&G_QTDataChannel);
  335. m_clstc = CLSTControler::ins();
  336. ui->setupUi(this);
  337. m_mainWindow = this;
  338. qRegisterMetaType<int32_t>("int32_t");
  339. qRegisterMetaType<uint32_t>("uint32_t");
  340. qRegisterMetaType<function<void()>>("function<void()>");
  341. qRegisterMetaType<QFunction>("QFunction");
  342. // qInstallMessageHandler(log_output);
  343. connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
  344. constructUI();
  345. // 创建定时器
  346. timer = new QTimer(this);
  347. connect(timer, &QTimer::timeout, this, [this]() { refreshReadonlyPage(); });
  348. timer->setInterval(1000); // 每隔一秒触发一次
  349. timer->start();
  350. // m_clstc->regRawDataListener([this](uart_message_type_t type, uint8_t *data, size_t len) {
  351. // QString text;
  352. // if (type == kuart_raw_tx) {
  353. // text.append("TX: ");
  354. // for (size_t i = 0; i < len; i++) {
  355. // text.append(fmt("%02X ", data[i]));
  356. // }
  357. // } else if (type == kuart_raw_rx) {
  358. // text.append("RX: ");
  359. // for (size_t i = 0; i < len; i++) {
  360. // text.append(fmt("%02X ", data[i]));
  361. // }
  362. // }
  363. // emit doinui_signal(QFunction([this, text]() {
  364. // if (ui->instructionPreview->document()->lineCount() > 100) {
  365. // ui->instructionPreview->document()->clear();
  366. // }
  367. // ui->instructionPreview->append(text);
  368. // }));
  369. // });
  370. }
  371. void MainWindow::dumpLog(const char *fmt, ...) {
  372. va_list args;
  373. va_start(args, fmt);
  374. char buf[1024] = {0};
  375. vsnprintf(buf, sizeof(buf), fmt, args);
  376. qDebug() << buf;
  377. va_end(args);
  378. QString text(buf);
  379. QString info;
  380. // zos_get_ticket
  381. info.append(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"));
  382. info.append(" [Info]:");
  383. info.append(text);
  384. emit doinui_signal(QFunction([this, info]() {
  385. if (ui->instructionPreview->document()->lineCount() > 100) {
  386. ui->instructionPreview->document()->clear();
  387. }
  388. ui->instructionPreview->append(info);
  389. }));
  390. }
  391. MainWindow::~MainWindow() { delete ui; }