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 #include "DSInterface.h"
gmehmet 1:f60eafbf009a 35 #include "SSMAX8614XComm.h"
gmehmet 1:f60eafbf009a 36
gmehmet 1:f60eafbf009a 37 #include "../../../../Utilities/mxm_assert.h"
gmehmet 1:f60eafbf009a 38 #include "flc.h"
gmehmet 1:f60eafbf009a 39 #include "flc_regs.h"
gmehmet 1:f60eafbf009a 40 #include "Peripherals.h"
gmehmet 1:f60eafbf009a 41 #include "utils.h"
gmehmet 1:f60eafbf009a 42 #include "CRC8.h"
gmehmet 1:f60eafbf009a 43
gmehmet 1:f60eafbf009a 44
gmehmet 1:f60eafbf009a 45 #include "BLE_ICARUS.h"
gmehmet 1:f60eafbf009a 46
gmehmet 1:f60eafbf009a 47
gmehmet 1:f60eafbf009a 48
gmehmet 1:f60eafbf009a 49
gmehmet 1:f60eafbf009a 50 // By default, host accel is enabled
gmehmet 1:f60eafbf009a 51
gmehmet 1:f60eafbf009a 52 //#define FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 53
gmehmet 1:f60eafbf009a 54 #define MAX_NUM_WR_ACC_SAMPLES 5
gmehmet 1:f60eafbf009a 55 #define BMI160_SAMPLE_RATE 25
gmehmet 1:f60eafbf009a 56
gmehmet 1:f60eafbf009a 57 static const char* const cmd_tbl[] = {
gmehmet 1:f60eafbf009a 58 "get_format ppg 0",
gmehmet 1:f60eafbf009a 59 "read ppg 0", // moved here to match parser index "3"
gmehmet 1:f60eafbf009a 60 "get_reg ppg",
gmehmet 1:f60eafbf009a 61 "set_reg ppg",
gmehmet 1:f60eafbf009a 62 "dump_reg ppg",
gmehmet 1:f60eafbf009a 63 "set_cfg ppg agc 0",
gmehmet 1:f60eafbf009a 64 "set_cfg ppg agc 1",
gmehmet 1:f60eafbf009a 65 "self_test ppg os58",
gmehmet 1:f60eafbf009a 66 "self_test ppg acc",
gmehmet 1:f60eafbf009a 67 "set_cfg whrmaecscd aecenable",
gmehmet 1:f60eafbf009a 68 "get_cfg whrmaecscd aecenable",
gmehmet 1:f60eafbf009a 69 "set_cfg whrmaecscd scdenable",
gmehmet 1:f60eafbf009a 70 "get_cfg whrmaecscd scdenable",
gmehmet 1:f60eafbf009a 71 "set_cfg whrmaecscd adjpdperiod",
gmehmet 1:f60eafbf009a 72 "get_cfg whrmaecscd adjpdperiod",
gmehmet 1:f60eafbf009a 73 "set_cfg whrmaecscd debouncewin",
gmehmet 1:f60eafbf009a 74 "get_cfg whrmaecscd debouncewin",
gmehmet 1:f60eafbf009a 75 "set_cfg whrmaecscd motionthreshold",
gmehmet 1:f60eafbf009a 76 "get_cfg whrmaecscd motionthreshold",
gmehmet 1:f60eafbf009a 77 "set_cfg whrmaecscd minpdcurrent",
gmehmet 1:f60eafbf009a 78 "get_cfg whrmaecscd minpdcurrent",
gmehmet 1:f60eafbf009a 79 "set_cfg whrmaecscd pdconfig",
gmehmet 1:f60eafbf009a 80 "get_cfg whrmaecscd pdconfig",
gmehmet 1:f60eafbf009a 81 "set_cfg whrmaecscd ledconfig",
gmehmet 1:f60eafbf009a 82 "get_cfg whrmaecscd ledconfig",
gmehmet 1:f60eafbf009a 83 "send_raw", // write raw data to I2C (Slave address will be perpended)
gmehmet 1:f60eafbf009a 84 "set_cfg accel_sh 0", // disables sensorhub accel, host accel is used
gmehmet 1:f60eafbf009a 85 "set_cfg accel_sh 1", // enables sensorhub accel, host accel is not used
gmehmet 1:f60eafbf009a 86 "set_cfg whrm conf_level", //sets the conf level coming from the GUI inside the internal flash
gmehmet 1:f60eafbf009a 87 "set_cfg whrm hr_expiration", ////sets the expiration dfuration coming from the GUI inside the internal flash
gmehmet 1:f60eafbf009a 88
gmehmet 1:f60eafbf009a 89 };
gmehmet 1:f60eafbf009a 90
gmehmet 1:f60eafbf009a 91 SSMAX8614XComm::SSMAX8614XComm(USBSerial *USB, SSInterface* ssInterface, DSInterface* dsInterface)
gmehmet 1:f60eafbf009a 92 :SensorComm("ppg", true), m_USB(USB), ss_int(ssInterface), ds_int(dsInterface), agc_enabled(true)
gmehmet 1:f60eafbf009a 93 {
gmehmet 1:f60eafbf009a 94 max8614x_mode1_data_req.data_size = SSMAX8614X_MODE1_DATASIZE;
gmehmet 1:f60eafbf009a 95 max8614x_mode1_data_req.callback = callback(this, &SSMAX8614XComm::max8614x_data_rx);
gmehmet 1:f60eafbf009a 96
gmehmet 1:f60eafbf009a 97 whrm_mode1_data_req.data_size = SSWHRM_MODE1_DATASIZE;
gmehmet 1:f60eafbf009a 98 whrm_mode1_data_req.callback = callback(this, &SSMAX8614XComm::whrm_data_rx_mode1);
gmehmet 1:f60eafbf009a 99
gmehmet 1:f60eafbf009a 100 whrm_mode2_data_req.data_size = SSWHRM_MODEX_DATASIZE;
gmehmet 1:f60eafbf009a 101 whrm_mode2_data_req.callback = callback(this, &SSMAX8614XComm::whrm_data_rx_mode2);
gmehmet 1:f60eafbf009a 102
gmehmet 1:f60eafbf009a 103 accel_mode1_data_req.data_size = SSACCEL_MODE1_DATASIZE;
gmehmet 1:f60eafbf009a 104 accel_mode1_data_req.callback = callback(this, &SSMAX8614XComm::accel_data_rx);
gmehmet 1:f60eafbf009a 105
gmehmet 1:f60eafbf009a 106 agc_mode1_data_req.data_size = SSAGC_MODE1_DATASIZE;
gmehmet 1:f60eafbf009a 107 agc_mode1_data_req.callback = callback(this, &SSMAX8614XComm::agc_data_rx);
gmehmet 1:f60eafbf009a 108
gmehmet 1:f60eafbf009a 109 queue_init(&max8614x_queue, max8614x_queue_buf, sizeof(max8614x_mode1_data), sizeof(max8614x_queue_buf));
gmehmet 1:f60eafbf009a 110 queue_init(&whrm_queue, whrm_queue_buf, sizeof(whrm_modeX_data), sizeof(whrm_queue_buf));
gmehmet 1:f60eafbf009a 111
gmehmet 1:f60eafbf009a 112 queue_init(&accel_output_queue, accel_output_queue_buf, sizeof(accel_mode1_data), sizeof(accel_output_queue_buf));
gmehmet 1:f60eafbf009a 113 queue_init(&accel_input_queue, accel_input_queue_buf, sizeof(accel_mode1_data), sizeof(accel_input_queue_buf));
gmehmet 1:f60eafbf009a 114
gmehmet 1:f60eafbf009a 115
gmehmet 1:f60eafbf009a 116 sensor_algo_en_dis_.sensorhub_accel = 1; // enable sensor hub accel by default
gmehmet 1:f60eafbf009a 117
gmehmet 1:f60eafbf009a 118 m_bmi160 = 0;
gmehmet 1:f60eafbf009a 119
gmehmet 1:f60eafbf009a 120 input_fifo_size = 0;
gmehmet 1:f60eafbf009a 121 sensor_data_from_host = false;
gmehmet 1:f60eafbf009a 122 }
gmehmet 1:f60eafbf009a 123
gmehmet 1:f60eafbf009a 124 void SSMAX8614XComm::stop()
gmehmet 1:f60eafbf009a 125 {
gmehmet 1:f60eafbf009a 126 status_algo_sensors_st sensor_algo_en_dis_temp;
gmehmet 1:f60eafbf009a 127 comm_mutex.lock();
gmehmet 1:f60eafbf009a 128 ss_int->disable_irq();
gmehmet 1:f60eafbf009a 129 data_report_mode = 0;
gmehmet 1:f60eafbf009a 130 sample_count = 0;
gmehmet 1:f60eafbf009a 131
gmehmet 1:f60eafbf009a 132 if (sensor_algo_en_dis_.max8614x_enabled) {
gmehmet 1:f60eafbf009a 133 ss_int->disable_sensor(SS_SENSORIDX_MAX86140);
gmehmet 1:f60eafbf009a 134 queue_reset(&max8614x_queue);
gmehmet 1:f60eafbf009a 135 }
gmehmet 1:f60eafbf009a 136
gmehmet 1:f60eafbf009a 137 if (sensor_algo_en_dis_.accel_enabled) {
gmehmet 1:f60eafbf009a 138 ss_int->disable_sensor(SS_SENSORIDX_ACCEL);
gmehmet 1:f60eafbf009a 139 queue_reset(&accel_output_queue);
gmehmet 1:f60eafbf009a 140 }
gmehmet 1:f60eafbf009a 141
gmehmet 1:f60eafbf009a 142 if (sensor_algo_en_dis_.whrm_enabled) {
gmehmet 1:f60eafbf009a 143 ss_int->disable_algo(SS_ALGOIDX_WHRM);
gmehmet 1:f60eafbf009a 144 queue_reset(&whrm_queue);
gmehmet 1:f60eafbf009a 145 }
gmehmet 1:f60eafbf009a 146
gmehmet 1:f60eafbf009a 147 // store a copy of settings
gmehmet 1:f60eafbf009a 148 sensor_algo_en_dis_temp.status_vals = sensor_algo_en_dis_.status_vals;
gmehmet 1:f60eafbf009a 149 // clear all settings
gmehmet 1:f60eafbf009a 150 sensor_algo_en_dis_.status_vals = 0;
gmehmet 1:f60eafbf009a 151 //recover settings that need to be maintained
gmehmet 1:f60eafbf009a 152 sensor_algo_en_dis_.sensorhub_accel = sensor_algo_en_dis_temp.sensorhub_accel;
gmehmet 1:f60eafbf009a 153 ss_int->ss_clear_interrupt_flag();
gmehmet 1:f60eafbf009a 154 ss_int->enable_irq();
gmehmet 1:f60eafbf009a 155
gmehmet 1:f60eafbf009a 156 if(sensor_algo_en_dis_.sensorhub_accel==0){
gmehmet 1:f60eafbf009a 157 m_bmi160->reset();
gmehmet 1:f60eafbf009a 158 queue_reset(&accel_input_queue);
gmehmet 1:f60eafbf009a 159 }
gmehmet 1:f60eafbf009a 160
gmehmet 1:f60eafbf009a 161
gmehmet 1:f60eafbf009a 162 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 163 input_fifo_size = 0;
gmehmet 1:f60eafbf009a 164 sensor_data_from_host = false;
gmehmet 1:f60eafbf009a 165 }
gmehmet 1:f60eafbf009a 166
gmehmet 1:f60eafbf009a 167 int SSMAX8614XComm::parse_cal_str(const char *ptr_ch, const char *cmd, uint8_t *cal_data, int cal_data_sz)
gmehmet 1:f60eafbf009a 168 {
gmehmet 1:f60eafbf009a 169 char ascii_byte[] = { 0, 0, 0 };
gmehmet 1:f60eafbf009a 170 const char* sptr = ptr_ch + strlen(cmd);
gmehmet 1:f60eafbf009a 171 int found = 0;
gmehmet 1:f60eafbf009a 172 int ssfound;
gmehmet 1:f60eafbf009a 173 unsigned int val32;
gmehmet 1:f60eafbf009a 174
gmehmet 1:f60eafbf009a 175 //Eat spaces after cmd
gmehmet 1:f60eafbf009a 176 while (*sptr != ' ' && *sptr != '\0') { sptr++; }
gmehmet 1:f60eafbf009a 177 if (*sptr == '\0')
gmehmet 1:f60eafbf009a 178 return -1;
gmehmet 1:f60eafbf009a 179 sptr++;
gmehmet 1:f60eafbf009a 180
gmehmet 1:f60eafbf009a 181 while (found < cal_data_sz) {
gmehmet 1:f60eafbf009a 182 if (*sptr == '\0')
gmehmet 1:f60eafbf009a 183 break;
gmehmet 1:f60eafbf009a 184 ascii_byte[0] = *sptr++;
gmehmet 1:f60eafbf009a 185 ascii_byte[1] = *sptr++;
gmehmet 1:f60eafbf009a 186 ssfound = sscanf(ascii_byte, "%x", &val32);
gmehmet 1:f60eafbf009a 187 if (ssfound != 1)
gmehmet 1:f60eafbf009a 188 break;
gmehmet 1:f60eafbf009a 189 *(cal_data + found) = (uint8_t)val32;
gmehmet 1:f60eafbf009a 190 //pr_err("cal_data[%d]=%d\r\n", found, val32);
gmehmet 1:f60eafbf009a 191 found++;
gmehmet 1:f60eafbf009a 192 }
gmehmet 1:f60eafbf009a 193
gmehmet 1:f60eafbf009a 194 //pr_err("total found: %d\r\n", found);
gmehmet 1:f60eafbf009a 195 if (found < cal_data_sz)
gmehmet 1:f60eafbf009a 196 return -1;
gmehmet 1:f60eafbf009a 197 return 0;
gmehmet 1:f60eafbf009a 198 }
gmehmet 1:f60eafbf009a 199
gmehmet 1:f60eafbf009a 200 int SSMAX8614XComm::parse_str(const char *ptr_ch, const char *cmd, uint8_t *data, int data_sz)
gmehmet 1:f60eafbf009a 201 {
gmehmet 1:f60eafbf009a 202 char ascii_byte[] = { 0, 0, 0 };
gmehmet 1:f60eafbf009a 203 const char* sptr = ptr_ch + strlen(cmd);
gmehmet 1:f60eafbf009a 204 int found = 0;
gmehmet 1:f60eafbf009a 205 int ssfound;
gmehmet 1:f60eafbf009a 206 unsigned int val32;
gmehmet 1:f60eafbf009a 207
gmehmet 1:f60eafbf009a 208 //Eat spaces after cmd
gmehmet 1:f60eafbf009a 209 while (*sptr != ' ' && *sptr != '\0') { sptr++; }
gmehmet 1:f60eafbf009a 210 if (*sptr == '\0')
gmehmet 1:f60eafbf009a 211 return -1;
gmehmet 1:f60eafbf009a 212 sptr++;
gmehmet 1:f60eafbf009a 213
gmehmet 1:f60eafbf009a 214 while (found < data_sz) {
gmehmet 1:f60eafbf009a 215 if (*sptr == '\0')
gmehmet 1:f60eafbf009a 216 break;
gmehmet 1:f60eafbf009a 217 ascii_byte[0] = *sptr++;
gmehmet 1:f60eafbf009a 218 ascii_byte[1] = *sptr++;
gmehmet 1:f60eafbf009a 219 ssfound = sscanf(ascii_byte, "%x", &val32);
gmehmet 1:f60eafbf009a 220 if (ssfound != 1)
gmehmet 1:f60eafbf009a 221 return -1;
gmehmet 1:f60eafbf009a 222 *(data + found) = (uint8_t)val32;
gmehmet 1:f60eafbf009a 223 pr_err("cal_data[%d]=%d\r\n", found, val32);
gmehmet 1:f60eafbf009a 224 found++;
gmehmet 1:f60eafbf009a 225 }
gmehmet 1:f60eafbf009a 226
gmehmet 1:f60eafbf009a 227 pr_err("total found: %d\r\n", found);
gmehmet 1:f60eafbf009a 228 return found;
gmehmet 1:f60eafbf009a 229 }
gmehmet 1:f60eafbf009a 230
gmehmet 1:f60eafbf009a 231
gmehmet 1:f60eafbf009a 232 void SSMAX8614XComm::setBMI160(BMI160_I2C *pbmi160)
gmehmet 1:f60eafbf009a 233 {
gmehmet 1:f60eafbf009a 234 if (pbmi160) {
gmehmet 1:f60eafbf009a 235 m_bmi160 = pbmi160;
gmehmet 1:f60eafbf009a 236 m_bmi160->reset();
gmehmet 1:f60eafbf009a 237 }
gmehmet 1:f60eafbf009a 238 }
gmehmet 1:f60eafbf009a 239
gmehmet 1:f60eafbf009a 240
gmehmet 1:f60eafbf009a 241 int SSMAX8614XComm::get_sensor_xyz(accel_data_t &accel_data) {
gmehmet 1:f60eafbf009a 242 int ret = 0;
gmehmet 1:f60eafbf009a 243 if(sensor_algo_en_dis_.sensorhub_accel==0){
gmehmet 1:f60eafbf009a 244 BMI160::SensorData stacc_data = {0};
gmehmet 1:f60eafbf009a 245 if (m_bmi160) {
gmehmet 1:f60eafbf009a 246 ret = m_bmi160->getSensorXYZ(stacc_data, BMI160::SENS_2G);
gmehmet 1:f60eafbf009a 247 if (ret < 0)
gmehmet 1:f60eafbf009a 248 return ret;
gmehmet 1:f60eafbf009a 249 }
gmehmet 1:f60eafbf009a 250
gmehmet 1:f60eafbf009a 251 accel_data.x = stacc_data.xAxis.scaled;
gmehmet 1:f60eafbf009a 252 accel_data.y = stacc_data.yAxis.scaled;
gmehmet 1:f60eafbf009a 253 accel_data.z = stacc_data.zAxis.scaled;
gmehmet 1:f60eafbf009a 254
gmehmet 1:f60eafbf009a 255 accel_data.x_raw = stacc_data.xAxis.raw;
gmehmet 1:f60eafbf009a 256 accel_data.y_raw = stacc_data.yAxis.raw;
gmehmet 1:f60eafbf009a 257 accel_data.z_raw = stacc_data.zAxis.raw;
gmehmet 1:f60eafbf009a 258
gmehmet 1:f60eafbf009a 259 }
gmehmet 1:f60eafbf009a 260
gmehmet 1:f60eafbf009a 261 return ret;
gmehmet 1:f60eafbf009a 262 }
gmehmet 1:f60eafbf009a 263
gmehmet 1:f60eafbf009a 264 bool SSMAX8614XComm::parse_command(const char* cmd)
gmehmet 1:f60eafbf009a 265 {
gmehmet 1:f60eafbf009a 266 int ret;
gmehmet 1:f60eafbf009a 267 SS_STATUS status;
gmehmet 1:f60eafbf009a 268 bool recognizedCmd = false;
gmehmet 1:f60eafbf009a 269 int data_len = 0;
gmehmet 1:f60eafbf009a 270 char charbuf[768];
gmehmet 1:f60eafbf009a 271 addr_val_pair reg_vals[64];
gmehmet 1:f60eafbf009a 272
gmehmet 1:f60eafbf009a 273 if (!ss_int) {
gmehmet 1:f60eafbf009a 274 pr_err("No SmartSensor Interface defined!");
gmehmet 1:f60eafbf009a 275 return false;
gmehmet 1:f60eafbf009a 276 }
gmehmet 1:f60eafbf009a 277 if (!ds_int) {
gmehmet 1:f60eafbf009a 278 pr_err("No DeviceStudio Interface defined!");
gmehmet 1:f60eafbf009a 279 return false;
gmehmet 1:f60eafbf009a 280 }
gmehmet 1:f60eafbf009a 281
gmehmet 1:f60eafbf009a 282 for (int i = 0; i < NUM_CMDS; i++) {
gmehmet 1:f60eafbf009a 283 if (starts_with(cmd, cmd_tbl[i])) {
gmehmet 1:f60eafbf009a 284 cmd_state_t user_cmd = (cmd_state_t)i;
gmehmet 1:f60eafbf009a 285 recognizedCmd = true;
gmehmet 1:f60eafbf009a 286
gmehmet 1:f60eafbf009a 287 switch (user_cmd) {
gmehmet 1:f60eafbf009a 288 case set_cfg_accel_sh_dis:
gmehmet 1:f60eafbf009a 289 {
gmehmet 1:f60eafbf009a 290 sensor_algo_en_dis_.sensorhub_accel = 0;
gmehmet 1:f60eafbf009a 291 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 292
gmehmet 1:f60eafbf009a 293 } break;
gmehmet 1:f60eafbf009a 294 case set_cfg_accel_sh_en:
gmehmet 1:f60eafbf009a 295 {
gmehmet 1:f60eafbf009a 296 sensor_algo_en_dis_.sensorhub_accel = 1;
gmehmet 1:f60eafbf009a 297 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 298
gmehmet 1:f60eafbf009a 299 } break;
gmehmet 1:f60eafbf009a 300 case set_cfg_ppg_conf_level:
gmehmet 1:f60eafbf009a 301 {
gmehmet 1:f60eafbf009a 302 int j=24;
gmehmet 1:f60eafbf009a 303 char temp_buf[4];
gmehmet 1:f60eafbf009a 304 uint32_t PpgConfLevel[2];
gmehmet 1:f60eafbf009a 305 while(cmd[j]!='\0'){
gmehmet 1:f60eafbf009a 306 temp_buf[j-24] = cmd[j];
gmehmet 1:f60eafbf009a 307 j++;
gmehmet 1:f60eafbf009a 308 }
gmehmet 1:f60eafbf009a 309 temp_buf[j-24]='\0';
gmehmet 1:f60eafbf009a 310 sscanf(temp_buf,"%u",&PpgConfLevel[0]);
gmehmet 1:f60eafbf009a 311
gmehmet 1:f60eafbf009a 312 PpgConfLevel[1] = (*(uint32_t *)PPG_EXPIRE_DURATION_FLASH_ADDRESS);
gmehmet 1:f60eafbf009a 313
gmehmet 1:f60eafbf009a 314 if(FLC_Init()!=0){
gmehmet 1:f60eafbf009a 315 m_USB->printf("\r\n%s err=Initializing flash\r\n", cmd);
gmehmet 1:f60eafbf009a 316 break;
gmehmet 1:f60eafbf009a 317 }
gmehmet 1:f60eafbf009a 318 if( FLC_PageErase(PPG_CONF_LEVEL_FLASH_ADDRESS, MXC_V_FLC_ERASE_CODE_PAGE_ERASE, MXC_V_FLC_FLSH_UNLOCK_KEY)!=0 ){
gmehmet 1:f60eafbf009a 319 m_USB->printf("\r\n%s err=Erasing page\r\n", cmd);
gmehmet 1:f60eafbf009a 320 break;
gmehmet 1:f60eafbf009a 321 }
gmehmet 1:f60eafbf009a 322 if(FLC_Write(PPG_CONF_LEVEL_FLASH_ADDRESS,PpgConfLevel,sizeof(PpgConfLevel),MXC_V_FLC_FLSH_UNLOCK_KEY)!=0){
gmehmet 1:f60eafbf009a 323 m_USB->printf("\r\n%s err=Writing flash\r\n", cmd);
gmehmet 1:f60eafbf009a 324 break;
gmehmet 1:f60eafbf009a 325 }
gmehmet 1:f60eafbf009a 326 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 327
gmehmet 1:f60eafbf009a 328 } break;
gmehmet 1:f60eafbf009a 329 case set_cfg_ppg_expire_duration:
gmehmet 1:f60eafbf009a 330 {
gmehmet 1:f60eafbf009a 331 int j=27;
gmehmet 1:f60eafbf009a 332 char temp_buf[4];
gmehmet 1:f60eafbf009a 333 uint32_t PpgExpireDuration[2];
gmehmet 1:f60eafbf009a 334 while(cmd[j]!='\0'){
gmehmet 1:f60eafbf009a 335 temp_buf[j-27] = cmd[j];
gmehmet 1:f60eafbf009a 336 j++;
gmehmet 1:f60eafbf009a 337 }
gmehmet 1:f60eafbf009a 338 temp_buf[j-27]='\0';
gmehmet 1:f60eafbf009a 339 sscanf(temp_buf,"%u",&PpgExpireDuration[1]);
gmehmet 1:f60eafbf009a 340
gmehmet 1:f60eafbf009a 341 PpgExpireDuration[0] = (*(uint32_t *)PPG_CONF_LEVEL_FLASH_ADDRESS);
gmehmet 1:f60eafbf009a 342
gmehmet 1:f60eafbf009a 343 if(FLC_Init()!=0){
gmehmet 1:f60eafbf009a 344 m_USB->printf("\r\n%s err=Initializing flash\r\n", cmd);
gmehmet 1:f60eafbf009a 345 break;
gmehmet 1:f60eafbf009a 346 }
gmehmet 1:f60eafbf009a 347 if( FLC_PageErase(PPG_EXPIRE_DURATION_FLASH_ADDRESS, MXC_V_FLC_ERASE_CODE_PAGE_ERASE, MXC_V_FLC_FLSH_UNLOCK_KEY)!=0 ){
gmehmet 1:f60eafbf009a 348 m_USB->printf("\r\n%s err=Erasing page\r\n", cmd);
gmehmet 1:f60eafbf009a 349 break;
gmehmet 1:f60eafbf009a 350 }
gmehmet 1:f60eafbf009a 351 if(FLC_Write(PPG_CONF_LEVEL_FLASH_ADDRESS,PpgExpireDuration,sizeof(PpgExpireDuration),MXC_V_FLC_FLSH_UNLOCK_KEY)!=0){
gmehmet 1:f60eafbf009a 352 m_USB->printf("\r\n%s err=Writing flash\r\n", cmd);
gmehmet 1:f60eafbf009a 353 break;
gmehmet 1:f60eafbf009a 354 }
gmehmet 1:f60eafbf009a 355 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 356
gmehmet 1:f60eafbf009a 357 } break;
gmehmet 1:f60eafbf009a 358 case get_format_ppg_0:
gmehmet 1:f60eafbf009a 359 {
gmehmet 1:f60eafbf009a 360 if(AsciiEn)
gmehmet 1:f60eafbf009a 361 {
gmehmet 1:f60eafbf009a 362 if (ds_int->algo_report_mode == 1){
gmehmet 1:f60eafbf009a 363 m_USB->printf("\r\n%s format=smpleCnt,grnCnt,led2,led3,grn2Cnt,led5,led6,"
gmehmet 1:f60eafbf009a 364 "accelX,accelY,accelZ,hr,hrconf,r,activity err=0\r\n", cmd);
gmehmet 1:f60eafbf009a 365 }
gmehmet 1:f60eafbf009a 366 else { // report mode 2
gmehmet 1:f60eafbf009a 367 m_USB->printf("\r\n%s format=smpleCnt,grnCnt,led2,led3,grn2Cnt,led5,led6,"
gmehmet 1:f60eafbf009a 368 "accelX,accelY,accelZ,hr,hrconf,r,rconf,activity,walkSteps,runSteps,"
gmehmet 1:f60eafbf009a 369 "energyKcal,stepCadence,isLedCurrentAdj,adjLedCurrent,isTAdj,adjT,isFAdj,"
gmehmet 1:f60eafbf009a 370 "adjF,aecSmpAve,aecState,isAECMotion,scdStatus err=0\r\n", cmd);
gmehmet 1:f60eafbf009a 371 }
gmehmet 1:f60eafbf009a 372 }
gmehmet 1:f60eafbf009a 373 else{
gmehmet 1:f60eafbf009a 374 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s enc=bin cs=1 format={smpleCnt,16},"
gmehmet 1:f60eafbf009a 375 "{grnCnt,20},{grn2Cnt,20},{accelX,14,3},{accelY,14,3},"
gmehmet 1:f60eafbf009a 376 "{accelZ,14,3},{hr,12},{hrconf,8},{r,11,1},{activity,8} err=0\r\n", cmd);
gmehmet 1:f60eafbf009a 377 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 378 }
gmehmet 1:f60eafbf009a 379 } break;
gmehmet 1:f60eafbf009a 380
gmehmet 1:f60eafbf009a 381 case read_ppg_0:
gmehmet 1:f60eafbf009a 382 {
gmehmet 1:f60eafbf009a 383 sample_count = 0;
gmehmet 1:f60eafbf009a 384
gmehmet 1:f60eafbf009a 385 status = ss_int->get_input_fifo_size(&input_fifo_size);
gmehmet 1:f60eafbf009a 386 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 387 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 388 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 389 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 390 "FAILED at line %d\n", __LINE__);
gmehmet 1:f60eafbf009a 391 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 392 break;
gmehmet 1:f60eafbf009a 393 }
gmehmet 1:f60eafbf009a 394
gmehmet 1:f60eafbf009a 395 status = ss_int->set_data_type(SS_DATATYPE_BOTH, false);
gmehmet 1:f60eafbf009a 396 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 397 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 398 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 399 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 400 "FAILED at line %d, set DATA_TYPE\n, ", __LINE__);
gmehmet 1:f60eafbf009a 401 #ifdef FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 402 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 403 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 404 "\r\nReset!\r\n");
gmehmet 1:f60eafbf009a 405 #endif
gmehmet 1:f60eafbf009a 406 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 407 break;
gmehmet 1:f60eafbf009a 408 }
gmehmet 1:f60eafbf009a 409
gmehmet 1:f60eafbf009a 410 status = ss_int->set_fifo_thresh(5);
gmehmet 1:f60eafbf009a 411 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 412 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 413 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 414 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 415 "FAILED at line %d, set thresh\n", __LINE__);
gmehmet 1:f60eafbf009a 416 #ifdef FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 417 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 418 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 419 "\r\nReset!\r\n");
gmehmet 1:f60eafbf009a 420 #endif
gmehmet 1:f60eafbf009a 421 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 422 break;
gmehmet 1:f60eafbf009a 423 }
gmehmet 1:f60eafbf009a 424
gmehmet 1:f60eafbf009a 425
gmehmet 1:f60eafbf009a 426 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 427 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 428 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 429 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 430 "FAILED at line %d - agc_enabled: %d\n", __LINE__, agc_enabled);
gmehmet 1:f60eafbf009a 431 ss_int->enable_irq();
gmehmet 1:f60eafbf009a 432
gmehmet 1:f60eafbf009a 433 #ifdef FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 434 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 435 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 436 "\r\nReset!\r\n");
gmehmet 1:f60eafbf009a 437 #endif
gmehmet 1:f60eafbf009a 438 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 439 break;
gmehmet 1:f60eafbf009a 440 }
gmehmet 1:f60eafbf009a 441
gmehmet 1:f60eafbf009a 442 ss_int->disable_irq();
gmehmet 1:f60eafbf009a 443
gmehmet 1:f60eafbf009a 444 status = ss_int->enable_sensor(SS_SENSORIDX_MAX86140, 1, &max8614x_mode1_data_req);
gmehmet 1:f60eafbf009a 445 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 446 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 447 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 448 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 449 "FAILED at line %d, enable max86140\n", __LINE__);
gmehmet 1:f60eafbf009a 450 ss_int->enable_irq();
gmehmet 1:f60eafbf009a 451 #ifdef FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 452 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 453 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 454 "\r\nReset!\r\n");
gmehmet 1:f60eafbf009a 455 #endif
gmehmet 1:f60eafbf009a 456 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 457 break;
gmehmet 1:f60eafbf009a 458 }
gmehmet 1:f60eafbf009a 459 sensor_algo_en_dis_.max8614x_enabled = 1;
gmehmet 1:f60eafbf009a 460
gmehmet 1:f60eafbf009a 461
gmehmet 1:f60eafbf009a 462
gmehmet 1:f60eafbf009a 463 if (sensor_algo_en_dis_.sensorhub_accel) {
gmehmet 1:f60eafbf009a 464 status = ss_int->enable_sensor(SS_SENSORIDX_ACCEL, 1, &accel_mode1_data_req, SH_INPUT_DATA_DIRECT_SENSOR);
gmehmet 1:f60eafbf009a 465 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 466 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 467 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 468 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 469 "FAILED at line %d\n", __LINE__);
gmehmet 1:f60eafbf009a 470 ss_int->enable_irq();
gmehmet 1:f60eafbf009a 471 #ifdef FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 472 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 473 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 474 "\r\nReset!\r\n");
gmehmet 1:f60eafbf009a 475 #endif
gmehmet 1:f60eafbf009a 476 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 477 break;
gmehmet 1:f60eafbf009a 478 }
gmehmet 1:f60eafbf009a 479 sensor_algo_en_dis_.accel_enabled = 1;
gmehmet 1:f60eafbf009a 480 }
gmehmet 1:f60eafbf009a 481 else {
gmehmet 1:f60eafbf009a 482 m_bmi160->BMI160_DefaultInitalize();
gmehmet 1:f60eafbf009a 483 if (m_bmi160->setSampleRate(BMI160_SAMPLE_RATE) != 0) {
gmehmet 1:f60eafbf009a 484 pr_err("Unable to set BMI160's sample rate\n");
gmehmet 1:f60eafbf009a 485 data_len = snprintf(charbuf , sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 486 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 487 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 488 "FAILED at line %d\n", __LINE__);
gmehmet 1:f60eafbf009a 489 ss_int->enable_irq();
gmehmet 1:f60eafbf009a 490 #ifdef FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 491 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 492 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 493 "\r\nReset!\r\n");
gmehmet 1:f60eafbf009a 494 #endif
gmehmet 1:f60eafbf009a 495 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 496 break;
gmehmet 1:f60eafbf009a 497 }
gmehmet 1:f60eafbf009a 498
gmehmet 1:f60eafbf009a 499 ret = m_bmi160->enable_data_ready_interrupt();
gmehmet 1:f60eafbf009a 500 if(ret != E_SUCCESS){
gmehmet 1:f60eafbf009a 501 pr_err("Unable to enable BMI160 Interrupt, ret: %d\n", ret);
gmehmet 1:f60eafbf009a 502 break;
gmehmet 1:f60eafbf009a 503 }
gmehmet 1:f60eafbf009a 504
gmehmet 1:f60eafbf009a 505
gmehmet 1:f60eafbf009a 506
gmehmet 1:f60eafbf009a 507 status = ss_int->enable_sensor(SS_SENSORIDX_ACCEL, 1, &accel_mode1_data_req, SH_INPUT_DATA_FROM_HOST);
gmehmet 1:f60eafbf009a 508 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 509 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 510 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 511 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 512 "FAILED at line %d\n", __LINE__);
gmehmet 1:f60eafbf009a 513 ss_int->enable_irq();
gmehmet 1:f60eafbf009a 514 #ifdef FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 515 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 516 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 517 "\r\nReset!\r\n");
gmehmet 1:f60eafbf009a 518 #endif
gmehmet 1:f60eafbf009a 519 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 520 break;
gmehmet 1:f60eafbf009a 521 }
gmehmet 1:f60eafbf009a 522 sensor_data_from_host = true;
gmehmet 1:f60eafbf009a 523 sensor_algo_en_dis_.accel_enabled = 1;
gmehmet 1:f60eafbf009a 524 }
gmehmet 1:f60eafbf009a 525
gmehmet 1:f60eafbf009a 526
gmehmet 1:f60eafbf009a 527 if (ds_int->algo_report_mode == 2)
gmehmet 1:f60eafbf009a 528 status = ss_int->enable_algo(SS_ALGOIDX_WHRM, 2, &whrm_mode2_data_req);
gmehmet 1:f60eafbf009a 529 else // default is mode 1
gmehmet 1:f60eafbf009a 530 status = ss_int->enable_algo(SS_ALGOIDX_WHRM, 1, &whrm_mode1_data_req);
gmehmet 1:f60eafbf009a 531 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 532 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 533 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 534 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 535 "FAILED at line %d, enable whrm\n", __LINE__);
gmehmet 1:f60eafbf009a 536 ss_int->enable_irq();
gmehmet 1:f60eafbf009a 537 #ifdef FORCE_RESET_WHEN_FAILED
gmehmet 1:f60eafbf009a 538 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 539 data_len += snprintf(charbuf+data_len, sizeof(charbuf)- data_len - 1,
gmehmet 1:f60eafbf009a 540 "\r\nReset!\r\n");
gmehmet 1:f60eafbf009a 541 #endif
gmehmet 1:f60eafbf009a 542 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 543 break;
gmehmet 1:f60eafbf009a 544 }
gmehmet 1:f60eafbf009a 545 sensor_algo_en_dis_.whrm_enabled = 1;
gmehmet 1:f60eafbf009a 546
gmehmet 1:f60eafbf009a 547
gmehmet 1:f60eafbf009a 548 comm_mutex.lock();
gmehmet 1:f60eafbf009a 549 data_report_mode = read_ppg_0;
gmehmet 1:f60eafbf009a 550 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 551 data_len = snprintf(charbuf, sizeof(charbuf) - 1,
gmehmet 1:f60eafbf009a 552 "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 553 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 554 ss_int->enable_irq();
gmehmet 1:f60eafbf009a 555 } break;
gmehmet 1:f60eafbf009a 556
gmehmet 1:f60eafbf009a 557 case get_reg_ppg:
gmehmet 1:f60eafbf009a 558 {
gmehmet 1:f60eafbf009a 559 uint8_t addr;
gmehmet 1:f60eafbf009a 560 uint32_t val;
gmehmet 1:f60eafbf009a 561
gmehmet 1:f60eafbf009a 562 ret = parse_get_reg_cmd(cmd, sensor_type, &addr);
gmehmet 1:f60eafbf009a 563 if (!ret) {
gmehmet 1:f60eafbf009a 564 status = ss_int->get_reg(SS_SENSORIDX_MAX86140, addr, &val);
gmehmet 1:f60eafbf009a 565 if (status == SS_SUCCESS) {
gmehmet 1:f60eafbf009a 566 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s reg_val=%02X err=%d\r\n", cmd, (uint8_t)val, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 567 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 568 } else {
gmehmet 1:f60eafbf009a 569 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 570 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 571 }
gmehmet 1:f60eafbf009a 572 } else {
gmehmet 1:f60eafbf009a 573 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 574 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 575 }
gmehmet 1:f60eafbf009a 576
gmehmet 1:f60eafbf009a 577 } break;
gmehmet 1:f60eafbf009a 578
gmehmet 1:f60eafbf009a 579 case set_reg_ppg:
gmehmet 1:f60eafbf009a 580 {
gmehmet 1:f60eafbf009a 581 uint8_t addr;
gmehmet 1:f60eafbf009a 582 uint8_t val;
gmehmet 1:f60eafbf009a 583
gmehmet 1:f60eafbf009a 584 ret = parse_set_reg_cmd(cmd, sensor_type, &addr, &val);
gmehmet 1:f60eafbf009a 585 if (!ret) {
gmehmet 1:f60eafbf009a 586 status = ss_int->set_reg(SS_SENSORIDX_MAX86140, addr, val, SSMAX8614X_REG_SIZE);
gmehmet 1:f60eafbf009a 587 if (status == SS_SUCCESS) {
gmehmet 1:f60eafbf009a 588 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 589 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 590 } else {
gmehmet 1:f60eafbf009a 591 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 592 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 593 }
gmehmet 1:f60eafbf009a 594 } else {
gmehmet 1:f60eafbf009a 595 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 596 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 597 }
gmehmet 1:f60eafbf009a 598
gmehmet 1:f60eafbf009a 599 } break;
gmehmet 1:f60eafbf009a 600
gmehmet 1:f60eafbf009a 601 case dump_reg_ppg:
gmehmet 1:f60eafbf009a 602 {
gmehmet 1:f60eafbf009a 603 int num_regs;
gmehmet 1:f60eafbf009a 604 status = ss_int->dump_reg(SS_SENSORIDX_MAX86140, &reg_vals[0], ARRAY_SIZE(reg_vals), &num_regs);
gmehmet 1:f60eafbf009a 605 if (status == SS_SUCCESS) {
gmehmet 1:f60eafbf009a 606 bool comma = false;
gmehmet 1:f60eafbf009a 607 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, "\r\n%s reg_val=", cmd);
gmehmet 1:f60eafbf009a 608 for (int reg = 0; reg < num_regs; reg++) {
gmehmet 1:f60eafbf009a 609 if (comma) {
gmehmet 1:f60eafbf009a 610 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, ",");
gmehmet 1:f60eafbf009a 611 }
gmehmet 1:f60eafbf009a 612 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1,
gmehmet 1:f60eafbf009a 613 "{%X,%lX}", reg_vals[reg].addr, reg_vals[reg].val);
gmehmet 1:f60eafbf009a 614 comma = true;
gmehmet 1:f60eafbf009a 615 }
gmehmet 1:f60eafbf009a 616 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1, " err=%d\r\n", COMM_SUCCESS);
gmehmet 1:f60eafbf009a 617 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 618
gmehmet 1:f60eafbf009a 619 } else {
gmehmet 1:f60eafbf009a 620 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1,
gmehmet 1:f60eafbf009a 621 "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 622 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 623 }
gmehmet 1:f60eafbf009a 624
gmehmet 1:f60eafbf009a 625 } break;
gmehmet 1:f60eafbf009a 626
gmehmet 1:f60eafbf009a 627 case set_agc_en:
gmehmet 1:f60eafbf009a 628 {
gmehmet 1:f60eafbf009a 629 agc_enabled = true;
gmehmet 1:f60eafbf009a 630 status = ss_int->enable_algo(SS_ALGOIDX_AGC, 1, &agc_mode1_data_req);
gmehmet 1:f60eafbf009a 631 sensor_algo_en_dis_.agc_enabled = 1;
gmehmet 1:f60eafbf009a 632 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 633 } break;
gmehmet 1:f60eafbf009a 634
gmehmet 1:f60eafbf009a 635 case set_agc_dis:
gmehmet 1:f60eafbf009a 636 {
gmehmet 1:f60eafbf009a 637 agc_enabled = false;
gmehmet 1:f60eafbf009a 638 status = ss_int->disable_algo(SS_ALGOIDX_AGC);
gmehmet 1:f60eafbf009a 639 sensor_algo_en_dis_.agc_enabled = 0;
gmehmet 1:f60eafbf009a 640 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 641 } break;
gmehmet 1:f60eafbf009a 642
gmehmet 1:f60eafbf009a 643 case self_test_ppg_os58:
gmehmet 1:f60eafbf009a 644 {
gmehmet 1:f60eafbf009a 645 ret = selftest_max8614x();
gmehmet 1:f60eafbf009a 646 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1,
gmehmet 1:f60eafbf009a 647 "%s selftest_max8614x: err=<%d>\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 648 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 649 } break;
gmehmet 1:f60eafbf009a 650
gmehmet 1:f60eafbf009a 651 case self_test_ppg_acc:
gmehmet 1:f60eafbf009a 652 {
gmehmet 1:f60eafbf009a 653 ret = selftest_accelerometer();
gmehmet 1:f60eafbf009a 654 data_len += snprintf(charbuf + data_len, sizeof(charbuf) - data_len - 1,
gmehmet 1:f60eafbf009a 655 "%s selftest_accelerometer: err=<%d>\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 656 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 657 } break;
gmehmet 1:f60eafbf009a 658
gmehmet 1:f60eafbf009a 659 //--------- WHRM_AEC_SCD AEC ENABLE
gmehmet 1:f60eafbf009a 660 case set_cfg_whrmaecscd_aecenable:
gmehmet 1:f60eafbf009a 661 {
gmehmet 1:f60eafbf009a 662 uint8_t val[1];
gmehmet 1:f60eafbf009a 663 ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
gmehmet 1:f60eafbf009a 664 if (ret) {
gmehmet 1:f60eafbf009a 665 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 666 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 667 break;
gmehmet 1:f60eafbf009a 668 }
gmehmet 1:f60eafbf009a 669
gmehmet 1:f60eafbf009a 670 uint8_t Temp[1] = { (uint8_t)(val[0]) };
gmehmet 1:f60eafbf009a 671
gmehmet 1:f60eafbf009a 672 status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_AEC_ENABLE, &Temp[0], 1);
gmehmet 1:f60eafbf009a 673 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 674 {
gmehmet 1:f60eafbf009a 675 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 676 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 677 }
gmehmet 1:f60eafbf009a 678 else
gmehmet 1:f60eafbf009a 679 {
gmehmet 1:f60eafbf009a 680 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 681 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 682 }
gmehmet 1:f60eafbf009a 683
gmehmet 1:f60eafbf009a 684 } break;
gmehmet 1:f60eafbf009a 685
gmehmet 1:f60eafbf009a 686 case get_cfg_whrmaecscd_aecenable:
gmehmet 1:f60eafbf009a 687 {
gmehmet 1:f60eafbf009a 688 uint8_t rxBuff[1+1]; // first byte is status
gmehmet 1:f60eafbf009a 689 char outstr[2*sizeof(rxBuff)];
gmehmet 1:f60eafbf009a 690 int str_idx = 0;
gmehmet 1:f60eafbf009a 691 uint8_t *Temp = &rxBuff[1];
gmehmet 1:f60eafbf009a 692 uint8_t val[1];
gmehmet 1:f60eafbf009a 693
gmehmet 1:f60eafbf009a 694 status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_AEC_ENABLE, &rxBuff[0], sizeof(rxBuff));
gmehmet 1:f60eafbf009a 695 for (int i = 0; i < sizeof(rxBuff)-1; i++)
gmehmet 1:f60eafbf009a 696 str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
gmehmet 1:f60eafbf009a 697
gmehmet 1:f60eafbf009a 698 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 699 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 700
gmehmet 1:f60eafbf009a 701 } break;
gmehmet 1:f60eafbf009a 702
gmehmet 1:f60eafbf009a 703 //--------- WHRM_AEC_SCD SCD ENABLE
gmehmet 1:f60eafbf009a 704 case set_cfg_whrmaecscd_scdenable:
gmehmet 1:f60eafbf009a 705 {
gmehmet 1:f60eafbf009a 706 uint8_t val[1];
gmehmet 1:f60eafbf009a 707 ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
gmehmet 1:f60eafbf009a 708 if (ret) {
gmehmet 1:f60eafbf009a 709 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 710 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 711 break;
gmehmet 1:f60eafbf009a 712 }
gmehmet 1:f60eafbf009a 713
gmehmet 1:f60eafbf009a 714 uint8_t Temp[1] = { (uint8_t)(val[0]) };
gmehmet 1:f60eafbf009a 715
gmehmet 1:f60eafbf009a 716 status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_ENABLE, &Temp[0], 1);
gmehmet 1:f60eafbf009a 717 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 718 {
gmehmet 1:f60eafbf009a 719 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 720 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 721 }
gmehmet 1:f60eafbf009a 722 else
gmehmet 1:f60eafbf009a 723 {
gmehmet 1:f60eafbf009a 724 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 725 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 726 }
gmehmet 1:f60eafbf009a 727
gmehmet 1:f60eafbf009a 728 } break;
gmehmet 1:f60eafbf009a 729
gmehmet 1:f60eafbf009a 730 case get_cfg_whrmaecscd_scdenable:
gmehmet 1:f60eafbf009a 731 {
gmehmet 1:f60eafbf009a 732 uint8_t rxBuff[1+1]; // first byte is status
gmehmet 1:f60eafbf009a 733 char outstr[2*sizeof(rxBuff)];
gmehmet 1:f60eafbf009a 734 int str_idx = 0;
gmehmet 1:f60eafbf009a 735 uint8_t *Temp = &rxBuff[1];
gmehmet 1:f60eafbf009a 736 uint8_t val[1];
gmehmet 1:f60eafbf009a 737
gmehmet 1:f60eafbf009a 738 status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_ENABLE, &rxBuff[0], sizeof(rxBuff));
gmehmet 1:f60eafbf009a 739 for (int i = 0; i < sizeof(rxBuff)-1; i++)
gmehmet 1:f60eafbf009a 740 str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
gmehmet 1:f60eafbf009a 741
gmehmet 1:f60eafbf009a 742 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 743 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 744
gmehmet 1:f60eafbf009a 745 } break;
gmehmet 1:f60eafbf009a 746
gmehmet 1:f60eafbf009a 747 //--------- WHRM_AEC_SCD ADJ TARGET PD PERIOD
gmehmet 1:f60eafbf009a 748 case set_cfg_whrmaecscd_adjpdperiod:
gmehmet 1:f60eafbf009a 749 {
gmehmet 1:f60eafbf009a 750 uint16_t val[1];
gmehmet 1:f60eafbf009a 751 ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
gmehmet 1:f60eafbf009a 752 if (ret) {
gmehmet 1:f60eafbf009a 753 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 754 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 755 break;
gmehmet 1:f60eafbf009a 756 }
gmehmet 1:f60eafbf009a 757
gmehmet 1:f60eafbf009a 758 uint8_t Temp[2] = { (uint8_t)((val[0] >> (1*8)) & 0xFF), (uint8_t)((val[0] >> (0*8)) & 0xFF)};
gmehmet 1:f60eafbf009a 759
gmehmet 1:f60eafbf009a 760 status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_ADJ_TARGET_PD_CURRENT_PERIOD, &Temp[0], 2);
gmehmet 1:f60eafbf009a 761 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 762 {
gmehmet 1:f60eafbf009a 763 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 764 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 765 }
gmehmet 1:f60eafbf009a 766 else
gmehmet 1:f60eafbf009a 767 {
gmehmet 1:f60eafbf009a 768 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 769 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 770 }
gmehmet 1:f60eafbf009a 771
gmehmet 1:f60eafbf009a 772 } break;
gmehmet 1:f60eafbf009a 773
gmehmet 1:f60eafbf009a 774 case get_cfg_whrmaecscd_adjpdperiod:
gmehmet 1:f60eafbf009a 775 {
gmehmet 1:f60eafbf009a 776 uint8_t rxBuff[2+1]; // first byte is status
gmehmet 1:f60eafbf009a 777 char outstr[2*sizeof(rxBuff)];
gmehmet 1:f60eafbf009a 778 int str_idx = 0;
gmehmet 1:f60eafbf009a 779 uint8_t *Temp = &rxBuff[1];
gmehmet 1:f60eafbf009a 780 uint8_t val[1];
gmehmet 1:f60eafbf009a 781
gmehmet 1:f60eafbf009a 782 status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_ADJ_TARGET_PD_CURRENT_PERIOD, &rxBuff[0], sizeof(rxBuff));
gmehmet 1:f60eafbf009a 783 for (int i = 0; i < sizeof(rxBuff)-1; i++)
gmehmet 1:f60eafbf009a 784 str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
gmehmet 1:f60eafbf009a 785
gmehmet 1:f60eafbf009a 786 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 787 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 788
gmehmet 1:f60eafbf009a 789 } break;
gmehmet 1:f60eafbf009a 790
gmehmet 1:f60eafbf009a 791 //--------- WHRM_AEC_SCD DEBOUNCE WINDOW
gmehmet 1:f60eafbf009a 792 case set_cfg_whrmaecscd_debouncewin:
gmehmet 1:f60eafbf009a 793 {
gmehmet 1:f60eafbf009a 794 uint16_t val[1];
gmehmet 1:f60eafbf009a 795 ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
gmehmet 1:f60eafbf009a 796 if (ret) {
gmehmet 1:f60eafbf009a 797 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 798 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 799 break;
gmehmet 1:f60eafbf009a 800 }
gmehmet 1:f60eafbf009a 801
gmehmet 1:f60eafbf009a 802 uint8_t Temp[2] = { (uint8_t)((val[0] >> (1*8)) & 0xFF), (uint8_t)((val[0] >> (0*8)) & 0xFF)};
gmehmet 1:f60eafbf009a 803
gmehmet 1:f60eafbf009a 804 status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_DEBOUNCE_WINDOW, &Temp[0], 2);
gmehmet 1:f60eafbf009a 805 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 806 {
gmehmet 1:f60eafbf009a 807 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 808 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 809 }
gmehmet 1:f60eafbf009a 810 else
gmehmet 1:f60eafbf009a 811 {
gmehmet 1:f60eafbf009a 812 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 813 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 814 }
gmehmet 1:f60eafbf009a 815
gmehmet 1:f60eafbf009a 816 } break;
gmehmet 1:f60eafbf009a 817
gmehmet 1:f60eafbf009a 818 case get_cfg_whrmaecscd_debouncewin:
gmehmet 1:f60eafbf009a 819 {
gmehmet 1:f60eafbf009a 820 uint8_t rxBuff[2+1]; // first byte is status
gmehmet 1:f60eafbf009a 821 char outstr[2*sizeof(rxBuff)];
gmehmet 1:f60eafbf009a 822 int str_idx = 0;
gmehmet 1:f60eafbf009a 823 uint8_t *Temp = &rxBuff[1];
gmehmet 1:f60eafbf009a 824 uint8_t val[1];
gmehmet 1:f60eafbf009a 825
gmehmet 1:f60eafbf009a 826 status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_DEBOUNCE_WINDOW, &rxBuff[0], sizeof(rxBuff));
gmehmet 1:f60eafbf009a 827 for (int i = 0; i < sizeof(rxBuff)-1; i++)
gmehmet 1:f60eafbf009a 828 str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
gmehmet 1:f60eafbf009a 829
gmehmet 1:f60eafbf009a 830 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 831 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 832
gmehmet 1:f60eafbf009a 833 } break;
gmehmet 1:f60eafbf009a 834
gmehmet 1:f60eafbf009a 835 //--------- WHRM_AEC_SCD MOTION MAG THRESHOLD
gmehmet 1:f60eafbf009a 836 case set_cfg_whrmaecscd_motionthreshold:
gmehmet 1:f60eafbf009a 837 {
gmehmet 1:f60eafbf009a 838 uint16_t val[1];
gmehmet 1:f60eafbf009a 839 ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
gmehmet 1:f60eafbf009a 840 if (ret) {
gmehmet 1:f60eafbf009a 841 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 842 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 843 break;
gmehmet 1:f60eafbf009a 844 }
gmehmet 1:f60eafbf009a 845
gmehmet 1:f60eafbf009a 846 uint8_t Temp[2] = { (uint8_t)((val[0] >> (1*8)) & 0xFF), (uint8_t)((val[0] >> (0*8)) & 0xFF)};
gmehmet 1:f60eafbf009a 847
gmehmet 1:f60eafbf009a 848 status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MOTION_MAG_THRESHOLD, &Temp[0], 2);
gmehmet 1:f60eafbf009a 849 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 850 {
gmehmet 1:f60eafbf009a 851 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 852 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 853 }
gmehmet 1:f60eafbf009a 854 else
gmehmet 1:f60eafbf009a 855 {
gmehmet 1:f60eafbf009a 856 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 857 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 858 }
gmehmet 1:f60eafbf009a 859
gmehmet 1:f60eafbf009a 860 } break;
gmehmet 1:f60eafbf009a 861
gmehmet 1:f60eafbf009a 862 case get_cfg_whrmaecscd_motionthreshold:
gmehmet 1:f60eafbf009a 863 {
gmehmet 1:f60eafbf009a 864 uint8_t rxBuff[2+1]; // first byte is status
gmehmet 1:f60eafbf009a 865 char outstr[2*sizeof(rxBuff)];
gmehmet 1:f60eafbf009a 866 int str_idx = 0;
gmehmet 1:f60eafbf009a 867 uint8_t *Temp = &rxBuff[1];
gmehmet 1:f60eafbf009a 868 uint8_t val[1];
gmehmet 1:f60eafbf009a 869
gmehmet 1:f60eafbf009a 870 status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MOTION_MAG_THRESHOLD, &rxBuff[0], sizeof(rxBuff));
gmehmet 1:f60eafbf009a 871 for (int i = 0; i < sizeof(rxBuff)-1; i++)
gmehmet 1:f60eafbf009a 872 str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
gmehmet 1:f60eafbf009a 873
gmehmet 1:f60eafbf009a 874 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 875 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 876
gmehmet 1:f60eafbf009a 877 } break;
gmehmet 1:f60eafbf009a 878
gmehmet 1:f60eafbf009a 879 //--------- WHRM_AEC_SCD MIN PD CURRENT
gmehmet 1:f60eafbf009a 880 case set_cfg_whrmaecscd_minpdcurrent:
gmehmet 1:f60eafbf009a 881 {
gmehmet 1:f60eafbf009a 882 uint16_t val[1];
gmehmet 1:f60eafbf009a 883 ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
gmehmet 1:f60eafbf009a 884 if (ret) {
gmehmet 1:f60eafbf009a 885 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 886 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 887 break;
gmehmet 1:f60eafbf009a 888 }
gmehmet 1:f60eafbf009a 889
gmehmet 1:f60eafbf009a 890 uint8_t Temp[2] = { (uint8_t)((val[0] >> (1*8)) & 0xFF), (uint8_t)((val[0] >> (0*8)) & 0xFF)};
gmehmet 1:f60eafbf009a 891
gmehmet 1:f60eafbf009a 892 status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MIN_PD_CURRENT, &Temp[0], 2);
gmehmet 1:f60eafbf009a 893 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 894 {
gmehmet 1:f60eafbf009a 895 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 896 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 897 }
gmehmet 1:f60eafbf009a 898 else
gmehmet 1:f60eafbf009a 899 {
gmehmet 1:f60eafbf009a 900 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 901 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 902 }
gmehmet 1:f60eafbf009a 903
gmehmet 1:f60eafbf009a 904 } break;
gmehmet 1:f60eafbf009a 905
gmehmet 1:f60eafbf009a 906 case get_cfg_whrmaecscd_minpdcurrent:
gmehmet 1:f60eafbf009a 907 {
gmehmet 1:f60eafbf009a 908 uint8_t rxBuff[2+1]; // first byte is status
gmehmet 1:f60eafbf009a 909 char outstr[2*sizeof(rxBuff)];
gmehmet 1:f60eafbf009a 910 int str_idx = 0;
gmehmet 1:f60eafbf009a 911 uint8_t *Temp = &rxBuff[1];
gmehmet 1:f60eafbf009a 912 uint8_t val[1];
gmehmet 1:f60eafbf009a 913
gmehmet 1:f60eafbf009a 914 status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MIN_PD_CURRENT, &rxBuff[0], sizeof(rxBuff));
gmehmet 1:f60eafbf009a 915 for (int i = 0; i < sizeof(rxBuff)-1; i++)
gmehmet 1:f60eafbf009a 916 str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
gmehmet 1:f60eafbf009a 917
gmehmet 1:f60eafbf009a 918 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 919 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 920
gmehmet 1:f60eafbf009a 921 } break;
gmehmet 1:f60eafbf009a 922
gmehmet 1:f60eafbf009a 923 //--------- WHRM_AEC_SCD PD CONFIG
gmehmet 1:f60eafbf009a 924 case set_cfg_whrmaecscd_pdconfig:
gmehmet 1:f60eafbf009a 925 {
gmehmet 1:f60eafbf009a 926 uint8_t val[1];
gmehmet 1:f60eafbf009a 927 ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
gmehmet 1:f60eafbf009a 928 if (ret) {
gmehmet 1:f60eafbf009a 929 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 930 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 931 break;
gmehmet 1:f60eafbf009a 932 }
gmehmet 1:f60eafbf009a 933
gmehmet 1:f60eafbf009a 934 uint8_t Temp[1] = { (uint8_t)(val[0]) };
gmehmet 1:f60eafbf009a 935
gmehmet 1:f60eafbf009a 936 status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_PD_CONFIG, &Temp[0], 1);
gmehmet 1:f60eafbf009a 937 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 938 {
gmehmet 1:f60eafbf009a 939 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 940 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 941 }
gmehmet 1:f60eafbf009a 942 else
gmehmet 1:f60eafbf009a 943 {
gmehmet 1:f60eafbf009a 944 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 945 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 946 }
gmehmet 1:f60eafbf009a 947
gmehmet 1:f60eafbf009a 948 } break;
gmehmet 1:f60eafbf009a 949
gmehmet 1:f60eafbf009a 950 case get_cfg_whrmaecscd_pdconfig:
gmehmet 1:f60eafbf009a 951 {
gmehmet 1:f60eafbf009a 952 uint8_t rxBuff[1+1]; // first byte is status
gmehmet 1:f60eafbf009a 953 char outstr[2*sizeof(rxBuff)];
gmehmet 1:f60eafbf009a 954 int str_idx = 0;
gmehmet 1:f60eafbf009a 955 uint8_t *Temp = &rxBuff[1];
gmehmet 1:f60eafbf009a 956 uint8_t val[1];
gmehmet 1:f60eafbf009a 957
gmehmet 1:f60eafbf009a 958 status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_PD_CONFIG, &rxBuff[0], sizeof(rxBuff));
gmehmet 1:f60eafbf009a 959 for (int i = 0; i < sizeof(rxBuff)-1; i++)
gmehmet 1:f60eafbf009a 960 str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
gmehmet 1:f60eafbf009a 961
gmehmet 1:f60eafbf009a 962 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 963 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 964
gmehmet 1:f60eafbf009a 965 } break;
gmehmet 1:f60eafbf009a 966
gmehmet 1:f60eafbf009a 967 //--------- WHRM_AEC_SCD LED CONFIG
gmehmet 1:f60eafbf009a 968 case set_cfg_whrmaecscd_ledconfig:
gmehmet 1:f60eafbf009a 969 {
gmehmet 1:f60eafbf009a 970 uint8_t val[1];
gmehmet 1:f60eafbf009a 971 ret = (parse_cmd_data(cmd, cmd_tbl[i], &val[0], 1, true) != 1);
gmehmet 1:f60eafbf009a 972 if (ret) {
gmehmet 1:f60eafbf009a 973 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 974 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 975 break;
gmehmet 1:f60eafbf009a 976 }
gmehmet 1:f60eafbf009a 977
gmehmet 1:f60eafbf009a 978 uint8_t Temp[1] = { (uint8_t)(val[0]) };
gmehmet 1:f60eafbf009a 979
gmehmet 1:f60eafbf009a 980 status = ss_int->set_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_LED_CONFIG, &Temp[0], 1);
gmehmet 1:f60eafbf009a 981 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 982 {
gmehmet 1:f60eafbf009a 983 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 984 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 985 }
gmehmet 1:f60eafbf009a 986 else
gmehmet 1:f60eafbf009a 987 {
gmehmet 1:f60eafbf009a 988 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 989 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 990 }
gmehmet 1:f60eafbf009a 991
gmehmet 1:f60eafbf009a 992 } break;
gmehmet 1:f60eafbf009a 993
gmehmet 1:f60eafbf009a 994 case get_cfg_whrmaecscd_ledconfig:
gmehmet 1:f60eafbf009a 995 {
gmehmet 1:f60eafbf009a 996 uint8_t rxBuff[1+1]; // first byte is status
gmehmet 1:f60eafbf009a 997 char outstr[2*sizeof(rxBuff)];
gmehmet 1:f60eafbf009a 998 int str_idx = 0;
gmehmet 1:f60eafbf009a 999 uint8_t *Temp = &rxBuff[1];
gmehmet 1:f60eafbf009a 1000 uint8_t val[1];
gmehmet 1:f60eafbf009a 1001
gmehmet 1:f60eafbf009a 1002 status = ss_int->get_algo_cfg(SS_ALGOIDX_WHRM, SS_CFGIDX_WHRM_LED_CONFIG, &rxBuff[0], sizeof(rxBuff));
gmehmet 1:f60eafbf009a 1003 for (int i = 0; i < sizeof(rxBuff)-1; i++)
gmehmet 1:f60eafbf009a 1004 str_idx += snprintf(outstr + str_idx, sizeof(outstr) - str_idx - 1, "%02X", Temp[i]);
gmehmet 1:f60eafbf009a 1005
gmehmet 1:f60eafbf009a 1006 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%s err=%d\r\n", cmd, outstr, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 1007 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 1008
gmehmet 1:f60eafbf009a 1009 } break;
gmehmet 1:f60eafbf009a 1010
gmehmet 1:f60eafbf009a 1011 //--------- SEND RAW
gmehmet 1:f60eafbf009a 1012 case send_raw:
gmehmet 1:f60eafbf009a 1013 {
gmehmet 1:f60eafbf009a 1014 int size=0;
gmehmet 1:f60eafbf009a 1015 uint8_t data[256]; // max size of command
gmehmet 1:f60eafbf009a 1016
gmehmet 1:f60eafbf009a 1017 size = parse_str(cmd, cmd_tbl[i], data, sizeof(data));
gmehmet 1:f60eafbf009a 1018 status = ss_int->send_raw(data, size);
gmehmet 1:f60eafbf009a 1019
gmehmet 1:f60eafbf009a 1020 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 1021 {
gmehmet 1:f60eafbf009a 1022 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 1023 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 1024 }
gmehmet 1:f60eafbf009a 1025 else
gmehmet 1:f60eafbf009a 1026 {
gmehmet 1:f60eafbf009a 1027 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 1028 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 1029 }
gmehmet 1:f60eafbf009a 1030
gmehmet 1:f60eafbf009a 1031 } break;
gmehmet 1:f60eafbf009a 1032 //--------------------------------------------------------
gmehmet 1:f60eafbf009a 1033
gmehmet 1:f60eafbf009a 1034 default:
gmehmet 1:f60eafbf009a 1035 {
gmehmet 1:f60eafbf009a 1036 mxm_assert_msg(false, "Invalid switch case!");
gmehmet 1:f60eafbf009a 1037 } break;
gmehmet 1:f60eafbf009a 1038
gmehmet 1:f60eafbf009a 1039 }
gmehmet 1:f60eafbf009a 1040
gmehmet 1:f60eafbf009a 1041
gmehmet 1:f60eafbf009a 1042 if (BLE::Instance().gap().getState().connected) {
gmehmet 1:f60eafbf009a 1043 BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
gmehmet 1:f60eafbf009a 1044 }
gmehmet 1:f60eafbf009a 1045
gmehmet 1:f60eafbf009a 1046
gmehmet 1:f60eafbf009a 1047 break;
gmehmet 1:f60eafbf009a 1048
gmehmet 1:f60eafbf009a 1049 }
gmehmet 1:f60eafbf009a 1050 }
gmehmet 1:f60eafbf009a 1051
gmehmet 1:f60eafbf009a 1052 return recognizedCmd;
gmehmet 1:f60eafbf009a 1053 }
gmehmet 1:f60eafbf009a 1054
gmehmet 1:f60eafbf009a 1055 void SSMAX8614XComm::max8614x_data_rx(uint8_t* data_ptr)
gmehmet 1:f60eafbf009a 1056 {
gmehmet 1:f60eafbf009a 1057 max8614x_mode1_data sample;
gmehmet 1:f60eafbf009a 1058 sample.led1 = (data_ptr[0] << 16) | (data_ptr[1] << 8) | data_ptr[2];
gmehmet 1:f60eafbf009a 1059 sample.led2 = (data_ptr[3] << 16) | (data_ptr[4] << 8) | data_ptr[5];
gmehmet 1:f60eafbf009a 1060 sample.led3 = (data_ptr[6] << 16) | (data_ptr[7] << 8) | data_ptr[8];
gmehmet 1:f60eafbf009a 1061 sample.led4 = (data_ptr[9] << 16) | (data_ptr[10] << 8) | data_ptr[11];
gmehmet 1:f60eafbf009a 1062 sample.led5 = (data_ptr[12] << 16) | (data_ptr[13] << 8) | data_ptr[14];
gmehmet 1:f60eafbf009a 1063 sample.led6 = (data_ptr[15] << 16) | (data_ptr[16] << 8) | data_ptr[17];
gmehmet 1:f60eafbf009a 1064
gmehmet 1:f60eafbf009a 1065 pr_info("led1=%.6X led2=%.6X led3=%.6X led4=%.6X led5=%.6X led6=%.6X\r\n",
gmehmet 1:f60eafbf009a 1066 sample.led1, sample.led2, sample.led3, sample.led4, sample.led5, sample.led6);
gmehmet 1:f60eafbf009a 1067
gmehmet 1:f60eafbf009a 1068 enqueue(&max8614x_queue, &sample);
gmehmet 1:f60eafbf009a 1069 }
gmehmet 1:f60eafbf009a 1070
gmehmet 1:f60eafbf009a 1071 void SSMAX8614XComm::whrm_data_rx_mode1(uint8_t* data_ptr)
gmehmet 1:f60eafbf009a 1072 {
gmehmet 1:f60eafbf009a 1073 whrm_modeX_data sample;
gmehmet 1:f60eafbf009a 1074
gmehmet 1:f60eafbf009a 1075 sample.hr = (data_ptr[0] << 8) | data_ptr[1];
gmehmet 1:f60eafbf009a 1076 sample.hr_conf = data_ptr[2];
gmehmet 1:f60eafbf009a 1077 sample.rr = (data_ptr[3] << 8) | data_ptr[4];
gmehmet 1:f60eafbf009a 1078 sample.activity_class = data_ptr[5];
gmehmet 1:f60eafbf009a 1079 //m_USB->printf("\r\n Md1- hr:%d conf:%d rr:%d act:%d\r\n", sample.hr,sample.hr_conf,sample.rr,sample.activity_class );
gmehmet 1:f60eafbf009a 1080 enqueue(&whrm_queue, &sample);
gmehmet 1:f60eafbf009a 1081 pr_info("hr=%.1f conf=%d rr=%.1f rr_conf=%d status=%d\r\n", (float)sample.hr / 10.0, sample.hr_conf, (float)sample.rr/10, sample.rr_conf,sample.activity_class);
gmehmet 1:f60eafbf009a 1082 }
gmehmet 1:f60eafbf009a 1083
gmehmet 1:f60eafbf009a 1084 void SSMAX8614XComm::whrm_data_rx_mode2(uint8_t* data_ptr)
gmehmet 1:f60eafbf009a 1085 {
gmehmet 1:f60eafbf009a 1086 whrm_modeX_data sample;
gmehmet 1:f60eafbf009a 1087
gmehmet 1:f60eafbf009a 1088 sample.hr = (data_ptr[0] << 8) | data_ptr[1];
gmehmet 1:f60eafbf009a 1089 sample.hr_conf = data_ptr[2];
gmehmet 1:f60eafbf009a 1090 sample.rr = (data_ptr[3] << 8) | data_ptr[4];
gmehmet 1:f60eafbf009a 1091 sample.activity_class = data_ptr[5];
gmehmet 1:f60eafbf009a 1092 sample.rr_conf = data_ptr[6];
gmehmet 1:f60eafbf009a 1093 sample.walk_steps = (data_ptr[7] << 24) | (data_ptr[8] << 16) |(data_ptr[9] << 8) | data_ptr[10];
gmehmet 1:f60eafbf009a 1094 sample.run_steps = (data_ptr[11] << 24) | (data_ptr[12] << 16) |(data_ptr[13] << 8) | data_ptr[14];
gmehmet 1:f60eafbf009a 1095 sample.kcal = (data_ptr[15] << 24) | (data_ptr[16] << 16) |(data_ptr[17] << 8) | data_ptr[18];
gmehmet 1:f60eafbf009a 1096 sample.cadence = (data_ptr[19] << 24) | (data_ptr[20] << 16) |(data_ptr[21] << 8) | data_ptr[22];
gmehmet 1:f60eafbf009a 1097 sample.is_led_cur_adj = data_ptr[23];
gmehmet 1:f60eafbf009a 1098 sample.adj_led_cur = (data_ptr[24] << 8) | data_ptr[25];
gmehmet 1:f60eafbf009a 1099 sample.is_t_int_cur_adj = data_ptr[26];
gmehmet 1:f60eafbf009a 1100 sample.adj_t_int_cur = (data_ptr[27] << 8) | data_ptr[28];
gmehmet 1:f60eafbf009a 1101 sample.is_f_smp_adj = data_ptr[29];
gmehmet 1:f60eafbf009a 1102 sample.adj_f_smp = data_ptr[30];
gmehmet 1:f60eafbf009a 1103 sample.smp_ave = data_ptr[31];
gmehmet 1:f60eafbf009a 1104 sample.state = data_ptr[32];
gmehmet 1:f60eafbf009a 1105 sample.is_high_motion = data_ptr[33];
gmehmet 1:f60eafbf009a 1106 sample.status = data_ptr[34];
gmehmet 1:f60eafbf009a 1107
gmehmet 1:f60eafbf009a 1108 //m_USB->printf("\r\nMd2- hr:%d conf:%d rr:%d act:%d\r\n", sample.hr,sample.hr_conf,sample.rr,sample.activity_class );
gmehmet 1:f60eafbf009a 1109 enqueue(&whrm_queue, &sample);
gmehmet 1:f60eafbf009a 1110 pr_info("hr=%.1f conf=%d rr=%.1f rr_conf=%d status=%d\r\n", (float)sample.hr / 10.0, sample.hr_conf, (float)sample.rr/10, sample.rr_conf,sample.activity_class);
gmehmet 1:f60eafbf009a 1111 }
gmehmet 1:f60eafbf009a 1112
gmehmet 1:f60eafbf009a 1113
gmehmet 1:f60eafbf009a 1114 void SSMAX8614XComm::accel_data_rx(uint8_t* data_ptr)
gmehmet 1:f60eafbf009a 1115 {
gmehmet 1:f60eafbf009a 1116 //See API doc for data format
gmehmet 1:f60eafbf009a 1117 accel_mode1_data sample;
gmehmet 1:f60eafbf009a 1118 sample.x = (data_ptr[0] << 8) | data_ptr[1];
gmehmet 1:f60eafbf009a 1119 sample.y = (data_ptr[2] << 8) | data_ptr[3];
gmehmet 1:f60eafbf009a 1120 sample.z = (data_ptr[4] << 8) | data_ptr[5];
gmehmet 1:f60eafbf009a 1121
gmehmet 1:f60eafbf009a 1122 enqueue(&accel_input_queue, &sample);
gmehmet 1:f60eafbf009a 1123 }
gmehmet 1:f60eafbf009a 1124
gmehmet 1:f60eafbf009a 1125 void SSMAX8614XComm::agc_data_rx(uint8_t* data_ptr)
gmehmet 1:f60eafbf009a 1126 {
gmehmet 1:f60eafbf009a 1127 //NOP: AGC does not collect data
gmehmet 1:f60eafbf009a 1128 }
gmehmet 1:f60eafbf009a 1129
gmehmet 1:f60eafbf009a 1130 int SSMAX8614XComm::data_report_execute(char* buf, int size)
gmehmet 1:f60eafbf009a 1131 {
gmehmet 1:f60eafbf009a 1132 uint8_t tmp_report_mode;
gmehmet 1:f60eafbf009a 1133 max8614x_mode1_data max8614x_sample = { 0 };
gmehmet 1:f60eafbf009a 1134 whrm_modeX_data whrm_sample_modeX = { 0 };
gmehmet 1:f60eafbf009a 1135 //wspo2_modeX_data wspo2_sample_modeX = { 0 };
gmehmet 1:f60eafbf009a 1136 accel_mode1_data accel_sample = { 0 };
gmehmet 1:f60eafbf009a 1137
gmehmet 1:f60eafbf009a 1138
gmehmet 1:f60eafbf009a 1139 accel_data_t accel_data = {0};
gmehmet 1:f60eafbf009a 1140
gmehmet 1:f60eafbf009a 1141 int16_t data_len = 0;
gmehmet 1:f60eafbf009a 1142
gmehmet 1:f60eafbf009a 1143 static uint8_t isReportEnabled = 0;
gmehmet 1:f60eafbf009a 1144
gmehmet 1:f60eafbf009a 1145 if (size <= 0)
gmehmet 1:f60eafbf009a 1146 {
gmehmet 1:f60eafbf009a 1147 m_USB->printf("\r\nError: RepSize = %d\r\n", size);
gmehmet 1:f60eafbf009a 1148 return 0;
gmehmet 1:f60eafbf009a 1149 }
gmehmet 1:f60eafbf009a 1150
gmehmet 1:f60eafbf009a 1151 if (isReportEnabled != is_enabled())
gmehmet 1:f60eafbf009a 1152 {
gmehmet 1:f60eafbf009a 1153 isReportEnabled = is_enabled();
gmehmet 1:f60eafbf009a 1154 m_USB->printf("\r\nRep Enable = %d \r\n",isReportEnabled);
gmehmet 1:f60eafbf009a 1155 }
gmehmet 1:f60eafbf009a 1156
gmehmet 1:f60eafbf009a 1157 if (!is_enabled())
gmehmet 1:f60eafbf009a 1158 {
gmehmet 1:f60eafbf009a 1159 return 0;
gmehmet 1:f60eafbf009a 1160 }
gmehmet 1:f60eafbf009a 1161
gmehmet 1:f60eafbf009a 1162 ss_int->ss_execute_once();
gmehmet 1:f60eafbf009a 1163
gmehmet 1:f60eafbf009a 1164 comm_mutex.lock();
gmehmet 1:f60eafbf009a 1165 tmp_report_mode = data_report_mode;
gmehmet 1:f60eafbf009a 1166 comm_mutex.unlock();
gmehmet 1:f60eafbf009a 1167
gmehmet 1:f60eafbf009a 1168
gmehmet 1:f60eafbf009a 1169 while (sensor_data_from_host) {
gmehmet 1:f60eafbf009a 1170 accel_data_t accel_data = {0};
gmehmet 1:f60eafbf009a 1171
gmehmet 1:f60eafbf009a 1172 int ret;
gmehmet 1:f60eafbf009a 1173 ret = get_sensor_xyz(accel_data);
gmehmet 1:f60eafbf009a 1174 if (ret < 0)
gmehmet 1:f60eafbf009a 1175 break;
gmehmet 1:f60eafbf009a 1176
gmehmet 1:f60eafbf009a 1177 accel_mode1_data acc_sample;
gmehmet 1:f60eafbf009a 1178 acc_sample.x = (int16_t)(accel_data.x*1000);
gmehmet 1:f60eafbf009a 1179 acc_sample.y = (int16_t)(accel_data.y*1000);
gmehmet 1:f60eafbf009a 1180 acc_sample.z = (int16_t)(accel_data.z*1000);
gmehmet 1:f60eafbf009a 1181
gmehmet 1:f60eafbf009a 1182 if (enqueue(&accel_output_queue, &acc_sample) < 0)
gmehmet 1:f60eafbf009a 1183 pr_err("Thrown an accel sample\n");
gmehmet 1:f60eafbf009a 1184
gmehmet 1:f60eafbf009a 1185 if (queue_len(&accel_output_queue) < MAX_NUM_WR_ACC_SAMPLES)
gmehmet 1:f60eafbf009a 1186 break;
gmehmet 1:f60eafbf009a 1187
gmehmet 1:f60eafbf009a 1188 int num_bytes = 0;
gmehmet 1:f60eafbf009a 1189 SS_STATUS status = ss_int->get_num_bytes_in_input_fifo(&num_bytes);
gmehmet 1:f60eafbf009a 1190 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 1191 pr_err("Unable to read num bytes in input fifo\r\n");
gmehmet 1:f60eafbf009a 1192 break;
gmehmet 1:f60eafbf009a 1193 }
gmehmet 1:f60eafbf009a 1194
gmehmet 1:f60eafbf009a 1195 int num_tx = input_fifo_size - num_bytes;
gmehmet 1:f60eafbf009a 1196 mxm_assert_msg((num_tx >= 0), "num_tx can't be negative");
gmehmet 1:f60eafbf009a 1197 if (num_tx <= 0)
gmehmet 1:f60eafbf009a 1198 break;
gmehmet 1:f60eafbf009a 1199
gmehmet 1:f60eafbf009a 1200 int num_samples = num_tx / sizeof(accel_mode1_data);
gmehmet 1:f60eafbf009a 1201 num_samples = min(num_samples, MAX_NUM_WR_ACC_SAMPLES);
gmehmet 1:f60eafbf009a 1202 num_tx = num_samples * sizeof(accel_mode1_data);
gmehmet 1:f60eafbf009a 1203
gmehmet 1:f60eafbf009a 1204 if (num_samples == 0) {
gmehmet 1:f60eafbf009a 1205 pr_err("Input FIFO is Full\n");
gmehmet 1:f60eafbf009a 1206 break;
gmehmet 1:f60eafbf009a 1207 }
gmehmet 1:f60eafbf009a 1208
gmehmet 1:f60eafbf009a 1209 accel_mode1_data peek_buf[num_samples];
gmehmet 1:f60eafbf009a 1210 ret = queue_front_n(&accel_output_queue, peek_buf, num_samples, num_samples * sizeof(accel_mode1_data));
gmehmet 1:f60eafbf009a 1211 if (ret < 0)
gmehmet 1:f60eafbf009a 1212 mxm_assert_msg((num_tx >= 0), "Unable to peek samples from accel queue. Something is wrong.");
gmehmet 1:f60eafbf009a 1213
gmehmet 1:f60eafbf009a 1214 uint8_t tx_buf[2 + num_tx]; /* 2 bytes were allocated for commands */
gmehmet 1:f60eafbf009a 1215 for (int i = 2, j = 0; j < num_samples; i+= sizeof(accel_mode1_data), j++) {
gmehmet 1:f60eafbf009a 1216 acc_sample = peek_buf[j];
gmehmet 1:f60eafbf009a 1217
gmehmet 1:f60eafbf009a 1218 tx_buf[i] = acc_sample.x;
gmehmet 1:f60eafbf009a 1219 tx_buf[i + 1] = acc_sample.x >> 8;
gmehmet 1:f60eafbf009a 1220
gmehmet 1:f60eafbf009a 1221 tx_buf[i + 2] = acc_sample.y;
gmehmet 1:f60eafbf009a 1222 tx_buf[i + 3] = acc_sample.y >> 8;
gmehmet 1:f60eafbf009a 1223
gmehmet 1:f60eafbf009a 1224 tx_buf[i + 4] = acc_sample.z;
gmehmet 1:f60eafbf009a 1225 tx_buf[i + 5] = acc_sample.z >> 8;
gmehmet 1:f60eafbf009a 1226
gmehmet 1:f60eafbf009a 1227 }
gmehmet 1:f60eafbf009a 1228
gmehmet 1:f60eafbf009a 1229 int num_wr_bytes = 0;
gmehmet 1:f60eafbf009a 1230 int nb_expected = num_tx;
gmehmet 1:f60eafbf009a 1231 status = ss_int->feed_to_input_fifo(tx_buf, num_tx + 2, &num_wr_bytes);
gmehmet 1:f60eafbf009a 1232 if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 1233 pr_err("Unable to write accel data. num_tx: %d. status: %d\r\n", num_tx, status);
gmehmet 1:f60eafbf009a 1234 break;
gmehmet 1:f60eafbf009a 1235 }
gmehmet 1:f60eafbf009a 1236
gmehmet 1:f60eafbf009a 1237 int num_written_samples = num_wr_bytes / sizeof(accel_mode1_data);
gmehmet 1:f60eafbf009a 1238 if (num_written_samples == 0)
gmehmet 1:f60eafbf009a 1239 break;
gmehmet 1:f60eafbf009a 1240
gmehmet 1:f60eafbf009a 1241 ret = queue_pop_n(&accel_output_queue, num_written_samples);
gmehmet 1:f60eafbf009a 1242 if (ret < 0)
gmehmet 1:f60eafbf009a 1243 mxm_assert_msg((num_tx >= 0), "Unable to popped samples out from accel queue. Something is wrong.");
gmehmet 1:f60eafbf009a 1244
gmehmet 1:f60eafbf009a 1245 break;
gmehmet 1:f60eafbf009a 1246 }
gmehmet 1:f60eafbf009a 1247
gmehmet 1:f60eafbf009a 1248
gmehmet 1:f60eafbf009a 1249 switch (tmp_report_mode) {
gmehmet 1:f60eafbf009a 1250 case read_ppg_0:
gmehmet 1:f60eafbf009a 1251 {
gmehmet 1:f60eafbf009a 1252 if (1
gmehmet 1:f60eafbf009a 1253
gmehmet 1:f60eafbf009a 1254
gmehmet 1:f60eafbf009a 1255 && (queue_len(&max8614x_queue) > 0 && sensor_algo_en_dis_.max8614x_enabled)
gmehmet 1:f60eafbf009a 1256
gmehmet 1:f60eafbf009a 1257
gmehmet 1:f60eafbf009a 1258
gmehmet 1:f60eafbf009a 1259 && (queue_len(&accel_input_queue) > 0 && sensor_algo_en_dis_.accel_enabled)
gmehmet 1:f60eafbf009a 1260
gmehmet 1:f60eafbf009a 1261
gmehmet 1:f60eafbf009a 1262
gmehmet 1:f60eafbf009a 1263 && (queue_len(&whrm_queue) > 0 && sensor_algo_en_dis_.whrm_enabled)
gmehmet 1:f60eafbf009a 1264
gmehmet 1:f60eafbf009a 1265 )
gmehmet 1:f60eafbf009a 1266 {
gmehmet 1:f60eafbf009a 1267
gmehmet 1:f60eafbf009a 1268 if(sensor_algo_en_dis_.max8614x_enabled)
gmehmet 1:f60eafbf009a 1269 dequeue(&max8614x_queue, &max8614x_sample);
gmehmet 1:f60eafbf009a 1270
gmehmet 1:f60eafbf009a 1271
gmehmet 1:f60eafbf009a 1272
gmehmet 1:f60eafbf009a 1273 if(sensor_algo_en_dis_.accel_enabled)
gmehmet 1:f60eafbf009a 1274 dequeue(&accel_input_queue, &accel_sample);
gmehmet 1:f60eafbf009a 1275
gmehmet 1:f60eafbf009a 1276
gmehmet 1:f60eafbf009a 1277
gmehmet 1:f60eafbf009a 1278 if(sensor_algo_en_dis_.whrm_enabled){
gmehmet 1:f60eafbf009a 1279 dequeue(&whrm_queue, &whrm_sample_modeX);
gmehmet 1:f60eafbf009a 1280 instant_hr = whrm_sample_modeX.hr * 0.1;
gmehmet 1:f60eafbf009a 1281 instant_hr_conf = whrm_sample_modeX.hr_conf;
gmehmet 1:f60eafbf009a 1282 instant_hr_activityClass = whrm_sample_modeX.activity_class;
gmehmet 1:f60eafbf009a 1283 }
gmehmet 1:f60eafbf009a 1284
gmehmet 1:f60eafbf009a 1285
gmehmet 1:f60eafbf009a 1286 if (AsciiEn) {
gmehmet 1:f60eafbf009a 1287 // mode 2 only for ASCII
gmehmet 1:f60eafbf009a 1288 if (ds_int->algo_report_mode == 2){
gmehmet 1:f60eafbf009a 1289 data_len = snprintf(buf, size - 1,
gmehmet 1:f60eafbf009a 1290 "%u,%lu,%lu,%lu,%lu,%lu,%lu,%.3f,%.3f,%.3f,%.1f,%d,%.1f,%d,%d,%lu,%lu,%lu,%lu,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",
gmehmet 1:f60eafbf009a 1291 sample_count++,
gmehmet 1:f60eafbf009a 1292 max8614x_sample.led1,max8614x_sample.led2,max8614x_sample.led3,max8614x_sample.led4,max8614x_sample.led5,max8614x_sample.led6,
gmehmet 1:f60eafbf009a 1293 accel_sample.x * 0.001,accel_sample.y * 0.001,accel_sample.z * 0.001,
gmehmet 1:f60eafbf009a 1294 whrm_sample_modeX.hr * 0.1, whrm_sample_modeX.hr_conf, whrm_sample_modeX.rr * 0.1,whrm_sample_modeX.rr_conf,whrm_sample_modeX.activity_class,
gmehmet 1:f60eafbf009a 1295 whrm_sample_modeX.walk_steps, whrm_sample_modeX.run_steps, whrm_sample_modeX.kcal, whrm_sample_modeX.cadence,
gmehmet 1:f60eafbf009a 1296 whrm_sample_modeX.is_led_cur_adj, whrm_sample_modeX.adj_led_cur, whrm_sample_modeX.is_t_int_cur_adj, whrm_sample_modeX.adj_t_int_cur,
gmehmet 1:f60eafbf009a 1297 whrm_sample_modeX.is_f_smp_adj, whrm_sample_modeX.adj_f_smp,
gmehmet 1:f60eafbf009a 1298 whrm_sample_modeX.smp_ave, whrm_sample_modeX.state, whrm_sample_modeX.is_high_motion, whrm_sample_modeX.status);
gmehmet 1:f60eafbf009a 1299 }
gmehmet 1:f60eafbf009a 1300 else {
gmehmet 1:f60eafbf009a 1301 data_len = snprintf(buf, size - 1, "%u,%lu,%lu,%lu,%lu,%lu,%lu,%.3f,%.3f,%.3f,%.1f,%d,%.1f,%d\r\n",
gmehmet 1:f60eafbf009a 1302 sample_count++,
gmehmet 1:f60eafbf009a 1303 max8614x_sample.led1,
gmehmet 1:f60eafbf009a 1304 max8614x_sample.led2,
gmehmet 1:f60eafbf009a 1305 max8614x_sample.led3,
gmehmet 1:f60eafbf009a 1306 max8614x_sample.led4,
gmehmet 1:f60eafbf009a 1307 max8614x_sample.led5,
gmehmet 1:f60eafbf009a 1308 max8614x_sample.led6,
gmehmet 1:f60eafbf009a 1309 accel_sample.x * 0.001,
gmehmet 1:f60eafbf009a 1310 accel_sample.y * 0.001,
gmehmet 1:f60eafbf009a 1311 accel_sample.z * 0.001,
gmehmet 1:f60eafbf009a 1312 whrm_sample_modeX.hr * 0.1,
gmehmet 1:f60eafbf009a 1313 whrm_sample_modeX.hr_conf,
gmehmet 1:f60eafbf009a 1314 whrm_sample_modeX.rr * 0.1,
gmehmet 1:f60eafbf009a 1315 whrm_sample_modeX.activity_class);
gmehmet 1:f60eafbf009a 1316 }
gmehmet 1:f60eafbf009a 1317 }
gmehmet 1:f60eafbf009a 1318 else { // bin report
gmehmet 1:f60eafbf009a 1319
gmehmet 1:f60eafbf009a 1320
gmehmet 1:f60eafbf009a 1321 mxm_assert_msg(((uint32_t)size > sizeof(ds_pkt_data_mode2_compact)), "data_report_execute buffer too small");
gmehmet 1:f60eafbf009a 1322 ds_pkt_data_mode2_compact* data_packet = (ds_pkt_data_mode2_compact*)buf;
gmehmet 1:f60eafbf009a 1323 data_packet->start_byte = DS_BINARY_PACKET_START_BYTE;
gmehmet 1:f60eafbf009a 1324 data_packet->sample_cnt = sample_count++;
gmehmet 1:f60eafbf009a 1325 data_packet->grnCnt = max8614x_sample.led1;
gmehmet 1:f60eafbf009a 1326 data_packet->grn2Cnt = max8614x_sample.led4;
gmehmet 1:f60eafbf009a 1327 data_packet->hr = (whrm_sample_modeX.hr * 0.1);
gmehmet 1:f60eafbf009a 1328 data_packet->x = (int16_t)(accel_sample.x);
gmehmet 1:f60eafbf009a 1329 data_packet->y = (int16_t)(accel_sample.y);
gmehmet 1:f60eafbf009a 1330 data_packet->z = (int16_t)(accel_sample.z);
gmehmet 1:f60eafbf009a 1331 data_packet->hr_confidence = whrm_sample_modeX.hr_conf;
gmehmet 1:f60eafbf009a 1332 data_packet->rr = whrm_sample_modeX.rr;
gmehmet 1:f60eafbf009a 1333 data_packet->status = whrm_sample_modeX.activity_class;
gmehmet 1:f60eafbf009a 1334 data_packet->crc8 = crc8((uint8_t*)data_packet, sizeof(*data_packet) - sizeof(uint8_t));
gmehmet 1:f60eafbf009a 1335 data_len = sizeof(*data_packet);
gmehmet 1:f60eafbf009a 1336 }
gmehmet 1:f60eafbf009a 1337 }
gmehmet 1:f60eafbf009a 1338 else
gmehmet 1:f60eafbf009a 1339 {
gmehmet 1:f60eafbf009a 1340 //m_USB->printf("\r\nError Printing: max8614x_q:%d, max8614x_enabled:%d, \r\n",queue_len(&max8614x_queue), sensor_algo_en_dis_.max8614x_enabled );
gmehmet 1:f60eafbf009a 1341 //m_USB->printf("\r\n accel_q:%d, accel_enabled:%d, \r\n",queue_len(&accel_input_queue), sensor_algo_en_dis_.accel_enabled);
gmehmet 1:f60eafbf009a 1342 //m_USB->printf("\r\n whrm_queue:%d,whrm_enabled:%d, \r\n",queue_len(&whrm_queue) , sensor_algo_en_dis_.whrm_enabled);
gmehmet 1:f60eafbf009a 1343
gmehmet 1:f60eafbf009a 1344 }
gmehmet 1:f60eafbf009a 1345 } break;
gmehmet 1:f60eafbf009a 1346
gmehmet 1:f60eafbf009a 1347 default:
gmehmet 1:f60eafbf009a 1348 {
gmehmet 1:f60eafbf009a 1349 m_USB->printf("\r\nError tmp_report_mode=%d\r\n", tmp_report_mode);
gmehmet 1:f60eafbf009a 1350 return 0;
gmehmet 1:f60eafbf009a 1351 }
gmehmet 1:f60eafbf009a 1352 }
gmehmet 1:f60eafbf009a 1353
gmehmet 1:f60eafbf009a 1354 if (data_len < 0) {
gmehmet 1:f60eafbf009a 1355 pr_err("snprintf console_tx_buf failed");
gmehmet 1:f60eafbf009a 1356 } else if (data_len > size) {
gmehmet 1:f60eafbf009a 1357 pr_err("buffer is insufficient to hold data");
gmehmet 1:f60eafbf009a 1358 }
gmehmet 1:f60eafbf009a 1359
gmehmet 1:f60eafbf009a 1360 return data_len;
gmehmet 1:f60eafbf009a 1361 }
gmehmet 1:f60eafbf009a 1362
gmehmet 1:f60eafbf009a 1363 // TODO: convert this to PPG sensor test
gmehmet 1:f60eafbf009a 1364 int SSMAX8614XComm::selftest_max8614x(){
gmehmet 1:f60eafbf009a 1365 int ret;
gmehmet 1:f60eafbf009a 1366 uint8_t test_result;
gmehmet 1:f60eafbf009a 1367 bool test_failed = false;
gmehmet 1:f60eafbf009a 1368 m_USB->printf("starting selftest_max8614x\r\n");
gmehmet 1:f60eafbf009a 1369 // configure mfio pin for self test
gmehmet 1:f60eafbf009a 1370 ss_int->mfio_selftest();
gmehmet 1:f60eafbf009a 1371 ret = ss_int->self_test(SS_SENSORIDX_MAX86140, &test_result, 1000);
gmehmet 1:f60eafbf009a 1372 if(ret != SS_SUCCESS){
gmehmet 1:f60eafbf009a 1373 m_USB->printf("ss_int->self_test(SS_SENSORIDX_MAX86140, &test_result) has failed err<-1>\r\n");
gmehmet 1:f60eafbf009a 1374 test_failed = true;
gmehmet 1:f60eafbf009a 1375 }
gmehmet 1:f60eafbf009a 1376 // reset mfio pin to old state
gmehmet 1:f60eafbf009a 1377 if(!ss_int->reset_mfio_irq()){
gmehmet 1:f60eafbf009a 1378 m_USB->printf("smart sensor reset_mfio_irq has failed err<-1>\r\n");
gmehmet 1:f60eafbf009a 1379 test_failed = true;
gmehmet 1:f60eafbf009a 1380 }
gmehmet 1:f60eafbf009a 1381 // reset the sensor to turn off the LED
gmehmet 1:f60eafbf009a 1382 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 1383 if(test_failed | !self_test_result_evaluate("selftest_max8614x", test_result)){
gmehmet 1:f60eafbf009a 1384 return -1;
gmehmet 1:f60eafbf009a 1385 }else{
gmehmet 1:f60eafbf009a 1386 return SS_SUCCESS;
gmehmet 1:f60eafbf009a 1387 }
gmehmet 1:f60eafbf009a 1388 }
gmehmet 1:f60eafbf009a 1389
gmehmet 1:f60eafbf009a 1390 int SSMAX8614XComm::selftest_accelerometer(){
gmehmet 1:f60eafbf009a 1391 int ret;
gmehmet 1:f60eafbf009a 1392 uint8_t test_result;
gmehmet 1:f60eafbf009a 1393 bool test_failed = false;
gmehmet 1:f60eafbf009a 1394 m_USB->printf("starting selftest_accelerometer\r\n");
gmehmet 1:f60eafbf009a 1395 ret = ss_int->self_test(SS_SENSORIDX_ACCEL, &test_result, 1000);
gmehmet 1:f60eafbf009a 1396 if(ret != SS_SUCCESS){
gmehmet 1:f60eafbf009a 1397 m_USB->printf("ss_int->self_test(SS_SENSORIDX_ACCEL, &test_result) has failed err<-1>\r\n");
gmehmet 1:f60eafbf009a 1398 test_failed = true;
gmehmet 1:f60eafbf009a 1399 }
gmehmet 1:f60eafbf009a 1400 // reset the sensor to turn off the LED
gmehmet 1:f60eafbf009a 1401 ret = ss_int->reset();
gmehmet 1:f60eafbf009a 1402 if(ret != SS_SUCCESS){
gmehmet 1:f60eafbf009a 1403 m_USB->printf("smart sensor reset has failed err<-1>\r\n");
gmehmet 1:f60eafbf009a 1404 test_failed = true;
gmehmet 1:f60eafbf009a 1405 }
gmehmet 1:f60eafbf009a 1406 if(test_failed | !self_test_result_evaluate("selftest_accelerometer", test_result)){
gmehmet 1:f60eafbf009a 1407 return -1;
gmehmet 1:f60eafbf009a 1408 }else{
gmehmet 1:f60eafbf009a 1409 return SS_SUCCESS;
gmehmet 1:f60eafbf009a 1410 }
gmehmet 1:f60eafbf009a 1411 }
gmehmet 1:f60eafbf009a 1412
gmehmet 1:f60eafbf009a 1413 bool SSMAX8614XComm::self_test_result_evaluate(const char *message, uint8_t result){
gmehmet 1:f60eafbf009a 1414 // check i2c response status
gmehmet 1:f60eafbf009a 1415 if(result != 0x00){
gmehmet 1:f60eafbf009a 1416 m_USB->printf("%s has failed % 02X err<-1>\r\n", message, result);
gmehmet 1:f60eafbf009a 1417 if((result & FAILURE_COMM))
gmehmet 1:f60eafbf009a 1418 m_USB->printf("%s communication has failed err<-1>\r\n", message);
gmehmet 1:f60eafbf009a 1419 if(result & FAILURE_INTERRUPT)
gmehmet 1:f60eafbf009a 1420 m_USB->printf("%s interrupt pin check has failed err<-1>\r\n", message);
gmehmet 1:f60eafbf009a 1421 return false;
gmehmet 1:f60eafbf009a 1422 }
gmehmet 1:f60eafbf009a 1423 return true;
gmehmet 1:f60eafbf009a 1424 }
gmehmet 1:f60eafbf009a 1425
gmehmet 1:f60eafbf009a 1426 unsigned char SSMAX8614XComm::get_sensor_id() {
gmehmet 1:f60eafbf009a 1427 return SENSOR_ID_SSMAX8614X; //TODO: assign the correct number
gmehmet 1:f60eafbf009a 1428 }