HSP Platform firmware evaluating ECG data and hearth rate over PPG data.

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Committer:
phonemacro
Date:
Thu Mar 25 21:59:17 2021 +0000
Revision:
4:682a4ebb995a
Parent:
1:f60eafbf009a
fix compile errors from mbed OS changes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 1:f60eafbf009a 1 /***************************************************************************
gmehmet 1:f60eafbf009a 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 1:f60eafbf009a 3 *
gmehmet 1:f60eafbf009a 4 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 1:f60eafbf009a 5 * copy of this software and associated documentation files (the "Software"),
gmehmet 1:f60eafbf009a 6 * to deal in the Software without restriction, including without limitation
gmehmet 1:f60eafbf009a 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 1:f60eafbf009a 8 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 1:f60eafbf009a 9 * Software is furnished to do so, subject to the following conditions:
gmehmet 1:f60eafbf009a 10 *
gmehmet 1:f60eafbf009a 11 * The above copyright notice and this permission notice shall be included
gmehmet 1:f60eafbf009a 12 * in all copies or substantial portions of the Software.
gmehmet 1:f60eafbf009a 13 *
gmehmet 1:f60eafbf009a 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 1:f60eafbf009a 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 1:f60eafbf009a 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 1:f60eafbf009a 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 1:f60eafbf009a 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 1:f60eafbf009a 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 1:f60eafbf009a 20 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 1:f60eafbf009a 21 *
gmehmet 1:f60eafbf009a 22 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 1:f60eafbf009a 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 1:f60eafbf009a 24 * Products, Inc. Branding Policy.
gmehmet 1:f60eafbf009a 25 *
gmehmet 1:f60eafbf009a 26 * The mere transfer of this software does not imply any licenses
gmehmet 1:f60eafbf009a 27 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 1:f60eafbf009a 28 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 1:f60eafbf009a 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 1:f60eafbf009a 30 * ownership rights.
gmehmet 1:f60eafbf009a 31 ****************************************************************************
gmehmet 1:f60eafbf009a 32 */
gmehmet 1:f60eafbf009a 33
gmehmet 1:f60eafbf009a 34 #include "EcgComm.h"
gmehmet 1:f60eafbf009a 35 #include "EcgComm_Defines.h"
gmehmet 1:f60eafbf009a 36 #include <ctype.h>
gmehmet 1:f60eafbf009a 37 #include "CRC8.h"
gmehmet 1:f60eafbf009a 38 #include "Peripherals.h"
gmehmet 1:f60eafbf009a 39 #include "utils.h"
gmehmet 1:f60eafbf009a 40 #include "MAX30001_Helper.h"
gmehmet 1:f60eafbf009a 41 #include "BLE_ICARUS.h"
gmehmet 1:f60eafbf009a 42
gmehmet 1:f60eafbf009a 43 #define ECG_REG_COUNT 64
gmehmet 1:f60eafbf009a 44
gmehmet 1:f60eafbf009a 45 const char *cmd_tbl_ecg[] = {
gmehmet 1:f60eafbf009a 46 "int",
gmehmet 1:f60eafbf009a 47 "get_format ecg 1",
gmehmet 1:f60eafbf009a 48 "get_format ecg 2",
gmehmet 1:f60eafbf009a 49 "read ecg 1", //ecg
gmehmet 1:f60eafbf009a 50 "read ecg 2", //android app data streaming mode
gmehmet 1:f60eafbf009a 51 "get_reg ecg",
gmehmet 1:f60eafbf009a 52 "set_reg ecg",
gmehmet 1:f60eafbf009a 53 "dump_reg ecg",
gmehmet 1:f60eafbf009a 54 "set_cfg ecg invert"
gmehmet 1:f60eafbf009a 55 };
gmehmet 1:f60eafbf009a 56
gmehmet 1:f60eafbf009a 57 typedef union {
gmehmet 1:f60eafbf009a 58 struct {
gmehmet 1:f60eafbf009a 59 uint32_t ptag :3;
gmehmet 1:f60eafbf009a 60 uint32_t etag :3;
gmehmet 1:f60eafbf009a 61 uint32_t ecg_data :16;
gmehmet 1:f60eafbf009a 62 uint32_t reserved :8;
gmehmet 1:f60eafbf009a 63 };
gmehmet 1:f60eafbf009a 64 int32_t ecg_data_whole;
gmehmet 1:f60eafbf009a 65 } ecg_data_parser;
gmehmet 1:f60eafbf009a 66
gmehmet 1:f60eafbf009a 67 EcgComm::EcgComm(USBSerial* USB):
gmehmet 1:f60eafbf009a 68 SensorComm("ecg", true)
gmehmet 1:f60eafbf009a 69 {
gmehmet 1:f60eafbf009a 70 m_USB = USB;
gmehmet 1:f60eafbf009a 71 }
gmehmet 1:f60eafbf009a 72
gmehmet 1:f60eafbf009a 73 void EcgComm::stop()
gmehmet 1:f60eafbf009a 74 {
gmehmet 1:f60eafbf009a 75 int ret;
gmehmet 1:f60eafbf009a 76 comm_mutex.lock();
gmehmet 1:f60eafbf009a 77 data_report_mode = 0;
gmehmet 1:f60eafbf009a 78 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 79 sample_count = 0;
gmehmet 1:f60eafbf009a 80 ret = sensor->sensor_enable(0);
gmehmet 1:f60eafbf009a 81 if (ret < 0) {
gmehmet 1:f60eafbf009a 82 pr_err("sensor_enable failed. ret: %d", ret);
gmehmet 1:f60eafbf009a 83 }
gmehmet 1:f60eafbf009a 84 }
gmehmet 1:f60eafbf009a 85
gmehmet 1:f60eafbf009a 86 bool EcgComm::parse_command(const char* cmd)
gmehmet 1:f60eafbf009a 87 {
gmehmet 1:f60eafbf009a 88 int i;
gmehmet 1:f60eafbf009a 89 int ret = EXIT_SUCCESS;
gmehmet 1:f60eafbf009a 90 uint8_t reg_addr;
gmehmet 1:f60eafbf009a 91 uint32_t reg_val = 0;
gmehmet 1:f60eafbf009a 92 bool recognizedCmd = false;
gmehmet 1:f60eafbf009a 93 uint8_t params[32];
gmehmet 1:f60eafbf009a 94 char charbuf[768];
gmehmet 1:f60eafbf009a 95 int data_len = 0;
gmehmet 1:f60eafbf009a 96 addr_val_pair reg_vals[ECG_REG_COUNT];
gmehmet 1:f60eafbf009a 97 int comma = 0;
gmehmet 1:f60eafbf009a 98
gmehmet 1:f60eafbf009a 99 if (sensor == NULL) {
gmehmet 1:f60eafbf009a 100 pr_err("sensor object is invalid!");
gmehmet 1:f60eafbf009a 101 return false;
gmehmet 1:f60eafbf009a 102 }
gmehmet 1:f60eafbf009a 103
gmehmet 1:f60eafbf009a 104 for (i = 0; i < NUM_CMDS; i++) {
gmehmet 1:f60eafbf009a 105 if (starts_with(cmd, cmd_tbl_ecg[i])) {
gmehmet 1:f60eafbf009a 106 cmd_state_t user_cmd = (cmd_state_t)i;
gmehmet 1:f60eafbf009a 107 recognizedCmd = true;
gmehmet 1:f60eafbf009a 108 switch (user_cmd) {
gmehmet 1:f60eafbf009a 109 case get_format_1:
gmehmet 1:f60eafbf009a 110 if(AsciiEn)
gmehmet 1:f60eafbf009a 111 {
gmehmet 1:f60eafbf009a 112 m_USB->printf("\r\n%s format=smpleCnt,ecg err=0\r\n",
gmehmet 1:f60eafbf009a 113 cmd);
gmehmet 1:f60eafbf009a 114 }
gmehmet 1:f60eafbf009a 115 else
gmehmet 1:f60eafbf009a 116 {
gmehmet 1:f60eafbf009a 117
gmehmet 1:f60eafbf009a 118 if(BLE::Instance().gap().getState().connected) {
gmehmet 1:f60eafbf009a 119 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s enc=bin cs=1 format={smpleCnt,8},{rtor,14},{rtorbpm,8},"
gmehmet 1:f60eafbf009a 120 "{pTag.0,3},{eTag.0,3},{ecg.0,18},"
gmehmet 1:f60eafbf009a 121 "{pTag.1,3},{eTag.1,3},{ecg.1,18},"
gmehmet 1:f60eafbf009a 122 "{pTag.2,3},{eTag.2,3},{ecg.2,18},"
gmehmet 1:f60eafbf009a 123 "{pTag.3,3},{eTag.3,3},{ecg.3,18} err=0\r\n", cmd);
gmehmet 1:f60eafbf009a 124 } else {
gmehmet 1:f60eafbf009a 125 m_USB->printf("\r\n%s enc=bin cs=1 format={smpleCnt,8},{pTag,3},{eTag,3},"
gmehmet 1:f60eafbf009a 126 "{ecg,18},{rtor,14},{rtorbpm,8} err=0\r\n", cmd);
gmehmet 1:f60eafbf009a 127 }
gmehmet 1:f60eafbf009a 128 }
gmehmet 1:f60eafbf009a 129 break;
gmehmet 1:f60eafbf009a 130 case get_format_2:
gmehmet 1:f60eafbf009a 131 if(AsciiEn)
gmehmet 1:f60eafbf009a 132 {
gmehmet 1:f60eafbf009a 133 m_USB->printf("\r\n%s format=smpleCnt,rtor err=0\r\n",
gmehmet 1:f60eafbf009a 134 cmd);
gmehmet 1:f60eafbf009a 135 }
gmehmet 1:f60eafbf009a 136 else
gmehmet 1:f60eafbf009a 137 {
gmehmet 1:f60eafbf009a 138 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s enc=bin cs=1 format={smplCnt,8},{rtor,15} err=0\r\n",
gmehmet 1:f60eafbf009a 139 cmd);
gmehmet 1:f60eafbf009a 140 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 141 }
gmehmet 1:f60eafbf009a 142 break;
gmehmet 1:f60eafbf009a 143 case ecg_mode:
gmehmet 1:f60eafbf009a 144
gmehmet 1:f60eafbf009a 145 comm_mutex.lock();
gmehmet 1:f60eafbf009a 146 data_report_mode = ecg_mode;
gmehmet 1:f60eafbf009a 147 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 148 ret = sensor->sensor_enable(1);
gmehmet 1:f60eafbf009a 149 if (ret < 0) {
gmehmet 1:f60eafbf009a 150 pr_err("sensor_enable failed. ret: %d", ret);
gmehmet 1:f60eafbf009a 151 }
gmehmet 1:f60eafbf009a 152
gmehmet 1:f60eafbf009a 153 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 154 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 155 break;
gmehmet 1:f60eafbf009a 156 case ecg_mode_2:
gmehmet 1:f60eafbf009a 157 comm_mutex.lock();
gmehmet 1:f60eafbf009a 158 data_report_mode = ecg_mode_2;
gmehmet 1:f60eafbf009a 159 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 160 ret = ((MAX30001_Helper*)sensor)->Max30001Helper_SetECGSampleRate(MAX30001_Helper::k128SPS);
gmehmet 1:f60eafbf009a 161 ret |= sensor->sensor_enable(1);
gmehmet 1:f60eafbf009a 162 if (ret < 0) {
gmehmet 1:f60eafbf009a 163 pr_err("sensor_enable failed. ret: %d", ret);
gmehmet 1:f60eafbf009a 164 }
gmehmet 1:f60eafbf009a 165
gmehmet 1:f60eafbf009a 166 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 167 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 168 break;
gmehmet 1:f60eafbf009a 169
gmehmet 1:f60eafbf009a 170 case get_reg:
gmehmet 1:f60eafbf009a 171 reg_addr = 0;
gmehmet 1:f60eafbf009a 172 reg_val = 0;
gmehmet 1:f60eafbf009a 173 ret = parse_get_reg_cmd(cmd, sensor_type, &reg_addr);
gmehmet 1:f60eafbf009a 174 if (!ret) {
gmehmet 1:f60eafbf009a 175 ret = sensor->MS_max30001readRegister(reg_addr, &reg_val);
gmehmet 1:f60eafbf009a 176 if(ret == 0) {
gmehmet 1:f60eafbf009a 177 data_len = snprintf(charbuf, sizeof(charbuf),
gmehmet 1:f60eafbf009a 178 "\r\n%s reg_val=%08X err=%d\r\n", cmd, reg_val, ret);
gmehmet 1:f60eafbf009a 179 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 180 }else {
gmehmet 1:f60eafbf009a 181 data_len = snprintf(charbuf, sizeof(charbuf),
gmehmet 1:f60eafbf009a 182 "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 183 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 184 }
gmehmet 1:f60eafbf009a 185 }else{
gmehmet 1:f60eafbf009a 186 data_len = snprintf(charbuf, sizeof(charbuf),
gmehmet 1:f60eafbf009a 187 "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 188 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 189 }
gmehmet 1:f60eafbf009a 190 break;
gmehmet 1:f60eafbf009a 191 case set_reg:
gmehmet 1:f60eafbf009a 192 reg_addr = 0;
gmehmet 1:f60eafbf009a 193 reg_val = 0;
gmehmet 1:f60eafbf009a 194 ret = parse_set_reg_cmd(cmd, sensor_type, &reg_addr, &reg_val);
gmehmet 1:f60eafbf009a 195 if (!ret) {
gmehmet 1:f60eafbf009a 196 ret = sensor->MS_max30001writeRegister(reg_addr, reg_val);
gmehmet 1:f60eafbf009a 197 if(ret == 0) {
gmehmet 1:f60eafbf009a 198 data_len = snprintf(charbuf, sizeof(charbuf),
gmehmet 1:f60eafbf009a 199 "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 200 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 201 }else {
gmehmet 1:f60eafbf009a 202 data_len = snprintf(charbuf, sizeof(charbuf),
gmehmet 1:f60eafbf009a 203 "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 204 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 205 }
gmehmet 1:f60eafbf009a 206 }else{
gmehmet 1:f60eafbf009a 207 data_len = snprintf(charbuf, sizeof(charbuf),
gmehmet 1:f60eafbf009a 208 "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 209 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 210 }
gmehmet 1:f60eafbf009a 211 break;
gmehmet 1:f60eafbf009a 212 case dump_regs:
gmehmet 1:f60eafbf009a 213 for (int j = 0; j < ECG_REG_COUNT; j++) {
gmehmet 1:f60eafbf009a 214 reg_vals[j].addr = 0xFF;
gmehmet 1:f60eafbf009a 215 }
gmehmet 1:f60eafbf009a 216 ret = sensor->dump_registers(reg_vals);
gmehmet 1:f60eafbf009a 217
gmehmet 1:f60eafbf009a 218 if (ret) {
gmehmet 1:f60eafbf009a 219 m_USB->printf("\r\n%s err=%d\n", cmd, ret);
gmehmet 1:f60eafbf009a 220 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\n", cmd, ret);
gmehmet 1:f60eafbf009a 221 }
gmehmet 1:f60eafbf009a 222 else {
gmehmet 1:f60eafbf009a 223 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s reg_val=", cmd);
gmehmet 1:f60eafbf009a 224 comma = false;
gmehmet 1:f60eafbf009a 225
gmehmet 1:f60eafbf009a 226 for (int reg = 0; reg < ECG_REG_COUNT; reg++) {
gmehmet 1:f60eafbf009a 227 if(reg_vals[reg].addr == 0xFF)
gmehmet 1:f60eafbf009a 228 break;
gmehmet 1:f60eafbf009a 229
gmehmet 1:f60eafbf009a 230 if (comma) {
gmehmet 1:f60eafbf009a 231 data_len += snprintf(charbuf + data_len,
gmehmet 1:f60eafbf009a 232 sizeof(charbuf) - data_len - 1, ",");
gmehmet 1:f60eafbf009a 233 }
gmehmet 1:f60eafbf009a 234 data_len += snprintf(charbuf + data_len,
gmehmet 1:f60eafbf009a 235 sizeof(charbuf) - data_len - 1,
gmehmet 1:f60eafbf009a 236 "{%X,%X}", (unsigned int)reg_vals[reg].addr, (unsigned int)reg_vals[reg].val);
gmehmet 1:f60eafbf009a 237 comma = 1;
gmehmet 1:f60eafbf009a 238 }
gmehmet 1:f60eafbf009a 239 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, " err=0\r\n");
gmehmet 1:f60eafbf009a 240 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 241 }
gmehmet 1:f60eafbf009a 242 break;
gmehmet 1:f60eafbf009a 243 case InterruptInit:
gmehmet 1:f60eafbf009a 244 ret = ECG_Parse_Parameters_Single((cmd + strlen(cmd_tbl_ecg[i])), params, kInterruptParametersCount);
gmehmet 1:f60eafbf009a 245 if(ret != 0){
gmehmet 1:f60eafbf009a 246 printf("ECG_Parse_Parameters_Single has failed\n");
gmehmet 1:f60eafbf009a 247 break;
gmehmet 1:f60eafbf009a 248 }
gmehmet 1:f60eafbf009a 249 ret = sensor->MS_max30001_INT_assignment(params[0], params[1], params[2],
gmehmet 1:f60eafbf009a 250 params[3], params[4], params[5],
gmehmet 1:f60eafbf009a 251 params[6], params[7], params[8],
gmehmet 1:f60eafbf009a 252 params[9], params[10], params[11],
gmehmet 1:f60eafbf009a 253 params[12], params[13], params[14],
gmehmet 1:f60eafbf009a 254 params[15], params[16]);
gmehmet 1:f60eafbf009a 255 m_USB->printf("\r\n%s err=%d\r\n", cmd, ret == 0 ? 0 : -255);
gmehmet 1:f60eafbf009a 256 break;
gmehmet 1:f60eafbf009a 257
gmehmet 1:f60eafbf009a 258 case set_cfg_ecg_invert: {
gmehmet 1:f60eafbf009a 259 ret = ((MAX30001_Helper*)sensor)->MAX30001_Helper_Invert_Waveform();
gmehmet 1:f60eafbf009a 260 m_USB->printf("\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 261 } break;
gmehmet 1:f60eafbf009a 262
gmehmet 1:f60eafbf009a 263 default:
gmehmet 1:f60eafbf009a 264 break;
gmehmet 1:f60eafbf009a 265 }
gmehmet 1:f60eafbf009a 266
gmehmet 1:f60eafbf009a 267
gmehmet 1:f60eafbf009a 268 if (BLE::Instance().gap().getState().connected) {
gmehmet 1:f60eafbf009a 269 BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
gmehmet 1:f60eafbf009a 270 }
gmehmet 1:f60eafbf009a 271
gmehmet 1:f60eafbf009a 272
gmehmet 1:f60eafbf009a 273 }
gmehmet 1:f60eafbf009a 274 }
gmehmet 1:f60eafbf009a 275
gmehmet 1:f60eafbf009a 276 return recognizedCmd;
gmehmet 1:f60eafbf009a 277 }
gmehmet 1:f60eafbf009a 278
gmehmet 1:f60eafbf009a 279 int EcgComm::data_report_execute(char* buf, int size)
gmehmet 1:f60eafbf009a 280 {
gmehmet 1:f60eafbf009a 281 int ret = 0;
gmehmet 1:f60eafbf009a 282 int16_t data_len = 0;
gmehmet 1:f60eafbf009a 283 uint8_t tmp_report_mode;
gmehmet 1:f60eafbf009a 284 ecg_sensor_report sensor_report = {0};
gmehmet 1:f60eafbf009a 285 ecg_sensor_report sensor_report_2 = {0};
gmehmet 1:f60eafbf009a 286 ecg_sensor_report sensor_report_3 = {0};
gmehmet 1:f60eafbf009a 287 ecg_sensor_report sensor_report_4 = {0};
gmehmet 1:f60eafbf009a 288 ecg1_comm_packet* data_packet;
gmehmet 1:f60eafbf009a 289 ecg_comm_packet_ble* data_packet_ble;
gmehmet 1:f60eafbf009a 290
gmehmet 1:f60eafbf009a 291 if(!is_enabled())
gmehmet 1:f60eafbf009a 292 return 0;
gmehmet 1:f60eafbf009a 293
gmehmet 1:f60eafbf009a 294 if (sensor == NULL)
gmehmet 1:f60eafbf009a 295 return 0;
gmehmet 1:f60eafbf009a 296
gmehmet 1:f60eafbf009a 297 comm_mutex.lock();
gmehmet 1:f60eafbf009a 298 tmp_report_mode = data_report_mode;
gmehmet 1:f60eafbf009a 299 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 300
gmehmet 1:f60eafbf009a 301 if(((MAX30001_Helper*)sensor)->Max30001Helper_getInterruptStatus()) {
gmehmet 1:f60eafbf009a 302 ((MAX30001_Helper*)sensor)->Max30001Helper_max30001_int_handler();
gmehmet 1:f60eafbf009a 303 ((MAX30001_Helper*)sensor)->Max30001Helper_setInterruptStatus(false);
gmehmet 1:f60eafbf009a 304 }
gmehmet 1:f60eafbf009a 305
gmehmet 1:f60eafbf009a 306 switch(tmp_report_mode) {
gmehmet 1:f60eafbf009a 307 case ecg_mode:
gmehmet 1:f60eafbf009a 308 case ecg_mode_2:
gmehmet 1:f60eafbf009a 309 if(AsciiEn){
gmehmet 1:f60eafbf009a 310
gmehmet 1:f60eafbf009a 311 ret = ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report);
gmehmet 1:f60eafbf009a 312
gmehmet 1:f60eafbf009a 313 if (ret < 0)
gmehmet 1:f60eafbf009a 314 return 0;
gmehmet 1:f60eafbf009a 315 data_len = snprintf(buf, size - 1,
gmehmet 1:f60eafbf009a 316 "%lu,%ld,%d,%d,%.3f,%.3f,%.3f\r\n",
gmehmet 1:f60eafbf009a 317 sample_count++,
gmehmet 1:f60eafbf009a 318 sensor_report.ecg,
gmehmet 1:f60eafbf009a 319 sensor_report.rtor,
gmehmet 1:f60eafbf009a 320 sensor_report.rtor_bpm,
gmehmet 1:f60eafbf009a 321 sensor_report.x,
gmehmet 1:f60eafbf009a 322 sensor_report.y,
gmehmet 1:f60eafbf009a 323 sensor_report.z);
gmehmet 1:f60eafbf009a 324 }
gmehmet 1:f60eafbf009a 325 else{
gmehmet 1:f60eafbf009a 326 if((m_sensorcomm_ble_interface_exists_ | m_sensorcomm_flash_rec_started_) && (((MAX30001_Helper*)sensor)->MAX30001_Helper_Queue_Size() >= m_ecg_ble_packet_count_)) {
gmehmet 1:f60eafbf009a 327
gmehmet 1:f60eafbf009a 328 ret = ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report);
gmehmet 1:f60eafbf009a 329 ret |= ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report_2);
gmehmet 1:f60eafbf009a 330 ret |= ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report_3);
gmehmet 1:f60eafbf009a 331 ret |= ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report_4);
gmehmet 1:f60eafbf009a 332
gmehmet 1:f60eafbf009a 333 if (ret < 0)
gmehmet 1:f60eafbf009a 334 return 0;
gmehmet 1:f60eafbf009a 335 data_packet_ble = (ecg_comm_packet_ble*)buf;
gmehmet 1:f60eafbf009a 336 data_packet_ble->start_byte = 0xAA;
gmehmet 1:f60eafbf009a 337 data_packet_ble->sample_count = sample_count;
gmehmet 1:f60eafbf009a 338 sample_count += m_ecg_ble_packet_count_;
gmehmet 1:f60eafbf009a 339 data_packet_ble->ecg = sensor_report.ecg;
gmehmet 1:f60eafbf009a 340 data_packet_ble->ecg_2 = sensor_report_2.ecg;
gmehmet 1:f60eafbf009a 341 data_packet_ble->ecg_3 = sensor_report_3.ecg;
gmehmet 1:f60eafbf009a 342 data_packet_ble->ecg_4 = sensor_report_4.ecg;
gmehmet 1:f60eafbf009a 343 data_packet_ble->rtor = (sensor_report.rtor | sensor_report_2.rtor | sensor_report_3.rtor | sensor_report_4.rtor);
gmehmet 1:f60eafbf009a 344 data_packet_ble->rtor_bpm = (sensor_report.rtor_bpm | sensor_report_2.rtor_bpm | sensor_report_3.rtor_bpm | sensor_report_4.rtor_bpm);
gmehmet 1:f60eafbf009a 345 data_packet_ble->crc8 = crc8((uint8_t*)data_packet_ble, sizeof(*data_packet_ble) - sizeof(uint8_t));
gmehmet 1:f60eafbf009a 346 data_len = sizeof(*data_packet_ble);
gmehmet 1:f60eafbf009a 347 } else if((m_sensorcomm_ble_interface_exists_ == 0) & (m_sensorcomm_flash_rec_started_ == 0)) {
gmehmet 1:f60eafbf009a 348
gmehmet 1:f60eafbf009a 349 ret = ((MAX30001_Helper*)sensor)->get_sensor_report(sensor_report);
gmehmet 1:f60eafbf009a 350
gmehmet 1:f60eafbf009a 351 if (ret < 0)
gmehmet 1:f60eafbf009a 352 return 0;
gmehmet 1:f60eafbf009a 353 data_packet = (ecg1_comm_packet*)buf;
gmehmet 1:f60eafbf009a 354 data_packet->start_byte = 0xAA;
gmehmet 1:f60eafbf009a 355 data_packet->sample_count = sample_count++;
gmehmet 1:f60eafbf009a 356 data_packet->ecg = sensor_report.ecg;
gmehmet 1:f60eafbf009a 357 data_packet->rtor = sensor_report.rtor;
gmehmet 1:f60eafbf009a 358 data_packet->rtor_bpm = sensor_report.rtor_bpm;
gmehmet 1:f60eafbf009a 359 data_packet->crc8 = crc8((uint8_t*)data_packet, sizeof(*data_packet) - sizeof(uint8_t));
gmehmet 1:f60eafbf009a 360 data_len = sizeof(*data_packet);
gmehmet 1:f60eafbf009a 361 }
gmehmet 1:f60eafbf009a 362 }
gmehmet 1:f60eafbf009a 363 break;
gmehmet 1:f60eafbf009a 364 default:
gmehmet 1:f60eafbf009a 365 break;
gmehmet 1:f60eafbf009a 366 }
gmehmet 1:f60eafbf009a 367
gmehmet 1:f60eafbf009a 368 if (data_len < 0) {
gmehmet 1:f60eafbf009a 369 pr_err("snprintf buf failed");
gmehmet 1:f60eafbf009a 370 } else if (data_len > size) {
gmehmet 1:f60eafbf009a 371 pr_err("buffer is insufficient to hold data");
gmehmet 1:f60eafbf009a 372 }
gmehmet 1:f60eafbf009a 373
gmehmet 1:f60eafbf009a 374 return data_len;
gmehmet 1:f60eafbf009a 375 }
gmehmet 1:f60eafbf009a 376
gmehmet 1:f60eafbf009a 377 // this function parses the parameters for max30001_ECG_InitStart function
gmehmet 1:f60eafbf009a 378 int EcgComm::ECG_Parse_Parameters(char *substring, uint8_t parameters[], uint8_t parameters_len){
gmehmet 1:f60eafbf009a 379 char *pt_ch = substring;
gmehmet 1:f60eafbf009a 380
gmehmet 1:f60eafbf009a 381 if(strlen(pt_ch) < (parameters_len*2)){
gmehmet 1:f60eafbf009a 382 pr_err("Wrong number of params");
gmehmet 1:f60eafbf009a 383 return -1;
gmehmet 1:f60eafbf009a 384 }else{
gmehmet 1:f60eafbf009a 385 if(ConvertHexString2Decimal(pt_ch, parameters, parameters_len) != 0)
gmehmet 1:f60eafbf009a 386 return -1;
gmehmet 1:f60eafbf009a 387 for(int i = 0; i < parameters_len; ++i){
gmehmet 1:f60eafbf009a 388 printf("%d\n", parameters[i]);
gmehmet 1:f60eafbf009a 389 }
gmehmet 1:f60eafbf009a 390 }
gmehmet 1:f60eafbf009a 391 return 0;
gmehmet 1:f60eafbf009a 392 }
gmehmet 1:f60eafbf009a 393
gmehmet 1:f60eafbf009a 394 // this function parses the parameters for max30001_ECG_InitStart function for single digits
gmehmet 1:f60eafbf009a 395 int EcgComm::ECG_Parse_Parameters_Single(const char *substring, uint8_t parameters[], uint8_t parameters_len){
gmehmet 1:f60eafbf009a 396 const char *pt_ch = substring;
gmehmet 1:f60eafbf009a 397 int i = 0;
gmehmet 1:f60eafbf009a 398 unsigned char num_found = 0;
gmehmet 1:f60eafbf009a 399
gmehmet 1:f60eafbf009a 400 if(strlen(pt_ch) < (parameters_len)){
gmehmet 1:f60eafbf009a 401 pr_err("Wrong number of params");
gmehmet 1:f60eafbf009a 402 return -1;
gmehmet 1:f60eafbf009a 403 }else{
gmehmet 1:f60eafbf009a 404 for(i = 0; i < parameters_len; ++i){
gmehmet 1:f60eafbf009a 405 if(getHexDigit(pt_ch[i], &num_found)){
gmehmet 1:f60eafbf009a 406 parameters[i] = num_found;
gmehmet 1:f60eafbf009a 407 }
gmehmet 1:f60eafbf009a 408 else{
gmehmet 1:f60eafbf009a 409 pr_err("parsing of parameters failed");
gmehmet 1:f60eafbf009a 410 return -1;
gmehmet 1:f60eafbf009a 411 }
gmehmet 1:f60eafbf009a 412 }
gmehmet 1:f60eafbf009a 413 for(i = 0; i < parameters_len; ++i){
gmehmet 1:f60eafbf009a 414 printf("%d\n", parameters[i]);
gmehmet 1:f60eafbf009a 415 }
gmehmet 1:f60eafbf009a 416 }
gmehmet 1:f60eafbf009a 417 return 0;
gmehmet 1:f60eafbf009a 418
gmehmet 1:f60eafbf009a 419 }
gmehmet 1:f60eafbf009a 420
gmehmet 1:f60eafbf009a 421 char getHexDigit(char ch_hex, uint8_t *bt_hex)
gmehmet 1:f60eafbf009a 422 {
gmehmet 1:f60eafbf009a 423 if (ch_hex >= '0' && ch_hex <= '9')
gmehmet 1:f60eafbf009a 424 *bt_hex = ch_hex - '0';
gmehmet 1:f60eafbf009a 425 else if (ch_hex >= 'A' && ch_hex <= 'F')
gmehmet 1:f60eafbf009a 426 *bt_hex = ch_hex - 'A' + 10;
gmehmet 1:f60eafbf009a 427 else if (ch_hex >= 'a' && ch_hex <= 'f')
gmehmet 1:f60eafbf009a 428 *bt_hex = ch_hex - 'a' + 10;
gmehmet 1:f60eafbf009a 429 else
gmehmet 1:f60eafbf009a 430 return false;
gmehmet 1:f60eafbf009a 431 return true;
gmehmet 1:f60eafbf009a 432 }
gmehmet 1:f60eafbf009a 433
gmehmet 1:f60eafbf009a 434
gmehmet 1:f60eafbf009a 435 int ConvertHexString2Decimal(char *pt_ch, uint8_t *bt_hex, int len){
gmehmet 1:f60eafbf009a 436
gmehmet 1:f60eafbf009a 437 if(strlen(pt_ch) < ((uint32_t)len * 2))
gmehmet 1:f60eafbf009a 438 return -1;
gmehmet 1:f60eafbf009a 439
gmehmet 1:f60eafbf009a 440 for(int i = 0; i < len; ++i){
gmehmet 1:f60eafbf009a 441 uint8_t hex_digit;
gmehmet 1:f60eafbf009a 442 // Get most significant hex digit
gmehmet 1:f60eafbf009a 443 if (!getHexDigit(*(pt_ch++), &hex_digit))
gmehmet 1:f60eafbf009a 444 return -1;
gmehmet 1:f60eafbf009a 445 else
gmehmet 1:f60eafbf009a 446 {
gmehmet 1:f60eafbf009a 447 hex_digit <<= 4;
gmehmet 1:f60eafbf009a 448 bt_hex[i] = hex_digit;
gmehmet 1:f60eafbf009a 449 }
gmehmet 1:f60eafbf009a 450 // Get least significant digit
gmehmet 1:f60eafbf009a 451 if (!getHexDigit(*(pt_ch++), &hex_digit))
gmehmet 1:f60eafbf009a 452 return -1;
gmehmet 1:f60eafbf009a 453 else{
gmehmet 1:f60eafbf009a 454 bt_hex[i] |= hex_digit;
gmehmet 1:f60eafbf009a 455 }
gmehmet 1:f60eafbf009a 456 }
gmehmet 1:f60eafbf009a 457 return 0;
gmehmet 1:f60eafbf009a 458 }
gmehmet 1:f60eafbf009a 459
gmehmet 1:f60eafbf009a 460
gmehmet 1:f60eafbf009a 461