@@ -43,23 +43,29 @@ class RWBits:
43
43
:param int register_address: The register address to read the bit from
44
44
:param type lowest_bit: The lowest bits index within the byte at ``register_address``
45
45
: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
46
47
"""
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 ):
48
50
self .bit_mask = ((1 << num_bits )- 1 ) << lowest_bit
49
51
#print("bitmask: ",hex(self.bit_mask))
50
52
if self .bit_mask >= 1 << (register_width * 8 ):
51
53
raise ValueError ("Cannot have more bits than register size" )
52
54
self .lowest_bit = lowest_bit
53
55
self .buffer = bytearray (1 + register_width )
54
56
self .buffer [0 ] = register_address
57
+ self .lsb_first = lsb_first
55
58
56
59
def __get__ (self , obj , objtype = None ):
57
60
with obj .i2c_device as i2c :
58
61
i2c .write_then_readinto (self .buffer , self .buffer ,
59
62
out_end = 1 , in_start = 1 , stop = False )
60
63
# read the number of bytes into a single variable
61
64
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 :
63
69
reg = (reg << 8 ) | self .buffer [i ]
64
70
return (reg & self .bit_mask ) >> self .lowest_bit
65
71
@@ -69,13 +75,16 @@ def __set__(self, obj, value):
69
75
i2c .write_then_readinto (self .buffer , self .buffer ,
70
76
out_end = 1 , in_start = 1 , stop = False )
71
77
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 :
73
82
reg = (reg << 8 ) | self .buffer [i ]
74
83
#print("old reg: ", hex(reg))
75
84
reg &= ~ self .bit_mask # mask off the bits we're about to change
76
85
reg |= value # then or in our new value
77
86
#print("new reg: ", hex(reg))
78
- for i in range ( 1 , len ( self . buffer ) ):
87
+ for i in reversed ( order ):
79
88
self .buffer [i ] = reg & 0xFF
80
89
reg >>= 8
81
90
i2c .write (self .buffer )
0 commit comments