SCD4x
91 строка · 3.5 Кб
1# micropython
2# MIT license
3# Copyright (c) 2022 Roman Shevchik goctaprog@gmail.com
4import struct
5
6import micropython
7import ustruct
8from sensor_pack import bus_service
9from machine import SPI
10
11
12@micropython.native
13def check_value(value: int, valid_range, error_msg: str) -> int:
14if value not in valid_range:
15raise ValueError(error_msg)
16return value
17
18
19class Device:
20"""Base device class"""
21
22def __init__(self, adapter: bus_service.BusAdapter, address: [int, SPI], big_byte_order: bool):
23"""Базовый класс Устройство.
24Если big_byte_order равен True -> порядок байтов в регистрах устройства «big»
25(Порядок от старшего к младшему), в противном случае порядок байтов в регистрах "little"
26(Порядок от младшего к старшему)
27address - адрес устройства на шине.
28
29Base device class. if big_byte_order is True -> register values byteorder is 'big'
30else register values byteorder is 'little'
31address - address of the device on the bus."""
32self.adapter = adapter
33self.address = address
34# for I2C. byte order in register of device
35self.big_byte_order = big_byte_order
36# for SPI ONLY. При передаче данных по SPI: SPI.firstbit can be SPI.MSB or SPI.LSB
37# передавать первым битом старший или младший
38# для каждого устройства!
39self.msb_first = True
40
41def _get_byteorder_as_str(self) -> tuple:
42"""Return byteorder as string"""
43if self.is_big_byteorder():
44return 'big', '>'
45else:
46return 'little', '<'
47
48def unpack(self, fmt_char: str, source: bytes, redefine_byte_order: str = None) -> tuple:
49"""распаковка массива, считанного из датчика.
50Если redefine_byte_order != None, то bo (смотри ниже) = redefine_byte_order
51fmt_char: c, b, B, h, H, i, I, l, L, q, Q. pls see: https://docs.python.org/3/library/struct.html"""
52if not fmt_char:
53raise ValueError(f"Invalid length fmt_char parameter: {len(fmt_char)}")
54bo = self._get_byteorder_as_str()[1]
55if redefine_byte_order is not None:
56bo = redefine_byte_order[0]
57return ustruct.unpack(bo + fmt_char, source)
58
59@micropython.native
60def is_big_byteorder(self) -> bool:
61return self.big_byte_order
62
63
64class BaseSensor(Device):
65"""Base sensor class"""
66def get_id(self):
67raise NotImplementedError
68
69def soft_reset(self):
70raise NotImplementedError
71
72
73class Iterator:
74def __iter__(self):
75return self
76
77def __next__(self):
78raise NotImplementedError
79
80
81class TemperatureSensor:
82"""Вспомогательный или основной датчик температуры"""
83def enable_temp_meas(self, enable: bool = True):
84"""Включает измерение температуры при enable в Истина
85Для переопределения программистом!!!"""
86raise NotImplementedError
87
88def get_temperature(self) -> [int, float]:
89"""Возвращает температуру корпуса датчика в градусах Цельсия!
90Для переопределения программистом!!!"""
91raise NotImplementedError
92