Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MAX30101 max32630fthr
Fork of MAX30101_Demo_Plot_Algorithm by
Diff: main.cpp
- Revision:
- 10:fcfa9adc99a9
- Parent:
- 9:affd4e6372a0
--- a/main.cpp Sun Oct 15 19:22:36 2017 +0000 +++ b/main.cpp Mon Nov 20 16:36:55 2017 +0000 @@ -37,10 +37,7 @@ #include "MAX30101.h" #include "algorithm.h" -//equals 3*number of LEDS used -#define DIV_SAMPLE 6 -//sets the number of samples sent to the heart rate and SPO2 calculation -#define CALC_SAMPLE 500 + MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); @@ -54,6 +51,11 @@ op_sensorIntFlag = 1; } +//declare large variables outside of main +uint32_t redData[500];//set array to max fifo size +uint32_t irData[500];//set array to max fifo size + + int main() { Serial pc(USBTX, USBRX); // Use USB debug probe for serial link @@ -81,132 +83,83 @@ uint16_t idx, readBytes; int32_t opSample; uint32_t sample; - uint32_t redData[500];//set array to max fifo size - uint32_t irData[500];//set array to max fifo size + int r=0; //counter for redData position int ir=0; //counter for irData position int c=0; //counter to print values - int i =0; //second counter int32_t spo2 =0; int8_t spo2Valid = 0; int32_t heartRate = 0; int8_t heartRateValid = 0; - int32_t numSamples = 0; - uint32_t fifoIR[MAX30101::MAX_FIFO_BYTES]; - uint32_t fifoRED[MAX30101::MAX_FIFO_BYTES]; - + + pc.printf("Starting Program...Please wait a few seconds while data is being collected.\r\n"); while(1) - { - - + { if( rc == 0 ) { // Check if op_sensor interrupt asserted if(op_sensorIntFlag) { - pc.printf("Entered op_sensorIntFlag check\r\n"); + //pc.printf("Entered op_sensorIntFlag check\r\n"); op_sensorIntFlag = 0; // Lower interrupt flag rc = op_sensor.getInterruptStatus(ints); // Read interrupt status // Check if FIFO almost full interrupt asserted if((rc == 0) && (ints.bits.a_full)) { - pc.printf("about to read fifo\r\n"); // Read FIFO rc = op_sensor.readFIFO(MAX30101::TwoLedChannels, fifoData, readBytes); - - numSamples = readBytes/DIV_SAMPLE; //calcualtes number of smaples read - + if(rc == 0) { // Convert read bytes into samples - for(idx = 0, c=0, i=0; idx < readBytes; idx+=3) + for(idx = 0, c=0; idx < readBytes; idx+=3) { - //pc.printf("In sample adjustment \r\n"); + sample = (fifoData[idx]<<16) | (fifoData[idx+1]<<8) | (fifoData[idx+2]); - opSample = sample << 14; // Sign extends sample - opSample = opSample >> 14; + opSample = sample; + opSample&=0x03FFFF; //Mask MSB [23:18] + if(idx%2==0) { - //pc.printf("end red allocation\r\n"); redData[r] = opSample;//saves to buff for calculations - fifoRED[i] = opSample;//saves to buff to print values just obtained r++; - i++; } else { - //pc.printf("end ir allocation\r\n"); + irData[ir] = opSample; //saves to buff for calculations - fifoIR[c] = opSample;//saves to buff to print values just obtained ir++; - c++; } - pc.printf("Red count = %i\r\n IR count = %i\r\n",r,ir); - //pc.printf("idx = %i and readbytes = %i\r\n", idx,readBytes); } - if(r>=200 & ir>=200)//checks to make sure there are 200 samples in data buffers + if(r>=450 & ir>=450)//checks to make sure there are 450 + //samples in data buffers { - pc.printf("In Calculation Function\r\n"); + //calculate heart rate and spo2 - maxim_heart_rate_and_oxygen_saturation( irData, CALC_SAMPLE, + maxim_heart_rate_and_oxygen_saturation( irData, ir, redData, &spo2, &spo2Valid, &heartRate, &heartRateValid); + pc.printf("SPO2 = %i\r\n",spo2); + //heart rate is typically twice what it should be, thus divide by 2 + pc.printf("Heart Rate = %i\r\n",heartRate/2); - for(c=100;c<200;c++)//dump first hundred samples after calculations + for(c=100;c<450;c++)//dump first hundred samples + //after calculations { redData[c-100]=redData[c]; irData[c-100]=irData[c]; } - r=50; - ir=50; - - - } - - - - pc.printf("Read Samples %i\r\n",numSamples); - //prints the Red LED data - pc.printf("RED LED DATA\r\n"); - for(c=0; c<numSamples; c++) - { - pc.printf("%i\r\n",fifoRED[c]); - } - - //prints the IR LED data - pc.printf("IR LED DATA\r\n"); - for(c=0; c<numSamples; c++) - { - pc.printf("%i\r\n",fifoIR[c]); - } - - if(spo2Valid==1) - { - pc.printf("SPO2 = %i\r\n",spo2); - spo2Valid=0; - } - else - { - pc.printf("SPO2 calculation waiting for enough samples\r\n"); - } - if(heartRateValid==1) - { - pc.printf("Heart Rate = %i\r\n",heartRate); - heartRateValid=0; - }else - { - pc.printf("Heart rate calculation waiting for enough samples\r\n"); - } - - + r=350; + ir=350; + } } } } @@ -254,8 +207,8 @@ if(rc == 0) { fifoConfig.all = 0; - fifoConfig.bits.fifo_a_full = 15; // Max level of 15 samples - fifoConfig.bits.sample_average = MAX30101::AveragedSamples_8; // Average 8 samples + fifoConfig.bits.fifo_a_full = 15; // Max level of 15 samples + fifoConfig.bits.sample_average = MAX30101::AveragedSamples_8;// Average 8 samples rc = op_sensor.setFIFOConfiguration(fifoConfig); }