Maxim Integrated / Mbed OS MAXREFDES101_SOURCE

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 /*******************************************************************************
gmehmet 1:f60eafbf009a 3 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 1:f60eafbf009a 4 *
gmehmet 1:f60eafbf009a 5 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 1:f60eafbf009a 6 * copy of this software and associated documentation files (the "Software"),
gmehmet 1:f60eafbf009a 7 * to deal in the Software without restriction, including without limitation
gmehmet 1:f60eafbf009a 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 1:f60eafbf009a 9 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 1:f60eafbf009a 10 * Software is furnished to do so, subject to the following conditions:
gmehmet 1:f60eafbf009a 11 *
gmehmet 1:f60eafbf009a 12 * The above copyright notice and this permission notice shall be included
gmehmet 1:f60eafbf009a 13 * in all copies or substantial portions of the Software.
gmehmet 1:f60eafbf009a 14 *
gmehmet 1:f60eafbf009a 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 1:f60eafbf009a 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 1:f60eafbf009a 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 1:f60eafbf009a 18 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 1:f60eafbf009a 19 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 1:f60eafbf009a 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 1:f60eafbf009a 21 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 1:f60eafbf009a 22 *
gmehmet 1:f60eafbf009a 23 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 1:f60eafbf009a 24 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 1:f60eafbf009a 25 * Products, Inc. Branding Policy.
gmehmet 1:f60eafbf009a 26 *
gmehmet 1:f60eafbf009a 27 * The mere transfer of this software does not imply any licenses
gmehmet 1:f60eafbf009a 28 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 1:f60eafbf009a 29 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 1:f60eafbf009a 30 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 1:f60eafbf009a 31 * ownership rights.
gmehmet 1:f60eafbf009a 32 *******************************************************************************
gmehmet 1:f60eafbf009a 33 */
gmehmet 1:f60eafbf009a 34
gmehmet 1:f60eafbf009a 35 #include "mbed.h"
gmehmet 1:f60eafbf009a 36 #include "MAX30001.h"
gmehmet 1:f60eafbf009a 37 #include "Peripherals.h"
gmehmet 1:f60eafbf009a 38
gmehmet 1:f60eafbf009a 39 MAX30001 *MAX30001::instance = NULL;
gmehmet 1:f60eafbf009a 40
gmehmet 1:f60eafbf009a 41
gmehmet 1:f60eafbf009a 42 //******************************************************************************
gmehmet 1:f60eafbf009a 43 MAX30001::MAX30001(PinName mosi, PinName miso, PinName sclk, PinName cs)
gmehmet 1:f60eafbf009a 44 {
gmehmet 1:f60eafbf009a 45 m_spi = new SPI(mosi, miso, sclk);
gmehmet 1:f60eafbf009a 46 m_cs = new DigitalOut(cs, 1);
gmehmet 1:f60eafbf009a 47
gmehmet 1:f60eafbf009a 48 m_spi->frequency(3000000);
gmehmet 1:f60eafbf009a 49 spi_owner = true;
gmehmet 1:f60eafbf009a 50 functionpointer = spiHandler;
gmehmet 1:f60eafbf009a 51 onDataAvailableCallback = NULL;
gmehmet 1:f60eafbf009a 52 instance = this;
gmehmet 1:f60eafbf009a 53
gmehmet 1:f60eafbf009a 54 }
gmehmet 1:f60eafbf009a 55
gmehmet 1:f60eafbf009a 56
gmehmet 1:f60eafbf009a 57 //******************************************************************************
gmehmet 1:f60eafbf009a 58 MAX30001::MAX30001(SPI *spi, DigitalOut *cs)
gmehmet 1:f60eafbf009a 59 {
gmehmet 1:f60eafbf009a 60 m_spi = spi;
gmehmet 1:f60eafbf009a 61 m_cs = cs;
gmehmet 1:f60eafbf009a 62 spi->frequency(3000000);
gmehmet 1:f60eafbf009a 63 spi_owner = false;
gmehmet 1:f60eafbf009a 64 functionpointer = spiHandler;
gmehmet 1:f60eafbf009a 65 onDataAvailableCallback = NULL;
gmehmet 1:f60eafbf009a 66 instance = this;
gmehmet 1:f60eafbf009a 67
gmehmet 1:f60eafbf009a 68
gmehmet 1:f60eafbf009a 69 }
gmehmet 1:f60eafbf009a 70
gmehmet 1:f60eafbf009a 71
gmehmet 1:f60eafbf009a 72 //******************************************************************************
gmehmet 1:f60eafbf009a 73 MAX30001::~MAX30001(void) {
gmehmet 1:f60eafbf009a 74
gmehmet 1:f60eafbf009a 75 if (spi_owner) {
gmehmet 1:f60eafbf009a 76 delete m_spi;
gmehmet 1:f60eafbf009a 77 delete m_cs;
gmehmet 1:f60eafbf009a 78 }
gmehmet 1:f60eafbf009a 79 }
gmehmet 1:f60eafbf009a 80
gmehmet 1:f60eafbf009a 81 //******************************************************************************
gmehmet 1:f60eafbf009a 82 int MAX30001::max30001_Rbias_FMSTR_Init(uint8_t En_rbias, uint8_t Rbiasv,
gmehmet 1:f60eafbf009a 83 uint8_t Rbiasp, uint8_t Rbiasn,
gmehmet 1:f60eafbf009a 84 uint8_t Fmstr) {
gmehmet 1:f60eafbf009a 85 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 86 return -1;
gmehmet 1:f60eafbf009a 87 }
gmehmet 1:f60eafbf009a 88
gmehmet 1:f60eafbf009a 89 max30001_cnfg_gen.bit.en_rbias = En_rbias;
gmehmet 1:f60eafbf009a 90 max30001_cnfg_gen.bit.rbiasv = Rbiasv;
gmehmet 1:f60eafbf009a 91 max30001_cnfg_gen.bit.rbiasp = Rbiasp;
gmehmet 1:f60eafbf009a 92 max30001_cnfg_gen.bit.rbiasn = Rbiasn;
gmehmet 1:f60eafbf009a 93 max30001_cnfg_gen.bit.fmstr = Fmstr;
gmehmet 1:f60eafbf009a 94
gmehmet 1:f60eafbf009a 95 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 96 return -1;
gmehmet 1:f60eafbf009a 97 }
gmehmet 1:f60eafbf009a 98 return 0;
gmehmet 1:f60eafbf009a 99 }
gmehmet 1:f60eafbf009a 100
gmehmet 1:f60eafbf009a 101 //******************************************************************************
gmehmet 1:f60eafbf009a 102 int MAX30001::max30001_CAL_InitStart(uint8_t En_Vcal, uint8_t Vmode,
gmehmet 1:f60eafbf009a 103 uint8_t Vmag, uint8_t Fcal, uint16_t Thigh,
gmehmet 1:f60eafbf009a 104 uint8_t Fifty) {
gmehmet 1:f60eafbf009a 105 // CNFG_CAL
gmehmet 1:f60eafbf009a 106 if (max30001_reg_read(CNFG_CAL, &max30001_cnfg_cal.all) == -1) {
gmehmet 1:f60eafbf009a 107 return -1;
gmehmet 1:f60eafbf009a 108 }
gmehmet 1:f60eafbf009a 109
gmehmet 1:f60eafbf009a 110 max30001_cnfg_cal.bit.vmode = Vmode;
gmehmet 1:f60eafbf009a 111 max30001_cnfg_cal.bit.vmag = Vmag;
gmehmet 1:f60eafbf009a 112 max30001_cnfg_cal.bit.fcal = Fcal;
gmehmet 1:f60eafbf009a 113 max30001_cnfg_cal.bit.thigh = Thigh;
gmehmet 1:f60eafbf009a 114 max30001_cnfg_cal.bit.fifty = Fifty;
gmehmet 1:f60eafbf009a 115
gmehmet 1:f60eafbf009a 116 if (max30001_reg_write(CNFG_CAL, max30001_cnfg_cal.all) == -1) {
gmehmet 1:f60eafbf009a 117 return -1;
gmehmet 1:f60eafbf009a 118 }
gmehmet 1:f60eafbf009a 119
gmehmet 1:f60eafbf009a 120 // RTOS uses a 32768HZ clock. 32768ticks represents 1secs. 1sec/10 =
gmehmet 1:f60eafbf009a 121 // 100msecs.
gmehmet 1:f60eafbf009a 122 wait(1.0 / 10.0);
gmehmet 1:f60eafbf009a 123
gmehmet 1:f60eafbf009a 124 if (max30001_reg_read(CNFG_CAL, &max30001_cnfg_cal.all) == -1) {
gmehmet 1:f60eafbf009a 125 return -1;
gmehmet 1:f60eafbf009a 126 }
gmehmet 1:f60eafbf009a 127
gmehmet 1:f60eafbf009a 128 max30001_cnfg_cal.bit.en_vcal = En_Vcal;
gmehmet 1:f60eafbf009a 129
gmehmet 1:f60eafbf009a 130 if (max30001_reg_write(CNFG_CAL, max30001_cnfg_cal.all) == -1) {
gmehmet 1:f60eafbf009a 131 return -1;
gmehmet 1:f60eafbf009a 132 }
gmehmet 1:f60eafbf009a 133
gmehmet 1:f60eafbf009a 134 // RTOS uses a 32768HZ clock. 32768ticks represents 1secs. 1sec/10 =
gmehmet 1:f60eafbf009a 135 // 100msecs.
gmehmet 1:f60eafbf009a 136 wait(1.0 / 10.0);
gmehmet 1:f60eafbf009a 137
gmehmet 1:f60eafbf009a 138 return 0;
gmehmet 1:f60eafbf009a 139 }
gmehmet 1:f60eafbf009a 140
gmehmet 1:f60eafbf009a 141 //******************************************************************************
gmehmet 1:f60eafbf009a 142 int MAX30001::max30001_CAL_Stop(void) {
gmehmet 1:f60eafbf009a 143
gmehmet 1:f60eafbf009a 144 if (max30001_reg_read(CNFG_CAL, &max30001_cnfg_cal.all) == -1) {
gmehmet 1:f60eafbf009a 145 return -1;
gmehmet 1:f60eafbf009a 146 }
gmehmet 1:f60eafbf009a 147
gmehmet 1:f60eafbf009a 148 max30001_cnfg_cal.bit.en_vcal = 0; // Disable VCAL, all other settings are left unaffected
gmehmet 1:f60eafbf009a 149
gmehmet 1:f60eafbf009a 150 if (max30001_reg_write(CNFG_CAL, max30001_cnfg_cal.all) == -1) {
gmehmet 1:f60eafbf009a 151 return -1;
gmehmet 1:f60eafbf009a 152 }
gmehmet 1:f60eafbf009a 153
gmehmet 1:f60eafbf009a 154 return 0;
gmehmet 1:f60eafbf009a 155 }
gmehmet 1:f60eafbf009a 156 //******************************************************************************
gmehmet 1:f60eafbf009a 157 //******************************************************************************
gmehmet 1:f60eafbf009a 158 int MAX30001::max30001_INT_assignment(max30001_intrpt_Location_t en_enint_loc, max30001_intrpt_Location_t en_eovf_loc, max30001_intrpt_Location_t en_fstint_loc,
gmehmet 1:f60eafbf009a 159 max30001_intrpt_Location_t en_dcloffint_loc, max30001_intrpt_Location_t en_bint_loc, max30001_intrpt_Location_t en_bovf_loc,
gmehmet 1:f60eafbf009a 160 max30001_intrpt_Location_t en_bover_loc, max30001_intrpt_Location_t en_bundr_loc, max30001_intrpt_Location_t en_bcgmon_loc,
gmehmet 1:f60eafbf009a 161 max30001_intrpt_Location_t en_pint_loc, max30001_intrpt_Location_t en_povf_loc, max30001_intrpt_Location_t en_pedge_loc,
gmehmet 1:f60eafbf009a 162 max30001_intrpt_Location_t en_lonint_loc, max30001_intrpt_Location_t en_rrint_loc, max30001_intrpt_Location_t en_samp_loc,
gmehmet 1:f60eafbf009a 163 max30001_intrpt_type_t intb_Type, max30001_intrpt_type_t int2b_Type)
gmehmet 1:f60eafbf009a 164
gmehmet 1:f60eafbf009a 165
gmehmet 1:f60eafbf009a 166 {
gmehmet 1:f60eafbf009a 167 // INT1
gmehmet 1:f60eafbf009a 168
gmehmet 1:f60eafbf009a 169 pr_info("MAX30001::max30001_INT_assignment\r\n");
gmehmet 1:f60eafbf009a 170 if (max30001_reg_read(EN_INT, &max30001_en_int.all) == -1) {
gmehmet 1:f60eafbf009a 171 return -1;
gmehmet 1:f60eafbf009a 172 }
gmehmet 1:f60eafbf009a 173
gmehmet 1:f60eafbf009a 174 // max30001_en_int2.bit.en_pint = 0b1; // Keep this off...
gmehmet 1:f60eafbf009a 175
gmehmet 1:f60eafbf009a 176 max30001_en_int.bit.en_eint = 0b1 & en_enint_loc;
gmehmet 1:f60eafbf009a 177 max30001_en_int.bit.en_eovf = 0b1 & en_eovf_loc;
gmehmet 1:f60eafbf009a 178 max30001_en_int.bit.en_fstint = 0b1 & en_fstint_loc;
gmehmet 1:f60eafbf009a 179
gmehmet 1:f60eafbf009a 180 max30001_en_int.bit.en_dcloffint = 0b1 & en_dcloffint_loc;
gmehmet 1:f60eafbf009a 181 max30001_en_int.bit.en_bint = 0b1 & en_bint_loc;
gmehmet 1:f60eafbf009a 182 max30001_en_int.bit.en_bovf = 0b1 & en_bovf_loc;
gmehmet 1:f60eafbf009a 183
gmehmet 1:f60eafbf009a 184 max30001_en_int.bit.en_bover = 0b1 & en_bover_loc;
gmehmet 1:f60eafbf009a 185 max30001_en_int.bit.en_bundr = 0b1 & en_bundr_loc;
gmehmet 1:f60eafbf009a 186 max30001_en_int.bit.en_bcgmon = 0b1 & en_bcgmon_loc;
gmehmet 1:f60eafbf009a 187
gmehmet 1:f60eafbf009a 188 max30001_en_int.bit.en_pint = 0b1 & en_pint_loc;
gmehmet 1:f60eafbf009a 189 max30001_en_int.bit.en_povf = 0b1 & en_povf_loc;
gmehmet 1:f60eafbf009a 190 max30001_en_int.bit.en_pedge = 0b1 & en_pedge_loc;
gmehmet 1:f60eafbf009a 191
gmehmet 1:f60eafbf009a 192 max30001_en_int.bit.en_lonint = 0b1 & en_lonint_loc;
gmehmet 1:f60eafbf009a 193 max30001_en_int.bit.en_rrint = 0b1 & en_rrint_loc;
gmehmet 1:f60eafbf009a 194 max30001_en_int.bit.en_samp = 0b1 & en_samp_loc;
gmehmet 1:f60eafbf009a 195
gmehmet 1:f60eafbf009a 196 max30001_en_int.bit.intb_type = intb_Type;
gmehmet 1:f60eafbf009a 197
gmehmet 1:f60eafbf009a 198 if (max30001_reg_write(EN_INT, max30001_en_int.all) == -1) {
gmehmet 1:f60eafbf009a 199 return -1;
gmehmet 1:f60eafbf009a 200 }
gmehmet 1:f60eafbf009a 201
gmehmet 1:f60eafbf009a 202 // INT2
gmehmet 1:f60eafbf009a 203
gmehmet 1:f60eafbf009a 204 if (max30001_reg_read(EN_INT2, &max30001_en_int2.all) == -1) {
gmehmet 1:f60eafbf009a 205 return -1;
gmehmet 1:f60eafbf009a 206 }
gmehmet 1:f60eafbf009a 207
gmehmet 1:f60eafbf009a 208 max30001_en_int2.bit.en_eint = 0b1 & (en_enint_loc >> 1);
gmehmet 1:f60eafbf009a 209 max30001_en_int2.bit.en_eovf = 0b1 & (en_eovf_loc >> 1);
gmehmet 1:f60eafbf009a 210 max30001_en_int2.bit.en_fstint = 0b1 & (en_fstint_loc >> 1);
gmehmet 1:f60eafbf009a 211
gmehmet 1:f60eafbf009a 212 max30001_en_int2.bit.en_dcloffint = 0b1 & (en_dcloffint_loc >> 1);
gmehmet 1:f60eafbf009a 213 max30001_en_int2.bit.en_bint = 0b1 & (en_bint_loc >> 1);
gmehmet 1:f60eafbf009a 214 max30001_en_int2.bit.en_bovf = 0b1 & (en_bovf_loc >> 1);
gmehmet 1:f60eafbf009a 215
gmehmet 1:f60eafbf009a 216 max30001_en_int2.bit.en_bover = 0b1 & (en_bover_loc >> 1);
gmehmet 1:f60eafbf009a 217 max30001_en_int2.bit.en_bundr = 0b1 & (en_bundr_loc >> 1);
gmehmet 1:f60eafbf009a 218 max30001_en_int2.bit.en_bcgmon = 0b1 & (en_bcgmon_loc >> 1);
gmehmet 1:f60eafbf009a 219
gmehmet 1:f60eafbf009a 220 max30001_en_int2.bit.en_pint = 0b1 & (en_pint_loc >> 1);
gmehmet 1:f60eafbf009a 221 max30001_en_int2.bit.en_povf = 0b1 & (en_povf_loc >> 1);
gmehmet 1:f60eafbf009a 222 max30001_en_int2.bit.en_pedge = 0b1 & (en_pedge_loc >> 1);
gmehmet 1:f60eafbf009a 223
gmehmet 1:f60eafbf009a 224 max30001_en_int2.bit.en_lonint = 0b1 & (en_lonint_loc >> 1);
gmehmet 1:f60eafbf009a 225 max30001_en_int2.bit.en_rrint = 0b1 & (en_rrint_loc >> 1);
gmehmet 1:f60eafbf009a 226 max30001_en_int2.bit.en_samp = 0b1 & (en_samp_loc >> 1);
gmehmet 1:f60eafbf009a 227
gmehmet 1:f60eafbf009a 228 max30001_en_int2.bit.intb_type = int2b_Type;
gmehmet 1:f60eafbf009a 229
gmehmet 1:f60eafbf009a 230 if (max30001_reg_write(EN_INT2, max30001_en_int2.all) == -1) {
gmehmet 1:f60eafbf009a 231 return -1;
gmehmet 1:f60eafbf009a 232 }
gmehmet 1:f60eafbf009a 233
gmehmet 1:f60eafbf009a 234 return 0;
gmehmet 1:f60eafbf009a 235 }
gmehmet 1:f60eafbf009a 236
gmehmet 1:f60eafbf009a 237 //******************************************************************************
gmehmet 1:f60eafbf009a 238 int MAX30001::max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp,
gmehmet 1:f60eafbf009a 239 uint8_t Openn, uint8_t Pol,
gmehmet 1:f60eafbf009a 240 uint8_t Calp_sel, uint8_t Caln_sel,
gmehmet 1:f60eafbf009a 241 uint8_t E_fit, uint8_t Rate, uint8_t Gain,
gmehmet 1:f60eafbf009a 242 uint8_t Dhpf, uint8_t Dlpf) {
gmehmet 1:f60eafbf009a 243
gmehmet 1:f60eafbf009a 244 // CNFG_EMUX
gmehmet 1:f60eafbf009a 245
gmehmet 1:f60eafbf009a 246 pr_info("MAX30001::max30001_ECG_InitStart\r\n");
gmehmet 1:f60eafbf009a 247 if (max30001_reg_read(CNFG_EMUX, &max30001_cnfg_emux.all) == -1) {
gmehmet 1:f60eafbf009a 248 return -1;
gmehmet 1:f60eafbf009a 249 }
gmehmet 1:f60eafbf009a 250
gmehmet 1:f60eafbf009a 251 max30001_cnfg_emux.bit.openp = Openp;
gmehmet 1:f60eafbf009a 252 max30001_cnfg_emux.bit.openn = Openn;
gmehmet 1:f60eafbf009a 253 max30001_cnfg_emux.bit.pol = Pol;
gmehmet 1:f60eafbf009a 254 max30001_cnfg_emux.bit.calp_sel = Calp_sel;
gmehmet 1:f60eafbf009a 255 max30001_cnfg_emux.bit.caln_sel = Caln_sel;
gmehmet 1:f60eafbf009a 256
gmehmet 1:f60eafbf009a 257 if (max30001_reg_write(CNFG_EMUX, max30001_cnfg_emux.all) == -1) {
gmehmet 1:f60eafbf009a 258 return -1;
gmehmet 1:f60eafbf009a 259 }
gmehmet 1:f60eafbf009a 260
gmehmet 1:f60eafbf009a 261 /**** ENABLE CHANNELS ****/
gmehmet 1:f60eafbf009a 262 // CNFG_GEN
gmehmet 1:f60eafbf009a 263
gmehmet 1:f60eafbf009a 264 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 265 return -1;
gmehmet 1:f60eafbf009a 266 }
gmehmet 1:f60eafbf009a 267
gmehmet 1:f60eafbf009a 268 max30001_cnfg_gen.bit.en_ecg = En_ecg; // 0b1
gmehmet 1:f60eafbf009a 269
gmehmet 1:f60eafbf009a 270 // fmstr is default
gmehmet 1:f60eafbf009a 271
gmehmet 1:f60eafbf009a 272 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 273 return -1;
gmehmet 1:f60eafbf009a 274 }
gmehmet 1:f60eafbf009a 275
gmehmet 1:f60eafbf009a 276 /**** Wait for PLL Lock & References to settle down ****/
gmehmet 1:f60eafbf009a 277
gmehmet 1:f60eafbf009a 278 max30001_timeout = 0;
gmehmet 1:f60eafbf009a 279
gmehmet 1:f60eafbf009a 280 do {
gmehmet 1:f60eafbf009a 281 if (max30001_reg_read(STATUS, &max30001_status.all) == -1) // Wait and spin for PLL to lock...
gmehmet 1:f60eafbf009a 282 {
gmehmet 1:f60eafbf009a 283 return -1;
gmehmet 1:f60eafbf009a 284 }
gmehmet 1:f60eafbf009a 285 } while (max30001_status.bit.pllint == 1 && max30001_timeout++ <= 1000);
gmehmet 1:f60eafbf009a 286
gmehmet 1:f60eafbf009a 287 // MNGR_INT
gmehmet 1:f60eafbf009a 288
gmehmet 1:f60eafbf009a 289 if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 290 return -1;
gmehmet 1:f60eafbf009a 291 }
gmehmet 1:f60eafbf009a 292
gmehmet 1:f60eafbf009a 293 max30001_mngr_int.bit.e_fit = E_fit; // 31
gmehmet 1:f60eafbf009a 294
gmehmet 1:f60eafbf009a 295 if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 296 return -1;
gmehmet 1:f60eafbf009a 297 }
gmehmet 1:f60eafbf009a 298
gmehmet 1:f60eafbf009a 299 // CNFG_ECG
gmehmet 1:f60eafbf009a 300
gmehmet 1:f60eafbf009a 301 if (max30001_reg_read(CNFG_ECG, &max30001_cnfg_ecg.all) == -1) {
gmehmet 1:f60eafbf009a 302 return -1;
gmehmet 1:f60eafbf009a 303 }
gmehmet 1:f60eafbf009a 304
gmehmet 1:f60eafbf009a 305 max30001_cnfg_ecg.bit.rate = Rate;
gmehmet 1:f60eafbf009a 306 max30001_cnfg_ecg.bit.gain = Gain;
gmehmet 1:f60eafbf009a 307 max30001_cnfg_ecg.bit.dhpf = Dhpf;
gmehmet 1:f60eafbf009a 308 max30001_cnfg_ecg.bit.dlpf = Dlpf;
gmehmet 1:f60eafbf009a 309
gmehmet 1:f60eafbf009a 310 if (max30001_reg_write(CNFG_ECG, max30001_cnfg_ecg.all) == -1) {
gmehmet 1:f60eafbf009a 311 return -1;
gmehmet 1:f60eafbf009a 312 }
gmehmet 1:f60eafbf009a 313
gmehmet 1:f60eafbf009a 314 return 0;
gmehmet 1:f60eafbf009a 315 }
gmehmet 1:f60eafbf009a 316
gmehmet 1:f60eafbf009a 317 //******************************************************************************
gmehmet 1:f60eafbf009a 318 int MAX30001::max30001_ECGFast_Init(uint8_t Clr_Fast, uint8_t Fast, uint8_t Fast_Th) {
gmehmet 1:f60eafbf009a 319 if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 320 return -1;
gmehmet 1:f60eafbf009a 321 }
gmehmet 1:f60eafbf009a 322
gmehmet 1:f60eafbf009a 323 pr_info("MAX30001::max30001_ECGFast_Init\r\n");
gmehmet 1:f60eafbf009a 324 max30001_mngr_int.bit.clr_fast = Clr_Fast;
gmehmet 1:f60eafbf009a 325
gmehmet 1:f60eafbf009a 326 if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 327 return -1;
gmehmet 1:f60eafbf009a 328 }
gmehmet 1:f60eafbf009a 329
gmehmet 1:f60eafbf009a 330 if (max30001_reg_read(MNGR_DYN, &max30001_mngr_dyn.all) == -1) {
gmehmet 1:f60eafbf009a 331 return -1;
gmehmet 1:f60eafbf009a 332 }
gmehmet 1:f60eafbf009a 333
gmehmet 1:f60eafbf009a 334 max30001_mngr_dyn.bit.fast = Fast;
gmehmet 1:f60eafbf009a 335 max30001_mngr_dyn.bit.fast_th = Fast_Th;
gmehmet 1:f60eafbf009a 336
gmehmet 1:f60eafbf009a 337 if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 338 return -1;
gmehmet 1:f60eafbf009a 339 }
gmehmet 1:f60eafbf009a 340
gmehmet 1:f60eafbf009a 341 return 0;
gmehmet 1:f60eafbf009a 342 }
gmehmet 1:f60eafbf009a 343
gmehmet 1:f60eafbf009a 344 //******************************************************************************
gmehmet 1:f60eafbf009a 345 int MAX30001::max30001_Stop_ECG(void) {
gmehmet 1:f60eafbf009a 346
gmehmet 1:f60eafbf009a 347 pr_info("MAX30001::max30001_Stop_ECG\r\n");
gmehmet 1:f60eafbf009a 348
gmehmet 1:f60eafbf009a 349 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 350 return -1;
gmehmet 1:f60eafbf009a 351 }
gmehmet 1:f60eafbf009a 352
gmehmet 1:f60eafbf009a 353 max30001_cnfg_gen.bit.en_ecg = 0; // Stop ECG
gmehmet 1:f60eafbf009a 354
gmehmet 1:f60eafbf009a 355 // fmstr is default
gmehmet 1:f60eafbf009a 356
gmehmet 1:f60eafbf009a 357 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 358 return -1;
gmehmet 1:f60eafbf009a 359 }
gmehmet 1:f60eafbf009a 360
gmehmet 1:f60eafbf009a 361 return 0;
gmehmet 1:f60eafbf009a 362 }
gmehmet 1:f60eafbf009a 363
gmehmet 1:f60eafbf009a 364 //******************************************************************************
gmehmet 1:f60eafbf009a 365 int MAX30001::max30001_PACE_InitStart(uint8_t En_pace, uint8_t Clr_pedge,
gmehmet 1:f60eafbf009a 366 uint8_t Pol, uint8_t Gn_diff_off,
gmehmet 1:f60eafbf009a 367 uint8_t Gain, uint8_t Aout_lbw,
gmehmet 1:f60eafbf009a 368 uint8_t Aout, uint8_t Dacp,
gmehmet 1:f60eafbf009a 369 uint8_t Dacn) {
gmehmet 1:f60eafbf009a 370
gmehmet 1:f60eafbf009a 371 /**** SET MASTER FREQUENCY, ENABLE CHANNELS ****/
gmehmet 1:f60eafbf009a 372
gmehmet 1:f60eafbf009a 373 // CNFG_GEN
gmehmet 1:f60eafbf009a 374
gmehmet 1:f60eafbf009a 375 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 376 return -1;
gmehmet 1:f60eafbf009a 377 }
gmehmet 1:f60eafbf009a 378
gmehmet 1:f60eafbf009a 379 max30001_cnfg_gen.bit.en_pace = En_pace; // 0b1;
gmehmet 1:f60eafbf009a 380
gmehmet 1:f60eafbf009a 381 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 382 return -1;
gmehmet 1:f60eafbf009a 383 }
gmehmet 1:f60eafbf009a 384
gmehmet 1:f60eafbf009a 385 /**** Wait for PLL Lock & References to settle down ****/
gmehmet 1:f60eafbf009a 386 max30001_timeout = 0;
gmehmet 1:f60eafbf009a 387
gmehmet 1:f60eafbf009a 388 do {
gmehmet 1:f60eafbf009a 389 if (max30001_reg_read(STATUS, &max30001_status.all) ==
gmehmet 1:f60eafbf009a 390 -1) // Wait and spin for PLL to lock...
gmehmet 1:f60eafbf009a 391 {
gmehmet 1:f60eafbf009a 392 return -1;
gmehmet 1:f60eafbf009a 393 }
gmehmet 1:f60eafbf009a 394
gmehmet 1:f60eafbf009a 395 } while (max30001_status.bit.pllint == 1 && max30001_timeout++ <= 1000);
gmehmet 1:f60eafbf009a 396
gmehmet 1:f60eafbf009a 397 // MNGR_INT
gmehmet 1:f60eafbf009a 398
gmehmet 1:f60eafbf009a 399 if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 400 return -1;
gmehmet 1:f60eafbf009a 401 }
gmehmet 1:f60eafbf009a 402
gmehmet 1:f60eafbf009a 403 max30001_mngr_int.bit.clr_pedge = Clr_pedge; // 0b0;
gmehmet 1:f60eafbf009a 404
gmehmet 1:f60eafbf009a 405 if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 406 return -1;
gmehmet 1:f60eafbf009a 407 }
gmehmet 1:f60eafbf009a 408
gmehmet 1:f60eafbf009a 409 /* Put: CNFG_PACE */
gmehmet 1:f60eafbf009a 410
gmehmet 1:f60eafbf009a 411 max30001_reg_read(CNFG_PACE, &max30001_cnfg_pace.all);
gmehmet 1:f60eafbf009a 412
gmehmet 1:f60eafbf009a 413 max30001_cnfg_pace.bit.pol = Pol;
gmehmet 1:f60eafbf009a 414 max30001_cnfg_pace.bit.gn_diff_off = Gn_diff_off;
gmehmet 1:f60eafbf009a 415 max30001_cnfg_pace.bit.gain = Gain;
gmehmet 1:f60eafbf009a 416 max30001_cnfg_pace.bit.aout_lbw = Aout_lbw;
gmehmet 1:f60eafbf009a 417 max30001_cnfg_pace.bit.aout = Aout;
gmehmet 1:f60eafbf009a 418 max30001_cnfg_pace.bit.dacp = Dacp;
gmehmet 1:f60eafbf009a 419 max30001_cnfg_pace.bit.dacn = Dacn;
gmehmet 1:f60eafbf009a 420
gmehmet 1:f60eafbf009a 421 max30001_reg_write(CNFG_PACE, max30001_cnfg_pace.all);
gmehmet 1:f60eafbf009a 422
gmehmet 1:f60eafbf009a 423 return 0;
gmehmet 1:f60eafbf009a 424 }
gmehmet 1:f60eafbf009a 425 //******************************************************************************
gmehmet 1:f60eafbf009a 426 int MAX30001::max30001_Stop_PACE(void) {
gmehmet 1:f60eafbf009a 427
gmehmet 1:f60eafbf009a 428 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 429 return -1;
gmehmet 1:f60eafbf009a 430 }
gmehmet 1:f60eafbf009a 431
gmehmet 1:f60eafbf009a 432 max30001_cnfg_gen.bit.en_pace = 0; // Stop PACE
gmehmet 1:f60eafbf009a 433
gmehmet 1:f60eafbf009a 434 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 435 return -1;
gmehmet 1:f60eafbf009a 436 }
gmehmet 1:f60eafbf009a 437
gmehmet 1:f60eafbf009a 438 return 0;
gmehmet 1:f60eafbf009a 439 }
gmehmet 1:f60eafbf009a 440
gmehmet 1:f60eafbf009a 441 //******************************************************************************
gmehmet 1:f60eafbf009a 442 int MAX30001::max30001_BIOZ_InitStart(
gmehmet 1:f60eafbf009a 443 uint8_t En_bioz, uint8_t Openp, uint8_t Openn, uint8_t Calp_sel,
gmehmet 1:f60eafbf009a 444 uint8_t Caln_sel, uint8_t CG_mode, uint8_t B_fit, uint8_t Rate,
gmehmet 1:f60eafbf009a 445 uint8_t Ahpf, uint8_t Ext_rbias, uint8_t Gain, uint8_t Dhpf, uint8_t Dlpf,
gmehmet 1:f60eafbf009a 446 uint8_t Fcgen, uint8_t Cgmon, uint8_t Cgmag, uint8_t Phoff, uint8_t Inapow_mode) {
gmehmet 1:f60eafbf009a 447
gmehmet 1:f60eafbf009a 448 // CNFG_BMUX
gmehmet 1:f60eafbf009a 449
gmehmet 1:f60eafbf009a 450 if (max30001_reg_read(CNFG_BMUX, &max30001_cnfg_bmux.all) == -1) {
gmehmet 1:f60eafbf009a 451 return -1;
gmehmet 1:f60eafbf009a 452 }
gmehmet 1:f60eafbf009a 453
gmehmet 1:f60eafbf009a 454 max30001_cnfg_bmux.bit.openp = Openp; // 0b1;
gmehmet 1:f60eafbf009a 455 max30001_cnfg_bmux.bit.openn = Openn; // 0b1;
gmehmet 1:f60eafbf009a 456 max30001_cnfg_bmux.bit.calp_sel = Calp_sel; // 0b10;
gmehmet 1:f60eafbf009a 457 max30001_cnfg_bmux.bit.caln_sel = Caln_sel; // 0b11;
gmehmet 1:f60eafbf009a 458 max30001_cnfg_bmux.bit.cg_mode = CG_mode; // 0b00;
gmehmet 1:f60eafbf009a 459
gmehmet 1:f60eafbf009a 460 if (max30001_reg_write(CNFG_BMUX, max30001_cnfg_bmux.all) == -1) {
gmehmet 1:f60eafbf009a 461 return -1;
gmehmet 1:f60eafbf009a 462 }
gmehmet 1:f60eafbf009a 463
gmehmet 1:f60eafbf009a 464 /**** SET MASTER FREQUENCY, ENABLE CHANNELS ****/
gmehmet 1:f60eafbf009a 465
gmehmet 1:f60eafbf009a 466 // CNFG_GEN
gmehmet 1:f60eafbf009a 467
gmehmet 1:f60eafbf009a 468 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 469 return -1;
gmehmet 1:f60eafbf009a 470 }
gmehmet 1:f60eafbf009a 471
gmehmet 1:f60eafbf009a 472 max30001_cnfg_gen.bit.en_bioz = En_bioz;
gmehmet 1:f60eafbf009a 473
gmehmet 1:f60eafbf009a 474 // fmstr is default
gmehmet 1:f60eafbf009a 475
gmehmet 1:f60eafbf009a 476 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 477 return -1;
gmehmet 1:f60eafbf009a 478 }
gmehmet 1:f60eafbf009a 479
gmehmet 1:f60eafbf009a 480 /**** Wait for PLL Lock & References to settle down ****/
gmehmet 1:f60eafbf009a 481
gmehmet 1:f60eafbf009a 482 max30001_timeout = 0;
gmehmet 1:f60eafbf009a 483
gmehmet 1:f60eafbf009a 484 do {
gmehmet 1:f60eafbf009a 485 if (max30001_reg_read(STATUS, &max30001_status.all) ==
gmehmet 1:f60eafbf009a 486 -1) // Wait and spin for PLL to lock...
gmehmet 1:f60eafbf009a 487 {
gmehmet 1:f60eafbf009a 488 return -1;
gmehmet 1:f60eafbf009a 489 }
gmehmet 1:f60eafbf009a 490
gmehmet 1:f60eafbf009a 491 } while (max30001_status.bit.pllint == 1 && max30001_timeout++ <= 1000);
gmehmet 1:f60eafbf009a 492
gmehmet 1:f60eafbf009a 493 /**** Start of CNFG_BIOZ ****/
gmehmet 1:f60eafbf009a 494
gmehmet 1:f60eafbf009a 495 // MNGR_INT
gmehmet 1:f60eafbf009a 496
gmehmet 1:f60eafbf009a 497 if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 498 return -1;
gmehmet 1:f60eafbf009a 499 }
gmehmet 1:f60eafbf009a 500
gmehmet 1:f60eafbf009a 501 max30001_mngr_int.bit.b_fit = B_fit; //;
gmehmet 1:f60eafbf009a 502
gmehmet 1:f60eafbf009a 503 if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 504 return -1;
gmehmet 1:f60eafbf009a 505 }
gmehmet 1:f60eafbf009a 506
gmehmet 1:f60eafbf009a 507 // CNFG_BIOZ
gmehmet 1:f60eafbf009a 508
gmehmet 1:f60eafbf009a 509 if (max30001_reg_read(CNFG_BIOZ, &max30001_cnfg_bioz.all) == -1) {
gmehmet 1:f60eafbf009a 510 return -1;
gmehmet 1:f60eafbf009a 511 }
gmehmet 1:f60eafbf009a 512
gmehmet 1:f60eafbf009a 513 max30001_cnfg_bioz.bit.rate = Rate;
gmehmet 1:f60eafbf009a 514 max30001_cnfg_bioz.bit.ahpf = Ahpf;
gmehmet 1:f60eafbf009a 515 max30001_cnfg_bioz.bit.ext_rbias = Ext_rbias;
gmehmet 1:f60eafbf009a 516 max30001_cnfg_bioz.bit.gain = Gain;
gmehmet 1:f60eafbf009a 517 max30001_cnfg_bioz.bit.dhpf = Dhpf;
gmehmet 1:f60eafbf009a 518 max30001_cnfg_bioz.bit.dlpf = Dlpf;
gmehmet 1:f60eafbf009a 519 max30001_cnfg_bioz.bit.fcgen = Fcgen;
gmehmet 1:f60eafbf009a 520 max30001_cnfg_bioz.bit.cgmon = Cgmon;
gmehmet 1:f60eafbf009a 521 max30001_cnfg_bioz.bit.cgmag = Cgmag;
gmehmet 1:f60eafbf009a 522 max30001_cnfg_bioz.bit.phoff = Phoff;
gmehmet 1:f60eafbf009a 523 max30001_cnfg_bioz.bit.inapow_mode = Inapow_mode;
gmehmet 1:f60eafbf009a 524
gmehmet 1:f60eafbf009a 525 if (max30001_reg_write(CNFG_BIOZ, max30001_cnfg_bioz.all) == -1) {
gmehmet 1:f60eafbf009a 526 return -1;
gmehmet 1:f60eafbf009a 527 }
gmehmet 1:f60eafbf009a 528
gmehmet 1:f60eafbf009a 529 return 0;
gmehmet 1:f60eafbf009a 530 }
gmehmet 1:f60eafbf009a 531
gmehmet 1:f60eafbf009a 532 //******************************************************************************
gmehmet 1:f60eafbf009a 533 int MAX30001::max30001_Stop_BIOZ(void) {
gmehmet 1:f60eafbf009a 534
gmehmet 1:f60eafbf009a 535 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 536 return -1;
gmehmet 1:f60eafbf009a 537 }
gmehmet 1:f60eafbf009a 538
gmehmet 1:f60eafbf009a 539 max30001_cnfg_gen.bit.en_bioz = 0; // Stop BIOZ
gmehmet 1:f60eafbf009a 540
gmehmet 1:f60eafbf009a 541 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 542 return -1;
gmehmet 1:f60eafbf009a 543 }
gmehmet 1:f60eafbf009a 544
gmehmet 1:f60eafbf009a 545 return 0;
gmehmet 1:f60eafbf009a 546 }
gmehmet 1:f60eafbf009a 547
gmehmet 1:f60eafbf009a 548 //******************************************************************************
gmehmet 1:f60eafbf009a 549 int MAX30001::max30001_BIOZ_InitBist(uint8_t En_bist, uint8_t Rnom,
gmehmet 1:f60eafbf009a 550 uint8_t Rmod, uint8_t Fbist) {
gmehmet 1:f60eafbf009a 551
gmehmet 1:f60eafbf009a 552 // CNFG_BMUX
gmehmet 1:f60eafbf009a 553
gmehmet 1:f60eafbf009a 554 if (max30001_reg_read(CNFG_BMUX, &max30001_cnfg_bmux.all) == -1) {
gmehmet 1:f60eafbf009a 555 return -1;
gmehmet 1:f60eafbf009a 556 }
gmehmet 1:f60eafbf009a 557
gmehmet 1:f60eafbf009a 558 max30001_cnfg_bmux.bit.en_bist = En_bist;
gmehmet 1:f60eafbf009a 559 max30001_cnfg_bmux.bit.rnom = Rnom;
gmehmet 1:f60eafbf009a 560 max30001_cnfg_bmux.bit.rmod = Rmod;
gmehmet 1:f60eafbf009a 561 max30001_cnfg_bmux.bit.fbist = Fbist;
gmehmet 1:f60eafbf009a 562
gmehmet 1:f60eafbf009a 563 if (max30001_reg_write(CNFG_BMUX, max30001_cnfg_bmux.all) == -1) {
gmehmet 1:f60eafbf009a 564 return -1;
gmehmet 1:f60eafbf009a 565 }
gmehmet 1:f60eafbf009a 566
gmehmet 1:f60eafbf009a 567 return 0;
gmehmet 1:f60eafbf009a 568 }
gmehmet 1:f60eafbf009a 569 //******************************************************************************
gmehmet 1:f60eafbf009a 570 int MAX30001::max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw,
gmehmet 1:f60eafbf009a 571 uint8_t Gain, uint8_t Pavg, uint8_t Ptsf,
gmehmet 1:f60eafbf009a 572 uint8_t Hoff, uint8_t Ravg, uint8_t Rhsf,
gmehmet 1:f60eafbf009a 573 uint8_t Clr_rrint) {
gmehmet 1:f60eafbf009a 574
gmehmet 1:f60eafbf009a 575 // MNGR_INT
gmehmet 1:f60eafbf009a 576
gmehmet 1:f60eafbf009a 577 if (max30001_reg_read(MNGR_INT, &max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 578 return -1;
gmehmet 1:f60eafbf009a 579 }
gmehmet 1:f60eafbf009a 580
gmehmet 1:f60eafbf009a 581 max30001_mngr_int.bit.clr_rrint =
gmehmet 1:f60eafbf009a 582 Clr_rrint; // 0b01 & 0b00 are for interrupt mode...
gmehmet 1:f60eafbf009a 583 // 0b10 is for monitoring mode... it just overwrites the data...
gmehmet 1:f60eafbf009a 584
gmehmet 1:f60eafbf009a 585 if (max30001_reg_write(MNGR_INT, max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 586 return -1;
gmehmet 1:f60eafbf009a 587 }
gmehmet 1:f60eafbf009a 588
gmehmet 1:f60eafbf009a 589 // RTOR1
gmehmet 1:f60eafbf009a 590 if (max30001_reg_read(CNFG_RTOR1, &max30001_cnfg_rtor1.all) == -1) {
gmehmet 1:f60eafbf009a 591 return -1;
gmehmet 1:f60eafbf009a 592 }
gmehmet 1:f60eafbf009a 593
gmehmet 1:f60eafbf009a 594 max30001_cnfg_rtor1.bit.wndw = Wndw;
gmehmet 1:f60eafbf009a 595 max30001_cnfg_rtor1.bit.gain = Gain;
gmehmet 1:f60eafbf009a 596 max30001_cnfg_rtor1.bit.en_rtor = En_rtor;
gmehmet 1:f60eafbf009a 597 max30001_cnfg_rtor1.bit.pavg = Pavg;
gmehmet 1:f60eafbf009a 598 max30001_cnfg_rtor1.bit.ptsf = Ptsf;
gmehmet 1:f60eafbf009a 599
gmehmet 1:f60eafbf009a 600 if (max30001_reg_write(CNFG_RTOR1, max30001_cnfg_rtor1.all) == -1) {
gmehmet 1:f60eafbf009a 601 return -1;
gmehmet 1:f60eafbf009a 602 }
gmehmet 1:f60eafbf009a 603 // RTOR2
gmehmet 1:f60eafbf009a 604
gmehmet 1:f60eafbf009a 605 if (max30001_reg_read(CNFG_RTOR2, &max30001_cnfg_rtor2.all) == -1) {
gmehmet 1:f60eafbf009a 606 return -1;
gmehmet 1:f60eafbf009a 607 }
gmehmet 1:f60eafbf009a 608 max30001_cnfg_rtor2.bit.hoff = Hoff;
gmehmet 1:f60eafbf009a 609 max30001_cnfg_rtor2.bit.ravg = Ravg;
gmehmet 1:f60eafbf009a 610 max30001_cnfg_rtor2.bit.rhsf = Rhsf;
gmehmet 1:f60eafbf009a 611
gmehmet 1:f60eafbf009a 612 if (max30001_reg_write(CNFG_RTOR2, max30001_cnfg_rtor2.all) == -1) {
gmehmet 1:f60eafbf009a 613 return -1;
gmehmet 1:f60eafbf009a 614 }
gmehmet 1:f60eafbf009a 615
gmehmet 1:f60eafbf009a 616 return 0;
gmehmet 1:f60eafbf009a 617 }
gmehmet 1:f60eafbf009a 618
gmehmet 1:f60eafbf009a 619 //******************************************************************************
gmehmet 1:f60eafbf009a 620 int MAX30001::max30001_Stop_RtoR(void) {
gmehmet 1:f60eafbf009a 621
gmehmet 1:f60eafbf009a 622 if (max30001_reg_read(CNFG_RTOR1, &max30001_cnfg_rtor1.all) == -1) {
gmehmet 1:f60eafbf009a 623 return -1;
gmehmet 1:f60eafbf009a 624 }
gmehmet 1:f60eafbf009a 625
gmehmet 1:f60eafbf009a 626 max30001_cnfg_rtor1.bit.en_rtor = 0; // Stop RtoR
gmehmet 1:f60eafbf009a 627
gmehmet 1:f60eafbf009a 628 if (max30001_reg_write(CNFG_RTOR1, max30001_cnfg_rtor1.all) == -1) {
gmehmet 1:f60eafbf009a 629 return -1;
gmehmet 1:f60eafbf009a 630 }
gmehmet 1:f60eafbf009a 631
gmehmet 1:f60eafbf009a 632 return 0;
gmehmet 1:f60eafbf009a 633 }
gmehmet 1:f60eafbf009a 634
gmehmet 1:f60eafbf009a 635 //******************************************************************************
gmehmet 1:f60eafbf009a 636 int MAX30001::max30001_PLL_lock(void) {
gmehmet 1:f60eafbf009a 637 // Spin to see PLLint become zero to indicate a lock.
gmehmet 1:f60eafbf009a 638
gmehmet 1:f60eafbf009a 639 max30001_timeout = 0;
gmehmet 1:f60eafbf009a 640
gmehmet 1:f60eafbf009a 641 do {
gmehmet 1:f60eafbf009a 642 if (max30001_reg_read(STATUS, &max30001_status.all) ==
gmehmet 1:f60eafbf009a 643 -1) // Wait and spin for PLL to lock...
gmehmet 1:f60eafbf009a 644 {
gmehmet 1:f60eafbf009a 645 return -1;
gmehmet 1:f60eafbf009a 646 }
gmehmet 1:f60eafbf009a 647
gmehmet 1:f60eafbf009a 648 } while (max30001_status.bit.pllint == 1 && max30001_timeout++ <= 1000);
gmehmet 1:f60eafbf009a 649
gmehmet 1:f60eafbf009a 650 return 0;
gmehmet 1:f60eafbf009a 651 }
gmehmet 1:f60eafbf009a 652
gmehmet 1:f60eafbf009a 653 //******************************************************************************
gmehmet 1:f60eafbf009a 654 int MAX30001::max30001_sw_rst(void) {
gmehmet 1:f60eafbf009a 655 // SW reset for the MAX30001 chip
gmehmet 1:f60eafbf009a 656
gmehmet 1:f60eafbf009a 657 if (max30001_reg_write(SW_RST, 0x000000) == -1) {
gmehmet 1:f60eafbf009a 658 return -1;
gmehmet 1:f60eafbf009a 659 }
gmehmet 1:f60eafbf009a 660
gmehmet 1:f60eafbf009a 661 return 0;
gmehmet 1:f60eafbf009a 662 }
gmehmet 1:f60eafbf009a 663
gmehmet 1:f60eafbf009a 664 //******************************************************************************
gmehmet 1:f60eafbf009a 665 int MAX30001::max30001_synch(void) { // For synchronization
gmehmet 1:f60eafbf009a 666 if (max30001_reg_write(SYNCH, 0x000000) == -1) {
gmehmet 1:f60eafbf009a 667 return -1;
gmehmet 1:f60eafbf009a 668 }
gmehmet 1:f60eafbf009a 669 return 0;
gmehmet 1:f60eafbf009a 670 }
gmehmet 1:f60eafbf009a 671
gmehmet 1:f60eafbf009a 672 //******************************************************************************
gmehmet 1:f60eafbf009a 673 int MAX30001::max300001_fifo_rst(void) { // Resets the FIFO
gmehmet 1:f60eafbf009a 674 if (max30001_reg_write(FIFO_RST, 0x000000) == -1) {
gmehmet 1:f60eafbf009a 675 return -1;
gmehmet 1:f60eafbf009a 676 }
gmehmet 1:f60eafbf009a 677 return 0;
gmehmet 1:f60eafbf009a 678 }
gmehmet 1:f60eafbf009a 679
gmehmet 1:f60eafbf009a 680 //******************************************************************************
gmehmet 1:f60eafbf009a 681 // int MAX30001::max30001_reg_write(uint8_t addr, uint32_t data)
gmehmet 1:f60eafbf009a 682 int MAX30001::max30001_reg_write(MAX30001_REG_map_t addr, uint32_t data) {
gmehmet 1:f60eafbf009a 683
gmehmet 1:f60eafbf009a 684 uint8_t result[4];
gmehmet 1:f60eafbf009a 685 uint8_t data_array[4];
gmehmet 1:f60eafbf009a 686 int32_t success = 0;
gmehmet 1:f60eafbf009a 687
gmehmet 1:f60eafbf009a 688 data_array[0] = (addr << 1) & 0xff;
gmehmet 1:f60eafbf009a 689
gmehmet 1:f60eafbf009a 690 data_array[3] = data & 0xff;
gmehmet 1:f60eafbf009a 691 data_array[2] = (data >> 8) & 0xff;
gmehmet 1:f60eafbf009a 692 data_array[1] = (data >> 16) & 0xff;
gmehmet 1:f60eafbf009a 693
gmehmet 1:f60eafbf009a 694 success = SPI_Transmit(&data_array[0], 4, &result[0], 4);
gmehmet 1:f60eafbf009a 695
gmehmet 1:f60eafbf009a 696 //pr_info("MAX30001 write\treg[0x%.2X]=0x%X\r\n", addr, data);
gmehmet 1:f60eafbf009a 697
gmehmet 1:f60eafbf009a 698 if (success != 0) {
gmehmet 1:f60eafbf009a 699 return -1;
gmehmet 1:f60eafbf009a 700 } else {
gmehmet 1:f60eafbf009a 701 return 0;
gmehmet 1:f60eafbf009a 702 }
gmehmet 1:f60eafbf009a 703 }
gmehmet 1:f60eafbf009a 704
gmehmet 1:f60eafbf009a 705 //******************************************************************************
gmehmet 1:f60eafbf009a 706 // int MAX30001::max30001_reg_read(uint8_t addr, uint32_t *return_data)
gmehmet 1:f60eafbf009a 707 int MAX30001::max30001_reg_read(MAX30001_REG_map_t addr,
gmehmet 1:f60eafbf009a 708 uint32_t *return_data) {
gmehmet 1:f60eafbf009a 709 uint8_t result[4];
gmehmet 1:f60eafbf009a 710 uint8_t data_array[1];
gmehmet 1:f60eafbf009a 711 int32_t success = 0;
gmehmet 1:f60eafbf009a 712
gmehmet 1:f60eafbf009a 713 data_array[0] = ((addr << 1) & 0xff) | 1; // For Read, Or with 1
gmehmet 1:f60eafbf009a 714 success = SPI_Transmit(&data_array[0], 1, &result[0], 4);
gmehmet 1:f60eafbf009a 715 *return_data = /*result[0] + */ (uint32_t)(result[1] << 16) +
gmehmet 1:f60eafbf009a 716 (result[2] << 8) + result[3];
gmehmet 1:f60eafbf009a 717
gmehmet 1:f60eafbf009a 718 //pr_info("MAX30001 read\treg[0x%.2X]=0x%X\r\n", addr, *return_data);
gmehmet 1:f60eafbf009a 719
gmehmet 1:f60eafbf009a 720 if (success != 0) {
gmehmet 1:f60eafbf009a 721 return -1;
gmehmet 1:f60eafbf009a 722 } else {
gmehmet 1:f60eafbf009a 723 return 0;
gmehmet 1:f60eafbf009a 724 }
gmehmet 1:f60eafbf009a 725 }
gmehmet 1:f60eafbf009a 726
gmehmet 1:f60eafbf009a 727 //******************************************************************************
gmehmet 1:f60eafbf009a 728 int MAX30001::max30001_Enable_DcLeadOFF_Init(int8_t En_dcloff, int8_t Ipol,
gmehmet 1:f60eafbf009a 729 int8_t Imag, int8_t Vth) {
gmehmet 1:f60eafbf009a 730 // the leads are not touching the body
gmehmet 1:f60eafbf009a 731
gmehmet 1:f60eafbf009a 732 // CNFG_EMUX, Set ECGP and ECGN for external hook up...
gmehmet 1:f60eafbf009a 733
gmehmet 1:f60eafbf009a 734 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 735 return -1;
gmehmet 1:f60eafbf009a 736 }
gmehmet 1:f60eafbf009a 737
gmehmet 1:f60eafbf009a 738 max30001_cnfg_gen.bit.en_dcloff = En_dcloff;
gmehmet 1:f60eafbf009a 739 max30001_cnfg_gen.bit.ipol = Ipol;
gmehmet 1:f60eafbf009a 740 max30001_cnfg_gen.bit.imag = Imag;
gmehmet 1:f60eafbf009a 741 max30001_cnfg_gen.bit.vth = Vth;
gmehmet 1:f60eafbf009a 742
gmehmet 1:f60eafbf009a 743 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 744 return -1;
gmehmet 1:f60eafbf009a 745 }
gmehmet 1:f60eafbf009a 746
gmehmet 1:f60eafbf009a 747 return 0;
gmehmet 1:f60eafbf009a 748 }
gmehmet 1:f60eafbf009a 749
gmehmet 1:f60eafbf009a 750 //******************************************************************************
gmehmet 1:f60eafbf009a 751 int MAX30001::max30001_Disable_DcLeadOFF(void) {
gmehmet 1:f60eafbf009a 752 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 753 return -1;
gmehmet 1:f60eafbf009a 754 }
gmehmet 1:f60eafbf009a 755
gmehmet 1:f60eafbf009a 756 max30001_cnfg_gen.bit.en_dcloff = 0; // Turned off the dc lead off.
gmehmet 1:f60eafbf009a 757
gmehmet 1:f60eafbf009a 758 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 759 return -1;
gmehmet 1:f60eafbf009a 760 }
gmehmet 1:f60eafbf009a 761
gmehmet 1:f60eafbf009a 762 return 0;
gmehmet 1:f60eafbf009a 763 }
gmehmet 1:f60eafbf009a 764
gmehmet 1:f60eafbf009a 765 //******************************************************************************
gmehmet 1:f60eafbf009a 766 int MAX30001::max30001_BIOZ_Enable_ACLeadOFF_Init(uint8_t En_bloff,
gmehmet 1:f60eafbf009a 767 uint8_t Bloff_hi_it,
gmehmet 1:f60eafbf009a 768 uint8_t Bloff_lo_it) {
gmehmet 1:f60eafbf009a 769
gmehmet 1:f60eafbf009a 770 // CNFG_GEN
gmehmet 1:f60eafbf009a 771 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 772 return -1;
gmehmet 1:f60eafbf009a 773 }
gmehmet 1:f60eafbf009a 774
gmehmet 1:f60eafbf009a 775 max30001_cnfg_gen.bit.en_bloff = En_bloff;
gmehmet 1:f60eafbf009a 776
gmehmet 1:f60eafbf009a 777 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 778 return -1;
gmehmet 1:f60eafbf009a 779 }
gmehmet 1:f60eafbf009a 780
gmehmet 1:f60eafbf009a 781 // MNGR_DYN
gmehmet 1:f60eafbf009a 782 if (max30001_reg_read(MNGR_DYN, &max30001_mngr_dyn.all) == -1) {
gmehmet 1:f60eafbf009a 783 return -1;
gmehmet 1:f60eafbf009a 784 }
gmehmet 1:f60eafbf009a 785
gmehmet 1:f60eafbf009a 786 max30001_mngr_dyn.bit.bloff_hi_it = Bloff_hi_it;
gmehmet 1:f60eafbf009a 787 max30001_mngr_dyn.bit.bloff_lo_it = Bloff_lo_it;
gmehmet 1:f60eafbf009a 788
gmehmet 1:f60eafbf009a 789 if (max30001_reg_write(MNGR_DYN, max30001_mngr_dyn.all) == -1) {
gmehmet 1:f60eafbf009a 790 return -1;
gmehmet 1:f60eafbf009a 791 }
gmehmet 1:f60eafbf009a 792
gmehmet 1:f60eafbf009a 793 return 0;
gmehmet 1:f60eafbf009a 794 }
gmehmet 1:f60eafbf009a 795
gmehmet 1:f60eafbf009a 796 //******************************************************************************
gmehmet 1:f60eafbf009a 797 int MAX30001::max30001_BIOZ_Disable_ACleadOFF(void) {
gmehmet 1:f60eafbf009a 798 // CNFG_GEN
gmehmet 1:f60eafbf009a 799 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 800 return -1;
gmehmet 1:f60eafbf009a 801 }
gmehmet 1:f60eafbf009a 802
gmehmet 1:f60eafbf009a 803 max30001_cnfg_gen.bit.en_bloff = 0b0; // Turns of the BIOZ AC Lead OFF feature
gmehmet 1:f60eafbf009a 804
gmehmet 1:f60eafbf009a 805 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 806 return -1;
gmehmet 1:f60eafbf009a 807 }
gmehmet 1:f60eafbf009a 808
gmehmet 1:f60eafbf009a 809 return 0;
gmehmet 1:f60eafbf009a 810 }
gmehmet 1:f60eafbf009a 811
gmehmet 1:f60eafbf009a 812 //******************************************************************************
gmehmet 1:f60eafbf009a 813 int MAX30001::max30001_BIOZ_Enable_BCGMON(void) {
gmehmet 1:f60eafbf009a 814 // CNFG_BIOZ
gmehmet 1:f60eafbf009a 815 if (max30001_reg_read(CNFG_BIOZ, &max30001_cnfg_bioz.all) == -1) {
gmehmet 1:f60eafbf009a 816 return -1;
gmehmet 1:f60eafbf009a 817 }
gmehmet 1:f60eafbf009a 818
gmehmet 1:f60eafbf009a 819 max30001_cnfg_bioz.bit.cgmon = 1;
gmehmet 1:f60eafbf009a 820
gmehmet 1:f60eafbf009a 821 if (max30001_reg_write(CNFG_BIOZ, max30001_cnfg_bioz.all) == -1) {
gmehmet 1:f60eafbf009a 822 return -1;
gmehmet 1:f60eafbf009a 823 }
gmehmet 1:f60eafbf009a 824
gmehmet 1:f60eafbf009a 825 max30001_reg_read(CNFG_BIOZ, &max30001_cnfg_bioz.all);
gmehmet 1:f60eafbf009a 826
gmehmet 1:f60eafbf009a 827 return 0;
gmehmet 1:f60eafbf009a 828 }
gmehmet 1:f60eafbf009a 829
gmehmet 1:f60eafbf009a 830 #if 1
gmehmet 1:f60eafbf009a 831 //******************************************************************************
gmehmet 1:f60eafbf009a 832 int MAX30001::max30001_Enable_LeadON(int8_t Channel) // Channel: ECG = 0b01, BIOZ = 0b10, Disable = 0b00
gmehmet 1:f60eafbf009a 833 {
gmehmet 1:f60eafbf009a 834
gmehmet 1:f60eafbf009a 835 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 836 return -1;
gmehmet 1:f60eafbf009a 837 }
gmehmet 1:f60eafbf009a 838
gmehmet 1:f60eafbf009a 839 max30001_cnfg_gen.bit.en_ecg = 0b0;
gmehmet 1:f60eafbf009a 840 max30001_cnfg_gen.bit.en_bioz = 0b0;
gmehmet 1:f60eafbf009a 841 max30001_cnfg_gen.bit.en_pace = 0b0;
gmehmet 1:f60eafbf009a 842
gmehmet 1:f60eafbf009a 843 max30001_cnfg_gen.bit.en_ulp_lon = Channel; // BIOZ ULP lead on detection...
gmehmet 1:f60eafbf009a 844
gmehmet 1:f60eafbf009a 845 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 846 return -1;
gmehmet 1:f60eafbf009a 847 }
gmehmet 1:f60eafbf009a 848
gmehmet 1:f60eafbf009a 849 max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all);
gmehmet 1:f60eafbf009a 850
gmehmet 1:f60eafbf009a 851 max30001_reg_read(STATUS, &max30001_status.all);
gmehmet 1:f60eafbf009a 852
gmehmet 1:f60eafbf009a 853 return 0;
gmehmet 1:f60eafbf009a 854 }
gmehmet 1:f60eafbf009a 855 //******************************************************************************
gmehmet 1:f60eafbf009a 856 int MAX30001::max30001_Disable_LeadON(void) {
gmehmet 1:f60eafbf009a 857
gmehmet 1:f60eafbf009a 858 if (max30001_reg_read(CNFG_GEN, &max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 859 return -1;
gmehmet 1:f60eafbf009a 860 }
gmehmet 1:f60eafbf009a 861
gmehmet 1:f60eafbf009a 862 max30001_cnfg_gen.bit.en_ulp_lon = 0b0;
gmehmet 1:f60eafbf009a 863
gmehmet 1:f60eafbf009a 864 if (max30001_reg_write(CNFG_GEN, max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 865 return -1;
gmehmet 1:f60eafbf009a 866 }
gmehmet 1:f60eafbf009a 867
gmehmet 1:f60eafbf009a 868 return 0;
gmehmet 1:f60eafbf009a 869 }
gmehmet 1:f60eafbf009a 870 #endif
gmehmet 1:f60eafbf009a 871 //******************************************************************************
gmehmet 1:f60eafbf009a 872 #define LEADOFF_SERVICE_TIME 0x2000 // 0x1000 = 1 second
gmehmet 1:f60eafbf009a 873 #define LEADOFF_NUMSTATES 2
gmehmet 1:f60eafbf009a 874 uint32_t leadoffState = 0;
gmehmet 1:f60eafbf009a 875 uint32_t max30001_LeadOffoldTime = 0;
gmehmet 1:f60eafbf009a 876 void MAX30001::max30001_ServiceLeadoff(uint32_t currentTime) {
gmehmet 1:f60eafbf009a 877
gmehmet 1:f60eafbf009a 878 uint32_t delta_Time;
gmehmet 1:f60eafbf009a 879
gmehmet 1:f60eafbf009a 880 delta_Time = currentTime - max30001_LeadOffoldTime;
gmehmet 1:f60eafbf009a 881
gmehmet 1:f60eafbf009a 882 if (delta_Time > LEADOFF_SERVICE_TIME) {
gmehmet 1:f60eafbf009a 883 switch (leadoffState) {
gmehmet 1:f60eafbf009a 884 case 0: /* switch to ECG DC Lead OFF */
gmehmet 1:f60eafbf009a 885 max30001_Enable_DcLeadOFF_Init(0b01, 0b0, 0b001, 0b00);
gmehmet 1:f60eafbf009a 886 break;
gmehmet 1:f60eafbf009a 887
gmehmet 1:f60eafbf009a 888 case 1: /* switch to BIOZ DC Lead OFF */
gmehmet 1:f60eafbf009a 889 max30001_Enable_DcLeadOFF_Init(0b10, 0b0, 0b001, 0b00);
gmehmet 1:f60eafbf009a 890 break;
gmehmet 1:f60eafbf009a 891 }
gmehmet 1:f60eafbf009a 892
gmehmet 1:f60eafbf009a 893 leadoffState++;
gmehmet 1:f60eafbf009a 894 leadoffState %= LEADOFF_NUMSTATES;
gmehmet 1:f60eafbf009a 895
gmehmet 1:f60eafbf009a 896 max30001_LeadOffoldTime = currentTime;
gmehmet 1:f60eafbf009a 897 }
gmehmet 1:f60eafbf009a 898 }
gmehmet 1:f60eafbf009a 899 //******************************************************************************
gmehmet 1:f60eafbf009a 900 #define LEADON_SERVICE_TIME 0x2000 // 0x1000 = 1 second
gmehmet 1:f60eafbf009a 901 #define LEADON_NUMSTATES 2
gmehmet 1:f60eafbf009a 902 uint32_t leadOnState = 0;
gmehmet 1:f60eafbf009a 903 uint32_t max30001_LeadOnoldTime = 0;
gmehmet 1:f60eafbf009a 904 void MAX30001::max30001_ServiceLeadON(uint32_t currentTime) {
gmehmet 1:f60eafbf009a 905
gmehmet 1:f60eafbf009a 906 uint32_t delta_Time;
gmehmet 1:f60eafbf009a 907
gmehmet 1:f60eafbf009a 908 delta_Time = currentTime - max30001_LeadOnoldTime;
gmehmet 1:f60eafbf009a 909
gmehmet 1:f60eafbf009a 910 if (delta_Time > LEADON_SERVICE_TIME) {
gmehmet 1:f60eafbf009a 911 switch (leadOnState) {
gmehmet 1:f60eafbf009a 912 case 0: /* switch to ECG DC Lead ON */
gmehmet 1:f60eafbf009a 913 max30001_Enable_LeadON(0b01);
gmehmet 1:f60eafbf009a 914 break;
gmehmet 1:f60eafbf009a 915
gmehmet 1:f60eafbf009a 916 case 1: /* switch to BIOZ DC Lead ON */
gmehmet 1:f60eafbf009a 917 max30001_Enable_LeadON(0b10);
gmehmet 1:f60eafbf009a 918 break;
gmehmet 1:f60eafbf009a 919 }
gmehmet 1:f60eafbf009a 920
gmehmet 1:f60eafbf009a 921 leadOnState++;
gmehmet 1:f60eafbf009a 922 leadOnState %= LEADON_NUMSTATES;
gmehmet 1:f60eafbf009a 923
gmehmet 1:f60eafbf009a 924 max30001_LeadOnoldTime = currentTime;
gmehmet 1:f60eafbf009a 925 }
gmehmet 1:f60eafbf009a 926 }
gmehmet 1:f60eafbf009a 927
gmehmet 1:f60eafbf009a 928 //******************************************************************************
gmehmet 1:f60eafbf009a 929 int MAX30001::max30001_FIFO_LeadONOff_Read(void) {
gmehmet 1:f60eafbf009a 930
gmehmet 1:f60eafbf009a 931 uint8_t result[32 * 3]; // 32words - 3bytes each
gmehmet 1:f60eafbf009a 932 uint8_t paceResult[6 * 3];
gmehmet 1:f60eafbf009a 933 uint8_t data_array[4];
gmehmet 1:f60eafbf009a 934 int32_t success = 0;
gmehmet 1:f60eafbf009a 935 int i, j;
gmehmet 1:f60eafbf009a 936
gmehmet 1:f60eafbf009a 937 uint32_t total_databytes;
gmehmet 1:f60eafbf009a 938 uint8_t i_index;
gmehmet 1:f60eafbf009a 939 uint8_t data_chunk;
gmehmet 1:f60eafbf009a 940 uint8_t loop_logic;
gmehmet 1:f60eafbf009a 941
gmehmet 1:f60eafbf009a 942 uint8_t etag = 0;
gmehmet 1:f60eafbf009a 943 uint8_t ptag = 0;
gmehmet 1:f60eafbf009a 944 uint8_t btag = 0;
gmehmet 1:f60eafbf009a 945
gmehmet 1:f60eafbf009a 946 uint8_t adr;
gmehmet 1:f60eafbf009a 947
gmehmet 1:f60eafbf009a 948 //int8_t ReadAllPaceOnce;
gmehmet 1:f60eafbf009a 949 bool anyPaceDetected = false;
gmehmet 1:f60eafbf009a 950 static uint8_t dcloffint_OneShot = 0;
gmehmet 1:f60eafbf009a 951 static uint8_t acloffint_OneShot = 0;
gmehmet 1:f60eafbf009a 952 static uint8_t bcgmon_OneShot = 0;
gmehmet 1:f60eafbf009a 953 static uint8_t acleadon_OneShot = 0;
gmehmet 1:f60eafbf009a 954
gmehmet 1:f60eafbf009a 955 int8_t ret_val;
gmehmet 1:f60eafbf009a 956
gmehmet 1:f60eafbf009a 957 pr_info("MAX30001::max30001_FIFO_LeadONOff_Read\r\n");
gmehmet 1:f60eafbf009a 958
gmehmet 1:f60eafbf009a 959 if (max30001_status.bit.eint == 1) {
gmehmet 1:f60eafbf009a 960 adr = ECG_FIFO_BURST;
gmehmet 1:f60eafbf009a 961 data_array[0] = ((adr << 1) & 0xff) | 1;
gmehmet 1:f60eafbf009a 962
gmehmet 1:f60eafbf009a 963 // The SPI routine only sends out data of 32 bytes in size. Therefore the
gmehmet 1:f60eafbf009a 964 // data is being read in
gmehmet 1:f60eafbf009a 965 // smaller chunks in this routine...
gmehmet 1:f60eafbf009a 966
gmehmet 1:f60eafbf009a 967 total_databytes = (max30001_mngr_int.bit.e_fit + 1) * 3;
gmehmet 1:f60eafbf009a 968
gmehmet 1:f60eafbf009a 969 i_index = 0;
gmehmet 1:f60eafbf009a 970 loop_logic = 1;
gmehmet 1:f60eafbf009a 971
gmehmet 1:f60eafbf009a 972 while (loop_logic) {
gmehmet 1:f60eafbf009a 973 if (total_databytes > 30) {
gmehmet 1:f60eafbf009a 974 data_chunk = 30;
gmehmet 1:f60eafbf009a 975 total_databytes = total_databytes - 30;
gmehmet 1:f60eafbf009a 976 } else {
gmehmet 1:f60eafbf009a 977 data_chunk = total_databytes;
gmehmet 1:f60eafbf009a 978 loop_logic = 0;
gmehmet 1:f60eafbf009a 979 }
gmehmet 1:f60eafbf009a 980
gmehmet 1:f60eafbf009a 981 /* The extra 1 byte is for the extra byte that comes out of the SPI */
gmehmet 1:f60eafbf009a 982 success = SPI_Transmit(&data_array[0], 1, &result[i_index], (data_chunk + 1)); // Make a copy of the FIFO over here...
gmehmet 1:f60eafbf009a 983
gmehmet 1:f60eafbf009a 984 if (success != 0) {
gmehmet 1:f60eafbf009a 985 return -1;
gmehmet 1:f60eafbf009a 986 }
gmehmet 1:f60eafbf009a 987
gmehmet 1:f60eafbf009a 988 /* This is important, because every transaction above creates an empty
gmehmet 1:f60eafbf009a 989 * redundant data at result[0] */
gmehmet 1:f60eafbf009a 990 for (j = i_index; j < (data_chunk + i_index); j++) /* get rid of the 1 extra byte by moving the whole array up one */
gmehmet 1:f60eafbf009a 991 {
gmehmet 1:f60eafbf009a 992 result[j] = result[j + 1];
gmehmet 1:f60eafbf009a 993 }
gmehmet 1:f60eafbf009a 994
gmehmet 1:f60eafbf009a 995 i_index = i_index + 30; /* point to the next array location to put the data in */
gmehmet 1:f60eafbf009a 996 }
gmehmet 1:f60eafbf009a 997
gmehmet 1:f60eafbf009a 998 //ReadAllPaceOnce = 0;
gmehmet 1:f60eafbf009a 999
gmehmet 1:f60eafbf009a 1000 /* Put the content of the FIFO based on the EFIT value, We ignore the
gmehmet 1:f60eafbf009a 1001 * result[0] and start concatenating indexes: 1,2,3 - 4,5,6 - 7,8,9 - */
gmehmet 1:f60eafbf009a 1002 for (i = 0, j = 0; i < max30001_mngr_int.bit.e_fit + 1; i++, j = j + 3) // index1=23-16 bit, index2=15-8 bit, index3=7-0 bit
gmehmet 1:f60eafbf009a 1003 {
gmehmet 1:f60eafbf009a 1004 max30001_ECG_FIFO_buffer[i] = ((uint32_t)result[j] << 16) + (result[j + 1] << 8) + result[j + 2];
gmehmet 1:f60eafbf009a 1005
gmehmet 1:f60eafbf009a 1006 etag = (0b00111000 & result[j + 2]) >> 3;
gmehmet 1:f60eafbf009a 1007 ptag = 0b00000111 & result[j + 2];
gmehmet 1:f60eafbf009a 1008
gmehmet 1:f60eafbf009a 1009 if (ptag != 0b111 ){//&& ReadAllPaceOnce == 0) {
gmehmet 1:f60eafbf009a 1010
gmehmet 1:f60eafbf009a 1011 //ReadAllPaceOnce = 1; // This will prevent extra read of PACE, once group
gmehmet 1:f60eafbf009a 1012 // 0-5 is read ONCE.
gmehmet 1:f60eafbf009a 1013 readPace(ptag, paceResult); // BUG: result data from ECG is being overwritten by the PACE data
gmehmet 1:f60eafbf009a 1014 anyPaceDetected = true;
gmehmet 1:f60eafbf009a 1015 }
gmehmet 1:f60eafbf009a 1016 }
gmehmet 1:f60eafbf009a 1017
gmehmet 1:f60eafbf009a 1018 if (anyPaceDetected)
gmehmet 1:f60eafbf009a 1019 dataAvailable(MAX30001_DATA_PACE, max30001_PACE, 18); // Send out the Pace data once only
gmehmet 1:f60eafbf009a 1020
gmehmet 1:f60eafbf009a 1021 if (etag != 0b110) {
gmehmet 1:f60eafbf009a 1022
gmehmet 1:f60eafbf009a 1023 dataAvailable(MAX30001_DATA_ECG, max30001_ECG_FIFO_buffer, (max30001_mngr_int.bit.e_fit + 1));
gmehmet 1:f60eafbf009a 1024 }
gmehmet 1:f60eafbf009a 1025
gmehmet 1:f60eafbf009a 1026 } /* End of ECG init */
gmehmet 1:f60eafbf009a 1027
gmehmet 1:f60eafbf009a 1028 /* RtoR */
gmehmet 1:f60eafbf009a 1029
gmehmet 1:f60eafbf009a 1030 if (max30001_status.bit.rrint == 1) {
gmehmet 1:f60eafbf009a 1031 if (max30001_reg_read(RTOR, &max30001_RtoR_data) == -1) {
gmehmet 1:f60eafbf009a 1032 return -1;
gmehmet 1:f60eafbf009a 1033 }
gmehmet 1:f60eafbf009a 1034
gmehmet 1:f60eafbf009a 1035 max30001_RtoR_data = (0x00FFFFFF & max30001_RtoR_data) >> 10;
gmehmet 1:f60eafbf009a 1036
gmehmet 1:f60eafbf009a 1037 hspValMax30001.R2R = (uint16_t)max30001_RtoR_data;
gmehmet 1:f60eafbf009a 1038 hspValMax30001.fmstr = (uint16_t)max30001_cnfg_gen.bit.fmstr;
gmehmet 1:f60eafbf009a 1039
gmehmet 1:f60eafbf009a 1040 dataAvailable(MAX30001_DATA_RTOR, &max30001_RtoR_data, 1);
gmehmet 1:f60eafbf009a 1041 }
gmehmet 1:f60eafbf009a 1042
gmehmet 1:f60eafbf009a 1043 // Handling BIOZ data...
gmehmet 1:f60eafbf009a 1044
gmehmet 1:f60eafbf009a 1045 if (max30001_status.bit.bint == 1) {
gmehmet 1:f60eafbf009a 1046 adr = 0x22;
gmehmet 1:f60eafbf009a 1047 data_array[0] = ((adr << 1) & 0xff) | 1;
gmehmet 1:f60eafbf009a 1048
gmehmet 1:f60eafbf009a 1049 /* [(BFIT+1)*3byte]+1extra byte due to the addr */
gmehmet 1:f60eafbf009a 1050
gmehmet 1:f60eafbf009a 1051 if (SPI_Transmit(&data_array[0], 1, &result[0],((max30001_mngr_int.bit.b_fit + 1) * 3) + 1) == -1) // Make a copy of the FIFO over here...
gmehmet 1:f60eafbf009a 1052
gmehmet 1:f60eafbf009a 1053 {
gmehmet 1:f60eafbf009a 1054 return -1;
gmehmet 1:f60eafbf009a 1055 }
gmehmet 1:f60eafbf009a 1056
gmehmet 1:f60eafbf009a 1057 btag = 0b00000111 & result[3];
gmehmet 1:f60eafbf009a 1058
gmehmet 1:f60eafbf009a 1059 /* Put the content of the FIFO based on the BFIT value, We ignore the
gmehmet 1:f60eafbf009a 1060 * result[0] and start concatenating indexes: 1,2,3 - 4,5,6 - 7,8,9 - */
gmehmet 1:f60eafbf009a 1061 for (i = 0, j = 0; i < max30001_mngr_int.bit.b_fit + 1; i++, j = j + 3) // index1=23-16 bit, index2=15-8 bit, index3=7-0 bit
gmehmet 1:f60eafbf009a 1062 {
gmehmet 1:f60eafbf009a 1063 max30001_BIOZ_FIFO_buffer[i] = ((uint32_t)result[j + 1] << 16) + (result[j + 2] << 8) + result[j + 3];
gmehmet 1:f60eafbf009a 1064 }
gmehmet 1:f60eafbf009a 1065
gmehmet 1:f60eafbf009a 1066 if (btag != 0b110) {
gmehmet 1:f60eafbf009a 1067 dataAvailable(MAX30001_DATA_BIOZ, max30001_BIOZ_FIFO_buffer, 8);
gmehmet 1:f60eafbf009a 1068 }
gmehmet 1:f60eafbf009a 1069 }
gmehmet 1:f60eafbf009a 1070
gmehmet 1:f60eafbf009a 1071 ret_val = 0;
gmehmet 1:f60eafbf009a 1072
gmehmet 1:f60eafbf009a 1073 if (max30001_status.bit.dcloffint == 1) // ECG/BIOZ Lead Off
gmehmet 1:f60eafbf009a 1074 {
gmehmet 1:f60eafbf009a 1075 dcloffint_OneShot = 1;
gmehmet 1:f60eafbf009a 1076 max30001_DCLeadOff = 0;
gmehmet 1:f60eafbf009a 1077 max30001_DCLeadOff = max30001_DCLeadOff | (max30001_cnfg_gen.bit.en_dcloff << 8) | (max30001_status.all & 0x00000F);
gmehmet 1:f60eafbf009a 1078 dataAvailable(MAX30001_DATA_LEADOFF_DC, &max30001_DCLeadOff, 1);
gmehmet 1:f60eafbf009a 1079
gmehmet 1:f60eafbf009a 1080 ret_val = 0b100;
gmehmet 1:f60eafbf009a 1081
gmehmet 1:f60eafbf009a 1082 } else if (dcloffint_OneShot == 1 && max30001_status.bit.dcloffint == 0) // Just send once when it comes out of dc lead off
gmehmet 1:f60eafbf009a 1083 {
gmehmet 1:f60eafbf009a 1084 max30001_DCLeadOff = 0;
gmehmet 1:f60eafbf009a 1085 max30001_DCLeadOff = max30001_DCLeadOff | (max30001_cnfg_gen.bit.en_dcloff << 8) | (max30001_status.all & 0x00000F);
gmehmet 1:f60eafbf009a 1086 dataAvailable(MAX30001_DATA_LEADOFF_DC, &max30001_DCLeadOff, 1);
gmehmet 1:f60eafbf009a 1087 dcloffint_OneShot = 0;
gmehmet 1:f60eafbf009a 1088 }
gmehmet 1:f60eafbf009a 1089
gmehmet 1:f60eafbf009a 1090 if (max30001_status.bit.bover == 1 || max30001_status.bit.bundr == 1) // BIOZ AC Lead Off
gmehmet 1:f60eafbf009a 1091 {
gmehmet 1:f60eafbf009a 1092 acloffint_OneShot = 1;
gmehmet 1:f60eafbf009a 1093 max30001_ACLeadOff = 0;
gmehmet 1:f60eafbf009a 1094 max30001_ACLeadOff =
gmehmet 1:f60eafbf009a 1095 max30001_ACLeadOff | ((max30001_status.all & 0x030000) >> 16);
gmehmet 1:f60eafbf009a 1096 dataAvailable(MAX30001_DATA_LEADOFF_AC, &max30001_ACLeadOff, 1);
gmehmet 1:f60eafbf009a 1097
gmehmet 1:f60eafbf009a 1098 ret_val = 0b1000;
gmehmet 1:f60eafbf009a 1099 } else if (acloffint_OneShot == 1 && max30001_status.bit.bover == 0 && max30001_status.bit.bundr == 0) // Just send once when it comes out of ac lead off
gmehmet 1:f60eafbf009a 1100 {
gmehmet 1:f60eafbf009a 1101 max30001_ACLeadOff = 0;
gmehmet 1:f60eafbf009a 1102 max30001_ACLeadOff = max30001_ACLeadOff | ((max30001_status.all & 0x030000) >> 16);
gmehmet 1:f60eafbf009a 1103 dataAvailable(MAX30001_DATA_LEADOFF_AC, &max30001_ACLeadOff, 1);
gmehmet 1:f60eafbf009a 1104 acloffint_OneShot = 0;
gmehmet 1:f60eafbf009a 1105 }
gmehmet 1:f60eafbf009a 1106
gmehmet 1:f60eafbf009a 1107 if (max30001_status.bit.bcgmon == 1) // BIOZ BCGMON check
gmehmet 1:f60eafbf009a 1108 {
gmehmet 1:f60eafbf009a 1109 bcgmon_OneShot = 1;
gmehmet 1:f60eafbf009a 1110 max30001_bcgmon = 0;
gmehmet 1:f60eafbf009a 1111 max30001_bcgmon = max30001_bcgmon | ((max30001_status.all & 0x000030) >> 4);
gmehmet 1:f60eafbf009a 1112 dataAvailable(MAX30001_DATA_BCGMON, &max30001_bcgmon, 1);
gmehmet 1:f60eafbf009a 1113
gmehmet 1:f60eafbf009a 1114 ret_val = 0b10000;
gmehmet 1:f60eafbf009a 1115 } else if (bcgmon_OneShot == 1 && max30001_status.bit.bcgmon == 0) {
gmehmet 1:f60eafbf009a 1116 max30001_bcgmon = 0;
gmehmet 1:f60eafbf009a 1117 max30001_bcgmon = max30001_bcgmon | ((max30001_status.all & 0x000030) >> 4);
gmehmet 1:f60eafbf009a 1118 bcgmon_OneShot = 0;
gmehmet 1:f60eafbf009a 1119 dataAvailable(MAX30001_DATA_BCGMON, &max30001_bcgmon, 1);
gmehmet 1:f60eafbf009a 1120 }
gmehmet 1:f60eafbf009a 1121
gmehmet 1:f60eafbf009a 1122 #if 0
gmehmet 1:f60eafbf009a 1123 if(max30001_status.bit.lonint == 1) // AC LeadON Check
gmehmet 1:f60eafbf009a 1124 {
gmehmet 1:f60eafbf009a 1125 max30001_LeadOn = 0;
gmehmet 1:f60eafbf009a 1126 max30001_reg_read(STATUS,&max30001_status.all); // Reading is important
gmehmet 1:f60eafbf009a 1127 max30001_LeadOn = max30001_LeadOn | (max30001_cnfg_gen.bit.en_ulp_lon << 8) | ((max30001_status.all & 0x000800) >> 11); // 0b01 will mean ECG Lead On, 0b10 will mean BIOZ Lead On
gmehmet 1:f60eafbf009a 1128 // LEAD ON has been detected... Now take actions
gmehmet 1:f60eafbf009a 1129 }
gmehmet 1:f60eafbf009a 1130 #endif
gmehmet 1:f60eafbf009a 1131
gmehmet 1:f60eafbf009a 1132 if (max30001_status.bit.lonint == 1 &&
gmehmet 1:f60eafbf009a 1133 acleadon_OneShot == 0) // AC LeadON Check, when lead is on
gmehmet 1:f60eafbf009a 1134 {
gmehmet 1:f60eafbf009a 1135 max30001_LeadOn = 0;
gmehmet 1:f60eafbf009a 1136 max30001_reg_read(STATUS, &max30001_status.all); // Reading is important
gmehmet 1:f60eafbf009a 1137 max30001_LeadOn =
gmehmet 1:f60eafbf009a 1138 max30001_LeadOn | (max30001_cnfg_gen.bit.en_ulp_lon << 8) |
gmehmet 1:f60eafbf009a 1139 ((max30001_status.all & 0x000800) >>
gmehmet 1:f60eafbf009a 1140 11); // 0b01 will mean ECG Lead On, 0b10 will mean BIOZ Lead On
gmehmet 1:f60eafbf009a 1141
gmehmet 1:f60eafbf009a 1142 // LEAD ON has been detected... Now take actions
gmehmet 1:f60eafbf009a 1143 acleadon_OneShot = 1;
gmehmet 1:f60eafbf009a 1144 dataAvailable(MAX30001_DATA_ACLEADON, &max30001_LeadOn, 1); // One shot data will be sent...
gmehmet 1:f60eafbf009a 1145 } else if (max30001_status.bit.lonint == 0 && acleadon_OneShot == 1) {
gmehmet 1:f60eafbf009a 1146 max30001_LeadOn = 0;
gmehmet 1:f60eafbf009a 1147 max30001_reg_read(STATUS, &max30001_status.all);
gmehmet 1:f60eafbf009a 1148 max30001_LeadOn =
gmehmet 1:f60eafbf009a 1149 max30001_LeadOn | (max30001_cnfg_gen.bit.en_ulp_lon << 8) | ((max30001_status.all & 0x000800) >> 11); // 0b01 will mean ECG Lead On, 0b10 will mean BIOZ Lead On
gmehmet 1:f60eafbf009a 1150 dataAvailable(MAX30001_DATA_ACLEADON, &max30001_LeadOn, 1); // One shot data will be sent...
gmehmet 1:f60eafbf009a 1151 acleadon_OneShot = 0;
gmehmet 1:f60eafbf009a 1152 }
gmehmet 1:f60eafbf009a 1153
gmehmet 1:f60eafbf009a 1154 return ret_val;
gmehmet 1:f60eafbf009a 1155 }
gmehmet 1:f60eafbf009a 1156
gmehmet 1:f60eafbf009a 1157 //******************************************************************************
gmehmet 1:f60eafbf009a 1158 uint32_t MAX30001::readPace(int group, uint8_t* result) {
gmehmet 1:f60eafbf009a 1159 uint8_t data_array[4];
gmehmet 1:f60eafbf009a 1160 uint32_t success;
gmehmet 1:f60eafbf009a 1161 int adr = PACE0_FIFO_BURST + group*4;
gmehmet 1:f60eafbf009a 1162
gmehmet 1:f60eafbf009a 1163 if (group >= 6)
gmehmet 1:f60eafbf009a 1164 return (uint32_t)-1;
gmehmet 1:f60eafbf009a 1165
gmehmet 1:f60eafbf009a 1166 data_array[0] = ((adr << 1) & 0xff) | 1; // For Read Or with 1
gmehmet 1:f60eafbf009a 1167 success = SPI_Transmit(&data_array[0], 1, &result[0], 10);
gmehmet 1:f60eafbf009a 1168
gmehmet 1:f60eafbf009a 1169 max30001_PACE[group * 3 + 0] = (uint32_t)(result[1] << 16) + (result[2] << 8) + result[3];
gmehmet 1:f60eafbf009a 1170 max30001_PACE[group * 3 + 1] = (uint32_t)(result[4] << 16) + (result[5] << 8) + result[6];
gmehmet 1:f60eafbf009a 1171 max30001_PACE[group * 3 + 2] = (uint32_t)(result[7] << 16) + (result[8] << 8) + result[9];
gmehmet 1:f60eafbf009a 1172
gmehmet 1:f60eafbf009a 1173 return success;
gmehmet 1:f60eafbf009a 1174 }
gmehmet 1:f60eafbf009a 1175
gmehmet 1:f60eafbf009a 1176 //******************************************************************************
gmehmet 1:f60eafbf009a 1177
gmehmet 1:f60eafbf009a 1178 //******************************************************************************
gmehmet 1:f60eafbf009a 1179
gmehmet 1:f60eafbf009a 1180 int MAX30001::max30001_int_handler(void) {
gmehmet 1:f60eafbf009a 1181
gmehmet 1:f60eafbf009a 1182 static uint32_t InitReset = 0;
gmehmet 1:f60eafbf009a 1183
gmehmet 1:f60eafbf009a 1184 int8_t return_value;
gmehmet 1:f60eafbf009a 1185 bool check_one_more = true;
gmehmet 1:f60eafbf009a 1186
gmehmet 1:f60eafbf009a 1187 status_check:
gmehmet 1:f60eafbf009a 1188 max30001_reg_read(STATUS, &max30001_status.all);
gmehmet 1:f60eafbf009a 1189
gmehmet 1:f60eafbf009a 1190 // Inital Reset and any FIFO over flow invokes a FIFO reset
gmehmet 1:f60eafbf009a 1191 if (InitReset == 0 || max30001_status.bit.eovf == 1 || max30001_status.bit.bovf == 1) {
gmehmet 1:f60eafbf009a 1192 // Do a FIFO Reset
gmehmet 1:f60eafbf009a 1193 max30001_reg_write(FIFO_RST, 0x000000);
gmehmet 1:f60eafbf009a 1194
gmehmet 1:f60eafbf009a 1195 InitReset++;
gmehmet 1:f60eafbf009a 1196 return 2;
gmehmet 1:f60eafbf009a 1197 }
gmehmet 1:f60eafbf009a 1198
gmehmet 1:f60eafbf009a 1199 return_value = 0;
gmehmet 1:f60eafbf009a 1200
gmehmet 1:f60eafbf009a 1201 // The four data handling goes on over here
gmehmet 1:f60eafbf009a 1202 if (max30001_status.bit.eint == 1 || max30001_status.bit.pint == 1 || max30001_status.bit.bint == 1 || max30001_status.bit.rrint == 1
gmehmet 1:f60eafbf009a 1203 || max30001_status.bit.dcloffint == 1 || max30001_status.bit.bover == 1 || max30001_status.bit.bundr == 1
gmehmet 1:f60eafbf009a 1204 || max30001_status.bit.bcgmon == 1 || max30001_status.bit.lonint == 1) {
gmehmet 1:f60eafbf009a 1205 return_value = return_value | max30001_FIFO_LeadONOff_Read();
gmehmet 1:f60eafbf009a 1206 }
gmehmet 1:f60eafbf009a 1207 /*
gmehmet 1:f60eafbf009a 1208 // ECG/BIOZ DC Lead Off test
gmehmet 1:f60eafbf009a 1209 if (max30001_status.bit.dcloffint == 1) {
gmehmet 1:f60eafbf009a 1210 return_value = return_value | max30001_FIFO_LeadONOff_Read();
gmehmet 1:f60eafbf009a 1211 }
gmehmet 1:f60eafbf009a 1212
gmehmet 1:f60eafbf009a 1213 // BIOZ AC Lead Off test
gmehmet 1:f60eafbf009a 1214 if (max30001_status.bit.bover == 1 || max30001_status.bit.bundr == 1) {
gmehmet 1:f60eafbf009a 1215 return_value = return_value | max30001_FIFO_LeadONOff_Read();
gmehmet 1:f60eafbf009a 1216 }
gmehmet 1:f60eafbf009a 1217
gmehmet 1:f60eafbf009a 1218 // BIOZ DRVP/N test using BCGMON.
gmehmet 1:f60eafbf009a 1219 if (max30001_status.bit.bcgmon == 1) {
gmehmet 1:f60eafbf009a 1220 return_value = return_value | max30001_FIFO_LeadONOff_Read();
gmehmet 1:f60eafbf009a 1221 }
gmehmet 1:f60eafbf009a 1222
gmehmet 1:f60eafbf009a 1223 if (max30001_status.bit.lonint == 1) // ECG Lead ON test: i.e. the leads are touching the body...
gmehmet 1:f60eafbf009a 1224 {
gmehmet 1:f60eafbf009a 1225
gmehmet 1:f60eafbf009a 1226 max30001_FIFO_LeadONOff_Read();
gmehmet 1:f60eafbf009a 1227 }
gmehmet 1:f60eafbf009a 1228 */
gmehmet 1:f60eafbf009a 1229 if (check_one_more) {
gmehmet 1:f60eafbf009a 1230 check_one_more = false;
gmehmet 1:f60eafbf009a 1231 goto status_check;
gmehmet 1:f60eafbf009a 1232 }
gmehmet 1:f60eafbf009a 1233 return return_value;
gmehmet 1:f60eafbf009a 1234 }
gmehmet 1:f60eafbf009a 1235
gmehmet 1:f60eafbf009a 1236 /// function pointer to the async callback
gmehmet 1:f60eafbf009a 1237 static event_callback_t functionpointer;
gmehmet 1:f60eafbf009a 1238 /// flag used to indicate an async xfer has taken place
gmehmet 1:f60eafbf009a 1239 static volatile int xferFlag = 0;
gmehmet 1:f60eafbf009a 1240
gmehmet 1:f60eafbf009a 1241 /**
gmehmet 1:f60eafbf009a 1242 * @brief Callback handler for SPI async events
gmehmet 1:f60eafbf009a 1243 * @param events description of event that occurred
gmehmet 1:f60eafbf009a 1244 */
gmehmet 1:f60eafbf009a 1245
gmehmet 1:f60eafbf009a 1246
gmehmet 1:f60eafbf009a 1247 static void spiHandler(int events) { xferFlag = 1; }
gmehmet 1:f60eafbf009a 1248
gmehmet 1:f60eafbf009a 1249 /**
gmehmet 1:f60eafbf009a 1250 * @brief Transmit and recieve QUAD SPI data
gmehmet 1:f60eafbf009a 1251 * @param tx_buf pointer to transmit byte buffer
gmehmet 1:f60eafbf009a 1252 * @param tx_size number of bytes to transmit
gmehmet 1:f60eafbf009a 1253 * @param rx_buf pointer to the recieve buffer
gmehmet 1:f60eafbf009a 1254 * @param rx_size number of bytes to recieve
gmehmet 1:f60eafbf009a 1255 */
gmehmet 1:f60eafbf009a 1256 int MAX30001::SPI_Transmit(const uint8_t *tx_buf, uint32_t tx_size, uint8_t *rx_buf, uint32_t rx_size)
gmehmet 1:f60eafbf009a 1257 {
gmehmet 1:f60eafbf009a 1258 m_cs->write(0);
gmehmet 1:f60eafbf009a 1259 for(uint32_t i = 0; i < tx_size; i++)
gmehmet 1:f60eafbf009a 1260 {
gmehmet 1:f60eafbf009a 1261 m_spi->write(tx_buf[i]);
gmehmet 1:f60eafbf009a 1262 }
gmehmet 1:f60eafbf009a 1263 for(uint32_t i = 0; i < (rx_size - tx_size); i++)
gmehmet 1:f60eafbf009a 1264 {
gmehmet 1:f60eafbf009a 1265 rx_buf[i + 1] = m_spi->write(0xFF);
gmehmet 1:f60eafbf009a 1266 }
gmehmet 1:f60eafbf009a 1267 m_cs->write(1);
gmehmet 1:f60eafbf009a 1268
gmehmet 1:f60eafbf009a 1269 return 0;
gmehmet 1:f60eafbf009a 1270 }
gmehmet 1:f60eafbf009a 1271
gmehmet 1:f60eafbf009a 1272 //******************************************************************************
gmehmet 1:f60eafbf009a 1273 void MAX30001::max30001_ReadHeartrateData(max30001_t *_hspValMax30001) {
gmehmet 1:f60eafbf009a 1274 _hspValMax30001->R2R = hspValMax30001.R2R;
gmehmet 1:f60eafbf009a 1275 _hspValMax30001->fmstr = hspValMax30001.fmstr;
gmehmet 1:f60eafbf009a 1276 }
gmehmet 1:f60eafbf009a 1277
gmehmet 1:f60eafbf009a 1278 //******************************************************************************
gmehmet 1:f60eafbf009a 1279 void MAX30001::onDataAvailable(PtrFunction _onDataAvailable) {
gmehmet 1:f60eafbf009a 1280 onDataAvailableCallback = _onDataAvailable;
gmehmet 1:f60eafbf009a 1281 }
gmehmet 1:f60eafbf009a 1282
gmehmet 1:f60eafbf009a 1283 /**
gmehmet 1:f60eafbf009a 1284 * @brief Used to notify an external function that interrupt data is available
gmehmet 1:f60eafbf009a 1285 * @param id type of data available
gmehmet 1:f60eafbf009a 1286 * @param buffer 32-bit buffer that points to the data
gmehmet 1:f60eafbf009a 1287 * @param length length of 32-bit elements available
gmehmet 1:f60eafbf009a 1288 */
gmehmet 1:f60eafbf009a 1289 void MAX30001::dataAvailable(uint32_t id, uint32_t *buffer, uint32_t length) {
gmehmet 1:f60eafbf009a 1290 if (onDataAvailableCallback != NULL) {
gmehmet 1:f60eafbf009a 1291 (*onDataAvailableCallback)(id, buffer, length);
gmehmet 1:f60eafbf009a 1292 }
gmehmet 1:f60eafbf009a 1293 }
gmehmet 1:f60eafbf009a 1294 /**
gmehmet 1:f60eafbf009a 1295 * @brief Callback handler for SPI async events
gmehmet 1:f60eafbf009a 1296 * @param events description of event that occurred
gmehmet 1:f60eafbf009a 1297 */
gmehmet 1:f60eafbf009a 1298 void MAX30001::spiHandler(int events) { xferFlag = 1; }
gmehmet 1:f60eafbf009a 1299
gmehmet 1:f60eafbf009a 1300 //******************************************************************************
gmehmet 1:f60eafbf009a 1301 static int allowInterrupts = 0;
gmehmet 1:f60eafbf009a 1302
gmehmet 1:f60eafbf009a 1303 void MAX30001Mid_IntB_Handler(void) {
gmehmet 1:f60eafbf009a 1304 if (allowInterrupts == 0) return;
gmehmet 1:f60eafbf009a 1305 //MAX30001::instance->max30001_int_handler();
gmehmet 1:f60eafbf009a 1306 MAX30001::instance->m_max30001_int_happened_ = true;
gmehmet 1:f60eafbf009a 1307 }
gmehmet 1:f60eafbf009a 1308
gmehmet 1:f60eafbf009a 1309 void MAX30001Mid_Int2B_Handler(void) {
gmehmet 1:f60eafbf009a 1310 if (allowInterrupts == 0) return;
gmehmet 1:f60eafbf009a 1311 //MAX30001::instance->max30001_int_handler();
gmehmet 1:f60eafbf009a 1312 MAX30001::instance->m_max30001_int_happened_ = true;
gmehmet 1:f60eafbf009a 1313 }
gmehmet 1:f60eafbf009a 1314
gmehmet 1:f60eafbf009a 1315 void MAX30001_AllowInterrupts(int state) {
gmehmet 1:f60eafbf009a 1316 allowInterrupts = state;
gmehmet 1:f60eafbf009a 1317 }