Maxim Integrated / Mbed OS MAX30101WING_HR_SPO2

Dependencies:   MAX30101 max32630fthr

Fork of MAX30101_HR_SPO2 by John Greene

Revision:
0:0bd4103885bf
Child:
1:471e2b722d24
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Aug 17 15:53:16 2017 +0000
@@ -0,0 +1,142 @@
+#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;
+}