You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
4.8 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #pragma once
  2. #include <fstream>
  3. #include <functional>
  4. #include <iostream>
  5. #include <list>
  6. #include <map>
  7. #include <memory>
  8. #include <mutex>
  9. #include <set>
  10. #include <sstream>
  11. #include <string>
  12. #include <thread>
  13. #include <vector>
  14. #include "../ify_hrs_protocol/heart_rate_sensor_protocol.h"
  15. #include "electrocardiograph_tester.hpp"
  16. #define SDK_VERSION 1
  17. namespace iflytop {
  18. using namespace std;
  19. typedef enum {
  20. kcmd_cmd,
  21. kcmd_receipt,
  22. kcmd_report,
  23. kcmd_ch4_data,
  24. } raw_data_type_t;
  25. typedef function<void(bool checkok, ify_hrs_packet_t *report_packet, size_t len)> on_report_t;
  26. typedef function<void(uint32_t rxcnt, uint32_t report_packet_checksum)> on_ch4_check_sum_packet_report_t;
  27. typedef function<void(raw_data_type_t type, uint8_t *hex, uint32_t hexlen)> on_raw_data_t;
  28. class IDataChannel {
  29. public:
  30. virtual ~IDataChannel(){};
  31. virtual bool isOpen() = 0;
  32. virtual bool send(const uint8_t *data, size_t len) = 0;
  33. virtual void regRxListener(function<void(uint8_t *data, size_t len)> cb) = 0;
  34. };
  35. class RxReceiptContext {
  36. public:
  37. bool waittingForReceipt;
  38. bool receiptIsReady;
  39. uint16_t waittingIndex;
  40. uint8_t receipt[1024];
  41. size_t receiptLen;
  42. };
  43. class ElectrocardiographTester {
  44. ElectrocardiographTester() {}
  45. IDataChannel *m_channel = nullptr;
  46. uint8_t m_rxcache[1024];
  47. int32_t m_rxlen = 0;
  48. bool m_rxcache_is_full = false;
  49. mutex lock_;
  50. unique_ptr<thread> m_thread;
  51. RxReceiptContext m_rxReceiptContext;
  52. mutex m_rxReceiptContext_lock;
  53. /*******************************************************************************
  54. * TX CONTEXT *
  55. *******************************************************************************/
  56. mutex m_tx_lock;
  57. uint8_t m_txbuf[1024];
  58. uint8_t m_rxbuf[1024];
  59. ify_hrs_packet_t *m_txcmd = (ify_hrs_packet_t *)m_txbuf;
  60. ify_hrs_packet_t *m_rxcmd = (ify_hrs_packet_t *)m_rxbuf;
  61. int32_t m_rxsize;
  62. uint8_t m_txindex = 0;
  63. /*******************************************************************************
  64. * ReportCB *
  65. *******************************************************************************/
  66. on_report_t m_on_report;
  67. on_ch4_check_sum_packet_report_t m_on_ch4_check_sum_packet_report;
  68. on_raw_data_t m_on_raw_data_cb;
  69. public:
  70. static ElectrocardiographTester *ins();
  71. void initialize(IDataChannel *channel);
  72. void regReportCB(on_report_t cb);
  73. void regCh4CheckSumPacketReport(on_ch4_check_sum_packet_report_t cb);
  74. void regRawDataCB(on_raw_data_t cb);
  75. public:
  76. void readDeviceVersion(device_version_info_receipt_t *version); // 读取设备版本信息
  77. void readSensorInfo(sensor_info_receipt_t *sensor); // 读取传感器信息
  78. void readDeviceState(device_state_receipt_t *state); // 读取设备状态信息
  79. void readTime(read_time_receipt_t *time); // 读取设备时间
  80. void syncTime(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second); // 同步设备时间
  81. // void startCapture(); // 开始采集
  82. // void stopCapture(); // 停止采集
  83. void startRealtimeReport(); // 开始实时数据上报
  84. void stopRealtimeReport(); // 停止实时数据上报
  85. void readRecordsInfo(int32_t recordoff, read_record_info_receipt_t *recordinfo); // 读取记录信息
  86. void delRecord(uint8_t *recordId); // 删除记录
  87. void startUploadRecord(uint8_t *recordId); // 开始上传记录
  88. void stopUploadRecord(); // 停止上传记录
  89. void readSn(string &sn);
  90. void reset(); // 重置设备
  91. void testCmdStartCapture();
  92. void testCmdStopCapture();
  93. uint8_t testCmdReadReg(uint8_t addr);
  94. void testCmdWriteReg(uint8_t addr, uint8_t val);
  95. private:
  96. void sendCmd(ify_hrs_packet_t *tx, int32_t txlen, ify_hrs_packet_t *rx, int32_t *rxlen, int32_t overtime);
  97. void processCh3RxData(uint8_t *rx, int32_t rxlen); // 指令通道
  98. void processCh4RxData(uint8_t *rx, int32_t rxlen); // 心电原始数据通道
  99. void processRxReportPacket(ify_hrs_packet_t *rx, int32_t rxlen);
  100. };
  101. } // namespace iflytop