Browse Source

update

master
zhaohe 1 year ago
parent
commit
9f37eecde4
  1. 1
      CMakeLists.txt
  2. 2
      CMakeLists.txt.user
  3. 2
      ify_hrs_protocol
  4. 30
      libzqt/widgetplot2d.cpp
  5. 127
      libzqt/zcsv.cpp
  6. 47
      libzqt/zcsv.hpp
  7. 63
      mainwindow.cpp
  8. 4
      mainwindow.h
  9. 217
      mainwindow.ui
  10. 25
      src/electrocardiograph_tester.cpp
  11. 2
      src/electrocardiograph_tester.hpp

1
CMakeLists.txt

@ -25,6 +25,7 @@ set(PROJECT_SOURCES
libzqt/logger.cpp
libzqt/zqthread.cpp
libzqt/QFunction.cpp
libzqt/zcsv.cpp
src/main.cpp
mainwindow.cpp

2
CMakeLists.txt.user

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 5.0.2, 2024-05-03T15:49:16. -->
<!-- Written by QtCreator 5.0.2, 2024-05-03T22:00:42. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

2
ify_hrs_protocol

@ -1 +1 @@
Subproject commit 391a9551d21fd8b591e1eb4a5c8555ec2d59ff3c
Subproject commit a1fda58c30f6bb892c9f503280b3896c67e00dda

30
libzqt/widgetplot2d.cpp

@ -3,6 +3,8 @@
#include <QDebug>
#include "ui_widgetplot2d.h"
#include "zcsv.hpp"
using namespace iflytop;
WidgetPlot2D::WidgetPlot2D(QWidget* parent) : QWidget(parent), ui(new Ui::WidgetPlot2D) {
ui->setupUi(this);
@ -434,22 +436,22 @@ bool WidgetPlot2D::isDirExist(QString fullPath) {
/* 保存绘图成图片 */
void WidgetPlot2D::savePlotPng() {
// 获取程序运行路径
QString savePath = QCoreApplication::applicationDirPath() + "/output";
// 判断文件路径
if (isDirExist(savePath)) {
} else {
qDebug() << "保存文件目录未找到!";
QMessageBox::warning(this, "warning", "保存文件目录未找到!", QMessageBox::Yes, QMessageBox::Yes);
}
QString savePath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QString fileName = QFileDialog::getSaveFileName(this,
"保存波形数据", // 对话框的标题
savePath, // 保存的默认路径为程序运行路径
"Save Picture (*.png *jpg)"); // 打开文件的类型,;隔开
// 如果用户点击了“取消”按钮
"保存波形数据", // 对话框的标题
savePath, // 保存的默认路径为程序运行路径
"Save Picture (*.csv)"); // 打开文件的类型,;隔开
if (fileName.isNull()) return;
// 保存图片
ui->customPlot->savePng(fileName, 1280, 800, 1.0, -1, 255);
ZCSV csv;
int datacnt = ui->customPlot->graph(0)->dataCount();
csv.setdata(1, 1, "pointIndex");
csv.setdata(1, 2, "value");
for (size_t i = 0; i < datacnt; i++) {
csv.setdata(i + 1, 1, QString::number(ui->customPlot->graph(0)->data()->at(i)->key).toStdString());
csv.setdata(i + 1, 2, QString::number(ui->customPlot->graph(0)->data()->at(i)->value).toStdString());
}
csv.dumpCSV(fileName.toStdString());
}
/* 水平滚动条移动 */

127
libzqt/zcsv.cpp

@ -0,0 +1,127 @@
#include "zcsv.hpp"
using namespace std;
using namespace iflytop;
ZCSV::ZCSV() {}
bool ZCSV::parseCSV(string filename) {
csvData.clear();
ifstream file(filename);
string line;
if (!file.is_open()) {
return false;
}
int rowNum = 0;
while (getline(file, line)) {
rowNum = rowNum + 1;
stringstream linestream(line);
string cell;
ZCSVCell csvCell;
csvCell.rowNum = rowNum;
int colNum = 0;
while (getline(linestream, cell, ',')) {
colNum = colNum + 1;
csvCell.colNum = colNum;
csvCell.data = cell;
csvData.push_back(csvCell);
}
csvData.push_back(csvCell);
}
// 找到最大行数
int maxRowNum = 0;
for (list<ZCSVCell>::iterator it = csvData.begin(); it != csvData.end(); it++) {
if (it->rowNum > maxRowNum) {
maxRowNum = it->rowNum;
}
}
// 找到最大列数
int maxColNum = 0;
for (list<ZCSVCell>::iterator it = csvData.begin(); it != csvData.end(); it++) {
if (it->colNum > maxColNum) {
maxColNum = it->colNum;
}
}
m_maxRowNum = maxRowNum;
m_maxColNum = maxColNum;
return true;
}
ZCSVCell* ZCSV::findCell(int rowNum, int colNum) {
for (list<ZCSVCell>::iterator it = csvData.begin(); it != csvData.end(); it++) {
if (it->rowNum == rowNum && it->colNum == colNum) {
return &(*it);
}
}
return NULL;
}
void ZCSV::setdata(int rowNum, int colNum, string data) {
ZCSVCell* cell = findCell(rowNum, colNum);
if (cell != NULL) {
cell->data = data;
} else {
ZCSVCell newCell;
newCell.rowNum = rowNum;
newCell.colNum = colNum;
newCell.data = data;
if (rowNum > m_maxRowNum) {
m_maxRowNum = rowNum;
}
if (colNum > m_maxColNum) {
m_maxColNum = colNum;
}
csvData.push_back(newCell);
}
}
string ZCSV::getdata(int rowNum, int colNum) {
ZCSVCell* cell = findCell(rowNum, colNum);
if (cell != NULL) {
return cell->data;
} else {
return "";
}
}
void ZCSV::dumpCSV(string filename) {
ofstream file;
file.open(filename, ios::out | ios::trunc);
// 找到最大行数
int maxRowNum = 0;
for (list<ZCSVCell>::iterator it = csvData.begin(); it != csvData.end(); it++) {
if (it->rowNum > maxRowNum) {
maxRowNum = it->rowNum;
}
}
// 找到最大列数
int maxColNum = 0;
for (list<ZCSVCell>::iterator it = csvData.begin(); it != csvData.end(); it++) {
if (it->colNum > maxColNum) {
maxColNum = it->colNum;
}
}
// 足个点插入数据
for (int i = 1; i <= maxRowNum; i++) {
for (int j = 1; j <= maxColNum; j++) {
ZCSVCell* cell = findCell(i, j);
if (cell != NULL) {
file << cell->data;
}
file << ",";
}
file << endl;
}
}

47
libzqt/zcsv.hpp

@ -0,0 +1,47 @@
#pragma once
#include <fstream>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <set>
#include <sstream>
#include <string>
#include <vector>
namespace iflytop {
using namespace std;
class ZCSVCell {
public:
int rowNum;
int colNum;
string data;
};
class ZCSV {
private:
list<ZCSVCell> csvData;
int m_maxRowNum = 0;
int m_maxColNum = 0;
public:
ZCSV();
bool parseCSV(string filename);
void setdata(int rowNum, int colNum, string data);
string getdata(int rowNum, int colNum);
int maxRowNum() { return m_maxRowNum; }
int maxColNum() { return m_maxColNum; }
void dumpCSV(string filename);
private:
ZCSVCell* findCell(int rowNum, int colNum);
};
} // namespace iflytop

63
mainwindow.cpp

@ -243,12 +243,15 @@ void MainWindow::constructUI() {
ui->serialBaudrateCB->setEnabled(false);
ui->serialPortCB->setEnabled(false);
ui->serialPortRefreshKey->setEnabled(false);
ui->deviceType->setEnabled(false);
} else {
G_QTDataChannel.close();
ui->serialOpenKey->setText("打开");
ui->serialBaudrateCB->setEnabled(true);
ui->serialPortCB->setEnabled(true);
ui->serialPortRefreshKey->setEnabled(true);
ui->deviceType->setEnabled(true);
}
});
@ -276,11 +279,10 @@ void MainWindow::constructUI() {
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;
if (m_devicetype == kone_lead_ecg) {
static uint32_t lastpacket_index = 0;
static uint32_t lostpacket = 0;
heartrate_report_packet_t *heartrate_report = (heartrate_report_packet_t *)report_packet;
static uint32_t lastpacket_index = 0;
static uint32_t lostpacket = 0;
if ((lastpacket_index + 5) != (heartrate_report->sample_data_index)) {
lostpacket++;
}
@ -300,33 +302,28 @@ void MainWindow::constructUI() {
wp2d->addData("心电", data2, 4);
wp2d->addData("心电", data3, 6);
wp2d->addData("心电", data4, 8);
// wp2d->addData("心电", data2);
// wp2d->addData("心电", data3);
// wp2d->addData("心电", data4);
}));
}
} else if (m_devicetype == kthree_lead_ecg) {
} else if (m_devicetype == kone_lead_ecg_v2) {
if (checkok) {
uint32_t packetlen = len - sizeof(heartrate_report_packet_t);
if (!checkok) return;
m1003_heartrate_report_packet_t *heartrate_report = (m1003_heartrate_report_packet_t *)report_packet;
static uint32_t lostpacket = 0;
{
static uint32_t lastpacket_index = 0;
static uint32_t lostpacket = 0;
if ((lastpacket_index + 50) != (heartrate_report->sample_data_index)) {
if ((lastpacket_index + heartrate_report->sample_data_num) != (heartrate_report->sample_data_index)) {
lostpacket++;
}
lastpacket_index = heartrate_report->sample_data_index;
uint32_t timestamp = *(uint32_t *)(&heartrate_report->data[50 * 4]);
reportPreviewShow("[preview data ] timestamp:%10d lost:%d index %d packetlen %d", timestamp, lostpacket, heartrate_report->sample_data_index, packetlen);
int32_t *frame = (int32_t *)heartrate_report->data;
for (int i = 0; i < 50; i++) {
int32_t data = frame[i];
int32_t frameIndex = heartrate_report->sample_data_index + i;
data = FilterAlgoMgr::ins()->processData("心电", data);
emit doinui_signal(QFunction([this, data, i]() { wp2d->addData("心电", data, i * 2); }));
}
}
reportPreviewShow("[preview data ] lost:%d index %d leadoff 0x%x", //
lostpacket, heartrate_report->sample_data_index, heartrate_report->leadoff_state);
for (int i = 0; i < heartrate_report->sample_data_num; i++) {
int16_t data = heartrate_report->frame[i];
int32_t frameIndex = heartrate_report->sample_data_index + i;
data = FilterAlgoMgr::ins()->processData("心电", data);
emit doinui_signal(QFunction([this, data, i]() { wp2d->addData("心电", data, i * 2); }));
}
}
break;
@ -759,3 +756,23 @@ void MainWindow::on_TestCmd_writeSubICAllReg_clicked() {
processException(exception);
}
}
void MainWindow::on_setEcgInTestMode_clicked() {
instructionPreviewClear();
try {
ElectrocardiographTester::ins()->set_ecg_in_test_mode(1);
ishow("set ECG in test mode success");
} catch (zexception &exception) {
processException(exception);
}
}
void MainWindow::on_setEcgInNormalMode_clicked() {
instructionPreviewClear();
try {
ElectrocardiographTester::ins()->set_ecg_in_test_mode(0);
ishow("set ECG in test mode success");
} catch (zexception &exception) {
processException(exception);
}
}

4
mainwindow.h

@ -128,6 +128,10 @@ class MainWindow : public QMainWindow {
void on_TestCmd_writeSubICAllReg_clicked();
void on_setEcgInTestMode_clicked();
void on_setEcgInNormalMode_clicked();
signals:
void doinui_signal(QFunction);

217
mainwindow.ui

@ -614,7 +614,7 @@ QGroupBox:title {
<widget class="QWidget" name="sidebar" native="true">
<property name="minimumSize">
<size>
<width>200</width>
<width>250</width>
<height>0</height>
</size>
</property>
@ -637,16 +637,6 @@ QGroupBox:title {
<string>串口设置</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QComboBox" name="serialPortCB"/>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="serialOpenKey">
<property name="text">
<string>打开</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="serialBaudrateCB"/>
</item>
@ -657,6 +647,9 @@ QGroupBox:title {
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="serialPortCB"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="serialPortLable">
<property name="text">
@ -664,32 +657,31 @@ QGroupBox:title {
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<item row="4" column="0" colspan="2">
<widget class="QPushButton" name="serialOpenKey">
<property name="text">
<string>打开</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="serialPortRefreshKey">
<property name="text">
<string>刷新</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="serialSettingGB_2">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>设备配置</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="1">
<widget class="QComboBox" name="deviceType"/>
<item row="2" column="1">
<widget class="QComboBox" name="deviceType">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>2</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="0">
<item row="2" column="0">
<widget class="QLabel" name="serialPortLable_2">
<property name="text">
<string>型号</string>
@ -825,7 +817,11 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;M1003 单导心电记录仪-2代&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;注意事项:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;1.当检查上传数据的CHECKSUM(检验和)时,需要先复位下蓝牙主机开发板清空统计信息&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;1.当检查上传数据的CHECKSUM(检验和)时,需要先复位下蓝牙主机开发板清空统计信息&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#ff0000;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;版本:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;V2:支持原始数据保存&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
@ -907,7 +903,7 @@ p, li { white-space: pre-wrap; }
</size>
</property>
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="buttonTabWidgetPage1">
<attribute name="title">
@ -917,7 +913,7 @@ p, li { white-space: pre-wrap; }
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>设备信息</string>
<string>设备基本操作</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="2" column="0">
@ -958,8 +954,8 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="readTime">
<item row="5" column="0">
<widget class="QPushButton" name="readSN">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
@ -973,12 +969,12 @@ p, li { white-space: pre-wrap; }
</size>
</property>
<property name="text">
<string>读取设备时间</string>
<string>读取设备SN</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QPushButton" name="readSN">
<item row="1" column="0">
<widget class="QPushButton" name="readSensorInfo">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
@ -992,7 +988,45 @@ p, li { white-space: pre-wrap; }
</size>
</property>
<property name="text">
<string>读取设备SN</string>
<string>读取传感器信息</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QPushButton" name="setEcgInTestMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>设置ECG为正常模式</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QPushButton" name="resetDevice">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>复位设备</string>
</property>
</widget>
</item>
@ -1015,7 +1049,26 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="7" column="1">
<item row="1" column="1">
<widget class="QPushButton" name="readTime">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>读取设备时间</string>
</property>
</widget>
</item>
<item row="9" column="1">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -1028,7 +1081,7 @@ p, li { white-space: pre-wrap; }
</property>
</spacer>
</item>
<item row="7" column="0">
<item row="9" column="0">
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -1041,8 +1094,8 @@ p, li { white-space: pre-wrap; }
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="readSensorInfo">
<item row="8" column="0">
<widget class="QPushButton" name="setEcgInNormalMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
@ -1056,26 +1109,7 @@ p, li { white-space: pre-wrap; }
</size>
</property>
<property name="text">
<string>读取传感器信息</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QPushButton" name="resetDevice">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>复位设备</string>
<string>设置ECG为正常模式</string>
</property>
</widget>
</item>
@ -1262,27 +1296,8 @@ p, li { white-space: pre-wrap; }
<string>采集&amp;预览</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="3" column="0">
<widget class="QPushButton" name="stopRealtimeReport">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>停止预览</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="stopCapture">
<item row="2" column="0">
<widget class="QPushButton" name="startRealtimeReport">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
@ -1296,31 +1311,25 @@ p, li { white-space: pre-wrap; }
</size>
</property>
<property name="text">
<string>停止采集</string>
<string>开始预览</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="startCapture">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<item row="4" column="0">
<spacer name="verticalSpacer_11">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="minimumSize">
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>30</height>
<width>20</width>
<height>40</height>
</size>
</property>
<property name="text">
<string>开始采集</string>
</property>
</widget>
</spacer>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="startRealtimeReport">
<item row="3" column="0">
<widget class="QPushButton" name="stopRealtimeReport">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>1</horstretch>
@ -1334,7 +1343,7 @@ p, li { white-space: pre-wrap; }
</size>
</property>
<property name="text">
<string>开始预览</string>
<string>停止预览</string>
</property>
</widget>
</item>
@ -2167,7 +2176,7 @@ p, li { white-space: pre-wrap; }
</sizepolicy>
</property>
<property name="text">
<string>数据采样周期</string>
<string>数据采样周期(ms)</string>
</property>
</widget>
</item>
@ -2364,7 +2373,7 @@ p, li { white-space: pre-wrap; }
</property>
<widget class="QMenu" name="menu123">
<property name="title">
<string>iflytop</string>
<string>心电上位机V2</string>
</property>
</widget>
<addaction name="menu123"/>

25
src/electrocardiograph_tester.cpp

@ -375,28 +375,30 @@ void ElectrocardiographTester::reset() {
void ElectrocardiographTester::testCmdStartCapture() {
lock_guard<mutex> lock(m_tx_lock);
m_txcmd->cmd = ify_hrs_test_cmd_start_capture;
sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100);
throw zexception(kifyhrs_ecode_cmd_not_support, "not implement");
}
void ElectrocardiographTester::testCmdStopCapture() {
lock_guard<mutex> lock(m_tx_lock);
m_txcmd->cmd = ify_hrs_test_cmd_stop_capture;
sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100);
throw zexception(kifyhrs_ecode_cmd_not_support, "not implement");
}
uint8_t ElectrocardiographTester::testCmdReadReg(uint8_t addr) {
lock_guard<mutex> lock(m_tx_lock);
throw zexception(kifyhrs_ecode_cmd_not_support, "not implement");
#if 0
m_txcmd->cmd = ify_hrs_test_cmd_read_reg;
m_txcmd->data[0] = addr;
m_txcmd->cmd = ify_hrs_test_cmd_read_reg;
sendCmd(m_txcmd, sizeof(ify_hrs_packet_t) + 1, m_rxcmd, &m_rxsize, 100);
return m_rxcmd->data[0];
#endif
}
void ElectrocardiographTester::testCmdWriteReg(uint8_t addr, uint8_t val) {
lock_guard<mutex> lock(m_tx_lock);
throw zexception(kifyhrs_ecode_cmd_not_support, "not implement");
#if 0
m_txcmd->cmd = ify_hrs_test_cmd_write_reg;
m_txcmd->data[0] = addr;
@ -404,4 +406,17 @@ void ElectrocardiographTester::testCmdWriteReg(uint8_t addr, uint8_t val) {
m_txcmd->cmd = ify_hrs_test_cmd_write_reg;
sendCmd(m_txcmd, sizeof(ify_hrs_packet_t) + 2, m_rxcmd, &m_rxsize, 100);
#endif
}
void ElectrocardiographTester::set_ecg_in_test_mode(int32_t testmode) {
lock_guard<mutex> lock(m_tx_lock);
int32_t *para = (int32_t *)m_txcmd->data;
para[0] = testmode;
m_txcmd->cmd = ify_hrs_cmd_set_ecg_in_test_mode;
sendCmd(m_txcmd, sizeof(ify_hrs_packet_t) + sizeof(int32_t), m_rxcmd, &m_rxsize, 100);
return;
}

2
src/electrocardiograph_tester.hpp

@ -107,6 +107,8 @@ class ElectrocardiographTester {
void readSn(string &sn);
void reset(); // 重置设备
void set_ecg_in_test_mode(int32_t testmode);
void testCmdStartCapture();
void testCmdStopCapture();
uint8_t testCmdReadReg(uint8_t addr);

Loading…
Cancel
Save