HSP Platform firmware evaluating ECG data and hearth rate over PPG data.
Dependencies: max32630fthr Adafruit_FeatherOLED USBDevice
Drivers/MAX8614X/MAX8614X.h@1:f60eafbf009a, 2019-04-10 (annotated)
- Committer:
- gmehmet
- Date:
- Wed Apr 10 14:56:25 2019 +0300
- Revision:
- 1:f60eafbf009a
upload from local
Who changed what in which revision?
| User | Revision | Line number | New 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_ */ |