Source code for micropython_lis3dh.i2c_helpers
# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya
#
# SPDX-License-Identifier: MIT
"""
`i2c_helpers`
================================================================================
I2C MicroPython Helpers
* Author(s): Jose D. Montoya
"""
# pylint: disable=unused-argument, no-name-in-module
try:
import struct
except ImportError:
import ustruct as struct
__version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/jposada202020/LIS3DH.git"
[docs]class CBits:
"""
Changes bits from a byte register
"""
def __init__(self, num_bits: int, register_address: int, start_bit: int) -> None:
self.bit_mask = ((1 << num_bits) - 1) << start_bit
self.register = register_address
self.star_bit = start_bit
def __get__(
self,
obj,
objtype=None,
) -> int:
reg = obj._i2c.readfrom_mem(obj._address, self.register, True)[0]
reg = (reg & self.bit_mask) >> self.star_bit
return reg
def __set__(self, obj, value: int) -> None:
memory_value = obj._i2c.readfrom_mem(obj._address, self.register, True)[0]
memory_value &= ~self.bit_mask
value <<= self.star_bit
memory_value |= value
obj._i2c.writeto_mem(obj._address, self.register, bytes([memory_value]))
[docs]class RegisterStruct:
"""
Register Struct
"""
def __init__(self, register_address: int, form: str, lenght=1) -> None:
self.format = form
self.register = register_address
self.lenght = struct.calcsize(form)
def __get__(
self,
obj,
objtype=None,
):
if self.lenght == 1:
value = obj._i2c.readfrom_mem(obj._address, self.register, self.lenght)[0]
else:
value = struct.unpack(
self.format,
memoryview(
obj._i2c.readfrom_mem(obj._address, self.register, self.lenght)
),
)
return value
def __set__(self, obj, value):
obj._i2c.writeto_mem(obj._address, self.register, bytes([value]))