re-commit after black

pull/860/head
SquirtleSquadLeader 2024-05-22 21:50:01 -04:00 zatwierdzone przez GitHub
rodzic ce4a579b6e
commit 1f37df5588
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
1 zmienionych plików z 448 dodań i 372 usunięć

Wyświetl plik

@ -34,16 +34,22 @@
Q unsigned long long 8
f float 4
d double 8
"""
from machine import I2C
from struct import pack, unpack
class RORegBit:
def __init__(self, i2c, dev_addr, reg_addr, num_bytes, bit_location, endian='', fmt='B'):
def __init__(
self, i2c, dev_addr, reg_addr, num_bytes, bit_location, endian="", fmt="B"
):
"""
Creates an :class:`RORegBit` object which allows read only access to a single bit within a register.
:param i2c: I2C bus which connects the host system to the peripheral device
:type kind: machine.I2C()
:param dev_addr: I2C address of the device which
@ -135,8 +141,11 @@ class RORegBit:
"""
return __getbit(self)
class RWRegBit:
def __init__(self, i2c, dev_addr, reg_addr, num_bytes, bit_location, endian='', fmt='B'):
def __init__(
self, i2c, dev_addr, reg_addr, num_bytes, bit_location, endian="", fmt="B"
):
"""
Creates an :class:`RORegBit` object which allows read and write access to a single bit within a register.
@ -222,7 +231,9 @@ class RWRegBit:
__check_reg(self)
self._premask, self._postmask = __calc_mask(bit_location, bit_location, num_bytes)
self._premask, self._postmask = __calc_mask(
bit_location, bit_location, num_bytes
)
del (i2c, dev_addr, reg_addr, num_bytes, bit_location, endian, fmt)
@ -240,8 +251,11 @@ class RWRegBit:
"""
return __setbit(self, setting)
class RORegBits:
def __init__(self, i2c, dev_addr, reg_addr, num_bytes, lsb, msb, endian='', fmt='B'):
def __init__(
self, i2c, dev_addr, reg_addr, num_bytes, lsb, msb, endian="", fmt="B"
):
"""
Creates an :class:`RORegBits` object which allows read only access to a sequential set of bits within a bitfield.
@ -343,8 +357,11 @@ class RORegBits:
"""
return __getbits(self)
class RWRegBits:
def __init__(self, i2c, dev_addr, reg_addr, num_bytes, lsb, msb, endian='', fmt='B'):
def __init__(
self, i2c, dev_addr, reg_addr, num_bytes, lsb, msb, endian="", fmt="B"
):
"""
Creates an :class:`RWRegBits` object which allows read and write access to a sequential set of bits within a bitfield.
@ -463,8 +480,9 @@ class RWRegBits:
"""
return __setbits(self, setting)
class ROReg:
def __init__(self, i2c, dev_addr, reg_addr, num_bytes=1, endian='', fmt='B'):
def __init__(self, i2c, dev_addr, reg_addr, num_bytes=1, endian="", fmt="B"):
"""
Creates a :class:`ROReg` object which allows read only access to n number of sequential registers,
where n is specified by :param num_bytes:.
@ -560,7 +578,9 @@ class ROReg:
"""
return __getreg(self)
class RWReg:
def __init__(self, i2c, dev_addr, reg_addr, num_bytes, endian="", fmt="B"):
"""
Creates a :class:`RWReg` object which allows read and write access to n number of sequential registers,
where n is specified by :param num_bytes:.
@ -647,7 +667,6 @@ class RWReg:
print(device.my_reg2) # prints 240
"""
def __init__(self, i2c, dev_addr, reg_addr, num_bytes, endian='', fmt='B'):
self._i2c = i2c
self._dev_addr = dev_addr
self._reg_addr = reg_addr
@ -675,16 +694,21 @@ class RWReg:
"""
return __setreg(self, setting)
"""
*
* GLOBAL HELPER FUNCTIONS
*
*
"""
def __getbit(reg_object):
if isinstance(reg_object, (RORegBit, RWRegBit)):
# Retrieve register value and unpack to int
value = reg_object._i2c.readfrom_mem(reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes)
value = reg_object._i2c.readfrom_mem(
reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes
)
# Unpack byte
value = unpack(reg_object._endian + reg_object._fmt, value)[0]
@ -695,23 +719,32 @@ def __getbit(reg_object):
else:
raise TypeError("incorrect object type - must be RORegBit, RWRegBit")
def __setbit(reg_object, setting):
if isinstance(reg_object, RWRegBit):
if setting in (0, 1):
# Retrieve register value and unpack to int
value = reg_object._i2c.readfrom_mem(reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes)
value = reg_object._i2c.readfrom_mem(
reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes
)
# Unpack byte
value = unpack(reg_object._endian + reg_object._fmt, value)[0]
# Assemble byte
value = (value&reg_object._postmask) + (setting<<reg_object._bit_location) + (value&reg_object._premask)
value = (
(value & reg_object._postmask)
+ (setting << reg_object._bit_location)
+ (value & reg_object._premask)
)
# Pack to bytes
value = pack(reg_object._endian + reg_object._fmt, value)
# Write to I2C
reg_object._i2c.writeto_mem(reg_object._dev_addr, reg_object._reg_addr, value)
reg_object._i2c.writeto_mem(
reg_object._dev_addr, reg_object._reg_addr, value
)
# Return True for success
return True
@ -721,10 +754,13 @@ def __setbit(reg_object, setting):
else:
raise TypeError("incorrect object type - must be RWRegBit")
def __getbits(reg_object):
if isinstance(reg_object, (RORegBits, RWRegBits)):
# Retrieve register value and unpack to int
value = reg_object._i2c.readfrom_mem(reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes)
value = reg_object._i2c.readfrom_mem(
reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes
)
# Unpack bytes
value = unpack(reg_object._endian + reg_object._fmt, value)[0]
@ -735,36 +771,50 @@ def __getbits(reg_object):
else:
raise TypeError("incorrect object type - must be RORegBits, RWRegBits")
def __setbits(reg_object, setting):
if isinstance(reg_object, RWRegBits):
if isinstance(setting, int) and setting <= reg_object._mask:
# Retrieve register value and unpack to int
value = reg_object._i2c.readfrom_mem(reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes)
value = reg_object._i2c.readfrom_mem(
reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes
)
# Unpack bytes
value = unpack(reg_object._endian + reg_object._fmt, value)[0]
# Assemble
value = (value&reg_object._postmask) + (setting<<reg_object._lsb) + (value&reg_object._premask)
value = (
(value & reg_object._postmask)
+ (setting << reg_object._lsb)
+ (value & reg_object._premask)
)
# Pack to bytes object
value = struct.pack(reg_object._endian + reg_object._fmt, value)
# Write to device
reg_object._i2c.writeto_mem(reg_object._dev_addr, reg_object._reg_addr, value)
reg_object._i2c.writeto_mem(
reg_object._dev_addr, reg_object._reg_addr, value
)
return True
else:
raise ValueError(f"value of setting exceeds max value of bitfield: {reg_object._mask}")
raise ValueError(
f"value of setting exceeds max value of bitfield: {reg_object._mask}"
)
else:
raise TypeError("incorrect object type - must be RWRegBits")
def __getreg(reg_object):
if isinstance(reg_object, (ROReg, RWReg)):
# Retrieve register value and unpack to int
values = reg_object._i2c.readfrom_mem(reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes)
values = reg_object._i2c.readfrom_mem(
reg_object._dev_addr, reg_object._reg_addr, reg_object._num_bytes
)
# Return Tuple of values
return unpack(reg_object._endian + reg_object._fmt, values)
@ -772,12 +822,15 @@ def __getreg(reg_object):
else:
raise TypeError("incorrect object type - must be ROReg, RWReg")
def __setreg(reg_object, settings):
if isinstance(reg_object, RWReg):
if isinstance(settings, (bytes, bytearray)):
# Write to device
reg_object._i2c.writeto_mem(reg_object._dev_addr, reg_object._reg_addr, settings)
reg_object._i2c.writeto_mem(
reg_object._dev_addr, reg_object._reg_addr, settings
)
elif isinstance(settings, (tuple, list)):
# Where our data will go
@ -796,16 +849,20 @@ def __setreg(reg_object, settings):
reg_object._i2c.writeto_mem(reg_object._dev_addr, reg_object._reg_addr, d)
else:
raise TypeError("unsupported object type, settings must be int(), bytes(), bytearray(), tuple(), or list()")
raise TypeError(
"unsupported object type, settings must be int(), bytes(), bytearray(), tuple(), or list()"
)
else:
raise TypeError("incorrect object type - must be ROReg, RWReg")
def __calc_mask(lsb, msb, numbytes):
"""
Takes in full description of bitfield that needs masking
returns ints() pre, mask, post
"""
# Check input types
if lsb.__class__() == int() and lsb >= 0:
if msb.__class__() == int() and msb >= 0:
@ -860,11 +917,24 @@ def __calc_mask(lsb, msb, numbytes):
else:
raise ValueError("lsb must be of type int() and 0 or greater")
def __check_reg(reg_object):
# Alowable struct.pack/unpack formats to check for
fmts = {'b':1, 'B':1, 'h':2, 'H':2, 'f':4, 'i':4, 'I':4, 'l':4, 'L':4, 'q':8, 'Q':8}
endians = '@><'
fmts = {
"b": 1,
"B": 1,
"h": 2,
"H": 2,
"f": 4,
"i": 4,
"I": 4,
"l": 4,
"L": 4,
"q": 8,
"Q": 8,
}
endians = "@><"
byte_count = 0
# Take in only register objects
@ -880,12 +950,18 @@ def __check_reg(reg_object):
byte_count = byte_count + fmts[reg_object._fmt[n]]
else:
raise ValueError(f"unsupported format code of '{reg_object._fmt[n]}'")
raise ValueError(
f"unsupported format code of '{reg_object._fmt[n]}'"
)
if byte_count != reg_object._num_bytes:
raise ValueError(f"format string accounts for {byte_count} bytes, _num_bytes value of {reg_object._num_bytes} does not match")
raise ValueError(
f"format string accounts for {byte_count} bytes, _num_bytes value of {reg_object._num_bytes} does not match"
)
else:
raise TypeError("format and endian must be of type str()")
else:
raise TypeError("incorrect object type - must be ROReg, RWReg, ROBits, RWBits, ROReg, RWReg")
raise TypeError(
"incorrect object type - must be ROReg, RWReg, ROBits, RWBits, ROReg, RWReg"
)