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-17
Revision:
0:0bd4103885bf
Child:
1:471e2b722d24

File content as of revision 0:0bd4103885bf:

#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 = false;                  
void op_sensor_callback()
{
    op_sensorIntFlag = true;
}

int main()
{
    Serial pc(USBTX, USBRX);
    pc.baud(115200);
    
    DigitalOut rLed(LED1, LED_OFF);
    DigitalOut gLed(LED2, LED_OFF);
    DigitalOut bLed(LED3, LED_OFF);
    
    InterruptIn op_sensor_int(P3_2);
    
    I2C i2cBus(I2C1_SDA, I2C1_SCL);                 // I2C bus

    MAX30101 * op_sensor;
    op_sensor = new MAX30101(i2cBus);
    int rc = op_sensor_config(*op_sensor); 
    
    op_sensor_int.fall(op_sensor_callback);
    
    MAX30101::InterruptBitField_u ints;
    uint8_t fifoData[MAX30101::MAX_FIFO_BYTES];
    uint16_t idx, readBytes;
    while(1) {
        
        if( rc == 0 ) 
        {
            
            if(op_sensorIntFlag) 
            {
                
                pc.printf("Interrupt seen...\r\n");
                op_sensorIntFlag = false; 
                rc = op_sensor->getInterruptStatus(ints);
                
                if((rc == 0) && (ints.bits.a_full)) 
                {
                    
                    rc = op_sensor->readFIFO(MAX30101::OneLedChannel, fifoData, readBytes);
                    
                    if(rc == 0) 
                    {
                        
                        pc.printf("FIFO Read, received %d bytes\r\n", readBytes);
                        
                        for(idx = 0; idx < readBytes; idx++) 
                        {
                            pc.printf("fifoData[0x%04x] = 0x%02x\r\n", idx, fifoData[idx]); 
                        }
                        pc.printf("\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;
        ints.bits.a_full = 1;
        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_4; 
        rc = op_sensor.setFIFOConfiguration(fifoConfig);
    }
    
    MAX30101::SpO2Configuration_u spo2Config;
    spo2Config.all = 0;
    spo2Config.bits.spo2_sr = MAX30101::SR_1600_Hz;
    if(rc == 0)
    {
        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;
    modeConfig.bits.mode = MAX30101::HeartRateMode;
    if(rc == 0)
    {
        rc = op_sensor.setModeConfiguration(modeConfig);
    }    
    
    
    return rc;
}