|
|
@ -14,9 +14,15 @@ |
|
|
|
|
|
|
|
using namespace std; |
|
|
|
using namespace iflytop; |
|
|
|
typedef enum { |
|
|
|
kone_lead_ecg, |
|
|
|
kthree_lead_ecg, |
|
|
|
} device_type_t; |
|
|
|
|
|
|
|
static MainWindow *m_mainWindow; |
|
|
|
static QTDataChannel G_QTDataChannel; |
|
|
|
static QTDataChannel G_WaveDataChannel; |
|
|
|
static device_type_t m_devicetype; |
|
|
|
|
|
|
|
#define TAG "MainWindow"
|
|
|
|
|
|
|
@ -108,6 +114,40 @@ void MainWindow::rawDataPreviewShow(const char *fmt, ...) { |
|
|
|
} |
|
|
|
// uploadDataPreview
|
|
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
typedef struct { |
|
|
|
uint16_t header; |
|
|
|
int16_t wave1; |
|
|
|
int16_t wave2; |
|
|
|
int16_t wave3; |
|
|
|
int16_t wave4; |
|
|
|
int16_t wave5; |
|
|
|
uint8_t check; |
|
|
|
uint16_t tail; |
|
|
|
} Wave_t; |
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
|
|
void MainWindow::displayWave(int16_t wave1, int16_t wave2, int16_t wave3) { |
|
|
|
// 1. 生成波形数据
|
|
|
|
Wave_t wave; |
|
|
|
wave.header = 0xAAAA; |
|
|
|
wave.wave1 = wave1; |
|
|
|
wave.wave2 = wave2; |
|
|
|
wave.wave3 = wave3; |
|
|
|
wave.wave4 = 0; |
|
|
|
wave.wave5 = 0; |
|
|
|
wave.tail = 0x5555; |
|
|
|
wave.check = 0; |
|
|
|
|
|
|
|
uint8_t check = 0; |
|
|
|
for (size_t i = 2; i < sizeof(wave) - 2; i++) { |
|
|
|
check += ((uint8_t *)&wave)[i]; |
|
|
|
} |
|
|
|
wave.check = check; |
|
|
|
// 2. 发送波形数据
|
|
|
|
G_WaveDataChannel.send((uint8_t *)&wave, sizeof(wave)); |
|
|
|
} |
|
|
|
|
|
|
|
void MainWindow::displayInfo(bool suc, QString info) {} |
|
|
|
|
|
|
|
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { |
|
|
@ -133,6 +173,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi |
|
|
|
* 业务逻辑构造 * |
|
|
|
*******************************************************************************/ |
|
|
|
G_QTDataChannel.init(); |
|
|
|
G_WaveDataChannel.init(); |
|
|
|
ElectrocardiographTester::ins()->initialize(&G_QTDataChannel); |
|
|
|
} |
|
|
|
MainWindow::~MainWindow() { delete ui; } |
|
|
@ -142,16 +183,15 @@ MainWindow::~MainWindow() { delete ui; } |
|
|
|
*******************************************************************************/ |
|
|
|
void MainWindow::constructUI() { |
|
|
|
/*******************************************************************************
|
|
|
|
* serialPortCB * |
|
|
|
* 指令串口UI * |
|
|
|
*******************************************************************************/ |
|
|
|
const auto infos = QSerialPortInfo::availablePorts(); |
|
|
|
for (const QSerialPortInfo &info : infos) { |
|
|
|
ui->serialPortCB->addItem(info.portName()); |
|
|
|
{ |
|
|
|
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"); |
|
|
@ -162,9 +202,6 @@ void MainWindow::constructUI() { |
|
|
|
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(); |
|
|
@ -173,9 +210,6 @@ void MainWindow::constructUI() { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* 打开串口 * |
|
|
|
*******************************************************************************/ |
|
|
|
connect(ui->serialOpenKey, &QPushButton::clicked, this, [=](bool check) { |
|
|
|
// 打开串口
|
|
|
|
if (ui->serialOpenKey->text() == "打开") { |
|
|
@ -204,13 +238,82 @@ void MainWindow::constructUI() { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* 波形串口UI * |
|
|
|
*******************************************************************************/ |
|
|
|
{ |
|
|
|
const auto infos = QSerialPortInfo::availablePorts(); |
|
|
|
for (const QSerialPortInfo &info : infos) { |
|
|
|
ui->waveSerialPortCB->addItem(info.portName()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ui->waveSerialBaudrateCB->addItem("9600"); |
|
|
|
ui->waveSerialBaudrateCB->addItem("14400"); |
|
|
|
ui->waveSerialBaudrateCB->addItem("19200"); |
|
|
|
ui->waveSerialBaudrateCB->addItem("38400"); |
|
|
|
ui->waveSerialBaudrateCB->addItem("57600"); |
|
|
|
ui->waveSerialBaudrateCB->addItem("115200"); |
|
|
|
ui->waveSerialBaudrateCB->addItem("460800"); |
|
|
|
ui->waveSerialBaudrateCB->addItem("500000"); |
|
|
|
ui->waveSerialBaudrateCB->setCurrentIndex(6); |
|
|
|
|
|
|
|
connect(ui->waveSerialPortRefreshKey, &QPushButton::clicked, this, [this](bool check) { |
|
|
|
ui->waveSerialPortCB->clear(); |
|
|
|
const auto infos = QSerialPortInfo::availablePorts(); |
|
|
|
for (const QSerialPortInfo &info : infos) { |
|
|
|
ui->waveSerialPortCB->addItem(info.portName()); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
connect(ui->waveSerialOpenKey, &QPushButton::clicked, this, [=](bool check) { |
|
|
|
// 打开串口
|
|
|
|
if (ui->waveSerialOpenKey->text() == "打开") { |
|
|
|
G_WaveDataChannel.setPortName(ui->waveSerialPortCB->currentText().toStdString()); |
|
|
|
G_WaveDataChannel.setBaudRate(ui->waveSerialBaudrateCB->currentText().toInt()); |
|
|
|
G_WaveDataChannel.setDataBits(QSerialPort::Data8); |
|
|
|
G_WaveDataChannel.setParity(QSerialPort::NoParity); |
|
|
|
G_WaveDataChannel.setFlowControl(QSerialPort::NoFlowControl); |
|
|
|
G_WaveDataChannel.setStopBits(QSerialPort::OneStop); |
|
|
|
|
|
|
|
if (!G_WaveDataChannel.open()) { |
|
|
|
QMessageBox::about(NULL, "提示", "串口无法打开,串口不存在或已被占??"); |
|
|
|
return; |
|
|
|
} |
|
|
|
ui->waveSerialOpenKey->setText("关闭"); |
|
|
|
// 下拉菜单控件使能
|
|
|
|
ui->waveSerialBaudrateCB->setEnabled(false); |
|
|
|
ui->waveSerialPortCB->setEnabled(false); |
|
|
|
ui->waveSerialPortRefreshKey->setEnabled(false); |
|
|
|
} else { |
|
|
|
G_WaveDataChannel.close(); |
|
|
|
ui->waveSerialOpenKey->setText("打开"); |
|
|
|
ui->waveSerialBaudrateCB->setEnabled(true); |
|
|
|
ui->waveSerialPortCB->setEnabled(true); |
|
|
|
ui->waveSerialPortRefreshKey->setEnabled(true); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
// 事件填充
|
|
|
|
ElectrocardiographTester::ins()->regReportCB([this](ify_hrs_packet_t *report_packet, size_t len) { |
|
|
|
ElectrocardiographTester::ins()->regReportCB([this](bool checkok, ify_hrs_packet_t *report_packet, size_t len) { |
|
|
|
int reportType = report_packet->cmd; |
|
|
|
switch (reportType) { |
|
|
|
case ify_hrs_report_heartrate_data: { |
|
|
|
heartrate_report_packet_t *heartrate_report = (heartrate_report_packet_t *)report_packet; |
|
|
|
reportPreviewShow("[preview data ] index %llu", heartrate_report->sample_data_index); |
|
|
|
// reportPreviewShow("[preview data ] index %llu", heartrate_report->sample_data_index);
|
|
|
|
|
|
|
|
uint16_t header = 0xA55A; |
|
|
|
uint16_t tail = 0xB55B; |
|
|
|
G_WaveDataChannel.send((uint8_t *)&header, sizeof(header)); |
|
|
|
G_WaveDataChannel.send((uint8_t *)report_packet, len); |
|
|
|
G_WaveDataChannel.send((uint8_t *)&tail, sizeof(tail)); |
|
|
|
|
|
|
|
// if (m_devicetype == kone_lead_ecg) {
|
|
|
|
reportPreviewShow("[preview data ] checksum_ok:%d index %llu", checkok, heartrate_report->sample_data_index); |
|
|
|
// } else if (m_devicetype == kthree_lead_ecg) {
|
|
|
|
// displayWave(heartrate_report->data[0], heartrate_report->data[1], heartrate_report->data[2]);
|
|
|
|
// }
|
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
case ify_hrs_report_battery_level: { |
|
|
|