|
|
#include "mainwindow.h"
#include <QDateTime>
#include <QMessageBox>
#include <QtConcurrent>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#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>("int32_t"); qRegisterMetaType<uint32_t>("uint32_t"); qRegisterMetaType<float>("float"); qRegisterMetaType<function<void()>>("function<void()>"); qRegisterMetaType<QFunction>("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); } }
|