IDT Optical Sensors / Mbed 2 deprecated OB1203_IDT

Dependencies:   mbed OB1203_example_driver

Revision:
13:5ce84c68066e
Parent:
12:5de5f550e765
Child:
14:ae0be10b73cd
diff -r 5de5f550e765 -r 5ce84c68066e main.cpp
--- a/main.cpp	Thu Jun 21 14:58:46 2018 +0000
+++ b/main.cpp	Tue Jun 26 11:40:27 2018 +0000
@@ -5,14 +5,19 @@
 
 #define intb_pin D3
 
-
 I2C i2c(I2C_SDA,I2C_SCL);
+//I2C i2c(PA_4,PA_7);
 //SoftI2C i2c(I2C_SDA,I2C_SCL);
 InterruptIn intb(intb_pin);
 DigitalOut sda_pullup(D10,1);
 DigitalOut scl_pullup(D11,1);
 DigitalOut intb_pullup(D12,1);
 
+//InterruptIn intb(D10);
+//DigitalOut sda_pullup(D13,1);
+//DigitalOut scl_pullup(PA_0,1);
+//DigitalOut intb_pullup(PA_4,1);
+
 OB1203 ob1203(&i2c);
 Serial pc(USBTX, USBRX,256000);
 Timer t;
@@ -24,6 +29,9 @@
 bool spo2 = 1; //0 for HR, 1 for SpO2
 bool afull = 1; //use Afull interrupt--otherwise PPG new data interrupt
 bool meas_temp = 1;
+bool printAvg = 0; //default 0 print raw data
+bool redAGC = 1;
+bool IRAGC = 1;
 //****************************
 
 //internal settings
@@ -32,7 +40,7 @@
 
 void defaultConfig()
 {
-    ob1203.osc_trim = 0x3F; //max trim code
+    ob1203.osc_trim = 0x00; //max trim code =0x3F
     
     meas_temp ? ob1203.temp_en = TEMP_ON : ob1203.temp_en = TEMP_OFF;
 
@@ -102,11 +110,11 @@
         ob1203.ppg_int_en = PPG_INT_ON;
     }
     //PPG
-    ob1203.ir_current = 600; //max 1023. 3FF
+    ob1203.ir_current = 0x1AF; //max 1023. 3FF
     if (spo2)
     {
 //        ob1203.r_current = 0x0FF;
-    ob1203.r_current = 511; //max 511. 1FF
+    ob1203.r_current = 0x1AF; //max 511. 1FF
     }
     else 
     {   
@@ -133,8 +141,8 @@
 //    ob1203.ppg_freq = PPG_FREQ_50HZ;
 
     ob1203.fifo_rollover_en = FIFO_ROLL_ON;
-    ob1203.fifo_afull_samples_left = AFULL_SAMPLES_LEFT(8);
-
+    ob1203.fifo_afull_advance_warning = AFULL_ADVANCE_WARNING(0x0F); //warn as quickly as possible (after 17 samples with 0x0F)
+    
     if(mode)
     {
         if(spo2)
@@ -205,6 +213,17 @@
     uint32_t PSprev = 0;
     uint32_t PS_avg_buffer[ps_running_avg];
     
+    uint32_t targetIRcounts = 196608; //0.75 of full scale
+    uint32_t targetRcounts = 196608; //0.75 of full scale
+//    uint32_t tol1 = 8192; //1 5 bit increment
+    uint32_t tol1 = 4096; //1 5 bit increment
+    uint32_t tol2 = 39321; //for 90% and 60% large limits
+    uint32_t step = 8;
+    uint32_t IR_in_range = 0;
+    uint32_t R_in_range = 0;
+    bool update = 0;
+    uint32_t in_range_persist = 2;
+    
     for (int n=0;n<ps_running_avg;n++)
     {
         PS_avg_buffer[n] =0;
@@ -297,9 +316,8 @@
                         first = 0;
 //                        IRbaseline = running_baseline*ppgData[0];
 //                        Rbaseline = running_baseline*ppgData[1]; 
-                    }
-                    
-//                    IRbaseline = running_baseline*ppgData[0];             
+                    }//end if first
+                                 
                     for (int n=0;n<samples2Read/2;n++)
                     {
                         ( avg_ptr+1 == running_avg ) ? avg_ptr = 0 : avg_ptr++;
@@ -324,16 +342,20 @@
                             R_baseline_buffer[baseline_ptr] = ppgData[2*n+1];
                             Rbaseline += (R_baseline_buffer[baseline_ptr] - Rbaseline_prev);
                             
-                            
-                            //PRINT RAW DATA
-                             pc.printf("%d, %d, %d\r\n",t.read_us(),ppgData[2*n],ppgData[2*n+1]); //print with us counter time stamp (use only with slower data rates or averaging as this slows down the data printing);
-//                             pc.printf("%d, %d\r\n",ppgData[2*n],ppgData[2*n+1]); //print without us timer (faster)
+                            if(printAvg) 
+                            {
                             //PRINT AVG DATA
-//                            pc.printf("%d,%d,%d\r\n",t.read_us(),IRavg/running_avg,Ravg/running_avg);
+                                pc.printf("%d,%d,%d\r\n",t.read_us(),IRavg/running_avg,Ravg/running_avg);
 //                            pc.printf("%d,%d\r\n",IRavg/running_avg-IRbaseline/running_baseline, Ravg/running_avg-Rbaseline/running_baseline);
-    
 //                            pc.printf("%d,%d,%d,%d\r\n",Ravg/running_avg,Rbaseline/running_baseline,Rbaseline_prev,Ravg/running_avg-Rbaseline/running_baseline);
-                        }
+                            }
+                            else
+                            {
+                                //PRINT RAW DATA
+                                pc.printf("%d, %d, %d\r\n",t.read_us(),ppgData[2*n],ppgData[2*n+1]); //print with us counter time stamp (use only with slower data rates or averaging as this slows down the data printing);
+//                             pc.printf("%d, %d\r\n",ppgData[2*n],ppgData[2*n+1]); //print without us timer (faster)
+                            }
+                        }//end SpO2 case
                         else
                         {
                             ( avg_ptr+1 == running_avg ) ? avg_ptr = 0 : avg_ptr++;
@@ -349,16 +371,96 @@
                             IRbaseline += (IR_baseline_buffer[baseline_ptr] - IRbaseline_prev); //update the average by removing the old sample and adding the new
 
 
-                            //PRINT RAW DATA
-                            pc.printf("%d\r\n%d\r\n",ppgData[2*n],ppgData[2*n+1]);
-//                          pc.printf("%d, %d, %d\r\n",t.read_us(),ppgData[2*n],ppgData[2*n+1]); //print with us counter time stamp (use only with slower data rates or averaging as this slows down the data printing);                   
+                            if(printAvg)
+                            {
                             //PRINT AVG DATA
-//                            pc.printf("%d\r\n%d\r\n",prevAvg/running_avg-prevBaseline/running_baseline,IRavg/running_avg-IRbaseline/running_baseline);
-
+                                pc.printf("%d\r\n%d\r\n",prevAvg/running_avg-prevBaseline/running_baseline,IRavg/running_avg-IRbaseline/running_baseline);
+                            }
+                            else
+                            {
+                            //PRINT RAW DATA
+                                pc.printf("%d\r\n%d\r\n",ppgData[2*n],ppgData[2*n+1]);
+//                          pc.printf("%d, %d, %d\r\n",t.read_us(),ppgData[2*n],ppgData[2*n+1]); //print with us counter time stamp (use only with slower data rates or averaging as this slows down the data printing);                   
+                                
+                            }
+                        }//HR case
+                        if(n+1==samples2Read/2)
+                        {
+                            if(IRAGC)
+                             {
+                                if( ppgData[2*n] > targetIRcounts + (IR_in_range>in_range_persist ? tol2: tol1) )
+                                {       
+                                    if(ppgData[2*n]>targetIRcounts + tol2)
+                                        IR_in_range=0;
+                                    if(ob1203.ir_current>step)
+                                    {
+//                                        pc.printf("IR %d, IRc %d--",ppgData[2*n],ob1203.ir_current);
+                                        ob1203.ir_current -= step;
+                                        update = 1;
+                                     
+                                    }
+                                }
+                                else if( ppgData[2*n] < targetIRcounts - (IR_in_range>in_range_persist ? tol2 : tol1) )
+                                {
+                                    if(ppgData[2*n]<targetIRcounts - tol2)
+                                        IR_in_range=0;
+                                    if(ob1203.ir_current+step<0x2AF) //no need to go to full current
+                                    {
+                                        ob1203.ir_current += step;
+                                        update = 1;
+//                                        pc.printf("IR %d, IRc %d++", ppgData[2*n],ob1203.ir_current);
+                                    }
+                                }
+                                else
+                                {
+                                    IR_in_range++;
+                                }
+                            }//end IR AGC case
+                                
+                            if(spo2 && redAGC)
+                            {
+                                if( ppgData[2*n+1] > targetRcounts + (R_in_range>in_range_persist ? tol2 : tol1) )
+                                {       
+                                    if(ppgData[2*n+1]>targetRcounts + tol2)
+                                        R_in_range=0;
+                                    if(ob1203.r_current>step)
+                                    {
+//                                        pc.printf(", R %d, Rc %d--\r\n", ppgData[2*n+1],ob1203.r_current);
+                                        ob1203.r_current -= step; 
+                                        update = 1;
+                                    }
+                                }
+                                else if( ppgData[2*n+1] < targetRcounts - (R_in_range>in_range_persist ? tol2 : tol1) )
+                                {
+                                    if(ppgData[2*n+1]<targetRcounts - tol2)
+                                        R_in_range=0;
+                                    if(ob1203.r_current+step<0x1FF)
+                                    {
+                                        
+//                                        pc.printf(", R %d, Rc %d++\r\n", ppgData[2*n+1],ob1203.r_current);
+                                        ob1203.r_current += step;
+                                        update = 1;
+                                    }
+                                }
+                                else
+                                {
+                                    R_in_range++;
+                                } 
+                                if(update)
+                                {
+                                    ob1203.setPPGcurrent();
+                                    ob1203.resetFIFO();
+                                    update=0;
+                                }
+                            }//end R AGC case 
                         }
-                    }
-                intFlagged = 0;   
-                }
+                    }//end sample loop
+                    
+                    
+                    
+                    intFlagged = 0;
+                
+                 }//end if time to read samples             
             } //end if !intb
         }// end mode
         else