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.

204 lines
7.7 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
1 year ago
2 years ago
1 year 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 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 "electrocardiograph_tester.hpp"
  9. #include "logger.hpp"
  10. #include "qt_serial_datachannel.hpp"
  11. #include "zexception.hpp"
  12. using namespace std;
  13. using namespace iflytop;
  14. static MainWindow *m_mainWindow;
  15. static QTDataChannel G_QTDataChannel;
  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. void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) {}
  26. void MainWindow::doinui_slot(QFunction func) {
  27. if (func.get()) func.get()();
  28. }
  29. void MainWindow::instructionPreviewShow(const char *fmt, ...) {
  30. va_list args;
  31. va_start(args, fmt);
  32. char buf[1024] = {0};
  33. vsnprintf(buf, sizeof(buf), fmt, args);
  34. va_end(args);
  35. QString text(buf);
  36. QString info;
  37. info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz"));
  38. info.append(" |");
  39. info.append(text);
  40. emit doinui_signal(QFunction([this, info]() { ui->instructionPreview->append(info); }));
  41. }
  42. void MainWindow::instructionPreviewClear() { ui->instructionPreview->document()->clear(); }
  43. void MainWindow::reportPreviewShow(const char *fmt, ...) {
  44. va_list args;
  45. va_start(args, fmt);
  46. char buf[1024] = {0};
  47. vsnprintf(buf, sizeof(buf), fmt, args);
  48. va_end(args);
  49. QString text(buf);
  50. QString info;
  51. info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz"));
  52. info.append(text);
  53. emit doinui_signal(QFunction([this, info]() {
  54. if (ui->reportPreview->document()->lineCount() > 100) {
  55. ui->reportPreview->document()->clear();
  56. }
  57. ui->reportPreview->append(info);
  58. }));
  59. }
  60. void MainWindow::displayInfo(bool suc, QString info) {
  61. // emit doinui_signal(QFunction([this, info, suc]() {
  62. // static int cnt = 0;
  63. // cnt++;
  64. // QString _info;
  65. // _info.append("[");
  66. // _info.append(QString::number(cnt));
  67. // _info.append("] ");
  68. // _info.append(info);
  69. // if (suc) {
  70. // ui->informationBrowser->setStyleSheet("color: green");
  71. // } else {
  72. // ui->informationBrowser->setStyleSheet("color: red");
  73. // }
  74. // ui->informationBrowser->setText(_info);
  75. // }));
  76. }
  77. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
  78. /*******************************************************************************
  79. * QT初始化 *
  80. *******************************************************************************/
  81. ui->setupUi(this);
  82. m_mainWindow = this;
  83. qRegisterMetaType<int32_t>("int32_t");
  84. qRegisterMetaType<uint32_t>("uint32_t");
  85. qRegisterMetaType<float>("float");
  86. qRegisterMetaType<function<void()>>("function<void()>");
  87. qRegisterMetaType<QFunction>("QFunction");
  88. connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
  89. qInstallMessageHandler(log_output);
  90. /*******************************************************************************
  91. * *
  92. *******************************************************************************/
  93. constructUI();
  94. /*******************************************************************************
  95. * *
  96. *******************************************************************************/
  97. G_QTDataChannel.init();
  98. ElectrocardiographTester::ins()->initialize(&G_QTDataChannel);
  99. }
  100. MainWindow::~MainWindow() { delete ui; }
  101. /*******************************************************************************
  102. * UI相关构造 *
  103. *******************************************************************************/
  104. void MainWindow::constructUI() {
  105. /*******************************************************************************
  106. * serialPortCB *
  107. *******************************************************************************/
  108. const auto infos = QSerialPortInfo::availablePorts();
  109. for (const QSerialPortInfo &info : infos) {
  110. ui->serialPortCB->addItem(info.portName());
  111. }
  112. /*******************************************************************************
  113. * ?? *
  114. *******************************************************************************/
  115. ui->serialBaudrateCB->addItem("9600");
  116. ui->serialBaudrateCB->addItem("14400");
  117. ui->serialBaudrateCB->addItem("19200");
  118. ui->serialBaudrateCB->addItem("38400");
  119. ui->serialBaudrateCB->addItem("57600");
  120. ui->serialBaudrateCB->addItem("115200");
  121. ui->serialBaudrateCB->addItem("460800");
  122. ui->serialBaudrateCB->addItem("500000");
  123. ui->serialBaudrateCB->setCurrentIndex(6);
  124. /*******************************************************************************
  125. * *
  126. *******************************************************************************/
  127. connect(ui->serialPortRefreshKey, &QPushButton::clicked, this, [this](bool check) {
  128. ui->serialPortCB->clear();
  129. const auto infos = QSerialPortInfo::availablePorts();
  130. for (const QSerialPortInfo &info : infos) {
  131. ui->serialPortCB->addItem(info.portName());
  132. }
  133. });
  134. /*******************************************************************************
  135. * *
  136. *******************************************************************************/
  137. connect(ui->serialOpenKey, &QPushButton::clicked, this, [=](bool check) {
  138. // 打开串口
  139. if (ui->serialOpenKey->text() == "打开") {
  140. G_QTDataChannel.setPortName(ui->serialPortCB->currentText().toStdString());
  141. G_QTDataChannel.setBaudRate(ui->serialBaudrateCB->currentText().toInt());
  142. G_QTDataChannel.setDataBits(QSerialPort::Data8);
  143. G_QTDataChannel.setParity(QSerialPort::NoParity);
  144. G_QTDataChannel.setFlowControl(QSerialPort::NoFlowControl);
  145. G_QTDataChannel.setStopBits(QSerialPort::OneStop);
  146. if (!G_QTDataChannel.open()) {
  147. QMessageBox::about(NULL, "提示", "串口无法打开,串口不存在或已被占??");
  148. return;
  149. }
  150. ui->serialOpenKey->setText("关闭");
  151. // 下拉菜单控件使能
  152. ui->serialBaudrateCB->setEnabled(false);
  153. ui->serialPortCB->setEnabled(false);
  154. ui->serialPortRefreshKey->setEnabled(false);
  155. } else {
  156. G_QTDataChannel.close();
  157. ui->serialOpenKey->setText("打开");
  158. ui->serialBaudrateCB->setEnabled(true);
  159. ui->serialPortCB->setEnabled(true);
  160. ui->serialPortRefreshKey->setEnabled(true);
  161. }
  162. });
  163. }
  164. void MainWindow::processException(zexception &e) { instructionPreviewShow("%s:%d", e.what(), e.ecode()); }
  165. void MainWindow::on_readDeviceVersion_clicked() {
  166. instructionPreviewClear();
  167. try {
  168. device_version_info_receipt_t version;
  169. ElectrocardiographTester::ins()->readDeviceVersion(&version);
  170. instructionPreviewShow("-------------- version ----------------");
  171. instructionPreviewShow(" blestack_version: %d", version.blestack_version);
  172. instructionPreviewShow(" bootloader_version: %d", version.bootloader_version);
  173. instructionPreviewShow(" firmware_version: %d", version.firmware_version);
  174. instructionPreviewShow(" hardware_version: %d", version.hardware_version);
  175. } catch (zexception &exception) {
  176. processException(exception);
  177. }
  178. }