Skip to content

Commit 51f5382

Browse files
authored
Merge pull request #23 from ladyada/master
Allow for MSB-order I2C readings
2 parents 27aef0d + b59c089 commit 51f5382

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

adafruit_register/i2c_bit.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,17 @@ class RWBit:
4141
:param int register_address: The register address to read the bit from
4242
:param type bit: The bit index within the byte at ``register_address``
4343
:param int register_width: The number of bytes in the register. Defaults to 1.
44+
:param bool lsb_first: Is the first byte we read from I2C the LSB? Defaults to true
45+
4446
"""
45-
def __init__(self, register_address, bit, register_width=1):
47+
def __init__(self, register_address, bit, register_width=1, lsb_first=True):
4648
self.bit_mask = 1 << (bit%8) # the bitmask *within* the byte!
4749
self.buffer = bytearray(1 + register_width)
4850
self.buffer[0] = register_address
49-
self.byte = bit // 8 + 1 # the byte number within the buffer
51+
if lsb_first:
52+
self.byte = bit // 8 + 1 # the byte number within the buffer
53+
else:
54+
self.byte = register_width - (bit // 8) # the byte number within the buffer
5055

5156
def __get__(self, obj, objtype=None):
5257
with obj.i2c_device as i2c:
@@ -72,6 +77,7 @@ class ROBit(RWBit):
7277
:param int register_address: The register address to read the bit from
7378
:param type bit: The bit index within the byte at ``register_address``
7479
:param int register_width: The number of bytes in the register. Defaults to 1.
80+
7581
"""
7682
def __set__(self, obj, value):
7783
raise AttributeError()

adafruit_register/i2c_bits.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,29 @@ class RWBits:
4343
:param int register_address: The register address to read the bit from
4444
:param type lowest_bit: The lowest bits index within the byte at ``register_address``
4545
:param int register_width: The number of bytes in the register. Defaults to 1.
46+
:param bool lsb_first: Is the first byte we read from I2C the LSB? Defaults to true
4647
"""
47-
def __init__(self, num_bits, register_address, lowest_bit, register_width=1):
48+
def __init__(self, num_bits, register_address, lowest_bit, # pylint: disable=too-many-arguments
49+
register_width=1, lsb_first=True):
4850
self.bit_mask = ((1 << num_bits)-1) << lowest_bit
4951
#print("bitmask: ",hex(self.bit_mask))
5052
if self.bit_mask >= 1 << (register_width*8):
5153
raise ValueError("Cannot have more bits than register size")
5254
self.lowest_bit = lowest_bit
5355
self.buffer = bytearray(1 + register_width)
5456
self.buffer[0] = register_address
57+
self.lsb_first = lsb_first
5558

5659
def __get__(self, obj, objtype=None):
5760
with obj.i2c_device as i2c:
5861
i2c.write_then_readinto(self.buffer, self.buffer,
5962
out_end=1, in_start=1, stop=False)
6063
# read the number of bytes into a single variable
6164
reg = 0
62-
for i in range(len(self.buffer)-1, 0, -1):
65+
order = range(len(self.buffer)-1, 0, -1)
66+
if not self.lsb_first:
67+
order = reversed(order)
68+
for i in order:
6369
reg = (reg << 8) | self.buffer[i]
6470
return (reg & self.bit_mask) >> self.lowest_bit
6571

@@ -69,13 +75,16 @@ def __set__(self, obj, value):
6975
i2c.write_then_readinto(self.buffer, self.buffer,
7076
out_end=1, in_start=1, stop=False)
7177
reg = 0
72-
for i in range(len(self.buffer)-1, 0, -1):
78+
order = range(len(self.buffer)-1, 0, -1)
79+
if not self.lsb_first:
80+
order = range(1, len(self.buffer))
81+
for i in order:
7382
reg = (reg << 8) | self.buffer[i]
7483
#print("old reg: ", hex(reg))
7584
reg &= ~self.bit_mask # mask off the bits we're about to change
7685
reg |= value # then or in our new value
7786
#print("new reg: ", hex(reg))
78-
for i in range(1, len(self.buffer)):
87+
for i in reversed(order):
7988
self.buffer[i] = reg & 0xFF
8089
reg >>= 8
8190
i2c.write(self.buffer)

0 commit comments

Comments
 (0)