Browse Source

update

master
zhaohe 1 year ago
parent
commit
4cae23bfdd
  1. 30
      mainwindow.cpp
  2. 16
      mainwindow.ui
  3. 15
      src/electrocardiograph_tester.cpp
  4. 7
      src/heart_rate_sensor_protocol.h
  5. 2
      src/qt_serial_datachannel.cpp

30
mainwindow.cpp

@ -43,7 +43,7 @@ void MainWindow::instructionPreviewShow(const char *fmt, ...) {
QString text(buf);
QString info;
info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz"));
info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz "));
info.append(" |");
info.append(text);
emit doinui_signal(QFunction([this, info]() { ui->instructionPreview->append(info); }));
@ -60,10 +60,10 @@ void MainWindow::reportPreviewShow(const char *fmt, ...) {
QString text(buf);
QString info;
info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz"));
info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz "));
info.append(text);
emit doinui_signal(QFunction([this, info]() {
if (ui->reportPreview->document()->lineCount() > 100) {
if (ui->reportPreview->document()->lineCount() > 1000) {
ui->reportPreview->document()->clear();
}
ui->reportPreview->append(info);
@ -79,10 +79,10 @@ void MainWindow::blockDataUploadPreviewShow(const char *fmt, ...) {
QString text(buf);
QString info;
info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz"));
info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz "));
info.append(text);
emit doinui_signal(QFunction([this, info]() {
if (ui->uploadDataPreview->document()->lineCount() > 100) {
if (ui->uploadDataPreview->document()->lineCount() > 1000) {
ui->uploadDataPreview->document()->clear();
}
ui->uploadDataPreview->append(info);
@ -100,7 +100,7 @@ void MainWindow::rawDataPreviewShow(const char *fmt, ...) {
info.append(QDateTime::currentDateTime().toString("hh:mm:ss.zzz"));
info.append(text);
emit doinui_signal(QFunction([this, info]() {
if (ui->rawDataPreview->document()->lineCount() > 100) {
if (ui->rawDataPreview->document()->lineCount() > 1000) {
ui->rawDataPreview->document()->clear();
}
ui->rawDataPreview->append(info);
@ -232,7 +232,7 @@ void MainWindow::constructUI() {
}
case ify_hrs_report_record_upload_end: {
uint32_t checksum = *(uint32_t *)report_packet->data;
reportPreviewShow("[record_upload ] 0x%08x", checksum);
reportPreviewShow("[upload end ] checksum: 0x%08x", checksum);
break;
}
default:
@ -240,16 +240,18 @@ void MainWindow::constructUI() {
}
});
ElectrocardiographTester::ins()->regCh4CheckSumPacketReport([this](uint32_t rxcnt, uint32_t report_packet_checksum) { blockDataUploadPreviewShow("RXCNT %d CHECKSUM %d", rxcnt, report_packet_checksum); });
ElectrocardiographTester::ins()->regCh4CheckSumPacketReport([this](uint32_t rxcnt, uint32_t report_packet_checksum) { //
blockDataUploadPreviewShow("RXCNT %d CHECKSUM 0x%08x", 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());
rawDataPreviewShow("[CMD ] %s", zhex2str(hex, hexlen).c_str());
} else if (type == kcmd_receipt) {
blockDataUploadPreviewShow("[RECEIPT] %s", zhex2str(hex, hexlen).c_str());
rawDataPreviewShow("[RECEIPT] %s", zhex2str(hex, hexlen).c_str());
} else if (type == kcmd_report) {
blockDataUploadPreviewShow("[REPORT ] %s", zhex2str(hex, hexlen).c_str());
rawDataPreviewShow("[REPORT ] %s", zhex2str(hex, hexlen).c_str());
} else if (type == kcmd_ch4_data) {
// blockDataUploadPreviewShow("[CH4 ] %s", zhex2str(hex, hexlen).c_str());
// rawDataPreviewShow("[CH4 ] %s", zhex2str(hex, hexlen).c_str());
}
});
}
@ -330,11 +332,11 @@ void MainWindow::on_readAllRecords_clicked() {
try {
device_state_receipt_t state;
ElectrocardiographTester::ins()->readDeviceState(&state);
instructionPreviewShow("index recordid frameNum dataSize sensorNum captRate captPrec compAlgo");
instructionPreviewShow("index recordid frameNum dataSize sensorNum captRate captPrec compAlgo checksum");
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);
instructionPreviewShow("%d %s %8d %8d %8d %8d %8d %8d 0x%08x", i, zhex2time(record.record_id, 6).c_str(), record.frameNum, record.dataSize, record.sensorNum, record.captureRate, record.capturePrecision, record.compressAlgorithm, record.checksum);
}
} catch (zexception &exception) {
processException(exception);

16
mainwindow.ui

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>1448</width>
<height>937</height>
<height>1040</height>
</rect>
</property>
<property name="sizePolicy">
@ -17,7 +17,7 @@
</sizepolicy>
</property>
<property name="windowTitle">
<string>相机光源和时序控制器</string>
<string>心电单(三)导上位机</string>
</property>
<property name="styleSheet">
<string notr="true">/*
@ -773,6 +773,18 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
</widget>
</item>
<item>
<widget class="QTextBrowser" name="textBrowser">
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;&quot;&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>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>

15
src/electrocardiograph_tester.cpp

@ -48,6 +48,9 @@ ElectrocardiographTester *ElectrocardiographTester::ins() {
}
return ins;
}
// 030065ab04000063076207650768076407305b
// 5aa5030065b00400006607650768076e076407445bb5
// 5aa5
void ElectrocardiographTester::initialize(IDataChannel *channel) { //
m_channel = channel;
m_channel->regRxListener([this](uint8_t *data, size_t len) {
@ -100,9 +103,9 @@ void ElectrocardiographTester::initialize(IDataChannel *channel) { //
uint8_t *packet = &m_rxcache[headerpos];
if (packet[0] == 0x5A && packet[1] == 0xA5) {
processCh3RxData(packet, datalen);
} else if (packet[0] == 0x4B && packet[1] == 0xB4) {
processCh4RxData(packet, datalen);
processCh3RxData(&packet[2], datalen - 4);
} else if (packet[0] == 0x4A && packet[1] == 0xA4) {
processCh4RxData(&packet[2], datalen - 4);
} else {
ZLOGI(TAG, "unknow packet: %s", zhex2str(packet, datalen).c_str());
}
@ -129,18 +132,18 @@ typedef struct {
} block_data_rx_state_t;
void ElectrocardiographTester::processCh4RxData(uint8_t *rx, int32_t rxlen) {
block_data_rx_state_t *block_data_rx_state = (block_data_rx_state_t *)&rx[2];
block_data_rx_state_t *block_data_rx_state = (block_data_rx_state_t *)rx;
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) {
ify_hrs_packet_t *rxcmd = (ify_hrs_packet_t *)&rx[2];
ify_hrs_packet_t *rxcmd = (ify_hrs_packet_t *)rx;
if (rxcmd->frame_type == kifyhrs_pt_cmd_receipt || rxcmd->frame_type == kifyhrs_pt_error_receipt) {
if (rxcmd->frame_index == m_rxReceiptContext.waittingIndex) {
lock_guard<mutex> lock(m_rxReceiptContext_lock);
m_rxReceiptContext.receiptIsReady = true;
m_rxReceiptContext.receiptLen = rxlen;
memcpy(m_rxReceiptContext.receipt, &rx[2], rxlen - 2);
memcpy(m_rxReceiptContext.receipt, &rx[0], rxlen);
} else {
ZLOGE(TAG, "Rx index not match, %s", zhex2str(rx, rxlen).c_str());
return;

7
src/heart_rate_sensor_protocol.h

@ -31,7 +31,7 @@ typedef enum {
} ify_hrs_error_code_t;
static inline const char* hrs_ecode2str(ify_hrs_error_code_t ecode){
static inline const char* hrs_ecode2str(ify_hrs_error_code_t ecode) {
switch (ecode) {
case kifyhrs_ecode_success:
return "success";
@ -100,6 +100,9 @@ typedef enum {
ify_hrs_cmd_read_sn = 14,
ify_hrs_cmd_reset = 15,
ify_hrs_cmd_stop_upload_record = 16,
ify_hrs_cmd_start_capture_time_v2 = 17,
ify_hrs_cmd_start_upload_record_v2 = 18,
ify_hrs_report_heartrate_data = 101,
ify_hrs_report_battery_level = 102,
ify_hrs_report_low_battey_level = 103,
@ -183,7 +186,9 @@ typedef struct {
uint8_t captureRate; // N*10HZ
uint8_t capturePrecision;
uint8_t compressAlgorithm; //
uint32_t checksum;
} read_record_info_receipt_t;
#define A sizeof(read_record_info_receipt_t)
typedef struct {
uint8_t record_id[6];

2
src/qt_serial_datachannel.cpp

@ -21,7 +21,7 @@ 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 ", zhe x2str(rx, rx_cnt).c_str());
if (m_rxcb) m_rxcb(rx, rx_cnt);
}
this_thread::sleep_for(chrono::microseconds(1));

Loading…
Cancel
Save