diff --git a/Adafruit_I2CDevice.cpp b/Adafruit_I2CDevice.cpp index c3804d3..3cae6f2 100644 --- a/Adafruit_I2CDevice.cpp +++ b/Adafruit_I2CDevice.cpp @@ -1,7 +1,7 @@ #include #include -#define DEBUG_SERIAL Serial +//#define DEBUG_SERIAL Serial Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) { _addr = addr; diff --git a/Adafruit_I2CRegister.cpp b/Adafruit_I2CRegister.cpp index 85e60a5..37bfe7c 100644 --- a/Adafruit_I2CRegister.cpp +++ b/Adafruit_I2CRegister.cpp @@ -46,7 +46,7 @@ uint32_t Adafruit_I2CRegister::read(void) { for (int i=0; i < _width; i++) { value <<= 8; - if (_bitorder == MSBFIRST) { + if (_bitorder == LSBFIRST) { value |= _buffer[_width-i-1]; } else { value |= _buffer[i]; @@ -90,3 +90,41 @@ bool Adafruit_I2CRegister::read(uint8_t *value) { *value = _buffer[0]; return true; } + +void Adafruit_I2CRegister::print(Stream *s) { + uint32_t val = read(); + s->print("0x"); s->print(val, HEX); +} + +void Adafruit_I2CRegister::println(Stream *s) { + print(s); + s->println(); +} + + +Adafruit_I2CRegisterBits::Adafruit_I2CRegisterBits(Adafruit_I2CRegister *reg, uint8_t bits, uint8_t shift) { + _register = reg; + _bits = bits; + _shift = shift; +} + +uint32_t Adafruit_I2CRegisterBits::read(void) { + uint32_t val = _register->read(); + val >>= _shift; + return val & ((1 << (_bits+1)) - 1); +} + +void Adafruit_I2CRegisterBits::write(uint32_t data) { + uint32_t val = _register->read(); + + // mask off the data before writing + uint32_t mask = (1 << (_bits+1)) - 1; + data &= mask; + + mask <<= _shift; + val &= ~mask; // remove the current data at that spot + val |= data << _shift; // and add in the new data + + _register->write(val, _register->width()); +} + diff --git a/Adafruit_I2CRegister.h b/Adafruit_I2CRegister.h index ddbe107..2ee3033 100644 --- a/Adafruit_I2CRegister.h +++ b/Adafruit_I2CRegister.h @@ -20,6 +20,11 @@ class Adafruit_I2CRegister { bool write(uint8_t *buffer, uint8_t len); bool write(uint32_t value, uint8_t numbytes=0); + uint8_t width(void) { return _width; } + + void print(Stream *s=&Serial); + void println(Stream *s=&Serial); + private: Adafruit_I2CDevice *_device; uint16_t _address; @@ -27,5 +32,15 @@ class Adafruit_I2CRegister { uint8_t _buffer[4]; // we wont support anything larger than uint32 for non-buffered read }; +class Adafruit_I2CRegisterBits { + public: + Adafruit_I2CRegisterBits(Adafruit_I2CRegister *reg, uint8_t bits, uint8_t shift); + void write(uint32_t value); + uint32_t read(void); + private: + Adafruit_I2CRegister *_register; + uint8_t _bits, _shift; +}; + #endif //I2CRegister_h