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

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Committer:
gmehmet
Date:
Wed Apr 10 14:56:25 2019 +0300
Revision:
1:f60eafbf009a
upload from local

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 #ifndef _SSMAX8614XCOMM_H_
gmehmet 1:f60eafbf009a 35 #define _SSMAX8614XCOMM_H_
gmehmet 1:f60eafbf009a 36
gmehmet 1:f60eafbf009a 37 #include "mbed.h"
gmehmet 1:f60eafbf009a 38 #include "SensorComm.h"
gmehmet 1:f60eafbf009a 39 #include "USBSerial.h"
gmehmet 1:f60eafbf009a 40 #include "SSInterface.h"
gmehmet 1:f60eafbf009a 41 #include "queue.h"
gmehmet 1:f60eafbf009a 42 #include "bmi160.h"
gmehmet 1:f60eafbf009a 43
gmehmet 1:f60eafbf009a 44 #define SENSOR_ID_SSMAX8614X 0x04
gmehmet 1:f60eafbf009a 45
gmehmet 1:f60eafbf009a 46 #define PPG_CONF_LEVEL_FLASH_ADDRESS 0x0010F100
gmehmet 1:f60eafbf009a 47 #define PPG_EXPIRE_DURATION_FLASH_ADDRESS 0x0010F104
gmehmet 1:f60eafbf009a 48
gmehmet 1:f60eafbf009a 49
gmehmet 1:f60eafbf009a 50 /**
gmehmet 1:f60eafbf009a 51 * @brief SSMAX8614XComm Command handler class for communication with MAX30101 on SmartSensor board
gmehmet 1:f60eafbf009a 52 * @details
gmehmet 1:f60eafbf009a 53 */
gmehmet 1:f60eafbf009a 54 class SSMAX8614XComm: public SensorComm
gmehmet 1:f60eafbf009a 55 {
gmehmet 1:f60eafbf009a 56 public:
gmehmet 1:f60eafbf009a 57
gmehmet 1:f60eafbf009a 58 /* PUBLIC FUNCTION DECLARATIONS */
gmehmet 1:f60eafbf009a 59 /**
gmehmet 1:f60eafbf009a 60 * @brief SSMAX8614XComm constructor.
gmehmet 1:f60eafbf009a 61 *
gmehmet 1:f60eafbf009a 62 */
gmehmet 1:f60eafbf009a 63 SSMAX8614XComm(USBSerial* USB, SSInterface* ssInterface, DSInterface* dsInterface);
gmehmet 1:f60eafbf009a 64
gmehmet 1:f60eafbf009a 65 /**
gmehmet 1:f60eafbf009a 66 * @brief Parses DeviceStudio-style commands.
gmehmet 1:f60eafbf009a 67 * @details Parses and executes commands. Prints return code to i/o device.
gmehmet 1:f60eafbf009a 68 * @returns true if sensor acted upon the command, false if command was unknown
gmehmet 1:f60eafbf009a 69 */
gmehmet 1:f60eafbf009a 70 bool parse_command(const char* cmd);
gmehmet 1:f60eafbf009a 71
gmehmet 1:f60eafbf009a 72 /**
gmehmet 1:f60eafbf009a 73 * @brief Fill in buffer with sensor data
gmehmet 1:f60eafbf009a 74 *
gmehmet 1:f60eafbf009a 75 * @param[in] buf Buffer to fill data into
gmehmet 1:f60eafbf009a 76 * @param[in] size Maximum size of buffer
gmehmet 1:f60eafbf009a 77 * @param[out] Number of bytes written to buffer
gmehmet 1:f60eafbf009a 78 */
gmehmet 1:f60eafbf009a 79 int data_report_execute(char* buf, int size);
gmehmet 1:f60eafbf009a 80
gmehmet 1:f60eafbf009a 81 /**
gmehmet 1:f60eafbf009a 82 * @brief Stop collecting data and disable sensor
gmehmet 1:f60eafbf009a 83 */
gmehmet 1:f60eafbf009a 84 void stop();
gmehmet 1:f60eafbf009a 85
gmehmet 1:f60eafbf009a 86 /**
gmehmet 1:f60eafbf009a 87 * @brief Get the maxim part number of the device
gmehmet 1:f60eafbf009a 88 */
gmehmet 1:f60eafbf009a 89 const char* get_part_name() { return "max8614x"; }
gmehmet 1:f60eafbf009a 90
gmehmet 1:f60eafbf009a 91 /**
gmehmet 1:f60eafbf009a 92 * @brief Execute the smart sensor self test routine
gmehmet 1:f60eafbf009a 93 *
gmehmet 1:f60eafbf009a 94 * @return SS_SUCCESS or error code
gmehmet 1:f60eafbf009a 95 */
gmehmet 1:f60eafbf009a 96 int selftest_max8614x();
gmehmet 1:f60eafbf009a 97
gmehmet 1:f60eafbf009a 98 /**
gmehmet 1:f60eafbf009a 99 * @brief Execute the accelerometer self test routine
gmehmet 1:f60eafbf009a 100 * @return SS_SUCCESS or error code
gmehmet 1:f60eafbf009a 101 */
gmehmet 1:f60eafbf009a 102 int selftest_accelerometer();
gmehmet 1:f60eafbf009a 103
gmehmet 1:f60eafbf009a 104 /**
gmehmet 1:f60eafbf009a 105 * @brief Evaluate the accelerometer self test routine
gmehmet 1:f60eafbf009a 106 *
gmehmet 1:f60eafbf009a 107 * @param message - message to be printed in the failure cases
gmehmet 1:f60eafbf009a 108 * @param value - result of the self test passed as parameter
gmehmet 1:f60eafbf009a 109 * @return true if result is SUCCESSFULL false otherwise
gmehmet 1:f60eafbf009a 110 */
gmehmet 1:f60eafbf009a 111 bool self_test_result_evaluate(const char *message, uint8_t value);
gmehmet 1:f60eafbf009a 112
gmehmet 1:f60eafbf009a 113 unsigned char get_sensor_id();
gmehmet 1:f60eafbf009a 114
gmehmet 1:f60eafbf009a 115 void setBMI160(BMI160_I2C *pbmi160);
gmehmet 1:f60eafbf009a 116
gmehmet 1:f60eafbf009a 117 uint16_t instant_hr;
gmehmet 1:f60eafbf009a 118 uint16_t instant_hr_conf;
gmehmet 1:f60eafbf009a 119 uint8_t instant_hr_activityClass;
gmehmet 1:f60eafbf009a 120
gmehmet 1:f60eafbf009a 121 uint16_t instant_spo2;
gmehmet 1:f60eafbf009a 122 uint16_t instant_spo2_conf;
gmehmet 1:f60eafbf009a 123 uint8_t instant_spo2_percentage;
gmehmet 1:f60eafbf009a 124 uint8_t instant_lowSignalQualityFlag;
gmehmet 1:f60eafbf009a 125
gmehmet 1:f60eafbf009a 126 private:
gmehmet 1:f60eafbf009a 127 /* PRIVATE TYPE DEFINITIONS */
gmehmet 1:f60eafbf009a 128 typedef enum _cmd_state_t {
gmehmet 1:f60eafbf009a 129 get_format_ppg_0,
gmehmet 1:f60eafbf009a 130 read_ppg_0, // moved here to match parser index "3"
gmehmet 1:f60eafbf009a 131 get_reg_ppg,
gmehmet 1:f60eafbf009a 132 set_reg_ppg,
gmehmet 1:f60eafbf009a 133 dump_reg_ppg,
gmehmet 1:f60eafbf009a 134 set_agc_dis,
gmehmet 1:f60eafbf009a 135 set_agc_en,
gmehmet 1:f60eafbf009a 136 self_test_ppg_os58,
gmehmet 1:f60eafbf009a 137 self_test_ppg_acc,
gmehmet 1:f60eafbf009a 138 //---------------------------WHRM_AEC_SCD -------
gmehmet 1:f60eafbf009a 139 set_cfg_whrmaecscd_aecenable,
gmehmet 1:f60eafbf009a 140 get_cfg_whrmaecscd_aecenable,
gmehmet 1:f60eafbf009a 141 set_cfg_whrmaecscd_scdenable,
gmehmet 1:f60eafbf009a 142 get_cfg_whrmaecscd_scdenable,
gmehmet 1:f60eafbf009a 143 set_cfg_whrmaecscd_adjpdperiod,
gmehmet 1:f60eafbf009a 144 get_cfg_whrmaecscd_adjpdperiod,
gmehmet 1:f60eafbf009a 145 set_cfg_whrmaecscd_debouncewin,
gmehmet 1:f60eafbf009a 146 get_cfg_whrmaecscd_debouncewin,
gmehmet 1:f60eafbf009a 147 set_cfg_whrmaecscd_motionthreshold,
gmehmet 1:f60eafbf009a 148 get_cfg_whrmaecscd_motionthreshold,
gmehmet 1:f60eafbf009a 149 set_cfg_whrmaecscd_minpdcurrent,
gmehmet 1:f60eafbf009a 150 get_cfg_whrmaecscd_minpdcurrent,
gmehmet 1:f60eafbf009a 151 set_cfg_whrmaecscd_pdconfig,
gmehmet 1:f60eafbf009a 152 get_cfg_whrmaecscd_pdconfig,
gmehmet 1:f60eafbf009a 153 set_cfg_whrmaecscd_ledconfig,
gmehmet 1:f60eafbf009a 154 get_cfg_whrmaecscd_ledconfig,
gmehmet 1:f60eafbf009a 155 //------------------------------------------------
gmehmet 1:f60eafbf009a 156 send_raw,
gmehmet 1:f60eafbf009a 157 set_cfg_accel_sh_dis,
gmehmet 1:f60eafbf009a 158 set_cfg_accel_sh_en,
gmehmet 1:f60eafbf009a 159 set_cfg_ppg_conf_level,
gmehmet 1:f60eafbf009a 160 set_cfg_ppg_expire_duration,
gmehmet 1:f60eafbf009a 161 NUM_CMDS,
gmehmet 1:f60eafbf009a 162 } cmd_state_t;
gmehmet 1:f60eafbf009a 163
gmehmet 1:f60eafbf009a 164
gmehmet 1:f60eafbf009a 165 typedef struct {
gmehmet 1:f60eafbf009a 166 uint32_t led1;
gmehmet 1:f60eafbf009a 167 uint32_t led2;
gmehmet 1:f60eafbf009a 168 uint32_t led3;
gmehmet 1:f60eafbf009a 169 uint32_t led4;
gmehmet 1:f60eafbf009a 170 uint32_t led5;
gmehmet 1:f60eafbf009a 171 uint32_t led6;
gmehmet 1:f60eafbf009a 172 } max8614x_mode1_data;
gmehmet 1:f60eafbf009a 173
gmehmet 1:f60eafbf009a 174 typedef struct __attribute__((packed)){
gmehmet 1:f60eafbf009a 175 uint16_t hr; // mode 1 & 2
gmehmet 1:f60eafbf009a 176 uint8_t hr_conf; // mode 1 & 2
gmehmet 1:f60eafbf009a 177 uint16_t rr; // mode 1 & 2
gmehmet 1:f60eafbf009a 178 uint8_t activity_class; // mode 1 & 2
gmehmet 1:f60eafbf009a 179 uint8_t rr_conf; // mode 2
gmehmet 1:f60eafbf009a 180 uint32_t walk_steps; // mode 2
gmehmet 1:f60eafbf009a 181 uint32_t run_steps; // mode 2
gmehmet 1:f60eafbf009a 182 uint32_t kcal; // mode 2
gmehmet 1:f60eafbf009a 183 uint32_t cadence; // mode 2
gmehmet 1:f60eafbf009a 184 uint8_t is_led_cur_adj; // mode 2
gmehmet 1:f60eafbf009a 185 uint16_t adj_led_cur; // mode 2
gmehmet 1:f60eafbf009a 186 uint8_t is_t_int_cur_adj;// mode 2
gmehmet 1:f60eafbf009a 187 uint16_t adj_t_int_cur; // mode 2
gmehmet 1:f60eafbf009a 188 uint8_t is_f_smp_adj; // mode 2
gmehmet 1:f60eafbf009a 189 uint8_t adj_f_smp; // mode 2
gmehmet 1:f60eafbf009a 190 uint8_t smp_ave; // mode 2
gmehmet 1:f60eafbf009a 191 uint8_t state; // mode 2
gmehmet 1:f60eafbf009a 192 uint8_t is_high_motion; // mode 2
gmehmet 1:f60eafbf009a 193 uint8_t status; // mode 2
gmehmet 1:f60eafbf009a 194 } whrm_modeX_data;
gmehmet 1:f60eafbf009a 195
gmehmet 1:f60eafbf009a 196 typedef struct {
gmehmet 1:f60eafbf009a 197 int16_t x;
gmehmet 1:f60eafbf009a 198 int16_t y;
gmehmet 1:f60eafbf009a 199 int16_t z;
gmehmet 1:f60eafbf009a 200 } accel_mode1_data;
gmehmet 1:f60eafbf009a 201
gmehmet 1:f60eafbf009a 202
gmehmet 1:f60eafbf009a 203 typedef struct __attribute__((packed)) {
gmehmet 1:f60eafbf009a 204 uint32_t start_byte :8;
gmehmet 1:f60eafbf009a 205
gmehmet 1:f60eafbf009a 206 uint32_t sample_cnt :32;
gmehmet 1:f60eafbf009a 207 uint32_t led1 :20;
gmehmet 1:f60eafbf009a 208 uint32_t led2 :20;
gmehmet 1:f60eafbf009a 209 uint32_t led3 :20;
gmehmet 1:f60eafbf009a 210 uint32_t led4 :20;
gmehmet 1:f60eafbf009a 211 uint32_t led5 :20;
gmehmet 1:f60eafbf009a 212 uint32_t led6 :20;
gmehmet 1:f60eafbf009a 213 uint32_t x :14; //Represent values of 0.000 through 8.191
gmehmet 1:f60eafbf009a 214 uint32_t y :14; //Represent values of 0.000 through 8.191
gmehmet 1:f60eafbf009a 215 uint32_t z :14; //Represent values of 0.000 through 8.191
gmehmet 1:f60eafbf009a 216 uint32_t hr :12; //Represent values of 0.0 through 204.7
gmehmet 1:f60eafbf009a 217 uint32_t spo2 :11; //Represent values of 0.0 through 102.3 (only need up to 100.0)
gmehmet 1:f60eafbf009a 218 uint32_t status :8;
gmehmet 1:f60eafbf009a 219
gmehmet 1:f60eafbf009a 220 uint8_t :0; //Align CRC byte on byte boundary
gmehmet 1:f60eafbf009a 221 uint8_t crc8:8;
gmehmet 1:f60eafbf009a 222 } ds_pkt_data_mode1;
gmehmet 1:f60eafbf009a 223
gmehmet 1:f60eafbf009a 224
gmehmet 1:f60eafbf009a 225 typedef struct __attribute__((packed)) {
gmehmet 1:f60eafbf009a 226 uint32_t start_byte :8;
gmehmet 1:f60eafbf009a 227 uint32_t sample_cnt :16;
gmehmet 1:f60eafbf009a 228 uint32_t grnCnt :20;
gmehmet 1:f60eafbf009a 229 uint32_t grn2Cnt :20;
gmehmet 1:f60eafbf009a 230 uint32_t x :14; //Represent values of 0.000 through 8.191
gmehmet 1:f60eafbf009a 231 uint32_t y :14; //Represent values of 0.000 through 8.191
gmehmet 1:f60eafbf009a 232 uint32_t z :14; //Represent values of 0.000 through 8.191
gmehmet 1:f60eafbf009a 233 uint32_t hr :12; //Represent values of 0.0 through 204.7
gmehmet 1:f60eafbf009a 234 uint32_t hr_confidence :8; //Represent values of 0.0 through 100
gmehmet 1:f60eafbf009a 235 uint32_t rr :11; //Represent values of 0.0 through 102.3 (only need up to 100.0)
gmehmet 1:f60eafbf009a 236 uint32_t status :8;
gmehmet 1:f60eafbf009a 237 uint8_t :0; //Align CRC byte on byte boundary
gmehmet 1:f60eafbf009a 238 uint8_t crc8:8;
gmehmet 1:f60eafbf009a 239 } ds_pkt_data_mode2_compact;
gmehmet 1:f60eafbf009a 240
gmehmet 1:f60eafbf009a 241 typedef struct _accel_data_t {
gmehmet 1:f60eafbf009a 242 float x;
gmehmet 1:f60eafbf009a 243 float y;
gmehmet 1:f60eafbf009a 244 float z;
gmehmet 1:f60eafbf009a 245 int16_t x_raw;
gmehmet 1:f60eafbf009a 246 int16_t y_raw;
gmehmet 1:f60eafbf009a 247 int16_t z_raw;
gmehmet 1:f60eafbf009a 248 } accel_data_t;
gmehmet 1:f60eafbf009a 249
gmehmet 1:f60eafbf009a 250 /* PRIVATE VARIABLES */
gmehmet 1:f60eafbf009a 251 int input_fifo_size;
gmehmet 1:f60eafbf009a 252 bool sensor_data_from_host;
gmehmet 1:f60eafbf009a 253
gmehmet 1:f60eafbf009a 254 BMI160_I2C *m_bmi160;
gmehmet 1:f60eafbf009a 255
gmehmet 1:f60eafbf009a 256 USBSerial *m_USB;
gmehmet 1:f60eafbf009a 257 SSInterface *ss_int;
gmehmet 1:f60eafbf009a 258 DSInterface *ds_int;
gmehmet 1:f60eafbf009a 259
gmehmet 1:f60eafbf009a 260 queue_t max8614x_queue;
gmehmet 1:f60eafbf009a 261 uint8_t max8614x_queue_buf[64 * sizeof(max8614x_mode1_data)];
gmehmet 1:f60eafbf009a 262
gmehmet 1:f60eafbf009a 263 queue_t whrm_queue;
gmehmet 1:f60eafbf009a 264 uint8_t whrm_queue_buf[64 * sizeof(whrm_modeX_data)]; // use the bigger of model and 2
gmehmet 1:f60eafbf009a 265
gmehmet 1:f60eafbf009a 266 queue_t accel_output_queue;
gmehmet 1:f60eafbf009a 267 uint8_t accel_output_queue_buf[64 * sizeof(accel_mode1_data)];
gmehmet 1:f60eafbf009a 268
gmehmet 1:f60eafbf009a 269 queue_t accel_input_queue;
gmehmet 1:f60eafbf009a 270 uint8_t accel_input_queue_buf[64 * sizeof(accel_mode1_data)];
gmehmet 1:f60eafbf009a 271
gmehmet 1:f60eafbf009a 272
gmehmet 1:f60eafbf009a 273 ss_data_req max8614x_mode1_data_req;
gmehmet 1:f60eafbf009a 274 ss_data_req whrm_mode1_data_req;
gmehmet 1:f60eafbf009a 275 ss_data_req whrm_mode2_data_req;
gmehmet 1:f60eafbf009a 276
gmehmet 1:f60eafbf009a 277 ss_data_req accel_mode1_data_req;
gmehmet 1:f60eafbf009a 278 ss_data_req agc_mode1_data_req;
gmehmet 1:f60eafbf009a 279
gmehmet 1:f60eafbf009a 280
gmehmet 1:f60eafbf009a 281 bool agc_enabled;
gmehmet 1:f60eafbf009a 282
gmehmet 1:f60eafbf009a 283 // sensor and algo status
gmehmet 1:f60eafbf009a 284 status_algo_sensors_st sensor_algo_en_dis_;
gmehmet 1:f60eafbf009a 285
gmehmet 1:f60eafbf009a 286 /* PRIVATE CONST VARIABLES */
gmehmet 1:f60eafbf009a 287 static const int SSMAX8614X_REG_SIZE = 1;
gmehmet 1:f60eafbf009a 288 static const int SSMAX8614X_MODE1_DATASIZE = 18; //Taken from API doc
gmehmet 1:f60eafbf009a 289 static const int SSWHRM_MODE1_DATASIZE = 6; //Taken from API doc
gmehmet 1:f60eafbf009a 290 static const int SSWHRM_MODEX_DATASIZE = 35; // For WHRM_AEC_SCD
gmehmet 1:f60eafbf009a 291 static const int SSACCEL_MODE1_DATASIZE = 6; //Taken from API doc
gmehmet 1:f60eafbf009a 292 static const int SSAGC_MODE1_DATASIZE = 0; //Taken from API doc
gmehmet 1:f60eafbf009a 293
gmehmet 1:f60eafbf009a 294
gmehmet 1:f60eafbf009a 295 /* PRIVATE METHODS */
gmehmet 1:f60eafbf009a 296 void max8614x_data_rx(uint8_t *data_ptr);
gmehmet 1:f60eafbf009a 297 void whrm_data_rx_mode1(uint8_t *data_ptr);
gmehmet 1:f60eafbf009a 298 void whrm_data_rx_mode2(uint8_t *data_ptr);
gmehmet 1:f60eafbf009a 299 void accel_data_rx(uint8_t *data_ptr);
gmehmet 1:f60eafbf009a 300 void agc_data_rx(uint8_t *data_ptr);
gmehmet 1:f60eafbf009a 301 int get_sensor_xyz(accel_data_t&);
gmehmet 1:f60eafbf009a 302 int parse_cal_str(const char *ptr_ch, const char *cmd, uint8_t *cal_data, int cal_data_sz);
gmehmet 1:f60eafbf009a 303 int parse_str(const char *ptr_ch, const char *cmd, uint8_t *data, int data_sz);
gmehmet 1:f60eafbf009a 304 };
gmehmet 1:f60eafbf009a 305
gmehmet 1:f60eafbf009a 306 #endif /* _SSMAX8614XCOMM_H_ */