OB1203 basic mbed driver

Dependents:   OB1203_IDT

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?

UserRevisionLine numberNew 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 }