ltr390uv
163 строки · 7.1 Кб
1# micropython
2# MIT license
3# Copyright (c) 2022 Roman Shevchik goctaprog@gmail.com
4import struct5import micropython6from sensor_pack_2 import bus_service7from machine import Pin8
9
10@micropython.native11def check_value(value: [int, None], valid_range, error_msg: str) -> [int, None]:12if value is None:13return value14if value not in valid_range:15raise ValueError(error_msg)16return value17
18
19def get_error_str(val_name: str, val: int, rng: range) -> str:20"""Возвращает подробное сообщение об ошибке.21val_name - имя переменной в коде;
22val - значение переменной val_name;
23rng - допустимый диапазон переменной"""
24return f"Значение {val} параметра {val_name} вне диапазона [{rng.start}..{rng.stop - 1}]!"25
26
27def all_none(*args):28"""возвращает Истина, если все входные параметры в None.29Добавил 25.01.2024"""
30for element in args:31if element is not None:32return False33return True34
35
36class Device:37"""Класс - основа датчика"""38
39def __init__(self, adapter: bus_service.BusAdapter, address: [int, Pin], big_byte_order: bool):40"""Базовый класс Устройство.41Если big_byte_order равен True -> порядок байтов в регистрах устройства «big»
42(Порядок от старшего к младшему), в противном случае порядок байтов в регистрах "little"
43(Порядок от младшего к старшему)
44address - адрес устройства на шине.
45
46Base device class. if big_byte_order is True -> register values byteorder is 'big'
47else register values byteorder is 'little'
48address - address of the device on the bus."""
49self.adapter = adapter50self.address = address51# for I2C. byte order in register of device52self.big_byte_order = big_byte_order53# for SPI ONLY. При передаче данных по SPI: SPI.firstbit can be SPI.MSB or SPI.LSB54# передавать первым битом старший или младший55# для каждого устройства!56self.msb_first = True57
58def _get_byteorder_as_str(self) -> tuple:59"""Return byteorder as string"""60if self.is_big_byteorder():61return 'big', '>'62return 'little', '<'63
64def pack(self, fmt_char: str, *values) -> bytes:65if not fmt_char:66raise ValueError("Invalid fmt_char parameter!")67bo = self._get_byteorder_as_str()[1]68return struct.pack(bo + fmt_char, values)69
70def unpack(self, fmt_char: str, source: bytes, redefine_byte_order: str = None) -> tuple:71"""распаковка массива, считанного из датчика.72Если redefine_byte_order != None, то bo (смотри ниже) = redefine_byte_order
73fmt_char: c, b, B, h, H, i, I, l, L, q, Q. pls see: https://docs.python.org/3/library/struct.html"""
74if not fmt_char:75raise ValueError("Invalid fmt_char parameter!")76bo = self._get_byteorder_as_str()[1]77if redefine_byte_order is not None:78bo = redefine_byte_order[0]79return struct.unpack(bo + fmt_char, source)80
81@micropython.native82def is_big_byteorder(self) -> bool:83return self.big_byte_order84
85
86class DeviceEx(Device):87"""Класс - основа датчика. Добавил общие методы доступа к шине. 30.01.2024"""88def read_reg(self, reg_addr: int, bytes_count=2) -> bytes:89"""считывает из регистра датчика значение.90bytes_count - размер значения в байтах.
91Должна быть реализована во всех классах - адаптерах шин, наследников BusAdapter.
92Добавил 25.01.2024"""
93return self.adapter.read_register(self.address, reg_addr, bytes_count)94
95# BaseSensor96def write_reg(self, reg_addr: int, value: [int, bytes, bytearray], bytes_count) -> int:97"""записывает данные value в датчик, по адресу reg_addr.98bytes_count - кол-во записываемых данных.
99Добавил 25.01.2024"""
100byte_order = self._get_byteorder_as_str()[0]101return self.adapter.write_register(self.address, reg_addr, value, bytes_count, byte_order)102
103def read(self, n_bytes: int) -> bytes:104"""Читает из устройства n_bytes байт. Добавил 25.01.2024"""105return self.adapter.read(self.address, n_bytes)106
107def read_to_buf(self, buf) -> bytes:108"""Чтение из устройства в буфер"""109return self.adapter.read_to_buf(self.address, buf)110
111def write(self, buf: bytes):112"""Записывает в устройство информацию из buf. Добавил 25.01.2024"""113return self.adapter.write(self.address, buf)114
115def read_buf_from_mem(self, address: int, buf, address_size: int = 1):116"""Читает из устройства, начиная с адреса address в буфер.117Кол-во читаемых байт равно "длине" буфера в байтах!
118address_size - определяет размер адреса в байтах."""
119return self.adapter.read_buf_from_memory(self.address, address, buf, address_size)120
121def write_buf_to_mem(self, mem_addr, buf):122"""Записывает в устройство все байты из буфера buf.123Запись начинается с адреса в устройстве: mem_addr."""
124return self.adapter.write_buf_to_memory(self.address, mem_addr, buf)125
126
127class BaseSensor(Device):128"""Класс - основа датчика с дополнительными методами"""129def get_id(self):130raise NotImplementedError131
132def soft_reset(self):133raise NotImplementedError134
135
136class BaseSensorEx(DeviceEx):137"""Класс - основа датчика"""138def get_id(self):139raise NotImplementedError140
141def soft_reset(self):142raise NotImplementedError143
144
145class Iterator:146def __iter__(self):147return self148
149def __next__(self):150raise NotImplementedError151
152
153class TemperatureSensor:154"""Вспомогательный или основной датчик температуры"""155def enable_temp_meas(self, enable: bool = True):156"""Включает измерение температуры при enable в Истина157Для переопределения программистом!!!"""
158raise NotImplementedError159
160def get_temperature(self) -> [int, float]:161"""Возвращает температуру корпуса датчика в градусах Цельсия!162Для переопределения программистом!!!"""
163raise NotImplementedError164