Skip to content

Commit 695205d

Browse files
committed
handle multibyte (but not straddling' bits)
1 parent ed766a4 commit 695205d

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

adafruit_register/i2c_bits.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,13 @@ def __init__(self, num_bits, register_address, lowest_bit, register_width=1):
4848
self.bit_mask = 0
4949
for _ in range(num_bits):
5050
self.bit_mask = (self.bit_mask << 1) + 1
51-
self.bit_mask = self.bit_mask << lowest_bit
52-
if self.bit_mask >= (1 << 8):
53-
raise ValueError()
51+
self.bit_mask = self.bit_mask << (lowest_bit%8)
52+
if self.bit_mask >= 0xFF:
53+
raise ValueError("Cannot have more bits than fit in a single byte")
54+
5455
self.buffer = bytearray(1 + register_width)
5556
self.buffer[0] = register_address
56-
self.lowest_bit = lowest_bit
57+
self.lowest_bit = lowest_bit % 8 # lowest bit within byte
5758
self.byte = lowest_bit // 8 + 1
5859

5960
def __get__(self, obj, objtype=None):
@@ -69,6 +70,7 @@ def __set__(self, obj, value):
6970
with obj.i2c_device as i2c:
7071
i2c.write(self.buffer, end=1, stop=False)
7172
i2c.readinto(self.buffer, start=1)
73+
7274
# Set all of our bits to 1.
7375
self.buffer[self.byte] |= self.bit_mask
7476
# Set all 0 bits to 0 by anding together.
@@ -88,4 +90,4 @@ class ROBits(RWBits):
8890
:param int register_width: The number of bytes in the register. Defaults to 1.
8991
"""
9092
def __set__(self, obj, value):
91-
raise AttributeError()
93+
raise AttributeError()

0 commit comments

Comments
 (0)