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

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 1:f60eafbf009a 1 /*******************************************************************************
gmehmet 1:f60eafbf009a 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 1:f60eafbf009a 3 *
gmehmet 1:f60eafbf009a 4 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 1:f60eafbf009a 5 * copy of this software and associated documentation files (the "Software"),
gmehmet 1:f60eafbf009a 6 * to deal in the Software without restriction, including without limitation
gmehmet 1:f60eafbf009a 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 1:f60eafbf009a 8 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 1:f60eafbf009a 9 * Software is furnished to do so, subject to the following conditions:
gmehmet 1:f60eafbf009a 10 *
gmehmet 1:f60eafbf009a 11 * The above copyright notice and this permission notice shall be included
gmehmet 1:f60eafbf009a 12 * in all copies or substantial portions of the Software.
gmehmet 1:f60eafbf009a 13 *
gmehmet 1:f60eafbf009a 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 1:f60eafbf009a 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 1:f60eafbf009a 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 1:f60eafbf009a 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 1:f60eafbf009a 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 1:f60eafbf009a 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 1:f60eafbf009a 20 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 1:f60eafbf009a 21 *
gmehmet 1:f60eafbf009a 22 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 1:f60eafbf009a 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 1:f60eafbf009a 24 * Products, Inc. Branding Policy.
gmehmet 1:f60eafbf009a 25 *
gmehmet 1:f60eafbf009a 26 * The mere transfer of this software does not imply any licenses
gmehmet 1:f60eafbf009a 27 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 1:f60eafbf009a 28 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 1:f60eafbf009a 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 1:f60eafbf009a 30 * ownership rights.
gmehmet 1:f60eafbf009a 31 *******************************************************************************
gmehmet 1:f60eafbf009a 32 */
gmehmet 1:f60eafbf009a 33
gmehmet 1:f60eafbf009a 34 #ifndef _MAX8614X_H_
gmehmet 1:f60eafbf009a 35 #define _MAX8614X_H_
gmehmet 1:f60eafbf009a 36
gmehmet 1:f60eafbf009a 37 #include "mbed.h"
gmehmet 1:f60eafbf009a 38 #include <queue>
gmehmet 1:f60eafbf009a 39 #include "MaximSensor.h"
gmehmet 1:f60eafbf009a 40 #include "PpgComm.h"
gmehmet 1:f60eafbf009a 41
gmehmet 1:f60eafbf009a 42 #define SENSOR_ID_MAX8614X 0x02
gmehmet 1:f60eafbf009a 43
gmehmet 1:f60eafbf009a 44 /**
gmehmet 1:f60eafbf009a 45 * @brief MAX8614X - supports MAX8614X object with SPI interface
gmehmet 1:f60eafbf009a 46 * @details The MAX8614X is a complete integrated optical data acquistion
gmehmet 1:f60eafbf009a 47 * system, ideal for optical pulse oximetry and heart rate detection
gmehmet 1:f60eafbf009a 48 * applications. High resolution optical readout signal processing channels
gmehmet 1:f60eafbf009a 49 * with ambient light cancellation and high current LED driver DACS form a
gmehmet 1:f60eafbf009a 50 * complete optical readout signal chain. Features are ultra-low power heart
gmehmet 1:f60eafbf009a 51 * rate monitoring, SpO2 monitoring, SmO2 & StO2 detection.
gmehmet 1:f60eafbf009a 52 * Typical applications are for wearable devices, fitness devices, clinical
gmehmet 1:f60eafbf009a 53 * monitoring, partical detection.
gmehmet 1:f60eafbf009a 54 */
gmehmet 1:f60eafbf009a 55 class MAX8614X: public MaximSensor
gmehmet 1:f60eafbf009a 56 {
gmehmet 1:f60eafbf009a 57 public:
gmehmet 1:f60eafbf009a 58 /* PUBLIC CONST VARIABLES */
gmehmet 1:f60eafbf009a 59
gmehmet 1:f60eafbf009a 60 ///Return value on success.
gmehmet 1:f60eafbf009a 61 static const int8_t RTN_NO_ERROR = 0;
gmehmet 1:f60eafbf009a 62 ///Return value on unsupported MAX8614x.
gmehmet 1:f60eafbf009a 63 static const int8_t RTN_ERR_UNSOPPORTED_PART = -1;
gmehmet 1:f60eafbf009a 64 ///Return value on reading wrong-type data from sensor FIFO
gmehmet 1:f60eafbf009a 65 static const int8_t RTN_ERR_WRONG_DATA_TYPE = -2;
gmehmet 1:f60eafbf009a 66 ///Return value on no plugged 8614x.
gmehmet 1:f60eafbf009a 67 static const int8_t RTN_ERR_NOT_8614x = -3;
gmehmet 1:f60eafbf009a 68 ///Return value on memory allocation failure
gmehmet 1:f60eafbf009a 69 static const int8_t RTN_ERR_MEM_ALLOC_FAIL = -4;
gmehmet 1:f60eafbf009a 70 ///Return value on internal queue init
gmehmet 1:f60eafbf009a 71 static const int8_t RTN_ERR_QUEUE_INIT = -5;
gmehmet 1:f60eafbf009a 72 ///Return value on the case of no available data on queue
gmehmet 1:f60eafbf009a 73 static const int8_t RTN_ERR_QUEUE_EMPTY = -6;
gmehmet 1:f60eafbf009a 74
gmehmet 1:f60eafbf009a 75 // AGC Range Enums:
gmehmet 1:f60eafbf009a 76 enum Max8614x_Agc_Range{
gmehmet 1:f60eafbf009a 77 kRangeLow,
gmehmet 1:f60eafbf009a 78 kRangeMid,
gmehmet 1:f60eafbf009a 79 kRangeHigh,
gmehmet 1:f60eafbf009a 80 };
gmehmet 1:f60eafbf009a 81
gmehmet 1:f60eafbf009a 82 /// This is MAX8614X Registers
gmehmet 1:f60eafbf009a 83 enum Registers
gmehmet 1:f60eafbf009a 84 {
gmehmet 1:f60eafbf009a 85 MAX8614X_INT_STATUS1_REG = 0x00,///< INT status REG is cleared when it is read
gmehmet 1:f60eafbf009a 86 MAX8614X_INT_STATUS2_REG, ///< INT status set to 1 when the Authentication Algorithm completes
gmehmet 1:f60eafbf009a 87 MAX8614X_INT_ENABLE1_REG, ///< Enables INT for FIFO Almost Full or DATA_RDY_EN or ALC_OVF ...
gmehmet 1:f60eafbf009a 88 MAX8614X_INT_ENABLE2_REG, ///< Enables SHA_DONE interrupt
gmehmet 1:f60eafbf009a 89 MAX8614X_FIFO_WR_PTR_REG, ///< Points to the location where the next sample will be written
gmehmet 1:f60eafbf009a 90 MAX8614X_FIFO_RD_PTR_REG, ///< Points the location from where the processor gets the next sample from the FIFO
gmehmet 1:f60eafbf009a 91 MAX8614X_OVF_CNT_REG, ///< FIFO Overflow Counter
gmehmet 1:f60eafbf009a 92 MAX8614X_FIFO_DATA_CNT_REG, ///< Holds the number of items available in the FIFO for the host to read
gmehmet 1:f60eafbf009a 93 MAX8614X_FIFO_DATA_REG, ///< FIFO_DATA
gmehmet 1:f60eafbf009a 94 MAX8614X_FIFO_CFG1_REG, ///< Sets how many new samples can be written to the FIFO before the interrupt
gmehmet 1:f60eafbf009a 95 MAX8614X_FIFO_CFG2_REG, ///< //0x0A
gmehmet 1:f60eafbf009a 96 MAX8614X_SYSTEM_CTRL_REG = 0x0D, ///< System Control REG
gmehmet 1:f60eafbf009a 97 MAX8614X_PPG_SYNC_CTRL_REG = 0x10, ///< Aborts current sample and starts a new sample
gmehmet 1:f60eafbf009a 98 MAX8614X_PPG_CFG1_REG, ///< PPG config for adc range control, led_pw etc.
gmehmet 1:f60eafbf009a 99 MAX8614X_PPG_CFG2_REG, ///< PPG config for sampling rate
gmehmet 1:f60eafbf009a 100 MAX8614X_PPG_CFG3_REG, ///< PPG config for burst rate
gmehmet 1:f60eafbf009a 101 MAX8614X_PROX_INT_THRES_REG, ///< Proximity Mode Interrupt Threshold
gmehmet 1:f60eafbf009a 102 MAX8614X_PHOTO_DIODE_BIAS_REG, ///<
gmehmet 1:f60eafbf009a 103 MAX8614X_FICKET_FENCE_REG, //0x16
gmehmet 1:f60eafbf009a 104 MAX8614X_LED_SEQ1_REG = 0x20, ///< LED Sequence Register 1
gmehmet 1:f60eafbf009a 105 MAX8614X_LED_SEQ2_REG,///< LED Sequence Register 2
gmehmet 1:f60eafbf009a 106 MAX8614X_LED_SEQ3_REG, ///< LED Sequence Register 3
gmehmet 1:f60eafbf009a 107 MAX8614X_LED1_PA_REG, ///< LED 1 Drive Current
gmehmet 1:f60eafbf009a 108 MAX8614X_LED2_PA_REG, ///< LED 2 Drive Current
gmehmet 1:f60eafbf009a 109 MAX8614X_LED3_PA_REG, ///< LED 3 Drive Current
gmehmet 1:f60eafbf009a 110 MAX8614X_LED4_PA_REG, ///< LED 4 Drive Current
gmehmet 1:f60eafbf009a 111 MAX8614X_LED5_PA_REG, ///< LED 5 Drive Current
gmehmet 1:f60eafbf009a 112 MAX8614X_LED6_PA_REG, ///< LED 6 Drive Current
gmehmet 1:f60eafbf009a 113 MAX8614X_LED_PILOT_PA_REG, ///< Proximity Mode LED Pulse Amplitude
gmehmet 1:f60eafbf009a 114 MAX8614X_LED_RANGE1_REG, ///< LED range 1
gmehmet 1:f60eafbf009a 115 MAX8614X_LED_RANGE2_REG, ///< LEd range 2 //0x2B
gmehmet 1:f60eafbf009a 116 MAX8614X_DIE_TEMP_CFG_REG = 0x40,///< Enables one temperature measurement
gmehmet 1:f60eafbf009a 117 MAX8614X_DIE_TEMP_INT_REG, ///< Stores the integer temperature data
gmehmet 1:f60eafbf009a 118 MAX8614X_DIE_TEMP_FRAC_REG,///<
gmehmet 1:f60eafbf009a 119 MAX8614X_SHA_CMD_REG = 0xF0, ///<
gmehmet 1:f60eafbf009a 120 MAX8614X_SHA_CFG_REG, ///<
gmehmet 1:f60eafbf009a 121 MAX8614X_MEMORY_CONTROL_REG, ///<
gmehmet 1:f60eafbf009a 122 MAX8614X_MEMORY_INDEX_REG, ///<
gmehmet 1:f60eafbf009a 123 MAX8614X_MEMORY_DATA_REG, ///<
gmehmet 1:f60eafbf009a 124 MAX8614X_REV_ID_REG = 0xFE, ///< Chip Rev. ID Code
gmehmet 1:f60eafbf009a 125 MAX8614X_PART_ID_REG, ///< Chip Part ID Code
gmehmet 1:f60eafbf009a 126
gmehmet 1:f60eafbf009a 127 };
gmehmet 1:f60eafbf009a 128
gmehmet 1:f60eafbf009a 129 ///System Control
gmehmet 1:f60eafbf009a 130 static const uint8_t MAX8614X_SYSTEM_RESET_MASK = (0x01 << 0);
gmehmet 1:f60eafbf009a 131 static const uint8_t MAX8614X_SYSTEM_SHDN_MASK = (0x01 << 1);
gmehmet 1:f60eafbf009a 132 static const uint8_t MAX8614X_SYSTEM_LP_BOOST = (0x01 << 2);
gmehmet 1:f60eafbf009a 133
gmehmet 1:f60eafbf009a 134 /// Die Temperature
gmehmet 1:f60eafbf009a 135 static const uint8_t MAX8614X_DIE_TEMP_EN = (0x1 << 0);
gmehmet 1:f60eafbf009a 136 static const uint8_t MAX8614X_DIE_TEMP_FRAC_MASK = (0xF << 0);
gmehmet 1:f60eafbf009a 137
gmehmet 1:f60eafbf009a 138 ///Sample rates
gmehmet 1:f60eafbf009a 139 static const uint8_t MAX8614X_PPG_SR_25_SPS = (0x00 << 3);
gmehmet 1:f60eafbf009a 140 static const uint8_t MAX8614X_PPG_SR_50_SPS = (0x01 << 3);
gmehmet 1:f60eafbf009a 141 static const uint8_t MAX8614X_PPG_SR_84_SPS = (0x02 << 3);
gmehmet 1:f60eafbf009a 142 static const uint8_t MAX8614X_PPG_SR_100_SPS = (0x03 << 3);
gmehmet 1:f60eafbf009a 143 static const uint8_t MAX8614X_PPG_SR_200_SPS = (0x04 << 3);
gmehmet 1:f60eafbf009a 144 static const uint8_t MAX8614X_PPG_SR_400_SPS = (0x05 << 3);
gmehmet 1:f60eafbf009a 145 static const uint8_t MAX8614X_PPG_SR_512_SPS = (0x10 << 3);
gmehmet 1:f60eafbf009a 146 static const uint8_t MAX8614X_PPG_SR_1024_SPS = (0x11 << 3);
gmehmet 1:f60eafbf009a 147 static const uint8_t MAX8614X_PPG_SR_2048_SPS = (0x12 << 3);
gmehmet 1:f60eafbf009a 148 static const uint8_t MAX8614X_PPG_SR_4096_SPS = (0x13 << 3);
gmehmet 1:f60eafbf009a 149
gmehmet 1:f60eafbf009a 150 /// LED Pulse Amplitude
gmehmet 1:f60eafbf009a 151 static const uint8_t MAX8614X_LED1_RGE_MASK = (0x3 << 0);
gmehmet 1:f60eafbf009a 152 static const uint8_t MAX8614X_LED2_RGE_MASK = (0x3 << 2);
gmehmet 1:f60eafbf009a 153 static const uint8_t MAX8614X_LED3_RGE_MASK = (0x3 << 4);
gmehmet 1:f60eafbf009a 154
gmehmet 1:f60eafbf009a 155 static const uint8_t MAX8614X_LED4_RGE_MASK = (0x3 << 0);
gmehmet 1:f60eafbf009a 156 static const uint8_t MAX8614X_LED5_RGE_MASK = (0x3 << 2);
gmehmet 1:f60eafbf009a 157 static const uint8_t MAX8614X_LED6_RGE_MASK = (0x3 << 4);
gmehmet 1:f60eafbf009a 158
gmehmet 1:f60eafbf009a 159 static const uint8_t MAX8614X_LED1_RGE_25mA_MASK = (0x0 << 0);
gmehmet 1:f60eafbf009a 160 static const uint8_t MAX8614X_LED1_RGE_50mA_MASK = (0x1 << 0);
gmehmet 1:f60eafbf009a 161 static const uint8_t MAX8614X_LED1_RGE_75mA_MASK = (0x2 << 0);
gmehmet 1:f60eafbf009a 162 static const uint8_t MAX8614X_LED1_RGE_100mA_MASK = (0x3 << 0);
gmehmet 1:f60eafbf009a 163
gmehmet 1:f60eafbf009a 164 static const uint8_t MAX8614X_LED2_RGE_25mA_MASK = (0x0 << 2);
gmehmet 1:f60eafbf009a 165 static const uint8_t MAX8614X_LED2_RGE_50mA_MASK = (0x1 << 2);
gmehmet 1:f60eafbf009a 166 static const uint8_t MAX8614X_LED2_RGE_75mA_MASK = (0x2 << 2);
gmehmet 1:f60eafbf009a 167 static const uint8_t MAX8614X_LED2_RGE_100mA_MASK = (0x3 << 2);
gmehmet 1:f60eafbf009a 168
gmehmet 1:f60eafbf009a 169 static const uint8_t MAX8614X_LED3_RGE_25mA_MASK = (0x0 << 4);
gmehmet 1:f60eafbf009a 170 static const uint8_t MAX8614X_LED3_RGE_50mA_MASK = (0x1 << 4);
gmehmet 1:f60eafbf009a 171 static const uint8_t MAX8614X_LED3_RGE_75mA_MASK = (0x2 << 4);
gmehmet 1:f60eafbf009a 172 static const uint8_t MAX8614X_LED3_RGE_100mA_MASK = (0x3 << 4);
gmehmet 1:f60eafbf009a 173
gmehmet 1:f60eafbf009a 174 /// PPG PW
gmehmet 1:f60eafbf009a 175 static const uint8_t MAX8614X_PPG_LED_PW_14_4_US_MASK = (0 << 0);
gmehmet 1:f60eafbf009a 176 static const uint8_t MAX8614X_PPG_LED_PW_28_8_US_MASK = (1 << 0);
gmehmet 1:f60eafbf009a 177 static const uint8_t MAX8614X_PPG_LED_PW_57_6_US_MASK = (2 << 0);
gmehmet 1:f60eafbf009a 178 static const uint8_t MAX8614X_PPG_LED_PW_115_2_US_MASK = (3 << 0);
gmehmet 1:f60eafbf009a 179
gmehmet 1:f60eafbf009a 180 /// PPG Range
gmehmet 1:f60eafbf009a 181 static const uint8_t MAX8614X_PPG1_ADC_RGE_4096_MASK = (0 << 2);
gmehmet 1:f60eafbf009a 182 static const uint8_t MAX8614X_PPG1_ADC_RGE_8192_MASK = (1 << 2);
gmehmet 1:f60eafbf009a 183 static const uint8_t MAX8614X_PPG1_ADC_RGE_16384_MASK = (2 << 2);
gmehmet 1:f60eafbf009a 184 static const uint8_t MAX8614X_PPG1_ADC_RGE_32768_MASK = (3 << 2);
gmehmet 1:f60eafbf009a 185
gmehmet 1:f60eafbf009a 186 static const uint8_t MAX8614X_PPG2_ADC_RGE_4096_MASK = (0 << 4);
gmehmet 1:f60eafbf009a 187 static const uint8_t MAX8614X_PPG2_ADC_RGE_8192_MASK = (1 << 4);
gmehmet 1:f60eafbf009a 188 static const uint8_t MAX8614X_PPG2_ADC_RGE_16384_MASK = (2 << 4);
gmehmet 1:f60eafbf009a 189 static const uint8_t MAX8614X_PPG2_ADC_RGE_32768_MASK = (3 << 4);
gmehmet 1:f60eafbf009a 190
gmehmet 1:f60eafbf009a 191 ///FIFO
gmehmet 1:f60eafbf009a 192 static const uint8_t MAX8614X_FIFO_WR_PTR_MASK = (0x7F << 0);
gmehmet 1:f60eafbf009a 193 static const uint8_t MAX8614X_FIFO_RD_PTR_MASK = (0x7F << 0);
gmehmet 1:f60eafbf009a 194 static const uint8_t MAX8614X_OVF_CNT_MASK = (0x7F << 0);
gmehmet 1:f60eafbf009a 195 static const uint8_t MAX8614X_FIFO_A_FULL_MASK = (0x7F << 0);
gmehmet 1:f60eafbf009a 196 static const uint8_t MAX8614X_FIFO_EN_MASK = (0x01 << 0);
gmehmet 1:f60eafbf009a 197 static const uint8_t MAX8614X_FIFO_RO_MASK = (0x01 << 1);
gmehmet 1:f60eafbf009a 198 static const uint8_t MAX8614X_A_FULL_TYPE_MASK = (0x01 << 2);
gmehmet 1:f60eafbf009a 199 static const uint8_t MAX8614X_A_FULL_RPT = (0x00 << 2);
gmehmet 1:f60eafbf009a 200 static const uint8_t MAX8614X_A_FULL_ONCE = (0x01 << 2);
gmehmet 1:f60eafbf009a 201 static const uint8_t MAX8614X_FIFO_STAT_CLR_MASK = (0x01 << 3);
gmehmet 1:f60eafbf009a 202 static const uint8_t MAX8614X_FLUSH_FIFO_MASK = (0x01 << 4);
gmehmet 1:f60eafbf009a 203
gmehmet 1:f60eafbf009a 204 /// Status
gmehmet 1:f60eafbf009a 205 static const uint8_t MAX8614X_INT1_EN_A_FULL_MASK = (0x1 << 7);
gmehmet 1:f60eafbf009a 206 static const uint8_t MAX8614X_INT1_EN_DATA_RDY_MASK = (0x1 << 6);
gmehmet 1:f60eafbf009a 207 static const uint8_t MAX8614X_INT1_EN_DIE_TEMP_MASK = (0x1 << 2);
gmehmet 1:f60eafbf009a 208 static const uint8_t MAX8614X_INT1_EN_VDD_OOR_MASK = (0x1 << 1);
gmehmet 1:f60eafbf009a 209
gmehmet 1:f60eafbf009a 210 /* PUBLIC TYPE DEFINITIONS */
gmehmet 1:f60eafbf009a 211
gmehmet 1:f60eafbf009a 212 /// RegisterMap entry to keep a register addr and its value
gmehmet 1:f60eafbf009a 213 typedef struct RegisterMap {
gmehmet 1:f60eafbf009a 214 uint8_t addr; ///< Register addr
gmehmet 1:f60eafbf009a 215 uint8_t val; ///< Value that will be written to this register
gmehmet 1:f60eafbf009a 216 } RegisterMap_t;
gmehmet 1:f60eafbf009a 217
gmehmet 1:f60eafbf009a 218 /* PUBLIC FUNCTION DECLARATIONS */
gmehmet 1:f60eafbf009a 219 ///@brief MAX8614X Constructor.\n
gmehmet 1:f60eafbf009a 220 ///
gmehmet 1:f60eafbf009a 221 ///On Entry:
gmehmet 1:f60eafbf009a 222 ///@param[in] spiBus - reference to SPI bus for this device
gmehmet 1:f60eafbf009a 223 ///@param[in] cs - reference to chip select of SPI bus for this device
gmehmet 1:f60eafbf009a 224 ///@param[in] intPin - pin name to data ready INT for this device
gmehmet 1:f60eafbf009a 225 ///On Exit:
gmehmet 1:f60eafbf009a 226 ///
gmehmet 1:f60eafbf009a 227 ///@returns none
gmehmet 1:f60eafbf009a 228 MAX8614X(SPI &spiBus, DigitalOut &cs, PinName intPin);
gmehmet 1:f60eafbf009a 229
gmehmet 1:f60eafbf009a 230 ///@brief Reads from register.\n
gmehmet 1:f60eafbf009a 231 ///
gmehmet 1:f60eafbf009a 232 ///On Entry:
gmehmet 1:f60eafbf009a 233 ///@param[in] data - pointer to memory for storing read data
gmehmet 1:f60eafbf009a 234 ///@param[in] len - len to read data
gmehmet 1:f60eafbf009a 235 ///
gmehmet 1:f60eafbf009a 236 ///On Exit:
gmehmet 1:f60eafbf009a 237 ///@param[out] data - holds contents of read register on success
gmehmet 1:f60eafbf009a 238 ///
gmehmet 1:f60eafbf009a 239 ///@returns 0 on success, non 0 on failure
gmehmet 1:f60eafbf009a 240 virtual int readRegister(uint8_t reg, uint8_t *data, int len);
gmehmet 1:f60eafbf009a 241
gmehmet 1:f60eafbf009a 242 ///@brief Writes a single register.\n
gmehmet 1:f60eafbf009a 243 ///
gmehmet 1:f60eafbf009a 244 ///On Entry:
gmehmet 1:f60eafbf009a 245 ///@param[in] data - data to write to register
gmehmet 1:f60eafbf009a 246 ///
gmehmet 1:f60eafbf009a 247 ///@returns 0 on success, non 0 on failure
gmehmet 1:f60eafbf009a 248 virtual int writeRegister(uint8_t reg, const uint8_t data);
gmehmet 1:f60eafbf009a 249
gmehmet 1:f60eafbf009a 250 ///@brief Writes a block of registers\n
gmehmet 1:f60eafbf009a 251 ///On Entry:
gmehmet 1:f60eafbf009a 252 ///@param[in] reg_block - block of registers and values written to them
gmehmet 1:f60eafbf009a 253 ///@param[in] data - pointer to data to write to registers
gmehmet 1:f60eafbf009a 254 ///
gmehmet 1:f60eafbf009a 255 ///On Exit:
gmehmet 1:f60eafbf009a 256 ///@param[out] none
gmehmet 1:f60eafbf009a 257 ///
gmehmet 1:f60eafbf009a 258 ///@returns 0 on success, non 0 on failure
gmehmet 1:f60eafbf009a 259 virtual int writeBlock(const RegisterMap reg_block[], unsigned int size);
gmehmet 1:f60eafbf009a 260
gmehmet 1:f60eafbf009a 261 ///@brief Dequeue ppg sample from the queue\n
gmehmet 1:f60eafbf009a 262 ///
gmehmet 1:f60eafbf009a 263 ///On Entry:
gmehmet 1:f60eafbf009a 264 ///@param[in] ir - ref to int value
gmehmet 1:f60eafbf009a 265 ///@param[in] red - ref to int value
gmehmet 1:f60eafbf009a 266 ///@param[in] green - ref to int value
gmehmet 1:f60eafbf009a 267 ///
gmehmet 1:f60eafbf009a 268 ///On Exit:
gmehmet 1:f60eafbf009a 269 ///@param[out] ir - ref to int value
gmehmet 1:f60eafbf009a 270 ///@param[out] red - ref to int value
gmehmet 1:f60eafbf009a 271 ///@param[out] green - ref to int value
gmehmet 1:f60eafbf009a 272 ///
gmehmet 1:f60eafbf009a 273 ///@returns 0 on success, non 0 on no available sample on queue
gmehmet 1:f60eafbf009a 274 virtual int dequeue_from_fifo_queue(uint32_t *ir, uint32_t *red, uint32_t *green);
gmehmet 1:f60eafbf009a 275
gmehmet 1:f60eafbf009a 276 ///@brief Get Sensor Part ID and Rev ID\n
gmehmet 1:f60eafbf009a 277 ///On Entry:
gmehmet 1:f60eafbf009a 278 ///@param[in] part_id - ref to pre-allocated str
gmehmet 1:f60eafbf009a 279 ///@param[in] rev_id - ref to pre-allocated str
gmehmet 1:f60eafbf009a 280 ///
gmehmet 1:f60eafbf009a 281 ///On Exit:
gmehmet 1:f60eafbf009a 282 ///@param[out] part_id - ref to part ID
gmehmet 1:f60eafbf009a 283 ///@param[out] rev_id - ref to rev. ID
gmehmet 1:f60eafbf009a 284 ///
gmehmet 1:f60eafbf009a 285 ///@returns 0 on success, non 0 on failure
gmehmet 1:f60eafbf009a 286 virtual int get_part_info(uint8_t *part_id, uint8_t *rev_id);
gmehmet 1:f60eafbf009a 287
gmehmet 1:f60eafbf009a 288 ///@brief Initialize internal queue, counters etc.
gmehmet 1:f60eafbf009a 289 ///@returns 0 on success, non 0 on failure
gmehmet 1:f60eafbf009a 290 int init();
gmehmet 1:f60eafbf009a 291
gmehmet 1:f60eafbf009a 292 ///@brief Get hard-coded part name\n
gmehmet 1:f60eafbf009a 293 ///@returns max86141
gmehmet 1:f60eafbf009a 294 virtual const char *get_sensor_part_name();
gmehmet 1:f60eafbf009a 295
gmehmet 1:f60eafbf009a 296 ///@brief Get hard-coded sensor type\n
gmehmet 1:f60eafbf009a 297 ///@returns ppg
gmehmet 1:f60eafbf009a 298 virtual const char *get_sensor_name();
gmehmet 1:f60eafbf009a 299
gmehmet 1:f60eafbf009a 300
gmehmet 1:f60eafbf009a 301 ///@brief Get hard-coded sensor algo_ver\n
gmehmet 1:f60eafbf009a 302 ///@returns algo_version
gmehmet 1:f60eafbf009a 303 virtual const char *get_sensor_algo_ver();
gmehmet 1:f60eafbf009a 304
gmehmet 1:f60eafbf009a 305 ///@brief Enable/disable sensor to generate PPG samples \n
gmehmet 1:f60eafbf009a 306 ///@returns 0 on success, non 0 on failure
gmehmet 1:f60eafbf009a 307 virtual int sensor_enable(int enable);
gmehmet 1:f60eafbf009a 308
gmehmet 1:f60eafbf009a 309 ///@brief Enable/disable Automatic Gain Control \n
gmehmet 1:f60eafbf009a 310 ///
gmehmet 1:f60eafbf009a 311 ///On Entry:
gmehmet 1:f60eafbf009a 312 ///@param[in] enable - if it is 1, enable; otherwise disable
gmehmet 1:f60eafbf009a 313 ///
gmehmet 1:f60eafbf009a 314 ///On Exit:
gmehmet 1:f60eafbf009a 315 ///@returns 0 on success, non 0 on failure
gmehmet 1:f60eafbf009a 316 virtual int agc_enable(int agc_enable);
gmehmet 1:f60eafbf009a 317
gmehmet 1:f60eafbf009a 318 ///@brief Create list of register address/pair values
gmehmet 1:f60eafbf009a 319 ///@returns 0 on success, non 0 on failure
gmehmet 1:f60eafbf009a 320 virtual int dump_registers(addr_val_pair *reg_vals);
gmehmet 1:f60eafbf009a 321
gmehmet 1:f60eafbf009a 322 ///@brief Fill out ppg_sensor_report struct
gmehmet 1:f60eafbf009a 323 ///@param[in] sensor_report report to fill out
gmehmet 1:f60eafbf009a 324 ///@returns - on success, non 0 on failure
gmehmet 1:f60eafbf009a 325 virtual int get_sensor_report(ppg_sensor_report &data_report);
gmehmet 1:f60eafbf009a 326
gmehmet 1:f60eafbf009a 327 //@brief Get status of the sensor: if PROX mode return true
gmehmet 1:f60eafbf009a 328 unsigned char is_sensor_in_daq_mode();
gmehmet 1:f60eafbf009a 329
gmehmet 1:f60eafbf009a 330 //@brief set agc range
gmehmet 1:f60eafbf009a 331 void set_agc_range(enum Max8614x_Agc_Range RangeLevel);
gmehmet 1:f60eafbf009a 332
gmehmet 1:f60eafbf009a 333 /**
gmehmet 1:f60eafbf009a 334 * @brief Get sensor ID.
gmehmet 1:f60eafbf009a 335 *
gmehmet 1:f60eafbf009a 336 * @returns Sensor ID number.
gmehmet 1:f60eafbf009a 337 */
gmehmet 1:f60eafbf009a 338 unsigned char get_sensor_id();
gmehmet 1:f60eafbf009a 339
gmehmet 1:f60eafbf009a 340
gmehmet 1:f60eafbf009a 341 /* PUBLIC VARIABLES */
gmehmet 1:f60eafbf009a 342 /// Interrupt object to handle DATA_RDY raise-up\n
gmehmet 1:f60eafbf009a 343 InterruptIn m_ir;
gmehmet 1:f60eafbf009a 344
gmehmet 1:f60eafbf009a 345 /*! Sensor output data to report */
gmehmet 1:f60eafbf009a 346 typedef struct {
gmehmet 1:f60eafbf009a 347 uint32_t sample_cnt;
gmehmet 1:f60eafbf009a 348 uint32_t ir;
gmehmet 1:f60eafbf009a 349 uint32_t red;
gmehmet 1:f60eafbf009a 350 uint32_t green;
gmehmet 1:f60eafbf009a 351 float x;
gmehmet 1:f60eafbf009a 352 float y;
gmehmet 1:f60eafbf009a 353 float z;
gmehmet 1:f60eafbf009a 354 float hr;
gmehmet 1:f60eafbf009a 355 float spo2;
gmehmet 1:f60eafbf009a 356 float resp_rate;
gmehmet 1:f60eafbf009a 357 float hrv;
gmehmet 1:f60eafbf009a 358 } sensor_report;
gmehmet 1:f60eafbf009a 359
gmehmet 1:f60eafbf009a 360 private:
gmehmet 1:f60eafbf009a 361 /* PRIVATE CONST VARIABLES */
gmehmet 1:f60eafbf009a 362 static const uint32_t MAX8614X_DATA_WORD_SIZE = 3;
gmehmet 1:f60eafbf009a 363 static const uint32_t MAX8614X_MAX_FIFO_DEPTH = 128;
gmehmet 1:f60eafbf009a 364 static const uint32_t MAX8614X_DATA_TYPE_MASK = (0x1F << 19);
gmehmet 1:f60eafbf009a 365 static const uint32_t MAX8614X_COMMON_QUEUE_SIZE = 200;
gmehmet 1:f60eafbf009a 366
gmehmet 1:f60eafbf009a 367 /* PRIVATE TYPE DEFINITIONS */
gmehmet 1:f60eafbf009a 368 enum LedSequence
gmehmet 1:f60eafbf009a 369 {
gmehmet 1:f60eafbf009a 370 DATA_SEQ_NONE,
gmehmet 1:f60eafbf009a 371 DATA_SEQ_LED1,
gmehmet 1:f60eafbf009a 372 DATA_SEQ_LED2,
gmehmet 1:f60eafbf009a 373 DATA_SEQ_LED3,
gmehmet 1:f60eafbf009a 374 DATA_SEQ_LED1_LED2,
gmehmet 1:f60eafbf009a 375 DATA_SEQ_LED1_LED3,
gmehmet 1:f60eafbf009a 376 DATA_SEQ_LED2_LED3,
gmehmet 1:f60eafbf009a 377 DATA_SEQ_LED1_LED2_LED3,
gmehmet 1:f60eafbf009a 378 DATA_SEQ_PILOT_LED1,
gmehmet 1:f60eafbf009a 379 DATA_SEQ_AMBIENT,
gmehmet 1:f60eafbf009a 380 DATA_SEQ_LED4_EXT_MUX,
gmehmet 1:f60eafbf009a 381 DATA_SEQ_LED5_EXT_MUX,
gmehmet 1:f60eafbf009a 382 DATA_SEQ_LED6_EXT_MUX,
gmehmet 1:f60eafbf009a 383 };
gmehmet 1:f60eafbf009a 384
gmehmet 1:f60eafbf009a 385 enum DataTypes
gmehmet 1:f60eafbf009a 386 {
gmehmet 1:f60eafbf009a 387 DATA_TYPE_PPG1_LEDC1 = 0x01,
gmehmet 1:f60eafbf009a 388 DATA_TYPE_PPG1_LEDC2,
gmehmet 1:f60eafbf009a 389 DATA_TYPE_PPG1_LEDC3,
gmehmet 1:f60eafbf009a 390 DATA_TYPE_PPG1_LEDC4,
gmehmet 1:f60eafbf009a 391 DATA_TYPE_PPG1_LEDC5,
gmehmet 1:f60eafbf009a 392 DATA_TYPE_PPG1_LEDC6,
gmehmet 1:f60eafbf009a 393 DATA_TYPE_PPG2_LEDC1,
gmehmet 1:f60eafbf009a 394 DATA_TYPE_PPG2_LEDC2,
gmehmet 1:f60eafbf009a 395 DATA_TYPE_PPG2_LEDC3,
gmehmet 1:f60eafbf009a 396 DATA_TYPE_PPG2_LEDC4,
gmehmet 1:f60eafbf009a 397 DATA_TYPE_PPG2_LEDC5,
gmehmet 1:f60eafbf009a 398 DATA_TYPE_PPG2_LEDC6,
gmehmet 1:f60eafbf009a 399 DATA_TYPE_PPF1_LEDC1,
gmehmet 1:f60eafbf009a 400 DATA_TYPE_PPF1_LEDC2,
gmehmet 1:f60eafbf009a 401 DATA_TYPE_PPF1_LEDC3,
gmehmet 1:f60eafbf009a 402 DATA_TYPE_PPF2_LEDC1 = 0x13,
gmehmet 1:f60eafbf009a 403 DATA_TYPE_PPF3_LEDC2,
gmehmet 1:f60eafbf009a 404 DATA_TYPE_PPF3_LEDC3,
gmehmet 1:f60eafbf009a 405 DATA_TYPE_PROX1 = 0x19,
gmehmet 1:f60eafbf009a 406 DATA_TYPE_PROX2,
gmehmet 1:f60eafbf009a 407 DATA_TYPE_INVALID_DATA = 0x1E,
gmehmet 1:f60eafbf009a 408 DATA_TYPE_TIME_STAMP,
gmehmet 1:f60eafbf009a 409 };
gmehmet 1:f60eafbf009a 410
gmehmet 1:f60eafbf009a 411 enum PartIDs
gmehmet 1:f60eafbf009a 412 {
gmehmet 1:f60eafbf009a 413 MAX86140_PART_ID_VAL = 0x24,
gmehmet 1:f60eafbf009a 414 MAX86141_PART_ID_VAL,
gmehmet 1:f60eafbf009a 415 MAX86142_PART_ID_VAL,
gmehmet 1:f60eafbf009a 416 MAX86143_PART_ID_VAL,
gmehmet 1:f60eafbf009a 417 };
gmehmet 1:f60eafbf009a 418
gmehmet 1:f60eafbf009a 419 enum LedRanges
gmehmet 1:f60eafbf009a 420 {
gmehmet 1:f60eafbf009a 421 LED_RANGE_0_50,
gmehmet 1:f60eafbf009a 422 LED_RANGE_50_100,
gmehmet 1:f60eafbf009a 423 LED_RANGE_100_150,
gmehmet 1:f60eafbf009a 424 LED_RANGE_150_200,
gmehmet 1:f60eafbf009a 425 };
gmehmet 1:f60eafbf009a 426
gmehmet 1:f60eafbf009a 427 enum LedRangeSteps
gmehmet 1:f60eafbf009a 428 {
gmehmet 1:f60eafbf009a 429 LED_RANGE_STEP_25uA = 120,
gmehmet 1:f60eafbf009a 430 LED_RANGE_STEP_50uA = 240,
gmehmet 1:f60eafbf009a 431 LED_RANGE_STEP_75uA = 360,
gmehmet 1:f60eafbf009a 432 LED_RANGE_STEP_100uA = 480,
gmehmet 1:f60eafbf009a 433 };
gmehmet 1:f60eafbf009a 434
gmehmet 1:f60eafbf009a 435 typedef enum {
gmehmet 1:f60eafbf009a 436 LED_1 = 0,
gmehmet 1:f60eafbf009a 437 LED_2,
gmehmet 1:f60eafbf009a 438 LED_3,
gmehmet 1:f60eafbf009a 439 LED_4,
gmehmet 1:f60eafbf009a 440 LED_5,
gmehmet 1:f60eafbf009a 441 LED_6,
gmehmet 1:f60eafbf009a 442 NUM_OF_LED,
gmehmet 1:f60eafbf009a 443 } max8614x_led_t;
gmehmet 1:f60eafbf009a 444
gmehmet 1:f60eafbf009a 445 enum LED_CTRL_SM {
gmehmet 1:f60eafbf009a 446 LED_PROX = 1,
gmehmet 1:f60eafbf009a 447 LED_DATA_ACQ,
gmehmet 1:f60eafbf009a 448 };
gmehmet 1:f60eafbf009a 449
gmehmet 1:f60eafbf009a 450 // AGC Range Parameter
gmehmet 1:f60eafbf009a 451 uint8_t kMax8614xDefaultLedOutRange;
gmehmet 1:f60eafbf009a 452
gmehmet 1:f60eafbf009a 453 typedef union {
gmehmet 1:f60eafbf009a 454 struct {
gmehmet 1:f60eafbf009a 455 uint32_t val:19;
gmehmet 1:f60eafbf009a 456 uint32_t type:5;
gmehmet 1:f60eafbf009a 457 uint32_t:8;
gmehmet 1:f60eafbf009a 458 };
gmehmet 1:f60eafbf009a 459 uint32_t raw;
gmehmet 1:f60eafbf009a 460 } fifo_data_t;
gmehmet 1:f60eafbf009a 461
gmehmet 1:f60eafbf009a 462 typedef union {
gmehmet 1:f60eafbf009a 463 uint16_t val;
gmehmet 1:f60eafbf009a 464 struct {
gmehmet 1:f60eafbf009a 465 uint8_t tint;
gmehmet 1:f60eafbf009a 466 uint8_t frac:4;
gmehmet 1:f60eafbf009a 467 uint8_t:4;
gmehmet 1:f60eafbf009a 468 };
gmehmet 1:f60eafbf009a 469 } die_temp_t;
gmehmet 1:f60eafbf009a 470
gmehmet 1:f60eafbf009a 471 typedef union {
gmehmet 1:f60eafbf009a 472 struct {
gmehmet 1:f60eafbf009a 473 struct {
gmehmet 1:f60eafbf009a 474 unsigned char pwr_rdy:1;
gmehmet 1:f60eafbf009a 475 unsigned char vdd_oor:1;
gmehmet 1:f60eafbf009a 476 unsigned char die_temp_rdy:1;
gmehmet 1:f60eafbf009a 477 unsigned char led_compb:1;
gmehmet 1:f60eafbf009a 478 unsigned char prox_int:1;
gmehmet 1:f60eafbf009a 479 unsigned char alc_ovf:1;
gmehmet 1:f60eafbf009a 480 unsigned char data_rdy:1;
gmehmet 1:f60eafbf009a 481 unsigned char a_full:1;
gmehmet 1:f60eafbf009a 482 };
gmehmet 1:f60eafbf009a 483 struct {
gmehmet 1:f60eafbf009a 484 unsigned char:7;
gmehmet 1:f60eafbf009a 485 unsigned char sha_done:1;
gmehmet 1:f60eafbf009a 486 };
gmehmet 1:f60eafbf009a 487 };
gmehmet 1:f60eafbf009a 488 uint8_t val[2];
gmehmet 1:f60eafbf009a 489 } int_status_t;
gmehmet 1:f60eafbf009a 490
gmehmet 1:f60eafbf009a 491 union led_range {
gmehmet 1:f60eafbf009a 492 struct {
gmehmet 1:f60eafbf009a 493 uint8_t led1:2;
gmehmet 1:f60eafbf009a 494 uint8_t led2:2;
gmehmet 1:f60eafbf009a 495 uint8_t led3:2;
gmehmet 1:f60eafbf009a 496 uint8_t:2;
gmehmet 1:f60eafbf009a 497 uint8_t led4:2;
gmehmet 1:f60eafbf009a 498 uint8_t led5:2;
gmehmet 1:f60eafbf009a 499 uint8_t led6:2;
gmehmet 1:f60eafbf009a 500 uint8_t:2;
gmehmet 1:f60eafbf009a 501 };
gmehmet 1:f60eafbf009a 502 uint8_t val[2];
gmehmet 1:f60eafbf009a 503 };
gmehmet 1:f60eafbf009a 504
gmehmet 1:f60eafbf009a 505 typedef struct {
gmehmet 1:f60eafbf009a 506 uint32_t green;
gmehmet 1:f60eafbf009a 507 uint32_t ir;
gmehmet 1:f60eafbf009a 508 uint32_t red;
gmehmet 1:f60eafbf009a 509 } ppg_data_t;
gmehmet 1:f60eafbf009a 510
gmehmet 1:f60eafbf009a 511 struct led_control {
gmehmet 1:f60eafbf009a 512 uint32_t diode_sum[NUM_OF_LED];
gmehmet 1:f60eafbf009a 513 uint32_t state;
gmehmet 1:f60eafbf009a 514 uint32_t prox_sum;
gmehmet 1:f60eafbf009a 515 uint32_t prox_sample_cnt;
gmehmet 1:f60eafbf009a 516 int32_t led_current[NUM_OF_LED];
gmehmet 1:f60eafbf009a 517 uint32_t default_current[NUM_OF_LED];
gmehmet 1:f60eafbf009a 518 int32_t agc_led_out_percent;
gmehmet 1:f60eafbf009a 519 int32_t agc_corr_coeff;
gmehmet 1:f60eafbf009a 520 int32_t agc_min_num_samples;
gmehmet 1:f60eafbf009a 521 int32_t agc_sensitivity_percent;
gmehmet 1:f60eafbf009a 522 int32_t change_by_percent_of_range[NUM_OF_LED];
gmehmet 1:f60eafbf009a 523 int32_t change_by_percent_of_current_setting[NUM_OF_LED];
gmehmet 1:f60eafbf009a 524 int32_t change_led_by_absolute_count[NUM_OF_LED];
gmehmet 1:f60eafbf009a 525 uint32_t sample_cnt;
gmehmet 1:f60eafbf009a 526 union led_range led_range_settings;
gmehmet 1:f60eafbf009a 527 uint8_t led_ranges;
gmehmet 1:f60eafbf009a 528 uint8_t agc_is_enabled;
gmehmet 1:f60eafbf009a 529 uint8_t lpm_is_enabled;
gmehmet 1:f60eafbf009a 530 };
gmehmet 1:f60eafbf009a 531
gmehmet 1:f60eafbf009a 532 /* PRIVATE VARIABLES */
gmehmet 1:f60eafbf009a 533 SPI &m_spiBus;
gmehmet 1:f60eafbf009a 534 DigitalOut m_cs;
gmehmet 1:f60eafbf009a 535 std::queue<ppg_data_t> ppg_queue;
gmehmet 1:f60eafbf009a 536 struct led_control led_ctrl;
gmehmet 1:f60eafbf009a 537 int vdd_oor_cnt;
gmehmet 1:f60eafbf009a 538 die_temp_t die_temp;
gmehmet 1:f60eafbf009a 539 bool irq_triggered;
gmehmet 1:f60eafbf009a 540
gmehmet 1:f60eafbf009a 541 /* PRIVATE FUNCTION DECLARATIONS */
gmehmet 1:f60eafbf009a 542 int reset();
gmehmet 1:f60eafbf009a 543
gmehmet 1:f60eafbf009a 544 int poweroff();
gmehmet 1:f60eafbf009a 545
gmehmet 1:f60eafbf009a 546 int enable_die_temp();
gmehmet 1:f60eafbf009a 547
gmehmet 1:f60eafbf009a 548 int read_die_temp();
gmehmet 1:f60eafbf009a 549
gmehmet 1:f60eafbf009a 550 int get_num_samples_in_fifo();
gmehmet 1:f60eafbf009a 551
gmehmet 1:f60eafbf009a 552 void irq();
gmehmet 1:f60eafbf009a 553
gmehmet 1:f60eafbf009a 554 int irq_handler();
gmehmet 1:f60eafbf009a 555
gmehmet 1:f60eafbf009a 556 int fifo_irq_handler();
gmehmet 1:f60eafbf009a 557
gmehmet 1:f60eafbf009a 558 int read_fifo_data(uint8_t *fifo_data, int num_samples);
gmehmet 1:f60eafbf009a 559
gmehmet 1:f60eafbf009a 560 /* AGC functions */
gmehmet 1:f60eafbf009a 561 int max8614x_update_led_range(int new_range, uint8_t led_num,
gmehmet 1:f60eafbf009a 562 union led_range *led_range_settings);
gmehmet 1:f60eafbf009a 563
gmehmet 1:f60eafbf009a 564 int max8614x_update_led_current(union led_range *led_range_settings,
gmehmet 1:f60eafbf009a 565 int led_new_val, max8614x_led_t led_num);
gmehmet 1:f60eafbf009a 566
gmehmet 1:f60eafbf009a 567 void ppg_auto_gain_ctrl(struct led_control *led_ctrl,
gmehmet 1:f60eafbf009a 568 uint32_t sample_cnt, int diode_data, max8614x_led_t led_num);
gmehmet 1:f60eafbf009a 569
gmehmet 1:f60eafbf009a 570 void max8614x_agc_handler(struct led_control *led_ctrl,
gmehmet 1:f60eafbf009a 571 int *samples);
gmehmet 1:f60eafbf009a 572
gmehmet 1:f60eafbf009a 573 int led_control_sm(struct led_control *led_ctrl,
gmehmet 1:f60eafbf009a 574 int diode_data, char lpm);
gmehmet 1:f60eafbf009a 575
gmehmet 1:f60eafbf009a 576 void led_control_reset(struct led_control *led_ctrl);
gmehmet 1:f60eafbf009a 577
gmehmet 1:f60eafbf009a 578 int led_prox_init(struct led_control *led_ctrl, char lpm);
gmehmet 1:f60eafbf009a 579
gmehmet 1:f60eafbf009a 580 int led_daq_init(struct led_control *led_ctrl, char lpm);
gmehmet 1:f60eafbf009a 581
gmehmet 1:f60eafbf009a 582 void led_control_init(struct led_control *led_ctrl);
gmehmet 1:f60eafbf009a 583
gmehmet 1:f60eafbf009a 584
gmehmet 1:f60eafbf009a 585 };
gmehmet 1:f60eafbf009a 586
gmehmet 1:f60eafbf009a 587 #endif /* _MAX8614X_H_ */