Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
OB1203.cpp@21:ae0672135b9e, 2019-07-29 (annotated)
- Committer:
- laserdad
- Date:
- Mon Jul 29 17:26:22 2019 +0000
- Revision:
- 21:ae0672135b9e
- Parent:
- 20:8d69cd11b8fa
added set_PPG_PSgain_cfg(); to init_PS_RGB().
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| laserdad | 0:2da1f69b38fd | 1 | #include "OB1203.h" |
| laserdad | 0:2da1f69b38fd | 2 | #include "mbed.h" |
| laserdad | 0:2da1f69b38fd | 3 | |
| laserdad | 0:2da1f69b38fd | 4 | extern Serial pc; |
| laserdad | 0:2da1f69b38fd | 5 | |
| laserdad | 19:a27b98998edf | 6 | // // |
| laserdad | 19:a27b98998edf | 7 | OB1203::OB1203(I2C *i2c_obj) |
| laserdad | 0:2da1f69b38fd | 8 | { |
| laserdad | 0:2da1f69b38fd | 9 | i2c = i2c_obj; |
| laserdad | 0:2da1f69b38fd | 10 | } |
| laserdad | 0:2da1f69b38fd | 11 | |
| laserdad | 0:2da1f69b38fd | 12 | |
| laserdad | 0:2da1f69b38fd | 13 | void OB1203::reset() |
| laserdad | 0:2da1f69b38fd | 14 | { |
| laserdad | 0:2da1f69b38fd | 15 | /*POR reset*/ |
| laserdad | 0:2da1f69b38fd | 16 | writeRegister(OB1203_ADDR,REG_MAIN_CTRL_0,SW_RESET); |
| laserdad | 0:2da1f69b38fd | 17 | wait_ms(POR_TIME_MS); |
| laserdad | 0:2da1f69b38fd | 18 | } |
| laserdad | 0:2da1f69b38fd | 19 | |
| laserdad | 0:2da1f69b38fd | 20 | |
| laserdad | 0:2da1f69b38fd | 21 | void OB1203::writeRegister(int addr, char reg, char val) { |
| laserdad | 0:2da1f69b38fd | 22 | /*writes 1 byte to a single register*/ |
| laserdad | 0:2da1f69b38fd | 23 | char writeData[2]; |
| laserdad | 0:2da1f69b38fd | 24 | writeData[0] = reg; |
| laserdad | 0:2da1f69b38fd | 25 | writeData[1] = val; |
| laserdad | 0:2da1f69b38fd | 26 | i2c->write(addr,writeData, 2); |
| laserdad | 0:2da1f69b38fd | 27 | } |
| laserdad | 0:2da1f69b38fd | 28 | |
| laserdad | 0:2da1f69b38fd | 29 | |
| laserdad | 0:2da1f69b38fd | 30 | void OB1203::writeBlock(int addr, char startReg, char *data, char numBytes) { |
| laserdad | 0:2da1f69b38fd | 31 | /*writes data from an array beginning at the startReg*/ |
| laserdad | 1:99ca9c464503 | 32 | // pc.printf("entering writeBlock with data %02x %02x\r\n",data[0],data[1]); |
| laserdad | 0:2da1f69b38fd | 33 | char writeData[numBytes+1]; |
| laserdad | 0:2da1f69b38fd | 34 | writeData[0]=startReg; |
| laserdad | 0:2da1f69b38fd | 35 | for(int n=1;n<numBytes+1;n++) { |
| laserdad | 0:2da1f69b38fd | 36 | writeData[n]=data[n-1]; |
| laserdad | 0:2da1f69b38fd | 37 | } |
| laserdad | 0:2da1f69b38fd | 38 | i2c->write(addr,writeData,numBytes+1); |
| laserdad | 0:2da1f69b38fd | 39 | } |
| laserdad | 0:2da1f69b38fd | 40 | |
| laserdad | 0:2da1f69b38fd | 41 | |
| laserdad | 0:2da1f69b38fd | 42 | void OB1203::readBlock(int addr, char startReg, char *data, int numBytes) |
| laserdad | 0:2da1f69b38fd | 43 | { |
| laserdad | 0:2da1f69b38fd | 44 | char writeData[1]; |
| laserdad | 0:2da1f69b38fd | 45 | writeData[0] = startReg; |
| laserdad | 0:2da1f69b38fd | 46 | i2c->write(addr,writeData,1,true); |
| laserdad | 0:2da1f69b38fd | 47 | i2c->read(addr,data,numBytes); |
| laserdad | 4:f25ca600a0e6 | 48 | // wait_us(800); |
| laserdad | 4:f25ca600a0e6 | 49 | // for(int n=0;n<numBytes;n++) |
| laserdad | 4:f25ca600a0e6 | 50 | // { |
| laserdad | 4:f25ca600a0e6 | 51 | // i2c->read(addr,data+n,1,1); |
| laserdad | 4:f25ca600a0e6 | 52 | // wait_us(20); |
| laserdad | 4:f25ca600a0e6 | 53 | // } |
| laserdad | 0:2da1f69b38fd | 54 | } |
| laserdad | 0:2da1f69b38fd | 55 | |
| laserdad | 2:3cba0fe6db60 | 56 | uint16_t OB1203::get_status() |
| laserdad | 0:2da1f69b38fd | 57 | { |
| laserdad | 0:2da1f69b38fd | 58 | char writeData[1]; //declare array of size 1 |
| laserdad | 0:2da1f69b38fd | 59 | writeData[0] = REG_STATUS_0; |
| laserdad | 2:3cba0fe6db60 | 60 | char data[2]; //declare array of size 1 |
| laserdad | 0:2da1f69b38fd | 61 | i2c->write(OB1203_ADDR,writeData,1,true); |
| laserdad | 0:2da1f69b38fd | 62 | i2c->read(OB1203_ADDR,data,2); |
| laserdad | 0:2da1f69b38fd | 63 | return (data[0]<<8 | data[1]); |
| laserdad | 0:2da1f69b38fd | 64 | } |
| laserdad | 0:2da1f69b38fd | 65 | |
| laserdad | 1:99ca9c464503 | 66 | bool OB1203::dataIsNew() |
| laserdad | 1:99ca9c464503 | 67 | { |
| laserdad | 1:99ca9c464503 | 68 | int status_reg_vals; |
| laserdad | 1:99ca9c464503 | 69 | status_reg_vals = get_status(); |
| laserdad | 5:527556d05aa8 | 70 | return ((status_reg_vals & 0x0100)>>8) || (status_reg_vals & 0x0091); |
| laserdad | 5:527556d05aa8 | 71 | } |
| laserdad | 5:527556d05aa8 | 72 | |
| laserdad | 5:527556d05aa8 | 73 | bool OB1203::lsIsNew() |
| laserdad | 5:527556d05aa8 | 74 | { |
| laserdad | 5:527556d05aa8 | 75 | int status_reg_vals; |
| laserdad | 5:527556d05aa8 | 76 | status_reg_vals = get_status(); |
| laserdad | 5:527556d05aa8 | 77 | return ((status_reg_vals & 0x0100)>>8); |
| laserdad | 5:527556d05aa8 | 78 | } |
| laserdad | 5:527556d05aa8 | 79 | |
| laserdad | 5:527556d05aa8 | 80 | bool OB1203::psIsNew() |
| laserdad | 5:527556d05aa8 | 81 | { |
| laserdad | 5:527556d05aa8 | 82 | int status_reg_vals; |
| laserdad | 5:527556d05aa8 | 83 | status_reg_vals = get_status(); |
| laserdad | 5:527556d05aa8 | 84 | return (status_reg_vals & 0x0001); |
| laserdad | 5:527556d05aa8 | 85 | } |
| laserdad | 5:527556d05aa8 | 86 | |
| laserdad | 5:527556d05aa8 | 87 | bool OB1203::tempIsNew() |
| laserdad | 5:527556d05aa8 | 88 | { |
| laserdad | 5:527556d05aa8 | 89 | int status_reg_vals; |
| laserdad | 5:527556d05aa8 | 90 | status_reg_vals = get_status(); |
| laserdad | 5:527556d05aa8 | 91 | return (status_reg_vals & 0x0080); |
| laserdad | 5:527556d05aa8 | 92 | } |
| laserdad | 5:527556d05aa8 | 93 | |
| laserdad | 5:527556d05aa8 | 94 | bool OB1203::bioIsNew() |
| laserdad | 5:527556d05aa8 | 95 | { |
| laserdad | 5:527556d05aa8 | 96 | int status_reg_vals; |
| laserdad | 5:527556d05aa8 | 97 | status_reg_vals = get_status(); |
| laserdad | 5:527556d05aa8 | 98 | return (status_reg_vals & 0x0010); |
| laserdad | 1:99ca9c464503 | 99 | } |
| laserdad | 0:2da1f69b38fd | 100 | |
| laserdad | 8:6c19c052b053 | 101 | void OB1203::setOscTrim() |
| laserdad | 8:6c19c052b053 | 102 | { |
| laserdad | 8:6c19c052b053 | 103 | char writeData[1]; |
| laserdad | 8:6c19c052b053 | 104 | writeData[0] = osc_trim; |
| laserdad | 8:6c19c052b053 | 105 | // pc.printf("writing %02x to REG %02x\r\n",osc_trim,REG_OSC_TRIM); |
| laserdad | 8:6c19c052b053 | 106 | writeBlock(OB1203_ADDR,REG_OSC_TRIM,writeData,1); |
| laserdad | 8:6c19c052b053 | 107 | } |
| laserdad | 8:6c19c052b053 | 108 | |
| laserdad | 0:2da1f69b38fd | 109 | void OB1203::setMainConfig() |
| laserdad | 0:2da1f69b38fd | 110 | { |
| laserdad | 0:2da1f69b38fd | 111 | char writeData[2]; |
| laserdad | 0:2da1f69b38fd | 112 | writeData[0] = ls_sai | ls_mode | ls_en; //MAIN_CTRL_0 |
| laserdad | 4:f25ca600a0e6 | 113 | writeData[1] = temp_en | ps_sai_en | ppg_ps_mode | ppg_ps_en; //MAIN_CTRL_1 |
| laserdad | 5:527556d05aa8 | 114 | // pc.printf("main config 1 to write %02x\r\n",writeData[1]); |
| laserdad | 0:2da1f69b38fd | 115 | writeBlock(OB1203_ADDR,REG_MAIN_CTRL_0,writeData,2); |
| laserdad | 0:2da1f69b38fd | 116 | } |
| laserdad | 0:2da1f69b38fd | 117 | |
| laserdad | 0:2da1f69b38fd | 118 | |
| laserdad | 0:2da1f69b38fd | 119 | void OB1203::setIntConfig() |
| laserdad | 0:2da1f69b38fd | 120 | { |
| laserdad | 0:2da1f69b38fd | 121 | char writeData[3]; |
| laserdad | 0:2da1f69b38fd | 122 | writeData[0] = ls_int_sel | ls_var_mode | ls_int_en; |
| laserdad | 0:2da1f69b38fd | 123 | writeData[1] = afull_int_en | ppg_int_en | ps_logic_mode | ps_int_en; |
| laserdad | 0:2da1f69b38fd | 124 | writeData[2] = ls_persist | ps_persist; |
| laserdad | 0:2da1f69b38fd | 125 | writeBlock(OB1203_ADDR,REG_INT_CFG_0,writeData,3); //default |
| laserdad | 0:2da1f69b38fd | 126 | } |
| laserdad | 0:2da1f69b38fd | 127 | |
| laserdad | 0:2da1f69b38fd | 128 | |
| laserdad | 0:2da1f69b38fd | 129 | void OB1203::setLSthresh() |
| laserdad | 0:2da1f69b38fd | 130 | { |
| laserdad | 0:2da1f69b38fd | 131 | char writeData[6]; |
| laserdad | 0:2da1f69b38fd | 132 | writeData[0] = (char) (ls_thres_hi & 0x000000FF); |
| laserdad | 0:2da1f69b38fd | 133 | writeData[1] = (char) ((ls_thres_hi & 0x0000FF00)>>8); |
| laserdad | 1:99ca9c464503 | 134 | writeData[2] = (char) ((ls_thres_hi & 0x00FF0000)>>16); |
| laserdad | 0:2da1f69b38fd | 135 | writeData[3] = (char) (ls_thres_lo & 0x000000FF); |
| laserdad | 0:2da1f69b38fd | 136 | writeData[4] = (char) ((ls_thres_lo & 0x0000FF00)>>8); |
| laserdad | 1:99ca9c464503 | 137 | writeData[5] = (char) ((ls_thres_lo & 0x00FF0000)>>16); |
| laserdad | 0:2da1f69b38fd | 138 | writeBlock(OB1203_ADDR,REG_LS_THRES_HI,writeData,6); //default |
| laserdad | 0:2da1f69b38fd | 139 | } |
| laserdad | 0:2da1f69b38fd | 140 | |
| laserdad | 0:2da1f69b38fd | 141 | |
| laserdad | 0:2da1f69b38fd | 142 | void OB1203::setPSthresh() |
| laserdad | 0:2da1f69b38fd | 143 | { |
| laserdad | 0:2da1f69b38fd | 144 | char writeData[4]; |
| laserdad | 0:2da1f69b38fd | 145 | writeData[0] = (char) (ps_thres_hi & 0x000FF); |
| laserdad | 0:2da1f69b38fd | 146 | writeData[1] = (char) ((ps_thres_hi & 0xFF00)>>8); |
| laserdad | 16:d5fe5debb5d2 | 147 | writeData[2] = (char) (ps_thres_lo & 0x000FF); |
| laserdad | 16:d5fe5debb5d2 | 148 | writeData[3] = (char) ((ps_thres_lo & 0xFF00)>>8); |
| laserdad | 0:2da1f69b38fd | 149 | writeBlock(OB1203_ADDR,REG_PS_THRES_HI,writeData,4); //default |
| laserdad | 0:2da1f69b38fd | 150 | } |
| laserdad | 0:2da1f69b38fd | 151 | |
| laserdad | 0:2da1f69b38fd | 152 | |
| laserdad | 0:2da1f69b38fd | 153 | void OB1203::setPScurrent() |
| laserdad | 0:2da1f69b38fd | 154 | { |
| laserdad | 0:2da1f69b38fd | 155 | char writeData[2]; |
| laserdad | 0:2da1f69b38fd | 156 | writeData[0] = (char) (ps_current & 0x00FF); |
| laserdad | 0:2da1f69b38fd | 157 | writeData[1] = (char) ((ps_current & 0xFF00)>>8); |
| laserdad | 0:2da1f69b38fd | 158 | writeBlock(OB1203_ADDR,REG_PS_LED_CURR,writeData,2); |
| laserdad | 0:2da1f69b38fd | 159 | } |
| laserdad | 0:2da1f69b38fd | 160 | |
| laserdad | 0:2da1f69b38fd | 161 | |
| laserdad | 0:2da1f69b38fd | 162 | void OB1203::setPPGcurrent() |
| laserdad | 0:2da1f69b38fd | 163 | { |
| laserdad | 0:2da1f69b38fd | 164 | char writeData[4]; |
| laserdad | 0:2da1f69b38fd | 165 | writeData[0] = (char) (ir_current & 0x00FF); |
| laserdad | 0:2da1f69b38fd | 166 | writeData[1] = (char) ((ir_current & 0xFF00)>>8); |
| laserdad | 0:2da1f69b38fd | 167 | writeData[2] = (char) (r_current & 0x00FF); |
| laserdad | 0:2da1f69b38fd | 168 | writeData[3] = (char) ((r_current & 0xFF00)>>8); |
| laserdad | 0:2da1f69b38fd | 169 | writeBlock(OB1203_ADDR,REG_PPG_IRLED_CURR,writeData,4); |
| laserdad | 0:2da1f69b38fd | 170 | } |
| laserdad | 0:2da1f69b38fd | 171 | |
| laserdad | 0:2da1f69b38fd | 172 | |
| laserdad | 0:2da1f69b38fd | 173 | void OB1203::setPPG_PSgain_cfg() |
| laserdad | 0:2da1f69b38fd | 174 | { |
| laserdad | 0:2da1f69b38fd | 175 | char writeData[2]; |
| laserdad | 8:6c19c052b053 | 176 | writeData[0] = ppg_ps_gain | ppg_LED_settling | ppg_ALC_track; |
| laserdad | 10:6703d2cdeabc | 177 | writeData[1] = ppg_pow_save | led_flip | sig_out | diff | alc; |
| laserdad | 21:ae0672135b9e | 178 | pc.printf("0x2F to write : %02X\r\n",writeData[1]); |
| laserdad | 0:2da1f69b38fd | 179 | writeBlock(OB1203_ADDR,REG_PPG_PS_GAIN,writeData,2); |
| laserdad | 0:2da1f69b38fd | 180 | } |
| laserdad | 0:2da1f69b38fd | 181 | |
| laserdad | 0:2da1f69b38fd | 182 | void OB1203::setPPGana_can() |
| laserdad | 0:2da1f69b38fd | 183 | { |
| laserdad | 0:2da1f69b38fd | 184 | char writeData[1]; |
| laserdad | 0:2da1f69b38fd | 185 | writeData[0] = ch1_can_ana | ch2_can_ana; |
| laserdad | 0:2da1f69b38fd | 186 | writeBlock(OB1203_ADDR,REG_PPG_CAN_ANA,writeData,1); |
| laserdad | 0:2da1f69b38fd | 187 | } |
| laserdad | 0:2da1f69b38fd | 188 | |
| laserdad | 0:2da1f69b38fd | 189 | void OB1203::setPPGavg_and_rate() |
| laserdad | 0:2da1f69b38fd | 190 | { |
| laserdad | 0:2da1f69b38fd | 191 | char writeData[2]; |
| laserdad | 9:0c3d2eea1c79 | 192 | writeData[0] = ppg_avg | 0x0A; //use standard LED max settings |
| laserdad | 0:2da1f69b38fd | 193 | writeData[1] = ppg_pwidth | ppg_freq | ppg_rate; |
| laserdad | 0:2da1f69b38fd | 194 | writeBlock(OB1203_ADDR,REG_PPG_AVG,writeData,2); |
| laserdad | 0:2da1f69b38fd | 195 | } |
| laserdad | 0:2da1f69b38fd | 196 | |
| laserdad | 9:0c3d2eea1c79 | 197 | void OB1203::setBioTrim() |
| laserdad | 9:0c3d2eea1c79 | 198 | { |
| laserdad | 9:0c3d2eea1c79 | 199 | char writeData[1]; |
| laserdad | 9:0c3d2eea1c79 | 200 | writeData[0] = bio_trim; |
| laserdad | 9:0c3d2eea1c79 | 201 | writeBlock(OB1203_ADDR, REG_BIO_TRIM,writeData,1); |
| laserdad | 9:0c3d2eea1c79 | 202 | } |
| laserdad | 9:0c3d2eea1c79 | 203 | |
| laserdad | 9:0c3d2eea1c79 | 204 | void OB1203::setLEDTrim() |
| laserdad | 9:0c3d2eea1c79 | 205 | { |
| laserdad | 9:0c3d2eea1c79 | 206 | char writeData[1]; |
| laserdad | 9:0c3d2eea1c79 | 207 | writeData[0] = led_trim; |
| laserdad | 9:0c3d2eea1c79 | 208 | writeBlock(OB1203_ADDR, REG_LED_TRIM,writeData,1); |
| laserdad | 9:0c3d2eea1c79 | 209 | } |
| laserdad | 0:2da1f69b38fd | 210 | |
| laserdad | 0:2da1f69b38fd | 211 | void OB1203::setDigitalCan() |
| laserdad | 0:2da1f69b38fd | 212 | { |
| laserdad | 0:2da1f69b38fd | 213 | char writeData[2]; |
| laserdad | 0:2da1f69b38fd | 214 | writeData[0] = (char)(ps_digital_can & 0x00FF); |
| laserdad | 0:2da1f69b38fd | 215 | writeData[1] = (char)((ps_digital_can & 0xFF00)>>8); |
| laserdad | 0:2da1f69b38fd | 216 | writeBlock(OB1203_ADDR,REG_PS_CAN_DIG,writeData,2); |
| laserdad | 0:2da1f69b38fd | 217 | } |
| laserdad | 0:2da1f69b38fd | 218 | |
| laserdad | 0:2da1f69b38fd | 219 | |
| laserdad | 0:2da1f69b38fd | 220 | void OB1203::setFifoConfig() |
| laserdad | 0:2da1f69b38fd | 221 | { |
| laserdad | 0:2da1f69b38fd | 222 | char writeData[1]; |
| laserdad | 12:573f7ce91a0d | 223 | writeData[0] = fifo_rollover_en | fifo_afull_advance_warning; |
| laserdad | 0:2da1f69b38fd | 224 | writeBlock(OB1203_ADDR,REG_FIFO_CFG,writeData,1); |
| laserdad | 0:2da1f69b38fd | 225 | } |
| laserdad | 0:2da1f69b38fd | 226 | |
| laserdad | 0:2da1f69b38fd | 227 | |
| laserdad | 12:573f7ce91a0d | 228 | void OB1203::resetFIFO() |
| laserdad | 12:573f7ce91a0d | 229 | { |
| laserdad | 12:573f7ce91a0d | 230 | char writeData[2]; |
| laserdad | 12:573f7ce91a0d | 231 | writeData[0]=0; |
| laserdad | 12:573f7ce91a0d | 232 | writeData[1]=0; |
| laserdad | 20:8d69cd11b8fa | 233 | writeRegister(OB1203_ADDR,REG_MAIN_CTRL_1, (temp_en | ps_sai_en | ppg_ps_mode | 0) ); //turn PPG off MAIN_CTRL_1; |
| laserdad | 12:573f7ce91a0d | 234 | writeBlock(OB1203_ADDR,REG_FIFO_WR_PTR,writeData,2);//set write and read pointer to zero--next sample is newest |
| laserdad | 12:573f7ce91a0d | 235 | writeRegister(OB1203_ADDR,REG_MAIN_CTRL_1, (temp_en | ps_sai_en | ppg_ps_mode | ppg_ps_en) ); //MAIN_CTRL_1; |
| laserdad | 12:573f7ce91a0d | 236 | } |
| laserdad | 12:573f7ce91a0d | 237 | |
| laserdad | 12:573f7ce91a0d | 238 | |
| laserdad | 0:2da1f69b38fd | 239 | void OB1203::init_rgb() |
| laserdad | 0:2da1f69b38fd | 240 | { |
| laserdad | 0:2da1f69b38fd | 241 | /*Configures ALS/RGB mode. PS and BIO off. |
| laserdad | 0:2da1f69b38fd | 242 | Use: set class variables using header declarations. Then call this function.*/ |
| laserdad | 0:2da1f69b38fd | 243 | char writeData[2]; |
| laserdad | 0:2da1f69b38fd | 244 | writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2); |
| laserdad | 0:2da1f69b38fd | 245 | writeData[0] = ls_res | ls_rate; //LS_RES_RATE |
| laserdad | 0:2da1f69b38fd | 246 | writeData[1] = ls_gain; //LS_GAIN |
| laserdad | 0:2da1f69b38fd | 247 | writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2); |
| laserdad | 0:2da1f69b38fd | 248 | setLSthresh(); |
| laserdad | 0:2da1f69b38fd | 249 | setIntConfig(); |
| laserdad | 0:2da1f69b38fd | 250 | ppg_ps_en = PPG_PS_OFF; |
| laserdad | 0:2da1f69b38fd | 251 | ls_en = LS_ON; |
| laserdad | 0:2da1f69b38fd | 252 | setMainConfig(); |
| laserdad | 0:2da1f69b38fd | 253 | } |
| laserdad | 0:2da1f69b38fd | 254 | |
| laserdad | 0:2da1f69b38fd | 255 | |
| laserdad | 0:2da1f69b38fd | 256 | void OB1203::init_ps() |
| laserdad | 0:2da1f69b38fd | 257 | { |
| laserdad | 20:8d69cd11b8fa | 258 | reset(); |
| laserdad | 0:2da1f69b38fd | 259 | /*Configures PS mode but not thresholds or interrupts. RGB/ALS and BIO off. |
| laserdad | 0:2da1f69b38fd | 260 | Use: set class variables using header declarations. Then call this function.*/ |
| laserdad | 0:2da1f69b38fd | 261 | char writeData[2]; |
| laserdad | 0:2da1f69b38fd | 262 | //PS settings |
| laserdad | 0:2da1f69b38fd | 263 | setPScurrent(); |
| laserdad | 11:724cf1c68651 | 264 | writeData[0] = ps_can_ana | ps_pulses | 0x02; //PS_CAN_PULSES -->set hidden max current registers to allow higher LED powers |
| laserdad | 0:2da1f69b38fd | 265 | writeData[1] = ps_pwidth | ps_rate; //PS_PWIDTH_RATE |
| laserdad | 0:2da1f69b38fd | 266 | writeBlock(OB1203_ADDR,REG_PS_CAN_PULSES,writeData,2); |
| laserdad | 0:2da1f69b38fd | 267 | //Digital crosstalk cancellation |
| laserdad | 0:2da1f69b38fd | 268 | setDigitalCan(); //PS_CAN_DIG |
| laserdad | 0:2da1f69b38fd | 269 | //set PS moving average and hysteresis |
| laserdad | 0:2da1f69b38fd | 270 | writeData[0] = ps_avg_en | ps_hys_level; //PS_MOV_AVG_HYS |
| laserdad | 0:2da1f69b38fd | 271 | writeBlock(OB1203_ADDR,REG_PS_MOV_AVG_HYS,writeData,1); |
| laserdad | 0:2da1f69b38fd | 272 | //set PS interrupt thresholds |
| laserdad | 0:2da1f69b38fd | 273 | setPSthresh(); |
| laserdad | 0:2da1f69b38fd | 274 | //interrupt configuration |
| laserdad | 0:2da1f69b38fd | 275 | ls_int_en = LS_INT_OFF; |
| laserdad | 0:2da1f69b38fd | 276 | setPPG_PSgain_cfg(); |
| laserdad | 0:2da1f69b38fd | 277 | setPScurrent(); |
| laserdad | 0:2da1f69b38fd | 278 | //config PS |
| laserdad | 0:2da1f69b38fd | 279 | ls_en = LS_OFF; |
| laserdad | 0:2da1f69b38fd | 280 | ppg_ps_en = 1; |
| laserdad | 20:8d69cd11b8fa | 281 | // ps_int_en = PS_INT_ON; |
| laserdad | 0:2da1f69b38fd | 282 | ppg_ps_mode = PS_MODE; |
| laserdad | 20:8d69cd11b8fa | 283 | setIntConfig(); |
| laserdad | 20:8d69cd11b8fa | 284 | // setLEDTrim(); |
| laserdad | 0:2da1f69b38fd | 285 | setMainConfig(); |
| laserdad | 0:2da1f69b38fd | 286 | } |
| laserdad | 0:2da1f69b38fd | 287 | |
| laserdad | 0:2da1f69b38fd | 288 | |
| laserdad | 0:2da1f69b38fd | 289 | void OB1203::init_ps_rgb() |
| laserdad | 0:2da1f69b38fd | 290 | { |
| laserdad | 2:3cba0fe6db60 | 291 | reset(); |
| laserdad | 0:2da1f69b38fd | 292 | char writeData[2]; |
| laserdad | 0:2da1f69b38fd | 293 | writeData[0] = ls_res | ls_rate; //LS_RES_RATE |
| laserdad | 0:2da1f69b38fd | 294 | writeData[1] = ls_gain; //LS_GAIN |
| laserdad | 0:2da1f69b38fd | 295 | writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2); |
| laserdad | 11:724cf1c68651 | 296 | writeData[0] = ps_can_ana | ps_pulses | 0x02; //PS_CAN_PULSES -->set hidden max current registers to allow higher LED powers |
| laserdad | 0:2da1f69b38fd | 297 | writeData[1] = ps_pwidth | ps_rate; //PS_PWIDTH_RATE |
| laserdad | 0:2da1f69b38fd | 298 | writeBlock(OB1203_ADDR,REG_PS_CAN_PULSES,writeData,2); |
| laserdad | 0:2da1f69b38fd | 299 | setDigitalCan(); //PS_CAN_DIG |
| laserdad | 0:2da1f69b38fd | 300 | //set PS moving average and hysteresis |
| laserdad | 0:2da1f69b38fd | 301 | writeData[0] = ps_avg_en | ps_hys_level; //PS_MOV_AVG_HYS |
| laserdad | 0:2da1f69b38fd | 302 | writeBlock(OB1203_ADDR,REG_PS_MOV_AVG_HYS,writeData,1); |
| laserdad | 0:2da1f69b38fd | 303 | setIntConfig(); |
| laserdad | 0:2da1f69b38fd | 304 | setPSthresh(); |
| laserdad | 16:d5fe5debb5d2 | 305 | setPScurrent(); |
| laserdad | 21:ae0672135b9e | 306 | setPPG_PSgain_cfg(); |
| laserdad | 0:2da1f69b38fd | 307 | setLSthresh(); |
| laserdad | 0:2da1f69b38fd | 308 | ls_en = LS_ON; |
| laserdad | 0:2da1f69b38fd | 309 | ppg_ps_en = PPG_PS_ON; |
| laserdad | 0:2da1f69b38fd | 310 | ppg_ps_mode = PS_MODE; |
| laserdad | 9:0c3d2eea1c79 | 311 | setLEDTrim(); |
| laserdad | 16:d5fe5debb5d2 | 312 | setMainConfig(); |
| laserdad | 0:2da1f69b38fd | 313 | } |
| laserdad | 0:2da1f69b38fd | 314 | |
| laserdad | 0:2da1f69b38fd | 315 | |
| laserdad | 0:2da1f69b38fd | 316 | void OB1203::init_hr() |
| laserdad | 0:2da1f69b38fd | 317 | { |
| laserdad | 2:3cba0fe6db60 | 318 | reset(); |
| laserdad | 3:ffcd0d2ec97f | 319 | ps_int_en = PS_INT_OFF; |
| laserdad | 9:0c3d2eea1c79 | 320 | ls_en = LS_OFF; |
| laserdad | 0:2da1f69b38fd | 321 | setIntConfig(); |
| laserdad | 3:ffcd0d2ec97f | 322 | char readData[1]; |
| laserdad | 16:d5fe5debb5d2 | 323 | //readBlock(OB1203_ADDR,REG_PS_INT_CFG_1,readData,1); |
| laserdad | 8:6c19c052b053 | 324 | // pc.printf("int config 1 = %02X\r\n",readData[0]); |
| laserdad | 0:2da1f69b38fd | 325 | setPPG_PSgain_cfg(); |
| laserdad | 0:2da1f69b38fd | 326 | setPPGcurrent(); |
| laserdad | 0:2da1f69b38fd | 327 | setPPGana_can(); |
| laserdad | 0:2da1f69b38fd | 328 | setPPGavg_and_rate(); |
| laserdad | 0:2da1f69b38fd | 329 | setFifoConfig(); |
| laserdad | 3:ffcd0d2ec97f | 330 | ppg_ps_mode = HR_MODE; |
| laserdad | 9:0c3d2eea1c79 | 331 | setBioTrim(); |
| laserdad | 9:0c3d2eea1c79 | 332 | setLEDTrim(); |
| laserdad | 3:ffcd0d2ec97f | 333 | setMainConfig(); |
| laserdad | 0:2da1f69b38fd | 334 | } |
| laserdad | 0:2da1f69b38fd | 335 | |
| laserdad | 0:2da1f69b38fd | 336 | void OB1203::init_spo2() |
| laserdad | 0:2da1f69b38fd | 337 | { |
| laserdad | 2:3cba0fe6db60 | 338 | reset(); |
| laserdad | 2:3cba0fe6db60 | 339 | ps_int_en = PS_INT_OFF; |
| laserdad | 9:0c3d2eea1c79 | 340 | ls_en = LS_OFF; |
| laserdad | 0:2da1f69b38fd | 341 | setIntConfig(); |
| laserdad | 2:3cba0fe6db60 | 342 | char readData[1]; |
| laserdad | 2:3cba0fe6db60 | 343 | readBlock(OB1203_ADDR,REG_PS_INT_CFG_1,readData,1); |
| laserdad | 8:6c19c052b053 | 344 | // pc.printf("int config 1 = %02X\r\n",readData[0]); |
| laserdad | 0:2da1f69b38fd | 345 | setPPG_PSgain_cfg(); |
| laserdad | 0:2da1f69b38fd | 346 | setPPGcurrent(); |
| laserdad | 0:2da1f69b38fd | 347 | setPPGana_can(); |
| laserdad | 0:2da1f69b38fd | 348 | setPPGavg_and_rate(); |
| laserdad | 0:2da1f69b38fd | 349 | setFifoConfig(); |
| laserdad | 0:2da1f69b38fd | 350 | ppg_ps_mode = SPO2_MODE; |
| laserdad | 9:0c3d2eea1c79 | 351 | setLEDTrim(); |
| laserdad | 9:0c3d2eea1c79 | 352 | setBioTrim(); |
| laserdad | 0:2da1f69b38fd | 353 | setMainConfig(); |
| laserdad | 0:2da1f69b38fd | 354 | } |
| laserdad | 0:2da1f69b38fd | 355 | |
| laserdad | 0:2da1f69b38fd | 356 | uint32_t OB1203::bytes2uint32(char *data, int start_byte) |
| laserdad | 0:2da1f69b38fd | 357 | { |
| laserdad | 1:99ca9c464503 | 358 | //coverts a string of 3 bytes with LSB first into unsigned long MSB last |
| laserdad | 16:d5fe5debb5d2 | 359 | return ((uint32_t)data[start_byte+2])<<16 | ((uint32_t)data[start_byte+1])<<8 | ((uint32_t)data[start_byte]) ; |
| laserdad | 0:2da1f69b38fd | 360 | } |
| laserdad | 0:2da1f69b38fd | 361 | |
| laserdad | 6:337ee64ca7ab | 362 | uint32_t OB1203::twoandhalfBytes2uint32(char *data, int start_byte) |
| laserdad | 6:337ee64ca7ab | 363 | { |
| laserdad | 6:337ee64ca7ab | 364 | //coverts a string of 3 bytes with LSB first into unsigned long MSB last |
| laserdad | 7:7d90f25c04fa | 365 | return (uint32_t)( ((data[start_byte+2] & 0x0F)<<16) | (uint32_t(data[start_byte+1])<<8) | uint32_t(data[start_byte]) ) ; |
| laserdad | 6:337ee64ca7ab | 366 | } |
| laserdad | 0:2da1f69b38fd | 367 | |
| laserdad | 0:2da1f69b38fd | 368 | char OB1203::get_ls_data(uint32_t *data) |
| laserdad | 0:2da1f69b38fd | 369 | { |
| laserdad | 5:527556d05aa8 | 370 | char byte_data[21]; |
| laserdad | 6:337ee64ca7ab | 371 | readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,21); |
| laserdad | 0:2da1f69b38fd | 372 | #ifdef DEBUG |
| laserdad | 5:527556d05aa8 | 373 | pc.printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x $02x\r\n", |
| laserdad | 0:2da1f69b38fd | 374 | byte_data[0],byte_data[1],byte_data[2],byte_data[3], |
| laserdad | 0:2da1f69b38fd | 375 | byte_data[4],byte_data[5],byte_data[6],byte_data[7], |
| laserdad | 0:2da1f69b38fd | 376 | byte_data[8],byte_data[9],byte_data[10],byte_data[11], |
| laserdad | 0:2da1f69b38fd | 377 | byte_data[12],byte_data[13],byte_data[14],byte_data[15], |
| laserdad | 5:527556d05aa8 | 378 | byte_data[16],byte_data[17],byte_data[18]), |
| laserdad | 5:527556d05aa8 | 379 | byte_data[19],byte_data[20]; |
| laserdad | 0:2da1f69b38fd | 380 | #endif |
| laserdad | 0:2da1f69b38fd | 381 | |
| laserdad | 1:99ca9c464503 | 382 | |
| laserdad | 1:99ca9c464503 | 383 | //byte_data[0] is ps (not populated) |
| laserdad | 6:337ee64ca7ab | 384 | data[1] = twoandhalfBytes2uint32(byte_data,4); //w |
| laserdad | 6:337ee64ca7ab | 385 | data[2] = twoandhalfBytes2uint32(byte_data,7); //g |
| laserdad | 6:337ee64ca7ab | 386 | data[3] = twoandhalfBytes2uint32(byte_data,10); //b |
| laserdad | 6:337ee64ca7ab | 387 | data[4] = twoandhalfBytes2uint32(byte_data,13); //r |
| laserdad | 6:337ee64ca7ab | 388 | data[5] = twoandhalfBytes2uint32(byte_data,16); //c |
| laserdad | 6:337ee64ca7ab | 389 | data[6] = (uint32_t)((byte_data[20] & 0x0F)<<8) | (uint32_t)byte_data[19] ; //temp data |
| laserdad | 0:2da1f69b38fd | 390 | return ( (byte_data[0] & LS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data |
| laserdad | 0:2da1f69b38fd | 391 | } |
| laserdad | 0:2da1f69b38fd | 392 | |
| laserdad | 0:2da1f69b38fd | 393 | char OB1203::get_ps_data(uint32_t *data) |
| laserdad | 0:2da1f69b38fd | 394 | { |
| laserdad | 0:2da1f69b38fd | 395 | char byte_data[4]; |
| laserdad | 6:337ee64ca7ab | 396 | readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,4); |
| laserdad | 0:2da1f69b38fd | 397 | #ifdef DEBUG |
| laserdad | 0:2da1f69b38fd | 398 | pc.printf( "%02x %02x %02x %02x\r\n", byte_data[0], byte_data[1], byte_data[2], byte_data[3] ); |
| laserdad | 0:2da1f69b38fd | 399 | #endif |
| laserdad | 1:99ca9c464503 | 400 | |
| laserdad | 1:99ca9c464503 | 401 | data[0] = ((uint32_t)byte_data[3])<<8 | ((uint32_t)byte_data[2]); //ps data |
| laserdad | 0:2da1f69b38fd | 402 | return ( (byte_data[1] & PS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data |
| laserdad | 0:2da1f69b38fd | 403 | } |
| laserdad | 0:2da1f69b38fd | 404 | |
| laserdad | 0:2da1f69b38fd | 405 | char OB1203::get_ps_ls_data(uint32_t *data) |
| laserdad | 0:2da1f69b38fd | 406 | { |
| laserdad | 4:f25ca600a0e6 | 407 | char byte_data[21]; |
| laserdad | 4:f25ca600a0e6 | 408 | readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,21); |
| laserdad | 0:2da1f69b38fd | 409 | #ifdef DEBUG |
| laserdad | 4:f25ca600a0e6 | 410 | pc.printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x $02x\r\n", |
| laserdad | 0:2da1f69b38fd | 411 | byte_data[0],byte_data[1],byte_data[2],byte_data[3],byte_data[4], |
| laserdad | 0:2da1f69b38fd | 412 | byte_data[5],byte_data[6],byte_data[7],byte_data[8],byte_data[9], |
| laserdad | 0:2da1f69b38fd | 413 | byte_data[10],byte_data[11],byte_data[12],byte_data[13],byte_data[14], |
| laserdad | 4:f25ca600a0e6 | 414 | byte_data[15],byte_data[16],byte_data[17],byte_data[18] ), |
| laserdad | 4:f25ca600a0e6 | 415 | byte_data[19],byte_data[20]; |
| laserdad | 0:2da1f69b38fd | 416 | #endif |
| laserdad | 0:2da1f69b38fd | 417 | |
| laserdad | 1:99ca9c464503 | 418 | data[0] = ((uint32_t)byte_data[3])<<8 | ((uint32_t)byte_data[2]); //ps |
| laserdad | 6:337ee64ca7ab | 419 | data[1] = twoandhalfBytes2uint32(byte_data,4); //w |
| laserdad | 6:337ee64ca7ab | 420 | data[2] = twoandhalfBytes2uint32(byte_data,7); //g |
| laserdad | 6:337ee64ca7ab | 421 | data[3] = twoandhalfBytes2uint32(byte_data,10); //b |
| laserdad | 6:337ee64ca7ab | 422 | data[4] = twoandhalfBytes2uint32(byte_data,13); //r |
| laserdad | 6:337ee64ca7ab | 423 | data[5] = twoandhalfBytes2uint32(byte_data,16); //c |
| laserdad | 6:337ee64ca7ab | 424 | data[6] = (uint32_t)((byte_data[20] & 0x0F)<<8) | (uint32_t)byte_data[19] ; //temp data |
| laserdad | 0:2da1f69b38fd | 425 | return ( (byte_data[0] & LS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data |
| laserdad | 0:2da1f69b38fd | 426 | } |
| laserdad | 0:2da1f69b38fd | 427 | |
| laserdad | 0:2da1f69b38fd | 428 | |
| laserdad | 0:2da1f69b38fd | 429 | void OB1203::getFifoInfo(char *fifo_info) |
| laserdad | 0:2da1f69b38fd | 430 | { |
| laserdad | 0:2da1f69b38fd | 431 | readBlock(OB1203_ADDR,REG_FIFO_WR_PTR,fifo_info,3); |
| laserdad | 0:2da1f69b38fd | 432 | writePointer = fifo_info[0]; |
| laserdad | 0:2da1f69b38fd | 433 | readPointer = fifo_info[1]; |
| laserdad | 0:2da1f69b38fd | 434 | fifoOverflow = fifo_info[2]; |
| laserdad | 0:2da1f69b38fd | 435 | } |
| laserdad | 0:2da1f69b38fd | 436 | |
| laserdad | 0:2da1f69b38fd | 437 | |
| laserdad | 20:8d69cd11b8fa | 438 | void OB1203::getNumFifoSamplesAvailable(char *fifo_info, char *sample_info) |
| laserdad | 0:2da1f69b38fd | 439 | { |
| laserdad | 20:8d69cd11b8fa | 440 | /*sample_info [3] = {numSamplesHR, numSamplesSpO2, overflow*/ |
| laserdad | 20:8d69cd11b8fa | 441 | |
| laserdad | 20:8d69cd11b8fa | 442 | getFifoInfo(fifo_info); |
| laserdad | 20:8d69cd11b8fa | 443 | uint8_t writePointer = fifo_info[0]; |
| laserdad | 20:8d69cd11b8fa | 444 | uint8_t readPointer = fifo_info [1]; |
| laserdad | 0:2da1f69b38fd | 445 | uint8_t numSamples = writePointer; |
| laserdad | 0:2da1f69b38fd | 446 | if (writePointer<readPointer) |
| laserdad | 0:2da1f69b38fd | 447 | { |
| laserdad | 20:8d69cd11b8fa | 448 | numSamples += 32; |
| laserdad | 0:2da1f69b38fd | 449 | } |
| laserdad | 20:8d69cd11b8fa | 450 | numSamples -= readPointer; |
| laserdad | 20:8d69cd11b8fa | 451 | sample_info[0] = numSamples; //num HR samples |
| laserdad | 20:8d69cd11b8fa | 452 | sample_info[1] = (numSamples>>1); //num SpO2 samples |
| laserdad | 20:8d69cd11b8fa | 453 | sample_info[2] = fifo_info[2]; |
| laserdad | 0:2da1f69b38fd | 454 | } |
| laserdad | 0:2da1f69b38fd | 455 | |
| laserdad | 0:2da1f69b38fd | 456 | |
| laserdad | 0:2da1f69b38fd | 457 | void OB1203::getFifoSamples(uint8_t numSamples, char *fifoData) |
| laserdad | 0:2da1f69b38fd | 458 | { |
| laserdad | 2:3cba0fe6db60 | 459 | readBlock(OB1203_ADDR,REG_FIFO_DATA,fifoData,3*numSamples); |
| laserdad | 0:2da1f69b38fd | 460 | } |
| laserdad | 0:2da1f69b38fd | 461 | |
| laserdad | 0:2da1f69b38fd | 462 | |
| laserdad | 0:2da1f69b38fd | 463 | void OB1203::parseFifoSamples(char numSamples, char *fifoData, uint32_t *assembledData) |
| laserdad | 0:2da1f69b38fd | 464 | { |
| laserdad | 0:2da1f69b38fd | 465 | for (int n=0; n<numSamples; n++) |
| laserdad | 0:2da1f69b38fd | 466 | { |
| laserdad | 0:2da1f69b38fd | 467 | assembledData[n] = bytes2uint32(fifoData,3*n); |
| laserdad | 0:2da1f69b38fd | 468 | } |
| laserdad | 0:2da1f69b38fd | 469 | } |
| laserdad | 0:2da1f69b38fd | 470 | |
| laserdad | 0:2da1f69b38fd | 471 | |
| laserdad | 0:2da1f69b38fd | 472 | char OB1203::get_part_ID(char *data) |
| laserdad | 0:2da1f69b38fd | 473 | { |
| laserdad | 0:2da1f69b38fd | 474 | readBlock(OB1203_ADDR,REG_PART_ID,data,1); |
| laserdad | 0:2da1f69b38fd | 475 | return data[0]; |
| laserdad | 19:a27b98998edf | 476 | } |
| laserdad | 19:a27b98998edf | 477 | |
| laserdad | 19:a27b98998edf | 478 | |
| laserdad | 21:ae0672135b9e | 479 | void OB1203::print_part_xy(void) |
| laserdad | 21:ae0672135b9e | 480 | { |
| laserdad | 21:ae0672135b9e | 481 | char data_buf[2]; |
| laserdad | 21:ae0672135b9e | 482 | readBlock(OB1203_ADDR,REG_USER_CFG_0,data_buf,2); |
| laserdad | 21:ae0672135b9e | 483 | pc.printf("x = %d, y = %d\r\n",data_buf[0],data_buf[1]); |
| laserdad | 21:ae0672135b9e | 484 | } |
| laserdad | 21:ae0672135b9e | 485 | |
| laserdad | 21:ae0672135b9e | 486 | |
| laserdad | 21:ae0672135b9e | 487 | void OB1203::enter_test_mode(void) |
| laserdad | 21:ae0672135b9e | 488 | { |
| laserdad | 21:ae0672135b9e | 489 | char write_buf[1]; |
| laserdad | 21:ae0672135b9e | 490 | write_buf[0] = 0xB5; |
| laserdad | 21:ae0672135b9e | 491 | writeBlock(OB1203_ADDR,REG_TEST_CTRL_0,write_buf,1); |
| laserdad | 21:ae0672135b9e | 492 | write_buf[0] = 0xDF; |
| laserdad | 21:ae0672135b9e | 493 | writeBlock(OB1203_ADDR,REG_TEST_CTRL_1,write_buf,1); |
| laserdad | 21:ae0672135b9e | 494 | } |
| laserdad | 21:ae0672135b9e | 495 | |
| laserdad | 21:ae0672135b9e | 496 | |
| laserdad | 21:ae0672135b9e | 497 | void OB1203::exit_test_mode(void) |
| laserdad | 21:ae0672135b9e | 498 | { |
| laserdad | 21:ae0672135b9e | 499 | char write_buf[1]; |
| laserdad | 21:ae0672135b9e | 500 | write_buf[0] = 0x00; |
| laserdad | 21:ae0672135b9e | 501 | writeBlock(OB1203_ADDR,REG_TEST_CTRL_0,write_buf,1); |
| laserdad | 21:ae0672135b9e | 502 | } |
| laserdad | 21:ae0672135b9e | 503 | |
| laserdad | 21:ae0672135b9e | 504 | |
| laserdad | 19:a27b98998edf | 505 | void OB1203::do_agc(uint32_t data, bool ch) |
| laserdad | 19:a27b98998edf | 506 | { |
| laserdad | 19:a27b98998edf | 507 | const uint32_t tol1 = TOL1; |
| laserdad | 19:a27b98998edf | 508 | const uint32_t tol2 = TOL2; |
| laserdad | 19:a27b98998edf | 509 | const uint16_t in_range_persist = IN_RANGE_PERSIST; |
| laserdad | 19:a27b98998edf | 510 | static uint16_t in_range[2] = {0,0}; |
| laserdad | 19:a27b98998edf | 511 | const uint16_t maxCurrent[2] = {IR_MAX_CURRENT , R_MAX_CURRENT}; |
| laserdad | 19:a27b98998edf | 512 | const uint16_t step = STEP; |
| laserdad | 19:a27b98998edf | 513 | const uint32_t targetCounts[2] = {IR_TARGET_COUNTS, R_TARGET_COUNTS}; |
| laserdad | 19:a27b98998edf | 514 | //ch = 0 for IR, 1 for R (channel) |
| laserdad | 20:8d69cd11b8fa | 515 | |
| laserdad | 20:8d69cd11b8fa | 516 | if( data > targetCounts[ch] + ( (in_range[ch]>in_range_persist) ? tol2: tol1) ) //too high |
| laserdad | 19:a27b98998edf | 517 | { |
| laserdad | 20:8d69cd11b8fa | 518 | if(data> targetCounts[ch] + tol2) in_range[ch]=0; |
| laserdad | 19:a27b98998edf | 519 | |
| laserdad | 19:a27b98998edf | 520 | if( (ch ? r_current : ir_current)>step) |
| laserdad | 19:a27b98998edf | 521 | { |
| laserdad | 19:a27b98998edf | 522 | (ch ? r_current : ir_current) -= step; |
| laserdad | 20:8d69cd11b8fa | 523 | updateCurrent = 1; |
| laserdad | 19:a27b98998edf | 524 | } |
| laserdad | 19:a27b98998edf | 525 | } |
| laserdad | 20:8d69cd11b8fa | 526 | else if( data < targetCounts[ch] - ( (in_range[ch]>in_range_persist) ? tol2 : tol1) ) //too low |
| laserdad | 19:a27b98998edf | 527 | { |
| laserdad | 20:8d69cd11b8fa | 528 | if(data < targetCounts[ch] - tol2) |
| laserdad | 19:a27b98998edf | 529 | in_range[ch]=0; |
| laserdad | 20:8d69cd11b8fa | 530 | if( (ch ? r_current : ir_current) +step < maxCurrent[ch]) //no need to go to full current |
| laserdad | 19:a27b98998edf | 531 | { |
| laserdad | 19:a27b98998edf | 532 | (ch ? r_current : ir_current) += step; |
| laserdad | 20:8d69cd11b8fa | 533 | updateCurrent = 1; |
| laserdad | 19:a27b98998edf | 534 | } |
| laserdad | 19:a27b98998edf | 535 | } |
| laserdad | 19:a27b98998edf | 536 | else |
| laserdad | 19:a27b98998edf | 537 | { |
| laserdad | 20:8d69cd11b8fa | 538 | if( (data > (targetCounts[ch]-tol1) ) && (data < (targetCounts[ch]+tol1)) ) //just right |
| laserdad | 20:8d69cd11b8fa | 539 | { |
| laserdad | 20:8d69cd11b8fa | 540 | if (in_range[ch] <= in_range_persist) |
| laserdad | 20:8d69cd11b8fa | 541 | { |
| laserdad | 20:8d69cd11b8fa | 542 | in_range[ch]++; |
| laserdad | 20:8d69cd11b8fa | 543 | } |
| laserdad | 20:8d69cd11b8fa | 544 | } |
| laserdad | 20:8d69cd11b8fa | 545 | } |
| laserdad | 20:8d69cd11b8fa | 546 | if (in_range[ch] > in_range_persist) |
| laserdad | 20:8d69cd11b8fa | 547 | { |
| laserdad | 20:8d69cd11b8fa | 548 | (ch ? r_in_range : ir_in_range) = 1; |
| laserdad | 20:8d69cd11b8fa | 549 | } |
| laserdad | 20:8d69cd11b8fa | 550 | else |
| laserdad | 20:8d69cd11b8fa | 551 | { |
| laserdad | 20:8d69cd11b8fa | 552 | (ch ? r_in_range : ir_in_range) = 0; |
| laserdad | 19:a27b98998edf | 553 | } |
| laserdad | 20:8d69cd11b8fa | 554 | if(prev_in_range && !(ir_in_range && r_in_range)) { |
| laserdad | 20:8d69cd11b8fa | 555 | prev_in_range =0; |
| laserdad | 20:8d69cd11b8fa | 556 | updateFastMode = 1; |
| laserdad | 20:8d69cd11b8fa | 557 | afull_int_en = AFULL_INT_OFF; |
| laserdad | 20:8d69cd11b8fa | 558 | ppg_int_en = PPG_INT_ON; |
| laserdad | 20:8d69cd11b8fa | 559 | } |
| laserdad | 20:8d69cd11b8fa | 560 | |
| laserdad | 20:8d69cd11b8fa | 561 | else if(!prev_in_range && ir_in_range && r_in_range) { |
| laserdad | 20:8d69cd11b8fa | 562 | prev_in_range = 1; |
| laserdad | 20:8d69cd11b8fa | 563 | updateFastMode = 1; |
| laserdad | 20:8d69cd11b8fa | 564 | afull_int_en = AFULL_INT_ON; |
| laserdad | 20:8d69cd11b8fa | 565 | ppg_int_en = PPG_INT_OFF; |
| laserdad | 20:8d69cd11b8fa | 566 | } |
| laserdad | 20:8d69cd11b8fa | 567 | //pc.printf("ch %d in %d,",ch,in_range[ch]); |
| laserdad | 20:8d69cd11b8fa | 568 | //if(ch) pc.printf("ir_in_range %d, r_in_range %d\r\n",ir_in_range,r_in_range); |
| laserdad | 0:2da1f69b38fd | 569 | } |