Mode1 Optical Validation

Dependencies:   max32630fthr

Committer:
phonemacro
Date:
Tue May 03 02:06:40 2022 +0000
Revision:
50:dd2f60ab5686
Parent:
49:ead542a403a3
Child:
51:e2214db671c0
Updated Raw Data Report (no algo) for 25 Hz to 200 Hz

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phonemacro 0:6f65cae31c54 1 /*******************************************************************************
phonemacro 30:77a30ea425da 2 * Copyright (C) 2021-22 Maxim Integrated Products, Inc., All Rights Reserved.
phonemacro 0:6f65cae31c54 3 *
phonemacro 0:6f65cae31c54 4 * Permission is hereby granted, free of charge, to any person obtaining a
phonemacro 0:6f65cae31c54 5 * copy of this software and associated documentation files (the "Software"),
phonemacro 0:6f65cae31c54 6 * to deal in the Software without restriction, including without limitation
phonemacro 0:6f65cae31c54 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
phonemacro 0:6f65cae31c54 8 * and/or sell copies of the Software, and to permit persons to whom the
phonemacro 0:6f65cae31c54 9 * Software is furnished to do so, subject to the following conditions:
phonemacro 0:6f65cae31c54 10 *
phonemacro 0:6f65cae31c54 11 * The above copyright notice and this permission notice shall be included
phonemacro 0:6f65cae31c54 12 * in all copies or substantial portions of the Software.
phonemacro 0:6f65cae31c54 13 *
phonemacro 0:6f65cae31c54 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
phonemacro 0:6f65cae31c54 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
phonemacro 0:6f65cae31c54 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
phonemacro 0:6f65cae31c54 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
phonemacro 0:6f65cae31c54 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
phonemacro 0:6f65cae31c54 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
phonemacro 0:6f65cae31c54 20 * OTHER DEALINGS IN THE SOFTWARE.
phonemacro 0:6f65cae31c54 21 *
phonemacro 0:6f65cae31c54 22 * Except as contained in this notice, the name of Maxim Integrated
phonemacro 0:6f65cae31c54 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
phonemacro 0:6f65cae31c54 24 * Products, Inc. Branding Policy.
phonemacro 0:6f65cae31c54 25 *
phonemacro 0:6f65cae31c54 26 * The mere transfer of this software does not imply any licenses
phonemacro 0:6f65cae31c54 27 * of trade secrets, proprietary technology, copyrights, patents,
phonemacro 0:6f65cae31c54 28 * trademarks, maskwork rights, or any other form of intellectual
phonemacro 0:6f65cae31c54 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
phonemacro 0:6f65cae31c54 30 * ownership rights.
phonemacro 0:6f65cae31c54 31 *******************************************************************************
phonemacro 0:6f65cae31c54 32 */
phonemacro 0:6f65cae31c54 33
phonemacro 0:6f65cae31c54 34 #include "mbed.h"
phonemacro 0:6f65cae31c54 35 #include "platform/mbed_thread.h"
phonemacro 3:da975696b936 36 #include "mbed.h"
phonemacro 4:4f1e9439f048 37 /******************************************************************************
phonemacro 16:ff1122f0624a 38 * https://os.mbed.com/users/phonemacro/code/MAX32664C_Example_Host_Code
phonemacro 16:ff1122f0624a 39 * Tera Term output is set to 115200 baud rate.
phonemacro 46:553559610878 40 * ver: 220429
phonemacro 16:ff1122f0624a 41 ******************************************************************************/
phonemacro 16:ff1122f0624a 42
phonemacro 16:ff1122f0624a 43 /******************************************************************************
phonemacro 4:4f1e9439f048 44 * Warning, if using the either
phonemacro 4:4f1e9439f048 45 * MAX32630FTHR+MAXM86161_ADPTER_REVB+MAXM86146EVSYS sensor brd or
phonemacro 4:4f1e9439f048 46 * MAX32630FTHR+MAXM86161_ADPTER_REVB+MAXM86161EVSYS sensor brd,
phonemacro 4:4f1e9439f048 47 * The VLED is connected to USB power which is noisy. The VLED should be
phonemacro 4:4f1e9439f048 48 * connected to a regulated power supply if you are testing accuracy.
phonemacro 4:4f1e9439f048 49 *******************************************************************************
phonemacro 4:4f1e9439f048 50 */
phonemacro 5:7f5a012747a5 51
phonemacro 24:064478ff33d2 52 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
phonemacro 6:e1b7190d6cb5 53 // define one and only one of the following three platforms
phonemacro 46:553559610878 54 #define MAXM86146_CFG 1 // tested on MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR 33.13.12
phonemacro 21:67d58af1ec56 55 //#define MAXREFDES103_CFG // not tested
phonemacro 46:553559610878 56 //#define MAXM86161_CFG 1 // tested on MAXM86161+MAX32630FTHR v32.9.22, 32.13.12
phonemacro 6:e1b7190d6cb5 57 /*****************************************************************************/
phonemacro 24:064478ff33d2 58
phonemacro 24:064478ff33d2 59 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
phonemacro 24:064478ff33d2 60 // define which adaptor board is being used
phonemacro 26:33c0d3fd2a95 61 #define MAXM86161_ADPTR_EVKIT_B
phonemacro 26:33c0d3fd2a95 62 //#define MAXREFDES1319 // MAXM86161: Remove J7; For PIN1=ACC_INTN, J9 set to 2-3; For PIN13=OPT_INTN, J10 set to 2-3
phonemacro 24:064478ff33d2 63 /******************************************************************************
phonemacro 24:064478ff33d2 64 * MAX32630FTHR GPIOs
phonemacro 24:064478ff33d2 65 ******************************************************************************/
phonemacro 24:064478ff33d2 66 #ifdef MAXM86161_ADPTR_EVKIT_B
phonemacro 24:064478ff33d2 67 #define RST_PIN P5_6
phonemacro 24:064478ff33d2 68 #define MFIO_PIN P5_4
phonemacro 24:064478ff33d2 69 #else
phonemacro 24:064478ff33d2 70 #ifdef MAXREFDES1319
phonemacro 24:064478ff33d2 71 #define RST_PIN P3_0
phonemacro 24:064478ff33d2 72 #define MFIO_PIN P5_2
phonemacro 24:064478ff33d2 73 #endif
phonemacro 24:064478ff33d2 74 #endif
phonemacro 24:064478ff33d2 75
phonemacro 24:064478ff33d2 76 DigitalOut rst(RST_PIN, PullUp);
phonemacro 24:064478ff33d2 77 DigitalOut mfio(MFIO_PIN, PullUp);
phonemacro 24:064478ff33d2 78 I2C sh_i2c(P3_4, P3_5);
phonemacro 24:064478ff33d2 79
phonemacro 24:064478ff33d2 80 /*****************************************************************************/
phonemacro 26:33c0d3fd2a95 81 #if defined(MAXM86161_CFG) //|| defined(MAXM86146_CFG) // don't need 3.3V for MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR
phonemacro 17:0d6e99a0fd8d 82 #include "max32630fthr.h"
phonemacro 17:0d6e99a0fd8d 83 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); // Enable J1-pin2, 3.3V and set GPIO to 3.3v
phonemacro 21:67d58af1ec56 84 #endif
phonemacro 26:33c0d3fd2a95 85
phonemacro 26:33c0d3fd2a95 86 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
phonemacro 50:dd2f60ab5686 87 // comment the two below if you want raw sensor+algo data
phonemacro 50:dd2f60ab5686 88 #define ALGO_ONLY 1 // define this if you only want algo data
phonemacro 46:553559610878 89 //#define RAW // define this if you want AFE+accel data, no algorithm, tested on 33.13.31
phonemacro 50:dd2f60ab5686 90 //#define RAW_HZ 25 // Raw data rate
phonemacro 50:dd2f60ab5686 91 #define RAW_HZ 50 // Raw data rate
phonemacro 50:dd2f60ab5686 92 //#define RAW_HZ 100 // Raw data rate
phonemacro 50:dd2f60ab5686 93 //#define RAW_HZ 200 // Raw data rate
phonemacro 50:dd2f60ab5686 94 //#define RAW_HZ 2004 // Raw data rate 200 Hz, ave 4
phonemacro 49:ead542a403a3 95 //#define SPO2_CAL_RPT 1
phonemacro 33:c8fbd904df3e 96
phonemacro 33:c8fbd904df3e 97 // Comment out both of the below for Normal Algorithm Samples Format
phonemacro 33:c8fbd904df3e 98 //#define EXTENDED_ALGO 1 // define this if you want the extended algo samples report format
phonemacro 35:67699bdae57e 99 //#define PACKED_NORMAL_ALGO 1 // define this if you want the packed normal algo samples report format, 33.13.31
phonemacro 45:d26b8bcce561 100 //#define PCK_CFG_MASK 1 // define this and the above if you want to config mask out some of the packed data, 33.13.31
phonemacro 13:1baccc6275a7 101 //#define AGC 1 // define this for AGC, otherwise the default is AEC
phonemacro 6:e1b7190d6cb5 102
phonemacro 50:dd2f60ab5686 103 #define USE_SYN 1
phonemacro 42:6f980909371f 104
phonemacro 42:6f980909371f 105 //#define REDUCE_RPT_PERIOD 0x19 // Report samples every 25 frame.
phonemacro 45:d26b8bcce561 106 //#define USE_FIFO_BUFFER_CNT 5 // Allow the FIFO to accumulate this many samples
phonemacro 42:6f980909371f 107
phonemacro 6:e1b7190d6cb5 108 #ifdef MAXREFDES103_CFG
phonemacro 5:7f5a012747a5 109 #include "MAX20303.h"
phonemacro 6:e1b7190d6cb5 110 I2C sh_i2c_pmic(P5_7, P6_0);
phonemacro 5:7f5a012747a5 111 #endif
phonemacro 5:7f5a012747a5 112
phonemacro 32:92adfbe18ab6 113 #ifdef MAXM86146_CFG
phonemacro 32:92adfbe18ab6 114 #define PPG_SZ 36 //maxm86146
phonemacro 32:92adfbe18ab6 115 #else
phonemacro 32:92adfbe18ab6 116 #define PPG_SZ 18 //maxm86161, max86141
phonemacro 32:92adfbe18ab6 117 #endif
phonemacro 32:92adfbe18ab6 118 #define ACCEL_SZ 6 // accel
phonemacro 32:92adfbe18ab6 119 #define SENSOR_SZ (PPG_SZ+ACCEL_SZ)
phonemacro 32:92adfbe18ab6 120
phonemacro 32:92adfbe18ab6 121 #if defined(MAXM86161_CFG) || defined(MAXM86146_CFG) // MAXM86161, MAXM86146, keep algo Fifo size as 52, 20 to keep compatible w/ the GUI
phonemacro 33:c8fbd904df3e 122 #define old_algo_sz 1 // 3x.12.0 or earlier; 32.9.x
phonemacro 28:315604f4b374 123 #endif
phonemacro 30:77a30ea425da 124
phonemacro 33:c8fbd904df3e 125 #ifdef old_algo_sz
phonemacro 18:f4c95b1c0efc 126 #ifdef EXTENDED_ALGO
phonemacro 33:c8fbd904df3e 127 #define ALGO_SZ 52 // 52 bytes, extended algo size for 3x.12.0
phonemacro 33:c8fbd904df3e 128 #elif defined(PACKED_NORMAL_ALGO)
phonemacro 33:c8fbd904df3e 129 #define ALGO_SZ 16 // 16 bytes, packed algo normal size for 33.31.31
phonemacro 18:f4c95b1c0efc 130 #else
phonemacro 42:6f980909371f 131 #define ALGO_SZ 20 // 20 bytes, normal algo size for 3x.12.0
phonemacro 18:f4c95b1c0efc 132 #endif
phonemacro 12:17a0bf823462 133 #else
phonemacro 18:f4c95b1c0efc 134 #ifdef EXTENDED_ALGO
phonemacro 33:c8fbd904df3e 135 #define ALGO_SZ 56 // 56 bytes, extended algo size for 3x.13.x+
phonemacro 18:f4c95b1c0efc 136 #else
phonemacro 33:c8fbd904df3e 137 #define ALGO_SZ 24 // 24 bytes, normal algo size for 3x.13.x+
phonemacro 18:f4c95b1c0efc 138 #endif
phonemacro 12:17a0bf823462 139 #endif
phonemacro 18:f4c95b1c0efc 140
phonemacro 0:6f65cae31c54 141 #ifdef ALGO_ONLY
phonemacro 0:6f65cae31c54 142 #define TTL_SZ (ALGO_SZ)
phonemacro 0:6f65cae31c54 143 #else
phonemacro 14:c8cc6d7fd5f9 144 #ifdef RAW
phonemacro 14:c8cc6d7fd5f9 145 #define TTL_SZ (PPG_SZ+ACCEL_SZ)
phonemacro 14:c8cc6d7fd5f9 146 #else
phonemacro 14:c8cc6d7fd5f9 147 #define TTL_SZ (PPG_SZ+ACCEL_SZ+ALGO_SZ)
phonemacro 14:c8cc6d7fd5f9 148 #endif
phonemacro 0:6f65cae31c54 149 #endif
phonemacro 0:6f65cae31c54 150
phonemacro 3:da975696b936 151 Serial pc(USBTX, USBRX, 115200);
phonemacro 0:6f65cae31c54 152 DigitalOut rLED(LED1);
phonemacro 0:6f65cae31c54 153 DigitalOut gLED(LED2);
phonemacro 0:6f65cae31c54 154 DigitalOut bLED(LED3);
phonemacro 6:e1b7190d6cb5 155
phonemacro 33:c8fbd904df3e 156 int32_t heading_printed; // has the heading been printed?
phonemacro 33:c8fbd904df3e 157
phonemacro 33:c8fbd904df3e 158
phonemacro 6:e1b7190d6cb5 159 //#define thread_sleep_for(x) wait_ms(x) // for older versions of mbed
phonemacro 0:6f65cae31c54 160
phonemacro 5:7f5a012747a5 161
phonemacro 6:e1b7190d6cb5 162 const int SH_ADDR = 0xAA;//0x55;
phonemacro 0:6f65cae31c54 163 int32_t Time_to_Read_PPG = 0;
phonemacro 0:6f65cae31c54 164
phonemacro 0:6f65cae31c54 165 #define BLINKING_RATE_MS 1000ms
phonemacro 0:6f65cae31c54 166 void blink_timer(void) {
phonemacro 0:6f65cae31c54 167 gLED = !gLED; /* blink the green LED */
phonemacro 0:6f65cae31c54 168 }
phonemacro 0:6f65cae31c54 169
phonemacro 0:6f65cae31c54 170 void fifo_timer(void) {
phonemacro 0:6f65cae31c54 171 Time_to_Read_PPG = 1;
phonemacro 0:6f65cae31c54 172 }
phonemacro 0:6f65cae31c54 173
phonemacro 14:c8cc6d7fd5f9 174 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 175 // read_sh_fifo
phonemacro 14:c8cc6d7fd5f9 176 /*****************************************************************************/
phonemacro 27:a45d6e38f2de 177 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
phonemacro 28:315604f4b374 178 #define OPTIMIZE_FIFO_READ 1 // Assume that the FIFO is filled at the specified rate, so just periodically check then number of samples in the FIFO to save power
phonemacro 27:a45d6e38f2de 179 #ifdef OPTIMIZE_FIFO_READ // tested on MAXM86146EVSYS
phonemacro 27:a45d6e38f2de 180 int32_t check_fifo_countdown;
phonemacro 42:6f980909371f 181 #define MAX_FIFO_CNT 20 // Only send the 0x00 0x00 (step 2.0), and 0x12 0x00 (step 2.1) commands every MAX_FIFO_CNT frames.
phonemacro 27:a45d6e38f2de 182 #endif
phonemacro 42:6f980909371f 183
phonemacro 10:192ea88e964b 184 void read_sh_fifo(void) {
phonemacro 33:c8fbd904df3e 185 char cmd[8], i, j, k, samples;
phonemacro 0:6f65cae31c54 186 char rsp[3000];
phonemacro 0:6f65cae31c54 187 int32_t ppg[12];
phonemacro 5:7f5a012747a5 188 int16_t accel[3];
phonemacro 33:c8fbd904df3e 189 int32_t tst[20];
phonemacro 12:17a0bf823462 190 int32_t status, opmode, hr, hr_conf, ibi, ibi_conf;
phonemacro 12:17a0bf823462 191 #ifdef EXTENDED_ALGO
phonemacro 12:17a0bf823462 192 int32_t walk_stp, run_stp, energy, amr, iadj1_rqt, iadj1, iadj2_rqt, iadj2, iadj3_rqt, iadj3;
phonemacro 12:17a0bf823462 193 int32_t intadj_rqt, intadj, smpladj_rqt, smpladj, rqt_smplave, afestatehr, hr_motion;
phonemacro 12:17a0bf823462 194 #endif
phonemacro 12:17a0bf823462 195 int32_t act, r, spo2, spo2_conf;
phonemacro 33:c8fbd904df3e 196 int32_t spo2_compl, spo2_lo, spo2_mo, spo2_lopi, spo2_unrel, spo2_state, ibi_offset, scd, inappro_ori;
phonemacro 0:6f65cae31c54 197 int32_t ptr = 0;
phonemacro 0:6f65cae31c54 198 int32_t sptr = 0;
phonemacro 1:da792e46a385 199 mfio = 0; wait_us(300);
phonemacro 0:6f65cae31c54 200 Time_to_Read_PPG = 0;
phonemacro 42:6f980909371f 201 samples = 1;
phonemacro 42:6f980909371f 202 #ifdef USE_FIFO_BUFFER_CNT
phonemacro 42:6f980909371f 203 samples = USE_FIFO_BUFFER_CNT;
phonemacro 42:6f980909371f 204 #endif
phonemacro 27:a45d6e38f2de 205 #if defined(OPTIMIZE_FIFO_READ)
phonemacro 27:a45d6e38f2de 206 check_fifo_countdown--;
phonemacro 27:a45d6e38f2de 207 if (check_fifo_countdown == 0) {
phonemacro 27:a45d6e38f2de 208 #endif
phonemacro 27:a45d6e38f2de 209
phonemacro 22:f6b366c3b954 210 #if defined(MAXREFDES103_CFG) || defined(MAXM86161_CFG)
phonemacro 0:6f65cae31c54 211 // 2.1
phonemacro 27:a45d6e38f2de 212 cmd[0] = 0x00; cmd[1] = 0x00;
phonemacro 27:a45d6e38f2de 213 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 27:a45d6e38f2de 214 wait_us(100);
phonemacro 27:a45d6e38f2de 215 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 27:a45d6e38f2de 216 // pc.printf("2.1 Status: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 22:f6b366c3b954 217 #else
phonemacro 45:d26b8bcce561 218 // tested w/ 33.13.12 don't need 2.1
phonemacro 0:6f65cae31c54 219 #endif
phonemacro 0:6f65cae31c54 220 // 2.2
phonemacro 50:dd2f60ab5686 221 #if defined(PACKED_NORMAL_ALGO) || defined(USE_SYN)
phonemacro 35:67699bdae57e 222 cmd[0] = 0x20;
phonemacro 35:67699bdae57e 223 sh_i2c.write(SH_ADDR, cmd, 1);
phonemacro 35:67699bdae57e 224 #else
phonemacro 27:a45d6e38f2de 225 cmd[0] = 0x12; cmd[1] = 0x00;
phonemacro 27:a45d6e38f2de 226 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 35:67699bdae57e 227 #endif
phonemacro 27:a45d6e38f2de 228 wait_us(100);
phonemacro 27:a45d6e38f2de 229 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 35:67699bdae57e 230 // mfio = 1; mfio = 0; wait_us(300);
phonemacro 35:67699bdae57e 231
phonemacro 27:a45d6e38f2de 232 // pc.printf("2.2 Status: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 27:a45d6e38f2de 233 samples = rsp[1];
phonemacro 27:a45d6e38f2de 234 // pc.printf("num samples %d, (num*ttl)+1 %d\n\r", rsp[1], TTL_SZ*samples+1);
phonemacro 27:a45d6e38f2de 235 // pc.printf("num smpls %d \n\r", samples);
phonemacro 27:a45d6e38f2de 236 #if defined(OPTIMIZE_FIFO_READ)
phonemacro 27:a45d6e38f2de 237 }
phonemacro 27:a45d6e38f2de 238 if (check_fifo_countdown <= 0)
phonemacro 27:a45d6e38f2de 239 check_fifo_countdown = MAX_FIFO_CNT;
phonemacro 27:a45d6e38f2de 240 #endif
phonemacro 27:a45d6e38f2de 241
phonemacro 0:6f65cae31c54 242 // 2.3
phonemacro 50:dd2f60ab5686 243 #if defined(PACKED_NORMAL_ALGO) || defined(USE_SYN)
phonemacro 35:67699bdae57e 244 cmd[0] = 0x21;;
phonemacro 35:67699bdae57e 245 sh_i2c.write(SH_ADDR, cmd, 1);
phonemacro 35:67699bdae57e 246 #else
phonemacro 45:d26b8bcce561 247 cmd[0] = 0x12; cmd[1] = 0x01;
phonemacro 45:d26b8bcce561 248 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 35:67699bdae57e 249 #endif
phonemacro 45:d26b8bcce561 250 wait_us(100);
phonemacro 45:d26b8bcce561 251 sh_i2c.read(SH_ADDR, rsp, 1+(TTL_SZ*samples));
phonemacro 42:6f980909371f 252 //pc.printf("num smpls %d ttlsiz %d\n\r", samples, TTL_SZ);
phonemacro 35:67699bdae57e 253 // mfio = 1; mfio = 0; wait_us(300);
phonemacro 45:d26b8bcce561 254 mfio = 1;
phonemacro 21:67d58af1ec56 255
phonemacro 0:6f65cae31c54 256 status = rsp[0];
phonemacro 5:7f5a012747a5 257
phonemacro 0:6f65cae31c54 258 sptr = 1;
phonemacro 42:6f980909371f 259 for (i = 0; i < samples; i++) {
phonemacro 0:6f65cae31c54 260 ptr = sptr;
phonemacro 35:67699bdae57e 261 #if !defined(ALGO_ONLY)
phonemacro 2:563d90a111b3 262 ppg[0] = (rsp[ptr+0] << 16) | (rsp[ptr+1] << 8) | (rsp[ptr+2]);
phonemacro 2:563d90a111b3 263 ppg[1] = (rsp[ptr+3] << 16) | (rsp[ptr+4] << 8) | (rsp[ptr+5]);
phonemacro 2:563d90a111b3 264 ppg[2] = (rsp[ptr+6] << 16) | (rsp[ptr+7] << 8) | (rsp[ptr+8]);
phonemacro 3:da975696b936 265 ppg[3] = (rsp[ptr+9] << 16) | (rsp[ptr+10] << 8) | (rsp[ptr+11]);
phonemacro 4:4f1e9439f048 266 ppg[4] = (rsp[ptr+12] << 16) | (rsp[ptr+13] << 8) | (rsp[ptr+14]);
phonemacro 4:4f1e9439f048 267 ppg[5] = (rsp[ptr+15] << 16) | (rsp[ptr+16] << 8) | (rsp[ptr+17]);
phonemacro 3:da975696b936 268 pc.printf("%d,%d,%d,%d,", ppg[0], ppg[1], ppg[2], ppg[3]);
phonemacro 47:346a13fbdc0f 269 #if defined(RAW) || defined(SPO2_CAL_RPT)
phonemacro 50:dd2f60ab5686 270 #if RAW_HZ <= 100
phonemacro 50:dd2f60ab5686 271 pc.printf("%d,%d,", ppg[4], ppg[5]);
phonemacro 50:dd2f60ab5686 272 #endif
phonemacro 47:346a13fbdc0f 273 #endif
phonemacro 14:c8cc6d7fd5f9 274 #ifdef MAXM86146_CFG
phonemacro 47:346a13fbdc0f 275 #if defined(RAW) || defined(SPO2_CAL_RPT)
phonemacro 14:c8cc6d7fd5f9 276 ppg[6] = (rsp[ptr+18] << 16) | (rsp[ptr+19] << 8) | (rsp[ptr+20]);
phonemacro 14:c8cc6d7fd5f9 277 ppg[7] = (rsp[ptr+21] << 16) | (rsp[ptr+22] << 8) | (rsp[ptr+23]);
phonemacro 14:c8cc6d7fd5f9 278 ppg[8] = (rsp[ptr+24] << 16) | (rsp[ptr+25] << 8) | (rsp[ptr+26]);
phonemacro 14:c8cc6d7fd5f9 279 ppg[9] = (rsp[ptr+27] << 16) | (rsp[ptr+28] << 8) | (rsp[ptr+29]);
phonemacro 14:c8cc6d7fd5f9 280 ppg[10] = (rsp[ptr+30] << 16) | (rsp[ptr+31] << 8) | (rsp[ptr+32]);
phonemacro 14:c8cc6d7fd5f9 281 ppg[11] = (rsp[ptr+33] << 16) | (rsp[ptr+34] << 8) | (rsp[ptr+35]);
phonemacro 50:dd2f60ab5686 282 #if RAW_HZ <= 100
phonemacro 14:c8cc6d7fd5f9 283 pc.printf("%d,%d,%d,%d,%d,%d,", ppg[6], ppg[7],ppg[8], ppg[9],ppg[10], ppg[11]);
phonemacro 50:dd2f60ab5686 284 #endif
phonemacro 36:a6e7ff9c87a0 285 #endif // raw
phonemacro 36:a6e7ff9c87a0 286 #endif // MAXM86146_CFG
phonemacro 44:1b165a68474d 287 accel[0] = (rsp[1+PPG_SZ+0] << 8) | (rsp[1+PPG_SZ+1]);
phonemacro 44:1b165a68474d 288 accel[1] = (rsp[1+PPG_SZ+2] << 8) | (rsp[1+PPG_SZ+3]);
phonemacro 44:1b165a68474d 289 accel[2] = (rsp[1+PPG_SZ+4] << 8) | (rsp[1+PPG_SZ+5]);
phonemacro 5:7f5a012747a5 290 pc.printf("%d,%d,%d,", accel[0], accel[1], accel[2]);
phonemacro 5:7f5a012747a5 291
phonemacro 0:6f65cae31c54 292 ptr = sptr + SENSOR_SZ;
phonemacro 36:a6e7ff9c87a0 293
phonemacro 36:a6e7ff9c87a0 294 #endif //!defined(ALGO_ONLY)
phonemacro 29:a7dd81450b35 295
phonemacro 14:c8cc6d7fd5f9 296 #ifndef RAW
phonemacro 12:17a0bf823462 297 #ifdef EXTENDED_ALGO
phonemacro 45:d26b8bcce561 298 // pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ);
phonemacro 0:6f65cae31c54 299 opmode = rsp[ptr];
phonemacro 0:6f65cae31c54 300 hr = (rsp[ptr+1] << 8) + rsp[ptr+2];
phonemacro 0:6f65cae31c54 301 hr_conf = rsp[ptr+3];
phonemacro 12:17a0bf823462 302 ibi = (rsp[ptr+4] << 8) + rsp[ptr+5];
phonemacro 12:17a0bf823462 303
phonemacro 12:17a0bf823462 304 ibi_conf = rsp[ptr+6];
phonemacro 12:17a0bf823462 305 act = rsp[ptr+7];
phonemacro 12:17a0bf823462 306 walk_stp = (rsp[ptr+8] << 24) + (rsp[ptr+9] << 16) + (rsp[ptr+10] << 8) + rsp[ptr+11];
phonemacro 12:17a0bf823462 307 run_stp = (rsp[ptr+12] << 24) + (rsp[ptr+13] << 16) + (rsp[ptr+14] << 8) + rsp[ptr+15];
phonemacro 12:17a0bf823462 308
phonemacro 12:17a0bf823462 309 energy = (rsp[ptr+16] << 24) + (rsp[ptr+17] << 16) + (rsp[ptr+18] << 8) + rsp[ptr+19];
phonemacro 12:17a0bf823462 310 amr = (rsp[ptr+20] << 24) + (rsp[ptr+21] << 16) + (rsp[ptr+22] << 8) + rsp[ptr+23];
phonemacro 12:17a0bf823462 311 iadj1_rqt = rsp[ptr+24];
phonemacro 12:17a0bf823462 312 iadj1 = (rsp[ptr+25] << 8) + rsp[ptr+26];
phonemacro 12:17a0bf823462 313
phonemacro 12:17a0bf823462 314 iadj2_rqt = rsp[ptr+27];
phonemacro 12:17a0bf823462 315 iadj2 = (rsp[ptr+28] << 8) + rsp[ptr+29];
phonemacro 12:17a0bf823462 316 iadj3_rqt = rsp[ptr+30];
phonemacro 12:17a0bf823462 317 iadj3 = (rsp[ptr+31] << 8) + rsp[ptr+32];
phonemacro 12:17a0bf823462 318
phonemacro 12:17a0bf823462 319 intadj_rqt = rsp[ptr+33];
phonemacro 12:17a0bf823462 320 intadj = rsp[ptr+34];
phonemacro 12:17a0bf823462 321 smpladj_rqt = rsp[ptr+35];
phonemacro 12:17a0bf823462 322 smpladj = rsp[ptr+36];
phonemacro 12:17a0bf823462 323
phonemacro 12:17a0bf823462 324 rqt_smplave = rsp[ptr+37];
phonemacro 12:17a0bf823462 325 afestatehr = rsp[ptr+38];
phonemacro 12:17a0bf823462 326 hr_motion = rsp[ptr+39];
phonemacro 12:17a0bf823462 327 scd = rsp[ptr+40];
phonemacro 12:17a0bf823462 328
phonemacro 12:17a0bf823462 329
phonemacro 12:17a0bf823462 330 r = (rsp[ptr+41] << 8) + rsp[ptr+42];
phonemacro 12:17a0bf823462 331 spo2_conf = rsp[ptr+43];
phonemacro 12:17a0bf823462 332
phonemacro 12:17a0bf823462 333 spo2 = (rsp[ptr+44] << 8) + rsp[ptr+45];
phonemacro 12:17a0bf823462 334 spo2_compl = rsp[ptr+46];
phonemacro 12:17a0bf823462 335 spo2_lo = rsp[ptr+47];
phonemacro 12:17a0bf823462 336 spo2_mo = rsp[ptr+48];
phonemacro 12:17a0bf823462 337
phonemacro 12:17a0bf823462 338 spo2_lopi = rsp[ptr+49];
phonemacro 12:17a0bf823462 339 spo2_unrel = rsp[ptr+50];
phonemacro 12:17a0bf823462 340 spo2_state = rsp[ptr+51];
phonemacro 12:17a0bf823462 341
phonemacro 12:17a0bf823462 342 ibi_offset = rsp[ptr+52];
phonemacro 12:17a0bf823462 343
phonemacro 12:17a0bf823462 344 sptr += (TTL_SZ);
phonemacro 36:a6e7ff9c87a0 345
phonemacro 12:17a0bf823462 346 #if 1
phonemacro 33:c8fbd904df3e 347 if (heading_printed == 0) {
phonemacro 33:c8fbd904df3e 348 heading_printed = 1;
phonemacro 36:a6e7ff9c87a0 349 #if defined(ALGO_ONLY)
phonemacro 33:c8fbd904df3e 350 pc.printf("opmode,hr,hr_conf,ibi,ibi_conf,act,walk_stp,run_stp,energy,amr,");
phonemacro 33:c8fbd904df3e 351 pc.printf("iadj1_rqt,iadj1,iadj2_rqt,iadj2,iadj3_rqt,iadj3,intadj_rqt,intadj,");
phonemacro 33:c8fbd904df3e 352 pc.printf("smpladj_rqt,smpladj,rqt_smplave,afestatehr,hr_motion,scd,");
phonemacro 33:c8fbd904df3e 353 pc.printf("spo2,spo2_compl,spo2_lo,spo2_mo,spo2_lopi,spo2_unrel,spo2_state,ibi_offset,\n\r");
phonemacro 36:a6e7ff9c87a0 354 #endif
phonemacro 33:c8fbd904df3e 355 }
phonemacro 12:17a0bf823462 356 pc.printf("%d,%d,%d,%d,", opmode, hr, hr_conf, ibi);
phonemacro 12:17a0bf823462 357 pc.printf("%d,%d,", ibi_conf, act);
phonemacro 12:17a0bf823462 358 pc.printf("%d,%d,%d,", walk_stp, run_stp, energy);
phonemacro 12:17a0bf823462 359 pc.printf("%d,%d,%d,%d,", amr, iadj1_rqt, iadj1, iadj2_rqt);
phonemacro 12:17a0bf823462 360 pc.printf("%d,%d,%d,%d,", iadj2, iadj3_rqt, iadj3, intadj_rqt);
phonemacro 12:17a0bf823462 361 pc.printf("%d,%d,%d,%d,", intadj, smpladj_rqt, smpladj, rqt_smplave);
phonemacro 12:17a0bf823462 362 pc.printf("%d,%d,", afestatehr, hr_motion);
phonemacro 12:17a0bf823462 363 pc.printf("%d,", scd);
phonemacro 12:17a0bf823462 364 pc.printf("%d,%d,%d,%d,", spo2, spo2_compl, spo2_lo, spo2_mo);
phonemacro 12:17a0bf823462 365 pc.printf("%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state);
phonemacro 12:17a0bf823462 366 pc.printf("%d,", ibi_offset);
phonemacro 12:17a0bf823462 367 #else
phonemacro 33:c8fbd904df3e 368 if (heading_printed == 0) {
phonemacro 33:c8fbd904df3e 369 heading_printed = 1;
phonemacro 36:a6e7ff9c87a0 370 #if defined(ALGO_ONLY)
phonemacro 33:c8fbd904df3e 371 pc.printf("hr,hr_conf,spo2,spo2_conf,spo2_lo,spo2_unrel,scd,\n\r");
phonemacro 36:a6e7ff9c87a0 372 #endif
phonemacro 33:c8fbd904df3e 373 }
phonemacro 12:17a0bf823462 374 pc.printf("%d,%d,", hr, hr_conf);
phonemacro 12:17a0bf823462 375 pc.printf("%d,%d,", spo2, spo2_conf);
phonemacro 16:ff1122f0624a 376 pc.printf("%d,%d,%d,", spo2_lo, spo2_mo, spo2_lopi);
phonemacro 12:17a0bf823462 377 pc.printf("%d,%d,", spo2_unrel, scd);
phonemacro 36:a6e7ff9c87a0 378 #endif // if 1
phonemacro 33:c8fbd904df3e 379 #elif defined(PACKED_NORMAL_ALGO)
phonemacro 33:c8fbd904df3e 380 // pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ);
phonemacro 35:67699bdae57e 381 opmode = rsp[ptr];
phonemacro 33:c8fbd904df3e 382 hr = (rsp[ptr+1] << 8) + rsp[ptr+2];
phonemacro 33:c8fbd904df3e 383 hr_conf = rsp[ptr+3];
phonemacro 33:c8fbd904df3e 384 ibi = (rsp[ptr+4] << 8) + rsp[ptr+5];
phonemacro 33:c8fbd904df3e 385
phonemacro 33:c8fbd904df3e 386 ibi_conf = rsp[ptr+6];
phonemacro 33:c8fbd904df3e 387 // act = rsp[ptr+7];
phonemacro 33:c8fbd904df3e 388 r = (rsp[ptr+7] << 8) + rsp[ptr+8];
phonemacro 33:c8fbd904df3e 389 spo2_conf = rsp[ptr+9];
phonemacro 33:c8fbd904df3e 390
phonemacro 33:c8fbd904df3e 391 spo2 = (rsp[ptr+10] << 8) + rsp[ptr+11];
phonemacro 33:c8fbd904df3e 392 spo2_compl = rsp[ptr+12];
phonemacro 33:c8fbd904df3e 393
phonemacro 33:c8fbd904df3e 394 spo2_lo = 0; spo2_mo = 0; spo2_lopi = 0; spo2_unrel = 0;
phonemacro 33:c8fbd904df3e 395
phonemacro 33:c8fbd904df3e 396 if (rsp[ptr+13] & 0x01)
phonemacro 33:c8fbd904df3e 397 spo2_lo = 1;
phonemacro 33:c8fbd904df3e 398 if (rsp[ptr+13] & 0x02)
phonemacro 33:c8fbd904df3e 399 spo2_mo = 1;
phonemacro 33:c8fbd904df3e 400 if (rsp[ptr+13] & 0x04)
phonemacro 33:c8fbd904df3e 401 spo2_lopi = 1;
phonemacro 33:c8fbd904df3e 402 if (rsp[ptr+13] & 0x08)
phonemacro 33:c8fbd904df3e 403 spo2_unrel = 1;
phonemacro 33:c8fbd904df3e 404 spo2_state = (0x30 & rsp[ptr+13]) >> 4;
phonemacro 33:c8fbd904df3e 405
phonemacro 33:c8fbd904df3e 406 scd = (0x03 & rsp[ptr+14]);
phonemacro 33:c8fbd904df3e 407 act = (0x1C & rsp[ptr+14]) >> 2;
phonemacro 33:c8fbd904df3e 408 inappro_ori = (0x20 & rsp[ptr+14]) >> 5;
phonemacro 33:c8fbd904df3e 409
phonemacro 33:c8fbd904df3e 410 ibi_offset = rsp[ptr+15];
phonemacro 33:c8fbd904df3e 411
phonemacro 33:c8fbd904df3e 412 sptr += (TTL_SZ);
phonemacro 37:249b548e6488 413 #if defined(PCK_CFG_MASK) // hex out, for printing config masked out packed data
phonemacro 35:67699bdae57e 414 // print as hex bytes
phonemacro 35:67699bdae57e 415 for (j=0; j<ALGO_SZ; j++)
phonemacro 35:67699bdae57e 416 pc.printf("%02X ", rsp[ptr+j]);
phonemacro 36:a6e7ff9c87a0 417 //pc.printf("\n\r" );
phonemacro 35:67699bdae57e 418 #endif
phonemacro 35:67699bdae57e 419
phonemacro 37:249b548e6488 420 #if !defined(PCK_CFG_MASK)
phonemacro 37:249b548e6488 421 #if 1
phonemacro 37:249b548e6488 422 #if 1 // print all
phonemacro 33:c8fbd904df3e 423 if (heading_printed == 0) {
phonemacro 33:c8fbd904df3e 424 heading_printed = 1;
phonemacro 37:249b548e6488 425 #if defined(ALGO_ONLY)
phonemacro 33:c8fbd904df3e 426 pc.printf("opmode,hr,hr_conf,ibi,ibi_conf,act,r,spo2_conf,spo2,spo2_compl,spo2_lo,spo2_mo,spo2_lopi,spo2_unrel,spo2_state,scd,ibioffset,inappro_ori,\n\r");
phonemacro 37:249b548e6488 427 #endif
phonemacro 33:c8fbd904df3e 428 }
phonemacro 33:c8fbd904df3e 429 pc.printf("%d,%d,%d,%d,", opmode, hr, hr_conf, ibi);
phonemacro 33:c8fbd904df3e 430 pc.printf("%d,%d,%d,%d,", ibi_conf, act, r, spo2_conf);
phonemacro 33:c8fbd904df3e 431 pc.printf("%d,%d,%d,%d,", spo2, spo2_compl, spo2_lo, spo2_mo);
phonemacro 33:c8fbd904df3e 432 pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state, scd);
phonemacro 33:c8fbd904df3e 433 pc.printf("%d,", ibi_offset);
phonemacro 33:c8fbd904df3e 434 pc.printf("%d,", inappro_ori);
phonemacro 37:249b548e6488 435 #endif
phonemacro 37:249b548e6488 436 #else // print some
phonemacro 33:c8fbd904df3e 437 if (heading_printed == 0) {
phonemacro 33:c8fbd904df3e 438 heading_printed = 1;
phonemacro 37:249b548e6488 439 #if defined(ALGO_ONLY)
phonemacro 33:c8fbd904df3e 440 pc.printf("hr,hr_conf,spo2,spo2_conf,spo2_lo,spo2_unrel,scd,\n\r");
phonemacro 37:249b548e6488 441 #endif
phonemacro 33:c8fbd904df3e 442 }
phonemacro 33:c8fbd904df3e 443 pc.printf("%d,%d,", hr, hr_conf);
phonemacro 33:c8fbd904df3e 444 pc.printf("%d,%d,", spo2, spo2_conf);
phonemacro 33:c8fbd904df3e 445 pc.printf("%d,", spo2_lo);
phonemacro 33:c8fbd904df3e 446 pc.printf("%d,%d,", spo2_unrel, scd);
phonemacro 37:249b548e6488 447 #endif
phonemacro 37:249b548e6488 448 #endif // #if defined(PCK_CFG_MASK)
phonemacro 37:249b548e6488 449
phonemacro 12:17a0bf823462 450 #else // normal algo size
phonemacro 12:17a0bf823462 451 // pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ);
phonemacro 12:17a0bf823462 452 opmode = rsp[ptr];
phonemacro 12:17a0bf823462 453 hr = (rsp[ptr+1] << 8) + rsp[ptr+2];
phonemacro 12:17a0bf823462 454 hr_conf = rsp[ptr+3];
phonemacro 12:17a0bf823462 455 ibi = (rsp[ptr+4] << 8) + rsp[ptr+5];
phonemacro 4:4f1e9439f048 456
phonemacro 11:a16b6bf38841 457 ibi_conf = rsp[ptr+6];
phonemacro 3:da975696b936 458 act = rsp[ptr+7];
phonemacro 3:da975696b936 459 r = (rsp[ptr+8] << 8) + rsp[ptr+9];
phonemacro 0:6f65cae31c54 460 spo2_conf = rsp[ptr+10];
phonemacro 4:4f1e9439f048 461
phonemacro 0:6f65cae31c54 462 spo2 = (rsp[ptr+11] << 8) + rsp[ptr+12];
phonemacro 4:4f1e9439f048 463 spo2_compl = rsp[ptr+13];
phonemacro 4:4f1e9439f048 464 spo2_lo = rsp[ptr+14];
phonemacro 4:4f1e9439f048 465 spo2_mo = rsp[ptr+15];
phonemacro 4:4f1e9439f048 466
phonemacro 4:4f1e9439f048 467 spo2_lopi = rsp[ptr+16];
phonemacro 4:4f1e9439f048 468 spo2_unrel = rsp[ptr+17];
phonemacro 4:4f1e9439f048 469 spo2_state = rsp[ptr+18];
phonemacro 2:563d90a111b3 470 scd = rsp[ptr+19];
phonemacro 0:6f65cae31c54 471
phonemacro 36:a6e7ff9c87a0 472 // ibi_offset = rsp[ptr+20];
phonemacro 0:6f65cae31c54 473
phonemacro 4:4f1e9439f048 474 sptr += (TTL_SZ);
phonemacro 36:a6e7ff9c87a0 475
phonemacro 27:a45d6e38f2de 476 #if 0
phonemacro 33:c8fbd904df3e 477 if (heading_printed == 0) {
phonemacro 33:c8fbd904df3e 478 heading_printed = 1;
phonemacro 36:a6e7ff9c87a0 479 #if defined(ALGO_ONLY)
phonemacro 33:c8fbd904df3e 480 pc.printf("opmode,hr,hr_conf,ibi,ibi_conf,act,r,spo2_conf,spo2,spo2_compl,spo2_lo,spo2_mo,spo2_lopi,spo2_unrel,spo2_state,scd,ibioffset,\n\r");
phonemacro 36:a6e7ff9c87a0 481 #endif
phonemacro 33:c8fbd904df3e 482 }
phonemacro 4:4f1e9439f048 483 pc.printf("%d,%d,%d,%d,", opmode, hr, hr_conf, ibi);
phonemacro 4:4f1e9439f048 484 pc.printf("%d,%d,%d,%d,", ibi_conf, act, r, spo2_conf);
phonemacro 4:4f1e9439f048 485 pc.printf("%d,%d,%d,%d,", spo2, spo2_compl, spo2_lo, spo2_mo);
phonemacro 4:4f1e9439f048 486 pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state, scd);
phonemacro 36:a6e7ff9c87a0 487 // pc.printf("%d,", ibi_offset);
phonemacro 4:4f1e9439f048 488 #else
phonemacro 33:c8fbd904df3e 489 if (heading_printed == 0) {
phonemacro 33:c8fbd904df3e 490 heading_printed = 1;
phonemacro 36:a6e7ff9c87a0 491 #if defined(ALGO_ONLY)
phonemacro 33:c8fbd904df3e 492 pc.printf("hr,hr_conf,spo2,spo2_conf,spo2_lo,spo2_unrel,scd,\n\r");
phonemacro 36:a6e7ff9c87a0 493 #endif
phonemacro 33:c8fbd904df3e 494 }
phonemacro 4:4f1e9439f048 495 pc.printf("%d,%d,", hr, hr_conf);
phonemacro 4:4f1e9439f048 496 pc.printf("%d,%d,", spo2, spo2_conf);
phonemacro 4:4f1e9439f048 497 pc.printf("%d,", spo2_lo);
phonemacro 4:4f1e9439f048 498 pc.printf("%d,%d,", spo2_unrel, scd);
phonemacro 4:4f1e9439f048 499 #endif
phonemacro 12:17a0bf823462 500 #endif // end normal algo size
phonemacro 14:c8cc6d7fd5f9 501 #endif // !RAW
phonemacro 4:4f1e9439f048 502
phonemacro 3:da975696b936 503 pc.printf("\n\r");
phonemacro 0:6f65cae31c54 504 }
phonemacro 0:6f65cae31c54 505 }
phonemacro 0:6f65cae31c54 506
phonemacro 6:e1b7190d6cb5 507 #ifdef MAXREFDES103_CFG
phonemacro 14:c8cc6d7fd5f9 508 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 509 // init_max20303_pmic
phonemacro 14:c8cc6d7fd5f9 510 /*****************************************************************************/
phonemacro 6:e1b7190d6cb5 511 void init_max20303_pmic(void) {
phonemacro 5:7f5a012747a5 512 /* Wait for pmic to settle down */
phonemacro 5:7f5a012747a5 513 thread_sleep_for(800);
phonemacro 5:7f5a012747a5 514
phonemacro 5:7f5a012747a5 515 //set_time(1544787300); // Set RTC time to Wed, 28 Oct 2009 11:35:37
phonemacro 6:e1b7190d6cb5 516 MAX20303 max20303(&sh_i2c);
phonemacro 5:7f5a012747a5 517 /*Set LDO1 to 1.8v*/
phonemacro 5:7f5a012747a5 518 max20303.LDO1Config();
phonemacro 5:7f5a012747a5 519
phonemacro 5:7f5a012747a5 520 /*Set LDO2 to 3v*/
phonemacro 5:7f5a012747a5 521 max20303.LDO2Config();
phonemacro 5:7f5a012747a5 522
phonemacro 5:7f5a012747a5 523 //max20303.BoostEnable();
phonemacro 5:7f5a012747a5 524 max20303.BuckBoostEnable();
phonemacro 5:7f5a012747a5 525
phonemacro 5:7f5a012747a5 526 max20303.led0on(0);
phonemacro 5:7f5a012747a5 527 max20303.led1on(0);
phonemacro 5:7f5a012747a5 528 max20303.led2on(0);
phonemacro 5:7f5a012747a5 529
phonemacro 5:7f5a012747a5 530 /* Wait for pmic to settle down */
phonemacro 5:7f5a012747a5 531 thread_sleep_for(200);
phonemacro 28:315604f4b374 532
phonemacro 5:7f5a012747a5 533 }
phonemacro 6:e1b7190d6cb5 534 #endif // MAXREFDES103_CFG
phonemacro 14:c8cc6d7fd5f9 535
phonemacro 14:c8cc6d7fd5f9 536 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 537 // init_sh_algo
phonemacro 14:c8cc6d7fd5f9 538 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 539 void init_sh_algo(void) {
phonemacro 35:67699bdae57e 540 char cmd[64];
phonemacro 0:6f65cae31c54 541 char rsp[256];
phonemacro 27:a45d6e38f2de 542
phonemacro 27:a45d6e38f2de 543 #ifdef OPTIMIZE_FIFO_READ
phonemacro 27:a45d6e38f2de 544 check_fifo_countdown = MAX_FIFO_CNT;
phonemacro 27:a45d6e38f2de 545 #endif
phonemacro 27:a45d6e38f2de 546
phonemacro 10:192ea88e964b 547 // switch to application mode
phonemacro 0:6f65cae31c54 548 rst = 0;
phonemacro 0:6f65cae31c54 549 mfio = 1;
phonemacro 0:6f65cae31c54 550 thread_sleep_for(10);
phonemacro 0:6f65cae31c54 551 rst = 1;
phonemacro 0:6f65cae31c54 552 thread_sleep_for(1500);
phonemacro 10:192ea88e964b 553 #ifdef MAXREFDES103_CFG
phonemacro 10:192ea88e964b 554 init_max20303_pmic();
phonemacro 10:192ea88e964b 555 #endif
phonemacro 47:346a13fbdc0f 556 // 33.13.31 needs at least 1.6s
phonemacro 47:346a13fbdc0f 557 // thread_sleep_for(100);
phonemacro 0:6f65cae31c54 558
phonemacro 1:da792e46a385 559 mfio = 0; wait_us(300);
phonemacro 42:6f980909371f 560 #ifdef REDUCE_RPT_PERIOD
phonemacro 42:6f980909371f 561 //Change report period to 25
phonemacro 42:6f980909371f 562 cmd[0] = 0x10; cmd[1] = 0x02; cmd[2] = REDUCE_RPT_PERIOD;
phonemacro 42:6f980909371f 563 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 42:6f980909371f 564 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 42:6f980909371f 565 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 42:6f980909371f 566 mfio = 1; mfio = 0; wait_us(300);
phonemacro 42:6f980909371f 567 pc.printf("Wr report period 25 %x\n\r", rsp[0]);
phonemacro 42:6f980909371f 568 #endif
phonemacro 48:6b93b56bb22e 569 //1.10 rd ver
phonemacro 4:4f1e9439f048 570 cmd[0] = 0xFF; cmd[1] = 0x03;
phonemacro 6:e1b7190d6cb5 571 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 1:da792e46a385 572 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 573 sh_i2c.read(SH_ADDR, rsp, 4);
phonemacro 1:da792e46a385 574 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 575 pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]);
phonemacro 0:6f65cae31c54 576
phonemacro 35:67699bdae57e 577 // wr config mask for packed normal data output fifo
phonemacro 37:249b548e6488 578 #if defined(PCK_CFG_MASK)
phonemacro 37:249b548e6488 579 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x20; cmd[3] = 0x7F; cmd[4] = 0xFF; cmd[5] = 0x00;
phonemacro 44:1b165a68474d 580 // cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x20; cmd[3] = 0xFF; cmd[4] = 0xFF; cmd[5] = 0x00;
phonemacro 35:67699bdae57e 581 sh_i2c.write(SH_ADDR, cmd, 6);
phonemacro 35:67699bdae57e 582 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 35:67699bdae57e 583 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 35:67699bdae57e 584 mfio = 1; mfio = 0; wait_us(300);
phonemacro 35:67699bdae57e 585 pc.printf("wr config mask packed: %x \n\r", rsp[0]);
phonemacro 35:67699bdae57e 586 // rd config mask for packed normal data output fifo
phonemacro 35:67699bdae57e 587 cmd[0] = 0x51; cmd[1] = 0x07; cmd[2] = 0x20;
phonemacro 35:67699bdae57e 588 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 35:67699bdae57e 589 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 35:67699bdae57e 590 sh_i2c.read(SH_ADDR, rsp, 4);
phonemacro 35:67699bdae57e 591 mfio = 1; mfio = 0; wait_us(300);
phonemacro 35:67699bdae57e 592 pc.printf("rd config mask for packed normal data output fifo %d %X %X %X \n\r", rsp[0], rsp[1], rsp[2], rsp[3]);
phonemacro 44:1b165a68474d 593 #endif
phonemacro 35:67699bdae57e 594
phonemacro 33:c8fbd904df3e 595 #if defined(MAXM86161_CFG) || defined(MAXM86146_CFG)
phonemacro 33:c8fbd904df3e 596 // rd algo sz normal
phonemacro 17:0d6e99a0fd8d 597 cmd[0] = 0x11; cmd[1] = 0x06; cmd[2] = 0x01;
phonemacro 17:0d6e99a0fd8d 598 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 17:0d6e99a0fd8d 599 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 600 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 17:0d6e99a0fd8d 601 mfio = 1; mfio = 0; wait_us(300);
phonemacro 33:c8fbd904df3e 602 pc.printf("rd algo size: %d %d \n\r", rsp[0], rsp[1]);
phonemacro 33:c8fbd904df3e 603 // rd algo sz extended
phonemacro 17:0d6e99a0fd8d 604 cmd[0] = 0x11; cmd[1] = 0x06; cmd[2] = 0x02;
phonemacro 17:0d6e99a0fd8d 605 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 17:0d6e99a0fd8d 606 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 607 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 17:0d6e99a0fd8d 608 mfio = 1; mfio = 0; wait_us(300);
phonemacro 33:c8fbd904df3e 609 pc.printf("rd algo size: %d %d \n\r", rsp[0], rsp[1]);
phonemacro 33:c8fbd904df3e 610 // rd algo sz scd
phonemacro 17:0d6e99a0fd8d 611 cmd[0] = 0x11; cmd[1] = 0x06; cmd[2] = 0x03;
phonemacro 17:0d6e99a0fd8d 612 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 17:0d6e99a0fd8d 613 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 614 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 17:0d6e99a0fd8d 615 mfio = 1; mfio = 0; wait_us(300);
phonemacro 33:c8fbd904df3e 616 pc.printf("rd algo size: %d %d \n\r", rsp[0], rsp[1]);
phonemacro 45:d26b8bcce561 617 #if defined(PACKED_NORMAL_ALGO) && (defined(MAXM86161_CFG) || defined(MAXM86146_CFG))
phonemacro 35:67699bdae57e 618 // rd algo sz packed normal
phonemacro 33:c8fbd904df3e 619 cmd[0] = 0x11; cmd[1] = 0x06; cmd[2] = 0x04;
phonemacro 33:c8fbd904df3e 620 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 33:c8fbd904df3e 621 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 33:c8fbd904df3e 622 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 33:c8fbd904df3e 623 mfio = 1; mfio = 0; wait_us(300);
phonemacro 33:c8fbd904df3e 624 pc.printf("rd algo size: %d %d \n\r", rsp[0], rsp[1]);
phonemacro 33:c8fbd904df3e 625 #endif
phonemacro 17:0d6e99a0fd8d 626 #endif
phonemacro 17:0d6e99a0fd8d 627
phonemacro 17:0d6e99a0fd8d 628 #if 0
phonemacro 17:0d6e99a0fd8d 629 // set Perfusion Index threshold to .05 (3x.13.19+)
phonemacro 17:0d6e99a0fd8d 630 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x1D; cmd[3] = 50;
phonemacro 16:ff1122f0624a 631 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 16:ff1122f0624a 632 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 16:ff1122f0624a 633 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 16:ff1122f0624a 634 mfio = 1; mfio = 0; wait_us(300);
phonemacro 16:ff1122f0624a 635 pc.printf("pi set to 0x19 : %x \n\r", rsp[0]);
phonemacro 17:0d6e99a0fd8d 636 #endif
phonemacro 16:ff1122f0624a 637
phonemacro 48:6b93b56bb22e 638 // 1.1 sensor and algo data
phonemacro 4:4f1e9439f048 639 cmd[0] = 0x10; cmd[1] = 0x00;
phonemacro 2:563d90a111b3 640 #ifdef ALGO_ONLY
phonemacro 0:6f65cae31c54 641 cmd[2] = 0x02; // algo data
phonemacro 4:4f1e9439f048 642 pc.printf("algo only \n\r");
phonemacro 2:563d90a111b3 643 #else
phonemacro 2:563d90a111b3 644 cmd[2] = 0x03; // sensor + algo data
phonemacro 4:4f1e9439f048 645 pc.printf("sens+algo \n\r");
phonemacro 2:563d90a111b3 646 #endif
phonemacro 6:e1b7190d6cb5 647 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 1:da792e46a385 648 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 649 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 650 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 651 pc.printf("1.2 Status: %x\n\r", rsp[0]);
phonemacro 32:92adfbe18ab6 652 // 1.5 cont hr, spo2
phonemacro 47:346a13fbdc0f 653 #ifdef SPO2_CAL_RPT
phonemacro 47:346a13fbdc0f 654 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x06;
phonemacro 47:346a13fbdc0f 655 #else
phonemacro 32:92adfbe18ab6 656 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00;
phonemacro 47:346a13fbdc0f 657 #endif
phonemacro 32:92adfbe18ab6 658 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 32:92adfbe18ab6 659 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 660 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 32:92adfbe18ab6 661 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 662 pc.printf("1.5 Status: %x\n\r", rsp[0]);
phonemacro 48:6b93b56bb22e 663 // 1.5 AEC enable (default)
phonemacro 4:4f1e9439f048 664 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; cmd[3] = 0x01;
phonemacro 6:e1b7190d6cb5 665 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 1:da792e46a385 666 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 667 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 668 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 669 pc.printf("1.6 Status: %x\n\r", rsp[0]);
phonemacro 13:1baccc6275a7 670 #if AGC
phonemacro 48:6b93b56bb22e 671 // AGC 1.6 Disable auto PD (default
phonemacro 13:1baccc6275a7 672 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x00;
phonemacro 13:1baccc6275a7 673 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 13:1baccc6275a7 674 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 675 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 13:1baccc6275a7 676 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 677 pc.printf("AGC1.7 Status: %x\n\r", rsp[0]);
phonemacro 48:6b93b56bb22e 678 // AGC 1.7 Disable SCD (default)
phonemacro 13:1baccc6275a7 679 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x00;
phonemacro 13:1baccc6275a7 680 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 13:1baccc6275a7 681 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 682 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 13:1baccc6275a7 683 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 684 pc.printf("AGC1.8 Status: %x\n\r", rsp[0]);
phonemacro 48:6b93b56bb22e 685 // AGC 1.8 Set AGC target PD TO 10uA
phonemacro 13:1baccc6275a7 686 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x11; cmd[3] = 0x00; cmd[3] = 0x64;
phonemacro 13:1baccc6275a7 687 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 13:1baccc6275a7 688 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 689 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 13:1baccc6275a7 690 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 691 pc.printf("AGC1.9 Status: %x\n\r", rsp[0]);
phonemacro 13:1baccc6275a7 692 #else
phonemacro 48:6b93b56bb22e 693 // 1.6 enable auto PD (default)
phonemacro 4:4f1e9439f048 694 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x01;
phonemacro 6:e1b7190d6cb5 695 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 1:da792e46a385 696 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 697 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 698 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 699 pc.printf("1.7 Status: %x\n\r", rsp[0]);
phonemacro 48:6b93b56bb22e 700 // 1.7 SCD (default)
phonemacro 4:4f1e9439f048 701 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x01;
phonemacro 6:e1b7190d6cb5 702 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 4:4f1e9439f048 703 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 704 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 4:4f1e9439f048 705 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 706 pc.printf("1.8 Status: %x\n\r", rsp[0]);
phonemacro 13:1baccc6275a7 707 #endif
phonemacro 28:315604f4b374 708
phonemacro 28:315604f4b374 709 #if defined(MAXM86161_CFG) //only use Red and IR
phonemacro 32:92adfbe18ab6 710 //1.20 map leds to slots
phonemacro 28:315604f4b374 711 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x23; cmd[4] = 0x00; cmd[5] = 0x00;
phonemacro 28:315604f4b374 712 sh_i2c.write(SH_ADDR, cmd, 6);
phonemacro 28:315604f4b374 713 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 714 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 715 mfio = 1; mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 716 pc.printf("map leds to slots %x\n\r", rsp[0]);
phonemacro 30:77a30ea425da 717 //1.21 map HR inputs to slots, default is 0x0073 for MAXM86161
phonemacro 30:77a30ea425da 718 #if 0 // NA for MAXM86161
phonemacro 28:315604f4b374 719 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x73;
phonemacro 28:315604f4b374 720 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 28:315604f4b374 721 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 722 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 723 mfio = 1; mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 724 pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
phonemacro 30:77a30ea425da 725 #endif
phonemacro 28:315604f4b374 726 //1.22 map SpO2 inputs to slots
phonemacro 28:315604f4b374 727 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x00; cmd[4] = 0x10;
phonemacro 28:315604f4b374 728 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 28:315604f4b374 729 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 730 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 731 mfio = 1; mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 732 pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 733 #endif
phonemacro 28:315604f4b374 734
phonemacro 3:da975696b936 735 #ifdef MAXM86146_CFG
phonemacro 32:92adfbe18ab6 736 //1.20 map leds to slots for MAXM86146
phonemacro 4:4f1e9439f048 737 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x13; cmd[4] = 0x56; cmd[5] = 0x00;
phonemacro 6:e1b7190d6cb5 738 sh_i2c.write(SH_ADDR, cmd, 6);
phonemacro 3:da975696b936 739 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 740 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 3:da975696b936 741 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 742 pc.printf("map leds to slots %x\n\r", rsp[0]);
phonemacro 3:da975696b936 743 //1.21 map HR inputs to slots
phonemacro 4:4f1e9439f048 744 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x11;
phonemacro 6:e1b7190d6cb5 745 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 3:da975696b936 746 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 747 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 3:da975696b936 748 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 749 pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
phonemacro 3:da975696b936 750 //1.22 map SpO2 inputs to slots
phonemacro 4:4f1e9439f048 751 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x30; cmd[4] = 0x20;
phonemacro 6:e1b7190d6cb5 752 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 3:da975696b936 753 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 754 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 3:da975696b936 755 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 756 pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
phonemacro 26:33c0d3fd2a95 757
phonemacro 3:da975696b936 758 #if 0
phonemacro 2:563d90a111b3 759 //1.20 Sec 4.1 map leds to slots for MAXM86146
phonemacro 4:4f1e9439f048 760 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x15; cmd[4] = 0x60; cmd[5] = 0x00;
phonemacro 6:e1b7190d6cb5 761 sh_i2c.write(SH_ADDR, cmd, 6);
phonemacro 1:da792e46a385 762 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 763 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 764 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 765 pc.printf("map leds to slots%x\n\r", rsp[0]);
phonemacro 2:563d90a111b3 766 //1.21 map HR inputs to slots
phonemacro 4:4f1e9439f048 767 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x01;
phonemacro 6:e1b7190d6cb5 768 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 1:da792e46a385 769 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 770 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 771 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 772 pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
phonemacro 2:563d90a111b3 773 //1.22 map SpO2 inputs to slots
phonemacro 4:4f1e9439f048 774 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x20; cmd[4] = 0x10;
phonemacro 6:e1b7190d6cb5 775 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 1:da792e46a385 776 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 777 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 778 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 779 pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
phonemacro 3:da975696b936 780 #endif
phonemacro 3:da975696b936 781 #endif // MAXM86146_CFG
phonemacro 0:6f65cae31c54 782
phonemacro 28:315604f4b374 783 #if 0 // MAXM86161 test new commands
phonemacro 28:315604f4b374 784 // LDO enable
phonemacro 28:315604f4b374 785 cmd[0] = 0x10; cmd[1] = 0x12; cmd[2] = 0x01;
phonemacro 28:315604f4b374 786 //cmd[0] = 0x10; cmd[1] = 0x12; cmd[2] = 0x00;
phonemacro 28:315604f4b374 787 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 28:315604f4b374 788 thread_sleep_for(2);
phonemacro 28:315604f4b374 789 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 790 pc.printf("\n\r ldo en %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 791 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 792 // GPIO enable
phonemacro 28:315604f4b374 793 cmd[0] = 0x10; cmd[1] = 0x13; cmd[2] = 0x01;
phonemacro 28:315604f4b374 794 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 28:315604f4b374 795 thread_sleep_for(2);
phonemacro 28:315604f4b374 796 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 797 pc.printf("\n\r gpio en %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 798 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 799 #endif
phonemacro 47:346a13fbdc0f 800 #if 0
phonemacro 47:346a13fbdc0f 801 //write SpO2 coefficients 0x00000000 FFD7FBDD 00AB61FE
phonemacro 47:346a13fbdc0f 802 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x00;
phonemacro 47:346a13fbdc0f 803 cmd[3] = 0x00; cmd[4] = 0x00; cmd[5] = 0x00; cmd[6] = 0x00;
phonemacro 47:346a13fbdc0f 804 cmd[7] = 0xFF; cmd[8] = 0xD7; cmd[9] = 0xFB; cmd[10] = 0xDD;
phonemacro 47:346a13fbdc0f 805 cmd[11] = 0x00; cmd[12] = 0xAB; cmd[13] = 0x61; cmd[14] = 0xFE;
phonemacro 47:346a13fbdc0f 806 sh_i2c.write(SH_ADDR, cmd, 15);
phonemacro 47:346a13fbdc0f 807 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 47:346a13fbdc0f 808 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 47:346a13fbdc0f 809 mfio = 1; mfio = 0; wait_us(300);
phonemacro 47:346a13fbdc0f 810 pc.printf("Wr Spo2 Coeff %x\n\r", rsp[0]);
phonemacro 47:346a13fbdc0f 811 #endif
phonemacro 48:6b93b56bb22e 812 //1.26 rd SpO2 Coefficients
phonemacro 47:346a13fbdc0f 813 cmd[0] = 0x51; cmd[1] = 0x07; cmd[2] = 0x00;
phonemacro 47:346a13fbdc0f 814 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 47:346a13fbdc0f 815 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 47:346a13fbdc0f 816 sh_i2c.read(SH_ADDR, rsp, 13);
phonemacro 47:346a13fbdc0f 817 mfio = 1; mfio = 0; wait_us(300);
phonemacro 47:346a13fbdc0f 818 pc.printf("%x SpO2 Coeff %2X%2X%2X%2X %2X%2X%2X%2X %2X%2X%2X%2X\n\r", rsp[0], rsp[1], rsp[2], rsp[3], rsp[4], rsp[5], rsp[6], rsp[7], rsp[8], rsp[9], rsp[10], rsp[11], rsp[12]);
phonemacro 28:315604f4b374 819
phonemacro 32:92adfbe18ab6 820 // 1.30 Enable HR, SpO2 algo
phonemacro 12:17a0bf823462 821 #ifdef EXTENDED_ALGO
phonemacro 12:17a0bf823462 822 cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x02;
phonemacro 33:c8fbd904df3e 823 #elif defined(PACKED_NORMAL_ALGO)
phonemacro 33:c8fbd904df3e 824 cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x04;
phonemacro 12:17a0bf823462 825 #else
phonemacro 4:4f1e9439f048 826 cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x01;
phonemacro 12:17a0bf823462 827 #endif
phonemacro 6:e1b7190d6cb5 828 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 28:315604f4b374 829 mfio = 1;
phonemacro 0:6f65cae31c54 830 thread_sleep_for(465);
phonemacro 28:315604f4b374 831 mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 832 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 3:da975696b936 833 pc.printf("1.14 status: %x\n\r", rsp[0]);
phonemacro 0:6f65cae31c54 834
phonemacro 4:4f1e9439f048 835 #if 1
phonemacro 4:4f1e9439f048 836 //1.31 rd AFE part id
phonemacro 4:4f1e9439f048 837 cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF;
phonemacro 6:e1b7190d6cb5 838 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 4:4f1e9439f048 839 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 840 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 4:4f1e9439f048 841 mfio = 1; mfio = 0; wait_us(300);
phonemacro 4:4f1e9439f048 842 pc.printf("1.31 part id afe %x %x\n\r", rsp[0], rsp[1]);
phonemacro 4:4f1e9439f048 843 //1.32 rd accel who
phonemacro 4:4f1e9439f048 844 cmd[0] = 0x41; cmd[1] = 0x04; cmd[2] = 0x0F;
phonemacro 6:e1b7190d6cb5 845 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 4:4f1e9439f048 846 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 847 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 4:4f1e9439f048 848 mfio = 1; mfio = 0; wait_us(300);
phonemacro 4:4f1e9439f048 849 pc.printf("1.32 who accel %x %x\n\r", rsp[0], rsp[1]);
phonemacro 28:315604f4b374 850 #endif
phonemacro 26:33c0d3fd2a95 851 mfio = 1;
phonemacro 10:192ea88e964b 852 }
phonemacro 10:192ea88e964b 853
phonemacro 14:c8cc6d7fd5f9 854 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 855 // init_sh_raw
phonemacro 14:c8cc6d7fd5f9 856 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 857 void init_sh_raw(void) {
phonemacro 29:a7dd81450b35 858 char cmd[16];
phonemacro 14:c8cc6d7fd5f9 859 char rsp[256];
phonemacro 14:c8cc6d7fd5f9 860 // switch to application mode
phonemacro 14:c8cc6d7fd5f9 861 rst = 0;
phonemacro 14:c8cc6d7fd5f9 862 mfio = 1;
phonemacro 14:c8cc6d7fd5f9 863 thread_sleep_for(10);
phonemacro 14:c8cc6d7fd5f9 864 rst = 1;
phonemacro 14:c8cc6d7fd5f9 865 thread_sleep_for(1500);
phonemacro 14:c8cc6d7fd5f9 866 #ifdef MAXREFDES103_CFG
phonemacro 14:c8cc6d7fd5f9 867 init_max20303_pmic();
phonemacro 14:c8cc6d7fd5f9 868 #endif
phonemacro 14:c8cc6d7fd5f9 869
phonemacro 14:c8cc6d7fd5f9 870 mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 871
phonemacro 32:92adfbe18ab6 872 //1.0 read operating mode
phonemacro 14:c8cc6d7fd5f9 873 cmd[0] = 0x02; cmd[1] = 0x00;
phonemacro 14:c8cc6d7fd5f9 874 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 14:c8cc6d7fd5f9 875 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 876 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 14:c8cc6d7fd5f9 877 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 878 pc.printf("\n\r 0x02 0x00 Status, Read Operating Mode: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 32:92adfbe18ab6 879 //1.1 rd ver
phonemacro 14:c8cc6d7fd5f9 880 cmd[0] = 0xFF; cmd[1] = 0x03;
phonemacro 14:c8cc6d7fd5f9 881 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 14:c8cc6d7fd5f9 882 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 883 sh_i2c.read(SH_ADDR, rsp, 4);
phonemacro 14:c8cc6d7fd5f9 884 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 885 pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]);
phonemacro 14:c8cc6d7fd5f9 886
phonemacro 32:92adfbe18ab6 887 // raw1.2 sensor data
phonemacro 14:c8cc6d7fd5f9 888 cmd[0] = 0x10; cmd[1] = 0x00; cmd[2] = 0x01;
phonemacro 14:c8cc6d7fd5f9 889 pc.printf("raw sensor data only \n\r");
phonemacro 14:c8cc6d7fd5f9 890 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 14:c8cc6d7fd5f9 891 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 892 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 893 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 894 pc.printf("raw1.2 Status: %x\n\r", rsp[0]);
phonemacro 32:92adfbe18ab6 895 // raw1.3 interrupt threshold
phonemacro 14:c8cc6d7fd5f9 896 cmd[0] = 0x10; cmd[1] = 0x01; cmd[2] = 0x01;
phonemacro 14:c8cc6d7fd5f9 897 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 14:c8cc6d7fd5f9 898 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 899 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 900 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 901 pc.printf("raw1.3 Status: %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 902 #ifdef MAXM86146_CFG
phonemacro 50:dd2f60ab5686 903 //1.20 map leds to slots for MAXM86146
phonemacro 50:dd2f60ab5686 904 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x13; cmd[4] = 0x56; cmd[5] = 0x00;
phonemacro 50:dd2f60ab5686 905 sh_i2c.write(SH_ADDR, cmd, 6);
phonemacro 50:dd2f60ab5686 906 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 907 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 50:dd2f60ab5686 908 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 909 pc.printf("map leds to slots %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 910 //1.21 map HR inputs to slots
phonemacro 50:dd2f60ab5686 911 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x11;
phonemacro 50:dd2f60ab5686 912 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 50:dd2f60ab5686 913 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 914 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 50:dd2f60ab5686 915 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 916 pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 917 //1.22 map SpO2 inputs to slots
phonemacro 50:dd2f60ab5686 918 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x30; cmd[4] = 0x20;
phonemacro 50:dd2f60ab5686 919 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 50:dd2f60ab5686 920 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 921 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 50:dd2f60ab5686 922 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 923 pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 924 #endif
phonemacro 50:dd2f60ab5686 925
phonemacro 50:dd2f60ab5686 926 // raw enable sh accel
phonemacro 14:c8cc6d7fd5f9 927 cmd[0] = 0x44; cmd[1] = 0x04; cmd[2] = 0x01; cmd[3] = 0x00;
phonemacro 14:c8cc6d7fd5f9 928 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 29:a7dd81450b35 929 mfio = 1; thread_sleep_for(20); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 930 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 29:a7dd81450b35 931 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 932 pc.printf("raw1.4 Status: %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 933 // raw enable AFE
phonemacro 30:77a30ea425da 934 // cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00;
phonemacro 30:77a30ea425da 935 // sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 38:8ff33869be1f 936 cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; // 3 bytes // tested on 33.13.31/12
phonemacro 38:8ff33869be1f 937 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 38:8ff33869be1f 938 cmd[0] = 0x44; cmd[1] = 0xFF; cmd[2] = 0x02; cmd[3] = 0x04; cmd[4] = 0x01; cmd[5] = 0x00; cmd[6] = 0x00; cmd[7] = 0x01; cmd[8] = 0x00;
phonemacro 38:8ff33869be1f 939 sh_i2c.write(SH_ADDR, cmd, 9);
phonemacro 38:8ff33869be1f 940 mfio = 1; thread_sleep_for(465); mfio = 0; wait_us(300);
phonemacro 29:a7dd81450b35 941 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 942 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 943 pc.printf("raw1.6 Status: %x\n\r", rsp[0]);
phonemacro 32:92adfbe18ab6 944
phonemacro 50:dd2f60ab5686 945 /// raw 1.20 AFE part id
phonemacro 50:dd2f60ab5686 946 cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF;
phonemacro 50:dd2f60ab5686 947 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 50:dd2f60ab5686 948 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 949 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 50:dd2f60ab5686 950 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 951 pc.printf("raw1.6 part id Status: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 50:dd2f60ab5686 952 // raw1.21 rd accel WHO reg
phonemacro 30:77a30ea425da 953 cmd[0] = 0x41; cmd[1] = 0x04; cmd[2] = 0x0F;
phonemacro 30:77a30ea425da 954 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 30:77a30ea425da 955 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 30:77a30ea425da 956 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 30:77a30ea425da 957 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 958 pc.printf("1.7 Who Status: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 32:92adfbe18ab6 959
phonemacro 50:dd2f60ab5686 960 // raw1.8 sample rate
phonemacro 50:dd2f60ab5686 961 #if RAW_HZ == 25
phonemacro 50:dd2f60ab5686 962 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x00; // set AFE reg 0x12 to 25 Hz, ave 1
phonemacro 50:dd2f60ab5686 963 #elif RAW_HZ == 50
phonemacro 50:dd2f60ab5686 964 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x40; // set AFE reg 0x12 to 50 Hz
phonemacro 50:dd2f60ab5686 965 #elif RAW_HZ == 100
phonemacro 46:553559610878 966 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x18; // set AFE reg 0x12 to 100 Hz
phonemacro 50:dd2f60ab5686 967 #elif RAW_HZ == 200
phonemacro 50:dd2f60ab5686 968 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x20; // set AFE reg 0x12 to 200 Hz
phonemacro 50:dd2f60ab5686 969 #elif RAW_HZ == 2004
phonemacro 50:dd2f60ab5686 970 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x22; // set AFE reg 0x12 to 200 Hz, ave 4
phonemacro 46:553559610878 971 #else
phonemacro 46:553559610878 972 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x18; // set AFE reg 0x12 to 100 Hz
phonemacro 46:553559610878 973 #endif
phonemacro 14:c8cc6d7fd5f9 974 // cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x20; // set AFE reg 0x12 to 200 Hz
phonemacro 14:c8cc6d7fd5f9 975 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 976 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 977 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 978 mfio = 1; mfio = 0; wait_us(300);
phonemacro 32:92adfbe18ab6 979 pc.printf("raw1.8 Status: %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 980 // LED1 current
phonemacro 50:dd2f60ab5686 981 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x19;
phonemacro 14:c8cc6d7fd5f9 982 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 983 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 984 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 985 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 986 pc.printf("LED1 Status: %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 987 // LED2 current
phonemacro 50:dd2f60ab5686 988 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x19;
phonemacro 50:dd2f60ab5686 989 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 50:dd2f60ab5686 990 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 991 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 50:dd2f60ab5686 992 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 993 pc.printf("LED2 Status: %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 994 // LED3 current
phonemacro 50:dd2f60ab5686 995 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x19;
phonemacro 14:c8cc6d7fd5f9 996 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 997 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 998 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 999 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 1000 pc.printf("LED3 Status: %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 1001 // LED4 current
phonemacro 50:dd2f60ab5686 1002 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x26; cmd[3] = 0x19;
phonemacro 14:c8cc6d7fd5f9 1003 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 1004 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1005 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 1006 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 1007 pc.printf("LED4 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 1008 // LED5 current
phonemacro 50:dd2f60ab5686 1009 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x27; cmd[3] = 0x19;
phonemacro 14:c8cc6d7fd5f9 1010 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 1011 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1012 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 1013 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 1014 pc.printf("LED5 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 1015 // LED6 current
phonemacro 50:dd2f60ab5686 1016 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x28; cmd[3] = 0x19;
phonemacro 14:c8cc6d7fd5f9 1017 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 1018 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1019 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 1020 mfio = 1; mfio = 0; wait_us(300);
phonemacro 50:dd2f60ab5686 1021 pc.printf("LED6 Status: %x\n\r", rsp[0]);
phonemacro 50:dd2f60ab5686 1022 #if 0
phonemacro 14:c8cc6d7fd5f9 1023 // Set Seq cntrl1 LED2, LED1
phonemacro 14:c8cc6d7fd5f9 1024 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x20; cmd[3] = 0x21;
phonemacro 14:c8cc6d7fd5f9 1025 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 1026 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1027 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 1028 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1029 pc.printf("Seq cntrl1 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 1030 // Set Seq cntrl2 LED4, LED3
phonemacro 14:c8cc6d7fd5f9 1031 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x21; cmd[3] = 0xA3;
phonemacro 14:c8cc6d7fd5f9 1032 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 1033 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1034 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 1035 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1036 pc.printf("Seq cntrl2 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 1037 // Set Seq cntrl3 LED6, LED5
phonemacro 14:c8cc6d7fd5f9 1038 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x22; cmd[3] = 0x21;
phonemacro 14:c8cc6d7fd5f9 1039 // cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x22; cmd[3] = 0x99; // Ambient
phonemacro 14:c8cc6d7fd5f9 1040 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 1041 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1042 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 1043 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 1044 pc.printf("Seq cntrl3 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 1045 #endif
phonemacro 28:315604f4b374 1046 mfio = 1;
phonemacro 28:315604f4b374 1047 }
phonemacro 14:c8cc6d7fd5f9 1048
phonemacro 14:c8cc6d7fd5f9 1049 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 1050 // main
phonemacro 14:c8cc6d7fd5f9 1051 /*****************************************************************************/
phonemacro 10:192ea88e964b 1052 int main()
phonemacro 10:192ea88e964b 1053 {
phonemacro 10:192ea88e964b 1054 sh_i2c.frequency(400000);
phonemacro 10:192ea88e964b 1055 int32_t ledcnt = 0;
phonemacro 10:192ea88e964b 1056 rLED = LED_OFF; gLED = LED_ON; bLED = LED_OFF;
phonemacro 10:192ea88e964b 1057 Ticker ticker; // calls a callback repeatedly with a timeout
phonemacro 28:315604f4b374 1058
phonemacro 28:315604f4b374 1059 #if 0 // test disable algo
phonemacro 28:315604f4b374 1060 char cmd[8];
phonemacro 28:315604f4b374 1061 char rsp[256];
phonemacro 28:315604f4b374 1062 // 3.1 Disable algo
phonemacro 28:315604f4b374 1063 mfio = 1; mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 1064 cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x00;
phonemacro 28:315604f4b374 1065 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 28:315604f4b374 1066 thread_sleep_for(465);
phonemacro 28:315604f4b374 1067 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 1068 pc.printf("3.1 disable algo: %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 1069 mfio = 1;
phonemacro 28:315604f4b374 1070 #endif
phonemacro 28:315604f4b374 1071
phonemacro 10:192ea88e964b 1072 //ticker.attach(callback(&blink_timer), BLINKING_RATE_MS); /* set timer for one second */
phonemacro 14:c8cc6d7fd5f9 1073 #ifdef RAW
phonemacro 14:c8cc6d7fd5f9 1074 init_sh_raw();
phonemacro 14:c8cc6d7fd5f9 1075 #else
phonemacro 14:c8cc6d7fd5f9 1076 init_sh_algo();
phonemacro 14:c8cc6d7fd5f9 1077 #endif
phonemacro 28:315604f4b374 1078 mfio = 1;
phonemacro 33:c8fbd904df3e 1079 heading_printed = 0;
phonemacro 8:e6ae69cfecbf 1080 #if defined(MAXREFDES103_CFG) || defined(MAXM86161_CFG) || defined(MAXM86146_CFG)
phonemacro 6:e1b7190d6cb5 1081 Timer tmr1;
phonemacro 0:6f65cae31c54 1082 while (1) {
phonemacro 6:e1b7190d6cb5 1083 tmr1.start();
phonemacro 29:a7dd81450b35 1084 #if defined(RAW)
phonemacro 50:dd2f60ab5686 1085 #if RAW_HZ == 25
phonemacro 50:dd2f60ab5686 1086 if (tmr1.read_ms() >= 40) {
phonemacro 50:dd2f60ab5686 1087 #elif RAW_HZ == 50
phonemacro 50:dd2f60ab5686 1088 if (tmr1.read_ms() >= 20) {
phonemacro 50:dd2f60ab5686 1089 #elif RAW_HZ == 100
phonemacro 29:a7dd81450b35 1090 if (tmr1.read_ms() >= 10) {
phonemacro 50:dd2f60ab5686 1091 #elif RAW_HZ == 200 || RAW_HZ == 2004
phonemacro 50:dd2f60ab5686 1092 if (tmr1.read_ms() >= 5) {
phonemacro 46:553559610878 1093 #else
phonemacro 46:553559610878 1094 if (tmr1.read_ms() >= 10) {
phonemacro 46:553559610878 1095 #endif
phonemacro 29:a7dd81450b35 1096 #else
phonemacro 42:6f980909371f 1097 #ifdef REDUCE_RPT_PERIOD
phonemacro 42:6f980909371f 1098 #ifdef USE_FIFO_BUFFER_CNT
phonemacro 42:6f980909371f 1099 if (tmr1.read_ms() >= 40*REDUCE_RPT_PERIOD*USE_FIFO_BUFFER_CNT) {
phonemacro 42:6f980909371f 1100 #else
phonemacro 42:6f980909371f 1101 if (tmr1.read_ms() >= 40*REDUCE_RPT_PERIOD) {
phonemacro 42:6f980909371f 1102 #endif
phonemacro 42:6f980909371f 1103 #else
phonemacro 42:6f980909371f 1104 #ifdef USE_FIFO_BUFFER_CNT
phonemacro 42:6f980909371f 1105 if (tmr1.read_ms() >= 40*USE_FIFO_BUFFER_CNT) {
phonemacro 42:6f980909371f 1106 #else
phonemacro 28:315604f4b374 1107 if (tmr1.read_ms() >= 40) {
phonemacro 42:6f980909371f 1108 #endif
phonemacro 42:6f980909371f 1109 #endif
phonemacro 29:a7dd81450b35 1110 #endif
phonemacro 7:23b067817ab8 1111 tmr1.reset();
phonemacro 10:192ea88e964b 1112 read_sh_fifo();
phonemacro 7:23b067817ab8 1113 if ((ledcnt++ % 50) == 0)
phonemacro 6:e1b7190d6cb5 1114 gLED = !gLED;
phonemacro 0:6f65cae31c54 1115 }
phonemacro 0:6f65cae31c54 1116 }
phonemacro 6:e1b7190d6cb5 1117 #else
phonemacro 6:e1b7190d6cb5 1118 ticker.attach(callback(&fifo_timer), 0.040f);
phonemacro 6:e1b7190d6cb5 1119 while (1) {
phonemacro 6:e1b7190d6cb5 1120 if (Time_to_Read_PPG) {
phonemacro 10:192ea88e964b 1121 read_sh_fifo();
phonemacro 7:23b067817ab8 1122 if ((ledcnt++ % 50) == 0)
phonemacro 6:e1b7190d6cb5 1123 gLED = !gLED;
phonemacro 6:e1b7190d6cb5 1124 }
phonemacro 6:e1b7190d6cb5 1125 }
phonemacro 6:e1b7190d6cb5 1126 #endif
phonemacro 0:6f65cae31c54 1127 }