From ed766a47ed81d5708220a2acf72e1670a7aa16e6 Mon Sep 17 00:00:00 2001 From: ladyada Date: Thu, 14 Feb 2019 16:58:22 -0500 Subject: [PATCH 1/3] bitmask is now within the byte defined for the bit --- adafruit_register/i2c_bit.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/adafruit_register/i2c_bit.py b/adafruit_register/i2c_bit.py index 581be5d..9e59dad 100644 --- a/adafruit_register/i2c_bit.py +++ b/adafruit_register/i2c_bit.py @@ -43,10 +43,10 @@ class RWBit: :param int register_width: The number of bytes in the register. Defaults to 1. """ def __init__(self, register_address, bit, register_width=1): - self.bit_mask = 1 << bit + self.bit_mask = 1 << (bit%8) # the bitmask *within* the byte! self.buffer = bytearray(1 + register_width) self.buffer[0] = register_address - self.byte = bit // 8 + 1 + self.byte = bit // 8 + 1 # the byte number within the buffer def __get__(self, obj, objtype=None): with obj.i2c_device as i2c: @@ -74,4 +74,4 @@ class ROBit(RWBit): :param int register_width: The number of bytes in the register. Defaults to 1. """ def __set__(self, obj, value): - raise AttributeError() + raise AttributeError() \ No newline at end of file From 695205d1febe93106c6beedd3ebfd8b54d62c260 Mon Sep 17 00:00:00 2001 From: ladyada Date: Thu, 14 Feb 2019 17:10:51 -0500 Subject: [PATCH 2/3] handle multibyte (but not straddling' bits) --- adafruit_register/i2c_bits.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/adafruit_register/i2c_bits.py b/adafruit_register/i2c_bits.py index 5afecd4..95cbe12 100644 --- a/adafruit_register/i2c_bits.py +++ b/adafruit_register/i2c_bits.py @@ -48,12 +48,13 @@ def __init__(self, num_bits, register_address, lowest_bit, register_width=1): self.bit_mask = 0 for _ in range(num_bits): self.bit_mask = (self.bit_mask << 1) + 1 - self.bit_mask = self.bit_mask << lowest_bit - if self.bit_mask >= (1 << 8): - raise ValueError() + self.bit_mask = self.bit_mask << (lowest_bit%8) + if self.bit_mask >= 0xFF: + raise ValueError("Cannot have more bits than fit in a single byte") + self.buffer = bytearray(1 + register_width) self.buffer[0] = register_address - self.lowest_bit = lowest_bit + self.lowest_bit = lowest_bit % 8 # lowest bit within byte self.byte = lowest_bit // 8 + 1 def __get__(self, obj, objtype=None): @@ -69,6 +70,7 @@ def __set__(self, obj, value): with obj.i2c_device as i2c: i2c.write(self.buffer, end=1, stop=False) i2c.readinto(self.buffer, start=1) + # Set all of our bits to 1. self.buffer[self.byte] |= self.bit_mask # Set all 0 bits to 0 by anding together. @@ -88,4 +90,4 @@ class ROBits(RWBits): :param int register_width: The number of bytes in the register. Defaults to 1. """ def __set__(self, obj, value): - raise AttributeError() + raise AttributeError() \ No newline at end of file From 9a8090af9262b7856f7327c01bb67f88229f5682 Mon Sep 17 00:00:00 2001 From: ladyada Date: Thu, 14 Feb 2019 17:11:47 -0500 Subject: [PATCH 3/3] linted --- adafruit_register/i2c_bit.py | 2 +- adafruit_register/i2c_bits.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/adafruit_register/i2c_bit.py b/adafruit_register/i2c_bit.py index 9e59dad..92a327c 100644 --- a/adafruit_register/i2c_bit.py +++ b/adafruit_register/i2c_bit.py @@ -74,4 +74,4 @@ class ROBit(RWBit): :param int register_width: The number of bytes in the register. Defaults to 1. """ def __set__(self, obj, value): - raise AttributeError() \ No newline at end of file + raise AttributeError() diff --git a/adafruit_register/i2c_bits.py b/adafruit_register/i2c_bits.py index 95cbe12..e67ac0a 100644 --- a/adafruit_register/i2c_bits.py +++ b/adafruit_register/i2c_bits.py @@ -70,7 +70,6 @@ def __set__(self, obj, value): with obj.i2c_device as i2c: i2c.write(self.buffer, end=1, stop=False) i2c.readinto(self.buffer, start=1) - # Set all of our bits to 1. self.buffer[self.byte] |= self.bit_mask # Set all 0 bits to 0 by anding together. @@ -90,4 +89,4 @@ class ROBits(RWBits): :param int register_width: The number of bytes in the register. Defaults to 1. """ def __set__(self, obj, value): - raise AttributeError() \ No newline at end of file + raise AttributeError()