Mode1 Optical Validation

Dependencies:   max32630fthr

Revision:
32:92adfbe18ab6
Parent:
31:92e1bcdb7b1e
Child:
33:c8fbd904df3e
--- a/main.cpp	Fri Feb 04 02:43:50 2022 +0000
+++ b/main.cpp	Mon Mar 14 23:53:46 2022 +0000
@@ -37,7 +37,7 @@
 /******************************************************************************
 * https://os.mbed.com/users/phonemacro/code/MAX32664C_Example_Host_Code
 * Tera Term output is set to 115200 baud rate.
-* ver: 220203
+* ver: 220310
 ******************************************************************************/
 
 /******************************************************************************
@@ -51,9 +51,9 @@
 
 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
 // define one and only one of the following three platforms
-#define MAXM86146_CFG 1  // tested on MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR 33.13.12
+#define MAXM86146_CFG 1  // tested on MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR 33.13.31/12
 //#define MAXREFDES103_CFG  // not tested
-//#define MAXM86161_CFG 1  // tested on MAXM86161+MAX32630FTHR v32.9.22, 32.13.12
+//#define MAXM86161_CFG 1  // tested on MAXM86161+MAX32630FTHR v32.9.23, 32.13.12
 /*****************************************************************************/
 
 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
@@ -84,7 +84,7 @@
 #endif
 
 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
-//#define RAW  // define this if you only want AFE+accel data, no algorithm
+//#define RAW  // define this if you want AFE+accel data, no algorithm
 #define ALGO_ONLY 1  // define this if you only want algo data, comment out if you want raw sensor+algo data
 //#define EXTENDED_ALGO 1  // define this if you want the extended algo format
 //#define AGC 1 // define this for AGC, otherwise the default is AEC
@@ -94,7 +94,15 @@
 I2C sh_i2c_pmic(P5_7, P6_0);
 #endif
 
-#if defined(MAXM86161_CFG)
+#ifdef MAXM86146_CFG
+  #define PPG_SZ 36  //maxm86146
+#else
+  #define PPG_SZ 18  //maxm86161, max86141
+#endif
+#define ACCEL_SZ 6  // accel
+#define SENSOR_SZ (PPG_SZ+ACCEL_SZ)
+
+#if defined(MAXM86161_CFG) || defined(MAXM86146_CFG)  // MAXM86161, MAXM86146, keep algo Fifo size as 52, 20 to keep compatible w/ the GUI
 #define old_msbl 1 // 3x.12.0 or earlier; 32.9.x
 #endif
 
@@ -112,16 +120,6 @@
   #endif
 #endif
 
-
-#ifdef MAXM86146_CFG
-  #define PPG_SZ 36  //maxm86146
-#else
-  #define PPG_SZ 18  //maxm86161, max86141
-#endif
-#define ACCEL_SZ 6  // accel
-#define SENSOR_SZ (PPG_SZ+ACCEL_SZ)
-
-
 #ifdef ALGO_ONLY
   #define TTL_SZ (ALGO_SZ)
 #else
@@ -234,6 +232,7 @@
             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]);
 #ifdef MAXM86146_CFG
+#ifdef RAW
             pc.printf("%d,%d,", ppg[4], ppg[5]);
             ppg[6] = (rsp[ptr+18] << 16) | (rsp[ptr+19] << 8) | (rsp[ptr+20]);
             ppg[7] = (rsp[ptr+21] << 16) | (rsp[ptr+22] << 8) | (rsp[ptr+23]);
@@ -243,6 +242,7 @@
             ppg[11] = (rsp[ptr+33] << 16) | (rsp[ptr+34] << 8) | (rsp[ptr+35]);
             pc.printf("%d,%d,%d,%d,%d,%d,", ppg[6], ppg[7],ppg[8], ppg[9],ppg[10], ppg[11]);
 #endif
+#endif
             accel[0] = (rsp[PPG_SZ+0] << 8) | (rsp[PPG_SZ+1]);
             accel[1] = (rsp[PPG_SZ+2] << 8) | (rsp[PPG_SZ+3]);
             accel[2] = (rsp[PPG_SZ+4] << 8) | (rsp[PPG_SZ+5]);
@@ -424,7 +424,7 @@
     sh_i2c.read(SH_ADDR, rsp, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     pc.printf("\n\r 0x02 0x00 Status, Read Operating Mode: %x %x\n\r", rsp[0], rsp[1]);
-//1.11 rd ver
+//1.1 rd ver
     cmd[0] = 0xFF; cmd[1] = 0x03;
     sh_i2c.write(SH_ADDR, cmd, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
@@ -468,7 +468,7 @@
     pc.printf("pi set to 0x19 : %x \n\r", rsp[0]);
 #endif
 
-// 1.3 sensor and algo data
+// 1.2 sensor and algo data
     cmd[0] = 0x10; cmd[1] = 0x00;
 #ifdef ALGO_ONLY
     cmd[2] = 0x02;  // algo data
@@ -481,55 +481,62 @@
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.3 Status: %x\n\r", rsp[0]);
-// 1.8 AEC enable (default)
+    pc.printf("1.2 Status: %x\n\r", rsp[0]);
+// 1.5 cont hr, spo2
+    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00;
+    sh_i2c.write(SH_ADDR, cmd, 4);
+    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
+    sh_i2c.read(SH_ADDR, rsp, 1);
+    mfio = 1; mfio = 0; wait_us(300);
+    pc.printf("1.5 Status: %x\n\r", rsp[0]);
+// 1.6 AEC enable (default)
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; cmd[3] = 0x01;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.8 Status: %x\n\r", rsp[0]);
+    pc.printf("1.6 Status: %x\n\r", rsp[0]);
 #if AGC
-// AGC1.8 Disable auto PD (default
+// AGC1.7 Disable auto PD (default
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("AGC1.8 Status: %x\n\r", rsp[0]);
-// AGC1.9 Disable SCD (default)
+    pc.printf("AGC1.7 Status: %x\n\r", rsp[0]);
+// AGC1.8 Disable SCD (default)
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("AGC1.9 Status: %x\n\r", rsp[0]);
-// AGC1.10 Set AGC target PD TO 10uA
+    pc.printf("AGC1.8 Status: %x\n\r", rsp[0]);
+// AGC1.9 Set AGC target PD TO 10uA
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x11; cmd[3] = 0x00; cmd[3] = 0x64;
     sh_i2c.write(SH_ADDR, cmd, 5);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("AGC1.10 Status: %x\n\r", rsp[0]);
+    pc.printf("AGC1.9 Status: %x\n\r", rsp[0]);
 #else
-// 1.9 auto PD (default
+// 1.7 auto PD (default
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x01;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.9 Status: %x\n\r", rsp[0]);
-// 1.10 SCD (default)
+    pc.printf("1.7 Status: %x\n\r", rsp[0]);
+// 1.8 SCD (default)
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x01;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.7 Status: %x\n\r", rsp[0]);
+    pc.printf("1.8 Status: %x\n\r", rsp[0]);
 #endif
 
 #if defined(MAXM86161_CFG) //only use Red and IR
-//1.20 Sec 4.1  map leds to slots 
+//1.20   map leds to slots 
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x23; cmd[4] = 0x00; cmd[5] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 6);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
@@ -555,7 +562,7 @@
 #endif
 
 #ifdef MAXM86146_CFG
-//1.20 Sec 4.1  map leds to slots for MAXM86146
+//1.20   map leds to slots for MAXM86146
     cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x13; cmd[4] = 0x56; cmd[5] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 6);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
@@ -602,14 +609,6 @@
 #endif
 #endif // MAXM86146_CFG
 
-// 1.7 cont hr, spo2
-    cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00;
-    sh_i2c.write(SH_ADDR, cmd, 4);
-    mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    sh_i2c.read(SH_ADDR, rsp, 1);
-    mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("1.7 Status: %x\n\r", rsp[0]);
-
 #if 0  // MAXM86161 test new commands
 // LDO enable
     cmd[0] = 0x10; cmd[1] = 0x12; cmd[2] = 0x01;
@@ -628,7 +627,7 @@
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
 #endif
 
-// 1.3 Enable HR, SpO2 algo
+// 1.30 Enable HR, SpO2 algo
 #ifdef EXTENDED_ALGO
     cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x02;
 #else
@@ -678,14 +677,14 @@
 
     mfio = 0; wait_us(300);
 
-//read operating mode
+//1.0 read operating mode
     cmd[0] = 0x02; cmd[1] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     pc.printf("\n\r 0x02 0x00 Status, Read Operating Mode: %x %x\n\r", rsp[0], rsp[1]);
-//1.11 rd ver
+//1.1 rd ver
     cmd[0] = 0xFF; cmd[1] = 0x03;
     sh_i2c.write(SH_ADDR, cmd, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
@@ -693,30 +692,30 @@
     mfio = 1; mfio = 0; wait_us(300);
     pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]);
 
-// raw1.1 sensor data
+// raw1.2 sensor data
     cmd[0] = 0x10; cmd[1] = 0x00; cmd[2] = 0x01;
     pc.printf("raw sensor data only \n\r");
     sh_i2c.write(SH_ADDR, cmd, 3);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("raw1.1 Status: %x\n\r", rsp[0]);
-// raw1.2 interrupt threshold
+    pc.printf("raw1.2 Status: %x\n\r", rsp[0]);
+// raw1.3 interrupt threshold
     cmd[0] = 0x10; cmd[1] = 0x01; cmd[2] = 0x01;
     sh_i2c.write(SH_ADDR, cmd, 3);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("raw1.2 Status: %x\n\r", rsp[0]);
-// raw1.3 enable sh accel
+    pc.printf("raw1.3 Status: %x\n\r", rsp[0]);
+// raw1.4 enable sh accel
     cmd[0] = 0x44; cmd[1] = 0x04; cmd[2] = 0x01; cmd[3] = 0x00;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(20); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    pc.printf("raw1.3 Status: %x\n\r", rsp[0]);
-// raw1.4 enable AFE
-    cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01;  // 3 bytes // tested on 33.13.12, 33.13.19
+    pc.printf("raw1.4 Status: %x\n\r", rsp[0]);
+// raw1.6 enable AFE
+    cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01;  // 3 bytes // tested on 33.13.31/12
     sh_i2c.write(SH_ADDR, cmd, 3);
 //    cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00; 
 //    sh_i2c.write(SH_ADDR, cmd, 4);
@@ -725,54 +724,54 @@
     mfio = 1; thread_sleep_for(250); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    pc.printf("raw1.4 Status: %x\n\r", rsp[0]);
-#if 0
-// rd accel WHO reg
+    pc.printf("raw1.6 Status: %x\n\r", rsp[0]);
+
+// raw1.7 rd accel WHO reg
     cmd[0] = 0x41; cmd[1] = 0x04; cmd[2] = 0x0F;
     sh_i2c.write(SH_ADDR, cmd, 3);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    pc.printf("part id Status: %x %x\n\r", rsp[0], rsp[1]);
-// rd AFE part id
+    pc.printf("1.7 Who Status: %x %x\n\r", rsp[0], rsp[1]);
+// rd1.6  AFE part id
     cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF;
     sh_i2c.write(SH_ADDR, cmd, 3);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 2);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
-    pc.printf("part id Status: %x %x\n\r", rsp[0], rsp[1]);
-#endif
-// raw1.5 sample rate 100 Hz, ave 1
+    pc.printf("raw1.6 part id Status: %x %x\n\r", rsp[0], rsp[1]);
+
+// raw1.8 sample rate 100 Hz, ave 1
     cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x18;  // set AFE reg 0x12 to 100 Hz
 //    cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x20;  // set AFE reg 0x12 to 200 Hz
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("raw1.5 Status: %x\n\r", rsp[0]);
-// raw1.6 LED1 current
+    pc.printf("raw1.8 Status: %x\n\r", rsp[0]);
+// raw1.9 LED1 current
     cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x3F;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("raw1.6 Status: %x\n\r", rsp[0]);
+    pc.printf("raw1.9 Status: %x\n\r", rsp[0]);
 #ifndef MAXM86146_CFG
-// raw1.7 LED2 current
+// raw1.10 LED2 current
     cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x7F;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("raw1.7 Status: %x\n\r", rsp[0]);
+    pc.printf("raw1.10 Status: %x\n\r", rsp[0]);
 #endif
-// raw1.8 LED3 current
+// raw1.11 LED3 current
     cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x7F;
     sh_i2c.write(SH_ADDR, cmd, 4);
     mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
     sh_i2c.read(SH_ADDR, rsp, 1);
     mfio = 1; mfio = 0; wait_us(300);
-    pc.printf("raw1.8 Status: %x\n\r", rsp[0]);
+    pc.printf("raw1.11 Status: %x\n\r", rsp[0]);
 #ifdef MAXM86146_CFG
 //       LED5 current
     cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x27; cmd[3] = 0x7F;