Skip to content

Commit 6143ec2

Browse files
authored
Merge pull request #39 from jepler/signed-bits
RWBits: Add support for signed registers
2 parents 9f86b51 + 3cc3e8e commit 6143ec2

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

adafruit_register/i2c_bits.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,18 @@ class RWBits:
4545
:param type lowest_bit: The lowest bits index within the byte at ``register_address``
4646
:param int register_width: The number of bytes in the register. Defaults to 1.
4747
:param bool lsb_first: Is the first byte we read from I2C the LSB? Defaults to true
48+
:param bool signed: If True, the value is a "two's complement" signed value.
49+
If False, it is unsigned.
4850
"""
4951

5052
def __init__( # pylint: disable=too-many-arguments
51-
self, num_bits, register_address, lowest_bit, register_width=1, lsb_first=True,
53+
self,
54+
num_bits,
55+
register_address,
56+
lowest_bit,
57+
register_width=1,
58+
lsb_first=True,
59+
signed=False,
5260
):
5361
self.bit_mask = ((1 << num_bits) - 1) << lowest_bit
5462
# print("bitmask: ",hex(self.bit_mask))
@@ -58,6 +66,7 @@ def __init__( # pylint: disable=too-many-arguments
5866
self.buffer = bytearray(1 + register_width)
5967
self.buffer[0] = register_address
6068
self.lsb_first = lsb_first
69+
self.sign_bit = (1 << (num_bits - 1)) if signed else 0
6170

6271
def __get__(self, obj, objtype=None):
6372
with obj.i2c_device as i2c:
@@ -69,7 +78,11 @@ def __get__(self, obj, objtype=None):
6978
order = reversed(order)
7079
for i in order:
7180
reg = (reg << 8) | self.buffer[i]
72-
return (reg & self.bit_mask) >> self.lowest_bit
81+
reg = (reg & self.bit_mask) >> self.lowest_bit
82+
# If the value is signed and negative, convert it
83+
if reg & self.sign_bit:
84+
reg -= 2 * self.sign_bit
85+
return reg
7386

7487
def __set__(self, obj, value):
7588
value <<= self.lowest_bit # shift the value over to the right spot

0 commit comments

Comments
 (0)