Add print debugger, bits type

This commit is contained in:
ladyada 2019-03-08 02:29:27 -05:00
parent e3cf6e7183
commit 77964bccaf
3 changed files with 55 additions and 2 deletions

View File

@ -1,7 +1,7 @@
#include <Adafruit_I2CDevice.h> #include <Adafruit_I2CDevice.h>
#include <Arduino.h> #include <Arduino.h>
#define DEBUG_SERIAL Serial //#define DEBUG_SERIAL Serial
Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) { Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) {
_addr = addr; _addr = addr;

View File

@ -46,7 +46,7 @@ uint32_t Adafruit_I2CRegister::read(void) {
for (int i=0; i < _width; i++) { for (int i=0; i < _width; i++) {
value <<= 8; value <<= 8;
if (_bitorder == MSBFIRST) { if (_bitorder == LSBFIRST) {
value |= _buffer[_width-i-1]; value |= _buffer[_width-i-1];
} else { } else {
value |= _buffer[i]; value |= _buffer[i];
@ -90,3 +90,41 @@ bool Adafruit_I2CRegister::read(uint8_t *value) {
*value = _buffer[0]; *value = _buffer[0];
return true; 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());
}

View File

@ -20,6 +20,11 @@ class Adafruit_I2CRegister {
bool write(uint8_t *buffer, uint8_t len); bool write(uint8_t *buffer, uint8_t len);
bool write(uint32_t value, uint8_t numbytes=0); 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: private:
Adafruit_I2CDevice *_device; Adafruit_I2CDevice *_device;
uint16_t _address; 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 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 #endif //I2CRegister_h