OB1203 basic mbed driver
OB1203.cpp@0:2da1f69b38fd, 2018-04-25 (annotated)
- Committer:
- laserdad
- Date:
- Wed Apr 25 05:26:34 2018 +0000
- Revision:
- 0:2da1f69b38fd
- Child:
- 1:99ca9c464503
initial commit untested
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 | 0:2da1f69b38fd | 6 | OB1203::OB1203(I2C *i2c_obj) |
laserdad | 0:2da1f69b38fd | 7 | { |
laserdad | 0:2da1f69b38fd | 8 | i2c = i2c_obj; |
laserdad | 0:2da1f69b38fd | 9 | } |
laserdad | 0:2da1f69b38fd | 10 | |
laserdad | 0:2da1f69b38fd | 11 | |
laserdad | 0:2da1f69b38fd | 12 | void OB1203::reset() |
laserdad | 0:2da1f69b38fd | 13 | { |
laserdad | 0:2da1f69b38fd | 14 | /*POR reset*/ |
laserdad | 0:2da1f69b38fd | 15 | writeRegister(OB1203_ADDR,REG_MAIN_CTRL_0,SW_RESET); |
laserdad | 0:2da1f69b38fd | 16 | wait_ms(POR_TIME_MS); |
laserdad | 0:2da1f69b38fd | 17 | } |
laserdad | 0:2da1f69b38fd | 18 | |
laserdad | 0:2da1f69b38fd | 19 | |
laserdad | 0:2da1f69b38fd | 20 | void OB1203::writeRegister(int addr, char reg, char val) { |
laserdad | 0:2da1f69b38fd | 21 | /*writes 1 byte to a single register*/ |
laserdad | 0:2da1f69b38fd | 22 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 23 | writeData[0] = reg; |
laserdad | 0:2da1f69b38fd | 24 | writeData[1] = val; |
laserdad | 0:2da1f69b38fd | 25 | i2c->write(addr,writeData, 2); |
laserdad | 0:2da1f69b38fd | 26 | } |
laserdad | 0:2da1f69b38fd | 27 | |
laserdad | 0:2da1f69b38fd | 28 | |
laserdad | 0:2da1f69b38fd | 29 | void OB1203::writeBlock(int addr, char startReg, char *data, char numBytes) { |
laserdad | 0:2da1f69b38fd | 30 | /*writes data from an array beginning at the startReg*/ |
laserdad | 0:2da1f69b38fd | 31 | pc.printf("entering writeBlock with data %02x %02x\r\n",data[0],data[1]); |
laserdad | 0:2da1f69b38fd | 32 | char writeData[numBytes+1]; |
laserdad | 0:2da1f69b38fd | 33 | writeData[0]=startReg; |
laserdad | 0:2da1f69b38fd | 34 | for(int n=1;n<numBytes+1;n++) { |
laserdad | 0:2da1f69b38fd | 35 | writeData[n]=data[n-1]; |
laserdad | 0:2da1f69b38fd | 36 | } |
laserdad | 0:2da1f69b38fd | 37 | i2c->write(addr,writeData,numBytes+1); |
laserdad | 0:2da1f69b38fd | 38 | } |
laserdad | 0:2da1f69b38fd | 39 | |
laserdad | 0:2da1f69b38fd | 40 | |
laserdad | 0:2da1f69b38fd | 41 | void OB1203::readBlock(int addr, char startReg, char *data, int numBytes) |
laserdad | 0:2da1f69b38fd | 42 | { |
laserdad | 0:2da1f69b38fd | 43 | char writeData[1]; |
laserdad | 0:2da1f69b38fd | 44 | writeData[0] = startReg; |
laserdad | 0:2da1f69b38fd | 45 | i2c->write(addr,writeData,1,true); |
laserdad | 0:2da1f69b38fd | 46 | i2c->read(addr,data,numBytes); |
laserdad | 0:2da1f69b38fd | 47 | } |
laserdad | 0:2da1f69b38fd | 48 | |
laserdad | 0:2da1f69b38fd | 49 | |
laserdad | 0:2da1f69b38fd | 50 | int OB1203::get_status() |
laserdad | 0:2da1f69b38fd | 51 | { |
laserdad | 0:2da1f69b38fd | 52 | char writeData[1]; //declare array of size 1 |
laserdad | 0:2da1f69b38fd | 53 | writeData[0] = REG_STATUS_0; |
laserdad | 0:2da1f69b38fd | 54 | char data[1]; //declare array of size 1 |
laserdad | 0:2da1f69b38fd | 55 | i2c->write(OB1203_ADDR,writeData,1,true); |
laserdad | 0:2da1f69b38fd | 56 | i2c->read(OB1203_ADDR,data,2); |
laserdad | 0:2da1f69b38fd | 57 | return (data[0]<<8 | data[1]); |
laserdad | 0:2da1f69b38fd | 58 | } |
laserdad | 0:2da1f69b38fd | 59 | |
laserdad | 0:2da1f69b38fd | 60 | |
laserdad | 0:2da1f69b38fd | 61 | void OB1203::setMainConfig() |
laserdad | 0:2da1f69b38fd | 62 | { |
laserdad | 0:2da1f69b38fd | 63 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 64 | writeData[0] = ls_sai | ls_mode | ls_en; //MAIN_CTRL_0 |
laserdad | 0:2da1f69b38fd | 65 | writeData[1] = ps_sai_en | ppg_ps_mode | ppg_ps_en; //MAIN_CTRL_1 |
laserdad | 0:2da1f69b38fd | 66 | writeBlock(OB1203_ADDR,REG_MAIN_CTRL_0,writeData,2); |
laserdad | 0:2da1f69b38fd | 67 | } |
laserdad | 0:2da1f69b38fd | 68 | |
laserdad | 0:2da1f69b38fd | 69 | |
laserdad | 0:2da1f69b38fd | 70 | void OB1203::setIntConfig() |
laserdad | 0:2da1f69b38fd | 71 | { |
laserdad | 0:2da1f69b38fd | 72 | char writeData[3]; |
laserdad | 0:2da1f69b38fd | 73 | writeData[0] = ls_int_sel | ls_var_mode | ls_int_en; |
laserdad | 0:2da1f69b38fd | 74 | writeData[1] = afull_int_en | ppg_int_en | ps_logic_mode | ps_int_en; |
laserdad | 0:2da1f69b38fd | 75 | writeData[2] = ls_persist | ps_persist; |
laserdad | 0:2da1f69b38fd | 76 | writeBlock(OB1203_ADDR,REG_INT_CFG_0,writeData,3); //default |
laserdad | 0:2da1f69b38fd | 77 | } |
laserdad | 0:2da1f69b38fd | 78 | |
laserdad | 0:2da1f69b38fd | 79 | |
laserdad | 0:2da1f69b38fd | 80 | void OB1203::setLSthresh() |
laserdad | 0:2da1f69b38fd | 81 | { |
laserdad | 0:2da1f69b38fd | 82 | char writeData[6]; |
laserdad | 0:2da1f69b38fd | 83 | writeData[0] = (char) (ls_thres_hi & 0x000000FF); |
laserdad | 0:2da1f69b38fd | 84 | writeData[1] = (char) ((ls_thres_hi & 0x0000FF00)>>8); |
laserdad | 0:2da1f69b38fd | 85 | writeData[2] = (char) (ls_thres_hi & 0x00FF0000)>>16; |
laserdad | 0:2da1f69b38fd | 86 | writeData[3] = (char) (ls_thres_lo & 0x000000FF); |
laserdad | 0:2da1f69b38fd | 87 | writeData[4] = (char) ((ls_thres_lo & 0x0000FF00)>>8); |
laserdad | 0:2da1f69b38fd | 88 | writeData[5] = (char) (ls_thres_lo & 0x00FF0000)>>16; |
laserdad | 0:2da1f69b38fd | 89 | writeBlock(OB1203_ADDR,REG_LS_THRES_HI,writeData,6); //default |
laserdad | 0:2da1f69b38fd | 90 | } |
laserdad | 0:2da1f69b38fd | 91 | |
laserdad | 0:2da1f69b38fd | 92 | |
laserdad | 0:2da1f69b38fd | 93 | void OB1203::setPSthresh() |
laserdad | 0:2da1f69b38fd | 94 | { |
laserdad | 0:2da1f69b38fd | 95 | char writeData[4]; |
laserdad | 0:2da1f69b38fd | 96 | writeData[0] = (char) (ps_thres_hi & 0x000FF); |
laserdad | 0:2da1f69b38fd | 97 | writeData[1] = (char) ((ps_thres_hi & 0xFF00)>>8); |
laserdad | 0:2da1f69b38fd | 98 | writeData[0] = (char) (ps_thres_lo & 0x000FF); |
laserdad | 0:2da1f69b38fd | 99 | writeData[1] = (char) ((ps_thres_lo & 0xFF00)>>8); |
laserdad | 0:2da1f69b38fd | 100 | writeBlock(OB1203_ADDR,REG_PS_THRES_HI,writeData,4); //default |
laserdad | 0:2da1f69b38fd | 101 | } |
laserdad | 0:2da1f69b38fd | 102 | |
laserdad | 0:2da1f69b38fd | 103 | |
laserdad | 0:2da1f69b38fd | 104 | void OB1203::setPScurrent() |
laserdad | 0:2da1f69b38fd | 105 | { |
laserdad | 0:2da1f69b38fd | 106 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 107 | writeData[0] = (char) (ps_current & 0x00FF); |
laserdad | 0:2da1f69b38fd | 108 | writeData[1] = (char) ((ps_current & 0xFF00)>>8); |
laserdad | 0:2da1f69b38fd | 109 | writeBlock(OB1203_ADDR,REG_PS_LED_CURR,writeData,2); |
laserdad | 0:2da1f69b38fd | 110 | } |
laserdad | 0:2da1f69b38fd | 111 | |
laserdad | 0:2da1f69b38fd | 112 | |
laserdad | 0:2da1f69b38fd | 113 | void OB1203::setPPGcurrent() |
laserdad | 0:2da1f69b38fd | 114 | { |
laserdad | 0:2da1f69b38fd | 115 | char writeData[4]; |
laserdad | 0:2da1f69b38fd | 116 | writeData[0] = (char) (ir_current & 0x00FF); |
laserdad | 0:2da1f69b38fd | 117 | writeData[1] = (char) ((ir_current & 0xFF00)>>8); |
laserdad | 0:2da1f69b38fd | 118 | writeData[2] = (char) (r_current & 0x00FF); |
laserdad | 0:2da1f69b38fd | 119 | writeData[3] = (char) ((r_current & 0xFF00)>>8); |
laserdad | 0:2da1f69b38fd | 120 | writeBlock(OB1203_ADDR,REG_PPG_IRLED_CURR,writeData,4); |
laserdad | 0:2da1f69b38fd | 121 | } |
laserdad | 0:2da1f69b38fd | 122 | |
laserdad | 0:2da1f69b38fd | 123 | |
laserdad | 0:2da1f69b38fd | 124 | void OB1203::setPPG_PSgain_cfg() |
laserdad | 0:2da1f69b38fd | 125 | { |
laserdad | 0:2da1f69b38fd | 126 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 127 | writeData[0] = ppg_ps_gain; |
laserdad | 0:2da1f69b38fd | 128 | writeData[1] = ppg_pow_save | led_flip; |
laserdad | 0:2da1f69b38fd | 129 | writeBlock(OB1203_ADDR,REG_PPG_PS_GAIN,writeData,2); |
laserdad | 0:2da1f69b38fd | 130 | } |
laserdad | 0:2da1f69b38fd | 131 | |
laserdad | 0:2da1f69b38fd | 132 | void OB1203::setPPGana_can() |
laserdad | 0:2da1f69b38fd | 133 | { |
laserdad | 0:2da1f69b38fd | 134 | char writeData[1]; |
laserdad | 0:2da1f69b38fd | 135 | writeData[0] = ch1_can_ana | ch2_can_ana; |
laserdad | 0:2da1f69b38fd | 136 | writeBlock(OB1203_ADDR,REG_PPG_CAN_ANA,writeData,1); |
laserdad | 0:2da1f69b38fd | 137 | } |
laserdad | 0:2da1f69b38fd | 138 | |
laserdad | 0:2da1f69b38fd | 139 | void OB1203::setPPGavg_and_rate() |
laserdad | 0:2da1f69b38fd | 140 | { |
laserdad | 0:2da1f69b38fd | 141 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 142 | writeData[0] = ppg_avg; |
laserdad | 0:2da1f69b38fd | 143 | writeData[1] = ppg_pwidth | ppg_freq | ppg_rate; |
laserdad | 0:2da1f69b38fd | 144 | writeBlock(OB1203_ADDR,REG_PPG_AVG,writeData,2); |
laserdad | 0:2da1f69b38fd | 145 | } |
laserdad | 0:2da1f69b38fd | 146 | |
laserdad | 0:2da1f69b38fd | 147 | |
laserdad | 0:2da1f69b38fd | 148 | void OB1203::setDigitalCan() |
laserdad | 0:2da1f69b38fd | 149 | { |
laserdad | 0:2da1f69b38fd | 150 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 151 | writeData[0] = (char)(ps_digital_can & 0x00FF); |
laserdad | 0:2da1f69b38fd | 152 | writeData[1] = (char)((ps_digital_can & 0xFF00)>>8); |
laserdad | 0:2da1f69b38fd | 153 | writeBlock(OB1203_ADDR,REG_PS_CAN_DIG,writeData,2); |
laserdad | 0:2da1f69b38fd | 154 | } |
laserdad | 0:2da1f69b38fd | 155 | |
laserdad | 0:2da1f69b38fd | 156 | |
laserdad | 0:2da1f69b38fd | 157 | void OB1203::setFifoConfig() |
laserdad | 0:2da1f69b38fd | 158 | { |
laserdad | 0:2da1f69b38fd | 159 | char writeData[1]; |
laserdad | 0:2da1f69b38fd | 160 | writeData[0] = fifo_rollover_en | fifo_afull_samples_left; |
laserdad | 0:2da1f69b38fd | 161 | writeBlock(OB1203_ADDR,REG_FIFO_CFG,writeData,1); |
laserdad | 0:2da1f69b38fd | 162 | } |
laserdad | 0:2da1f69b38fd | 163 | |
laserdad | 0:2da1f69b38fd | 164 | |
laserdad | 0:2da1f69b38fd | 165 | void OB1203::init_rgb() |
laserdad | 0:2da1f69b38fd | 166 | { |
laserdad | 0:2da1f69b38fd | 167 | /*Configures ALS/RGB mode. PS and BIO off. |
laserdad | 0:2da1f69b38fd | 168 | Use: set class variables using header declarations. Then call this function.*/ |
laserdad | 0:2da1f69b38fd | 169 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 170 | writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2); |
laserdad | 0:2da1f69b38fd | 171 | writeData[0] = ls_res | ls_rate; //LS_RES_RATE |
laserdad | 0:2da1f69b38fd | 172 | writeData[1] = ls_gain; //LS_GAIN |
laserdad | 0:2da1f69b38fd | 173 | writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2); |
laserdad | 0:2da1f69b38fd | 174 | setLSthresh(); |
laserdad | 0:2da1f69b38fd | 175 | setIntConfig(); |
laserdad | 0:2da1f69b38fd | 176 | ppg_ps_en = PPG_PS_OFF; |
laserdad | 0:2da1f69b38fd | 177 | ls_en = LS_ON; |
laserdad | 0:2da1f69b38fd | 178 | setMainConfig(); |
laserdad | 0:2da1f69b38fd | 179 | } |
laserdad | 0:2da1f69b38fd | 180 | |
laserdad | 0:2da1f69b38fd | 181 | |
laserdad | 0:2da1f69b38fd | 182 | void OB1203::init_ps() |
laserdad | 0:2da1f69b38fd | 183 | { |
laserdad | 0:2da1f69b38fd | 184 | /*Configures PS mode but not thresholds or interrupts. RGB/ALS and BIO off. |
laserdad | 0:2da1f69b38fd | 185 | Use: set class variables using header declarations. Then call this function.*/ |
laserdad | 0:2da1f69b38fd | 186 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 187 | //PS settings |
laserdad | 0:2da1f69b38fd | 188 | setPScurrent(); |
laserdad | 0:2da1f69b38fd | 189 | writeData[0] = ps_can_ana | ps_pulses; //PS_CAN_PULSES |
laserdad | 0:2da1f69b38fd | 190 | writeData[1] = ps_pwidth | ps_rate; //PS_PWIDTH_RATE |
laserdad | 0:2da1f69b38fd | 191 | writeBlock(OB1203_ADDR,REG_PS_CAN_PULSES,writeData,2); |
laserdad | 0:2da1f69b38fd | 192 | //Digital crosstalk cancellation |
laserdad | 0:2da1f69b38fd | 193 | setDigitalCan(); //PS_CAN_DIG |
laserdad | 0:2da1f69b38fd | 194 | //set PS moving average and hysteresis |
laserdad | 0:2da1f69b38fd | 195 | writeData[0] = ps_avg_en | ps_hys_level; //PS_MOV_AVG_HYS |
laserdad | 0:2da1f69b38fd | 196 | writeBlock(OB1203_ADDR,REG_PS_MOV_AVG_HYS,writeData,1); |
laserdad | 0:2da1f69b38fd | 197 | //set PS interrupt thresholds |
laserdad | 0:2da1f69b38fd | 198 | setPSthresh(); |
laserdad | 0:2da1f69b38fd | 199 | //interrupt configuration |
laserdad | 0:2da1f69b38fd | 200 | ls_int_en = LS_INT_OFF; |
laserdad | 0:2da1f69b38fd | 201 | setIntConfig(); |
laserdad | 0:2da1f69b38fd | 202 | setPPG_PSgain_cfg(); |
laserdad | 0:2da1f69b38fd | 203 | setPScurrent(); |
laserdad | 0:2da1f69b38fd | 204 | //config PS |
laserdad | 0:2da1f69b38fd | 205 | ls_en = LS_OFF; |
laserdad | 0:2da1f69b38fd | 206 | ppg_ps_en = 1; |
laserdad | 0:2da1f69b38fd | 207 | ppg_ps_mode = PS_MODE; |
laserdad | 0:2da1f69b38fd | 208 | setMainConfig(); |
laserdad | 0:2da1f69b38fd | 209 | } |
laserdad | 0:2da1f69b38fd | 210 | |
laserdad | 0:2da1f69b38fd | 211 | |
laserdad | 0:2da1f69b38fd | 212 | void OB1203::init_ps_rgb() |
laserdad | 0:2da1f69b38fd | 213 | { |
laserdad | 0:2da1f69b38fd | 214 | char writeData[2]; |
laserdad | 0:2da1f69b38fd | 215 | writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2); |
laserdad | 0:2da1f69b38fd | 216 | writeData[0] = ls_res | ls_rate; //LS_RES_RATE |
laserdad | 0:2da1f69b38fd | 217 | writeData[1] = ls_gain; //LS_GAIN |
laserdad | 0:2da1f69b38fd | 218 | writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2); |
laserdad | 0:2da1f69b38fd | 219 | writeData[0] = ps_can_ana | ps_pulses; //PS_CAN_PULSES |
laserdad | 0:2da1f69b38fd | 220 | writeData[1] = ps_pwidth | ps_rate; //PS_PWIDTH_RATE |
laserdad | 0:2da1f69b38fd | 221 | writeBlock(OB1203_ADDR,REG_PS_CAN_PULSES,writeData,2); |
laserdad | 0:2da1f69b38fd | 222 | setDigitalCan(); //PS_CAN_DIG |
laserdad | 0:2da1f69b38fd | 223 | //set PS moving average and hysteresis |
laserdad | 0:2da1f69b38fd | 224 | writeData[0] = ps_avg_en | ps_hys_level; //PS_MOV_AVG_HYS |
laserdad | 0:2da1f69b38fd | 225 | writeBlock(OB1203_ADDR,REG_PS_MOV_AVG_HYS,writeData,1); |
laserdad | 0:2da1f69b38fd | 226 | setIntConfig(); |
laserdad | 0:2da1f69b38fd | 227 | setPSthresh(); |
laserdad | 0:2da1f69b38fd | 228 | setPScurrent(); |
laserdad | 0:2da1f69b38fd | 229 | setLSthresh(); |
laserdad | 0:2da1f69b38fd | 230 | ls_en = LS_ON; |
laserdad | 0:2da1f69b38fd | 231 | ppg_ps_en = PPG_PS_ON; |
laserdad | 0:2da1f69b38fd | 232 | ppg_ps_mode = PS_MODE; |
laserdad | 0:2da1f69b38fd | 233 | setMainConfig(); |
laserdad | 0:2da1f69b38fd | 234 | } |
laserdad | 0:2da1f69b38fd | 235 | |
laserdad | 0:2da1f69b38fd | 236 | |
laserdad | 0:2da1f69b38fd | 237 | void OB1203::init_hr() |
laserdad | 0:2da1f69b38fd | 238 | { |
laserdad | 0:2da1f69b38fd | 239 | setIntConfig(); |
laserdad | 0:2da1f69b38fd | 240 | setPPG_PSgain_cfg(); |
laserdad | 0:2da1f69b38fd | 241 | setPPGcurrent(); |
laserdad | 0:2da1f69b38fd | 242 | setPPGana_can(); |
laserdad | 0:2da1f69b38fd | 243 | setPPGavg_and_rate(); |
laserdad | 0:2da1f69b38fd | 244 | setFifoConfig(); |
laserdad | 0:2da1f69b38fd | 245 | ppg_ps_mode = HR_MODE; |
laserdad | 0:2da1f69b38fd | 246 | setMainConfig(); |
laserdad | 0:2da1f69b38fd | 247 | } |
laserdad | 0:2da1f69b38fd | 248 | |
laserdad | 0:2da1f69b38fd | 249 | void OB1203::init_spo2() |
laserdad | 0:2da1f69b38fd | 250 | { |
laserdad | 0:2da1f69b38fd | 251 | setIntConfig(); |
laserdad | 0:2da1f69b38fd | 252 | setPPG_PSgain_cfg(); |
laserdad | 0:2da1f69b38fd | 253 | setPPGcurrent(); |
laserdad | 0:2da1f69b38fd | 254 | setPPGana_can(); |
laserdad | 0:2da1f69b38fd | 255 | setPPGavg_and_rate(); |
laserdad | 0:2da1f69b38fd | 256 | setFifoConfig(); |
laserdad | 0:2da1f69b38fd | 257 | ppg_ps_mode = SPO2_MODE; |
laserdad | 0:2da1f69b38fd | 258 | setMainConfig(); |
laserdad | 0:2da1f69b38fd | 259 | } |
laserdad | 0:2da1f69b38fd | 260 | |
laserdad | 0:2da1f69b38fd | 261 | uint32_t OB1203::bytes2uint32(char *data, int start_byte) |
laserdad | 0:2da1f69b38fd | 262 | { |
laserdad | 0:2da1f69b38fd | 263 | //coverts a string of 3 bytes with LSB first into unsigned long |
laserdad | 0:2da1f69b38fd | 264 | return uint32_t(data[start_byte+2])<<16 | int32_t(data[start_byte+1])<<8 | int32_t(data[start_byte]) ; |
laserdad | 0:2da1f69b38fd | 265 | } |
laserdad | 0:2da1f69b38fd | 266 | |
laserdad | 0:2da1f69b38fd | 267 | |
laserdad | 0:2da1f69b38fd | 268 | char OB1203::get_ls_data(uint32_t *data) |
laserdad | 0:2da1f69b38fd | 269 | { |
laserdad | 0:2da1f69b38fd | 270 | char byte_data[19]; |
laserdad | 0:2da1f69b38fd | 271 | readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,19); |
laserdad | 0:2da1f69b38fd | 272 | #ifdef DEBUG |
laserdad | 0:2da1f69b38fd | 273 | pc.printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", |
laserdad | 0:2da1f69b38fd | 274 | byte_data[0],byte_data[1],byte_data[2],byte_data[3], |
laserdad | 0:2da1f69b38fd | 275 | byte_data[4],byte_data[5],byte_data[6],byte_data[7], |
laserdad | 0:2da1f69b38fd | 276 | byte_data[8],byte_data[9],byte_data[10],byte_data[11], |
laserdad | 0:2da1f69b38fd | 277 | byte_data[12],byte_data[13],byte_data[14],byte_data[15], |
laserdad | 0:2da1f69b38fd | 278 | byte_data[16],byte_data[17],byte_data[18]); |
laserdad | 0:2da1f69b38fd | 279 | #endif |
laserdad | 0:2da1f69b38fd | 280 | |
laserdad | 0:2da1f69b38fd | 281 | //byte_data[0] is status |
laserdad | 0:2da1f69b38fd | 282 | data[1] = bytes2uint32(byte_data,4); //w |
laserdad | 0:2da1f69b38fd | 283 | data[2] = bytes2uint32(byte_data,7); //g |
laserdad | 0:2da1f69b38fd | 284 | data[3] = bytes2uint32(byte_data,10); //b |
laserdad | 0:2da1f69b38fd | 285 | data[4] = bytes2uint32(byte_data,13); //r |
laserdad | 0:2da1f69b38fd | 286 | data[5] = bytes2uint32(byte_data,16); //c |
laserdad | 0:2da1f69b38fd | 287 | |
laserdad | 0:2da1f69b38fd | 288 | return ( (byte_data[0] & LS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data |
laserdad | 0:2da1f69b38fd | 289 | } |
laserdad | 0:2da1f69b38fd | 290 | |
laserdad | 0:2da1f69b38fd | 291 | char OB1203::get_ps_data(uint32_t *data) |
laserdad | 0:2da1f69b38fd | 292 | { |
laserdad | 0:2da1f69b38fd | 293 | char byte_data[4]; |
laserdad | 0:2da1f69b38fd | 294 | readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,19); |
laserdad | 0:2da1f69b38fd | 295 | #ifdef DEBUG |
laserdad | 0:2da1f69b38fd | 296 | pc.printf( "%02x %02x %02x %02x\r\n", byte_data[0], byte_data[1], byte_data[2], byte_data[3] ); |
laserdad | 0:2da1f69b38fd | 297 | #endif |
laserdad | 0:2da1f69b38fd | 298 | |
laserdad | 0:2da1f69b38fd | 299 | //byte_data[0] is status |
laserdad | 0:2da1f69b38fd | 300 | data[0] = ((uint32_t)byte_data[3])<<8 | ((uint32_t)byte_data[2]); |
laserdad | 0:2da1f69b38fd | 301 | return ( (byte_data[1] & PS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data |
laserdad | 0:2da1f69b38fd | 302 | } |
laserdad | 0:2da1f69b38fd | 303 | |
laserdad | 0:2da1f69b38fd | 304 | char OB1203::get_ps_ls_data(uint32_t *data) |
laserdad | 0:2da1f69b38fd | 305 | { |
laserdad | 0:2da1f69b38fd | 306 | char byte_data[19]; |
laserdad | 0:2da1f69b38fd | 307 | readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,19); |
laserdad | 0:2da1f69b38fd | 308 | #ifdef DEBUG |
laserdad | 0:2da1f69b38fd | 309 | pc.printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", |
laserdad | 0:2da1f69b38fd | 310 | byte_data[0],byte_data[1],byte_data[2],byte_data[3],byte_data[4], |
laserdad | 0:2da1f69b38fd | 311 | byte_data[5],byte_data[6],byte_data[7],byte_data[8],byte_data[9], |
laserdad | 0:2da1f69b38fd | 312 | byte_data[10],byte_data[11],byte_data[12],byte_data[13],byte_data[14], |
laserdad | 0:2da1f69b38fd | 313 | byte_data[15],byte_data[16],byte_data[17],byte_data[18] ); |
laserdad | 0:2da1f69b38fd | 314 | #endif |
laserdad | 0:2da1f69b38fd | 315 | |
laserdad | 0:2da1f69b38fd | 316 | //byte_data[0] is status |
laserdad | 0:2da1f69b38fd | 317 | data[0] = ((uint32_t)byte_data[3])<<8 | ((uint32_t)byte_data[2]); |
laserdad | 0:2da1f69b38fd | 318 | data[1] = bytes2uint32(byte_data,4); //w |
laserdad | 0:2da1f69b38fd | 319 | data[2] = bytes2uint32(byte_data,7); //g |
laserdad | 0:2da1f69b38fd | 320 | data[3] = bytes2uint32(byte_data,10); //b |
laserdad | 0:2da1f69b38fd | 321 | data[4] = bytes2uint32(byte_data,13); //r |
laserdad | 0:2da1f69b38fd | 322 | data[5] = bytes2uint32(byte_data,16); //c |
laserdad | 0:2da1f69b38fd | 323 | return ( (byte_data[0] & LS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data |
laserdad | 0:2da1f69b38fd | 324 | } |
laserdad | 0:2da1f69b38fd | 325 | |
laserdad | 0:2da1f69b38fd | 326 | |
laserdad | 0:2da1f69b38fd | 327 | void OB1203::getFifoInfo(char *fifo_info) |
laserdad | 0:2da1f69b38fd | 328 | { |
laserdad | 0:2da1f69b38fd | 329 | readBlock(OB1203_ADDR,REG_FIFO_WR_PTR,fifo_info,3); |
laserdad | 0:2da1f69b38fd | 330 | writePointer = fifo_info[0]; |
laserdad | 0:2da1f69b38fd | 331 | readPointer = fifo_info[1]; |
laserdad | 0:2da1f69b38fd | 332 | fifoOverflow = fifo_info[2]; |
laserdad | 0:2da1f69b38fd | 333 | } |
laserdad | 0:2da1f69b38fd | 334 | |
laserdad | 0:2da1f69b38fd | 335 | |
laserdad | 0:2da1f69b38fd | 336 | uint8_t OB1203::getNumFifoSamplesAvailable() |
laserdad | 0:2da1f69b38fd | 337 | { |
laserdad | 0:2da1f69b38fd | 338 | uint8_t numSamples = writePointer; |
laserdad | 0:2da1f69b38fd | 339 | if (writePointer<readPointer) |
laserdad | 0:2da1f69b38fd | 340 | { |
laserdad | 0:2da1f69b38fd | 341 | numSamples += 31-readPointer; |
laserdad | 0:2da1f69b38fd | 342 | } |
laserdad | 0:2da1f69b38fd | 343 | return numSamples; |
laserdad | 0:2da1f69b38fd | 344 | } |
laserdad | 0:2da1f69b38fd | 345 | |
laserdad | 0:2da1f69b38fd | 346 | |
laserdad | 0:2da1f69b38fd | 347 | void OB1203::getFifoSamples(uint8_t numSamples, char *fifoData) |
laserdad | 0:2da1f69b38fd | 348 | { |
laserdad | 0:2da1f69b38fd | 349 | readBlock(OB1203_ADDR,REG_FIFO_DATA,fifoData,numSamples); |
laserdad | 0:2da1f69b38fd | 350 | } |
laserdad | 0:2da1f69b38fd | 351 | |
laserdad | 0:2da1f69b38fd | 352 | |
laserdad | 0:2da1f69b38fd | 353 | void OB1203::parseFifoSamples(char numSamples, char *fifoData, uint32_t *assembledData) |
laserdad | 0:2da1f69b38fd | 354 | { |
laserdad | 0:2da1f69b38fd | 355 | for (int n=0; n<numSamples; n++) |
laserdad | 0:2da1f69b38fd | 356 | { |
laserdad | 0:2da1f69b38fd | 357 | assembledData[n] = bytes2uint32(fifoData,3*n); |
laserdad | 0:2da1f69b38fd | 358 | } |
laserdad | 0:2da1f69b38fd | 359 | } |
laserdad | 0:2da1f69b38fd | 360 | |
laserdad | 0:2da1f69b38fd | 361 | |
laserdad | 0:2da1f69b38fd | 362 | char OB1203::get_part_ID(char *data) |
laserdad | 0:2da1f69b38fd | 363 | { |
laserdad | 0:2da1f69b38fd | 364 | readBlock(OB1203_ADDR,REG_PART_ID,data,1); |
laserdad | 0:2da1f69b38fd | 365 | return data[0]; |
laserdad | 0:2da1f69b38fd | 366 | } |