From f045d0f62c1ebd3273d5cd30658308caf729ef07 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 3 Apr 2024 17:12:12 +0800 Subject: [PATCH] updat --- CMakeLists.txt.user | 263 ++++++++-------- README.md | 10 + libzqt/logger.cpp | 11 + libzqt/logger.hpp | 1 + mainwindow.cpp | 288 ++++++++++++++++-- mainwindow.h | 35 ++- mainwindow.ui | 612 +++++++++++++++++++++++++++++++++----- src/electrocardiograph_tester.cpp | 182 +++++++++++- src/electrocardiograph_tester.hpp | 38 ++- src/heart_rate_sensor_protocol.h | 29 ++ src/qt_serial_datachannel.cpp | 6 +- 11 files changed, 1230 insertions(+), 245 deletions(-) diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index 49a45c5..0a37cc2 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -8,7 +8,7 @@ ProjectExplorer.Project.ActiveTarget - 2 + 0 ProjectExplorer.Project.EditorSettings @@ -91,22 +91,22 @@ ProjectExplorer.Project.Target.0 Desktop - 桌面 - 桌面 - {279fbe38-08ec-48da-8e68-edb9b8eaccb2} - 0 + Desktop Qt 5.12.12 MinGW 64-bit + Desktop Qt 5.12.12 MinGW 64-bit + qt.qt5.51212.win64_mingw73_kit + 4 0 0 - Debug + Release -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-Debug + D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Release @@ -139,19 +139,19 @@ false - Debug + Release CMakeProjectManager.CMakeBuildConfiguration - Release + RelWithDebInfo -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=Release +-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-Release + D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-RelWithDebInfo @@ -182,19 +182,19 @@ false - Release + Release with Debug Information CMakeProjectManager.CMakeBuildConfiguration - RelWithDebInfo + MinSizeRel -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo +-DCMAKE_BUILD_TYPE:STRING=MinSizeRel -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-RelWithDebInfo + D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-MinSizeRel @@ -225,25 +225,26 @@ false - Release with Debug Information + Minimum Size Release CMakeProjectManager.CMakeBuildConfiguration - MinSizeRel + Debug -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=MinSizeRel +-DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-MinSizeRel + D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Debug all true + Build CMakeProjectManager.MakeStep 1 @@ -257,6 +258,7 @@ clean true + Build CMakeProjectManager.MakeStep 1 @@ -268,10 +270,55 @@ false - Minimum Size Release + Debug2 CMakeProjectManager.CMakeBuildConfiguration - 4 + + Debug + -GMinGW Makefiles +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} + D:/workspace/nordic_wp/electrocardiograph_upper/build + + + + all + + true + Build + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + Build + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + + Debug + CMakeProjectManager.CMakeBuildConfiguration + + 5 0 @@ -300,7 +347,7 @@ true false true - D:/workspace/nordic_wp/build-electrocardiograph_upper-unknown_279fbe-Debug + D:/workspace/nordic_wp/electrocardiograph_upper/build 1 @@ -309,25 +356,22 @@ ProjectExplorer.Project.Target.1 Desktop - Desktop Qt 5.12.12 MSVC2017 64bit - Desktop Qt 5.12.12 MSVC2017 64bit - qt.qt5.51212.win64_msvc2017_64_kit + 桌面 + 桌面 + {279fbe38-08ec-48da-8e68-edb9b8eaccb2} 0 0 - -1 + 0 Debug -GMinGW Makefiles -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake --DCMAKE_SYSROOT:PATH=C:/Qt/Qt5.12.12/Tools/mingw730_64 --DCMAKE_C_COMPILER_TARGET:STRING=x86_64-w64-mingw32 --DCMAKE_CXX_COMPILER_TARGET:STRING=x86_64-w64-mingw32 -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MSVC2017_64bit-Debug + D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-Debug @@ -368,14 +412,11 @@ -GMinGW Makefiles -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake --DCMAKE_SYSROOT:PATH=C:/Qt/Qt5.12.12/Tools/mingw730_64 --DCMAKE_C_COMPILER_TARGET:STRING=x86_64-w64-mingw32 --DCMAKE_CXX_COMPILER_TARGET:STRING=x86_64-w64-mingw32 -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MSVC2017_64bit-Release + D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-Release @@ -414,14 +455,11 @@ -GMinGW Makefiles -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake --DCMAKE_SYSROOT:PATH=C:/Qt/Qt5.12.12/Tools/mingw730_64 --DCMAKE_C_COMPILER_TARGET:STRING=x86_64-w64-mingw32 --DCMAKE_CXX_COMPILER_TARGET:STRING=x86_64-w64-mingw32 -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MSVC2017_64bit-RelWithDebInfo + D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-RelWithDebInfo @@ -460,14 +498,11 @@ -GMinGW Makefiles -DCMAKE_BUILD_TYPE:STRING=MinSizeRel -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake --DCMAKE_SYSROOT:PATH=C:/Qt/Qt5.12.12/Tools/mingw730_64 --DCMAKE_C_COMPILER_TARGET:STRING=x86_64-w64-mingw32 --DCMAKE_CXX_COMPILER_TARGET:STRING=x86_64-w64-mingw32 -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MSVC2017_64bit-MinSizeRel + D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-MinSizeRel @@ -515,29 +550,48 @@ ProjectExplorer.DefaultDeployConfiguration 1 - 0 + + true + true + true + + 2 + + electrocardiograph_upper + CMakeProjectManager.CMakeRunConfiguration.electrocardiograph_upper + electrocardiograph_upper + false + true + true + false + true + + 1 ProjectExplorer.Project.Target.2 Desktop - Desktop Qt 5.12.12 MinGW 64-bit - Desktop Qt 5.12.12 MinGW 64-bit - qt.qt5.51212.win64_mingw73_kit - 4 + Desktop Qt 5.12.12 MSVC2017 64bit + Desktop Qt 5.12.12 MSVC2017 64bit + qt.qt5.51212.win64_msvc2017_64_kit + 0 0 - 0 + -1 - Release + Debug -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=Release +-DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake +-DCMAKE_SYSROOT:PATH=C:/Qt/Qt5.12.12/Tools/mingw730_64 +-DCMAKE_C_COMPILER_TARGET:STRING=x86_64-w64-mingw32 +-DCMAKE_CXX_COMPILER_TARGET:STRING=x86_64-w64-mingw32 -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Release + D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MSVC2017_64bit-Debug @@ -570,19 +624,22 @@ false - Release + Debug CMakeProjectManager.CMakeBuildConfiguration - RelWithDebInfo + Release -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo +-DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake +-DCMAKE_SYSROOT:PATH=C:/Qt/Qt5.12.12/Tools/mingw730_64 +-DCMAKE_C_COMPILER_TARGET:STRING=x86_64-w64-mingw32 +-DCMAKE_CXX_COMPILER_TARGET:STRING=x86_64-w64-mingw32 -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-RelWithDebInfo + D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MSVC2017_64bit-Release @@ -613,19 +670,22 @@ false - Release with Debug Information + Release CMakeProjectManager.CMakeBuildConfiguration - MinSizeRel + RelWithDebInfo -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=MinSizeRel +-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake +-DCMAKE_SYSROOT:PATH=C:/Qt/Qt5.12.12/Tools/mingw730_64 +-DCMAKE_C_COMPILER_TARGET:STRING=x86_64-w64-mingw32 +-DCMAKE_CXX_COMPILER_TARGET:STRING=x86_64-w64-mingw32 -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-MinSizeRel + D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MSVC2017_64bit-RelWithDebInfo @@ -656,71 +716,28 @@ false - Minimum Size Release + Release with Debug Information CMakeProjectManager.CMakeBuildConfiguration - Debug - -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MinGW_64_bit-Debug - - - - all - - true - Build - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - clean - - true - Build - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - - Debug2 - CMakeProjectManager.CMakeBuildConfiguration - - - Debug + MinSizeRel -GMinGW Makefiles --DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_BUILD_TYPE:STRING=MinSizeRel -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake +-DCMAKE_SYSROOT:PATH=C:/Qt/Qt5.12.12/Tools/mingw730_64 +-DCMAKE_C_COMPILER_TARGET:STRING=x86_64-w64-mingw32 +-DCMAKE_CXX_COMPILER_TARGET:STRING=x86_64-w64-mingw32 -DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} -DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} -DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - D:/workspace/nordic_wp/electrocardiograph_upper/build + D:\workspace\nordic_wp\build-electrocardiograph_upper-Desktop_Qt_5_12_12_MSVC2017_64bit-MinSizeRel all true - Build CMakeProjectManager.MakeStep 1 @@ -734,7 +751,6 @@ clean true - Build CMakeProjectManager.MakeStep 1 @@ -746,10 +762,10 @@ false - Debug + Minimum Size Release CMakeProjectManager.CMakeBuildConfiguration - 5 + 4 0 @@ -763,24 +779,7 @@ ProjectExplorer.DefaultDeployConfiguration 1 - - true - true - true - - 2 - - electrocardiograph_upper - CMakeProjectManager.CMakeRunConfiguration.electrocardiograph_upper - electrocardiograph_upper - false - true - true - false - true - D:/workspace/nordic_wp/electrocardiograph_upper/build - - 1 + 0 diff --git a/README.md b/README.md index 200d587..c825475 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,14 @@ V4: 地址,数值 +``` + +``` +待测试项: + 1. 充电状态下的电池电量 + 2. 设置设备时间,让设备休眠状态下,不彻底关机 + 3. 读取设备中存储的记录 + 4. 上报某条记录 + 5. 打印记录的checksum + ``` \ No newline at end of file diff --git a/libzqt/logger.cpp b/libzqt/logger.cpp index 328798a..ce8558f 100644 --- a/libzqt/logger.cpp +++ b/libzqt/logger.cpp @@ -25,3 +25,14 @@ std::string zhex2str(const uint8_t* hex, size_t len) { } return str; } + + + +std::string zhex2binary(uint8_t hex) { + std::string str; + for (int i = 0; i < 8; i++) { + str += (hex & 0x80) ? "1" : "0"; + hex <<= 1; + } + return str; +} diff --git a/libzqt/logger.hpp b/libzqt/logger.hpp index 45a2e4d..d26f11a 100644 --- a/libzqt/logger.hpp +++ b/libzqt/logger.hpp @@ -8,6 +8,7 @@ void zos_log(const char* fmt, ...); int32_t zos_get_ticket(); std::string zhex2str(const uint8_t* hex, size_t len); +std::string zhex2binary( uint8_t hex); #define ZLOGI(TAG, fmt, ...) zos_log("%08lu INFO [%-10s] " fmt "", zos_get_ticket(), TAG, ##__VA_ARGS__); #define ZLOGD(TAG, fmt, ...) zos_log("%08lu DEBU [%-10s] " fmt "", zos_get_ticket(), TAG, ##__VA_ARGS__); diff --git a/mainwindow.cpp b/mainwindow.cpp index 9a14bea..2f7bb0b 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -70,26 +70,45 @@ void MainWindow::reportPreviewShow(const char *fmt, ...) { })); } -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); +void MainWindow::blockDataUploadPreviewShow(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; - // if (suc) { - // ui->informationBrowser->setStyleSheet("color: green"); - // } else { - // ui->informationBrowser->setStyleSheet("color: red"); - // } + info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); + info.append(text); + emit doinui_signal(QFunction([this, info]() { + if (ui->uploadDataPreview->document()->lineCount() > 100) { + ui->uploadDataPreview->document()->clear(); + } + ui->uploadDataPreview->append(info); + })); +} +void MainWindow::rawDataPreviewShow(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; - // ui->informationBrowser->setText(_info); - // })); + info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); + info.append(text); + emit doinui_signal(QFunction([this, info]() { + if (ui->rawDataPreview->document()->lineCount() > 100) { + ui->rawDataPreview->document()->clear(); + } + ui->rawDataPreview->append(info); + })); } +// uploadDataPreview + +void MainWindow::displayInfo(bool suc, QString info) {} MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { /******************************************************************************* @@ -103,7 +122,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi qRegisterMetaType>("function"); qRegisterMetaType("QFunction"); connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction))); - qInstallMessageHandler(log_output); + // qInstallMessageHandler(log_output); /******************************************************************************* * 页面逻辑初始化 * @@ -184,9 +203,58 @@ void MainWindow::constructUI() { ui->serialPortRefreshKey->setEnabled(true); } }); + + // 事件填充 + ElectrocardiographTester::ins()->regReportCB([this](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); + break; + } + case ify_hrs_report_battery_level: { + reportPreviewShow("[battery_level ]"); + break; + } + case ify_hrs_report_low_battey_level: { + reportPreviewShow("[low_battey ]"); + break; + } + case ify_hrs_report_sample_finish_end: { + reportPreviewShow("[sample_finish ]"); + break; + } + case ify_hrs_report_sensor_drop_detect: { + sensor_drop_event_report_packet_t *sensor_drop_report = (sensor_drop_event_report_packet_t *)report_packet->data; + reportPreviewShow("[sensor_drop ] %s %s", zhex2binary(sensor_drop_report->drop_state0).c_str(), zhex2binary(sensor_drop_report->drop_state1).c_str()); + break; + } + case ify_hrs_report_record_upload_end: { + uint32_t checksum = *(uint32_t *)report_packet->data; + reportPreviewShow("[record_upload ] 0x%08x", checksum); + break; + } + default: + break; + } + }); + + ElectrocardiographTester::ins()->regCh4CheckSumPacketReport([this](uint32_t rxcnt, uint32_t report_packet_checksum) { blockDataUploadPreviewShow("RXCNT %d CHECKSUM %d", rxcnt, report_packet_checksum); }); + ElectrocardiographTester::ins()->regRawDataCB([this](raw_data_type_t type, uint8_t *hex, uint32_t hexlen) { + if (type == kcmd_cmd) { + blockDataUploadPreviewShow("[CMD ] %s", zhex2str(hex, hexlen).c_str()); + } else if (type == kcmd_receipt) { + blockDataUploadPreviewShow("[RECEIPT] %s", zhex2str(hex, hexlen).c_str()); + } else if (type == kcmd_report) { + blockDataUploadPreviewShow("[REPORT ] %s", zhex2str(hex, hexlen).c_str()); + } else if (type == kcmd_ch4_data) { + // blockDataUploadPreviewShow("[CH4 ] %s", zhex2str(hex, hexlen).c_str()); + } + }); } -void MainWindow::processException(zexception &e) { instructionPreviewShow("%s:%d", e.what(), e.ecode()); } +void MainWindow::processException(zexception &e) { instructionPreviewShow("%s:%s", e.what(), hrs_ecode2str((ify_hrs_error_code_t)e.ecode())); } void MainWindow::on_readDeviceVersion_clicked() { instructionPreviewClear(); @@ -202,3 +270,185 @@ void MainWindow::on_readDeviceVersion_clicked() { processException(exception); } } + +void MainWindow::on_readDeviceState_clicked() { + instructionPreviewClear(); + try { + device_state_receipt_t state; + ElectrocardiographTester::ins()->readDeviceState(&state); + instructionPreviewShow("-------------- state ----------------"); + instructionPreviewShow(" drop_state0: %s", zhex2binary(state.drop_state0).c_str()); + instructionPreviewShow(" drop_state1: %s", zhex2binary(state.drop_state1).c_str()); + + instructionPreviewShow(" sampling_state: %d", state.device_state0.sampling_state); + instructionPreviewShow(" report_state: %d", state.device_state0.report_state); + instructionPreviewShow(" low_battery: %d", state.device_state0.low_battery); + instructionPreviewShow(" full_storge: %d", state.device_state0.full_storge); + instructionPreviewShow(" holder: %d", state.device_state0.holder); + instructionPreviewShow(" powerlevel: %d", state.powerlevel); + instructionPreviewShow(" storage_item_num: %d", state.storage_item_num); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_readTime_clicked() { + instructionPreviewClear(); + try { + read_time_receipt_t time; + ElectrocardiographTester::ins()->readTime(&time); + instructionPreviewShow("-------------- time ----------------"); + instructionPreviewShow(" %d/%d/%d %d:%d:%d", time.year + 2000, time.month, time.day, time.hour, time.minute, time.second); + + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_syncTime_clicked() { + instructionPreviewClear(); + try { + // 获取系统时间 + QDateTime now = QDateTime::currentDateTime(); + ElectrocardiographTester::ins()->syncTime(now.date().year() - 2000, now.date().month(), now.date().day(), now.time().hour(), now.time().minute(), now.time().second()); + instructionPreviewShow("sync time success!"); + } catch (zexception &exception) { + processException(exception); + } +} + +std::string zhex2time(const uint8_t *hex, size_t len) { + std::string str; + if (len < 6) return str; + str.append(fmt("%d/%d/%d %2d:%2d:%2d", hex[0] + 2000, hex[1], hex[2], hex[3], hex[4], hex[5])); + return str; +} + +void MainWindow::on_readAllRecords_clicked() { + // 读取当前有多少条记录 + instructionPreviewClear(); + try { + device_state_receipt_t state; + ElectrocardiographTester::ins()->readDeviceState(&state); + instructionPreviewShow("index recordid frameNum dataSize sensorNum captRate captPrec compAlgo"); + for (int32_t i = 0; i < state.storage_item_num; i++) { + read_record_info_receipt_t record; + ElectrocardiographTester::ins()->readRecordsInfo(i, &record); + instructionPreviewShow("%d %s %8d %8d %8d %8d %8d %8d", i, zhex2time(record.record_id, 6).c_str(), record.frameNum, record.dataSize, record.sensorNum, record.captureRate, record.capturePrecision, record.compressAlgorithm); + } + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_startUploadRecord_clicked() { + instructionPreviewClear(); + int reportIndex = ui->startUploadRecord_p0->toPlainText().toInt(); + try { + read_record_info_receipt_t record; + ElectrocardiographTester::ins()->readRecordsInfo(reportIndex, &record); + ElectrocardiographTester::ins()->startUploadRecord(record.record_id); + instructionPreviewShow("start upload record [%s] success", zhex2time(record.record_id, 6).c_str()); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_readSensorInfo_clicked() { + instructionPreviewClear(); + try { + sensor_info_receipt_t sensor; + ElectrocardiographTester::ins()->readSensorInfo(&sensor); + instructionPreviewShow("-------------- sensor ----------------"); + instructionPreviewShow(" sensor_num: %d", sensor.sensor_num); + instructionPreviewShow(" sensor_precision: %d", sensor.sensor_precision); + instructionPreviewShow(" sensor_sample_rate:%d", sensor.sensor_sample_rate); + instructionPreviewShow(" sensor0_pos: %d", sensor.sensor0_pos); + instructionPreviewShow(" sensor1_pos: %d", sensor.sensor1_pos); + instructionPreviewShow(" sensor2_pos: %d", sensor.sensor2_pos); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_readSN_clicked() { + instructionPreviewClear(); + try { + string sn; + ElectrocardiographTester::ins()->readSn(sn); + instructionPreviewShow("-------------- sn ----------------"); + instructionPreviewShow(" sn: %s", sn.c_str()); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_stopUploadRecord_clicked() { + instructionPreviewClear(); + try { + ElectrocardiographTester::ins()->stopUploadRecord(); + instructionPreviewShow("stop upload record success"); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_delRecord_clicked() { + instructionPreviewClear(); + int reportIndex = ui->delRecord_p0->toPlainText().toInt(); + try { + read_record_info_receipt_t record; + ElectrocardiographTester::ins()->readRecordsInfo(reportIndex, &record); + ElectrocardiographTester::ins()->delRecord(record.record_id); + instructionPreviewShow("delete record [%s] success", zhex2time(record.record_id, 6).c_str()); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_startCapture_clicked() { + instructionPreviewClear(); + try { + ElectrocardiographTester::ins()->startCapture(); + instructionPreviewShow("start capture success"); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_stopCapture_clicked() { + instructionPreviewClear(); + try { + ElectrocardiographTester::ins()->stopCapture(); + instructionPreviewShow("stop capture success"); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_startRealtimeReport_clicked() { + instructionPreviewClear(); + try { + ElectrocardiographTester::ins()->startRealtimeReport(); + instructionPreviewShow("start realtime report success"); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_stopRealtimeReport_clicked() { + instructionPreviewClear(); + try { + ElectrocardiographTester::ins()->stopRealtimeReport(); + instructionPreviewShow("stop realtime report success"); + } catch (zexception &exception) { + processException(exception); + } +} + +void MainWindow::on_clearPreview_clicked() { + ui->reportPreview->document()->clear(); + ui->uploadDataPreview->document()->clear(); + ui->rawDataPreview->document()->clear(); + ui->instructionPreview->document()->clear(); +} diff --git a/mainwindow.h b/mainwindow.h index 0373a89..5bd5edc 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -79,7 +79,35 @@ class MainWindow : public QMainWindow { void doinui_slot(QFunction); void on_readDeviceVersion_clicked(); - signals: + void on_readDeviceState_clicked(); + + void on_readTime_clicked(); + + void on_syncTime_clicked(); + + void on_readAllRecords_clicked(); + + void on_startUploadRecord_clicked(); + + void on_readSensorInfo_clicked(); + + void on_readSN_clicked(); + + void on_stopUploadRecord_clicked(); + + void on_delRecord_clicked(); + + void on_startCapture_clicked(); + + void on_stopCapture_clicked(); + + void on_startRealtimeReport_clicked(); + + void on_stopRealtimeReport_clicked(); + + void on_clearPreview_clicked(); + +signals: void doinui_signal(QFunction); private: @@ -87,7 +115,10 @@ class MainWindow : public QMainWindow { void instructionPreviewShow(const char *fmt, ...); void instructionPreviewClear(); void reportPreviewShow(const char *fmt, ...); - void displayInfo(bool suc, QString info); + void blockDataUploadPreviewShow(const char *fmt, ...); + void rawDataPreviewShow(const char *fmt, ...); + + void displayInfo(bool suc, QString info); private: void processException(std::zexception &e); diff --git a/mainwindow.ui b/mainwindow.ui index f9e9206..b7c100f 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 1142 - 1014 + 1448 + 937 @@ -749,7 +749,27 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { 功能按键 - + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 清空显示 + + + + @@ -776,9 +796,9 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { 0 - + - + 0 @@ -788,66 +808,445 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { 0 - 300 + 0 16777215 - 300 + 16777215 - - - - - - 0 - 0 - - + + ButtonBox + + + + - 400 - 0 + 0 + 200 + + 采集&预览 + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 停止预览 + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 停止采集 + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 开始采集 + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 开始预览 + + + + - - - - - 0 - 0 - - - - - 400 - 0 - + + + + 设备信息 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 读取设备状态信息 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 读取设备SN + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 读取设备版本信息 + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 读取传感器信息 + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 同步时间 + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 读取设备时间 + + + + - - + + - Qt::Horizontal + Qt::Vertical - 40 - 20 + 20 + 40 + + + + 记录上传 + + + + + + + 1 + 0 + + + + + 0 + 0 + + + + + 16777215 + 30 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 读取所有记录 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 上传记录 + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 停止上传 + + + + + + + + 1 + 0 + + + + + 0 + 30 + + + + 删除记录 + + + + + + + + 1 + 0 + + + + + 0 + 0 + + + + + 16777215 + 30 + + + + + + + + + + + + 0 + 300 + + + + GroupBox + + + - + 0 @@ -856,43 +1255,122 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - 0 - 500 + 600 + 0 16777215 - 500 + 16777215 - - - - 30 - 70 - 102 - 18 - - - - 读取设备版本信息 - - - - - - - - Qt::Vertical - - - - 20 - 40 - + + DisplayBox - + + + + + 指令回执显示 + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + + + 上报回执显示 + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + + + 上传数据显示 + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + + + 二进制 + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + @@ -907,7 +1385,7 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { 0 0 - 1142 + 1448 20 diff --git a/src/electrocardiograph_tester.cpp b/src/electrocardiograph_tester.cpp index ec6c099..3461a37 100644 --- a/src/electrocardiograph_tester.cpp +++ b/src/electrocardiograph_tester.cpp @@ -52,6 +52,7 @@ void ElectrocardiographTester::initialize(IDataChannel *channel) { // m_channel = channel; m_channel->regRxListener([this](uint8_t *data, size_t len) { { + // ZLOGI(TAG, "rx: %s", zhex2str(data, len).c_str()); lock_guard lock(lock_); if (len + m_rxlen > sizeof(m_rxcache)) { m_rxlen = 0; @@ -100,8 +101,10 @@ void ElectrocardiographTester::initialize(IDataChannel *channel) { // if (packet[0] == 0x5A && packet[1] == 0xA5) { processCh3RxData(packet, datalen); - } else { + } else if (packet[0] == 0x4B && packet[1] == 0xB4) { processCh4RxData(packet, datalen); + } else { + ZLOGI(TAG, "unknow packet: %s", zhex2str(packet, datalen).c_str()); } // 4. 移除已经处理的数据 @@ -114,10 +117,20 @@ void ElectrocardiographTester::initialize(IDataChannel *channel) { // } })); } - +// m_on_raw_data_cb void ElectrocardiographTester::regReportCB(on_report_t cb) { m_on_report = cb; } +void ElectrocardiographTester::regCh4CheckSumPacketReport(on_ch4_check_sum_packet_report_t cb) { m_on_ch4_check_sum_packet_report = cb; } + +void ElectrocardiographTester::regRawDataCB(on_raw_data_t cb) { m_on_raw_data_cb = cb; } + +typedef struct { + uint32_t rxcnt; + uint32_t m_rx_sum_cnt; +} block_data_rx_state_t; + void ElectrocardiographTester::processCh4RxData(uint8_t *rx, int32_t rxlen) { - ZLOGI(TAG, "rx ch4: %s", zhex2str(rx, rxlen).c_str()); + block_data_rx_state_t *block_data_rx_state = (block_data_rx_state_t *)&rx[2]; + if (m_on_ch4_check_sum_packet_report) m_on_ch4_check_sum_packet_report(block_data_rx_state->rxcnt, block_data_rx_state->m_rx_sum_cnt); return; } void ElectrocardiographTester::processCh3RxData(uint8_t *rx, int32_t rxlen) { @@ -140,20 +153,10 @@ void ElectrocardiographTester::processRxReportPacket(ify_hrs_packet_t *rx, int32 if (m_on_report == nullptr) { return; } + if (m_on_raw_data_cb) m_on_raw_data_cb(kcmd_report, (uint8_t *)rx, rxlen); m_on_report(rx, rxlen); } -void ElectrocardiographTester::readDeviceVersion(device_version_info_receipt_t *version) { - lock_guard lock(m_tx_lock); - - m_txcmd->cmd = ify_hrs_cmd_read_device_version; - sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); - - device_version_info_receipt_t *receipt = (device_version_info_receipt_t *)m_rxcmd->data; - memcpy(version, receipt, sizeof(device_version_info_receipt_t)); - return; -} - void ElectrocardiographTester::sendCmd(ify_hrs_packet_t *tx, int32_t txlen, ify_hrs_packet_t *rx, int32_t *rxlen, int32_t overtime) { if (m_channel == nullptr || m_channel->isOpen() == false) { throw zexception(kifyhrs_ecode_channle_is_close, "channel is not open"); @@ -173,6 +176,8 @@ void ElectrocardiographTester::sendCmd(ify_hrs_packet_t *tx, int32_t txlen, ify_ m_rxReceiptContext.receiptLen = 0; } + if (m_on_raw_data_cb) m_on_raw_data_cb(kcmd_cmd, (uint8_t *)tx, txlen); + m_channel->send((uint8_t *)tx, txlen); bool rxreceipt = false; @@ -186,6 +191,7 @@ void ElectrocardiographTester::sendCmd(ify_hrs_packet_t *tx, int32_t txlen, ify_ memcpy(rx, m_rxReceiptContext.receipt, m_rxReceiptContext.receiptLen); *rxlen = m_rxReceiptContext.receiptLen; rxreceipt = true; + if (m_on_raw_data_cb) m_on_raw_data_cb(kcmd_receipt, (uint8_t *)rx, *rxlen); break; } } @@ -204,3 +210,151 @@ void ElectrocardiographTester::sendCmd(ify_hrs_packet_t *tx, int32_t txlen, ify_ return; } + +void ElectrocardiographTester::readDeviceVersion(device_version_info_receipt_t *version) { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_read_device_version; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + + device_version_info_receipt_t *receipt = (device_version_info_receipt_t *)m_rxcmd->data; + memcpy(version, receipt, sizeof(device_version_info_receipt_t)); + return; +} + +void ElectrocardiographTester::readSensorInfo(sensor_info_receipt_t *sensor) { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_read_sensor_info; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + + sensor_info_receipt_t *receipt = (sensor_info_receipt_t *)m_rxcmd->data; + memcpy(sensor, receipt, sizeof(sensor_info_receipt_t)); + return; +} +void ElectrocardiographTester::readDeviceState(device_state_receipt_t *state) { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_read_device_state; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + + device_state_receipt_t *receipt = (device_state_receipt_t *)m_rxcmd->data; + memcpy(state, receipt, sizeof(device_state_receipt_t)); + return; +} + +void ElectrocardiographTester::readTime(read_time_receipt_t *time) { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_read_time; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + + read_time_receipt_t *receipt = (read_time_receipt_t *)m_rxcmd->data; + memcpy(time, receipt, sizeof(read_time_receipt_t)); + return; +} + +void ElectrocardiographTester::syncTime(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + lock_guard lock(m_tx_lock); + + sync_time_cmd_t *cmd = (sync_time_cmd_t *)m_txcmd->data; + cmd->year = year; + cmd->month = month; + cmd->day = day; + cmd->hour = hour; + cmd->minute = minute; + cmd->second = second; + + m_txcmd->cmd = ify_hrs_cmd_sync_time; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t) + sizeof(sync_time_cmd_t), m_rxcmd, &m_rxsize, 100); + return; +} + +void ElectrocardiographTester::startCapture() { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_start_capture; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + return; +} +void ElectrocardiographTester::stopCapture() { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_stop_capture; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + return; +} +void ElectrocardiographTester::startRealtimeReport() { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_start_realtime_report; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + return; +} +void ElectrocardiographTester::stopRealtimeReport() { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_stop_realtime_report; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + return; +} +void ElectrocardiographTester::readRecordsInfo(int32_t recordoff, read_record_info_receipt_t *recordinfo) { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_read_records_info; + read_record_info_cmd_t *cmd = (read_record_info_cmd_t *)m_txcmd->data; + cmd->record_index = recordoff; + + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t) + sizeof(read_record_info_cmd_t), m_rxcmd, &m_rxsize, 100); + + read_record_info_receipt_t *receipt = (read_record_info_receipt_t *)m_rxcmd->data; + memcpy(recordinfo, receipt, sizeof(read_record_info_receipt_t)); + return; +} +void ElectrocardiographTester::delRecord(uint8_t *recordId) { + lock_guard lock(m_tx_lock); + + del_record_cmd_t *cmd = (del_record_cmd_t *)m_txcmd->data; + memcpy(cmd->record_id, recordId, 6); + + m_txcmd->cmd = ify_hrs_cmd_del_record; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t) + sizeof(del_record_cmd_t), m_rxcmd, &m_rxsize, 100); + return; +} +void ElectrocardiographTester::startUploadRecord(uint8_t *recordId) { + lock_guard lock(m_tx_lock); + + start_upload_record_cmd_t *cmd = (start_upload_record_cmd_t *)m_txcmd->data; + memcpy(cmd->record_id, recordId, 6); + + m_txcmd->cmd = ify_hrs_cmd_start_upload_record; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t) + sizeof(start_upload_record_cmd_t), m_rxcmd, &m_rxsize, 100); + return; +} + +void ElectrocardiographTester::stopUploadRecord() { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_stop_upload_record; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + return; +} + +void ElectrocardiographTester::readSn(string &sn) { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_read_sn; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + + read_sn_receipt_t *receipt = (read_sn_receipt_t *)m_rxcmd->data; + sn = string((char *)receipt->sn, 14); + return; +} + +void ElectrocardiographTester::reset() { + lock_guard lock(m_tx_lock); + + m_txcmd->cmd = ify_hrs_cmd_reset; + sendCmd(m_txcmd, sizeof(ify_hrs_packet_t), m_rxcmd, &m_rxsize, 100); + return; +} diff --git a/src/electrocardiograph_tester.hpp b/src/electrocardiograph_tester.hpp index f16765f..b31d175 100644 --- a/src/electrocardiograph_tester.hpp +++ b/src/electrocardiograph_tester.hpp @@ -21,11 +21,15 @@ namespace iflytop { using namespace std; typedef enum { - kuart_raw_tx, - kuart_raw_rx, -} uart_message_type_t; + kcmd_cmd, + kcmd_receipt, + kcmd_report, + kcmd_ch4_data, +} raw_data_type_t; -typedef function on_report_t; +typedef function on_report_t; +typedef function on_ch4_check_sum_packet_report_t; +typedef function on_raw_data_t; class IDataChannel { public: @@ -50,7 +54,7 @@ class ElectrocardiographTester { IDataChannel *m_channel = nullptr; uint8_t m_rxcache[1024]; - int32_t m_rxlen = 0; + int32_t m_rxlen = 0; bool m_rxcache_is_full = false; mutex lock_; @@ -68,22 +72,40 @@ class ElectrocardiographTester { uint8_t m_rxbuf[1024]; ify_hrs_packet_t *m_txcmd = (ify_hrs_packet_t *)m_txbuf; ify_hrs_packet_t *m_rxcmd = (ify_hrs_packet_t *)m_rxbuf; - int32_t m_rxsize; + int32_t m_rxsize; uint8_t m_txindex = 0; /******************************************************************************* * ReportCB * *******************************************************************************/ - on_report_t m_on_report; + on_report_t m_on_report; + on_ch4_check_sum_packet_report_t m_on_ch4_check_sum_packet_report; + on_raw_data_t m_on_raw_data_cb; public: static ElectrocardiographTester *ins(); void initialize(IDataChannel *channel); void regReportCB(on_report_t cb); + void regCh4CheckSumPacketReport(on_ch4_check_sum_packet_report_t cb); + void regRawDataCB(on_raw_data_t cb); public: - void readDeviceVersion(device_version_info_receipt_t *version); + void readDeviceVersion(device_version_info_receipt_t *version); // 读取设备版本信息 + void readSensorInfo(sensor_info_receipt_t *sensor); // 读取传感器信息 + void readDeviceState(device_state_receipt_t *state); // 读取设备状态信息 + void readTime(read_time_receipt_t *time); // 读取设备时间 + void syncTime(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second); // 同步设备时间 + void startCapture(); // 开始采集 + void stopCapture(); // 停止采集 + void startRealtimeReport(); // 开始实时数据上报 + void stopRealtimeReport(); // 停止实时数据上报 + void readRecordsInfo(int32_t recordoff, read_record_info_receipt_t *recordinfo); // 读取记录信息 + void delRecord(uint8_t *recordId); // 删除记录 + void startUploadRecord(uint8_t *recordId); // 开始上传记录 + void stopUploadRecord(); // 停止上传记录 + void readSn(string &sn); + void reset(); // 重置设备 private: void sendCmd(ify_hrs_packet_t *tx, int32_t txlen, ify_hrs_packet_t *rx, int32_t *rxlen, int32_t overtime); diff --git a/src/heart_rate_sensor_protocol.h b/src/heart_rate_sensor_protocol.h index 7d16d6d..653c31f 100644 --- a/src/heart_rate_sensor_protocol.h +++ b/src/heart_rate_sensor_protocol.h @@ -31,6 +31,35 @@ typedef enum { } ify_hrs_error_code_t; +static inline const char* hrs_ecode2str(ify_hrs_error_code_t ecode){ + switch (ecode) { + case kifyhrs_ecode_success: + return "success"; + case kifyhrs_ecode_unkown_error: + return "unkown error"; + case kifyhrs_ecode_cmd_not_support: + return "cmd not support"; + case kifyhrs_ecode_illegal_parameter: + return "illegal parameter"; + case kifyhrs_ecode_device_busy: + return "device busy"; + case kifyhrs_ecode_hardware_error: + return "hardware error"; + case kifyhrs_ecode_sensor_drop: + return "sensor drop"; + case kifyhrs_ecode_no_record_find: + return "no record find"; + case kifyhrs_ecode_channle_is_close: + return "channle is close"; + case kifyhrs_ecode_overtime: + return "overtime"; + case kifyhrs_ecode_logic_error: + return "logic error"; + default: + return "unkown error"; + } +} + typedef enum { kifyhrs_pt_cmd = 1, kifyhrs_pt_cmd_receipt = 2, diff --git a/src/qt_serial_datachannel.cpp b/src/qt_serial_datachannel.cpp index b932aea..5a84262 100644 --- a/src/qt_serial_datachannel.cpp +++ b/src/qt_serial_datachannel.cpp @@ -21,12 +21,12 @@ void QTDataChannel::init() { uint8_t rx[1024] = {0}; int rx_cnt = com_receive(rx, 1024); if (rx_cnt != 0) { - // ZLOGI(TAG, "rx %s ", zhex2str(rx, rx_cnt).c_str()); + ZLOGI(TAG, "rx %s ", zhex2str(rx, rx_cnt).c_str()); if (m_rxcb) m_rxcb(rx, rx_cnt); } - this_thread::sleep_for(chrono::microseconds(100)); + this_thread::sleep_for(chrono::microseconds(1)); } else { - this_thread::sleep_for(chrono::microseconds(10000)); + this_thread::sleep_for(chrono::microseconds(1000)); } } }));