OB1203 basic mbed driver

Dependents:   OB1203_IDT

Committer:
laserdad
Date:
Wed May 16 22:57:36 2018 +0000
Revision:
7:7d90f25c04fa
Parent:
6:337ee64ca7ab
Child:
8:6c19c052b053
minor revs;

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