@@ -45,10 +45,18 @@ class RWBits:
45
45
:param type lowest_bit: The lowest bits index within the byte at ``register_address``
46
46
:param int register_width: The number of bytes in the register. Defaults to 1.
47
47
: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.
48
50
"""
49
51
50
52
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 ,
52
60
):
53
61
self .bit_mask = ((1 << num_bits ) - 1 ) << lowest_bit
54
62
# print("bitmask: ",hex(self.bit_mask))
@@ -58,6 +66,7 @@ def __init__( # pylint: disable=too-many-arguments
58
66
self .buffer = bytearray (1 + register_width )
59
67
self .buffer [0 ] = register_address
60
68
self .lsb_first = lsb_first
69
+ self .sign_bit = (1 << (num_bits - 1 )) if signed else 0
61
70
62
71
def __get__ (self , obj , objtype = None ):
63
72
with obj .i2c_device as i2c :
@@ -69,7 +78,11 @@ def __get__(self, obj, objtype=None):
69
78
order = reversed (order )
70
79
for i in order :
71
80
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
73
86
74
87
def __set__ (self , obj , value ):
75
88
value <<= self .lowest_bit # shift the value over to the right spot
0 commit comments