INA_TI

Форк
0
/
base_sensor.py 
225 строк · 10.8 Кб
1
# micropython
2
# MIT license
3
# Copyright (c) 2022 Roman Shevchik   goctaprog@gmail.com
4
import struct
5
import micropython
6
from sensor_pack_2 import bus_service
7
from machine import Pin
8

9

10
@micropython.native
11
def check_value(value: [int, None], valid_range: [range, tuple], error_msg: str) -> [int, None]:
12
    if value is None:
13
        return value
14
    if value not in valid_range:
15
        raise ValueError(error_msg)
16
    return value
17

18

19
def get_error_str(val_name: str, val: int, rng: [range, tuple]) -> str:
20
    """Возвращает подробное сообщение об ошибке.
21
    val_name - имя переменной в коде;
22
    val - значение переменной val_name;
23
    rng - допустимый диапазон переменной"""
24
    if isinstance(rng, range):
25
        return f"Значение {val} параметра {val_name} вне диапазона [{rng.start}..{rng.stop - 1}]!"
26
    # tuple
27
    return f"Значение {val} параметра {val_name} вне диапазона: {rng}!"
28

29

30
def all_none(*args):
31
    """возвращает Истина, если все входные параметры в None.
32
    Добавил 25.01.2024"""
33
    for element in args:
34
        if element is not None:
35
            return False
36
    return True
37

38

39
class Device:
40
    """Класс - основа датчика"""
41

42
    def __init__(self, adapter: bus_service.BusAdapter, address: [int, Pin], big_byte_order: bool):
43
        """Базовый класс Устройство.
44
        Если big_byte_order равен True -> порядок байтов в регистрах устройства «big»
45
        (Порядок от старшего к младшему), в противном случае порядок байтов в регистрах "little"
46
        (Порядок от младшего к старшему)
47
        address - адрес устройства на шине.
48

49
        Base device class. if big_byte_order is True -> register values byteorder is 'big'
50
        else register values byteorder is 'little'
51
        address - address of the device on the bus."""
52
        self.adapter = adapter
53
        self.address = address
54
        # for I2C. byte order in register of device
55
        self.big_byte_order = big_byte_order
56
        # for SPI ONLY. При передаче данных по SPI: SPI.firstbit can be SPI.MSB or SPI.LSB
57
        # передавать первым битом старший или младший
58
        # для каждого устройства!
59
        self.msb_first = True
60

61
    def _get_byteorder_as_str(self) -> tuple:
62
        """Return byteorder as string"""
63
        if self.is_big_byteorder():
64
            return 'big', '>'
65
        return 'little', '<'
66

67
    def pack(self, fmt_char: str, *values) -> bytes:
68
        if not fmt_char:
69
            raise ValueError("Invalid fmt_char parameter!")
70
        bo = self._get_byteorder_as_str()[1]
71
        return struct.pack(bo + fmt_char, values)
72

73
    def unpack(self, fmt_char: str, source: bytes, redefine_byte_order: str = None) -> tuple:
74
        """распаковка массива, считанного из датчика.
75
        Если redefine_byte_order != None, то bo (смотри ниже) = redefine_byte_order
76
        fmt_char: c, b, B, h, H, i, I, l, L, q, Q. pls see: https://docs.python.org/3/library/struct.html"""
77
        if not fmt_char:
78
            raise ValueError("Invalid fmt_char parameter!")
79
        bo = self._get_byteorder_as_str()[1]
80
        if redefine_byte_order is not None:
81
            bo = redefine_byte_order[0]
82
        return struct.unpack(bo + fmt_char, source)
83

84
    @micropython.native
85
    def is_big_byteorder(self) -> bool:
86
        return self.big_byte_order
87

88

89
class DeviceEx(Device):
90
    """Класс - основа датчика. Добавил общие методы доступа к шине. 30.01.2024"""
91

92
    def read_reg(self, reg_addr: int, bytes_count=2) -> bytes:
93
        """считывает из регистра датчика значение.
94
        bytes_count - размер значения в байтах.
95
        Должна быть реализована во всех классах - адаптерах шин, наследников BusAdapter.
96
        Добавил 25.01.2024"""
97
        return self.adapter.read_register(self.address, reg_addr, bytes_count)
98

99
    # BaseSensor
100
    def write_reg(self, reg_addr: int, value: [int, bytes, bytearray], bytes_count) -> int:
101
        """записывает данные value в датчик, по адресу reg_addr.
102
        bytes_count - кол-во записываемых данных.
103
        Добавил 25.01.2024"""
104
        byte_order = self._get_byteorder_as_str()[0]
105
        return self.adapter.write_register(self.address, reg_addr, value, bytes_count, byte_order)
106

107
    def read(self, n_bytes: int) -> bytes:
108
        """Читает из устройства n_bytes байт. Добавил 25.01.2024"""
109
        return self.adapter.read(self.address, n_bytes)
110

111
    def read_to_buf(self, buf) -> bytes:
112
        """Чтение из устройства в буфер"""
113
        return self.adapter.read_to_buf(self.address, buf)
114

115
    def write(self, buf: bytes):
116
        """Записывает в устройство информацию из buf. Добавил 25.01.2024"""
117
        return self.adapter.write(self.address, buf)
118

119
    def read_buf_from_mem(self, address: int, buf, address_size: int = 1):
120
        """Читает из устройства, начиная с адреса address в буфер.
121
        Кол-во читаемых байт равно "длине" буфера в байтах!
122
        address_size - определяет размер адреса в байтах."""
123
        return self.adapter.read_buf_from_memory(self.address, address, buf, address_size)
124

125
    def write_buf_to_mem(self, mem_addr, buf):
126
        """Записывает в устройство все байты из буфера buf.
127
        Запись начинается с адреса в устройстве: mem_addr."""
128
        return self.adapter.write_buf_to_memory(self.address, mem_addr, buf)
129

130

131
class BaseSensor(Device):
132
    """Класс - основа датчика с дополнительными методами"""
133

134
    def get_id(self):
135
        raise NotImplementedError
136

137
    def soft_reset(self):
138
        raise NotImplementedError
139

140

141
class BaseSensorEx(DeviceEx):
142
    """Класс - основа датчика"""
143

144
    def get_id(self):
145
        raise NotImplementedError
146

147
    def soft_reset(self):
148
        raise NotImplementedError
149

150

151
class Iterator:
152
    def __iter__(self):
153
        return self
154

155
    def __next__(self):
156
        raise NotImplementedError
157

158

159
class ITemperatureSensor:
160
    """Вспомогательный или основной датчик температуры"""
161

162
    def enable_temp_meas(self, enable: bool = True):
163
        """Включает измерение температуры при enable в Истина
164
        Для переопределения программистом!!!"""
165
        raise NotImplementedError
166

167
    def get_temperature(self) -> [int, float]:
168
        """Возвращает температуру корпуса датчика в градусах Цельсия!
169
        Для переопределения программистом!!!"""
170
        raise NotImplementedError
171

172

173
# 0 - устройство выполняет все свои функции (максимальное энергопотребление)
174
# maximum (на ваш выбор) - устройство выполняет минимум своих функций (минимальное энергопотребление)
175
#
176
class IPower:
177
    """интерфейс управления мощностью потребления устройства"""
178

179
    def set_power_level(self, level: [int, None] = 0) -> int:
180
        """level >=0 or None
181
        Устанавливает режим мощности.
182
        level равен 0 - устройство выполняет все свои функции (максимальное энергопотребление)
183
        level равен maximum (на ваш выбор) - устройство выполняет минимум своих функций (минимальное энергопотребление)
184
        Возвращает текущий уровень потребления устройства.
185
        Если level в None, то метод должен возвратить текущий уровень потребления устройства!
186
        Если значение из регистра устройства не совпадет со шкалой 0-все включено...максимум-все выключено, то
187
        преобразуйте его!
188
        """
189
        raise NotImplemented
190

191
#    def power_on(self, on: bool = True) -> int:
192
#        """Полностью включает (on в Истина), либо полностью ВЫключает (on в Ложь)
193
#        Возвращает текущий режим потребления устройства."""
194
#        raise NotImplemented
195

196

197
class IBaseSensorEx:
198
    """интерфейсы, обязательные для большинства датчиков"""
199

200
    def get_conversion_cycle_time(self) -> int:
201
        """Возвращает время в мс или мкс преобразования сигнала в цифровой код и готовности его для чтения по шине!
202
        Для текущих настроек датчика. При изменении настроек следует заново вызвать этот метод!"""
203
        raise NotImplemented
204

205
    def start_measurement(self):
206
        """Настраивает параметры датчика и запускает процесс измерения"""
207
        raise NotImplemented
208

209
    def get_measurement_value(self):
210
        """Возвращает измеренное датчиком значение(значения)"""
211
        raise NotImplemented
212

213
#    def is_data_ready(self) -> bool:
214
#        """Возвращает Истина, если данные доступны для считывания"""
215
#        raise NotImplemented
216

217
    def is_single_shot_mode(self) -> bool:
218
        """Возвращает Истина, когда датчик находится в режиме однократных измерений,
219
        каждое из которых запускается методом start_measurement"""
220
        raise NotImplemented
221

222
    def is_continuously_mode(self) -> bool:
223
        """Возвращает Истина, когда датчик находится в режиме многократных измерений,
224
        производимых автоматически. Процесс запускается методом start_measurement"""
225
        raise NotImplemented
226

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

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

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

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