Code to log MAX30102 sensor data to phone application (Based on Nexpaq)

Dependencies:   ds3231 maxim_dev nexpaq_mdk MAX30102

Fork of IO_Demo by nexpaq

Revision:
2:9057c54ae6e9
Parent:
1:5fb525e83780
--- a/main.cpp	Wed Nov 09 16:44:59 2016 +0000
+++ b/main.cpp	Sun Dec 18 09:43:33 2016 +0000
@@ -1,9 +1,31 @@
 #include "mbed.h"
 #include "nexpaq_mdk.h"
+#include "ds3231.h"
+#include "algorithm.h"
+#include "MAX30102.h"
 
-PwmOut ledR(P2_4);
-PwmOut ledG(P2_5);
-PwmOut ledB(P2_6);
+#define I2C_SDA P1_6
+#define I2C_SCL P1_7
+
+#define		FUNCTION_TABLE_NUM					2
+#define		UUID_NUM							16			// UUID number is 16, don't change it
+#define     LOOP_DELAY                          1000
+
+DigitalOut ledR(P2_4, LED_OFF);
+DigitalOut ledG(P2_5, LED_OFF);
+DigitalOut ledB(P2_6, LED_OFF);
+
+uint32_t aun_ir_buffer[500]; //IR LED sensor data
+int32_t n_ir_buffer_length;    //data length
+uint32_t aun_red_buffer[500];    //Red LED sensor data
+int32_t n_sp02; //SPO2 value
+int8_t ch_spo2_valid;   //indicator to show if the SP02 calculation is valid
+int32_t n_heart_rate;   //heart rate value
+int8_t  ch_hr_valid;    //indicator to show if the heart rate calculation is valid
+uint8_t uch_dummy;
+
+DigitalIn INT(P4_1);
+
 AnalogIn aIn0(AIN_0);
 AnalogIn aIn1(AIN_1);
 AnalogIn aIn2(AIN_2);
@@ -30,14 +52,17 @@
 };
 
 unsigned char dataOut[10];
-
+Ds3231 temp_sense(P3_4, P3_5); 
+DigitalOut cs(P1_3);
+//vitals
+int spo2=50,heart_rate=120,Resp_rate=12,tmp=25;
 /***** Functions *****/
 void my_function_CMD_2700(unsigned char *pData, unsigned char len)
 {
     unsigned char response = 0x00;
-    ledR = 1.0f - (pData[0] / 255.0f);
+/*    ledR = 1.0f - (pData[0] / 255.0f);
     ledG = 1.0f - (pData[1] / 255.0f);
-    ledB = 1.0f - (pData[2] / 255.0f);
+    ledB = 1.0f - (pData[2] / 255.0f);*/
     np_api_upload(0x2701, &response, 1);
 }
 
@@ -85,7 +110,7 @@
     if ( np_api_register((MDK_REGISTER_CMD*)my_cmd_func_table, FUNCTION_TABLE_NUM) == MDK_REGISTER_FAILD ) {
         // Register failed handle code
     }
-    ledR = 1.0f;
+/*    ledR = 1.0f;
     ledG = 1.0f;
     ledB = 1.0f;
     for (i = 0; i < 16; i++) {
@@ -94,26 +119,29 @@
     }
     for (i = 0; i < 10; i++) {
         dataOut[i] = 0xFF;
-    }
+    }*/ 
+   
+     //instantiate rtc object
+ 	
+
 }
 
 void app_loop()
-{
-    int anaData;
-    anaData = aIn4.read_u16();
-    dataOut[0] = anaData;
-    dataOut[1] = anaData>>8;
-    anaData = aIn5.read_u16();
-    dataOut[2] = anaData;
-    dataOut[3] = anaData>>8;
-    anaData = aIn2.read_u16();
-    anaData = anaData/10;
-    dataOut[4] = anaData;
-    dataOut[5] = anaData>>8;
-    anaData = aIn3.read_u16();
-    anaData = anaData/10;
-    dataOut[6] = anaData;
-    dataOut[7] = anaData>>8;
+{	
+	if((n_heart_rate>20)&&(n_heart_rate<220))
+		heart_rate=n_heart_rate;
+	if((n_sp02>60)&&(n_sp02<120))
+	    spo2=n_sp02;
+ 
+    tmp = temp_sense.get_temperature();
+    dataOut[0] = heart_rate;
+    dataOut[1] = heart_rate>>8;
+    dataOut[2] = tmp;
+    dataOut[3] = tmp>>8;
+    dataOut[4] = spo2;
+    dataOut[5] = spo2>>8;
+    dataOut[6] = Resp_rate;
+    dataOut[7] = Resp_rate>>8;
 
     dataOut[8] = (digPin[7].read()<<7) +
                  (digPin[6].read()<<6) +
@@ -131,15 +159,91 @@
                  (digPin[10].read()<<2) +
                  (digPin[9].read()<<1) +
                  (digPin[8].read());
+                 
     sendStatus();
 }
 
 int main(void)
 {
+    uint32_t un_min, un_max, un_prev_data;  //variables to calculate the on-board LED brightness that reflects the heartbeats
+    int i;
+    maxim_max30102_reset();
+    maxim_max30102_read_reg(0,&uch_dummy);
+    maxim_max30102_init();
+    un_min=0x3FFFF;
+    un_max=0;
+    n_ir_buffer_length=500;
     np_api_init();
     app_setup();
     np_api_start();
+    
+    for(i=0;i<n_ir_buffer_length;i++)
+    {
+        while(INT.read()==1);   //wait until the interrupt pin asserts
+        
+        maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i));  //read from MAX30102 FIFO
+            
+        if(un_min>aun_red_buffer[i])
+            un_min=aun_red_buffer[i];    //update signal min
+        if(un_max<aun_red_buffer[i])
+            un_max=aun_red_buffer[i];
+    }
+    un_prev_data=aun_red_buffer[i];
+    maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid); 
+    
     while(1) {
+                i=0;
+        un_min=0x3FFFF;
+        un_max=0;
+        
+        //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top
+        for(i=100;i<500;i++)
+        {
+            aun_red_buffer[i-100]=aun_red_buffer[i];
+            aun_ir_buffer[i-100]=aun_ir_buffer[i];
+            
+            //update the signal min and max
+            if(un_min>aun_red_buffer[i])
+            un_min=aun_red_buffer[i];
+            if(un_max<aun_red_buffer[i])
+            un_max=aun_red_buffer[i];
+        }
+    
+    	for(i=400;i<500;i++)
+        {
+            un_prev_data=aun_red_buffer[i-1];
+            while(INT.read()==1);
+            maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i));
+        
+          /*  if(aun_red_buffer[i]>un_prev_data)
+            {
+                f_temp=aun_red_buffer[i]-un_prev_data;
+                f_temp/=(un_max-un_min);
+                f_temp*=MAX_BRIGHTNESS;
+                n_brightness-=(int)f_temp;
+                if(n_brightness<0)
+                    n_brightness=0;
+            }
+            else
+            {
+                f_temp=un_prev_data-aun_red_buffer[i];
+                f_temp/=(un_max-un_min);
+                f_temp*=MAX_BRIGHTNESS;
+                n_brightness+=(int)f_temp;
+                if(n_brightness>MAX_BRIGHTNESS)
+                    n_brightness=MAX_BRIGHTNESS;
+            }*/
+        
+    		//led.write(1-(float)n_brightness/256);
+
+            //send samples and calculation result to terminal program through UART
+
+        }
+//        ledR=LED_OFF;
+//        ledG=LED_ON;
+        maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid); 
+
+        ledR = LED_ON;
         app_loop();
         np_api_bsl_chk();
         Thread::wait(LOOP_DELAY);