Mode1 Optical Validation

Dependencies:   max32630fthr

Revision:
4:4f1e9439f048
Parent:
3:da975696b936
Child:
5:7f5a012747a5
--- a/main.cpp	Fri Mar 19 00:14:42 2021 +0000
+++ b/main.cpp	Wed Mar 24 01:32:34 2021 +0000
@@ -34,8 +34,19 @@
 #include "mbed.h"
 #include "platform/mbed_thread.h"
 #include "mbed.h"
-
-#define MAXM86146_CFG 1
+/******************************************************************************
+* Warning, if using the either
+*   MAX32630FTHR+MAXM86161_ADPTER_REVB+MAXM86146EVSYS sensor brd or
+*   MAX32630FTHR+MAXM86161_ADPTER_REVB+MAXM86161EVSYS sensor brd,
+* The VLED is connected to USB power which is noisy. The VLED should be
+* connected to a regulated power supply if you are testing accuracy.
+*******************************************************************************
+*/
+/******************************************************************************
+* Tera Term output is set to 115200 baud rate.
+*******************************************************************************
+*/
+//#define MAXM86146_CFG 1
 #ifdef MAXM86146_CFG
   #define PPG_SZ 36  //maxm86146
 #else
@@ -79,7 +90,8 @@
     char rsp[3000];
     int32_t ppg[12];
     int32_t accel[3];
-    int32_t status, opmode, hr, hr_conf, ibi, ibi_conf, act, r, spo2, spo2_conf, scd;
+    int32_t status, opmode, hr, hr_conf, ibi, ibi_conf, act, r, spo2, spo2_conf;
+    int32_t spo2_compl, spo2_lo, spo2_mo, spo2_lopi, spo2_unrel, spo2_state, ibi_offset, scd;
     int32_t scnt = 0;
     int32_t ptr = 0;
     int32_t sptr = 0;
@@ -87,16 +99,14 @@
     Time_to_Read_PPG = 0;
 #if 0
 // 2.1
-    cmd[0] = 0x00;
-    cmd[1] = 0x00;
+    cmd[0] = 0x00; cmd[1] = 0x00;
     i2c.write(addr, cmd, 2);
     wait_us(100);
     i2c.read(addr, rsp, 2);
 //    pc.printf("2.1 Status: %x %x\n\r", rsp[0], rsp[1]);
 #endif
 // 2.2
-    cmd[0] = 0x12;
-    cmd[1] = 0x00;
+    cmd[0] = 0x12; cmd[1] = 0x00;
     i2c.write(addr, cmd, 2);
     wait_us(100);
     i2c.read(addr, rsp, 2);
@@ -106,8 +116,7 @@
 //    pc.printf("num smpls %d \n\r",  samples);
     scnt = rsp[1];
 // 2.3
-    cmd[0] = 0x12;
-    cmd[1] = 0x01;
+    cmd[0] = 0x12; cmd[1] = 0x01;
     i2c.write(addr, cmd, 2);
     wait_us(100);
 //    thread_sleep_for(1);
@@ -124,7 +133,10 @@
             ppg[1] = (rsp[ptr+3] << 16) | (rsp[ptr+4] << 8) | (rsp[ptr+5]);
             ppg[2] = (rsp[ptr+6] << 16) | (rsp[ptr+7] << 8) | (rsp[ptr+8]);
             ppg[3] = (rsp[ptr+9] << 16) | (rsp[ptr+10] << 8) | (rsp[ptr+11]);
+            ppg[4] = (rsp[ptr+12] << 16) | (rsp[ptr+13] << 8) | (rsp[ptr+14]);
+            ppg[5] = (rsp[ptr+15] << 16) | (rsp[ptr+16] << 8) | (rsp[ptr+17]);
             pc.printf("%d,%d,%d,%d,", ppg[0], ppg[1], ppg[2], ppg[3]);
+//            pc.printf("%d,%d,", ppg[4], ppg[5]);
             ptr = sptr + SENSOR_SZ;
 #endif
 //            pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ);
@@ -132,16 +144,39 @@
             hr =  (rsp[ptr+1] << 8) + rsp[ptr+2];
             hr_conf = rsp[ptr+3];
             ibi = rsp[ptr+4];
+
             ibi_conf = (rsp[ptr+5] << 8) + rsp[ptr+6];
             act = rsp[ptr+7];
             r = (rsp[ptr+8] << 8) + rsp[ptr+9];
             spo2_conf = rsp[ptr+10];
+
             spo2 = (rsp[ptr+11] << 8) + rsp[ptr+12];
+            spo2_compl = rsp[ptr+13];
+            spo2_lo = rsp[ptr+14];
+            spo2_mo = rsp[ptr+15];
+
+            spo2_lopi = rsp[ptr+16];
+            spo2_unrel = rsp[ptr+17];
+            spo2_state = rsp[ptr+18];
             scd = rsp[ptr+19];
 
-            sptr += (TTL_SZ);
+            ibi_offset = rsp[ptr+20];
 
-            pc.printf("%d,%d,%d,%d,%d", hr, hr_conf, spo2, spo2_conf, scd);
+            sptr += (TTL_SZ);
+#if 0
+            pc.printf("%d,%d,%d,%d,", opmode, hr, hr_conf, ibi);
+            pc.printf("%d,%d,%d,%d,", ibi_conf, act, r, spo2_conf);
+            pc.printf("%d,%d,%d,%d,", spo2, spo2_compl, spo2_lo, spo2_mo);
+            pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state, scd);
+            pc.printf("%d,", ibi_offset);
+#else
+            pc.printf("%d,%d,", hr, hr_conf);
+            pc.printf("%d,%d,", spo2, spo2_conf);
+            pc.printf("%d,", spo2_lo);
+            pc.printf("%d,%d,", spo2_unrel, scd);
+#endif
+
+
             pc.printf("\n\r");
         }
         mfio = 1;
@@ -154,9 +189,7 @@
     char rsp[256];
     int32_t ppg[12];
 
-    rLED = LED_OFF;
-    gLED = LED_ON;
-    bLED = LED_OFF;
+    rLED = LED_OFF;  gLED = LED_ON;  bLED = LED_OFF;
     Ticker ticker;   // calls a callback repeatedly with a timeout
     //ticker.attach(callback(&blink_timer), BLINKING_RATE_MS);  /* set timer for one second */
 
@@ -168,16 +201,16 @@
     thread_sleep_for(1500);
 
     mfio = 0; wait_us(300);
-    cmd[0] = 0x02;
-    cmd[1] = 0x00;
+
+//read operating mode
+    cmd[0] = 0x02; cmd[1] = 0x00;
     i2c.write(addr, cmd, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     i2c.read(addr, rsp, 2);
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("02 00 Status, Operating Mode: %x %x\n\r", rsp[0], rsp[1]);
-// rd ver    
-    cmd[0] = 0xFF;
-    cmd[1] = 0x03;
+//1.11 rd ver    
+    cmd[0] = 0xFF; cmd[1] = 0x03;
     i2c.write(addr, cmd, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     wait_us(300);
@@ -186,12 +219,13 @@
     pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]);
 
 // 1.3 sensor and algo data
-    cmd[0] = 0x10;
-    cmd[1] = 0x00;
+    cmd[0] = 0x10; cmd[1] = 0x00;
 #ifdef ALGO_ONLY
     cmd[2] = 0x02;  // algo data
+    pc.printf("algo only \n\r");
 #else
     cmd[2] = 0x03;  // sensor + algo data
+    pc.printf("sens+algo \n\r");
 #endif
     i2c.write(addr, cmd, 3);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
@@ -199,100 +233,72 @@
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("1.3 Status: %x\n\r", rsp[0]);
 // 1.7 cont hr, spo2
-    cmd[0] = 0x50;
-    cmd[1] = 0x07;
-    cmd[2] = 0x0A;
-    cmd[3] = 0x00;
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00;
     i2c.write(addr, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     i2c.read(addr, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("1.7 Status: %x\n\r", rsp[0]);
-//1.11 rd AFE part id
-    cmd[0] = 0x41;
-    cmd[1] = 0x00;
-    cmd[2] = 0xFF;
-    i2c.write(addr, cmd, 3);
+// 1.8 AEC enable (default)
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; cmd[3] = 0x01;
+    i2c.write(addr, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    i2c.read(addr, rsp, 2);
+    i2c.read(addr, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.11 part id afe %x %x\n\r", rsp[0], rsp[1]);
-//1.13 rd accel who
-    cmd[0] = 0x41;
-    cmd[1] = 0x04;
-    cmd[2] = 0x0F;
-    i2c.write(addr, cmd, 3);
+    pc.printf("1.8 Status: %x\n\r", rsp[0]);
+// 1.9 auto PD (default
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x01;
+    i2c.write(addr, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    i2c.read(addr, rsp, 2);
+    i2c.read(addr, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.12 who accel %x %x\n\r", rsp[0], rsp[1]);
+    pc.printf("1.9 Status: %x\n\r", rsp[0]);
+// 1.10 SCD (default)
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x01;
+    i2c.write(addr, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    i2c.read(addr, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("1.7 Status: %x\n\r", rsp[0]);
 #ifdef MAXM86146_CFG
-#if 1
 //1.20 Sec 4.1  map leds to slots for MAXM86146
-    cmd[0] = 0x50;
-    cmd[1] = 0x07;
-    cmd[2] = 0x19;
-    cmd[3] = 0x13;
-    cmd[4] = 0x56;
-    cmd[5] = 0x00;
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x13; cmd[4] = 0x56; cmd[5] = 0x00;
     i2c.write(addr, cmd, 6);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     i2c.read(addr, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("map leds to slots%x\n\r", rsp[0]);
 //1.21  map HR inputs to slots
-    cmd[0] = 0x50;
-    cmd[1] = 0x07;
-    cmd[2] = 0x17;
-    cmd[3] = 0x00;
-    cmd[4] = 0x11;
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x11;
     i2c.write(addr, cmd, 5);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     i2c.read(addr, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
 //1.22  map SpO2 inputs to slots
-    cmd[0] = 0x50;
-    cmd[1] = 0x07;
-    cmd[2] = 0x18;
-    cmd[3] = 0x30;
-    cmd[4] = 0x20;
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x30; cmd[4] = 0x20;
     i2c.write(addr, cmd, 5);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     i2c.read(addr, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
-#endif
 #if 0
 //1.20 Sec 4.1  map leds to slots for MAXM86146
-    cmd[0] = 0x50;
-    cmd[1] = 0x07;
-    cmd[2] = 0x19;
-    cmd[3] = 0x15;
-    cmd[4] = 0x60;
-    cmd[5] = 0x00;
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x15; cmd[4] = 0x60; cmd[5] = 0x00;
     i2c.write(addr, cmd, 6);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     i2c.read(addr, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("map leds to slots%x\n\r", rsp[0]);
 //1.21  map HR inputs to slots
-    cmd[0] = 0x50;
-    cmd[1] = 0x07;
-    cmd[2] = 0x17;
-    cmd[3] = 0x00;
-    cmd[4] = 0x01;
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x01;
     i2c.write(addr, cmd, 5);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     i2c.read(addr, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
 //1.22  map SpO2 inputs to slots
-    cmd[0] = 0x50;
-    cmd[1] = 0x07;
-    cmd[2] = 0x18;
-    cmd[3] = 0x20;
-    cmd[4] = 0x10;
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x20; cmd[4] = 0x10;
     i2c.write(addr, cmd, 5);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     i2c.read(addr, rsp, 1);
@@ -301,21 +307,36 @@
 #endif
 #endif // MAXM86146_CFG
 
-// 1.3
-    cmd[0] = 0x52;
-    cmd[1] = 0x07;
-    cmd[2] = 0x01;
+// 1.3 Enable HR, SpO2 algo
+    cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x01;
     i2c.write(addr, cmd, 3);
     thread_sleep_for(465);
     i2c.read(addr, rsp, 1);
     pc.printf("1.14 status: %x\n\r", rsp[0]);
     mfio = 1;
 
+#if 1
+//1.31 rd AFE part id
+    cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF;
+    i2c.write(addr, cmd, 3);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    i2c.read(addr, rsp, 2);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("1.31 part id afe %x %x\n\r", rsp[0], rsp[1]);
+//1.32 rd accel who
+    cmd[0] = 0x41; cmd[1] = 0x04; cmd[2] = 0x0F;
+    i2c.write(addr, cmd, 3);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    i2c.read(addr, rsp, 2);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("1.32 who accel %x %x\n\r", rsp[0], rsp[1]);
+#endif
+
     ticker.attach(callback(&fifo_timer), 0.040f);
 //    Timer tmr1;
     while (1) {
+            read_ppg();
         if (Time_to_Read_PPG) {
-            read_ppg();
         }
     }
 }
\ No newline at end of file