Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
update for bmp5xx usage
  • Loading branch information
FoamyGuy committed Sep 11, 2025
commit 0ed462cb93f7c4f9362c4e6820d5ef6025cbed7b
23 changes: 21 additions & 2 deletions adafruit_register_spi/spi_bit.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,18 @@ class RWBit:

"""

def _shift_rw_cmd_bit_into_address_byte(self, bit_value):
if bit_value not in {0, 1}:
raise ValueError("bit_value must be 0 or 1")

# Clear the MSB (set bit 7 to 0)
cleared_byte = self.buffer[0] & 0x7F
# Set the MSB to the desired bit value
self.buffer[0] = cleared_byte | (bit_value << 7)


def __init__(self, register_address, bit, register_width=1, lsb_first=True):
print(f"register address: {hex(register_address)}, bit: {bit}, width: {register_width}")
self.bit_mask = 1 << (bit % 8) # the bitmask *within* the byte!
self.buffer = bytearray(1 + register_width)
self.buffer[0] = register_address
Expand All @@ -38,18 +49,26 @@ def __init__(self, register_address, bit, register_width=1, lsb_first=True):

def __get__(self, obj, objtype=None):
with obj.spi_device as spi:
spi.write(self.buffer, end=2)
self._shift_rw_cmd_bit_into_address_byte(1)
print(f"RWBit __get__ buffer b4: {', '.join(bin(b) for b in self.buffer)}")
spi.write(self.buffer, end=1)
spi.readinto(self.buffer, start=1)
print(f"RWBit __get__ buffer after: {', '.join(bin(b) for b in self.buffer)}")
return bool(self.buffer[self.byte] & self.bit_mask)

def __set__(self, obj, value):
with obj.spi_device as spi:
spi.write(self.buffer, end=2)
self._shift_rw_cmd_bit_into_address_byte(0)
print(f"RWBit __set__ b4 readinto buffer: {', '.join(bin(b) for b in self.buffer)}, value: {hex(value)}")
spi.write(self.buffer, end=1)
spi.readinto(self.buffer, start=1)
if value:
self.buffer[self.byte] |= self.bit_mask
else:
self.buffer[self.byte] &= ~self.bit_mask
self._shift_rw_cmd_bit_into_address_byte(0)
print(
f"RWBit __set__ before data write buffer: {', '.join(hex(b) for b in self.buffer)}, value: {hex(value)}")
spi.write(self.buffer)


Expand Down
32 changes: 28 additions & 4 deletions adafruit_register_spi/spi_bits.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
* Author(s): Scott Shawcroft
* Adaptation by Max Holliday
"""
import time


class RWBits:
Expand Down Expand Up @@ -44,39 +45,62 @@ def __init__(
self.buffer = bytearray(1 + register_width)
self.buffer[0] = register_address
self.buffer[1] = register_width - 1
print(f"__init__ buffer: {', '.join(bin(b) for b in self.buffer)}")
self.lsb_first = lsb_first

def _shift_rw_cmd_bit_into_address_byte(self, bit_value):
if bit_value not in {0, 1}:
raise ValueError("bit_value must be 0 or 1")

# Clear the MSB (set bit 7 to 0)
cleared_byte = self.buffer[0] & 0x7F
# Set the MSB to the desired bit value
self.buffer[0] = cleared_byte | (bit_value << 7)

def __get__(self, obj, objtype=None):
with obj.spi_device as spi:
spi.write(self.buffer, end=2)
self._shift_rw_cmd_bit_into_address_byte(1)
print(f"__get__ buffer b4: {', '.join(bin(b) for b in self.buffer)}")
spi.write(self.buffer, end=1)
time.sleep(0.01)
spi.readinto(self.buffer, start=1)
print(f"__get__ buffer after: {', '.join(bin(b) for b in self.buffer)}")
# read the number of bytes into a single variable
reg = 0
order = range(len(self.buffer) - 1, 0, -1)
if not self.lsb_first:
order = reversed(order)
for i in order:
print(f"i = {i}")
reg = (reg << 8) | self.buffer[i]
return (reg & self.bit_mask) >> self.lowest_bit

def __set__(self, obj, value):
value <<= self.lowest_bit # shift the value over to the right spot
with obj.spi_device as spi:
spi.write(self.buffer, end=2)
# print(f"buffer: {', '.join(bin(b) for b in self.buffer)}")
self._shift_rw_cmd_bit_into_address_byte(1)
print(f"RWBits __set__ b4 readinto buffer: {', '.join(bin(b) for b in self.buffer)}, value: {hex(value)}")
spi.write(self.buffer, end=1)
spi.readinto(self.buffer, start=1)
reg = 0
order = range(len(self.buffer) - 1, 0, -1)

if not self.lsb_first:
order = range(1, len(self.buffer))
for i in order:
reg = (reg << 8) | self.buffer[i]
# print("old reg: ", hex(reg))
print("old reg: ", hex(reg))
reg &= ~self.bit_mask # mask off the bits we're about to change
reg |= value # then or in our new value
# print("new reg: ", hex(reg))
print("new reg: ", hex(reg))
for i in reversed(order):
self.buffer[i] = reg & 0xFF
reg >>= 8

self._shift_rw_cmd_bit_into_address_byte(0)
print(
f"RWBits __set__ before data write buffer: {', '.join(hex(b) for b in self.buffer)}, value: {hex(value)}")
spi.write(self.buffer)


Expand Down