John Greene / Mbed OS MAX30101_HR_SPO2

Dependencies:   MAX30101 max32630fthr

Fork of MAX30101_Demo_Plot_Algorithm by John Greene

main.cpp

Committer:
coreyharris
Date:
2017-08-22
Revision:
3:a580414c44ce
Parent:
2:54182d6a168f
Child:
4:14d1b87cd3c4

File content as of revision 3:a580414c44ce:

#include "mbed.h"
#include "max32630fthr.h"
#include "MAX30101.h"

MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);

bool op_sensor_config(MAX30101 &op_sensor);

/* Op Sensor FIFO nearly full callback */
volatile bool op_sensorIntFlag = 0;                  
void op_sensor_callback()
{
    op_sensorIntFlag = 1;
}

int main()
{
    Serial pc(USBTX, USBRX);            // Use USB debug probe for serial link
    pc.baud(115200);                    // Baud rate = 115200
    
    DigitalOut rLed(LED1, LED_OFF);     // Debug LEDs
    DigitalOut gLed(LED2, LED_OFF);
    DigitalOut bLed(LED3, LED_OFF);
    
    InterruptIn op_sensor_int(P3_2);            // Config P3_2 as int. in for
    op_sensor_int.fall(&op_sensor_callback);    // FIFO ready interrupt
    
    I2C i2cBus(I2C1_SDA, I2C1_SCL);     // I2C bus, P3_4 = SDA, P3_5 = SCL 

    MAX30101 * op_sensor;
    op_sensor = new MAX30101(i2cBus);
    int rc = op_sensor_config(*op_sensor);
    
    MAX30101::InterruptBitField_u ints;
    uint8_t fifoData[MAX30101::MAX_FIFO_BYTES];
    uint16_t idx, readBytes;
    int16_t opSample;
    uint32_t sample;
    while(1) {

        if( rc == 0 ) {

            if(op_sensorIntFlag) {
                pc.printf("Interrupt seen...\r\n");
                op_sensorIntFlag = 0;                       // Lower interrupt flag
                rc = op_sensor->getInterruptStatus(ints);   // Read interrupt status 
                
                if((rc == 0) && (ints.bits.a_full)) {
                    rc = op_sensor->readFIFO(MAX30101::OneLedChannel, fifoData, readBytes);     // Read FIFO 
                    
                    if(rc == 0) {
                        pc.printf("FIFO Read, received %d samples\r\n\r\n", readBytes/3);
                        
                        for(idx = 0; idx < readBytes; idx+=3) {
                            sample = (fifoData[idx]<<16) | (fifoData[idx+1]<<8) | (fifoData[idx+2]);
                            opSample = sample >> 8;
                            pc.printf("Op. Sample : %i\r\n", opSample);     // Print results
                        }
                        pc.printf("\r\n\r\n");
                        
                    }
                }
            }
        
        } else {        
            
            pc.printf("Something went wrong, check the I2C bus or power connections... \r\n");
            bLed = LED_OFF;
            gLed = LED_OFF;
            
            while(1)
            {
                rLed = !rLed;
                wait(0.5);   
            } 
        }  
        
    } 
}


bool op_sensor_config(MAX30101 &op_sensor) {
    
    //Reset Device
    MAX30101::ModeConfiguration_u modeConfig;
    modeConfig.all = 0;
    modeConfig.bits.reset = 1;
    int32_t rc = op_sensor.setModeConfiguration(modeConfig);
    
        
    //enable MAX30101 interrupts
    MAX30101::InterruptBitField_u ints;
    if(rc == 0)
    {
        ints.all = 0;
        ints.bits.die_temp = 1;     // Enable FIFO almost full interrupt
        ints.bits.a_full = 1;       // Enable internal die temp. interrupt
        rc = op_sensor.enableInterrupts(ints);
    }
    
    //configure FIFO
    MAX30101::FIFO_Configuration_u fifoConfig;
    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 4 samples
        rc = op_sensor.setFIFOConfiguration(fifoConfig);
    }
    
    MAX30101::SpO2Configuration_u spo2Config;
    if(rc == 0)
    {
        spo2Config.all = 0;
        spo2Config.bits.spo2_sr = MAX30101::SR_400_Hz;      // SpO2 SR = 400Hz
        spo2Config.bits.led_pw = 1;
        rc = op_sensor.setSpO2Configuration(spo2Config);
    }
    
    //Set LED1 drive current
    if(rc == 0)
    {
        //Heart Rate only
        rc = op_sensor.setLEDPulseAmplitude(MAX30101::LED1_PA, 0x1F);
    }
       
    //Set operating mode
    modeConfig.all = 0;
    if(rc == 0)
    {
        modeConfig.bits.mode = MAX30101::HeartRateMode;     // Heart-rate only
        rc = op_sensor.setModeConfiguration(modeConfig);
    }    
    
    
    return rc;
}