test

Dependencies:   BMI160 max32630hsp3 MemoryLCD USBDevice

Committer:
seyhmuscacina
Date:
Mon Mar 25 07:40:37 2019 +0000
Revision:
3:b8989dab0f88
Parent:
0:ac4dea3e2894
Fork the repository

Who changed what in which revision?

UserRevisionLine numberNew contents of line
seyhmus.cacina 0:ac4dea3e2894 1 /*******************************************************************************
seyhmus.cacina 0:ac4dea3e2894 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
seyhmus.cacina 0:ac4dea3e2894 3 *
seyhmus.cacina 0:ac4dea3e2894 4 * Permission is hereby granted, free of charge, to any person obtaining a
seyhmus.cacina 0:ac4dea3e2894 5 * copy of this software and associated documentation files (the "Software"),
seyhmus.cacina 0:ac4dea3e2894 6 * to deal in the Software without restriction, including without limitation
seyhmus.cacina 0:ac4dea3e2894 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
seyhmus.cacina 0:ac4dea3e2894 8 * and/or sell copies of the Software, and to permit persons to whom the
seyhmus.cacina 0:ac4dea3e2894 9 * Software is furnished to do so, subject to the following conditions:
seyhmus.cacina 0:ac4dea3e2894 10 *
seyhmus.cacina 0:ac4dea3e2894 11 * The above copyright notice and this permission notice shall be included
seyhmus.cacina 0:ac4dea3e2894 12 * in all copies or substantial portions of the Software.
seyhmus.cacina 0:ac4dea3e2894 13 *
seyhmus.cacina 0:ac4dea3e2894 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
seyhmus.cacina 0:ac4dea3e2894 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
seyhmus.cacina 0:ac4dea3e2894 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
seyhmus.cacina 0:ac4dea3e2894 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
seyhmus.cacina 0:ac4dea3e2894 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
seyhmus.cacina 0:ac4dea3e2894 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
seyhmus.cacina 0:ac4dea3e2894 20 * OTHER DEALINGS IN THE SOFTWARE.
seyhmus.cacina 0:ac4dea3e2894 21 *
seyhmus.cacina 0:ac4dea3e2894 22 * Except as contained in this notice, the name of Maxim Integrated
seyhmus.cacina 0:ac4dea3e2894 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
seyhmus.cacina 0:ac4dea3e2894 24 * Products, Inc. Branding Policy.
seyhmus.cacina 0:ac4dea3e2894 25 *
seyhmus.cacina 0:ac4dea3e2894 26 * The mere transfer of this software does not imply any licenses
seyhmus.cacina 0:ac4dea3e2894 27 * of trade secrets, proprietary technology, copyrights, patents,
seyhmus.cacina 0:ac4dea3e2894 28 * trademarks, maskwork rights, or any other form of intellectual
seyhmus.cacina 0:ac4dea3e2894 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
seyhmus.cacina 0:ac4dea3e2894 30 * ownership rights.
seyhmus.cacina 0:ac4dea3e2894 31 *******************************************************************************
seyhmus.cacina 0:ac4dea3e2894 32 */
seyhmus.cacina 0:ac4dea3e2894 33 #include "SH_Max8614x_BareMetal.h"
seyhmus.cacina 0:ac4dea3e2894 34 #include "SHComm.h"
seyhmus.cacina 0:ac4dea3e2894 35 #include "HostAccelHelper.h"
seyhmus.cacina 0:ac4dea3e2894 36 #include <string.h> //for memset
seyhmus.cacina 0:ac4dea3e2894 37 #include <stdint.h>
seyhmus.cacina 0:ac4dea3e2894 38
seyhmus.cacina 0:ac4dea3e2894 39 #include "demoDefinitions.h"
seyhmus.cacina 0:ac4dea3e2894 40
seyhmus.cacina 0:ac4dea3e2894 41 /* Do not warn sign/unsigned miss alignment*/
seyhmus.cacina 0:ac4dea3e2894 42 //#pragma warning (disable : 4018 )
seyhmus.cacina 0:ac4dea3e2894 43
seyhmus.cacina 0:ac4dea3e2894 44 uint16_t HrmResult = 0;
seyhmus.cacina 0:ac4dea3e2894 45 uint8_t HrmConfidence = 0;
seyhmus.cacina 0:ac4dea3e2894 46
seyhmus.cacina 0:ac4dea3e2894 47 //#define SERIALOUT printf
seyhmus.cacina 0:ac4dea3e2894 48 #define DEBUG_INFO
seyhmus.cacina 0:ac4dea3e2894 49
seyhmus.cacina 0:ac4dea3e2894 50 #if defined(DEBUG_INFO)
seyhmus.cacina 0:ac4dea3e2894 51 #define __DBGMESSAGE( str , val ) {printf(str, val);}
seyhmus.cacina 0:ac4dea3e2894 52 #else
seyhmus.cacina 0:ac4dea3e2894 53 #define __DBGMESSAGE( str , val )
seyhmus.cacina 0:ac4dea3e2894 54 #endif
seyhmus.cacina 0:ac4dea3e2894 55
seyhmus.cacina 0:ac4dea3e2894 56
seyhmus.cacina 0:ac4dea3e2894 57 // Defines
seyhmus.cacina 0:ac4dea3e2894 58 #define SSMAX8614X_REG_SIZE 1
seyhmus.cacina 0:ac4dea3e2894 59 #define SSMAX8614X_MODE1_DATASIZE 18 //Taken from API doc
seyhmus.cacina 0:ac4dea3e2894 60 #define SSWHRM_MODE1_DATASIZE 6 //Taken from API doc
seyhmus.cacina 0:ac4dea3e2894 61 #define SSACCEL_MODE1_DATASIZE 6 //Taken from API doc
seyhmus.cacina 0:ac4dea3e2894 62 #define SSAGC_MODE1_DATASIZE 0 //Taken from API doc
seyhmus.cacina 0:ac4dea3e2894 63 #define SSBPT_MODE1_2_DATASIZE 4 //Taken from API doc /* TODO */
seyhmus.cacina 0:ac4dea3e2894 64
seyhmus.cacina 0:ac4dea3e2894 65 #define MIN_MACRO(a,b) ((a)<(b)?(a):(b))
seyhmus.cacina 0:ac4dea3e2894 66
seyhmus.cacina 0:ac4dea3e2894 67 // sensor configuration
seyhmus.cacina 0:ac4dea3e2894 68 //#define ENABLE_SENSOR_HUB_ACCEL
seyhmus.cacina 0:ac4dea3e2894 69 #define USE_HOST_ACCEL
seyhmus.cacina 0:ac4dea3e2894 70 // end of senor and algorithm configuration
seyhmus.cacina 0:ac4dea3e2894 71 #define MAX_NUM_WR_ACC_SAMPLES 5
seyhmus.cacina 0:ac4dea3e2894 72 #define BMI160_SAMPLE_RATE 25
seyhmus.cacina 0:ac4dea3e2894 73 // end of defines
seyhmus.cacina 0:ac4dea3e2894 74
seyhmus.cacina 0:ac4dea3e2894 75 //function pointer use to perform arithmetic operation
seyhmus.cacina 0:ac4dea3e2894 76 typedef void (*rx_data_callback)(uint8_t *);
seyhmus.cacina 0:ac4dea3e2894 77 typedef struct {
seyhmus.cacina 0:ac4dea3e2894 78 int data_size;
seyhmus.cacina 0:ac4dea3e2894 79 rx_data_callback rx_data_parser;
seyhmus.cacina 0:ac4dea3e2894 80 } ss_data_req;
seyhmus.cacina 0:ac4dea3e2894 81
seyhmus.cacina 0:ac4dea3e2894 82 typedef struct {
seyhmus.cacina 0:ac4dea3e2894 83 int16_t x;
seyhmus.cacina 0:ac4dea3e2894 84 int16_t y;
seyhmus.cacina 0:ac4dea3e2894 85 int16_t z;
seyhmus.cacina 0:ac4dea3e2894 86 } accel_mode1_data;
seyhmus.cacina 0:ac4dea3e2894 87
seyhmus.cacina 0:ac4dea3e2894 88 typedef struct {
seyhmus.cacina 0:ac4dea3e2894 89 uint32_t led1;
seyhmus.cacina 0:ac4dea3e2894 90 uint32_t led2;
seyhmus.cacina 0:ac4dea3e2894 91 uint32_t led3;
seyhmus.cacina 0:ac4dea3e2894 92 uint32_t led4;
seyhmus.cacina 0:ac4dea3e2894 93 uint32_t led5;
seyhmus.cacina 0:ac4dea3e2894 94 uint32_t led6;
seyhmus.cacina 0:ac4dea3e2894 95 } max8614x_mode1_data;
seyhmus.cacina 0:ac4dea3e2894 96
seyhmus.cacina 0:ac4dea3e2894 97 typedef struct {
seyhmus.cacina 0:ac4dea3e2894 98 uint16_t hr;
seyhmus.cacina 0:ac4dea3e2894 99 uint8_t hr_conf;
seyhmus.cacina 0:ac4dea3e2894 100 uint16_t RESERVED;
seyhmus.cacina 0:ac4dea3e2894 101 uint8_t status;
seyhmus.cacina 0:ac4dea3e2894 102 } whrm_mode1_data;
seyhmus.cacina 0:ac4dea3e2894 103
seyhmus.cacina 0:ac4dea3e2894 104
seyhmus.cacina 0:ac4dea3e2894 105 typedef struct Max86140_SH_Status_Tracker {
seyhmus.cacina 0:ac4dea3e2894 106 uint8_t sensor_data_from_host;
seyhmus.cacina 0:ac4dea3e2894 107 uint8_t data_type_enabled; // what type of data is enabled
seyhmus.cacina 0:ac4dea3e2894 108 uint8_t sample_count_enabled; // does me11 provide sample count
seyhmus.cacina 0:ac4dea3e2894 109 uint32_t sample_count;
seyhmus.cacina 0:ac4dea3e2894 110 uint8_t data_buf_storage[512]; // store data read from SH
seyhmus.cacina 0:ac4dea3e2894 111 ss_data_req algo_callbacks[SH_NUM_CURRENT_ALGOS];
seyhmus.cacina 0:ac4dea3e2894 112 ss_data_req sensor_callbacks[SH_NUM_CURRENT_SENSORS];
seyhmus.cacina 0:ac4dea3e2894 113 uint8_t sensor_enabled_mode[SH_NUM_CURRENT_SENSORS];
seyhmus.cacina 0:ac4dea3e2894 114 uint8_t algo_enabled_mode[SH_NUM_CURRENT_ALGOS];
seyhmus.cacina 0:ac4dea3e2894 115 int input_fifo_size;
seyhmus.cacina 0:ac4dea3e2894 116 } Max86140_SH_Status_Tracker_t;
seyhmus.cacina 0:ac4dea3e2894 117
seyhmus.cacina 0:ac4dea3e2894 118 // Max8614x Default Callbacks
seyhmus.cacina 0:ac4dea3e2894 119 void max8614x_data_rx(uint8_t* data_ptr)
seyhmus.cacina 0:ac4dea3e2894 120 {
seyhmus.cacina 0:ac4dea3e2894 121 max8614x_mode1_data sample;
seyhmus.cacina 0:ac4dea3e2894 122 sample.led1 = (data_ptr[0] << 16) | (data_ptr[1] << 8) | data_ptr[2];
seyhmus.cacina 0:ac4dea3e2894 123 sample.led2 = (data_ptr[3] << 16) | (data_ptr[4] << 8) | data_ptr[5];
seyhmus.cacina 0:ac4dea3e2894 124 sample.led3 = (data_ptr[6] << 16) | (data_ptr[7] << 8) | data_ptr[8];
seyhmus.cacina 0:ac4dea3e2894 125 sample.led4 = (data_ptr[9] << 16) | (data_ptr[10] << 8) | data_ptr[11];
seyhmus.cacina 0:ac4dea3e2894 126 sample.led5 = (data_ptr[12] << 16) | (data_ptr[13] << 8) | data_ptr[14];
seyhmus.cacina 0:ac4dea3e2894 127 sample.led6 = (data_ptr[15] << 16) | (data_ptr[16] << 8) | data_ptr[17];
seyhmus.cacina 0:ac4dea3e2894 128
seyhmus.cacina 0:ac4dea3e2894 129 //SERIALOUT("led1=%.6X led2=%.6X led3=%.6X led4=%.6X led5=%.6X led6=%.6X\r\n",
seyhmus.cacina 0:ac4dea3e2894 130 // sample.led1, sample.led2, sample.led3, sample.led4, sample.led5, sample.led6);
seyhmus.cacina 0:ac4dea3e2894 131
seyhmus.cacina 0:ac4dea3e2894 132 //enqueue(&max8614x_queue, &sample);
seyhmus.cacina 0:ac4dea3e2894 133 }
seyhmus.cacina 0:ac4dea3e2894 134 void whrm_data_rx(uint8_t* data_ptr) {
seyhmus.cacina 0:ac4dea3e2894 135 //See API doc for data format
seyhmus.cacina 0:ac4dea3e2894 136 whrm_mode1_data sample;
seyhmus.cacina 0:ac4dea3e2894 137 sample.hr = (data_ptr[0] << 8) | data_ptr[1];
seyhmus.cacina 0:ac4dea3e2894 138 sample.hr_conf = data_ptr[2];
seyhmus.cacina 0:ac4dea3e2894 139 sample.RESERVED = (data_ptr[3] << 8) | data_ptr[4];
seyhmus.cacina 0:ac4dea3e2894 140 sample.status = data_ptr[5];
seyhmus.cacina 0:ac4dea3e2894 141 HrmResult = sample.hr / 10;
seyhmus.cacina 0:ac4dea3e2894 142 HrmConfidence = sample.hr_conf;
seyhmus.cacina 0:ac4dea3e2894 143 SERIALOUT("hr_c=%d\r\n", HrmResult);
seyhmus.cacina 0:ac4dea3e2894 144 #if defined(DEBUG_INFO)
seyhmus.cacina 0:ac4dea3e2894 145 SERIALOUT("hr=%.1f conf=%d status=%d\r\n", (float)sample.hr / 10.0, sample.hr_conf, sample.status);
seyhmus.cacina 0:ac4dea3e2894 146 #endif
seyhmus.cacina 0:ac4dea3e2894 147 //enqueue(&whrm_queue, &sample);
seyhmus.cacina 0:ac4dea3e2894 148 }
seyhmus.cacina 0:ac4dea3e2894 149
seyhmus.cacina 0:ac4dea3e2894 150 void accel_data_rx(uint8_t* data_ptr) {
seyhmus.cacina 0:ac4dea3e2894 151 //See API doc for data format
seyhmus.cacina 0:ac4dea3e2894 152 accel_mode1_data sample;
seyhmus.cacina 0:ac4dea3e2894 153 sample.x = (data_ptr[0] << 8) | data_ptr[1];
seyhmus.cacina 0:ac4dea3e2894 154 sample.y = (data_ptr[2] << 8) | data_ptr[3];
seyhmus.cacina 0:ac4dea3e2894 155 sample.z = (data_ptr[4] << 8) | data_ptr[5];
seyhmus.cacina 0:ac4dea3e2894 156 #if defined(DEBUG_INFO)
seyhmus.cacina 0:ac4dea3e2894 157 //SERIALOUT("x:%d, y:%d, z:%d\r\n", sample.x, sample.y, sample.z);
seyhmus.cacina 0:ac4dea3e2894 158 #endif
seyhmus.cacina 0:ac4dea3e2894 159 }
seyhmus.cacina 0:ac4dea3e2894 160
seyhmus.cacina 0:ac4dea3e2894 161 void agc_data_rx(uint8_t* data_ptr) {
seyhmus.cacina 0:ac4dea3e2894 162 //NOP: AGC does not collect data
seyhmus.cacina 0:ac4dea3e2894 163 }
seyhmus.cacina 0:ac4dea3e2894 164 // end of Max8614x Default Callbacks
seyhmus.cacina 0:ac4dea3e2894 165
seyhmus.cacina 0:ac4dea3e2894 166
seyhmus.cacina 0:ac4dea3e2894 167 static Max86140_SH_Status_Tracker * get_config_struct() {
seyhmus.cacina 0:ac4dea3e2894 168
seyhmus.cacina 0:ac4dea3e2894 169 /* assigns a static adress to configuration struct*/
seyhmus.cacina 0:ac4dea3e2894 170 static Max86140_SH_Status_Tracker glbl_max8614x_status_track;
seyhmus.cacina 0:ac4dea3e2894 171 return &glbl_max8614x_status_track;
seyhmus.cacina 0:ac4dea3e2894 172 }
seyhmus.cacina 0:ac4dea3e2894 173
seyhmus.cacina 0:ac4dea3e2894 174 void initialize_config_struct() {
seyhmus.cacina 0:ac4dea3e2894 175 Max86140_SH_Status_Tracker *p_glbl_max8614x_status_track = get_config_struct();
seyhmus.cacina 0:ac4dea3e2894 176 /*
seyhmus.cacina 0:ac4dea3e2894 177 * Desc: Configuration init flow, Perform this action at init stage of data acquisition. Raw sesnsor data buffer pointer is input to each
seyhmus.cacina 0:ac4dea3e2894 178 * enabled sensor/algorithm,s funtion that is responsible to extract numeric data from data byte stream from sensor hub.
seyhmus.cacina 0:ac4dea3e2894 179 *
seyhmus.cacina 0:ac4dea3e2894 180 * - Append Sensor Raw Data structure with raw sensor data sample size and pointer to function of sensor that is reposible to parse
seyhmus.cacina 0:ac4dea3e2894 181 * data byte stream from sesnor hub and extract sensor numeric data.
seyhmus.cacina 0:ac4dea3e2894 182 * - Append accompanying sensors to main state of sensor. ie Accelerometer from Host with sensor data sample size and pointer to function of
seyhmus.cacina 0:ac4dea3e2894 183 * sensor that is reposible to parse data byte stream from sesnor hub and extract sensor numeric data.
seyhmus.cacina 0:ac4dea3e2894 184 * - Append algorithms to be enabled with algorithm data sample size and pointer to function of
seyhmus.cacina 0:ac4dea3e2894 185 * algorithm that is reposible to parse data byte stream from sensor hub and extract sensor numeric data.
seyhmus.cacina 0:ac4dea3e2894 186 *
seyhmus.cacina 0:ac4dea3e2894 187 * */
seyhmus.cacina 0:ac4dea3e2894 188
seyhmus.cacina 0:ac4dea3e2894 189 //set all the values to 0
seyhmus.cacina 0:ac4dea3e2894 190 memset(p_glbl_max8614x_status_track, 0, sizeof(*p_glbl_max8614x_status_track));
seyhmus.cacina 0:ac4dea3e2894 191 // max8614x
seyhmus.cacina 0:ac4dea3e2894 192 p_glbl_max8614x_status_track->sensor_callbacks[SH_SENSORIDX_MAX8614X].data_size = SSMAX8614X_MODE1_DATASIZE;
seyhmus.cacina 0:ac4dea3e2894 193 p_glbl_max8614x_status_track->sensor_callbacks[SH_SENSORIDX_MAX8614X].rx_data_parser = &max8614x_data_rx;
seyhmus.cacina 0:ac4dea3e2894 194 // accelerometer
seyhmus.cacina 0:ac4dea3e2894 195 p_glbl_max8614x_status_track->sensor_callbacks[SH_SENSORIDX_ACCEL].data_size = SSACCEL_MODE1_DATASIZE;
seyhmus.cacina 0:ac4dea3e2894 196 p_glbl_max8614x_status_track->sensor_callbacks[SH_SENSORIDX_ACCEL].rx_data_parser = &accel_data_rx;
seyhmus.cacina 0:ac4dea3e2894 197 // whrm NOTE: do not register aec and scd as they do not have data reporter callbacks and defined within WHRM suite. Look at 8614c command table for aec/scd on/off !!!!
seyhmus.cacina 0:ac4dea3e2894 198 p_glbl_max8614x_status_track->algo_callbacks[SH_ALGOIDX_WHRM].data_size = SSWHRM_MODE1_DATASIZE;
seyhmus.cacina 0:ac4dea3e2894 199 p_glbl_max8614x_status_track->algo_callbacks[SH_ALGOIDX_WHRM].rx_data_parser = &whrm_data_rx;
seyhmus.cacina 0:ac4dea3e2894 200
seyhmus.cacina 0:ac4dea3e2894 201 }
seyhmus.cacina 0:ac4dea3e2894 202
seyhmus.cacina 0:ac4dea3e2894 203
seyhmus.cacina 0:ac4dea3e2894 204 void SH_Max8614x_get_reg(uint8_t addr, uint32_t *val) {
seyhmus.cacina 0:ac4dea3e2894 205 int status = sh_get_reg(SH_SENSORIDX_MAX8614X, addr, val);
seyhmus.cacina 0:ac4dea3e2894 206
seyhmus.cacina 0:ac4dea3e2894 207 if (status == 0) {
seyhmus.cacina 0:ac4dea3e2894 208 __DBGMESSAGE("\r\n reg_val=%02X err=0 \r\n", ((uint8_t)*val))
seyhmus.cacina 0:ac4dea3e2894 209 } else {
seyhmus.cacina 0:ac4dea3e2894 210 __DBGMESSAGE("\r\n err=%d\r\n", -1)
seyhmus.cacina 0:ac4dea3e2894 211 }
seyhmus.cacina 0:ac4dea3e2894 212
seyhmus.cacina 0:ac4dea3e2894 213 return;
seyhmus.cacina 0:ac4dea3e2894 214 }
seyhmus.cacina 0:ac4dea3e2894 215
seyhmus.cacina 0:ac4dea3e2894 216 int CSTMR_SH_FeedAccDataIntoSH(Max86140_SH_Status_Tracker_t *p_max8614x_status_track) {
seyhmus.cacina 0:ac4dea3e2894 217 static accel_data_t peek_buf[MAX_NUM_WR_ACC_SAMPLES];
seyhmus.cacina 0:ac4dea3e2894 218 static uint8_t tx_buf[MAX_NUM_WR_ACC_SAMPLES * sizeof(accel_mode1_data) + 2]; // 2 bytes for the command
seyhmus.cacina 0:ac4dea3e2894 219 if(!p_max8614x_status_track->sensor_data_from_host) {
seyhmus.cacina 0:ac4dea3e2894 220 return -1;
seyhmus.cacina 0:ac4dea3e2894 221 } else {
seyhmus.cacina 0:ac4dea3e2894 222 accel_data_t accel_data = {0};
seyhmus.cacina 0:ac4dea3e2894 223 accel_mode1_data acc_sample;
seyhmus.cacina 0:ac4dea3e2894 224 int num_tx, num_samples, num_bytes = 0, num_wr_bytes = 0;
seyhmus.cacina 0:ac4dea3e2894 225 int num_written_samples, nb_expected;
seyhmus.cacina 0:ac4dea3e2894 226 int ret = 0;
seyhmus.cacina 0:ac4dea3e2894 227
seyhmus.cacina 0:ac4dea3e2894 228 // get accelerometer data
seyhmus.cacina 0:ac4dea3e2894 229 ret = CSTMR_SH_HostAccelerometerGet_sensor_xyz(&accel_data);
seyhmus.cacina 0:ac4dea3e2894 230 if (ret < 0)
seyhmus.cacina 0:ac4dea3e2894 231 return ret;
seyhmus.cacina 0:ac4dea3e2894 232
seyhmus.cacina 0:ac4dea3e2894 233 if(CSTMR_SH_HostAccelerometerEnqueueData(&accel_data) != 0) {
seyhmus.cacina 0:ac4dea3e2894 234 __DBGMESSAGE("Thrown an accel sample\n", NULL)
seyhmus.cacina 0:ac4dea3e2894 235 }
seyhmus.cacina 0:ac4dea3e2894 236
seyhmus.cacina 0:ac4dea3e2894 237 if(CSTMR_SH_HostAccelerometerGetDataCount() < MAX_NUM_WR_ACC_SAMPLES) {
seyhmus.cacina 0:ac4dea3e2894 238 return -1;
seyhmus.cacina 0:ac4dea3e2894 239 }
seyhmus.cacina 0:ac4dea3e2894 240
seyhmus.cacina 0:ac4dea3e2894 241 ret = sh_get_num_bytes_in_input_fifo(&num_bytes);
seyhmus.cacina 0:ac4dea3e2894 242 if (ret != 0) {
seyhmus.cacina 0:ac4dea3e2894 243 __DBGMESSAGE("Unable to read num bytes in input fifo\r\n", NULL)
seyhmus.cacina 0:ac4dea3e2894 244 return -1;
seyhmus.cacina 0:ac4dea3e2894 245 }
seyhmus.cacina 0:ac4dea3e2894 246 num_tx = p_max8614x_status_track->input_fifo_size - num_bytes;
seyhmus.cacina 0:ac4dea3e2894 247 if (num_tx <= 0) {
seyhmus.cacina 0:ac4dea3e2894 248 __DBGMESSAGE("num_tx can't be negative\r\n",NULL)
seyhmus.cacina 0:ac4dea3e2894 249 return -1;
seyhmus.cacina 0:ac4dea3e2894 250 }
seyhmus.cacina 0:ac4dea3e2894 251 num_samples = num_tx / sizeof(accel_mode1_data);
seyhmus.cacina 0:ac4dea3e2894 252 num_samples = MIN_MACRO(num_samples, MAX_NUM_WR_ACC_SAMPLES);
seyhmus.cacina 0:ac4dea3e2894 253 num_tx = num_samples * sizeof(accel_mode1_data);
seyhmus.cacina 0:ac4dea3e2894 254 if (num_samples == 0) {
seyhmus.cacina 0:ac4dea3e2894 255 __DBGMESSAGE("Input FIFO is Full\r\n",NULL)
seyhmus.cacina 0:ac4dea3e2894 256 return -1;
seyhmus.cacina 0:ac4dea3e2894 257 }
seyhmus.cacina 0:ac4dea3e2894 258
seyhmus.cacina 0:ac4dea3e2894 259 for(int i = 0; i < num_samples; ++i) {
seyhmus.cacina 0:ac4dea3e2894 260 ret |= CSTMR_SH_HostAccelerometerDequeuData(&peek_buf[i]);
seyhmus.cacina 0:ac4dea3e2894 261 }
seyhmus.cacina 0:ac4dea3e2894 262 if (ret != 0) {
seyhmus.cacina 0:ac4dea3e2894 263 __DBGMESSAGE("CSTMR_SH_HostAccelerometerDequeuData failed\r\n",NULL)
seyhmus.cacina 0:ac4dea3e2894 264 return -1;
seyhmus.cacina 0:ac4dea3e2894 265 }
seyhmus.cacina 0:ac4dea3e2894 266
seyhmus.cacina 0:ac4dea3e2894 267
seyhmus.cacina 0:ac4dea3e2894 268 for (int i = 2, j = 0; j < num_samples; i+= sizeof(accel_mode1_data), j++) {
seyhmus.cacina 0:ac4dea3e2894 269 accel_data = peek_buf[j];
seyhmus.cacina 0:ac4dea3e2894 270 acc_sample.x = (int16_t)(accel_data.x*1000);
seyhmus.cacina 0:ac4dea3e2894 271 acc_sample.y = (int16_t)(accel_data.y*1000);
seyhmus.cacina 0:ac4dea3e2894 272 acc_sample.z = (int16_t)(accel_data.z*1000);
seyhmus.cacina 0:ac4dea3e2894 273 tx_buf[i] = acc_sample.x;
seyhmus.cacina 0:ac4dea3e2894 274 tx_buf[i + 1] = acc_sample.x >> 8;
seyhmus.cacina 0:ac4dea3e2894 275 tx_buf[i + 2] = acc_sample.y;
seyhmus.cacina 0:ac4dea3e2894 276 tx_buf[i + 3] = acc_sample.y >> 8;
seyhmus.cacina 0:ac4dea3e2894 277 tx_buf[i + 4] = acc_sample.z;
seyhmus.cacina 0:ac4dea3e2894 278 tx_buf[i + 5] = acc_sample.z >> 8;
seyhmus.cacina 0:ac4dea3e2894 279
seyhmus.cacina 0:ac4dea3e2894 280 }
seyhmus.cacina 0:ac4dea3e2894 281
seyhmus.cacina 0:ac4dea3e2894 282 ret = sh_feed_to_input_fifo(tx_buf, num_tx + 2, &num_wr_bytes);
seyhmus.cacina 0:ac4dea3e2894 283 if(ret != 0) {
seyhmus.cacina 0:ac4dea3e2894 284 __DBGMESSAGE("sh_feed_to_input_fifo\r\n",NULL)
seyhmus.cacina 0:ac4dea3e2894 285 return -1;
seyhmus.cacina 0:ac4dea3e2894 286 }
seyhmus.cacina 0:ac4dea3e2894 287 num_written_samples = num_wr_bytes / sizeof(accel_mode1_data);
seyhmus.cacina 0:ac4dea3e2894 288 if(num_written_samples != num_samples) {
seyhmus.cacina 0:ac4dea3e2894 289 __DBGMESSAGE("num_written_samples failed\r\n",NULL)
seyhmus.cacina 0:ac4dea3e2894 290 return -1;
seyhmus.cacina 0:ac4dea3e2894 291 }
seyhmus.cacina 0:ac4dea3e2894 292 }
seyhmus.cacina 0:ac4dea3e2894 293 return 0;
seyhmus.cacina 0:ac4dea3e2894 294 }
seyhmus.cacina 0:ac4dea3e2894 295
seyhmus.cacina 0:ac4dea3e2894 296
seyhmus.cacina 0:ac4dea3e2894 297 void SH_Max8614x_set_reg(uint8_t addr, uint32_t val) {
seyhmus.cacina 0:ac4dea3e2894 298 int status;
seyhmus.cacina 0:ac4dea3e2894 299 status = sh_set_reg(SH_SENSORIDX_MAX8614X, addr, val, SSMAX8614X_REG_SIZE);
seyhmus.cacina 0:ac4dea3e2894 300 __DBGMESSAGE("\r\n err=%d\r\n", status);
seyhmus.cacina 0:ac4dea3e2894 301 }
seyhmus.cacina 0:ac4dea3e2894 302
seyhmus.cacina 0:ac4dea3e2894 303
seyhmus.cacina 0:ac4dea3e2894 304
seyhmus.cacina 0:ac4dea3e2894 305 int SH_Max8614x_data_report_execute(void) {
seyhmus.cacina 0:ac4dea3e2894 306
seyhmus.cacina 0:ac4dea3e2894 307 int num_samples, databufLen;
seyhmus.cacina 0:ac4dea3e2894 308 uint8_t *databuf;
seyhmus.cacina 0:ac4dea3e2894 309
seyhmus.cacina 0:ac4dea3e2894 310
seyhmus.cacina 0:ac4dea3e2894 311 Max86140_SH_Status_Tracker_t *p_glbl_max8614x_status_track = get_config_struct();
seyhmus.cacina 0:ac4dea3e2894 312
seyhmus.cacina 0:ac4dea3e2894 313 // prepare the buffer to store the results
seyhmus.cacina 0:ac4dea3e2894 314 databuf = p_glbl_max8614x_status_track->data_buf_storage;
seyhmus.cacina 0:ac4dea3e2894 315 databufLen = sizeof(p_glbl_max8614x_status_track->data_buf_storage);
seyhmus.cacina 0:ac4dea3e2894 316
seyhmus.cacina 0:ac4dea3e2894 317 // poll SH
seyhmus.cacina 0:ac4dea3e2894 318 sh_ss_execute_once(databuf, databufLen, &num_samples);
seyhmus.cacina 0:ac4dea3e2894 319 //__DBGMESSAGE( "nsamplesFIFO: %d \r\n" , num_samples)
seyhmus.cacina 0:ac4dea3e2894 320
seyhmus.cacina 0:ac4dea3e2894 321 if(num_samples > 0 && num_samples <255) {
seyhmus.cacina 0:ac4dea3e2894 322 //Skip status byte
seyhmus.cacina 0:ac4dea3e2894 323 uint8_t *data_ptr = &databuf[1];
seyhmus.cacina 0:ac4dea3e2894 324
seyhmus.cacina 0:ac4dea3e2894 325 int i = 0;
seyhmus.cacina 0:ac4dea3e2894 326 for (i = 0; i < num_samples; i++) {
seyhmus.cacina 0:ac4dea3e2894 327 int sh_data_type = p_glbl_max8614x_status_track->data_type_enabled;
seyhmus.cacina 0:ac4dea3e2894 328 if (p_glbl_max8614x_status_track->sample_count_enabled) {
seyhmus.cacina 0:ac4dea3e2894 329 p_glbl_max8614x_status_track->sample_count = *data_ptr++;
seyhmus.cacina 0:ac4dea3e2894 330 }
seyhmus.cacina 0:ac4dea3e2894 331 //Chop up data and send to modules with enabled sensors
seyhmus.cacina 0:ac4dea3e2894 332 if (sh_data_type == SS_DATATYPE_RAW || sh_data_type == SS_DATATYPE_BOTH) {
seyhmus.cacina 0:ac4dea3e2894 333 for (int i = 0; i < SH_NUM_CURRENT_SENSORS; i++) {
seyhmus.cacina 0:ac4dea3e2894 334 if (p_glbl_max8614x_status_track->sensor_enabled_mode[i]) {
seyhmus.cacina 0:ac4dea3e2894 335 p_glbl_max8614x_status_track->sensor_callbacks[i].rx_data_parser(data_ptr);
seyhmus.cacina 0:ac4dea3e2894 336 data_ptr += p_glbl_max8614x_status_track->sensor_callbacks[i].data_size;
seyhmus.cacina 0:ac4dea3e2894 337 }
seyhmus.cacina 0:ac4dea3e2894 338 }
seyhmus.cacina 0:ac4dea3e2894 339 }
seyhmus.cacina 0:ac4dea3e2894 340 if (sh_data_type == SS_DATATYPE_ALGO || sh_data_type == SS_DATATYPE_BOTH) {
seyhmus.cacina 0:ac4dea3e2894 341 for (int i = 0; i < SH_NUM_CURRENT_ALGOS; i++) {
seyhmus.cacina 0:ac4dea3e2894 342 if (p_glbl_max8614x_status_track->algo_enabled_mode[i]) {
seyhmus.cacina 0:ac4dea3e2894 343 p_glbl_max8614x_status_track->algo_callbacks[i].rx_data_parser(data_ptr);
seyhmus.cacina 0:ac4dea3e2894 344 data_ptr += p_glbl_max8614x_status_track->algo_callbacks[i].data_size;
seyhmus.cacina 0:ac4dea3e2894 345 }
seyhmus.cacina 0:ac4dea3e2894 346 }
seyhmus.cacina 0:ac4dea3e2894 347 }
seyhmus.cacina 0:ac4dea3e2894 348 }
seyhmus.cacina 0:ac4dea3e2894 349 /* JUST*/
seyhmus.cacina 0:ac4dea3e2894 350 CSTMR_SH_FeedAccDataIntoSH(p_glbl_max8614x_status_track);
seyhmus.cacina 0:ac4dea3e2894 351 }
seyhmus.cacina 0:ac4dea3e2894 352 // feed accelerometer into me11
seyhmus.cacina 0:ac4dea3e2894 353 //////////////////CSTMR_SH_FeedAccDataIntoSH(p_glbl_max8614x_status_track);
seyhmus.cacina 0:ac4dea3e2894 354
seyhmus.cacina 0:ac4dea3e2894 355
seyhmus.cacina 0:ac4dea3e2894 356 return num_samples;
seyhmus.cacina 0:ac4dea3e2894 357 }
seyhmus.cacina 0:ac4dea3e2894 358
seyhmus.cacina 0:ac4dea3e2894 359 int SH_Max8614x_algo_init(enum enAlgoMode paramAlgoMode) {
seyhmus.cacina 0:ac4dea3e2894 360
seyhmus.cacina 0:ac4dea3e2894 361 /*
seyhmus.cacina 0:ac4dea3e2894 362 *
seyhmus.cacina 0:ac4dea3e2894 363 * */
seyhmus.cacina 0:ac4dea3e2894 364 int status;
seyhmus.cacina 0:ac4dea3e2894 365 Max86140_SH_Status_Tracker_t *p_glbl_max8614x_status_track = get_config_struct();
seyhmus.cacina 0:ac4dea3e2894 366 if(p_glbl_max8614x_status_track->algo_enabled_mode[SH_ALGOIDX_WHRM]) {
seyhmus.cacina 0:ac4dea3e2894 367 __DBGMESSAGE("\r\n Algo already enabled\r\n",NULL)
seyhmus.cacina 0:ac4dea3e2894 368 return -1;
seyhmus.cacina 0:ac4dea3e2894 369 }
seyhmus.cacina 0:ac4dea3e2894 370
seyhmus.cacina 0:ac4dea3e2894 371 if(paramAlgoMode == kAlgoModeHeartRate) {
seyhmus.cacina 0:ac4dea3e2894 372 status = sh_enable_algo(SH_ALGOIDX_WHRM, SSWHRM_MODE1_DATASIZE);
seyhmus.cacina 0:ac4dea3e2894 373 if (status != SS_SUCCESS) {
seyhmus.cacina 0:ac4dea3e2894 374 __DBGMESSAGE("\r\n err=%d\r\n", COMM_GENERAL_ERROR)
seyhmus.cacina 0:ac4dea3e2894 375 __DBGMESSAGE("FAILED at line %d, enable whrm\n", __LINE__)
seyhmus.cacina 0:ac4dea3e2894 376 return status;
seyhmus.cacina 0:ac4dea3e2894 377 }
seyhmus.cacina 0:ac4dea3e2894 378 p_glbl_max8614x_status_track->algo_enabled_mode[SH_ALGOIDX_WHRM] = 0x01;
seyhmus.cacina 0:ac4dea3e2894 379 }
seyhmus.cacina 0:ac4dea3e2894 380 }
seyhmus.cacina 0:ac4dea3e2894 381
seyhmus.cacina 0:ac4dea3e2894 382
seyhmus.cacina 0:ac4dea3e2894 383
seyhmus.cacina 0:ac4dea3e2894 384 int SH_Max8614x_default_init(enum enAlgoMode paramAlgoMode) {
seyhmus.cacina 0:ac4dea3e2894 385 /*
seyhmus.cacina 0:ac4dea3e2894 386 * Desc: Initialization flow to get algorithm estimation results:
seyhmus.cacina 0:ac4dea3e2894 387 * 1. initialize algorithm config struct
seyhmus.cacina 0:ac4dea3e2894 388 * 2. enable data type to both raw sensor and algorithm data
seyhmus.cacina 0:ac4dea3e2894 389 * 3. get input fifo size to learn fifo capacity
seyhmus.cacina 0:ac4dea3e2894 390 * 4. set fifo threshold for mfio event frequency
seyhmus.cacina 0:ac4dea3e2894 391 * 5. enable sensor to acquire ppg data
seyhmus.cacina 0:ac4dea3e2894 392 * 6. enable accompanying accel sensor
seyhmus.cacina 0:ac4dea3e2894 393 * 7. enable algorithm
seyhmus.cacina 0:ac4dea3e2894 394 * 8. Sensor Hub now starts to write raw sensor/algorithm data to its data report FIFO which
seyhmus.cacina 0:ac4dea3e2894 395 * reports mfio event when data size determined by fifo threshold is written to report fifo
seyhmus.cacina 0:ac4dea3e2894 396 * data can be read by SH_Max8614x_data_report_execute function.
seyhmus.cacina 0:ac4dea3e2894 397 *
seyhmus.cacina 0:ac4dea3e2894 398 * */
seyhmus.cacina 0:ac4dea3e2894 399
seyhmus.cacina 0:ac4dea3e2894 400 int status;
seyhmus.cacina 0:ac4dea3e2894 401
seyhmus.cacina 0:ac4dea3e2894 402 // first initialize the global config struct
seyhmus.cacina 0:ac4dea3e2894 403 initialize_config_struct();
seyhmus.cacina 0:ac4dea3e2894 404 Max86140_SH_Status_Tracker_t *p_glbl_max8614x_status_track = get_config_struct();
seyhmus.cacina 0:ac4dea3e2894 405
seyhmus.cacina 0:ac4dea3e2894 406 // get input fifo size
seyhmus.cacina 0:ac4dea3e2894 407 status = sh_get_input_fifo_size(&p_glbl_max8614x_status_track->input_fifo_size);
seyhmus.cacina 0:ac4dea3e2894 408 if (status != SS_SUCCESS) {
seyhmus.cacina 0:ac4dea3e2894 409 __DBGMESSAGE("\r\n err=%d\r\n", COMM_GENERAL_ERROR)
seyhmus.cacina 0:ac4dea3e2894 410 __DBGMESSAGE("FAILED at line %d\n", __LINE__)
seyhmus.cacina 0:ac4dea3e2894 411 return COMM_GENERAL_ERROR;;
seyhmus.cacina 0:ac4dea3e2894 412 }
seyhmus.cacina 0:ac4dea3e2894 413
seyhmus.cacina 0:ac4dea3e2894 414 // enable both data stype
seyhmus.cacina 0:ac4dea3e2894 415 p_glbl_max8614x_status_track->data_type_enabled = SS_DATATYPE_BOTH;
seyhmus.cacina 0:ac4dea3e2894 416 p_glbl_max8614x_status_track->sample_count_enabled = false;
seyhmus.cacina 0:ac4dea3e2894 417 status = sh_set_data_type(p_glbl_max8614x_status_track->data_type_enabled,
seyhmus.cacina 0:ac4dea3e2894 418 p_glbl_max8614x_status_track->sample_count_enabled);
seyhmus.cacina 0:ac4dea3e2894 419 if (status != 0) {
seyhmus.cacina 0:ac4dea3e2894 420 __DBGMESSAGE("\r\n err=%d\r\n", COMM_GENERAL_ERROR)
seyhmus.cacina 0:ac4dea3e2894 421 __DBGMESSAGE("FAILED at line %d\n", __LINE__)
seyhmus.cacina 0:ac4dea3e2894 422 return COMM_GENERAL_ERROR;
seyhmus.cacina 0:ac4dea3e2894 423 }
seyhmus.cacina 0:ac4dea3e2894 424
seyhmus.cacina 0:ac4dea3e2894 425 status = sh_set_fifo_thresh(5);
seyhmus.cacina 0:ac4dea3e2894 426 if (status != 0) {
seyhmus.cacina 0:ac4dea3e2894 427 __DBGMESSAGE("\r\n err=%d\r\n", COMM_GENERAL_ERROR)
seyhmus.cacina 0:ac4dea3e2894 428 __DBGMESSAGE("FAILED at line %d\n", __LINE__)
seyhmus.cacina 0:ac4dea3e2894 429 return COMM_GENERAL_ERROR;
seyhmus.cacina 0:ac4dea3e2894 430 }
seyhmus.cacina 0:ac4dea3e2894 431
seyhmus.cacina 0:ac4dea3e2894 432
seyhmus.cacina 0:ac4dea3e2894 433
seyhmus.cacina 0:ac4dea3e2894 434 status = sh_sensor_enable(SH_SENSORIDX_MAX8614X, SSMAX8614X_MODE1_DATASIZE, SH_INPUT_DATA_DIRECT_SENSOR);
seyhmus.cacina 0:ac4dea3e2894 435 if (status != 0) {
seyhmus.cacina 0:ac4dea3e2894 436 __DBGMESSAGE("\r\n err=%d\r\n", COMM_GENERAL_ERROR)
seyhmus.cacina 0:ac4dea3e2894 437 __DBGMESSAGE("FAILED at line %d\n", __LINE__)
seyhmus.cacina 0:ac4dea3e2894 438 return COMM_GENERAL_ERROR;
seyhmus.cacina 0:ac4dea3e2894 439 }
seyhmus.cacina 0:ac4dea3e2894 440 p_glbl_max8614x_status_track->sensor_enabled_mode[SH_SENSORIDX_MAX8614X] = 0x01;
seyhmus.cacina 0:ac4dea3e2894 441
seyhmus.cacina 0:ac4dea3e2894 442 #ifdef ENABLE_SENSOR_HUB_ACCEL
seyhmus.cacina 0:ac4dea3e2894 443 status = sh_sensor_enable(SH_SENSORIDX_ACCEL, SSACCEL_MODE1_DATASIZE, SH_INPUT_DATA_DIRECT_SENSOR);
seyhmus.cacina 0:ac4dea3e2894 444 if (status != SS_SUCCESS) {
seyhmus.cacina 0:ac4dea3e2894 445 __DBGMESSAGE("\r\n err=%d\r\n", COMM_GENERAL_ERROR)
seyhmus.cacina 0:ac4dea3e2894 446 __DBGMESSAGE("FAILED at line %d\n", __LINE__)
seyhmus.cacina 0:ac4dea3e2894 447 }
seyhmus.cacina 0:ac4dea3e2894 448 p_glbl_max8614x_status_track->sensor_data_from_host = false;
seyhmus.cacina 0:ac4dea3e2894 449 p_glbl_max8614x_status_track->sensor_enabled_mode[SH_SENSORIDX_ACCEL] = 0x01;
seyhmus.cacina 0:ac4dea3e2894 450 #elif defined(USE_HOST_ACCEL)
seyhmus.cacina 0:ac4dea3e2894 451 CSTMR_SH_HostAccelerometerInitialize();
seyhmus.cacina 0:ac4dea3e2894 452 CSTMR_SH_HostAccelerometerSetDefaults();
seyhmus.cacina 0:ac4dea3e2894 453 status = CSTMR_SH_HostAccelerometerSetSampleRate(BMI160_SAMPLE_RATE);
seyhmus.cacina 0:ac4dea3e2894 454 if (status != 0) {
seyhmus.cacina 0:ac4dea3e2894 455 __DBGMESSAGE("Unable to set BMI160's sample rate\n",NULL)
seyhmus.cacina 0:ac4dea3e2894 456 __DBGMESSAGE("\r\n err=%d\r\n", COMM_GENERAL_ERROR)
seyhmus.cacina 0:ac4dea3e2894 457 __DBGMESSAGE("FAILED at line %d\n", __LINE__)
seyhmus.cacina 0:ac4dea3e2894 458 return status;
seyhmus.cacina 0:ac4dea3e2894 459 }
seyhmus.cacina 0:ac4dea3e2894 460
seyhmus.cacina 0:ac4dea3e2894 461 status = CSTMR_SH_HostAccelerometerEnableDataReadyInterrupt();
seyhmus.cacina 0:ac4dea3e2894 462 if(status != 0){
seyhmus.cacina 0:ac4dea3e2894 463 __DBGMESSAGE("Unable to enable BMI160 Interrupt, ret: %d\n", status)
seyhmus.cacina 0:ac4dea3e2894 464 return status;
seyhmus.cacina 0:ac4dea3e2894 465 }
seyhmus.cacina 0:ac4dea3e2894 466
seyhmus.cacina 0:ac4dea3e2894 467 status = sh_sensor_enable(SH_SENSORIDX_ACCEL, SSACCEL_MODE1_DATASIZE, SH_INPUT_DATA_FROM_HOST);
seyhmus.cacina 0:ac4dea3e2894 468 if (status != 0) {
seyhmus.cacina 0:ac4dea3e2894 469 __DBGMESSAGE("\r\n err=%d\r\n", COMM_GENERAL_ERROR)
seyhmus.cacina 0:ac4dea3e2894 470 __DBGMESSAGE("FAILED at line %d\n", __LINE__)
seyhmus.cacina 0:ac4dea3e2894 471 return status;
seyhmus.cacina 0:ac4dea3e2894 472 }
seyhmus.cacina 0:ac4dea3e2894 473 p_glbl_max8614x_status_track->sensor_data_from_host = true;
seyhmus.cacina 0:ac4dea3e2894 474 p_glbl_max8614x_status_track->sensor_enabled_mode[SH_SENSORIDX_ACCEL] = 0x01;
seyhmus.cacina 0:ac4dea3e2894 475 #endif
seyhmus.cacina 0:ac4dea3e2894 476 status = SH_Max8614x_algo_init(paramAlgoMode);
seyhmus.cacina 0:ac4dea3e2894 477 if(status != 0) {
seyhmus.cacina 0:ac4dea3e2894 478 __DBGMESSAGE("AlgoInitFailed\r\n",NULL)
seyhmus.cacina 0:ac4dea3e2894 479 }
seyhmus.cacina 0:ac4dea3e2894 480
seyhmus.cacina 0:ac4dea3e2894 481 __DBGMESSAGE("\r\n err=%d\r\n", status)
seyhmus.cacina 0:ac4dea3e2894 482 return status;
seyhmus.cacina 0:ac4dea3e2894 483 }
seyhmus.cacina 0:ac4dea3e2894 484
seyhmus.cacina 0:ac4dea3e2894 485 void SH_Max8614x_stop() {
seyhmus.cacina 0:ac4dea3e2894 486
seyhmus.cacina 0:ac4dea3e2894 487 sh_disable_irq_mfioevent();
seyhmus.cacina 0:ac4dea3e2894 488 Max86140_SH_Status_Tracker_t *p_glbl_max8614x_status_track = get_config_struct();
seyhmus.cacina 0:ac4dea3e2894 489
seyhmus.cacina 0:ac4dea3e2894 490 for(int i = 0; i < SH_NUM_CURRENT_SENSORS; ++i) {
seyhmus.cacina 0:ac4dea3e2894 491 if(p_glbl_max8614x_status_track->sensor_enabled_mode[i]) {
seyhmus.cacina 0:ac4dea3e2894 492 p_glbl_max8614x_status_track->sensor_enabled_mode[i] = 0;
seyhmus.cacina 0:ac4dea3e2894 493 sh_sensor_disable(i);
seyhmus.cacina 0:ac4dea3e2894 494 }
seyhmus.cacina 0:ac4dea3e2894 495
seyhmus.cacina 0:ac4dea3e2894 496 }
seyhmus.cacina 0:ac4dea3e2894 497
seyhmus.cacina 0:ac4dea3e2894 498 for(int i = 0; i < SH_NUM_CURRENT_ALGOS; ++i) {
seyhmus.cacina 0:ac4dea3e2894 499 if(p_glbl_max8614x_status_track->algo_enabled_mode[i]) {
seyhmus.cacina 0:ac4dea3e2894 500 p_glbl_max8614x_status_track->algo_enabled_mode[i] = 0;
seyhmus.cacina 0:ac4dea3e2894 501 sh_disable_algo(i);
seyhmus.cacina 0:ac4dea3e2894 502 }
seyhmus.cacina 0:ac4dea3e2894 503 }
seyhmus.cacina 0:ac4dea3e2894 504
seyhmus.cacina 0:ac4dea3e2894 505 if(p_glbl_max8614x_status_track->sensor_data_from_host) {
seyhmus.cacina 0:ac4dea3e2894 506 CSTMR_SH_HostAccelerometerInitialize();
seyhmus.cacina 0:ac4dea3e2894 507 p_glbl_max8614x_status_track->sensor_data_from_host = 0;
seyhmus.cacina 0:ac4dea3e2894 508 }
seyhmus.cacina 0:ac4dea3e2894 509
seyhmus.cacina 0:ac4dea3e2894 510 sh_clear_mfio_event_flag();
seyhmus.cacina 0:ac4dea3e2894 511 sh_enable_irq_mfioevent();
seyhmus.cacina 0:ac4dea3e2894 512 }
seyhmus.cacina 0:ac4dea3e2894 513
seyhmus.cacina 0:ac4dea3e2894 514
seyhmus.cacina 0:ac4dea3e2894 515
seyhmus.cacina 0:ac4dea3e2894 516
seyhmus.cacina 0:ac4dea3e2894 517
seyhmus.cacina 0:ac4dea3e2894 518
seyhmus.cacina 0:ac4dea3e2894 519 /* **********************************************************************************************
seyhmus.cacina 0:ac4dea3e2894 520 * *
seyhmus.cacina 0:ac4dea3e2894 521 * COMMAND INTERFACE RELATED METHODS *
seyhmus.cacina 0:ac4dea3e2894 522 * *
seyhmus.cacina 0:ac4dea3e2894 523 * **********************************************************************************************/
seyhmus.cacina 0:ac4dea3e2894 524
seyhmus.cacina 0:ac4dea3e2894 525
seyhmus.cacina 0:ac4dea3e2894 526
seyhmus.cacina 0:ac4dea3e2894 527 //MYG: CHECK FOR STDIN WITH SSCANF < WHY THEY NEEDED PARSE_CMD????? PAY ATTENTION: HEX AND/OR DECIMAL PARAMETER ENRTY!!!
seyhmus.cacina 0:ac4dea3e2894 528
seyhmus.cacina 0:ac4dea3e2894 529
seyhmus.cacina 0:ac4dea3e2894 530 static int SH_Max8614x_set_singleparamcfg_(const char *cfg , const int algo_idx, const int cfg_idx , const int paramsz){
seyhmus.cacina 0:ac4dea3e2894 531 int status = -1;
seyhmus.cacina 0:ac4dea3e2894 532 uint32_t val;
seyhmus.cacina 0:ac4dea3e2894 533 if(paramsz == 1 || paramsz == 2) {
seyhmus.cacina 0:ac4dea3e2894 534 if( sscanf(cfg, "%*s %*s %*s %10x", &val) == 1 ){
seyhmus.cacina 0:ac4dea3e2894 535 uint8_t Temp[2] = { (uint8_t)((val >> 8) & 0xFF), (uint8_t) (val & 0xFF) };
seyhmus.cacina 0:ac4dea3e2894 536 status = sh_set_algo_cfg(algo_idx, cfg_idx , &Temp[2-paramsz], paramsz);
seyhmus.cacina 0:ac4dea3e2894 537 }
seyhmus.cacina 0:ac4dea3e2894 538 }
seyhmus.cacina 0:ac4dea3e2894 539 return status; // if command error return -1 if operational error return >0 error
seyhmus.cacina 0:ac4dea3e2894 540 }
seyhmus.cacina 0:ac4dea3e2894 541
seyhmus.cacina 0:ac4dea3e2894 542
seyhmus.cacina 0:ac4dea3e2894 543 static int SH_Max8614x_get_singleparamcfg_( const int algo_idx, const int cfg_idx ,const int paramsz, int *val){
seyhmus.cacina 0:ac4dea3e2894 544 // CMD: get_cfg spo2 samplerate
seyhmus.cacina 0:ac4dea3e2894 545
seyhmus.cacina 0:ac4dea3e2894 546 int tmp;
seyhmus.cacina 0:ac4dea3e2894 547 int status = -1;
seyhmus.cacina 0:ac4dea3e2894 548 uint8_t rxBuff[3]; // first byte is status 1/2 bytes cfgparam asked for.
seyhmus.cacina 0:ac4dea3e2894 549 if(paramsz == 1 || paramsz == 2) {
seyhmus.cacina 0:ac4dea3e2894 550 status = sh_get_algo_cfg(algo_idx, cfg_idx, &rxBuff[0], paramsz+1);
seyhmus.cacina 0:ac4dea3e2894 551 if( status == 0){
seyhmus.cacina 0:ac4dea3e2894 552 tmp = (int)((rxBuff[1]<<(8*(paramsz-1))) + rxBuff[2]*(paramsz-1)); // MYG: CHECK IF TRUE!
seyhmus.cacina 0:ac4dea3e2894 553 }else
seyhmus.cacina 0:ac4dea3e2894 554 tmp = -1;
seyhmus.cacina 0:ac4dea3e2894 555 }else
seyhmus.cacina 0:ac4dea3e2894 556 tmp = -1;
seyhmus.cacina 0:ac4dea3e2894 557
seyhmus.cacina 0:ac4dea3e2894 558 *val = tmp;
seyhmus.cacina 0:ac4dea3e2894 559 return status;
seyhmus.cacina 0:ac4dea3e2894 560 }
seyhmus.cacina 0:ac4dea3e2894 561
seyhmus.cacina 0:ac4dea3e2894 562
seyhmus.cacina 0:ac4dea3e2894 563
seyhmus.cacina 0:ac4dea3e2894 564
seyhmus.cacina 0:ac4dea3e2894 565
seyhmus.cacina 0:ac4dea3e2894 566 int SH_Max8614x_set_ppgreg(const char *addr_value_args){
seyhmus.cacina 0:ac4dea3e2894 567
seyhmus.cacina 0:ac4dea3e2894 568 //CMD: set_reg ppgsensor 0xAA 0xAA
seyhmus.cacina 0:ac4dea3e2894 569 int addr,val,status;
seyhmus.cacina 0:ac4dea3e2894 570 if( sscanf(addr_value_args,"%*s %*s %4x %10x", &addr , &addr ) == 2 ){
seyhmus.cacina 0:ac4dea3e2894 571 status = sh_set_reg(SH_SENSORIDX_MAX8614X, (uint8_t) addr, (uint32_t) val, SSMAX8614X_REG_SIZE);
seyhmus.cacina 0:ac4dea3e2894 572 if(status == 0)
seyhmus.cacina 0:ac4dea3e2894 573 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 574 }else
seyhmus.cacina 0:ac4dea3e2894 575 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 576
seyhmus.cacina 0:ac4dea3e2894 577 return status;
seyhmus.cacina 0:ac4dea3e2894 578 }
seyhmus.cacina 0:ac4dea3e2894 579
seyhmus.cacina 0:ac4dea3e2894 580 int SH_Max8614x_get_ppgreg(const char *addr_arg){
seyhmus.cacina 0:ac4dea3e2894 581
seyhmus.cacina 0:ac4dea3e2894 582 //CMD: get_reg ppgsensor 0xAA
seyhmus.cacina 0:ac4dea3e2894 583 int addr;
seyhmus.cacina 0:ac4dea3e2894 584 int status = -1;
seyhmus.cacina 0:ac4dea3e2894 585 uint32_t val;
seyhmus.cacina 0:ac4dea3e2894 586
seyhmus.cacina 0:ac4dea3e2894 587 if( sscanf(addr_arg,"%*s %*s %4x", &addr) == 1 ){
seyhmus.cacina 0:ac4dea3e2894 588 int status = sh_get_reg(SH_SENSORIDX_MAX8614X, (uint8_t) addr, &val);
seyhmus.cacina 0:ac4dea3e2894 589 if(status == 0)
seyhmus.cacina 0:ac4dea3e2894 590 SERIALOUT("reg_val=%02X \r\n",val);
seyhmus.cacina 0:ac4dea3e2894 591 }else
seyhmus.cacina 0:ac4dea3e2894 592 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 593
seyhmus.cacina 0:ac4dea3e2894 594 return status;
seyhmus.cacina 0:ac4dea3e2894 595 }
seyhmus.cacina 0:ac4dea3e2894 596
seyhmus.cacina 0:ac4dea3e2894 597 int SH_Max8614x_self_test_ppg(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 598
seyhmus.cacina 0:ac4dea3e2894 599 // MYG: mfio interaction needed!
seyhmus.cacina 0:ac4dea3e2894 600 return -1;
seyhmus.cacina 0:ac4dea3e2894 601 }
seyhmus.cacina 0:ac4dea3e2894 602
seyhmus.cacina 0:ac4dea3e2894 603 int SH_Max8614x_self_test_acc(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 604 // MYG: mfio interaction needed!
seyhmus.cacina 0:ac4dea3e2894 605 return -1;
seyhmus.cacina 0:ac4dea3e2894 606 }
seyhmus.cacina 0:ac4dea3e2894 607
seyhmus.cacina 0:ac4dea3e2894 608 //************************************WHRM METHODS***********************************************/
seyhmus.cacina 0:ac4dea3e2894 609
seyhmus.cacina 0:ac4dea3e2894 610 int SH_Max8614x_get_whrm_dataformat(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 611
seyhmus.cacina 0:ac4dea3e2894 612 SERIALOUT("\r\n format={smpleCnt,16},"
seyhmus.cacina 0:ac4dea3e2894 613 "{grnCnt,20},{grn2Cnt,20},{accelX,14,3},{accelY,14,3},"
seyhmus.cacina 0:ac4dea3e2894 614 "{accelZ,14,3},{hr,12},{hrconf,8},{spo2,11,1},{activity,8} err=0\r\n" );
seyhmus.cacina 0:ac4dea3e2894 615 return 0;
seyhmus.cacina 0:ac4dea3e2894 616 }
seyhmus.cacina 0:ac4dea3e2894 617
seyhmus.cacina 0:ac4dea3e2894 618 int SH_Max8614x_measure_whrm(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 619
seyhmus.cacina 0:ac4dea3e2894 620 int status;
seyhmus.cacina 0:ac4dea3e2894 621 SH_Max8614x_stop();
seyhmus.cacina 0:ac4dea3e2894 622 status = SH_Max8614x_default_init(kAlgoModeHeartRate);
seyhmus.cacina 0:ac4dea3e2894 623 if(status == 0)
seyhmus.cacina 0:ac4dea3e2894 624 SERIALOUT("whrm started \r\n");
seyhmus.cacina 0:ac4dea3e2894 625 else
seyhmus.cacina 0:ac4dea3e2894 626 SERIALOUT("ERR");
seyhmus.cacina 0:ac4dea3e2894 627
seyhmus.cacina 0:ac4dea3e2894 628 return status;
seyhmus.cacina 0:ac4dea3e2894 629 }
seyhmus.cacina 0:ac4dea3e2894 630
seyhmus.cacina 0:ac4dea3e2894 631 int SH_Max8614x_set_whrm_aecusage(const char *onoff_arg){
seyhmus.cacina 0:ac4dea3e2894 632
seyhmus.cacina 0:ac4dea3e2894 633 int status = SH_Max8614x_set_singleparamcfg_( onoff_arg , SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_AEC_ENABLE , 1 );
seyhmus.cacina 0:ac4dea3e2894 634 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 635 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 636 else {
seyhmus.cacina 0:ac4dea3e2894 637 if( status == -1)
seyhmus.cacina 0:ac4dea3e2894 638 SERIALOUT("CMDERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 639 else
seyhmus.cacina 0:ac4dea3e2894 640 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 641 }
seyhmus.cacina 0:ac4dea3e2894 642 return status;
seyhmus.cacina 0:ac4dea3e2894 643
seyhmus.cacina 0:ac4dea3e2894 644 }
seyhmus.cacina 0:ac4dea3e2894 645
seyhmus.cacina 0:ac4dea3e2894 646 int SH_Max8614x_get_whrm_aecusage(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 647
seyhmus.cacina 0:ac4dea3e2894 648 int val;
seyhmus.cacina 0:ac4dea3e2894 649 int status = SH_Max8614x_get_singleparamcfg_( SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_AEC_ENABLE, 1 , &val);
seyhmus.cacina 0:ac4dea3e2894 650 if(val != -1)
seyhmus.cacina 0:ac4dea3e2894 651 SERIALOUT("whrm_aec_usage= %d", val);
seyhmus.cacina 0:ac4dea3e2894 652 else
seyhmus.cacina 0:ac4dea3e2894 653 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 654
seyhmus.cacina 0:ac4dea3e2894 655 return status;
seyhmus.cacina 0:ac4dea3e2894 656
seyhmus.cacina 0:ac4dea3e2894 657 }
seyhmus.cacina 0:ac4dea3e2894 658
seyhmus.cacina 0:ac4dea3e2894 659 int SH_Max8614x_set_whrm_scdusage(const char *onoff_arg){
seyhmus.cacina 0:ac4dea3e2894 660
seyhmus.cacina 0:ac4dea3e2894 661 int status = SH_Max8614x_set_singleparamcfg_( onoff_arg , SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_ENABLE, 1 );
seyhmus.cacina 0:ac4dea3e2894 662 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 663 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 664 else {
seyhmus.cacina 0:ac4dea3e2894 665 if( status == -1)
seyhmus.cacina 0:ac4dea3e2894 666 SERIALOUT("CMDERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 667 else
seyhmus.cacina 0:ac4dea3e2894 668 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 669 }
seyhmus.cacina 0:ac4dea3e2894 670 return status;
seyhmus.cacina 0:ac4dea3e2894 671
seyhmus.cacina 0:ac4dea3e2894 672 }
seyhmus.cacina 0:ac4dea3e2894 673
seyhmus.cacina 0:ac4dea3e2894 674
seyhmus.cacina 0:ac4dea3e2894 675 int SH_Max8614x_get_whrm_scdusage(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 676
seyhmus.cacina 0:ac4dea3e2894 677 int val;
seyhmus.cacina 0:ac4dea3e2894 678 int status = SH_Max8614x_get_singleparamcfg_( SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_ENABLE, 1 , &val);
seyhmus.cacina 0:ac4dea3e2894 679 if(val != -1)
seyhmus.cacina 0:ac4dea3e2894 680 SERIALOUT("whrm_scd_usage= %d", val);
seyhmus.cacina 0:ac4dea3e2894 681 else
seyhmus.cacina 0:ac4dea3e2894 682 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 683
seyhmus.cacina 0:ac4dea3e2894 684 return status;
seyhmus.cacina 0:ac4dea3e2894 685
seyhmus.cacina 0:ac4dea3e2894 686 }
seyhmus.cacina 0:ac4dea3e2894 687
seyhmus.cacina 0:ac4dea3e2894 688 int SH_Max8614x_set_whrm_scdadjperiod(const char *period_arg){
seyhmus.cacina 0:ac4dea3e2894 689
seyhmus.cacina 0:ac4dea3e2894 690 int status = SH_Max8614x_set_singleparamcfg_(period_arg , SH_ALGOIDX_WHRM , SS_CFGIDX_WHRM_ADJ_TARGET_PD_CURRENT_PERIOD , 2);
seyhmus.cacina 0:ac4dea3e2894 691 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 692 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 693 else {
seyhmus.cacina 0:ac4dea3e2894 694 if( status == -1)
seyhmus.cacina 0:ac4dea3e2894 695 SERIALOUT("CMDERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 696 else
seyhmus.cacina 0:ac4dea3e2894 697 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 698 }
seyhmus.cacina 0:ac4dea3e2894 699 return status;
seyhmus.cacina 0:ac4dea3e2894 700 }
seyhmus.cacina 0:ac4dea3e2894 701
seyhmus.cacina 0:ac4dea3e2894 702 int SH_Max8614x_get_whrm_scdadjperiod(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 703
seyhmus.cacina 0:ac4dea3e2894 704 int val;
seyhmus.cacina 0:ac4dea3e2894 705 int status = SH_Max8614x_get_singleparamcfg_( SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_ADJ_TARGET_PD_CURRENT_PERIOD, 2, &val);
seyhmus.cacina 0:ac4dea3e2894 706 if(val != -1)
seyhmus.cacina 0:ac4dea3e2894 707 SERIALOUT("whrm_scd_adjperiod= 0x%x", val);
seyhmus.cacina 0:ac4dea3e2894 708 else
seyhmus.cacina 0:ac4dea3e2894 709 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 710
seyhmus.cacina 0:ac4dea3e2894 711 return status;
seyhmus.cacina 0:ac4dea3e2894 712
seyhmus.cacina 0:ac4dea3e2894 713 }
seyhmus.cacina 0:ac4dea3e2894 714
seyhmus.cacina 0:ac4dea3e2894 715 int SH_Max8614x_set_whrm_scddebouncewin(const char *dwindow_arg){
seyhmus.cacina 0:ac4dea3e2894 716
seyhmus.cacina 0:ac4dea3e2894 717 int status = SH_Max8614x_set_singleparamcfg_(dwindow_arg , SH_ALGOIDX_WHRM , SS_CFGIDX_WHRM_SCD_DEBOUNCE_WINDOW , 2);
seyhmus.cacina 0:ac4dea3e2894 718 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 719 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 720 else {
seyhmus.cacina 0:ac4dea3e2894 721 if( status == -1)
seyhmus.cacina 0:ac4dea3e2894 722 SERIALOUT("CMDERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 723 else
seyhmus.cacina 0:ac4dea3e2894 724 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 725 }
seyhmus.cacina 0:ac4dea3e2894 726 return status;
seyhmus.cacina 0:ac4dea3e2894 727
seyhmus.cacina 0:ac4dea3e2894 728 }
seyhmus.cacina 0:ac4dea3e2894 729 int SH_Max8614x_get_whrm_scddebouncewin(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 730
seyhmus.cacina 0:ac4dea3e2894 731 int val;
seyhmus.cacina 0:ac4dea3e2894 732 int status = SH_Max8614x_get_singleparamcfg_( SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_SCD_DEBOUNCE_WINDOW , 2, &val);
seyhmus.cacina 0:ac4dea3e2894 733 if(val != -1)
seyhmus.cacina 0:ac4dea3e2894 734 SERIALOUT("whrm_scd_debouncewin= 0x%x", val);
seyhmus.cacina 0:ac4dea3e2894 735 else
seyhmus.cacina 0:ac4dea3e2894 736 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 737
seyhmus.cacina 0:ac4dea3e2894 738 return status;
seyhmus.cacina 0:ac4dea3e2894 739
seyhmus.cacina 0:ac4dea3e2894 740 }
seyhmus.cacina 0:ac4dea3e2894 741
seyhmus.cacina 0:ac4dea3e2894 742 int SH_Max8614x_set_whrm_motionthresh(const char *motion_arg){
seyhmus.cacina 0:ac4dea3e2894 743
seyhmus.cacina 0:ac4dea3e2894 744 int status = SH_Max8614x_set_singleparamcfg_(motion_arg , SH_ALGOIDX_WHRM , SS_CFGIDX_WHRM_MOTION_MAG_THRESHOLD , 2);
seyhmus.cacina 0:ac4dea3e2894 745 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 746 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 747 else {
seyhmus.cacina 0:ac4dea3e2894 748 if( status == -1)
seyhmus.cacina 0:ac4dea3e2894 749 SERIALOUT("CMDERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 750 else
seyhmus.cacina 0:ac4dea3e2894 751 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 752 }
seyhmus.cacina 0:ac4dea3e2894 753 return status;
seyhmus.cacina 0:ac4dea3e2894 754
seyhmus.cacina 0:ac4dea3e2894 755 }
seyhmus.cacina 0:ac4dea3e2894 756
seyhmus.cacina 0:ac4dea3e2894 757 int SH_Max8614x_get_whrm_motionthresh(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 758
seyhmus.cacina 0:ac4dea3e2894 759 int val;
seyhmus.cacina 0:ac4dea3e2894 760 int status = SH_Max8614x_get_singleparamcfg_( SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MOTION_MAG_THRESHOLD , 2, &val);
seyhmus.cacina 0:ac4dea3e2894 761 if(val != -1)
seyhmus.cacina 0:ac4dea3e2894 762 SERIALOUT("whrm_motion_threshold= 0x%x", val);
seyhmus.cacina 0:ac4dea3e2894 763 else
seyhmus.cacina 0:ac4dea3e2894 764 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 765
seyhmus.cacina 0:ac4dea3e2894 766 return status;
seyhmus.cacina 0:ac4dea3e2894 767
seyhmus.cacina 0:ac4dea3e2894 768 }
seyhmus.cacina 0:ac4dea3e2894 769
seyhmus.cacina 0:ac4dea3e2894 770 int SH_Max8614x_set_whrm_minpdiodecurr(const char *curr_arg){
seyhmus.cacina 0:ac4dea3e2894 771
seyhmus.cacina 0:ac4dea3e2894 772 int status = SH_Max8614x_set_singleparamcfg_(curr_arg, SH_ALGOIDX_WHRM , SS_CFGIDX_WHRM_MIN_PD_CURRENT , 2);
seyhmus.cacina 0:ac4dea3e2894 773 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 774 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 775 else {
seyhmus.cacina 0:ac4dea3e2894 776 if( status == -1)
seyhmus.cacina 0:ac4dea3e2894 777 SERIALOUT("CMDERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 778 else
seyhmus.cacina 0:ac4dea3e2894 779 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 780 }
seyhmus.cacina 0:ac4dea3e2894 781 return status;
seyhmus.cacina 0:ac4dea3e2894 782
seyhmus.cacina 0:ac4dea3e2894 783 }
seyhmus.cacina 0:ac4dea3e2894 784
seyhmus.cacina 0:ac4dea3e2894 785 int SH_Max8614x_get_whrm_minpdiodecurr(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 786
seyhmus.cacina 0:ac4dea3e2894 787 int val;
seyhmus.cacina 0:ac4dea3e2894 788 int status = SH_Max8614x_get_singleparamcfg_( SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_MIN_PD_CURRENT , 2, &val);
seyhmus.cacina 0:ac4dea3e2894 789 if(val != -1)
seyhmus.cacina 0:ac4dea3e2894 790 SERIALOUT("whrm_currentrange= %d", val); // MYG: CHECKIF EXPRESSION IS TRUE!
seyhmus.cacina 0:ac4dea3e2894 791 else
seyhmus.cacina 0:ac4dea3e2894 792 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 793
seyhmus.cacina 0:ac4dea3e2894 794 return status;
seyhmus.cacina 0:ac4dea3e2894 795
seyhmus.cacina 0:ac4dea3e2894 796 }
seyhmus.cacina 0:ac4dea3e2894 797
seyhmus.cacina 0:ac4dea3e2894 798 int SH_Max8614x_set_whrm_pdiodeconfig(const char *cfg_arg){
seyhmus.cacina 0:ac4dea3e2894 799
seyhmus.cacina 0:ac4dea3e2894 800 int status = SH_Max8614x_set_singleparamcfg_( cfg_arg , SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_PD_CONFIG , 1 );
seyhmus.cacina 0:ac4dea3e2894 801 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 802 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 803 else {
seyhmus.cacina 0:ac4dea3e2894 804 if( status == -1)
seyhmus.cacina 0:ac4dea3e2894 805 SERIALOUT("CMDERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 806 else
seyhmus.cacina 0:ac4dea3e2894 807 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 808 }
seyhmus.cacina 0:ac4dea3e2894 809 return status;
seyhmus.cacina 0:ac4dea3e2894 810
seyhmus.cacina 0:ac4dea3e2894 811 }
seyhmus.cacina 0:ac4dea3e2894 812
seyhmus.cacina 0:ac4dea3e2894 813 int SH_Max8614x_get_whrm_pdiodeconfig(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 814
seyhmus.cacina 0:ac4dea3e2894 815 int val;
seyhmus.cacina 0:ac4dea3e2894 816 int status = SH_Max8614x_get_singleparamcfg_( SH_ALGOIDX_WHRM, SS_CFGIDX_WHRM_PD_CONFIG, 1 , &val);
seyhmus.cacina 0:ac4dea3e2894 817 if(val != -1)
seyhmus.cacina 0:ac4dea3e2894 818 SERIALOUT("whrm_pdiode_config= %d", val);
seyhmus.cacina 0:ac4dea3e2894 819 else
seyhmus.cacina 0:ac4dea3e2894 820 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 821
seyhmus.cacina 0:ac4dea3e2894 822 return status;
seyhmus.cacina 0:ac4dea3e2894 823
seyhmus.cacina 0:ac4dea3e2894 824 }
seyhmus.cacina 0:ac4dea3e2894 825
seyhmus.cacina 0:ac4dea3e2894 826 int SH_Max8614x_stop_acquisition(const char *null_arg){
seyhmus.cacina 0:ac4dea3e2894 827 SH_Max8614x_stop();
seyhmus.cacina 0:ac4dea3e2894 828 }
seyhmus.cacina 0:ac4dea3e2894 829
seyhmus.cacina 0:ac4dea3e2894 830
seyhmus.cacina 0:ac4dea3e2894 831
seyhmus.cacina 0:ac4dea3e2894 832 /*FOR THIS DEMO PURPOSE*/
seyhmus.cacina 0:ac4dea3e2894 833 int Max8614x_Set_WSPO2Mode(int mode){
seyhmus.cacina 0:ac4dea3e2894 834
seyhmus.cacina 0:ac4dea3e2894 835 uint8_t Temp[1] = { (uint8_t)(mode) };
seyhmus.cacina 0:ac4dea3e2894 836 int status = sh_set_algo_cfg(SH_ALGOIDX_WSPO2, SS_CFGIDX_WSPO2_ALGO_MODE , &Temp[0], 1);
seyhmus.cacina 0:ac4dea3e2894 837 return status;
seyhmus.cacina 0:ac4dea3e2894 838
seyhmus.cacina 0:ac4dea3e2894 839 }
seyhmus.cacina 0:ac4dea3e2894 840
seyhmus.cacina 0:ac4dea3e2894 841
seyhmus.cacina 0:ac4dea3e2894 842 #if defined(RAW_DATA_ONLY)
seyhmus.cacina 0:ac4dea3e2894 843
seyhmus.cacina 0:ac4dea3e2894 844 int SH_Max8614x_disable_whrm (const char *onoff_arg){
seyhmus.cacina 0:ac4dea3e2894 845
seyhmus.cacina 0:ac4dea3e2894 846 int status = sh_disable_algo(SH_ALGOIDX_WHRM);
seyhmus.cacina 0:ac4dea3e2894 847 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 848 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 849 else {
seyhmus.cacina 0:ac4dea3e2894 850 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 851 }
seyhmus.cacina 0:ac4dea3e2894 852 return status;
seyhmus.cacina 0:ac4dea3e2894 853
seyhmus.cacina 0:ac4dea3e2894 854 }
seyhmus.cacina 0:ac4dea3e2894 855
seyhmus.cacina 0:ac4dea3e2894 856 int SH_Max8614x_enable_pureraw(const char *onoff_arg){
seyhmus.cacina 0:ac4dea3e2894 857
seyhmus.cacina 0:ac4dea3e2894 858 int status;
seyhmus.cacina 0:ac4dea3e2894 859
seyhmus.cacina 0:ac4dea3e2894 860 status = sh_disable_algo(SH_ALGOIDX_WHRM);
seyhmus.cacina 0:ac4dea3e2894 861 wait_ms(500);
seyhmus.cacina 0:ac4dea3e2894 862 status = sh_set_data_type(SS_DATATYPE_RAW , false);
seyhmus.cacina 0:ac4dea3e2894 863 status = sh_set_fifo_thresh(5);
seyhmus.cacina 0:ac4dea3e2894 864 status = sh_sensor_enable(SH_SENSORIDX_MAX8614X, SSMAX8614X_MODE1_DATASIZE, SH_INPUT_DATA_DIRECT_SENSOR);
seyhmus.cacina 0:ac4dea3e2894 865
seyhmus.cacina 0:ac4dea3e2894 866 if( status == 0)
seyhmus.cacina 0:ac4dea3e2894 867 SERIALOUT("OK \r\n");
seyhmus.cacina 0:ac4dea3e2894 868 else {
seyhmus.cacina 0:ac4dea3e2894 869 SERIALOUT("ERR \r\n");
seyhmus.cacina 0:ac4dea3e2894 870 }
seyhmus.cacina 0:ac4dea3e2894 871 return status;
seyhmus.cacina 0:ac4dea3e2894 872
seyhmus.cacina 0:ac4dea3e2894 873 }
seyhmus.cacina 0:ac4dea3e2894 874 #endif
seyhmus.cacina 0:ac4dea3e2894 875
seyhmus.cacina 0:ac4dea3e2894 876
seyhmus.cacina 0:ac4dea3e2894 877
seyhmus.cacina 0:ac4dea3e2894 878
seyhmus.cacina 0:ac4dea3e2894 879
seyhmus.cacina 0:ac4dea3e2894 880
seyhmus.cacina 0:ac4dea3e2894 881
seyhmus.cacina 0:ac4dea3e2894 882
seyhmus.cacina 0:ac4dea3e2894 883
seyhmus.cacina 0:ac4dea3e2894 884
seyhmus.cacina 0:ac4dea3e2894 885
seyhmus.cacina 0:ac4dea3e2894 886
seyhmus.cacina 0:ac4dea3e2894 887