Maxim Integrated's IoT development kit.
Dependencies: MAX30101 MAX30003 MAX113XX_Pixi MAX30205 max32630fthr USBDevice
max30101_app.cpp@16:503f8308e2db, 2018-07-19 (annotated)
- Committer:
- Mahir Ozturk
- Date:
- Thu Jul 19 18:27:45 2018 +0300
- Revision:
- 16:503f8308e2db
- Parent:
- 13:fba77a5d0fa0
Update mbed-os to fix the bug: Symbol __user_perthread_libspace multiply defined
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Mahir Ozturk |
13:fba77a5d0fa0 | 1 | /* |
Mahir Ozturk |
13:fba77a5d0fa0 | 2 | * max30101_app.cpp |
Mahir Ozturk |
13:fba77a5d0fa0 | 3 | * |
Mahir Ozturk |
13:fba77a5d0fa0 | 4 | * Created on: Jun 20, 2018 |
Mahir Ozturk |
13:fba77a5d0fa0 | 5 | * Author: Mahir.Ozturk |
Mahir Ozturk |
13:fba77a5d0fa0 | 6 | */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 7 | #include <mbed.h> |
Mahir Ozturk |
13:fba77a5d0fa0 | 8 | #include "max30101_app.h" |
Mahir Ozturk |
13:fba77a5d0fa0 | 9 | #include "MAX30101.h" |
Mahir Ozturk |
13:fba77a5d0fa0 | 10 | #include "max30101_algo.h" |
Mahir Ozturk |
13:fba77a5d0fa0 | 11 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 12 | #define MAX30101_IRQ_ASSERTED_ID 1 |
Mahir Ozturk |
13:fba77a5d0fa0 | 13 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 14 | #define MAX30101_BUFFER_LEN 500 |
Mahir Ozturk |
13:fba77a5d0fa0 | 15 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 16 | static Thread *thread = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 17 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 18 | //variable for the algorithm |
Mahir Ozturk |
13:fba77a5d0fa0 | 19 | uint16_t sampleRate = 100; |
Mahir Ozturk |
13:fba77a5d0fa0 | 20 | uint16_t compSpO2 = 1; |
Mahir Ozturk |
13:fba77a5d0fa0 | 21 | int16_t ir_ac_comp = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 22 | int16_t red_ac_comp = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 23 | int16_t green_ac_comp = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 24 | int16_t ir_ac_mag = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 25 | int16_t red_ac_mag = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 26 | int16_t green_ac_mag = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 27 | uint16_t HRbpm2 = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 28 | uint16_t SpO2B = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 29 | uint16_t DRdy = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 30 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 31 | //declare large variables outside of main |
Mahir Ozturk |
13:fba77a5d0fa0 | 32 | uint32_t redData[MAX30101_BUFFER_LEN];//set array to max fifo size |
Mahir Ozturk |
13:fba77a5d0fa0 | 33 | uint32_t irData[MAX30101_BUFFER_LEN];//set array to max fifo size |
Mahir Ozturk |
13:fba77a5d0fa0 | 34 | uint32_t greenData[MAX30101_BUFFER_LEN];//set array to max fifo size |
Mahir Ozturk |
13:fba77a5d0fa0 | 35 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 36 | bool max30101_config(MAX30101 &op_sensor) |
Mahir Ozturk |
13:fba77a5d0fa0 | 37 | { |
Mahir Ozturk |
13:fba77a5d0fa0 | 38 | //Reset Device |
Mahir Ozturk |
13:fba77a5d0fa0 | 39 | MAX30101::ModeConfiguration_u modeConfig; |
Mahir Ozturk |
13:fba77a5d0fa0 | 40 | modeConfig.all = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 41 | modeConfig.bits.reset = 1; |
Mahir Ozturk |
13:fba77a5d0fa0 | 42 | modeConfig.bits.mode = MAX30101::MultiLedMode; // Sets SPO2 Mode |
Mahir Ozturk |
13:fba77a5d0fa0 | 43 | int32_t rc = op_sensor.setModeConfiguration(modeConfig); |
Mahir Ozturk |
13:fba77a5d0fa0 | 44 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 45 | //enable MAX30101 interrupts |
Mahir Ozturk |
13:fba77a5d0fa0 | 46 | MAX30101::InterruptBitField_u ints; |
Mahir Ozturk |
13:fba77a5d0fa0 | 47 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 48 | ints.all = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 49 | ints.bits.a_full = 1; // Enable FIFO almost full interrupt |
Mahir Ozturk |
13:fba77a5d0fa0 | 50 | ints.bits.ppg_rdy =1; //Enables an interrupt when a new sample is ready |
Mahir Ozturk |
13:fba77a5d0fa0 | 51 | rc = op_sensor.enableInterrupts(ints); |
Mahir Ozturk |
13:fba77a5d0fa0 | 52 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 53 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 54 | //configure FIFO |
Mahir Ozturk |
13:fba77a5d0fa0 | 55 | MAX30101::FIFO_Configuration_u fifoConfig; |
Mahir Ozturk |
13:fba77a5d0fa0 | 56 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 57 | fifoConfig.all = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 58 | fifoConfig.bits.fifo_a_full = 10; // Max level of 17 samples |
Mahir Ozturk |
13:fba77a5d0fa0 | 59 | fifoConfig.bits.sample_average = MAX30101::AveragedSamples_0;// Average 0 samples |
Mahir Ozturk |
13:fba77a5d0fa0 | 60 | rc = op_sensor.setFIFOConfiguration(fifoConfig); |
Mahir Ozturk |
13:fba77a5d0fa0 | 61 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 62 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 63 | MAX30101::SpO2Configuration_u spo2Config; |
Mahir Ozturk |
13:fba77a5d0fa0 | 64 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 65 | spo2Config.all = 0; // clears register |
Mahir Ozturk |
13:fba77a5d0fa0 | 66 | spo2Config.bits.spo2_adc_range = 1; //sets resolution to 4096 nAfs |
Mahir Ozturk |
13:fba77a5d0fa0 | 67 | spo2Config.bits.spo2_sr = MAX30101::SR_100_Hz; // SpO2 SR = 100Hz |
Mahir Ozturk |
13:fba77a5d0fa0 | 68 | spo2Config.bits.led_pw = MAX30101::PW_3; // 18-bit ADC resolution ~400us |
Mahir Ozturk |
13:fba77a5d0fa0 | 69 | rc = op_sensor.setSpO2Configuration(spo2Config); |
Mahir Ozturk |
13:fba77a5d0fa0 | 70 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 71 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 72 | //Set time slots for LEDS |
Mahir Ozturk |
13:fba77a5d0fa0 | 73 | MAX30101::ModeControlReg_u multiLED; |
Mahir Ozturk |
13:fba77a5d0fa0 | 74 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 75 | //sets timing for control register 1 |
Mahir Ozturk |
13:fba77a5d0fa0 | 76 | multiLED.bits.lo_slot=1; |
Mahir Ozturk |
13:fba77a5d0fa0 | 77 | multiLED.bits.hi_slot=2; |
Mahir Ozturk |
13:fba77a5d0fa0 | 78 | rc = op_sensor.setMultiLEDModeControl(MAX30101::ModeControlReg1, multiLED); |
Mahir Ozturk |
13:fba77a5d0fa0 | 79 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 80 | multiLED.bits.lo_slot=3; |
Mahir Ozturk |
13:fba77a5d0fa0 | 81 | multiLED.bits.hi_slot=0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 82 | rc = op_sensor.setMultiLEDModeControl(MAX30101::ModeControlReg2, multiLED); |
Mahir Ozturk |
13:fba77a5d0fa0 | 83 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 84 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 85 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 86 | //Set LED drive currents |
Mahir Ozturk |
13:fba77a5d0fa0 | 87 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 88 | // Heart Rate only, 1 LED channel, Pulse amp. = ~7mA |
Mahir Ozturk |
13:fba77a5d0fa0 | 89 | rc = op_sensor.setLEDPulseAmplitude(MAX30101::LED1_PA, 0x24); |
Mahir Ozturk |
13:fba77a5d0fa0 | 90 | //To include SPO2, 2 LED channel, Pulse amp. ~7mA |
Mahir Ozturk |
13:fba77a5d0fa0 | 91 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 92 | rc = op_sensor.setLEDPulseAmplitude(MAX30101::LED2_PA, 0x24); |
Mahir Ozturk |
13:fba77a5d0fa0 | 93 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 94 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 95 | rc = op_sensor.setLEDPulseAmplitude(MAX30101::LED3_PA, 0x24); |
Mahir Ozturk |
13:fba77a5d0fa0 | 96 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 97 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 98 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 99 | //Set operating mode |
Mahir Ozturk |
13:fba77a5d0fa0 | 100 | modeConfig.all = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 101 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 102 | modeConfig.bits.mode = MAX30101::MultiLedMode; // Sets multiLED mode |
Mahir Ozturk |
13:fba77a5d0fa0 | 103 | rc = op_sensor.setModeConfiguration(modeConfig); |
Mahir Ozturk |
13:fba77a5d0fa0 | 104 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 105 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 106 | return rc; |
Mahir Ozturk |
13:fba77a5d0fa0 | 107 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 108 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 109 | void max30101wing_pmic_config(I2C & i2c_bus, DigitalOut & pmic_en) |
Mahir Ozturk |
13:fba77a5d0fa0 | 110 | { |
Mahir Ozturk |
13:fba77a5d0fa0 | 111 | const uint8_t PMIC_ADRS = 0x54; |
Mahir Ozturk |
13:fba77a5d0fa0 | 112 | const uint8_t BBB_EXTRA_ADRS = 0x1C; |
Mahir Ozturk |
13:fba77a5d0fa0 | 113 | const uint8_t BOOST_VOLTAGE = 0x05; |
Mahir Ozturk |
13:fba77a5d0fa0 | 114 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 115 | char data_buff[] = {BBB_EXTRA_ADRS, 0x40}; //BBBExtra register address |
Mahir Ozturk |
13:fba77a5d0fa0 | 116 | //and data to enable passive |
Mahir Ozturk |
13:fba77a5d0fa0 | 117 | //pull down. |
Mahir Ozturk |
13:fba77a5d0fa0 | 118 | i2c_bus.write(PMIC_ADRS, data_buff,2); //write to BBBExtra register |
Mahir Ozturk |
13:fba77a5d0fa0 | 119 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 120 | data_buff[0] = BOOST_VOLTAGE; |
Mahir Ozturk |
13:fba77a5d0fa0 | 121 | data_buff[1] = 0x08; //Boost voltage configuration |
Mahir Ozturk |
13:fba77a5d0fa0 | 122 | //register followed by data |
Mahir Ozturk |
13:fba77a5d0fa0 | 123 | //to set voltage to 4.5V 1f |
Mahir Ozturk |
13:fba77a5d0fa0 | 124 | pmic_en = 0; //disables VLED 08 |
Mahir Ozturk |
13:fba77a5d0fa0 | 125 | i2c_bus.write(PMIC_ADRS, data_buff,2); //write to BBBExtra register |
Mahir Ozturk |
13:fba77a5d0fa0 | 126 | pmic_en = 1; //enables VLED |
Mahir Ozturk |
13:fba77a5d0fa0 | 127 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 128 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 129 | /* Op Sensor FIFO nearly full callback */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 130 | void max30101_intr_callback() |
Mahir Ozturk |
13:fba77a5d0fa0 | 131 | { |
Mahir Ozturk |
13:fba77a5d0fa0 | 132 | if (thread != 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 133 | thread->signal_set(MAX30101_IRQ_ASSERTED_ID); |
Mahir Ozturk |
13:fba77a5d0fa0 | 134 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 135 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 136 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 137 | void max30101_reader_task(struct max30101_reader_task_args *args) |
Mahir Ozturk |
13:fba77a5d0fa0 | 138 | { |
Mahir Ozturk |
13:fba77a5d0fa0 | 139 | InterruptIn op_sensor_int(args->pinIntr); // Config P3_2 as int. in for |
Mahir Ozturk |
13:fba77a5d0fa0 | 140 | op_sensor_int.fall(max30101_intr_callback); // FIFO ready interrupt |
Mahir Ozturk |
13:fba77a5d0fa0 | 141 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 142 | DigitalOut VLED_EN(args->pinVLED,0); //Enable for VLEDs |
Mahir Ozturk |
13:fba77a5d0fa0 | 143 | max30101wing_pmic_config(args->i2cBus, VLED_EN); |
Mahir Ozturk |
13:fba77a5d0fa0 | 144 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 145 | MAX30101 op_sensor(args->i2cBus); // Create new MAX30101 on i2cBus |
Mahir Ozturk |
13:fba77a5d0fa0 | 146 | int rc = max30101_config(op_sensor); // Config sensor, return 0 on success |
Mahir Ozturk |
13:fba77a5d0fa0 | 147 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 148 | MAX30101::InterruptBitField_u ints; // Read interrupt status to clear |
Mahir Ozturk |
13:fba77a5d0fa0 | 149 | rc = op_sensor.getInterruptStatus(ints); // power on interrupt |
Mahir Ozturk |
13:fba77a5d0fa0 | 150 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 151 | thread = args->self; |
Mahir Ozturk |
13:fba77a5d0fa0 | 152 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 153 | uint8_t fifoData[MAX30101::MAX_FIFO_BYTES]; |
Mahir Ozturk |
13:fba77a5d0fa0 | 154 | uint16_t idx, readBytes; |
Mahir Ozturk |
13:fba77a5d0fa0 | 155 | uint16_t HRTemp; |
Mahir Ozturk |
13:fba77a5d0fa0 | 156 | uint16_t spo2Temp; |
Mahir Ozturk |
13:fba77a5d0fa0 | 157 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 158 | uint16_t lastValidHR = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 159 | uint16_t lastValidSPO2 = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 160 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 161 | int r=0; //counter for redData position |
Mahir Ozturk |
13:fba77a5d0fa0 | 162 | int ir=0; //counter for irData position |
Mahir Ozturk |
13:fba77a5d0fa0 | 163 | int g =0; //counter for greenData position |
Mahir Ozturk |
13:fba77a5d0fa0 | 164 | int c=0; //counter to print values |
Mahir Ozturk |
13:fba77a5d0fa0 | 165 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 166 | int consecCalcFailCnt = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 167 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 168 | printf("Starting MAX30101 HeartRate / SPO2 Demo Application...\r\n"); |
Mahir Ozturk |
13:fba77a5d0fa0 | 169 | printf("Please wait a few seconds while data is being collected.\r\n"); |
Mahir Ozturk |
13:fba77a5d0fa0 | 170 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 171 | Timer bleNotifyTimer; |
Mahir Ozturk |
13:fba77a5d0fa0 | 172 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 173 | bleNotifyTimer.start(); |
Mahir Ozturk |
13:fba77a5d0fa0 | 174 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 175 | while (1) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 176 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 177 | /* Check if op_sensor interrupt asserted */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 178 | thread->signal_wait(MAX30101_IRQ_ASSERTED_ID); |
Mahir Ozturk |
13:fba77a5d0fa0 | 179 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 180 | /* Read interrupt status to clear interrupt */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 181 | rc = op_sensor.getInterruptStatus(ints); |
Mahir Ozturk |
13:fba77a5d0fa0 | 182 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 183 | /* Confirms proper read prior to executing */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 184 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 185 | // Read FIFO |
Mahir Ozturk |
13:fba77a5d0fa0 | 186 | rc = op_sensor.readFIFO(MAX30101::ThreeLedChannels, fifoData, readBytes); |
Mahir Ozturk |
13:fba77a5d0fa0 | 187 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 188 | if (rc == 0) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 189 | /* Convert read bytes into samples */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 190 | for (idx = 0; idx < readBytes; idx+=9) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 191 | if (r >= 500 || ir >= 500 || g >= 500) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 192 | printf("Overflow! r=%d ir=%d g=%d\r\n", r, ir, g); |
Mahir Ozturk |
13:fba77a5d0fa0 | 193 | break; |
Mahir Ozturk |
13:fba77a5d0fa0 | 194 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 195 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 196 | if (readBytes >= (idx + 8)) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 197 | redData[r++] = ((fifoData[idx] << 16) | (fifoData[idx + 1] << 8) | (fifoData[idx + 2])) & 0x03FFFF; |
Mahir Ozturk |
13:fba77a5d0fa0 | 198 | irData[ir++] = ((fifoData[idx + 3] << 16) | (fifoData[idx + 4] << 8) | (fifoData[idx + 5])) & 0x03FFFF; |
Mahir Ozturk |
13:fba77a5d0fa0 | 199 | greenData[g++] = ((fifoData[idx + 6] << 16) | (fifoData[idx + 7] << 8) | (fifoData[idx + 8])) & 0x03FFFF; |
Mahir Ozturk |
13:fba77a5d0fa0 | 200 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 201 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 202 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 203 | if ((r >= MAX30101_BUFFER_LEN) && (ir >= MAX30101_BUFFER_LEN) && (g >= MAX30101_BUFFER_LEN)) {/* checks to make sure there are 500 */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 204 | /* samples in data buffers */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 205 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 206 | /* runs the heart rate and SpO2 algorithm */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 207 | for (c = 0, HRTemp = 0; c < r; c++) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 208 | HRSpO2Func(irData[c], redData[c],greenData[c], c,sampleRate, compSpO2, |
Mahir Ozturk |
13:fba77a5d0fa0 | 209 | &ir_ac_comp,&red_ac_comp, &green_ac_comp, &ir_ac_mag,&red_ac_mag, |
Mahir Ozturk |
13:fba77a5d0fa0 | 210 | &green_ac_mag, &HRbpm2,&SpO2B,&DRdy); |
Mahir Ozturk |
13:fba77a5d0fa0 | 211 | if (DRdy) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 212 | HRTemp = HRbpm2; |
Mahir Ozturk |
13:fba77a5d0fa0 | 213 | spo2Temp = SpO2B; |
Mahir Ozturk |
13:fba77a5d0fa0 | 214 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 215 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 216 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 217 | /* If the above algorithm returns a valid heart rate on the last sample, it is printed */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 218 | if (DRdy == 1) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 219 | printf("Heart Rate = %i\r\n",HRbpm2); |
Mahir Ozturk |
13:fba77a5d0fa0 | 220 | printf("SPO2 = %i\r\n",SpO2B); |
Mahir Ozturk |
13:fba77a5d0fa0 | 221 | lastValidHR = HRbpm2; |
Mahir Ozturk |
13:fba77a5d0fa0 | 222 | lastValidSPO2 = SpO2B; |
Mahir Ozturk |
13:fba77a5d0fa0 | 223 | consecCalcFailCnt = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 224 | } else if (HRTemp != 0) { /* if a valid heart was calculated at all, it is printed */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 225 | printf("Heart Rate = %i\r\n",HRTemp); |
Mahir Ozturk |
13:fba77a5d0fa0 | 226 | printf("SPO2 = %i\r\n",spo2Temp); |
Mahir Ozturk |
13:fba77a5d0fa0 | 227 | lastValidHR = HRTemp; |
Mahir Ozturk |
13:fba77a5d0fa0 | 228 | lastValidSPO2 = spo2Temp; |
Mahir Ozturk |
13:fba77a5d0fa0 | 229 | consecCalcFailCnt = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 230 | } else { |
Mahir Ozturk |
13:fba77a5d0fa0 | 231 | consecCalcFailCnt++; |
Mahir Ozturk |
13:fba77a5d0fa0 | 232 | if (consecCalcFailCnt >= 10) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 233 | printf("Calculation failed...waiting for more samples...\r\n"); |
Mahir Ozturk |
13:fba77a5d0fa0 | 234 | printf("Please keep your finger on the MAX30101 sensor with minimal movement.\r\n"); |
Mahir Ozturk |
13:fba77a5d0fa0 | 235 | consecCalcFailCnt = 0; |
Mahir Ozturk |
13:fba77a5d0fa0 | 236 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 237 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 238 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 239 | /* dump the first hundred samples after calculation */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 240 | for (c = 100; c < 500; c++) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 241 | redData[c - 100] = redData[c]; |
Mahir Ozturk |
13:fba77a5d0fa0 | 242 | irData[c - 100] = irData[c]; |
Mahir Ozturk |
13:fba77a5d0fa0 | 243 | greenData[c - 100] = greenData[c]; |
Mahir Ozturk |
13:fba77a5d0fa0 | 244 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 245 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 246 | /* reset counters */ |
Mahir Ozturk |
13:fba77a5d0fa0 | 247 | r = 400; |
Mahir Ozturk |
13:fba77a5d0fa0 | 248 | ir = 400; |
Mahir Ozturk |
13:fba77a5d0fa0 | 249 | g = 400; |
Mahir Ozturk |
13:fba77a5d0fa0 | 250 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 251 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 252 | if (bleNotifyTimer.read_ms() >= (args->notify_period_sec * 1000)) { |
Mahir Ozturk |
13:fba77a5d0fa0 | 253 | bleGattAttrWrite(args->gattHeartRate, (uint8_t *)&lastValidHR, sizeof(lastValidHR)); |
Mahir Ozturk |
13:fba77a5d0fa0 | 254 | bleGattAttrWrite(args->gattSPO2, (uint8_t *)&lastValidSPO2, sizeof(lastValidSPO2)); |
Mahir Ozturk |
13:fba77a5d0fa0 | 255 | bleNotifyTimer.reset(); |
Mahir Ozturk |
13:fba77a5d0fa0 | 256 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 257 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 258 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 259 | } else { // If rc != 0, a communication error has occurred |
Mahir Ozturk |
13:fba77a5d0fa0 | 260 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 261 | printf("Something went wrong, " |
Mahir Ozturk |
13:fba77a5d0fa0 | 262 | "check the I2C bus or power connections... \r\n"); |
Mahir Ozturk |
13:fba77a5d0fa0 | 263 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 264 | return; |
Mahir Ozturk |
13:fba77a5d0fa0 | 265 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 266 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 267 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 268 | } |
Mahir Ozturk |
13:fba77a5d0fa0 | 269 | |
Mahir Ozturk |
13:fba77a5d0fa0 | 270 |