static int aconfigure(int type, int v) { uint8_t buf[2]; switch (type) { case SENSORS_HW_INIT: case SENSORS_ACTIVE: if (v) { /* normal mode, 100Hz output rate, enable all axes */ if (!I2CW(LSM303_ADDR_A,LSM303_CTRL_REG1,0x2f)) return false; /* see if we get an ack */ /* +-2g, block update enabled */ I2CW(LSM303_ADDR_A,LSM303_CTRL_REG4,0x80); acc_active = true; acc_startsample(true); return true; } else { acc_active = false; return I2CW(LSM303_ADDR_A,LSM303_CTRL_REG1,0x00); } case ACC_LSM303_RANGE: I2CW(LSM303_ADDR_A,LSM303_CTRL_REG4,(1<<7)|((v&3)<<4)); break; case ACC_LSM303_DRATE: if (v<ACC_LSM303VAL_0_5HZ || v>ACC_LSM303VAL_1KHZ) return 1; else if (v<ACC_LSM303VAL_50HZ) /* low-power mode */ I2CW(LSM303_ADDR_A,LSM303_CTRL_REG1,(v<<5)|0x07); else if (v>=ACC_LSM303VAL_50HZ) /* normal mode */ I2CW(LSM303_ADDR_A,LSM303_CTRL_REG1,(1<<5)|((v-ACC_LSM303VAL_50HZ)<<3)|0x07); break; case ACC_LSM303_HIGHPASS: buf[0]=LSM303_CTRL_REG2; i2cb(LSM303_ADDR_A,1,1,buf); buf[1]&=~(0x02); buf[1]|=v|(1<<5); i2cb(LSM303_ADDR_A,2,0,buf); break; case ACC_LSM303_FILTER: buf[0]=LSM303_CTRL_REG2; i2cb(LSM303_ADDR_A,1,1,buf); if (v==ACC_LSM303VAL_NONE) buf[1]&=~(1<<4); // unset FDS bit else if (v==ACC_LSM303VAL_BOTH) buf[1]|=(1<<4); // set FDS bit i2cb(LSM303_ADDR_A,2,0,buf); break; } return 0; }
bool i2cs(u8_t addr, char *wrbuf) { return i2cb(addr, strlen(wrbuf), 0, wrbuf); }