Mode1 Optical Validation

Dependencies:   max32630fthr

Committer:
phonemacro
Date:
Fri Feb 04 02:43:50 2022 +0000
Revision:
31:92e1bcdb7b1e
Parent:
30:77a30ea425da
Child:
32:92adfbe18ab6
typo

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 30:77a30ea425da 40 * ver: 220203
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 29:a7dd81450b35 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 29:a7dd81450b35 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 31:92e1bcdb7b1e 87 //#define RAW // define this if you only want AFE+accel data, no algorithm
phonemacro 30:77a30ea425da 88 #define ALGO_ONLY 1 // define this if you only want algo data, comment out if you want raw sensor+algo data
phonemacro 30:77a30ea425da 89 //#define EXTENDED_ALGO 1 // define this if you want the extended algo format
phonemacro 13:1baccc6275a7 90 //#define AGC 1 // define this for AGC, otherwise the default is AEC
phonemacro 6:e1b7190d6cb5 91
phonemacro 6:e1b7190d6cb5 92 #ifdef MAXREFDES103_CFG
phonemacro 5:7f5a012747a5 93 #include "MAX20303.h"
phonemacro 6:e1b7190d6cb5 94 I2C sh_i2c_pmic(P5_7, P6_0);
phonemacro 5:7f5a012747a5 95 #endif
phonemacro 5:7f5a012747a5 96
phonemacro 28:315604f4b374 97 #if defined(MAXM86161_CFG)
phonemacro 28:315604f4b374 98 #define old_msbl 1 // 3x.12.0 or earlier; 32.9.x
phonemacro 28:315604f4b374 99 #endif
phonemacro 30:77a30ea425da 100
phonemacro 18:f4c95b1c0efc 101 #ifdef old_msbl
phonemacro 18:f4c95b1c0efc 102 #ifdef EXTENDED_ALGO
phonemacro 18:f4c95b1c0efc 103 #define ALGO_SZ 52 // 52 bytes is the extended algo size for 3x.12.0
phonemacro 18:f4c95b1c0efc 104 #else
phonemacro 18:f4c95b1c0efc 105 #define ALGO_SZ 20 // 20 bytes is the algo normal size for 3x.12.0
phonemacro 18:f4c95b1c0efc 106 #endif
phonemacro 12:17a0bf823462 107 #else
phonemacro 18:f4c95b1c0efc 108 #ifdef EXTENDED_ALGO
phonemacro 21:67d58af1ec56 109 #define ALGO_SZ 56 // 56 bytes is the extended algo size for 3x.13.x+
phonemacro 18:f4c95b1c0efc 110 #else
phonemacro 21:67d58af1ec56 111 #define ALGO_SZ 24 // 24 bytes is the algo normal size for 3x.13.x+
phonemacro 18:f4c95b1c0efc 112 #endif
phonemacro 12:17a0bf823462 113 #endif
phonemacro 18:f4c95b1c0efc 114
phonemacro 30:77a30ea425da 115
phonemacro 30:77a30ea425da 116 #ifdef MAXM86146_CFG
phonemacro 30:77a30ea425da 117 #define PPG_SZ 36 //maxm86146
phonemacro 30:77a30ea425da 118 #else
phonemacro 30:77a30ea425da 119 #define PPG_SZ 18 //maxm86161, max86141
phonemacro 30:77a30ea425da 120 #endif
phonemacro 30:77a30ea425da 121 #define ACCEL_SZ 6 // accel
phonemacro 30:77a30ea425da 122 #define SENSOR_SZ (PPG_SZ+ACCEL_SZ)
phonemacro 30:77a30ea425da 123
phonemacro 30:77a30ea425da 124
phonemacro 0:6f65cae31c54 125 #ifdef ALGO_ONLY
phonemacro 0:6f65cae31c54 126 #define TTL_SZ (ALGO_SZ)
phonemacro 0:6f65cae31c54 127 #else
phonemacro 14:c8cc6d7fd5f9 128 #ifdef RAW
phonemacro 14:c8cc6d7fd5f9 129 #define TTL_SZ (PPG_SZ+ACCEL_SZ)
phonemacro 14:c8cc6d7fd5f9 130 #else
phonemacro 14:c8cc6d7fd5f9 131 #define TTL_SZ (PPG_SZ+ACCEL_SZ+ALGO_SZ)
phonemacro 14:c8cc6d7fd5f9 132 #endif
phonemacro 0:6f65cae31c54 133 #endif
phonemacro 0:6f65cae31c54 134
phonemacro 3:da975696b936 135 Serial pc(USBTX, USBRX, 115200);
phonemacro 0:6f65cae31c54 136 DigitalOut rLED(LED1);
phonemacro 0:6f65cae31c54 137 DigitalOut gLED(LED2);
phonemacro 0:6f65cae31c54 138 DigitalOut bLED(LED3);
phonemacro 6:e1b7190d6cb5 139
phonemacro 6:e1b7190d6cb5 140 //#define thread_sleep_for(x) wait_ms(x) // for older versions of mbed
phonemacro 0:6f65cae31c54 141
phonemacro 5:7f5a012747a5 142
phonemacro 6:e1b7190d6cb5 143 const int SH_ADDR = 0xAA;//0x55;
phonemacro 0:6f65cae31c54 144 int32_t Time_to_Read_PPG = 0;
phonemacro 0:6f65cae31c54 145
phonemacro 0:6f65cae31c54 146 #define BLINKING_RATE_MS 1000ms
phonemacro 0:6f65cae31c54 147 void blink_timer(void) {
phonemacro 0:6f65cae31c54 148 gLED = !gLED; /* blink the green LED */
phonemacro 0:6f65cae31c54 149 }
phonemacro 0:6f65cae31c54 150
phonemacro 0:6f65cae31c54 151 void fifo_timer(void) {
phonemacro 0:6f65cae31c54 152 Time_to_Read_PPG = 1;
phonemacro 0:6f65cae31c54 153 }
phonemacro 0:6f65cae31c54 154
phonemacro 14:c8cc6d7fd5f9 155 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 156 // read_sh_fifo
phonemacro 14:c8cc6d7fd5f9 157 /*****************************************************************************/
phonemacro 27:a45d6e38f2de 158 /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
phonemacro 28:315604f4b374 159 #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 160 #ifdef OPTIMIZE_FIFO_READ // tested on MAXM86146EVSYS
phonemacro 27:a45d6e38f2de 161 int32_t check_fifo_countdown;
phonemacro 27:a45d6e38f2de 162 #define MAX_FIFO_CNT 20
phonemacro 27:a45d6e38f2de 163 #endif
phonemacro 10:192ea88e964b 164 void read_sh_fifo(void) {
phonemacro 0:6f65cae31c54 165 char cmd[8], i, j, samples;
phonemacro 0:6f65cae31c54 166 char rsp[3000];
phonemacro 0:6f65cae31c54 167 int32_t ppg[12];
phonemacro 5:7f5a012747a5 168 int16_t accel[3];
phonemacro 12:17a0bf823462 169 int32_t status, opmode, hr, hr_conf, ibi, ibi_conf;
phonemacro 12:17a0bf823462 170 #ifdef EXTENDED_ALGO
phonemacro 12:17a0bf823462 171 int32_t walk_stp, run_stp, energy, amr, iadj1_rqt, iadj1, iadj2_rqt, iadj2, iadj3_rqt, iadj3;
phonemacro 12:17a0bf823462 172 int32_t intadj_rqt, intadj, smpladj_rqt, smpladj, rqt_smplave, afestatehr, hr_motion;
phonemacro 12:17a0bf823462 173 #endif
phonemacro 12:17a0bf823462 174 int32_t act, r, spo2, spo2_conf;
phonemacro 4:4f1e9439f048 175 int32_t spo2_compl, spo2_lo, spo2_mo, spo2_lopi, spo2_unrel, spo2_state, ibi_offset, scd;
phonemacro 2:563d90a111b3 176 int32_t scnt = 0;
phonemacro 0:6f65cae31c54 177 int32_t ptr = 0;
phonemacro 0:6f65cae31c54 178 int32_t sptr = 0;
phonemacro 1:da792e46a385 179 mfio = 0; wait_us(300);
phonemacro 0:6f65cae31c54 180 Time_to_Read_PPG = 0;
phonemacro 27:a45d6e38f2de 181 #if defined(OPTIMIZE_FIFO_READ)
phonemacro 27:a45d6e38f2de 182 check_fifo_countdown--;
phonemacro 27:a45d6e38f2de 183 samples = 1;
phonemacro 27:a45d6e38f2de 184 scnt = 1;
phonemacro 27:a45d6e38f2de 185 if (check_fifo_countdown == 0) {
phonemacro 27:a45d6e38f2de 186 #endif
phonemacro 27:a45d6e38f2de 187
phonemacro 22:f6b366c3b954 188 #if defined(MAXREFDES103_CFG) || defined(MAXM86161_CFG)
phonemacro 0:6f65cae31c54 189 // 2.1
phonemacro 27:a45d6e38f2de 190 cmd[0] = 0x00; cmd[1] = 0x00;
phonemacro 27:a45d6e38f2de 191 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 27:a45d6e38f2de 192 wait_us(100);
phonemacro 27:a45d6e38f2de 193 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 27:a45d6e38f2de 194 // pc.printf("2.1 Status: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 22:f6b366c3b954 195 #else
phonemacro 22:f6b366c3b954 196 // testd 33.13.12 doesn't need 2.1
phonemacro 0:6f65cae31c54 197 #endif
phonemacro 0:6f65cae31c54 198 // 2.2
phonemacro 27:a45d6e38f2de 199 cmd[0] = 0x12; cmd[1] = 0x00;
phonemacro 27:a45d6e38f2de 200 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 27:a45d6e38f2de 201 wait_us(100);
phonemacro 27:a45d6e38f2de 202 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 27:a45d6e38f2de 203 // pc.printf("2.2 Status: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 27:a45d6e38f2de 204 samples = rsp[1];
phonemacro 27:a45d6e38f2de 205 // pc.printf("num samples %d, (num*ttl)+1 %d\n\r", rsp[1], TTL_SZ*samples+1);
phonemacro 27:a45d6e38f2de 206 // pc.printf("num smpls %d \n\r", samples);
phonemacro 27:a45d6e38f2de 207 scnt = rsp[1];
phonemacro 27:a45d6e38f2de 208 #if defined(OPTIMIZE_FIFO_READ)
phonemacro 27:a45d6e38f2de 209 }
phonemacro 27:a45d6e38f2de 210 if (check_fifo_countdown <= 0)
phonemacro 27:a45d6e38f2de 211 check_fifo_countdown = MAX_FIFO_CNT;
phonemacro 27:a45d6e38f2de 212 #endif
phonemacro 27:a45d6e38f2de 213
phonemacro 0:6f65cae31c54 214 // 2.3
phonemacro 4:4f1e9439f048 215 cmd[0] = 0x12; cmd[1] = 0x01;
phonemacro 6:e1b7190d6cb5 216 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 22:f6b366c3b954 217 wait_us(100);
phonemacro 6:e1b7190d6cb5 218 sh_i2c.read(SH_ADDR, rsp, 1+(TTL_SZ*samples));
phonemacro 22:f6b366c3b954 219 mfio = 1;
phonemacro 21:67d58af1ec56 220
phonemacro 0:6f65cae31c54 221 status = rsp[0];
phonemacro 5:7f5a012747a5 222
phonemacro 0:6f65cae31c54 223 sptr = 1;
phonemacro 0:6f65cae31c54 224 for (i = 0; i < scnt; i++) {
phonemacro 0:6f65cae31c54 225 #ifdef ALGO_ONLY
phonemacro 0:6f65cae31c54 226 ptr = sptr;
phonemacro 0:6f65cae31c54 227 #else
phonemacro 2:563d90a111b3 228 ptr = sptr;
phonemacro 2:563d90a111b3 229 ppg[0] = (rsp[ptr+0] << 16) | (rsp[ptr+1] << 8) | (rsp[ptr+2]);
phonemacro 2:563d90a111b3 230 ppg[1] = (rsp[ptr+3] << 16) | (rsp[ptr+4] << 8) | (rsp[ptr+5]);
phonemacro 2:563d90a111b3 231 ppg[2] = (rsp[ptr+6] << 16) | (rsp[ptr+7] << 8) | (rsp[ptr+8]);
phonemacro 3:da975696b936 232 ppg[3] = (rsp[ptr+9] << 16) | (rsp[ptr+10] << 8) | (rsp[ptr+11]);
phonemacro 4:4f1e9439f048 233 ppg[4] = (rsp[ptr+12] << 16) | (rsp[ptr+13] << 8) | (rsp[ptr+14]);
phonemacro 4:4f1e9439f048 234 ppg[5] = (rsp[ptr+15] << 16) | (rsp[ptr+16] << 8) | (rsp[ptr+17]);
phonemacro 3:da975696b936 235 pc.printf("%d,%d,%d,%d,", ppg[0], ppg[1], ppg[2], ppg[3]);
phonemacro 14:c8cc6d7fd5f9 236 #ifdef MAXM86146_CFG
phonemacro 14:c8cc6d7fd5f9 237 pc.printf("%d,%d,", ppg[4], ppg[5]);
phonemacro 14:c8cc6d7fd5f9 238 ppg[6] = (rsp[ptr+18] << 16) | (rsp[ptr+19] << 8) | (rsp[ptr+20]);
phonemacro 14:c8cc6d7fd5f9 239 ppg[7] = (rsp[ptr+21] << 16) | (rsp[ptr+22] << 8) | (rsp[ptr+23]);
phonemacro 14:c8cc6d7fd5f9 240 ppg[8] = (rsp[ptr+24] << 16) | (rsp[ptr+25] << 8) | (rsp[ptr+26]);
phonemacro 14:c8cc6d7fd5f9 241 ppg[9] = (rsp[ptr+27] << 16) | (rsp[ptr+28] << 8) | (rsp[ptr+29]);
phonemacro 14:c8cc6d7fd5f9 242 ppg[10] = (rsp[ptr+30] << 16) | (rsp[ptr+31] << 8) | (rsp[ptr+32]);
phonemacro 14:c8cc6d7fd5f9 243 ppg[11] = (rsp[ptr+33] << 16) | (rsp[ptr+34] << 8) | (rsp[ptr+35]);
phonemacro 14:c8cc6d7fd5f9 244 pc.printf("%d,%d,%d,%d,%d,%d,", ppg[6], ppg[7],ppg[8], ppg[9],ppg[10], ppg[11]);
phonemacro 14:c8cc6d7fd5f9 245 #endif
phonemacro 5:7f5a012747a5 246 accel[0] = (rsp[PPG_SZ+0] << 8) | (rsp[PPG_SZ+1]);
phonemacro 5:7f5a012747a5 247 accel[1] = (rsp[PPG_SZ+2] << 8) | (rsp[PPG_SZ+3]);
phonemacro 5:7f5a012747a5 248 accel[2] = (rsp[PPG_SZ+4] << 8) | (rsp[PPG_SZ+5]);
phonemacro 5:7f5a012747a5 249 pc.printf("%d,%d,%d,", accel[0], accel[1], accel[2]);
phonemacro 5:7f5a012747a5 250
phonemacro 0:6f65cae31c54 251 ptr = sptr + SENSOR_SZ;
phonemacro 0:6f65cae31c54 252 #endif
phonemacro 29:a7dd81450b35 253
phonemacro 14:c8cc6d7fd5f9 254 #ifndef RAW
phonemacro 12:17a0bf823462 255 #ifdef EXTENDED_ALGO
phonemacro 3:da975696b936 256 // pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ);
phonemacro 0:6f65cae31c54 257 opmode = rsp[ptr];
phonemacro 0:6f65cae31c54 258 hr = (rsp[ptr+1] << 8) + rsp[ptr+2];
phonemacro 0:6f65cae31c54 259 hr_conf = rsp[ptr+3];
phonemacro 12:17a0bf823462 260 ibi = (rsp[ptr+4] << 8) + rsp[ptr+5];
phonemacro 12:17a0bf823462 261
phonemacro 12:17a0bf823462 262 ibi_conf = rsp[ptr+6];
phonemacro 12:17a0bf823462 263 act = rsp[ptr+7];
phonemacro 12:17a0bf823462 264 walk_stp = (rsp[ptr+8] << 24) + (rsp[ptr+9] << 16) + (rsp[ptr+10] << 8) + rsp[ptr+11];
phonemacro 12:17a0bf823462 265 run_stp = (rsp[ptr+12] << 24) + (rsp[ptr+13] << 16) + (rsp[ptr+14] << 8) + rsp[ptr+15];
phonemacro 12:17a0bf823462 266
phonemacro 12:17a0bf823462 267 energy = (rsp[ptr+16] << 24) + (rsp[ptr+17] << 16) + (rsp[ptr+18] << 8) + rsp[ptr+19];
phonemacro 12:17a0bf823462 268 amr = (rsp[ptr+20] << 24) + (rsp[ptr+21] << 16) + (rsp[ptr+22] << 8) + rsp[ptr+23];
phonemacro 12:17a0bf823462 269 iadj1_rqt = rsp[ptr+24];
phonemacro 12:17a0bf823462 270 iadj1 = (rsp[ptr+25] << 8) + rsp[ptr+26];
phonemacro 12:17a0bf823462 271
phonemacro 12:17a0bf823462 272 iadj2_rqt = rsp[ptr+27];
phonemacro 12:17a0bf823462 273 iadj2 = (rsp[ptr+28] << 8) + rsp[ptr+29];
phonemacro 12:17a0bf823462 274 iadj3_rqt = rsp[ptr+30];
phonemacro 12:17a0bf823462 275 iadj3 = (rsp[ptr+31] << 8) + rsp[ptr+32];
phonemacro 12:17a0bf823462 276
phonemacro 12:17a0bf823462 277 intadj_rqt = rsp[ptr+33];
phonemacro 12:17a0bf823462 278 intadj = rsp[ptr+34];
phonemacro 12:17a0bf823462 279 smpladj_rqt = rsp[ptr+35];
phonemacro 12:17a0bf823462 280 smpladj = rsp[ptr+36];
phonemacro 12:17a0bf823462 281
phonemacro 12:17a0bf823462 282 rqt_smplave = rsp[ptr+37];
phonemacro 12:17a0bf823462 283 afestatehr = rsp[ptr+38];
phonemacro 12:17a0bf823462 284 hr_motion = rsp[ptr+39];
phonemacro 12:17a0bf823462 285 scd = rsp[ptr+40];
phonemacro 12:17a0bf823462 286
phonemacro 12:17a0bf823462 287
phonemacro 12:17a0bf823462 288 r = (rsp[ptr+41] << 8) + rsp[ptr+42];
phonemacro 12:17a0bf823462 289 spo2_conf = rsp[ptr+43];
phonemacro 12:17a0bf823462 290
phonemacro 12:17a0bf823462 291 spo2 = (rsp[ptr+44] << 8) + rsp[ptr+45];
phonemacro 12:17a0bf823462 292 spo2_compl = rsp[ptr+46];
phonemacro 12:17a0bf823462 293 spo2_lo = rsp[ptr+47];
phonemacro 12:17a0bf823462 294 spo2_mo = rsp[ptr+48];
phonemacro 12:17a0bf823462 295
phonemacro 12:17a0bf823462 296 spo2_lopi = rsp[ptr+49];
phonemacro 12:17a0bf823462 297 spo2_unrel = rsp[ptr+50];
phonemacro 12:17a0bf823462 298 spo2_state = rsp[ptr+51];
phonemacro 12:17a0bf823462 299
phonemacro 12:17a0bf823462 300 ibi_offset = rsp[ptr+52];
phonemacro 12:17a0bf823462 301
phonemacro 12:17a0bf823462 302 sptr += (TTL_SZ);
phonemacro 12:17a0bf823462 303 #if 1
phonemacro 12:17a0bf823462 304 pc.printf("%d,%d,%d,%d,", opmode, hr, hr_conf, ibi);
phonemacro 12:17a0bf823462 305 pc.printf("%d,%d,", ibi_conf, act);
phonemacro 12:17a0bf823462 306 pc.printf("%d,%d,%d,", walk_stp, run_stp, energy);
phonemacro 12:17a0bf823462 307 pc.printf("%d,%d,%d,%d,", amr, iadj1_rqt, iadj1, iadj2_rqt);
phonemacro 12:17a0bf823462 308 pc.printf("%d,%d,%d,%d,", iadj2, iadj3_rqt, iadj3, intadj_rqt);
phonemacro 12:17a0bf823462 309 pc.printf("%d,%d,%d,%d,", intadj, smpladj_rqt, smpladj, rqt_smplave);
phonemacro 12:17a0bf823462 310 pc.printf("%d,%d,", afestatehr, hr_motion);
phonemacro 12:17a0bf823462 311 pc.printf("%d,", scd);
phonemacro 12:17a0bf823462 312 pc.printf("%d,%d,%d,%d,", spo2, spo2_compl, spo2_lo, spo2_mo);
phonemacro 12:17a0bf823462 313 pc.printf("%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state);
phonemacro 12:17a0bf823462 314 pc.printf("%d,", ibi_offset);
phonemacro 12:17a0bf823462 315 #else
phonemacro 12:17a0bf823462 316 pc.printf("%d,%d,", hr, hr_conf);
phonemacro 12:17a0bf823462 317 pc.printf("%d,%d,", spo2, spo2_conf);
phonemacro 16:ff1122f0624a 318 pc.printf("%d,%d,%d,", spo2_lo, spo2_mo, spo2_lopi);
phonemacro 12:17a0bf823462 319 pc.printf("%d,%d,", spo2_unrel, scd);
phonemacro 12:17a0bf823462 320 #endif
phonemacro 12:17a0bf823462 321 #else // normal algo size
phonemacro 12:17a0bf823462 322 // pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ);
phonemacro 12:17a0bf823462 323 opmode = rsp[ptr];
phonemacro 12:17a0bf823462 324 hr = (rsp[ptr+1] << 8) + rsp[ptr+2];
phonemacro 12:17a0bf823462 325 hr_conf = rsp[ptr+3];
phonemacro 12:17a0bf823462 326 ibi = (rsp[ptr+4] << 8) + rsp[ptr+5];
phonemacro 4:4f1e9439f048 327
phonemacro 11:a16b6bf38841 328 ibi_conf = rsp[ptr+6];
phonemacro 3:da975696b936 329 act = rsp[ptr+7];
phonemacro 3:da975696b936 330 r = (rsp[ptr+8] << 8) + rsp[ptr+9];
phonemacro 0:6f65cae31c54 331 spo2_conf = rsp[ptr+10];
phonemacro 4:4f1e9439f048 332
phonemacro 0:6f65cae31c54 333 spo2 = (rsp[ptr+11] << 8) + rsp[ptr+12];
phonemacro 4:4f1e9439f048 334 spo2_compl = rsp[ptr+13];
phonemacro 4:4f1e9439f048 335 spo2_lo = rsp[ptr+14];
phonemacro 4:4f1e9439f048 336 spo2_mo = rsp[ptr+15];
phonemacro 4:4f1e9439f048 337
phonemacro 4:4f1e9439f048 338 spo2_lopi = rsp[ptr+16];
phonemacro 4:4f1e9439f048 339 spo2_unrel = rsp[ptr+17];
phonemacro 4:4f1e9439f048 340 spo2_state = rsp[ptr+18];
phonemacro 2:563d90a111b3 341 scd = rsp[ptr+19];
phonemacro 0:6f65cae31c54 342
phonemacro 4:4f1e9439f048 343 ibi_offset = rsp[ptr+20];
phonemacro 0:6f65cae31c54 344
phonemacro 4:4f1e9439f048 345 sptr += (TTL_SZ);
phonemacro 27:a45d6e38f2de 346 #if 0
phonemacro 4:4f1e9439f048 347 pc.printf("%d,%d,%d,%d,", opmode, hr, hr_conf, ibi);
phonemacro 4:4f1e9439f048 348 pc.printf("%d,%d,%d,%d,", ibi_conf, act, r, spo2_conf);
phonemacro 4:4f1e9439f048 349 pc.printf("%d,%d,%d,%d,", spo2, spo2_compl, spo2_lo, spo2_mo);
phonemacro 4:4f1e9439f048 350 pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state, scd);
phonemacro 4:4f1e9439f048 351 pc.printf("%d,", ibi_offset);
phonemacro 4:4f1e9439f048 352 #else
phonemacro 4:4f1e9439f048 353 pc.printf("%d,%d,", hr, hr_conf);
phonemacro 4:4f1e9439f048 354 pc.printf("%d,%d,", spo2, spo2_conf);
phonemacro 4:4f1e9439f048 355 pc.printf("%d,", spo2_lo);
phonemacro 4:4f1e9439f048 356 pc.printf("%d,%d,", spo2_unrel, scd);
phonemacro 4:4f1e9439f048 357 #endif
phonemacro 12:17a0bf823462 358 #endif // end normal algo size
phonemacro 14:c8cc6d7fd5f9 359 #endif // !RAW
phonemacro 4:4f1e9439f048 360
phonemacro 3:da975696b936 361 pc.printf("\n\r");
phonemacro 0:6f65cae31c54 362 }
phonemacro 0:6f65cae31c54 363 }
phonemacro 0:6f65cae31c54 364
phonemacro 6:e1b7190d6cb5 365 #ifdef MAXREFDES103_CFG
phonemacro 14:c8cc6d7fd5f9 366 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 367 // init_max20303_pmic
phonemacro 14:c8cc6d7fd5f9 368 /*****************************************************************************/
phonemacro 6:e1b7190d6cb5 369 void init_max20303_pmic(void) {
phonemacro 5:7f5a012747a5 370 /* Wait for pmic to settle down */
phonemacro 5:7f5a012747a5 371 thread_sleep_for(800);
phonemacro 5:7f5a012747a5 372
phonemacro 5:7f5a012747a5 373 //set_time(1544787300); // Set RTC time to Wed, 28 Oct 2009 11:35:37
phonemacro 6:e1b7190d6cb5 374 MAX20303 max20303(&sh_i2c);
phonemacro 5:7f5a012747a5 375 /*Set LDO1 to 1.8v*/
phonemacro 5:7f5a012747a5 376 max20303.LDO1Config();
phonemacro 5:7f5a012747a5 377
phonemacro 5:7f5a012747a5 378 /*Set LDO2 to 3v*/
phonemacro 5:7f5a012747a5 379 max20303.LDO2Config();
phonemacro 5:7f5a012747a5 380
phonemacro 5:7f5a012747a5 381 //max20303.BoostEnable();
phonemacro 5:7f5a012747a5 382 max20303.BuckBoostEnable();
phonemacro 5:7f5a012747a5 383
phonemacro 5:7f5a012747a5 384 max20303.led0on(0);
phonemacro 5:7f5a012747a5 385 max20303.led1on(0);
phonemacro 5:7f5a012747a5 386 max20303.led2on(0);
phonemacro 5:7f5a012747a5 387
phonemacro 5:7f5a012747a5 388 /* Wait for pmic to settle down */
phonemacro 5:7f5a012747a5 389 thread_sleep_for(200);
phonemacro 28:315604f4b374 390
phonemacro 5:7f5a012747a5 391 }
phonemacro 6:e1b7190d6cb5 392 #endif // MAXREFDES103_CFG
phonemacro 14:c8cc6d7fd5f9 393
phonemacro 14:c8cc6d7fd5f9 394 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 395 // init_sh_algo
phonemacro 14:c8cc6d7fd5f9 396 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 397 void init_sh_algo(void) {
phonemacro 14:c8cc6d7fd5f9 398 char cmd[8];
phonemacro 0:6f65cae31c54 399 char rsp[256];
phonemacro 27:a45d6e38f2de 400
phonemacro 27:a45d6e38f2de 401 #ifdef OPTIMIZE_FIFO_READ
phonemacro 27:a45d6e38f2de 402 check_fifo_countdown = MAX_FIFO_CNT;
phonemacro 27:a45d6e38f2de 403 #endif
phonemacro 27:a45d6e38f2de 404
phonemacro 10:192ea88e964b 405 // switch to application mode
phonemacro 0:6f65cae31c54 406 rst = 0;
phonemacro 0:6f65cae31c54 407 mfio = 1;
phonemacro 0:6f65cae31c54 408 thread_sleep_for(10);
phonemacro 0:6f65cae31c54 409 rst = 1;
phonemacro 0:6f65cae31c54 410 thread_sleep_for(1500);
phonemacro 10:192ea88e964b 411 #ifdef MAXREFDES103_CFG
phonemacro 10:192ea88e964b 412 init_max20303_pmic();
phonemacro 10:192ea88e964b 413 #endif
phonemacro 23:e7ecf1416965 414 #if 0 // 1.5s is ok for 33.13.12
phonemacro 23:e7ecf1416965 415 thread_sleep_for(250);
phonemacro 20:7fc26287beb7 416 #endif
phonemacro 0:6f65cae31c54 417
phonemacro 1:da792e46a385 418 mfio = 0; wait_us(300);
phonemacro 4:4f1e9439f048 419
phonemacro 4:4f1e9439f048 420 //read operating mode
phonemacro 4:4f1e9439f048 421 cmd[0] = 0x02; cmd[1] = 0x00;
phonemacro 6:e1b7190d6cb5 422 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 1:da792e46a385 423 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 424 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 6:e1b7190d6cb5 425 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 426 pc.printf("\n\r 0x02 0x00 Status, Read Operating Mode: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 5:7f5a012747a5 427 //1.11 rd ver
phonemacro 4:4f1e9439f048 428 cmd[0] = 0xFF; cmd[1] = 0x03;
phonemacro 6:e1b7190d6cb5 429 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 1:da792e46a385 430 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 431 sh_i2c.read(SH_ADDR, rsp, 4);
phonemacro 1:da792e46a385 432 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 433 pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]);
phonemacro 0:6f65cae31c54 434
phonemacro 28:315604f4b374 435 #if defined(MAXM86161_CFG)
phonemacro 28:315604f4b374 436 // algo sz normal
phonemacro 17:0d6e99a0fd8d 437 cmd[0] = 0x11; cmd[1] = 0x06; cmd[2] = 0x01;
phonemacro 17:0d6e99a0fd8d 438 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 17:0d6e99a0fd8d 439 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 440 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 17:0d6e99a0fd8d 441 mfio = 1; mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 442 pc.printf("algo size: %d %d \n\r", rsp[0], rsp[1]);
phonemacro 17:0d6e99a0fd8d 443
phonemacro 28:315604f4b374 444 // algo sz extended
phonemacro 17:0d6e99a0fd8d 445 cmd[0] = 0x11; cmd[1] = 0x06; cmd[2] = 0x02;
phonemacro 17:0d6e99a0fd8d 446 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 17:0d6e99a0fd8d 447 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 448 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 17:0d6e99a0fd8d 449 mfio = 1; mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 450 pc.printf("algo size: %d %d \n\r", rsp[0], rsp[1]);
phonemacro 17:0d6e99a0fd8d 451
phonemacro 28:315604f4b374 452 // algo sz scd
phonemacro 17:0d6e99a0fd8d 453 cmd[0] = 0x11; cmd[1] = 0x06; cmd[2] = 0x03;
phonemacro 17:0d6e99a0fd8d 454 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 17:0d6e99a0fd8d 455 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 456 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 17:0d6e99a0fd8d 457 mfio = 1; mfio = 0; wait_us(300);
phonemacro 17:0d6e99a0fd8d 458 pc.printf("algo size: %d %d \n\r", rsp[0], rsp[1]);
phonemacro 17:0d6e99a0fd8d 459 #endif
phonemacro 17:0d6e99a0fd8d 460
phonemacro 17:0d6e99a0fd8d 461 #if 0
phonemacro 17:0d6e99a0fd8d 462 // set Perfusion Index threshold to .05 (3x.13.19+)
phonemacro 17:0d6e99a0fd8d 463 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x1D; cmd[3] = 50;
phonemacro 16:ff1122f0624a 464 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 16:ff1122f0624a 465 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 16:ff1122f0624a 466 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 16:ff1122f0624a 467 mfio = 1; mfio = 0; wait_us(300);
phonemacro 16:ff1122f0624a 468 pc.printf("pi set to 0x19 : %x \n\r", rsp[0]);
phonemacro 17:0d6e99a0fd8d 469 #endif
phonemacro 16:ff1122f0624a 470
phonemacro 0:6f65cae31c54 471 // 1.3 sensor and algo data
phonemacro 4:4f1e9439f048 472 cmd[0] = 0x10; cmd[1] = 0x00;
phonemacro 2:563d90a111b3 473 #ifdef ALGO_ONLY
phonemacro 0:6f65cae31c54 474 cmd[2] = 0x02; // algo data
phonemacro 4:4f1e9439f048 475 pc.printf("algo only \n\r");
phonemacro 2:563d90a111b3 476 #else
phonemacro 2:563d90a111b3 477 cmd[2] = 0x03; // sensor + algo data
phonemacro 4:4f1e9439f048 478 pc.printf("sens+algo \n\r");
phonemacro 2:563d90a111b3 479 #endif
phonemacro 6:e1b7190d6cb5 480 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 1:da792e46a385 481 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 482 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 483 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 484 pc.printf("1.3 Status: %x\n\r", rsp[0]);
phonemacro 4:4f1e9439f048 485 // 1.8 AEC enable (default)
phonemacro 4:4f1e9439f048 486 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; cmd[3] = 0x01;
phonemacro 6:e1b7190d6cb5 487 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 1:da792e46a385 488 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 489 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 490 mfio = 1; mfio = 0; wait_us(300);
phonemacro 4:4f1e9439f048 491 pc.printf("1.8 Status: %x\n\r", rsp[0]);
phonemacro 13:1baccc6275a7 492 #if AGC
phonemacro 13:1baccc6275a7 493 // AGC1.8 Disable auto PD (default
phonemacro 13:1baccc6275a7 494 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x00;
phonemacro 13:1baccc6275a7 495 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 13:1baccc6275a7 496 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 497 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 13:1baccc6275a7 498 mfio = 1; mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 499 pc.printf("AGC1.8 Status: %x\n\r", rsp[0]);
phonemacro 13:1baccc6275a7 500 // AGC1.9 Disable SCD (default)
phonemacro 13:1baccc6275a7 501 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x00;
phonemacro 13:1baccc6275a7 502 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 13:1baccc6275a7 503 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 504 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 13:1baccc6275a7 505 mfio = 1; mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 506 pc.printf("AGC1.9 Status: %x\n\r", rsp[0]);
phonemacro 13:1baccc6275a7 507 // AGC1.10 Set AGC target PD TO 10uA
phonemacro 13:1baccc6275a7 508 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x11; cmd[3] = 0x00; cmd[3] = 0x64;
phonemacro 13:1baccc6275a7 509 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 13:1baccc6275a7 510 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 511 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 13:1baccc6275a7 512 mfio = 1; mfio = 0; wait_us(300);
phonemacro 13:1baccc6275a7 513 pc.printf("AGC1.10 Status: %x\n\r", rsp[0]);
phonemacro 13:1baccc6275a7 514 #else
phonemacro 4:4f1e9439f048 515 // 1.9 auto PD (default
phonemacro 4:4f1e9439f048 516 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x01;
phonemacro 6:e1b7190d6cb5 517 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 1:da792e46a385 518 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 519 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 520 mfio = 1; mfio = 0; wait_us(300);
phonemacro 4:4f1e9439f048 521 pc.printf("1.9 Status: %x\n\r", rsp[0]);
phonemacro 4:4f1e9439f048 522 // 1.10 SCD (default)
phonemacro 4:4f1e9439f048 523 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x01;
phonemacro 6:e1b7190d6cb5 524 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 4:4f1e9439f048 525 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 526 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 4:4f1e9439f048 527 mfio = 1; mfio = 0; wait_us(300);
phonemacro 4:4f1e9439f048 528 pc.printf("1.7 Status: %x\n\r", rsp[0]);
phonemacro 13:1baccc6275a7 529 #endif
phonemacro 28:315604f4b374 530
phonemacro 28:315604f4b374 531 #if defined(MAXM86161_CFG) //only use Red and IR
phonemacro 30:77a30ea425da 532 //1.20 Sec 4.1 map leds to slots
phonemacro 28:315604f4b374 533 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x23; cmd[4] = 0x00; cmd[5] = 0x00;
phonemacro 28:315604f4b374 534 sh_i2c.write(SH_ADDR, cmd, 6);
phonemacro 28:315604f4b374 535 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 536 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 537 mfio = 1; mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 538 pc.printf("map leds to slots %x\n\r", rsp[0]);
phonemacro 30:77a30ea425da 539 //1.21 map HR inputs to slots, default is 0x0073 for MAXM86161
phonemacro 30:77a30ea425da 540 #if 0 // NA for MAXM86161
phonemacro 28:315604f4b374 541 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x73;
phonemacro 28:315604f4b374 542 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 28:315604f4b374 543 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 544 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 545 mfio = 1; mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 546 pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
phonemacro 30:77a30ea425da 547 #endif
phonemacro 28:315604f4b374 548 //1.22 map SpO2 inputs to slots
phonemacro 28:315604f4b374 549 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x00; cmd[4] = 0x10;
phonemacro 28:315604f4b374 550 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 28:315604f4b374 551 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 552 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 553 mfio = 1; mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 554 pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 555 #endif
phonemacro 28:315604f4b374 556
phonemacro 3:da975696b936 557 #ifdef MAXM86146_CFG
phonemacro 3:da975696b936 558 //1.20 Sec 4.1 map leds to slots for MAXM86146
phonemacro 4:4f1e9439f048 559 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x13; cmd[4] = 0x56; cmd[5] = 0x00;
phonemacro 6:e1b7190d6cb5 560 sh_i2c.write(SH_ADDR, cmd, 6);
phonemacro 3:da975696b936 561 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 562 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 3:da975696b936 563 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 564 pc.printf("map leds to slots %x\n\r", rsp[0]);
phonemacro 3:da975696b936 565 //1.21 map HR inputs to slots
phonemacro 4:4f1e9439f048 566 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x11;
phonemacro 6:e1b7190d6cb5 567 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 3:da975696b936 568 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 569 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 3:da975696b936 570 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 571 pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
phonemacro 3:da975696b936 572 //1.22 map SpO2 inputs to slots
phonemacro 4:4f1e9439f048 573 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x30; cmd[4] = 0x20;
phonemacro 6:e1b7190d6cb5 574 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 3:da975696b936 575 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 576 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 3:da975696b936 577 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 578 pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
phonemacro 26:33c0d3fd2a95 579
phonemacro 3:da975696b936 580 #if 0
phonemacro 2:563d90a111b3 581 //1.20 Sec 4.1 map leds to slots for MAXM86146
phonemacro 4:4f1e9439f048 582 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x15; cmd[4] = 0x60; cmd[5] = 0x00;
phonemacro 6:e1b7190d6cb5 583 sh_i2c.write(SH_ADDR, cmd, 6);
phonemacro 1:da792e46a385 584 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 585 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 586 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 587 pc.printf("map leds to slots%x\n\r", rsp[0]);
phonemacro 2:563d90a111b3 588 //1.21 map HR inputs to slots
phonemacro 4:4f1e9439f048 589 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x01;
phonemacro 6:e1b7190d6cb5 590 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 1:da792e46a385 591 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 592 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 593 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 594 pc.printf("map HR to slots/PDs %x\n\r", rsp[0]);
phonemacro 2:563d90a111b3 595 //1.22 map SpO2 inputs to slots
phonemacro 4:4f1e9439f048 596 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x20; cmd[4] = 0x10;
phonemacro 6:e1b7190d6cb5 597 sh_i2c.write(SH_ADDR, cmd, 5);
phonemacro 1:da792e46a385 598 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 599 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 1:da792e46a385 600 mfio = 1; mfio = 0; wait_us(300);
phonemacro 3:da975696b936 601 pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]);
phonemacro 3:da975696b936 602 #endif
phonemacro 3:da975696b936 603 #endif // MAXM86146_CFG
phonemacro 0:6f65cae31c54 604
phonemacro 30:77a30ea425da 605 // 1.7 cont hr, spo2
phonemacro 30:77a30ea425da 606 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00;
phonemacro 30:77a30ea425da 607 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 30:77a30ea425da 608 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 30:77a30ea425da 609 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 30:77a30ea425da 610 mfio = 1; mfio = 0; wait_us(300);
phonemacro 30:77a30ea425da 611 pc.printf("1.7 Status: %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 612
phonemacro 28:315604f4b374 613 #if 0 // MAXM86161 test new commands
phonemacro 28:315604f4b374 614 // LDO enable
phonemacro 28:315604f4b374 615 cmd[0] = 0x10; cmd[1] = 0x12; cmd[2] = 0x01;
phonemacro 28:315604f4b374 616 //cmd[0] = 0x10; cmd[1] = 0x12; cmd[2] = 0x00;
phonemacro 28:315604f4b374 617 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 28:315604f4b374 618 thread_sleep_for(2);
phonemacro 28:315604f4b374 619 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 620 pc.printf("\n\r ldo en %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 621 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 622 // GPIO enable
phonemacro 28:315604f4b374 623 cmd[0] = 0x10; cmd[1] = 0x13; cmd[2] = 0x01;
phonemacro 28:315604f4b374 624 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 28:315604f4b374 625 thread_sleep_for(2);
phonemacro 28:315604f4b374 626 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 627 pc.printf("\n\r gpio en %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 628 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 629 #endif
phonemacro 28:315604f4b374 630
phonemacro 4:4f1e9439f048 631 // 1.3 Enable HR, SpO2 algo
phonemacro 12:17a0bf823462 632 #ifdef EXTENDED_ALGO
phonemacro 12:17a0bf823462 633 cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x02;
phonemacro 12:17a0bf823462 634 #else
phonemacro 4:4f1e9439f048 635 cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x01;
phonemacro 12:17a0bf823462 636 #endif
phonemacro 6:e1b7190d6cb5 637 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 28:315604f4b374 638 mfio = 1;
phonemacro 0:6f65cae31c54 639 thread_sleep_for(465);
phonemacro 28:315604f4b374 640 mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 641 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 3:da975696b936 642 pc.printf("1.14 status: %x\n\r", rsp[0]);
phonemacro 0:6f65cae31c54 643
phonemacro 4:4f1e9439f048 644 #if 1
phonemacro 4:4f1e9439f048 645 //1.31 rd AFE part id
phonemacro 4:4f1e9439f048 646 cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF;
phonemacro 6:e1b7190d6cb5 647 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 4:4f1e9439f048 648 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 649 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 4:4f1e9439f048 650 mfio = 1; mfio = 0; wait_us(300);
phonemacro 4:4f1e9439f048 651 pc.printf("1.31 part id afe %x %x\n\r", rsp[0], rsp[1]);
phonemacro 4:4f1e9439f048 652 //1.32 rd accel who
phonemacro 4:4f1e9439f048 653 cmd[0] = 0x41; cmd[1] = 0x04; cmd[2] = 0x0F;
phonemacro 6:e1b7190d6cb5 654 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 4:4f1e9439f048 655 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 6:e1b7190d6cb5 656 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 4:4f1e9439f048 657 mfio = 1; mfio = 0; wait_us(300);
phonemacro 4:4f1e9439f048 658 pc.printf("1.32 who accel %x %x\n\r", rsp[0], rsp[1]);
phonemacro 28:315604f4b374 659 #endif
phonemacro 26:33c0d3fd2a95 660 mfio = 1;
phonemacro 10:192ea88e964b 661 }
phonemacro 10:192ea88e964b 662
phonemacro 14:c8cc6d7fd5f9 663 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 664 // init_sh_raw
phonemacro 14:c8cc6d7fd5f9 665 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 666 void init_sh_raw(void) {
phonemacro 29:a7dd81450b35 667 char cmd[16];
phonemacro 14:c8cc6d7fd5f9 668 char rsp[256];
phonemacro 14:c8cc6d7fd5f9 669 // switch to application mode
phonemacro 14:c8cc6d7fd5f9 670 rst = 0;
phonemacro 14:c8cc6d7fd5f9 671 mfio = 1;
phonemacro 14:c8cc6d7fd5f9 672 thread_sleep_for(10);
phonemacro 14:c8cc6d7fd5f9 673 rst = 1;
phonemacro 14:c8cc6d7fd5f9 674 thread_sleep_for(1500);
phonemacro 14:c8cc6d7fd5f9 675 #ifdef MAXREFDES103_CFG
phonemacro 14:c8cc6d7fd5f9 676 init_max20303_pmic();
phonemacro 14:c8cc6d7fd5f9 677 #endif
phonemacro 14:c8cc6d7fd5f9 678
phonemacro 14:c8cc6d7fd5f9 679 mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 680
phonemacro 14:c8cc6d7fd5f9 681 //read operating mode
phonemacro 14:c8cc6d7fd5f9 682 cmd[0] = 0x02; cmd[1] = 0x00;
phonemacro 14:c8cc6d7fd5f9 683 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 14:c8cc6d7fd5f9 684 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 685 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 14:c8cc6d7fd5f9 686 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 687 pc.printf("\n\r 0x02 0x00 Status, Read Operating Mode: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 14:c8cc6d7fd5f9 688 //1.11 rd ver
phonemacro 14:c8cc6d7fd5f9 689 cmd[0] = 0xFF; cmd[1] = 0x03;
phonemacro 14:c8cc6d7fd5f9 690 sh_i2c.write(SH_ADDR, cmd, 2);
phonemacro 14:c8cc6d7fd5f9 691 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 692 sh_i2c.read(SH_ADDR, rsp, 4);
phonemacro 14:c8cc6d7fd5f9 693 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 694 pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]);
phonemacro 14:c8cc6d7fd5f9 695
phonemacro 14:c8cc6d7fd5f9 696 // raw1.1 sensor data
phonemacro 14:c8cc6d7fd5f9 697 cmd[0] = 0x10; cmd[1] = 0x00; cmd[2] = 0x01;
phonemacro 14:c8cc6d7fd5f9 698 pc.printf("raw sensor data only \n\r");
phonemacro 14:c8cc6d7fd5f9 699 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 14:c8cc6d7fd5f9 700 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 701 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 702 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 703 pc.printf("raw1.1 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 704 // raw1.2 interrupt threshold
phonemacro 14:c8cc6d7fd5f9 705 cmd[0] = 0x10; cmd[1] = 0x01; cmd[2] = 0x01;
phonemacro 14:c8cc6d7fd5f9 706 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 14:c8cc6d7fd5f9 707 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 708 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 709 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 710 pc.printf("raw1.2 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 711 // raw1.3 enable sh accel
phonemacro 14:c8cc6d7fd5f9 712 cmd[0] = 0x44; cmd[1] = 0x04; cmd[2] = 0x01; cmd[3] = 0x00;
phonemacro 14:c8cc6d7fd5f9 713 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 29:a7dd81450b35 714 mfio = 1; thread_sleep_for(20); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 715 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 29:a7dd81450b35 716 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 717 pc.printf("raw1.3 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 718 // raw1.4 enable AFE
phonemacro 30:77a30ea425da 719 cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; // 3 bytes // tested on 33.13.12, 33.13.19
phonemacro 29:a7dd81450b35 720 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 30:77a30ea425da 721 // cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00;
phonemacro 30:77a30ea425da 722 // sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 30:77a30ea425da 723 // 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 30:77a30ea425da 724 // sh_i2c.write(SH_ADDR, cmd, 9);
phonemacro 29:a7dd81450b35 725 mfio = 1; thread_sleep_for(250); mfio = 0; wait_us(300);
phonemacro 29:a7dd81450b35 726 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 727 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 728 pc.printf("raw1.4 Status: %x\n\r", rsp[0]);
phonemacro 30:77a30ea425da 729 #if 0
phonemacro 30:77a30ea425da 730 // rd accel WHO reg
phonemacro 30:77a30ea425da 731 cmd[0] = 0x41; cmd[1] = 0x04; cmd[2] = 0x0F;
phonemacro 30:77a30ea425da 732 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 30:77a30ea425da 733 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 30:77a30ea425da 734 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 30:77a30ea425da 735 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 30:77a30ea425da 736 pc.printf("part id Status: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 30:77a30ea425da 737 // rd AFE part id
phonemacro 30:77a30ea425da 738 cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF;
phonemacro 30:77a30ea425da 739 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 30:77a30ea425da 740 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 30:77a30ea425da 741 sh_i2c.read(SH_ADDR, rsp, 2);
phonemacro 30:77a30ea425da 742 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 30:77a30ea425da 743 pc.printf("part id Status: %x %x\n\r", rsp[0], rsp[1]);
phonemacro 30:77a30ea425da 744 #endif
phonemacro 14:c8cc6d7fd5f9 745 // raw1.5 sample rate 100 Hz, ave 1
phonemacro 14:c8cc6d7fd5f9 746 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x18; // set AFE reg 0x12 to 100 Hz
phonemacro 14:c8cc6d7fd5f9 747 // cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x20; // set AFE reg 0x12 to 200 Hz
phonemacro 14:c8cc6d7fd5f9 748 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 749 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 750 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 751 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 752 pc.printf("raw1.5 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 753 // raw1.6 LED1 current
phonemacro 29:a7dd81450b35 754 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x3F;
phonemacro 14:c8cc6d7fd5f9 755 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 756 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 757 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 758 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 759 pc.printf("raw1.6 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 760 #ifndef MAXM86146_CFG
phonemacro 14:c8cc6d7fd5f9 761 // raw1.7 LED2 current
phonemacro 14:c8cc6d7fd5f9 762 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x7F;
phonemacro 14:c8cc6d7fd5f9 763 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 764 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 765 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 766 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 767 pc.printf("raw1.7 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 768 #endif
phonemacro 14:c8cc6d7fd5f9 769 // raw1.8 LED3 current
phonemacro 14:c8cc6d7fd5f9 770 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x7F;
phonemacro 14:c8cc6d7fd5f9 771 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 772 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 773 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 774 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 775 pc.printf("raw1.8 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 776 #ifdef MAXM86146_CFG
phonemacro 14:c8cc6d7fd5f9 777 // LED5 current
phonemacro 14:c8cc6d7fd5f9 778 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x27; cmd[3] = 0x7F;
phonemacro 14:c8cc6d7fd5f9 779 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 780 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 781 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 782 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 783 pc.printf("led5 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 784 // LED6 current
phonemacro 14:c8cc6d7fd5f9 785 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x27; cmd[3] = 0x7F;
phonemacro 14:c8cc6d7fd5f9 786 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 787 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 788 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 789 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 790 pc.printf("led6 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 791
phonemacro 14:c8cc6d7fd5f9 792 // Set Seq cntrl1 LED2, LED1
phonemacro 14:c8cc6d7fd5f9 793 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x20; cmd[3] = 0x21;
phonemacro 14:c8cc6d7fd5f9 794 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 795 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 796 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 797 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 798 pc.printf("Seq cntrl1 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 799 // Set Seq cntrl2 LED4, LED3
phonemacro 14:c8cc6d7fd5f9 800 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x21; cmd[3] = 0xA3;
phonemacro 14:c8cc6d7fd5f9 801 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 802 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 803 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 804 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 805 pc.printf("Seq cntrl2 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 806 // Set Seq cntrl3 LED6, LED5
phonemacro 14:c8cc6d7fd5f9 807 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x22; cmd[3] = 0x21;
phonemacro 14:c8cc6d7fd5f9 808 // cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x22; cmd[3] = 0x99; // Ambient
phonemacro 14:c8cc6d7fd5f9 809 sh_i2c.write(SH_ADDR, cmd, 4);
phonemacro 14:c8cc6d7fd5f9 810 mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 811 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 14:c8cc6d7fd5f9 812 mfio = 1; mfio = 0; wait_us(300);
phonemacro 14:c8cc6d7fd5f9 813 pc.printf("Seq cntrl3 Status: %x\n\r", rsp[0]);
phonemacro 14:c8cc6d7fd5f9 814
phonemacro 14:c8cc6d7fd5f9 815 #endif
phonemacro 28:315604f4b374 816 mfio = 1;
phonemacro 28:315604f4b374 817 }
phonemacro 14:c8cc6d7fd5f9 818
phonemacro 14:c8cc6d7fd5f9 819 /*****************************************************************************/
phonemacro 14:c8cc6d7fd5f9 820 // main
phonemacro 14:c8cc6d7fd5f9 821 /*****************************************************************************/
phonemacro 10:192ea88e964b 822 int main()
phonemacro 10:192ea88e964b 823 {
phonemacro 10:192ea88e964b 824 sh_i2c.frequency(400000);
phonemacro 10:192ea88e964b 825 int32_t ledcnt = 0;
phonemacro 10:192ea88e964b 826 rLED = LED_OFF; gLED = LED_ON; bLED = LED_OFF;
phonemacro 10:192ea88e964b 827 Ticker ticker; // calls a callback repeatedly with a timeout
phonemacro 28:315604f4b374 828
phonemacro 28:315604f4b374 829 #if 0 // test disable algo
phonemacro 28:315604f4b374 830 char cmd[8];
phonemacro 28:315604f4b374 831 char rsp[256];
phonemacro 28:315604f4b374 832 // 3.1 Disable algo
phonemacro 28:315604f4b374 833 mfio = 1; mfio = 0; wait_us(300);
phonemacro 28:315604f4b374 834 cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x00;
phonemacro 28:315604f4b374 835 sh_i2c.write(SH_ADDR, cmd, 3);
phonemacro 28:315604f4b374 836 thread_sleep_for(465);
phonemacro 28:315604f4b374 837 sh_i2c.read(SH_ADDR, rsp, 1);
phonemacro 28:315604f4b374 838 pc.printf("3.1 disable algo: %x\n\r", rsp[0]);
phonemacro 28:315604f4b374 839 mfio = 1;
phonemacro 28:315604f4b374 840 #endif
phonemacro 28:315604f4b374 841
phonemacro 10:192ea88e964b 842 //ticker.attach(callback(&blink_timer), BLINKING_RATE_MS); /* set timer for one second */
phonemacro 14:c8cc6d7fd5f9 843 #ifdef RAW
phonemacro 14:c8cc6d7fd5f9 844 init_sh_raw();
phonemacro 14:c8cc6d7fd5f9 845 #else
phonemacro 14:c8cc6d7fd5f9 846 init_sh_algo();
phonemacro 14:c8cc6d7fd5f9 847 #endif
phonemacro 28:315604f4b374 848 mfio = 1;
phonemacro 8:e6ae69cfecbf 849 #if defined(MAXREFDES103_CFG) || defined(MAXM86161_CFG) || defined(MAXM86146_CFG)
phonemacro 6:e1b7190d6cb5 850 Timer tmr1;
phonemacro 0:6f65cae31c54 851 while (1) {
phonemacro 6:e1b7190d6cb5 852 tmr1.start();
phonemacro 29:a7dd81450b35 853 #if defined(RAW)
phonemacro 29:a7dd81450b35 854 if (tmr1.read_ms() >= 10) {
phonemacro 29:a7dd81450b35 855 #else
phonemacro 28:315604f4b374 856 if (tmr1.read_ms() >= 40) {
phonemacro 29:a7dd81450b35 857 #endif
phonemacro 7:23b067817ab8 858 tmr1.reset();
phonemacro 10:192ea88e964b 859 read_sh_fifo();
phonemacro 7:23b067817ab8 860 if ((ledcnt++ % 50) == 0)
phonemacro 6:e1b7190d6cb5 861 gLED = !gLED;
phonemacro 0:6f65cae31c54 862 }
phonemacro 0:6f65cae31c54 863 }
phonemacro 6:e1b7190d6cb5 864 #else
phonemacro 6:e1b7190d6cb5 865 ticker.attach(callback(&fifo_timer), 0.040f);
phonemacro 6:e1b7190d6cb5 866 while (1) {
phonemacro 6:e1b7190d6cb5 867 if (Time_to_Read_PPG) {
phonemacro 10:192ea88e964b 868 read_sh_fifo();
phonemacro 7:23b067817ab8 869 if ((ledcnt++ % 50) == 0)
phonemacro 6:e1b7190d6cb5 870 gLED = !gLED;
phonemacro 6:e1b7190d6cb5 871 }
phonemacro 6:e1b7190d6cb5 872 }
phonemacro 6:e1b7190d6cb5 873 #endif
phonemacro 0:6f65cae31c54 874 }