#include "mainwindow.h" #include #include #include #include #include #include "./ui_mainwindow.h" #include "electrocardiograph_tester.hpp" #include "logger.hpp" #include "qt_serial_datachannel.hpp" #include "zexception.hpp" using namespace std; using namespace iflytop; static MainWindow *m_mainWindow; static QTDataChannel G_QTDataChannel; #define TAG "MainWindow" static const char *fmt(const char *fmt, ...) { va_list args; va_start(args, fmt); static char buf[1024] = {0}; vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); return buf; } void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) {} void MainWindow::doinui_slot(QFunction func) { if (func.get()) func.get()(); } void MainWindow::instructionPreviewShow(const char *fmt, ...) { va_list args; va_start(args, fmt); char buf[1024] = {0}; vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); QString text(buf); QString info; info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); info.append(" |"); info.append(text); emit doinui_signal(QFunction([this, info]() { ui->instructionPreview->append(info); })); } void MainWindow::instructionPreviewClear() { ui->instructionPreview->document()->clear(); } void MainWindow::reportPreviewShow(const char *fmt, ...) { va_list args; va_start(args, fmt); char buf[1024] = {0}; vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); QString text(buf); QString info; info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); info.append(text); emit doinui_signal(QFunction([this, info]() { if (ui->reportPreview->document()->lineCount() > 100) { ui->reportPreview->document()->clear(); } ui->reportPreview->append(info); })); } void MainWindow::displayInfo(bool suc, QString info) { // emit doinui_signal(QFunction([this, info, suc]() { // static int cnt = 0; // cnt++; // QString _info; // _info.append("["); // _info.append(QString::number(cnt)); // _info.append("] "); // _info.append(info); // if (suc) { // ui->informationBrowser->setStyleSheet("color: green"); // } else { // ui->informationBrowser->setStyleSheet("color: red"); // } // ui->informationBrowser->setText(_info); // })); } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { /******************************************************************************* * QT初始化 * *******************************************************************************/ ui->setupUi(this); m_mainWindow = this; qRegisterMetaType("int32_t"); qRegisterMetaType("uint32_t"); qRegisterMetaType("float"); qRegisterMetaType>("function"); qRegisterMetaType("QFunction"); connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction))); qInstallMessageHandler(log_output); /******************************************************************************* * 页面逻辑初始化 * *******************************************************************************/ constructUI(); /******************************************************************************* * 业务逻辑构造 * *******************************************************************************/ G_QTDataChannel.init(); ElectrocardiographTester::ins()->initialize(&G_QTDataChannel); } MainWindow::~MainWindow() { delete ui; } /******************************************************************************* * UI相关构造 * *******************************************************************************/ void MainWindow::constructUI() { /******************************************************************************* * serialPortCB * *******************************************************************************/ const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) { ui->serialPortCB->addItem(info.portName()); } /******************************************************************************* * 波特率填?? * *******************************************************************************/ ui->serialBaudrateCB->addItem("9600"); ui->serialBaudrateCB->addItem("14400"); ui->serialBaudrateCB->addItem("19200"); ui->serialBaudrateCB->addItem("38400"); ui->serialBaudrateCB->addItem("57600"); ui->serialBaudrateCB->addItem("115200"); ui->serialBaudrateCB->addItem("460800"); ui->serialBaudrateCB->addItem("500000"); ui->serialBaudrateCB->setCurrentIndex(6); /******************************************************************************* * 刷新串口 * *******************************************************************************/ connect(ui->serialPortRefreshKey, &QPushButton::clicked, this, [this](bool check) { ui->serialPortCB->clear(); const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) { ui->serialPortCB->addItem(info.portName()); } }); /******************************************************************************* * 打开串口 * *******************************************************************************/ connect(ui->serialOpenKey, &QPushButton::clicked, this, [=](bool check) { // 打开串口 if (ui->serialOpenKey->text() == "打开") { G_QTDataChannel.setPortName(ui->serialPortCB->currentText().toStdString()); G_QTDataChannel.setBaudRate(ui->serialBaudrateCB->currentText().toInt()); G_QTDataChannel.setDataBits(QSerialPort::Data8); G_QTDataChannel.setParity(QSerialPort::NoParity); G_QTDataChannel.setFlowControl(QSerialPort::NoFlowControl); G_QTDataChannel.setStopBits(QSerialPort::OneStop); if (!G_QTDataChannel.open()) { QMessageBox::about(NULL, "提示", "串口无法打开,串口不存在或已被占??"); return; } ui->serialOpenKey->setText("关闭"); // 下拉菜单控件使能 ui->serialBaudrateCB->setEnabled(false); ui->serialPortCB->setEnabled(false); ui->serialPortRefreshKey->setEnabled(false); } else { G_QTDataChannel.close(); ui->serialOpenKey->setText("打开"); ui->serialBaudrateCB->setEnabled(true); ui->serialPortCB->setEnabled(true); ui->serialPortRefreshKey->setEnabled(true); } }); } void MainWindow::processException(zexception &e) { instructionPreviewShow("%s:%d", e.what(), e.ecode()); } void MainWindow::on_readDeviceVersion_clicked() { instructionPreviewClear(); try { device_version_info_receipt_t version; ElectrocardiographTester::ins()->readDeviceVersion(&version); instructionPreviewShow("-------------- version ----------------"); instructionPreviewShow(" blestack_version: %d", version.blestack_version); instructionPreviewShow(" bootloader_version: %d", version.bootloader_version); instructionPreviewShow(" firmware_version: %d", version.firmware_version); instructionPreviewShow(" hardware_version: %d", version.hardware_version); } catch (zexception &exception) { processException(exception); } }