SCD4x

Форк
0
/
base_sensor.py 
91 строка · 3.5 Кб
1
# micropython
2
# MIT license
3
# Copyright (c) 2022 Roman Shevchik   goctaprog@gmail.com
4
import struct
5

6
import micropython
7
import ustruct
8
from sensor_pack import bus_service
9
from machine import SPI
10

11

12
@micropython.native
13
def check_value(value: int, valid_range, error_msg: str) -> int:
14
    if value not in valid_range:
15
        raise ValueError(error_msg)
16
    return value
17

18

19
class Device:
20
    """Base device class"""
21

22
    def __init__(self, adapter: bus_service.BusAdapter, address: [int, SPI], big_byte_order: bool):
23
        """Базовый класс Устройство.
24
        Если big_byte_order равен True -> порядок байтов в регистрах устройства «big»
25
        (Порядок от старшего к младшему), в противном случае порядок байтов в регистрах "little"
26
        (Порядок от младшего к старшему)
27
        address - адрес устройства на шине.
28

29
        Base device class. if big_byte_order is True -> register values byteorder is 'big'
30
        else register values byteorder is 'little'
31
        address - address of the device on the bus."""
32
        self.adapter = adapter
33
        self.address = address
34
        # for I2C. byte order in register of device
35
        self.big_byte_order = big_byte_order
36
        # for SPI ONLY. При передаче данных по SPI: SPI.firstbit can be SPI.MSB or SPI.LSB
37
        # передавать первым битом старший или младший
38
        # для каждого устройства!
39
        self.msb_first = True
40

41
    def _get_byteorder_as_str(self) -> tuple:
42
        """Return byteorder as string"""
43
        if self.is_big_byteorder():
44
            return 'big', '>'
45
        else:
46
            return 'little', '<'
47

48
    def unpack(self, fmt_char: str, source: bytes, redefine_byte_order: str = None) -> tuple:
49
        """распаковка массива, считанного из датчика.
50
        Если redefine_byte_order != None, то bo (смотри ниже) = redefine_byte_order
51
        fmt_char: c, b, B, h, H, i, I, l, L, q, Q. pls see: https://docs.python.org/3/library/struct.html"""
52
        if not fmt_char:
53
            raise ValueError(f"Invalid length fmt_char parameter: {len(fmt_char)}")
54
        bo = self._get_byteorder_as_str()[1]
55
        if redefine_byte_order is not None:
56
            bo = redefine_byte_order[0]
57
        return ustruct.unpack(bo + fmt_char, source)
58

59
    @micropython.native
60
    def is_big_byteorder(self) -> bool:
61
        return self.big_byte_order
62

63

64
class BaseSensor(Device):
65
    """Base sensor class"""
66
    def get_id(self):
67
        raise NotImplementedError
68

69
    def soft_reset(self):
70
        raise NotImplementedError
71

72

73
class Iterator:
74
    def __iter__(self):
75
        return self
76

77
    def __next__(self):
78
        raise NotImplementedError
79

80

81
class TemperatureSensor:
82
    """Вспомогательный или основной датчик температуры"""
83
    def enable_temp_meas(self, enable: bool = True):
84
        """Включает измерение температуры при enable в Истина
85
        Для переопределения программистом!!!"""
86
        raise NotImplementedError
87

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

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

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

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

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