Maxim Integrated's IoT development kit.

Dependencies:   MAX30101 MAX30003 MAX113XX_Pixi MAX30205 max32630fthr USBDevice

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?

UserRevisionLine numberNew 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