ltr390uv

Форк
0
101 строка · 5.0 Кб
1
# micropython
2
# MIT license
3
# Copyright (c) 2024 Roman Shevchik   goctaprog@gmail.com
4
"""представление аппаратного регистра устройства"""
5

6
# from sensor_pack_2 import bus_service
7
from sensor_pack_2.base_sensor import DeviceEx, get_error_str, check_value
8
from sensor_pack_2.bitfield import BitFields
9

10

11
class BaseRegistry:
12
    """Представление аппаратного регистра. Базовый класс."""
13

14
    def _get_width(self) -> int:
15
        """Возвращает разрядность регистра по информация из параметра типа BitFields в байтах!"""
16
        mx = max(map(lambda val: val.position.stop, self._fields))
17
        # print(f"DBG: _get_width: {mx}")
18
        return 1 + int((mx - 1)/8)
19

20
    def __init__(self, device: [DeviceEx, None], address: int, fields: BitFields, byte_len: [int, None] = None):
21
        """device - устройство, которому принадлежит регистр.
22
        address - адрес регистра в памяти устройства.
23
        fields - битовые поля регистра.
24
        byte_len - разрядность регистра в байтах!"""
25
        check_value(byte_len, range(1, 3), get_error_str('byte_len', byte_len, range(1, 3)))
26
        self._device = device
27
        self._address = address
28
        self._fields = fields
29
        # один или два байта!!! Если больше, придется изменить метод read!!!
30
        self._byte_len = byte_len if byte_len else self._get_width()
31
        # проверка битового диапазона поля
32
        # str_err = f"Неверный параметр битового поля!"
33
        _k = 8 * self._byte_len
34
        for field in fields:
35
            check_value(field.position.start, range(_k),
36
                        get_error_str('field.position.start', field.position.start, range(_k)))
37
            check_value(field.position.stop - 1, range(_k),
38
                        get_error_str('field.position.stop', field.position.stop, range(_k)))
39
            check_value(field.position.step, range(1, 2),
40
                        get_error_str('field.position.step', field.position.step, range(1, 2)))  # шаг только единица!
41
        #
42
        self._value = 0  # значение, считанное из регистра
43

44
    def __len__(self) -> int:
45
        return len(self._fields)
46

47
    def __getitem__(self, key: str) -> int:
48
        """Возвращает значение битового поля в виде числа или bool по его имени в виде строки!"""
49
        lnk = self._fields
50
        lnk.field_name = key
51
        # установлю значение, иначе правильной работы не будет!!!
52
        lnk.source = self.value
53
        # возврат
54
        return lnk.get_field_value(validate=False)
55

56
    def __setitem__(self, key: str, value: int) -> int:
57
        """Устанавливает значение битового поля в виде числа или bool по его имени в виде строки!"""
58
        lnk = self._fields
59
        lnk.field_name = key
60
        # установлю значение, иначе правильной работы не будет!!!
61
        lnk.source = self.value
62
        # установка
63
        _tmp = lnk.set_field_value(value=value)
64
        self._value = _tmp
65
        return _tmp
66

67
    @property
68
    def value(self) -> int:
69
        """Возвращает значение, считанное из регистра. Из этого значения будут извлекаться значения битовых полей."""
70
        return self._value
71

72
    @property
73
    def byte_len(self) -> int:
74
        """Возвращает разрядность регистра в байтах"""
75
        return self._byte_len
76

77

78
class RegistryRO(BaseRegistry):
79
    """Представление аппаратного регистра. Только для чтения"""
80

81
    def read(self) -> [int, None]:
82
        """Чтение значения из регистра устройства и запись его в поле класса"""
83
        if not self._device:
84
            return
85
        bl = self._byte_len
86
        by = self._device.read_reg(self._address, bl)
87
        fmt = "B" if 1 == bl else "H"
88
        self._value = self._device.unpack(fmt, by)[0]
89
        # print(f"DBG:read: 0x{self._value:x}; byte len: {bl}; address: {self._address}")
90
        return self._value
91

92

93
class RegistryRW(RegistryRO):
94
    """Представление аппаратного регистра. Чтение и запись."""
95

96
    def write(self, value: [int, None] = None):
97
        """Запись значения в регистр устройства"""
98
        if self._device:
99
            val = value if value else self.value
100
            self._device.write_reg(self._address, val, self._byte_len)
101
            # print(f"DBG:RegistryRW.write: 0x{val:x}")
102

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.