Example Host software for integration of MAX3266x chips (, MAX32664GWEB) equipped with Heart Rate from Wrist Algorithm. This is “stand-alone” software that runs on the MAX32630 low-power microcontroller to display heart rate on the display of the MAXREFDES101 reference design. It is intended provide a simple example of how to initialize and communicate with the sensor hub. Windows and Android communications are not supported.

Dependencies:   Maxim_Sensor_Hub_Communications BMI160 whrmDemoUI max32630hsp3

Fork of Host_Software_MAX32664GWEB_HR_wrist by mehmet gok

Committer:
gmehmet
Date:
Mon Dec 17 10:34:32 2018 +0300
Revision:
0:ddc2fef69ef9
First Commit New Repo name

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 0:ddc2fef69ef9 1 /*******************************************************************************
gmehmet 0:ddc2fef69ef9 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 0:ddc2fef69ef9 3 *
gmehmet 0:ddc2fef69ef9 4 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 0:ddc2fef69ef9 5 * copy of this software and associated documentation files (the "Software"),
gmehmet 0:ddc2fef69ef9 6 * to deal in the Software without restriction, including without limitation
gmehmet 0:ddc2fef69ef9 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 0:ddc2fef69ef9 8 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 0:ddc2fef69ef9 9 * Software is furnished to do so, subject to the following conditions:
gmehmet 0:ddc2fef69ef9 10 *
gmehmet 0:ddc2fef69ef9 11 * The above copyright notice and this permission notice shall be included
gmehmet 0:ddc2fef69ef9 12 * in all copies or substantial portions of the Software.
gmehmet 0:ddc2fef69ef9 13 *
gmehmet 0:ddc2fef69ef9 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 0:ddc2fef69ef9 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 0:ddc2fef69ef9 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 0:ddc2fef69ef9 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 0:ddc2fef69ef9 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 0:ddc2fef69ef9 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 0:ddc2fef69ef9 20 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 0:ddc2fef69ef9 21 *
gmehmet 0:ddc2fef69ef9 22 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 0:ddc2fef69ef9 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 0:ddc2fef69ef9 24 * Products, Inc. Branding Policy.
gmehmet 0:ddc2fef69ef9 25 *
gmehmet 0:ddc2fef69ef9 26 * The mere transfer of this software does not imply any licenses
gmehmet 0:ddc2fef69ef9 27 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 0:ddc2fef69ef9 28 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 0:ddc2fef69ef9 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 0:ddc2fef69ef9 30 * ownership rights.
gmehmet 0:ddc2fef69ef9 31 *******************************************************************************
gmehmet 0:ddc2fef69ef9 32 */
gmehmet 0:ddc2fef69ef9 33
gmehmet 0:ddc2fef69ef9 34 /*
gmehmet 0:ddc2fef69ef9 35 #ifdef __cplusplus
gmehmet 0:ddc2fef69ef9 36 extern "C" {
gmehmet 0:ddc2fef69ef9 37 #endif
gmehmet 0:ddc2fef69ef9 38 */
gmehmet 0:ddc2fef69ef9 39
gmehmet 0:ddc2fef69ef9 40 #include <events/mbed_events.h>
gmehmet 0:ddc2fef69ef9 41 #include <mbed.h>
gmehmet 0:ddc2fef69ef9 42 #include "mbed.h"
gmehmet 0:ddc2fef69ef9 43
gmehmet 0:ddc2fef69ef9 44 #include "SHComm.h"
gmehmet 0:ddc2fef69ef9 45
gmehmet 0:ddc2fef69ef9 46
gmehmet 0:ddc2fef69ef9 47 #define SS_I2C_8BIT_SLAVE_ADDR 0xAA
gmehmet 0:ddc2fef69ef9 48 #define SENSORHUB_I2C_ADRESS SS_I2C_8BIT_SLAVE_ADDR
gmehmet 0:ddc2fef69ef9 49
gmehmet 0:ddc2fef69ef9 50 #define ENABLED ((int)(1))
gmehmet 0:ddc2fef69ef9 51 #define DISABLED ((int)(0))
gmehmet 0:ddc2fef69ef9 52
gmehmet 0:ddc2fef69ef9 53 #define SS_DUMP_REG_SLEEP_MS (100)
gmehmet 0:ddc2fef69ef9 54 #define SS_ENABLE_SENSOR_SLEEP_MS (20)
gmehmet 0:ddc2fef69ef9 55 #define SS_DEFAULT_CMD_SLEEP_MS (2)
gmehmet 0:ddc2fef69ef9 56 #define SS_WAIT_BETWEEN_TRIES_MS (2)
gmehmet 0:ddc2fef69ef9 57 #define SS_CMD_WAIT_PULLTRANS_MS (5)
gmehmet 0:ddc2fef69ef9 58 #define SS_FEEDFIFO_CMD_SLEEP_MS (30)
gmehmet 0:ddc2fef69ef9 59
gmehmet 0:ddc2fef69ef9 60
gmehmet 0:ddc2fef69ef9 61 #define SS_DEFAULT_RETRIES ((int) (4))
gmehmet 0:ddc2fef69ef9 62 #define SS_ZERO_DELAY 0
gmehmet 0:ddc2fef69ef9 63 #define SS_ZERO_BYTES 0
gmehmet 0:ddc2fef69ef9 64
gmehmet 0:ddc2fef69ef9 65
gmehmet 0:ddc2fef69ef9 66 /*define sample size of algorithm and raw sensor data in bytes*/
gmehmet 0:ddc2fef69ef9 67 #define SH_ALGO_WHRM_SAMPLE_DATABYTES 4
gmehmet 0:ddc2fef69ef9 68 #define SH_ALGO_SP02_SAMPLE_DATABYTES 4
gmehmet 0:ddc2fef69ef9 69
gmehmet 0:ddc2fef69ef9 70
gmehmet 0:ddc2fef69ef9 71 /*define command sequences given in Maxim ME32664 user manual*/
gmehmet 0:ddc2fef69ef9 72 #define SH_GET_HUB_STATUS_CMDSEQ {0x00,0x00}
gmehmet 0:ddc2fef69ef9 73 #define SH_SET_OPERATING_MODE_CMDSEQ(opMode) {0x01,0x00,opMode}
gmehmet 0:ddc2fef69ef9 74 #define SH_SET_OPERATING_MODE_BOOTLOADER_CMDSEQ {0x02,0x00,0x08}
gmehmet 0:ddc2fef69ef9 75 #define SH_SET_OPERATING_MODE_APPLICATION_CMDSEQ {0x02,0x00,0x00}
gmehmet 0:ddc2fef69ef9 76 #define SH_SET_OPERATING_MODE_RESET_CMDSEQ {0x02,0x00,0x02}
gmehmet 0:ddc2fef69ef9 77 #define SH_GET_OPERATING_MODE_CMDSEQ {0x02,0x00}
gmehmet 0:ddc2fef69ef9 78
gmehmet 0:ddc2fef69ef9 79 #define SH_SET_OUTPUT_MODE_CMDSEQ( outMode) {0x10,0x00, outMode}
gmehmet 0:ddc2fef69ef9 80 #define SH_SET_OUTMODE_NODATA_CMDSEQ {0x10,0x00,0x00}
gmehmet 0:ddc2fef69ef9 81 #define SH_SET_OUTMODE_SENSORDATA_CMDSEQ {0x10,0x00,0x01}
gmehmet 0:ddc2fef69ef9 82 #define SH_SET_OUTMODE_ALGODATA_CMDSEQ {0x10,0x00,0x02}
gmehmet 0:ddc2fef69ef9 83 #define SH_SET_OUTMODE_PAUSE_CMDSEQ {0x10,0x00,0x04}
gmehmet 0:ddc2fef69ef9 84 #define SH_SET_OUTMODE_SENSAMPLECNT_CMDSEQ {0x10,0x00,0x05}
gmehmet 0:ddc2fef69ef9 85 #define SH_SET_OUTMODE_ALGOSAMPLECNT_CMDSEQ {0x10,0x00,0x06}
gmehmet 0:ddc2fef69ef9 86 #define SH_SET_OUTMODE_ALGOSENSAMPLECNT_CMDSEQ {0x10,0x00,0x07}
gmehmet 0:ddc2fef69ef9 87
gmehmet 0:ddc2fef69ef9 88 #define SH_GET_OUTPUT_MODE_CMDSEQ {0x11,0x00}
gmehmet 0:ddc2fef69ef9 89
gmehmet 0:ddc2fef69ef9 90 #define SH_DFIFO_SET_INT_THRESHOLD_CMDSEQ( ucThreshold ) {0x10,0x01,ucThreshold}
gmehmet 0:ddc2fef69ef9 91 #define SH_DFIFO_GET_INT_THRESHOLD_CMDSEQ {0x11,0x01}
gmehmet 0:ddc2fef69ef9 92
gmehmet 0:ddc2fef69ef9 93 #define SH_DFIFO_GET_NSAMPLES_CMDSEQ {0x12,0x00}
gmehmet 0:ddc2fef69ef9 94 #define SH_DFIFO_PULL_SAMPLE_CMDSEQ {0x12,0x01}
gmehmet 0:ddc2fef69ef9 95 #define SH_GET_EXTINPUT_FIFOSZ_CMDSEQ {0x13,0x01}
gmehmet 0:ddc2fef69ef9 96 #define SH_GET_SAMPLEBYTECNT_INPUTFIFO_CMDSEQ {0x13,0x04}
gmehmet 0:ddc2fef69ef9 97 #define SH_FEED_TO_INPUTFIFO_CMDSEQ {0x14,0x00}
gmehmet 0:ddc2fef69ef9 98
gmehmet 0:ddc2fef69ef9 99 #define SH_WRITE_SENSORREG_CMDSEQ( sensorIdx , regAddr ) { 0x40, sensorIdx , regAddr}
gmehmet 0:ddc2fef69ef9 100 #define SH_READ_SENSORREG_CMDSEQ( sensorIdx , regAddr ) { 0x41, sensorIdx , regAddr}
gmehmet 0:ddc2fef69ef9 101 #define SH_READ_AFE_ATTRIBUTES_CMDSEQ(sensorIdx) { 0x42, sensorIdx}
gmehmet 0:ddc2fef69ef9 102 #define SH_READ_ALLREGISTERS_CMDSEQ(sensorIdx) { 0x43, sensorIdx}
gmehmet 0:ddc2fef69ef9 103
gmehmet 0:ddc2fef69ef9 104 #define SH_ENABLE_SENSOR_CMDSEQ(sensorIdx , extMode) {0x44, sensorIdx, 0x01 , extMode }
gmehmet 0:ddc2fef69ef9 105 #define SH_DISABLE_SENSOR_CMDSEQ(sensorIdx) {0x44, sensorIdx, 0x00}
gmehmet 0:ddc2fef69ef9 106
gmehmet 0:ddc2fef69ef9 107
gmehmet 0:ddc2fef69ef9 108 #define SH_AGC_SET_ADCRANGE_CMDSEQ( uiPercentage) {0x50, 0x00, 0x00 , uiPercentage}
gmehmet 0:ddc2fef69ef9 109 #define SH_AGC_SET_STEPSZ_CMDSEQ( uiPercentage) {0x50, 0x00, 0x01 , uiPercentage}
gmehmet 0:ddc2fef69ef9 110 #define SH_AGC_SET_SENSITIVITY_CMDSEQ( uiPercentage) {0x50, 0x00, 0x02 , uiPercentage}
gmehmet 0:ddc2fef69ef9 111 #define SH_AGC_SET_NSAMPLESAVRAGING_CMDSEQ( ucNsamples) {0x50, 0x00, 0x03 , uiNsamples}
gmehmet 0:ddc2fef69ef9 112 #define SH_WHRM_SET_SAMPRATE_CMDSEQ( ucNsamples) {0x50, 0x02, 0x03 , uiNsamples}
gmehmet 0:ddc2fef69ef9 113
gmehmet 0:ddc2fef69ef9 114
gmehmet 0:ddc2fef69ef9 115 #define SH_ENABLE_ALGO_CMDSEQ( algoIdx) { 0x52, algoIdx , 0x01}
gmehmet 0:ddc2fef69ef9 116 #define SH_DISABLE_ALGO_CMDSEQ( algoIdx) { 0x52, algoIdx , 0x00}
gmehmet 0:ddc2fef69ef9 117
gmehmet 0:ddc2fef69ef9 118 #define SH_SET_ALGO_CONFIGURATION_CMDSEQ( algoIdx, cgfIdx) { 0x50 , algoIdx, cgfIdx }
gmehmet 0:ddc2fef69ef9 119 #define SH_GET_ALGO_CONFIGURATION_CMDSEQ( algoIdx, cgfIdx) { 0x51 , algoIdx, cgfIdx }
gmehmet 0:ddc2fef69ef9 120
gmehmet 0:ddc2fef69ef9 121 #define SH_COMM_CHECK_CMDSEQ {0xFF, 0x00}
gmehmet 0:ddc2fef69ef9 122
gmehmet 0:ddc2fef69ef9 123 /*
gmehmet 0:ddc2fef69ef9 124 * define the "platform specific" hardware interface which SSinterface requires:
gmehmet 0:ddc2fef69ef9 125 * 1. master i2c port
gmehmet 0:ddc2fef69ef9 126 * 2. interrupt attachable I/O pin (mfio)
gmehmet 0:ddc2fef69ef9 127 * 3. I/O pin for reset
gmehmet 0:ddc2fef69ef9 128 * Note: Definitions below are for MAX32630FTR Pagasus board . Modify for your platform.
gmehmet 0:ddc2fef69ef9 129 **/
gmehmet 0:ddc2fef69ef9 130 I2C *m_i2cBus; /*i2c bus sensor hub is connected to*/
gmehmet 0:ddc2fef69ef9 131
gmehmet 0:ddc2fef69ef9 132 PinName ss_mfio(P5_4); /* platform specific mfio event pin */
gmehmet 0:ddc2fef69ef9 133 PinName ss_reset(P5_6); /* platform specific sensor hub reset pin */
gmehmet 0:ddc2fef69ef9 134 DigitalInOut mfio_pin(ss_mfio); /* mfio pin mode be I/O */
gmehmet 0:ddc2fef69ef9 135 DigitalInOut reset_pin(ss_reset); /* reset pin mode be I/O */
gmehmet 0:ddc2fef69ef9 136 InterruptIn irq_pin(ss_mfio); /* define mfio pin interrupt attachable*/
gmehmet 0:ddc2fef69ef9 137
gmehmet 0:ddc2fef69ef9 138
gmehmet 0:ddc2fef69ef9 139 /*
gmehmet 0:ddc2fef69ef9 140 * SSI API funcions
gmehmet 0:ddc2fef69ef9 141 * NOTE: Generic functions for any platform.
gmehmet 0:ddc2fef69ef9 142 * exceptions: below needs needs modification according to platform and HAL drivers
gmehmet 0:ddc2fef69ef9 143 * 1. Hard reset function
gmehmet 0:ddc2fef69ef9 144 * 2. Enable/disable mfio event interrput
gmehmet 0:ddc2fef69ef9 145 * 3. mfio pin interrupt routine
gmehmet 0:ddc2fef69ef9 146 *
gmehmet 0:ddc2fef69ef9 147 * **/
gmehmet 0:ddc2fef69ef9 148
gmehmet 0:ddc2fef69ef9 149 /*global buffer for sensor i2c commands+data*/
gmehmet 0:ddc2fef69ef9 150 uint8_t sh_write_buf[512];
gmehmet 0:ddc2fef69ef9 151 static volatile bool m_irq_received_ = false;
gmehmet 0:ddc2fef69ef9 152 static volatile bool mfio_int_happened = false;
gmehmet 0:ddc2fef69ef9 153
gmehmet 0:ddc2fef69ef9 154 /* sensor hub states */
gmehmet 0:ddc2fef69ef9 155 static bool sc_en = false;
gmehmet 0:ddc2fef69ef9 156 static int data_type = 0;
gmehmet 0:ddc2fef69ef9 157 static int is_sensor_enabled[SS_MAX_SUPPORTED_SENSOR_NUM] = {0};
gmehmet 0:ddc2fef69ef9 158 static int is_algo_enabled[SS_MAX_SUPPORTED_ALGO_NUM] = {0};
gmehmet 0:ddc2fef69ef9 159 static int sensor_sample_sz[SS_MAX_SUPPORTED_SENSOR_NUM] = {0};
gmehmet 0:ddc2fef69ef9 160 static int algo_sample_sz[SS_MAX_SUPPORTED_ALGO_NUM] = {0};
gmehmet 0:ddc2fef69ef9 161
gmehmet 0:ddc2fef69ef9 162
gmehmet 0:ddc2fef69ef9 163
gmehmet 0:ddc2fef69ef9 164 /* desc :
gmehmet 0:ddc2fef69ef9 165 * Func to init master i2c hardware comm interface with sennor hub
gmehmet 0:ddc2fef69ef9 166 * init mfio interrupt pin and attach irq to pin
gmehmet 0:ddc2fef69ef9 167 * init reset pin
gmehmet 0:ddc2fef69ef9 168 * params:
gmehmet 0:ddc2fef69ef9 169 * N/A
gmehmet 0:ddc2fef69ef9 170 */
gmehmet 0:ddc2fef69ef9 171
gmehmet 0:ddc2fef69ef9 172
gmehmet 0:ddc2fef69ef9 173 void sh_irq_handler();
gmehmet 0:ddc2fef69ef9 174 void sh_init_hwcomm_interface(){
gmehmet 0:ddc2fef69ef9 175 static I2C ssI2C(P3_4, P3_5); /*set up sensor hub i2c communication at 400 kHz*/
gmehmet 0:ddc2fef69ef9 176 ssI2C.frequency(400000);
gmehmet 0:ddc2fef69ef9 177 m_i2cBus = &ssI2C;
gmehmet 0:ddc2fef69ef9 178
gmehmet 0:ddc2fef69ef9 179 reset_pin.input();
gmehmet 0:ddc2fef69ef9 180 reset_pin.mode(PullUp);
gmehmet 0:ddc2fef69ef9 181 mfio_pin.input(); /*set mfio as input for getting mfio event reporting when sesnor hub is on application mode */
gmehmet 0:ddc2fef69ef9 182 mfio_pin.mode(PullUp);
gmehmet 0:ddc2fef69ef9 183
gmehmet 0:ddc2fef69ef9 184 irq_pin.fall(sh_irq_handler); /*attach falling edge interrupt to mfio pin for mfio event reporting */
gmehmet 0:ddc2fef69ef9 185
gmehmet 0:ddc2fef69ef9 186 return;
gmehmet 0:ddc2fef69ef9 187 }
gmehmet 0:ddc2fef69ef9 188
gmehmet 0:ddc2fef69ef9 189 /* mfio pin event reporting related interrupt functions*/
gmehmet 0:ddc2fef69ef9 190 /*
gmehmet 0:ddc2fef69ef9 191 * data ready event reporting isr from sensor hub
gmehmet 0:ddc2fef69ef9 192 *
gmehmet 0:ddc2fef69ef9 193 * params:
gmehmet 0:ddc2fef69ef9 194 * N/A
gmehmet 0:ddc2fef69ef9 195 * */
gmehmet 0:ddc2fef69ef9 196 void sh_irq_handler()
gmehmet 0:ddc2fef69ef9 197 {
gmehmet 0:ddc2fef69ef9 198 m_irq_received_ = true;
gmehmet 0:ddc2fef69ef9 199 }
gmehmet 0:ddc2fef69ef9 200 void sh_clear_mfio_event_flag(void){
gmehmet 0:ddc2fef69ef9 201 m_irq_received_ = false;
gmehmet 0:ddc2fef69ef9 202 }
gmehmet 0:ddc2fef69ef9 203
gmehmet 0:ddc2fef69ef9 204 bool sh_has_mfio_event(void){
gmehmet 0:ddc2fef69ef9 205 return m_irq_received_;
gmehmet 0:ddc2fef69ef9 206 }
gmehmet 0:ddc2fef69ef9 207
gmehmet 0:ddc2fef69ef9 208 /* desc:
gmehmet 0:ddc2fef69ef9 209 * func to enable event reporting from sensor hub
gmehmet 0:ddc2fef69ef9 210 *
gmehmet 0:ddc2fef69ef9 211 * params:
gmehmet 0:ddc2fef69ef9 212 * N/A
gmehmet 0:ddc2fef69ef9 213 * */
gmehmet 0:ddc2fef69ef9 214 void sh_enable_irq_mfioevent(void)
gmehmet 0:ddc2fef69ef9 215 {
gmehmet 0:ddc2fef69ef9 216 irq_pin.enable_irq();
gmehmet 0:ddc2fef69ef9 217 }
gmehmet 0:ddc2fef69ef9 218
gmehmet 0:ddc2fef69ef9 219 /* desc:
gmehmet 0:ddc2fef69ef9 220 * func to disable event reporting from sensor hub
gmehmet 0:ddc2fef69ef9 221 *
gmehmet 0:ddc2fef69ef9 222 * params:
gmehmet 0:ddc2fef69ef9 223 * N/A
gmehmet 0:ddc2fef69ef9 224 * */
gmehmet 0:ddc2fef69ef9 225 void sh_disable_irq_mfioevent(void)
gmehmet 0:ddc2fef69ef9 226 {
gmehmet 0:ddc2fef69ef9 227 irq_pin.disable_irq();
gmehmet 0:ddc2fef69ef9 228 }
gmehmet 0:ddc2fef69ef9 229
gmehmet 0:ddc2fef69ef9 230 /* desc:
gmehmet 0:ddc2fef69ef9 231 * reset event reporting process from sensor hub
gmehmet 0:ddc2fef69ef9 232 *
gmehmet 0:ddc2fef69ef9 233 * params:
gmehmet 0:ddc2fef69ef9 234 * N/A
gmehmet 0:ddc2fef69ef9 235 **/
gmehmet 0:ddc2fef69ef9 236 bool sh_reset_mfio_irq(){
gmehmet 0:ddc2fef69ef9 237 bool ret = mfio_int_happened;
gmehmet 0:ddc2fef69ef9 238 mfio_int_happened = false;
gmehmet 0:ddc2fef69ef9 239 sh_disable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 240 irq_pin.fall(sh_irq_handler);
gmehmet 0:ddc2fef69ef9 241 sh_enable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 242 return ret;
gmehmet 0:ddc2fef69ef9 243 }
gmehmet 0:ddc2fef69ef9 244
gmehmet 0:ddc2fef69ef9 245
gmehmet 0:ddc2fef69ef9 246 /*
gmehmet 0:ddc2fef69ef9 247 * desc:
gmehmet 0:ddc2fef69ef9 248 * function to reset sensor hub and put to application mode after reset interface and get data format.
gmehmet 0:ddc2fef69ef9 249 *
gmehmet 0:ddc2fef69ef9 250 * params:
gmehmet 0:ddc2fef69ef9 251 *
gmehmet 0:ddc2fef69ef9 252 * __I wakeupMode : 0x00 : application mode
gmehmet 0:ddc2fef69ef9 253 * 0x08 : bootloader mode
gmehmet 0:ddc2fef69ef9 254 * */
gmehmet 0:ddc2fef69ef9 255 int sh_hard_reset(int wakeupMode){
gmehmet 0:ddc2fef69ef9 256
gmehmet 0:ddc2fef69ef9 257 int status;
gmehmet 0:ddc2fef69ef9 258 sh_disable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 259 reset_pin.output();
gmehmet 0:ddc2fef69ef9 260 mfio_pin.output();
gmehmet 0:ddc2fef69ef9 261
gmehmet 0:ddc2fef69ef9 262 reset_pin.write(0);
gmehmet 0:ddc2fef69ef9 263 wait_ms(SS_RESET_TIME);
gmehmet 0:ddc2fef69ef9 264
gmehmet 0:ddc2fef69ef9 265 if( (wakeupMode & 0xFF) == 0 ) {
gmehmet 0:ddc2fef69ef9 266
gmehmet 0:ddc2fef69ef9 267 mfio_pin.write(1);
gmehmet 0:ddc2fef69ef9 268 reset_pin.write(1);
gmehmet 0:ddc2fef69ef9 269 wait_ms(SS_STARTUP_TO_MAIN_APP_TIME);
gmehmet 0:ddc2fef69ef9 270
gmehmet 0:ddc2fef69ef9 271 }else {
gmehmet 0:ddc2fef69ef9 272
gmehmet 0:ddc2fef69ef9 273 mfio_pin.write(0);
gmehmet 0:ddc2fef69ef9 274 reset_pin.write(1);
gmehmet 0:ddc2fef69ef9 275 wait_ms(SS_STARTUP_TO_BTLDR_TIME);
gmehmet 0:ddc2fef69ef9 276 }
gmehmet 0:ddc2fef69ef9 277 mfio_pin.input();
gmehmet 0:ddc2fef69ef9 278 mfio_pin.mode(PullUp);
gmehmet 0:ddc2fef69ef9 279 reset_pin.input();
gmehmet 0:ddc2fef69ef9 280 sh_enable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 281 }
gmehmet 0:ddc2fef69ef9 282
gmehmet 0:ddc2fef69ef9 283
gmehmet 0:ddc2fef69ef9 284 /*
gmehmet 0:ddc2fef69ef9 285 * desc:
gmehmet 0:ddc2fef69ef9 286 * function to init sensor comm interface and get data format.
gmehmet 0:ddc2fef69ef9 287 *
gmehmet 0:ddc2fef69ef9 288 * */
gmehmet 0:ddc2fef69ef9 289 void sh_init_hubinterface(void){
gmehmet 0:ddc2fef69ef9 290
gmehmet 0:ddc2fef69ef9 291 sh_init_hwcomm_interface();
gmehmet 0:ddc2fef69ef9 292 //sh_get_data_type(&data_type, &sc_en);
gmehmet 0:ddc2fef69ef9 293 return;
gmehmet 0:ddc2fef69ef9 294 }
gmehmet 0:ddc2fef69ef9 295
gmehmet 0:ddc2fef69ef9 296
gmehmet 0:ddc2fef69ef9 297
gmehmet 0:ddc2fef69ef9 298
gmehmet 0:ddc2fef69ef9 299
gmehmet 0:ddc2fef69ef9 300 /*
gmehmet 0:ddc2fef69ef9 301 *
gmehmet 0:ddc2fef69ef9 302 * SENSOR HUB COMMUNICATION INTERFACE ( Defined in MAX32664 User Guide ) API FUNCTIONS
gmehmet 0:ddc2fef69ef9 303 *
gmehmet 0:ddc2fef69ef9 304 *
gmehmet 0:ddc2fef69ef9 305 * */
gmehmet 0:ddc2fef69ef9 306
gmehmet 0:ddc2fef69ef9 307 int sh_write_cmd( uint8_t *tx_buf,
gmehmet 0:ddc2fef69ef9 308 int tx_len,
gmehmet 0:ddc2fef69ef9 309 int sleep_ms)
gmehmet 0:ddc2fef69ef9 310 {
gmehmet 0:ddc2fef69ef9 311 int retries = SS_DEFAULT_RETRIES;
gmehmet 0:ddc2fef69ef9 312 int ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)tx_buf, tx_len);
gmehmet 0:ddc2fef69ef9 313 while (ret != 0 && retries-- > 0) {
gmehmet 0:ddc2fef69ef9 314
gmehmet 0:ddc2fef69ef9 315 wait_ms(1);
gmehmet 0:ddc2fef69ef9 316 ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)tx_buf, tx_len);
gmehmet 0:ddc2fef69ef9 317 }
gmehmet 0:ddc2fef69ef9 318 if (ret != 0)
gmehmet 0:ddc2fef69ef9 319 return SS_ERR_UNAVAILABLE;
gmehmet 0:ddc2fef69ef9 320
gmehmet 0:ddc2fef69ef9 321
gmehmet 0:ddc2fef69ef9 322 wait_ms(sleep_ms);
gmehmet 0:ddc2fef69ef9 323
gmehmet 0:ddc2fef69ef9 324 char status_byte;
gmehmet 0:ddc2fef69ef9 325 ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, &status_byte, 1);
gmehmet 0:ddc2fef69ef9 326 bool try_again = (status_byte == SS_ERR_TRY_AGAIN);
gmehmet 0:ddc2fef69ef9 327 while ((ret != 0 || try_again)
gmehmet 0:ddc2fef69ef9 328 && retries-- > 0) {
gmehmet 0:ddc2fef69ef9 329 wait_ms(sleep_ms);
gmehmet 0:ddc2fef69ef9 330 ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, &status_byte, 1);
gmehmet 0:ddc2fef69ef9 331 try_again = (status_byte == SS_ERR_TRY_AGAIN);
gmehmet 0:ddc2fef69ef9 332 }
gmehmet 0:ddc2fef69ef9 333
gmehmet 0:ddc2fef69ef9 334 if (ret != 0 || try_again)
gmehmet 0:ddc2fef69ef9 335 return SS_ERR_UNAVAILABLE;
gmehmet 0:ddc2fef69ef9 336
gmehmet 0:ddc2fef69ef9 337 return (int) (SS_STATUS)status_byte;
gmehmet 0:ddc2fef69ef9 338 }
gmehmet 0:ddc2fef69ef9 339
gmehmet 0:ddc2fef69ef9 340
gmehmet 0:ddc2fef69ef9 341 int sh_write_cmd_with_data(uint8_t *cmd_bytes,
gmehmet 0:ddc2fef69ef9 342 int cmd_bytes_len,
gmehmet 0:ddc2fef69ef9 343 uint8_t *data,
gmehmet 0:ddc2fef69ef9 344 int data_len,
gmehmet 0:ddc2fef69ef9 345 int cmd_delay_ms)
gmehmet 0:ddc2fef69ef9 346 {
gmehmet 0:ddc2fef69ef9 347 memcpy(sh_write_buf, cmd_bytes, cmd_bytes_len);
gmehmet 0:ddc2fef69ef9 348 memcpy(sh_write_buf + cmd_bytes_len, data, data_len);
gmehmet 0:ddc2fef69ef9 349 int status = sh_write_cmd(sh_write_buf,cmd_bytes_len + data_len, cmd_delay_ms);
gmehmet 0:ddc2fef69ef9 350 return status;
gmehmet 0:ddc2fef69ef9 351 }
gmehmet 0:ddc2fef69ef9 352
gmehmet 0:ddc2fef69ef9 353
gmehmet 0:ddc2fef69ef9 354 int sh_read_cmd( uint8_t *cmd_bytes,
gmehmet 0:ddc2fef69ef9 355 int cmd_bytes_len,
gmehmet 0:ddc2fef69ef9 356 uint8_t *data,
gmehmet 0:ddc2fef69ef9 357 int data_len,
gmehmet 0:ddc2fef69ef9 358 uint8_t *rxbuf,
gmehmet 0:ddc2fef69ef9 359 int rxbuf_sz,
gmehmet 0:ddc2fef69ef9 360 int sleep_ms )
gmehmet 0:ddc2fef69ef9 361 {
gmehmet 0:ddc2fef69ef9 362
gmehmet 0:ddc2fef69ef9 363 int retries = SS_DEFAULT_RETRIES;
gmehmet 0:ddc2fef69ef9 364
gmehmet 0:ddc2fef69ef9 365 int ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)cmd_bytes, cmd_bytes_len, (data_len != 0));
gmehmet 0:ddc2fef69ef9 366 if (data_len != 0)
gmehmet 0:ddc2fef69ef9 367 ret |= m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)data, data_len, false);
gmehmet 0:ddc2fef69ef9 368
gmehmet 0:ddc2fef69ef9 369
gmehmet 0:ddc2fef69ef9 370 while (ret != 0 && retries-- > 0) {
gmehmet 0:ddc2fef69ef9 371 wait_ms(1);
gmehmet 0:ddc2fef69ef9 372 ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)cmd_bytes, cmd_bytes_len, (data_len != 0));
gmehmet 0:ddc2fef69ef9 373 if (data_len != 0)
gmehmet 0:ddc2fef69ef9 374 ret |= m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)data, data_len, false);
gmehmet 0:ddc2fef69ef9 375
gmehmet 0:ddc2fef69ef9 376 }
gmehmet 0:ddc2fef69ef9 377 if (ret != 0)
gmehmet 0:ddc2fef69ef9 378 return SS_ERR_UNAVAILABLE;
gmehmet 0:ddc2fef69ef9 379
gmehmet 0:ddc2fef69ef9 380
gmehmet 0:ddc2fef69ef9 381 wait_ms(sleep_ms);
gmehmet 0:ddc2fef69ef9 382
gmehmet 0:ddc2fef69ef9 383 ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, (char*)rxbuf, rxbuf_sz);
gmehmet 0:ddc2fef69ef9 384 bool try_again = (rxbuf[0] == SS_ERR_TRY_AGAIN);
gmehmet 0:ddc2fef69ef9 385 while ((ret != 0 || try_again) && retries-- > 0) {
gmehmet 0:ddc2fef69ef9 386 wait_ms(sleep_ms);
gmehmet 0:ddc2fef69ef9 387 ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, (char*)rxbuf, rxbuf_sz);
gmehmet 0:ddc2fef69ef9 388 try_again = (rxbuf[0] == SS_ERR_TRY_AGAIN);
gmehmet 0:ddc2fef69ef9 389 }
gmehmet 0:ddc2fef69ef9 390 if (ret != 0 || try_again)
gmehmet 0:ddc2fef69ef9 391 return SS_ERR_UNAVAILABLE;
gmehmet 0:ddc2fef69ef9 392
gmehmet 0:ddc2fef69ef9 393 return (int) ((SS_STATUS)rxbuf[0]);
gmehmet 0:ddc2fef69ef9 394 }
gmehmet 0:ddc2fef69ef9 395
gmehmet 0:ddc2fef69ef9 396
gmehmet 0:ddc2fef69ef9 397
gmehmet 0:ddc2fef69ef9 398 int sh_get_sensorhub_status(uint8_t *hubStatus){
gmehmet 0:ddc2fef69ef9 399
gmehmet 0:ddc2fef69ef9 400 uint8_t ByteSeq[] = SH_GET_HUB_STATUS_CMDSEQ;
gmehmet 0:ddc2fef69ef9 401 uint8_t rxbuf[2] = { 0 };
gmehmet 0:ddc2fef69ef9 402
gmehmet 0:ddc2fef69ef9 403 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 404 0, 0,
gmehmet 0:ddc2fef69ef9 405 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 406 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 407
gmehmet 0:ddc2fef69ef9 408 *hubStatus = rxbuf[1];
gmehmet 0:ddc2fef69ef9 409 return status;
gmehmet 0:ddc2fef69ef9 410 }
gmehmet 0:ddc2fef69ef9 411
gmehmet 0:ddc2fef69ef9 412
gmehmet 0:ddc2fef69ef9 413 int sh_get_sensorhub_operating_mode(uint8_t *hubMode){
gmehmet 0:ddc2fef69ef9 414
gmehmet 0:ddc2fef69ef9 415 uint8_t ByteSeq[] = SH_GET_OPERATING_MODE_CMDSEQ;
gmehmet 0:ddc2fef69ef9 416 uint8_t rxbuf[2] = { 0 };
gmehmet 0:ddc2fef69ef9 417
gmehmet 0:ddc2fef69ef9 418 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 419 0, 0,
gmehmet 0:ddc2fef69ef9 420 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 421 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 422
gmehmet 0:ddc2fef69ef9 423 *hubMode = rxbuf[1];
gmehmet 0:ddc2fef69ef9 424 return status;
gmehmet 0:ddc2fef69ef9 425 }
gmehmet 0:ddc2fef69ef9 426
gmehmet 0:ddc2fef69ef9 427
gmehmet 0:ddc2fef69ef9 428 int sh_set_sensorhub_operating_mode(uint8_t hubMode){
gmehmet 0:ddc2fef69ef9 429
gmehmet 0:ddc2fef69ef9 430 uint8_t ByteSeq[] = SH_SET_OPERATING_MODE_CMDSEQ(hubMode);
gmehmet 0:ddc2fef69ef9 431 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 432 return status;
gmehmet 0:ddc2fef69ef9 433
gmehmet 0:ddc2fef69ef9 434 }
gmehmet 0:ddc2fef69ef9 435
gmehmet 0:ddc2fef69ef9 436
gmehmet 0:ddc2fef69ef9 437 //int sh_set_data_type( uint8_t outMode)
gmehmet 0:ddc2fef69ef9 438 int sh_set_data_type(int data_type_, bool sc_en_)
gmehmet 0:ddc2fef69ef9 439 {
gmehmet 0:ddc2fef69ef9 440
gmehmet 0:ddc2fef69ef9 441 #if 0
gmehmet 0:ddc2fef69ef9 442 uint8_t dataTypeSc = (uint8_t)((sc_en ? SS_MASK_OUTPUTMODE_SC_EN : 0) | ((data_type << SS_SHIFT_OUTPUTMODE_DATATYPE) & SS_MASK_OUTPUTMODE_DATATYPE));
gmehmet 0:ddc2fef69ef9 443 uint8_t ByteSeq[] = SH_SET_OUTPUT_MODE_CMDSEQ( dataTypeSc);
gmehmet 0:ddc2fef69ef9 444 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 445 if( status == 0x00){
gmehmet 0:ddc2fef69ef9 446 data_type = data_type_;
gmehmet 0:ddc2fef69ef9 447 sc_en = sc_en_;
gmehmet 0:ddc2fef69ef9 448 }
gmehmet 0:ddc2fef69ef9 449 #endif
gmehmet 0:ddc2fef69ef9 450
gmehmet 0:ddc2fef69ef9 451 uint8_t cmd_bytes[] = { SS_FAM_W_COMMCHAN, SS_CMDIDX_OUTPUTMODE };
gmehmet 0:ddc2fef69ef9 452 uint8_t data_bytes[] = { (uint8_t)((sc_en_ ? SS_MASK_OUTPUTMODE_SC_EN : 0) |
gmehmet 0:ddc2fef69ef9 453 ((data_type_ << SS_SHIFT_OUTPUTMODE_DATATYPE) & SS_MASK_OUTPUTMODE_DATATYPE)) };
gmehmet 0:ddc2fef69ef9 454
gmehmet 0:ddc2fef69ef9 455 int status = sh_write_cmd_with_data(&cmd_bytes[0], sizeof(cmd_bytes),
gmehmet 0:ddc2fef69ef9 456 &data_bytes[0], sizeof(data_bytes),
gmehmet 0:ddc2fef69ef9 457 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 458 data_type = data_type_;
gmehmet 0:ddc2fef69ef9 459 sc_en = sc_en_;
gmehmet 0:ddc2fef69ef9 460
gmehmet 0:ddc2fef69ef9 461 return status;
gmehmet 0:ddc2fef69ef9 462 }
gmehmet 0:ddc2fef69ef9 463
gmehmet 0:ddc2fef69ef9 464
gmehmet 0:ddc2fef69ef9 465 int sh_get_data_type(int *data_type_, bool *sc_en_){
gmehmet 0:ddc2fef69ef9 466
gmehmet 0:ddc2fef69ef9 467 uint8_t ByteSeq[] = SH_GET_OUTPUT_MODE_CMDSEQ;
gmehmet 0:ddc2fef69ef9 468 uint8_t rxbuf[2] = {0};
gmehmet 0:ddc2fef69ef9 469 int status = sh_read_cmd( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 470 0, 0,
gmehmet 0:ddc2fef69ef9 471 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 472 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 473 if (status == 0x00 /*SS_SUCCESS*/) {
gmehmet 0:ddc2fef69ef9 474 *data_type_ =
gmehmet 0:ddc2fef69ef9 475 (rxbuf[1] & SS_MASK_OUTPUTMODE_DATATYPE) >> SS_SHIFT_OUTPUTMODE_DATATYPE;
gmehmet 0:ddc2fef69ef9 476 *sc_en_ =
gmehmet 0:ddc2fef69ef9 477 (bool)((rxbuf[1] & SS_MASK_OUTPUTMODE_SC_EN) >> SS_SHIFT_OUTPUTMODE_SC_EN);
gmehmet 0:ddc2fef69ef9 478
gmehmet 0:ddc2fef69ef9 479 }
gmehmet 0:ddc2fef69ef9 480
gmehmet 0:ddc2fef69ef9 481 return status;
gmehmet 0:ddc2fef69ef9 482
gmehmet 0:ddc2fef69ef9 483 }
gmehmet 0:ddc2fef69ef9 484
gmehmet 0:ddc2fef69ef9 485
gmehmet 0:ddc2fef69ef9 486 int sh_set_fifo_thresh( int threshold ){
gmehmet 0:ddc2fef69ef9 487
gmehmet 0:ddc2fef69ef9 488 #if 0
gmehmet 0:ddc2fef69ef9 489 uint8_t ucThresh = (uint8_t) (threshold & 0xFF);
gmehmet 0:ddc2fef69ef9 490 uint8_t ByteSeq[] = SH_DFIFO_SET_INT_THRESHOLD_CMDSEQ(ucThresh );
gmehmet 0:ddc2fef69ef9 491 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 492 return status;
gmehmet 0:ddc2fef69ef9 493 #endif
gmehmet 0:ddc2fef69ef9 494
gmehmet 0:ddc2fef69ef9 495 uint8_t cmd_bytes[] = { SS_FAM_W_COMMCHAN, SS_CMDIDX_FIFOAFULL };
gmehmet 0:ddc2fef69ef9 496 uint8_t data_bytes[] = { (uint8_t)threshold };
gmehmet 0:ddc2fef69ef9 497
gmehmet 0:ddc2fef69ef9 498 int status = sh_write_cmd_with_data(&cmd_bytes[0], sizeof(cmd_bytes),
gmehmet 0:ddc2fef69ef9 499 &data_bytes[0], sizeof(data_bytes),
gmehmet 0:ddc2fef69ef9 500 SS_DEFAULT_CMD_SLEEP_MS
gmehmet 0:ddc2fef69ef9 501 );
gmehmet 0:ddc2fef69ef9 502 return status;
gmehmet 0:ddc2fef69ef9 503
gmehmet 0:ddc2fef69ef9 504 }
gmehmet 0:ddc2fef69ef9 505
gmehmet 0:ddc2fef69ef9 506
gmehmet 0:ddc2fef69ef9 507 int sh_get_fifo_thresh(int *thresh){
gmehmet 0:ddc2fef69ef9 508
gmehmet 0:ddc2fef69ef9 509 uint8_t ByteSeq[] = SH_DFIFO_GET_INT_THRESHOLD_CMDSEQ;
gmehmet 0:ddc2fef69ef9 510 uint8_t rxbuf[2] = {0};
gmehmet 0:ddc2fef69ef9 511 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 512 0, 0,
gmehmet 0:ddc2fef69ef9 513 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 514 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 515
gmehmet 0:ddc2fef69ef9 516 *thresh = (int) rxbuf[1];
gmehmet 0:ddc2fef69ef9 517
gmehmet 0:ddc2fef69ef9 518 return status;
gmehmet 0:ddc2fef69ef9 519
gmehmet 0:ddc2fef69ef9 520 }
gmehmet 0:ddc2fef69ef9 521
gmehmet 0:ddc2fef69ef9 522
gmehmet 0:ddc2fef69ef9 523 int sh_ss_comm_check(void){
gmehmet 0:ddc2fef69ef9 524
gmehmet 0:ddc2fef69ef9 525
gmehmet 0:ddc2fef69ef9 526 uint8_t ByteSeq[] = SH_COMM_CHECK_CMDSEQ;
gmehmet 0:ddc2fef69ef9 527 uint8_t rxbuf[2];
gmehmet 0:ddc2fef69ef9 528
gmehmet 0:ddc2fef69ef9 529 int status = sh_read_cmd( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 530 0, 0,
gmehmet 0:ddc2fef69ef9 531 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 532 SS_DEFAULT_CMD_SLEEP_MS );
gmehmet 0:ddc2fef69ef9 533
gmehmet 0:ddc2fef69ef9 534 int tries = 4;
gmehmet 0:ddc2fef69ef9 535 while (status == SS_ERR_TRY_AGAIN && tries--) {
gmehmet 0:ddc2fef69ef9 536 wait_ms(1000);
gmehmet 0:ddc2fef69ef9 537 status = sh_read_cmd( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 538 0, 0,
gmehmet 0:ddc2fef69ef9 539 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 540 SS_DEFAULT_CMD_SLEEP_MS );
gmehmet 0:ddc2fef69ef9 541
gmehmet 0:ddc2fef69ef9 542 }
gmehmet 0:ddc2fef69ef9 543
gmehmet 0:ddc2fef69ef9 544 return status;
gmehmet 0:ddc2fef69ef9 545 }
gmehmet 0:ddc2fef69ef9 546
gmehmet 0:ddc2fef69ef9 547
gmehmet 0:ddc2fef69ef9 548 int sh_num_avail_samples(int *numSamples) {
gmehmet 0:ddc2fef69ef9 549
gmehmet 0:ddc2fef69ef9 550 uint8_t ByteSeq[] = SH_DFIFO_GET_NSAMPLES_CMDSEQ;
gmehmet 0:ddc2fef69ef9 551 uint8_t rxbuf[2] = {0};
gmehmet 0:ddc2fef69ef9 552
gmehmet 0:ddc2fef69ef9 553 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 554 0, 0,
gmehmet 0:ddc2fef69ef9 555 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 556 1);
gmehmet 0:ddc2fef69ef9 557
gmehmet 0:ddc2fef69ef9 558 *numSamples = (int) rxbuf[1];
gmehmet 0:ddc2fef69ef9 559
gmehmet 0:ddc2fef69ef9 560 return status;
gmehmet 0:ddc2fef69ef9 561 }
gmehmet 0:ddc2fef69ef9 562
gmehmet 0:ddc2fef69ef9 563
gmehmet 0:ddc2fef69ef9 564 int sh_read_fifo_data( int numSamples,
gmehmet 0:ddc2fef69ef9 565 int sampleSize,
gmehmet 0:ddc2fef69ef9 566 uint8_t* databuf,
gmehmet 0:ddc2fef69ef9 567 int databufSz) {
gmehmet 0:ddc2fef69ef9 568
gmehmet 0:ddc2fef69ef9 569 int bytes_to_read = numSamples * sampleSize + 1; //+1 for status byte
gmehmet 0:ddc2fef69ef9 570
gmehmet 0:ddc2fef69ef9 571 uint8_t ByteSeq[] = SH_DFIFO_PULL_SAMPLE_CMDSEQ;
gmehmet 0:ddc2fef69ef9 572 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 573 0, 0,
gmehmet 0:ddc2fef69ef9 574 databuf, bytes_to_read,
gmehmet 0:ddc2fef69ef9 575 10);
gmehmet 0:ddc2fef69ef9 576
gmehmet 0:ddc2fef69ef9 577 return status;
gmehmet 0:ddc2fef69ef9 578 }
gmehmet 0:ddc2fef69ef9 579
gmehmet 0:ddc2fef69ef9 580
gmehmet 0:ddc2fef69ef9 581 /*
gmehmet 0:ddc2fef69ef9 582 * desc:
gmehmet 0:ddc2fef69ef9 583 * func to read sample size for SmartSensor input FIFO for extrenal accel data
gmehmet 0:ddc2fef69ef9 584 *
gmehmet 0:ddc2fef69ef9 585 * params:
gmehmet 0:ddc2fef69ef9 586 * __O sampSize: size of data sample struct in bytes
gmehmet 0:ddc2fef69ef9 587 * returns:
gmehmet 0:ddc2fef69ef9 588 * 1 byte status (SS_STATUS) : 0x00 (SS_SUCCESS) on success
gmehmet 0:ddc2fef69ef9 589 *
gmehmet 0:ddc2fef69ef9 590 **/
gmehmet 0:ddc2fef69ef9 591 int sh_read_input_fifo_samplesz( int *sampSize){
gmehmet 0:ddc2fef69ef9 592
gmehmet 0:ddc2fef69ef9 593 /* NOT IMPLEMENTED IN SS INTERFACE */
gmehmet 0:ddc2fef69ef9 594
gmehmet 0:ddc2fef69ef9 595 }
gmehmet 0:ddc2fef69ef9 596
gmehmet 0:ddc2fef69ef9 597 /*
gmehmet 0:ddc2fef69ef9 598 * desc:
gmehmet 0:ddc2fef69ef9 599 * func to write data samples to SmartSensor input FIFO for extrenal accel data
gmehmet 0:ddc2fef69ef9 600 *
gmehmet 0:ddc2fef69ef9 601 * params:
gmehmet 0:ddc2fef69ef9 602 ...
gmehmet 0:ddc2fef69ef9 603 * returns:
gmehmet 0:ddc2fef69ef9 604 * 1 byte status (SS_STATUS) : 0x00 (SS_SUCCESS) on success
gmehmet 0:ddc2fef69ef9 605 */
gmehmet 0:ddc2fef69ef9 606 int sh_write_input_fifo( void *arg){
gmehmet 0:ddc2fef69ef9 607
gmehmet 0:ddc2fef69ef9 608 /* NOT IMPLEMENTED IN SS INTERFACE */
gmehmet 0:ddc2fef69ef9 609
gmehmet 0:ddc2fef69ef9 610 }
gmehmet 0:ddc2fef69ef9 611
gmehmet 0:ddc2fef69ef9 612
gmehmet 0:ddc2fef69ef9 613 int sh_set_reg(int idx, uint8_t addr, uint32_t val, int regSz){
gmehmet 0:ddc2fef69ef9 614
gmehmet 0:ddc2fef69ef9 615 uint8_t ByteSeq[] = SH_WRITE_SENSORREG_CMDSEQ( ((uint8_t)idx) , addr );
gmehmet 0:ddc2fef69ef9 616 uint8_t data_bytes[4];
gmehmet 0:ddc2fef69ef9 617 for (int i = 0; i < regSz; i++) {
gmehmet 0:ddc2fef69ef9 618 data_bytes[i] = (val >> (8 * (regSz - 1)) & 0xFF);
gmehmet 0:ddc2fef69ef9 619 }
gmehmet 0:ddc2fef69ef9 620 int status = sh_write_cmd_with_data( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 621 &data_bytes[0], (uint8_t) regSz,
gmehmet 0:ddc2fef69ef9 622 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 623
gmehmet 0:ddc2fef69ef9 624 return status;
gmehmet 0:ddc2fef69ef9 625 }
gmehmet 0:ddc2fef69ef9 626
gmehmet 0:ddc2fef69ef9 627
gmehmet 0:ddc2fef69ef9 628 int sh_get_reg(int idx, uint8_t addr, uint32_t *val){
gmehmet 0:ddc2fef69ef9 629
gmehmet 0:ddc2fef69ef9 630
gmehmet 0:ddc2fef69ef9 631 uint32_t i32tmp;
gmehmet 0:ddc2fef69ef9 632 uint8_t ByteSeq[] = SH_READ_AFE_ATTRIBUTES_CMDSEQ(((uint8_t) idx));
gmehmet 0:ddc2fef69ef9 633 uint8_t rxbuf[3] = {0};
gmehmet 0:ddc2fef69ef9 634
gmehmet 0:ddc2fef69ef9 635 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 636 0, 0,
gmehmet 0:ddc2fef69ef9 637 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 638 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 639
gmehmet 0:ddc2fef69ef9 640
gmehmet 0:ddc2fef69ef9 641 if(status == 0x00 /* SS_SUCCESS */) {
gmehmet 0:ddc2fef69ef9 642
gmehmet 0:ddc2fef69ef9 643 int reg_width = rxbuf[1];
gmehmet 0:ddc2fef69ef9 644 uint8_t ByteSeq2[] = SH_READ_SENSORREG_CMDSEQ( ((uint8_t)idx) , addr );
gmehmet 0:ddc2fef69ef9 645 uint8_t rxbuf2[5] = {0};
gmehmet 0:ddc2fef69ef9 646 status = sh_read_cmd(&ByteSeq2[0], sizeof(ByteSeq2),
gmehmet 0:ddc2fef69ef9 647 0, 0,
gmehmet 0:ddc2fef69ef9 648 &rxbuf2[0], reg_width + 1,
gmehmet 0:ddc2fef69ef9 649 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 650
gmehmet 0:ddc2fef69ef9 651 if (status == 0x00 /* SS_SUCCESS */) {
gmehmet 0:ddc2fef69ef9 652 i32tmp = 0;
gmehmet 0:ddc2fef69ef9 653 for (int i = 0; i < reg_width; i++) {
gmehmet 0:ddc2fef69ef9 654 i32tmp = (i32tmp << 8) | rxbuf2[i + 1];
gmehmet 0:ddc2fef69ef9 655 }
gmehmet 0:ddc2fef69ef9 656 *val = i32tmp;
gmehmet 0:ddc2fef69ef9 657 }
gmehmet 0:ddc2fef69ef9 658 }
gmehmet 0:ddc2fef69ef9 659
gmehmet 0:ddc2fef69ef9 660 return status;
gmehmet 0:ddc2fef69ef9 661
gmehmet 0:ddc2fef69ef9 662 }
gmehmet 0:ddc2fef69ef9 663
gmehmet 0:ddc2fef69ef9 664
gmehmet 0:ddc2fef69ef9 665 int sh_sensor_enable( int idx , int sensorSampleSz , uint8_t ext_mode ){
gmehmet 0:ddc2fef69ef9 666
gmehmet 0:ddc2fef69ef9 667 uint8_t ByteSeq[] = SH_ENABLE_SENSOR_CMDSEQ( ((uint8_t) idx) , ((uint8_t) ext_mode));
gmehmet 0:ddc2fef69ef9 668 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), 5 * SS_ENABLE_SENSOR_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 669 if(status == 0x00){
gmehmet 0:ddc2fef69ef9 670
gmehmet 0:ddc2fef69ef9 671 is_sensor_enabled[idx] = ENABLED;
gmehmet 0:ddc2fef69ef9 672 sensor_sample_sz[idx] = sensorSampleSz;
gmehmet 0:ddc2fef69ef9 673 }
gmehmet 0:ddc2fef69ef9 674 return status;
gmehmet 0:ddc2fef69ef9 675
gmehmet 0:ddc2fef69ef9 676 }
gmehmet 0:ddc2fef69ef9 677
gmehmet 0:ddc2fef69ef9 678
gmehmet 0:ddc2fef69ef9 679 int sh_sensor_disable( int idx ){
gmehmet 0:ddc2fef69ef9 680
gmehmet 0:ddc2fef69ef9 681 uint8_t ByteSeq[] = SH_DISABLE_SENSOR_CMDSEQ( ((uint8_t) idx));
gmehmet 0:ddc2fef69ef9 682 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_ENABLE_SENSOR_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 683 if(status == 0x00){
gmehmet 0:ddc2fef69ef9 684
gmehmet 0:ddc2fef69ef9 685 is_sensor_enabled[idx] = DISABLED;
gmehmet 0:ddc2fef69ef9 686 }
gmehmet 0:ddc2fef69ef9 687 return status;
gmehmet 0:ddc2fef69ef9 688
gmehmet 0:ddc2fef69ef9 689 }
gmehmet 0:ddc2fef69ef9 690
gmehmet 0:ddc2fef69ef9 691
gmehmet 0:ddc2fef69ef9 692 int sh_get_input_fifo_size(int *fifo_size)
gmehmet 0:ddc2fef69ef9 693 {
gmehmet 0:ddc2fef69ef9 694
gmehmet 0:ddc2fef69ef9 695 uint8_t ByteSeq[] = SH_GET_EXTINPUT_FIFOSZ_CMDSEQ;
gmehmet 0:ddc2fef69ef9 696 uint8_t rxbuf[3]; /* status + fifo size */
gmehmet 0:ddc2fef69ef9 697
gmehmet 0:ddc2fef69ef9 698
gmehmet 0:ddc2fef69ef9 699 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 700 0, 0,
gmehmet 0:ddc2fef69ef9 701 rxbuf, sizeof(rxbuf), 2*SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 702
gmehmet 0:ddc2fef69ef9 703 *fifo_size = rxbuf[1] << 8 | rxbuf[2];
gmehmet 0:ddc2fef69ef9 704 return status;
gmehmet 0:ddc2fef69ef9 705 }
gmehmet 0:ddc2fef69ef9 706
gmehmet 0:ddc2fef69ef9 707
gmehmet 0:ddc2fef69ef9 708 int sh_feed_to_input_fifo(uint8_t *tx_buf, int tx_buf_sz, int *nb_written)
gmehmet 0:ddc2fef69ef9 709 {
gmehmet 0:ddc2fef69ef9 710 int status;
gmehmet 0:ddc2fef69ef9 711
gmehmet 0:ddc2fef69ef9 712 uint8_t ByteSeq[] = SH_FEED_TO_INPUTFIFO_CMDSEQ;
gmehmet 0:ddc2fef69ef9 713 uint8_t rxbuf[3];
gmehmet 0:ddc2fef69ef9 714
gmehmet 0:ddc2fef69ef9 715 tx_buf[0] = 0x14;
gmehmet 0:ddc2fef69ef9 716 tx_buf[1] = 0x00;
gmehmet 0:ddc2fef69ef9 717
gmehmet 0:ddc2fef69ef9 718 status= sh_read_cmd(tx_buf, tx_buf_sz,
gmehmet 0:ddc2fef69ef9 719 0, 0,
gmehmet 0:ddc2fef69ef9 720 rxbuf, sizeof(rxbuf), SS_FEEDFIFO_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 721
gmehmet 0:ddc2fef69ef9 722 *nb_written = rxbuf[1] * 256 + rxbuf[2];
gmehmet 0:ddc2fef69ef9 723 return status;
gmehmet 0:ddc2fef69ef9 724 }
gmehmet 0:ddc2fef69ef9 725
gmehmet 0:ddc2fef69ef9 726
gmehmet 0:ddc2fef69ef9 727 int sh_get_num_bytes_in_input_fifo(int *fifo_size)
gmehmet 0:ddc2fef69ef9 728 {
gmehmet 0:ddc2fef69ef9 729
gmehmet 0:ddc2fef69ef9 730 uint8_t ByteSeq[] = SH_GET_SAMPLEBYTECNT_INPUTFIFO_CMDSEQ;
gmehmet 0:ddc2fef69ef9 731 uint8_t rxbuf[3]; /* status + fifo size */
gmehmet 0:ddc2fef69ef9 732
gmehmet 0:ddc2fef69ef9 733
gmehmet 0:ddc2fef69ef9 734 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 735 0, 0,
gmehmet 0:ddc2fef69ef9 736 rxbuf, sizeof(rxbuf),
gmehmet 0:ddc2fef69ef9 737 2*SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 738
gmehmet 0:ddc2fef69ef9 739 *fifo_size = rxbuf[1] << 8 | rxbuf[2];
gmehmet 0:ddc2fef69ef9 740 return status;
gmehmet 0:ddc2fef69ef9 741 }
gmehmet 0:ddc2fef69ef9 742
gmehmet 0:ddc2fef69ef9 743
gmehmet 0:ddc2fef69ef9 744 /*
gmehmet 0:ddc2fef69ef9 745 * ALGARITIM RELATED FUNCTIONS :)
gmehmet 0:ddc2fef69ef9 746 *
gmehmet 0:ddc2fef69ef9 747 *
gmehmet 0:ddc2fef69ef9 748 *
gmehmet 0:ddc2fef69ef9 749 *
gmehmet 0:ddc2fef69ef9 750 *
gmehmet 0:ddc2fef69ef9 751 * */
gmehmet 0:ddc2fef69ef9 752
gmehmet 0:ddc2fef69ef9 753
gmehmet 0:ddc2fef69ef9 754 int sh_enable_algo(int idx , int algoSampleSz){
gmehmet 0:ddc2fef69ef9 755
gmehmet 0:ddc2fef69ef9 756 uint8_t ByteSeq[] = SH_ENABLE_ALGO_CMDSEQ( ((uint8_t) idx) );
gmehmet 0:ddc2fef69ef9 757 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), 25 * SS_ENABLE_SENSOR_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 758 if(status == 0x00){
gmehmet 0:ddc2fef69ef9 759
gmehmet 0:ddc2fef69ef9 760 is_algo_enabled[idx] = ENABLED;
gmehmet 0:ddc2fef69ef9 761 algo_sample_sz[idx] = algoSampleSz;
gmehmet 0:ddc2fef69ef9 762 }
gmehmet 0:ddc2fef69ef9 763 return status;
gmehmet 0:ddc2fef69ef9 764
gmehmet 0:ddc2fef69ef9 765 }
gmehmet 0:ddc2fef69ef9 766
gmehmet 0:ddc2fef69ef9 767
gmehmet 0:ddc2fef69ef9 768 int sh_disable_algo(int idx){
gmehmet 0:ddc2fef69ef9 769
gmehmet 0:ddc2fef69ef9 770 uint8_t ByteSeq[] = SH_DISABLE_ALGO_CMDSEQ( ((uint8_t) idx) );
gmehmet 0:ddc2fef69ef9 771 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_ENABLE_SENSOR_SLEEP_MS );
gmehmet 0:ddc2fef69ef9 772 if(status == 0x00){
gmehmet 0:ddc2fef69ef9 773
gmehmet 0:ddc2fef69ef9 774 is_algo_enabled[idx] = DISABLED;
gmehmet 0:ddc2fef69ef9 775 }
gmehmet 0:ddc2fef69ef9 776 return status;
gmehmet 0:ddc2fef69ef9 777
gmehmet 0:ddc2fef69ef9 778 }
gmehmet 0:ddc2fef69ef9 779
gmehmet 0:ddc2fef69ef9 780
gmehmet 0:ddc2fef69ef9 781 int sh_set_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz){
gmehmet 0:ddc2fef69ef9 782
gmehmet 0:ddc2fef69ef9 783 uint8_t ByteSeq[] = SH_SET_ALGO_CONFIGURATION_CMDSEQ( ((uint8_t) algo_idx) , ((uint8_t) cfg_idx) );
gmehmet 0:ddc2fef69ef9 784 int status = sh_write_cmd_with_data( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 785 cfg, cfg_sz,
gmehmet 0:ddc2fef69ef9 786 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 787
gmehmet 0:ddc2fef69ef9 788 return status;
gmehmet 0:ddc2fef69ef9 789
gmehmet 0:ddc2fef69ef9 790 }
gmehmet 0:ddc2fef69ef9 791
gmehmet 0:ddc2fef69ef9 792
gmehmet 0:ddc2fef69ef9 793 int sh_get_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz){
gmehmet 0:ddc2fef69ef9 794
gmehmet 0:ddc2fef69ef9 795 uint8_t ByteSeq[] = SH_GET_ALGO_CONFIGURATION_CMDSEQ( ((uint8_t) algo_idx) , ((uint8_t) cfg_idx) );
gmehmet 0:ddc2fef69ef9 796 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:ddc2fef69ef9 797 0, 0,
gmehmet 0:ddc2fef69ef9 798 cfg, cfg_sz,
gmehmet 0:ddc2fef69ef9 799 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:ddc2fef69ef9 800 return status;
gmehmet 0:ddc2fef69ef9 801
gmehmet 0:ddc2fef69ef9 802 }
gmehmet 0:ddc2fef69ef9 803
gmehmet 0:ddc2fef69ef9 804
gmehmet 0:ddc2fef69ef9 805 /*
gmehmet 0:ddc2fef69ef9 806 * desc:
gmehmet 0:ddc2fef69ef9 807 * func to get active cumulative sample size of sensor hub in order to
gmehmet 0:ddc2fef69ef9 808 * calculate number of bytes to be read from sensor hub report data buffer
gmehmet 0:ddc2fef69ef9 809 *
gmehmet 0:ddc2fef69ef9 810 * params:
gmehmet 0:ddc2fef69ef9 811 * __I data_type : active data type of sensor hub -> no data :0 (SS_DATATYPE_PAUSE)
gmehmet 0:ddc2fef69ef9 812 * raw sensor data only :1 (SS_DATATYPE_RAW)
gmehmet 0:ddc2fef69ef9 813 * algo data only :2 (SS_DATATYPE_ALGO)
gmehmet 0:ddc2fef69ef9 814 * algo+raw data :3 (SS_DATATYPE_BOTH)
gmehmet 0:ddc2fef69ef9 815 * __O sample_size : calculated active cumulative sample size
gmehmet 0:ddc2fef69ef9 816
gmehmet 0:ddc2fef69ef9 817 * returns:
gmehmet 0:ddc2fef69ef9 818 * N/A
gmehmet 0:ddc2fef69ef9 819 *
gmehmet 0:ddc2fef69ef9 820 **/
gmehmet 0:ddc2fef69ef9 821 static void fifo_sample_size(int data_type_, int *sample_size)
gmehmet 0:ddc2fef69ef9 822 {
gmehmet 0:ddc2fef69ef9 823
gmehmet 0:ddc2fef69ef9 824 int tmpSz = 0;
gmehmet 0:ddc2fef69ef9 825 //*sample_size = 0;
gmehmet 0:ddc2fef69ef9 826
gmehmet 0:ddc2fef69ef9 827 if (data_type_ == SS_DATATYPE_RAW || data_type_ == SS_DATATYPE_BOTH) {
gmehmet 0:ddc2fef69ef9 828 for (int i = 0; i < SS_MAX_SUPPORTED_SENSOR_NUM; i++) {
gmehmet 0:ddc2fef69ef9 829 if (is_sensor_enabled[i]) {
gmehmet 0:ddc2fef69ef9 830 tmpSz += sensor_sample_sz[i];
gmehmet 0:ddc2fef69ef9 831 //*sample_size += sensor_data_reqs[i]->data_size;
gmehmet 0:ddc2fef69ef9 832 }
gmehmet 0:ddc2fef69ef9 833 }
gmehmet 0:ddc2fef69ef9 834 }
gmehmet 0:ddc2fef69ef9 835
gmehmet 0:ddc2fef69ef9 836 if (data_type_ == SS_DATATYPE_ALGO || data_type_ == SS_DATATYPE_BOTH) {
gmehmet 0:ddc2fef69ef9 837 for (int i = 0; i < SS_MAX_SUPPORTED_ALGO_NUM; i++) {
gmehmet 0:ddc2fef69ef9 838 if (is_algo_enabled[i]) {
gmehmet 0:ddc2fef69ef9 839 tmpSz += algo_sample_sz[i];
gmehmet 0:ddc2fef69ef9 840 //*sample_size += algo_data_reqs[i]->data_size;
gmehmet 0:ddc2fef69ef9 841 }
gmehmet 0:ddc2fef69ef9 842 }
gmehmet 0:ddc2fef69ef9 843 }
gmehmet 0:ddc2fef69ef9 844
gmehmet 0:ddc2fef69ef9 845 *sample_size = tmpSz;
gmehmet 0:ddc2fef69ef9 846 }
gmehmet 0:ddc2fef69ef9 847
gmehmet 0:ddc2fef69ef9 848
gmehmet 0:ddc2fef69ef9 849 void sh_ss_execute_once( uint8_t *databuf , int databufLen , int *nSamplesRead){
gmehmet 0:ddc2fef69ef9 850
gmehmet 0:ddc2fef69ef9 851 if(m_irq_received_ == false) {
gmehmet 0:ddc2fef69ef9 852 *nSamplesRead = 0;
gmehmet 0:ddc2fef69ef9 853 return;
gmehmet 0:ddc2fef69ef9 854 }
gmehmet 0:ddc2fef69ef9 855
gmehmet 0:ddc2fef69ef9 856 uint8_t sample_count;
gmehmet 0:ddc2fef69ef9 857
gmehmet 0:ddc2fef69ef9 858 sh_disable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 859 sh_clear_mfio_event_flag();
gmehmet 0:ddc2fef69ef9 860
gmehmet 0:ddc2fef69ef9 861 uint8_t hubStatus = 0;
gmehmet 0:ddc2fef69ef9 862 int status = sh_get_sensorhub_status(&hubStatus);
gmehmet 0:ddc2fef69ef9 863 if(status != 0x00 /*SS_SUCCESS*/){
gmehmet 0:ddc2fef69ef9 864 sh_enable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 865 return;
gmehmet 0:ddc2fef69ef9 866 }
gmehmet 0:ddc2fef69ef9 867
gmehmet 0:ddc2fef69ef9 868 if (hubStatus & SS_MASK_STATUS_DATA_RDY) {
gmehmet 0:ddc2fef69ef9 869
gmehmet 0:ddc2fef69ef9 870 int num_samples = 1;
gmehmet 0:ddc2fef69ef9 871 status = sh_num_avail_samples(&num_samples);
gmehmet 0:ddc2fef69ef9 872 if (status != 0x00 /*SS_SUCCESS*/){
gmehmet 0:ddc2fef69ef9 873 sh_enable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 874 return;
gmehmet 0:ddc2fef69ef9 875 }
gmehmet 0:ddc2fef69ef9 876
gmehmet 0:ddc2fef69ef9 877
gmehmet 0:ddc2fef69ef9 878 int sample_size;
gmehmet 0:ddc2fef69ef9 879 fifo_sample_size(data_type, &sample_size);
gmehmet 0:ddc2fef69ef9 880 /*DEBUG *///
gmehmet 0:ddc2fef69ef9 881 //printf("____DATA READY %d %d \n", (int)num_samples, sample_size);
gmehmet 0:ddc2fef69ef9 882
gmehmet 0:ddc2fef69ef9 883 int bytes_to_read = num_samples * sample_size + 1; //+1 for status byte
gmehmet 0:ddc2fef69ef9 884 if ((uint32_t)bytes_to_read > databufLen) {
gmehmet 0:ddc2fef69ef9 885 //Reduce number of samples to read to fit in buffer
gmehmet 0:ddc2fef69ef9 886 num_samples = (databufLen - 1) / sample_size;
gmehmet 0:ddc2fef69ef9 887 }
gmehmet 0:ddc2fef69ef9 888 wait_ms(5);
gmehmet 0:ddc2fef69ef9 889 status = sh_read_fifo_data(num_samples, sample_size, &databuf[0], databufLen);
gmehmet 0:ddc2fef69ef9 890 if(status != 0x00 /*SS_SUCCESS*/){
gmehmet 0:ddc2fef69ef9 891 *nSamplesRead = 0;
gmehmet 0:ddc2fef69ef9 892 sh_enable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 893 return;
gmehmet 0:ddc2fef69ef9 894 }
gmehmet 0:ddc2fef69ef9 895 *nSamplesRead = num_samples;
gmehmet 0:ddc2fef69ef9 896
gmehmet 0:ddc2fef69ef9 897 }
gmehmet 0:ddc2fef69ef9 898
gmehmet 0:ddc2fef69ef9 899 sh_enable_irq_mfioevent();
gmehmet 0:ddc2fef69ef9 900 return;
gmehmet 0:ddc2fef69ef9 901 }
gmehmet 0:ddc2fef69ef9 902
gmehmet 0:ddc2fef69ef9 903
gmehmet 0:ddc2fef69ef9 904
gmehmet 0:ddc2fef69ef9 905
gmehmet 0:ddc2fef69ef9 906
gmehmet 0:ddc2fef69ef9 907
gmehmet 0:ddc2fef69ef9 908 /*
gmehmet 0:ddc2fef69ef9 909 #ifdef __cplusplus
gmehmet 0:ddc2fef69ef9 910 }
gmehmet 0:ddc2fef69ef9 911 #endif
gmehmet 0:ddc2fef69ef9 912 */
gmehmet 0:ddc2fef69ef9 913