AS5600

Форк
0
/
base_sensor.py 
155 строк · 6.7 Кб
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, 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 all_none(*args):
20
    """возвращает Истина, если все входные параметры в None.
21
    Добавил 25.01.2024"""
22
    for element in args:
23
        if element is not None:
24
            return False
25
    return True
26

27

28
class Device:
29
    """Класс - основа датчика"""
30

31
    def __init__(self, adapter: bus_service.BusAdapter, address: [int, Pin], big_byte_order: bool):
32
        """Базовый класс Устройство.
33
        Если big_byte_order равен True -> порядок байтов в регистрах устройства «big»
34
        (Порядок от старшего к младшему), в противном случае порядок байтов в регистрах "little"
35
        (Порядок от младшего к старшему)
36
        address - адрес устройства на шине.
37

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

50
    def _get_byteorder_as_str(self) -> tuple:
51
        """Return byteorder as string"""
52
        if self.is_big_byteorder():
53
            return 'big', '>'
54
        return 'little', '<'
55

56
    def pack(self, fmt_char: str, *values) -> bytes:
57
        if not fmt_char:
58
            raise ValueError("Invalid fmt_char parameter!")
59
        bo = self._get_byteorder_as_str()[1]
60
        return struct.pack(bo + fmt_char, values)
61

62
    def unpack(self, fmt_char: str, source: bytes, redefine_byte_order: str = None) -> tuple:
63
        """распаковка массива, считанного из датчика.
64
        Если redefine_byte_order != None, то bo (смотри ниже) = redefine_byte_order
65
        fmt_char: c, b, B, h, H, i, I, l, L, q, Q. pls see: https://docs.python.org/3/library/struct.html"""
66
        if not fmt_char:
67
            raise ValueError("Invalid fmt_char parameter!")
68
        bo = self._get_byteorder_as_str()[1]
69
        if redefine_byte_order is not None:
70
            bo = redefine_byte_order[0]
71
        return struct.unpack(bo + fmt_char, source)
72

73
    @micropython.native
74
    def is_big_byteorder(self) -> bool:
75
        return self.big_byte_order
76

77

78
class DeviceEx(Device):
79
    """Класс - основа датчика. Добавил общие методы доступа к шине. 30.01.2024"""
80
    def read_reg(self, reg_addr: int, bytes_count=2) -> bytes:
81
        """считывает из регистра датчика значение.
82
        bytes_count - размер значения в байтах.
83
        Должна быть реализована во всех классах - адаптерах шин, наследников BusAdapter.
84
        Добавил 25.01.2024"""
85
        return self.adapter.read_register(self.address, reg_addr, bytes_count)
86

87
    # BaseSensor
88
    def write_reg(self, reg_addr: int, value: [int, bytes, bytearray], bytes_count) -> int:
89
        """записывает данные value в датчик, по адресу reg_addr.
90
        bytes_count - кол-во записываемых данных.
91
        Добавил 25.01.2024"""
92
        byte_order = self._get_byteorder_as_str()[0]
93
        return self.adapter.write_register(self.address, reg_addr, value, bytes_count, byte_order)
94

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

99
    def read_to_buf(self, buf) -> bytes:
100
        """Чтение из устройства в буфер"""
101
        return self.adapter.read_to_buf(self.address, buf)
102

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

107
    def read_buf_from_mem(self, address: int, buf, address_size: int = 1):
108
        """Читает из устройства, начиная с адреса address в буфер.
109
        Кол-во читаемых байт равно "длине" буфера в байтах!
110
        address_size - определяет размер адреса в байтах."""
111
        return self.adapter.read_buf_from_memory(self.address, address, buf, address_size)
112

113
    def write_buf_to_mem(self, mem_addr, buf):
114
        """Записывает в устройство все байты из буфера buf.
115
        Запись начинается с адреса в устройстве: mem_addr."""
116
        return self.adapter.write_buf_to_memory(self.address, mem_addr, buf)
117

118

119
class BaseSensor(Device):
120
    """Класс - основа датчика с дополнительными методами"""
121
    def get_id(self):
122
        raise NotImplementedError
123

124
    def soft_reset(self):
125
        raise NotImplementedError
126

127

128
class BaseSensorEx(DeviceEx):
129
    """Класс - основа датчика"""
130
    def get_id(self):
131
        raise NotImplementedError
132

133
    def soft_reset(self):
134
        raise NotImplementedError
135

136

137
class Iterator:
138
    def __iter__(self):
139
        return self
140

141
    def __next__(self):
142
        raise NotImplementedError
143

144

145
class TemperatureSensor:
146
    """Вспомогательный или основной датчик температуры"""
147
    def enable_temp_meas(self, enable: bool = True):
148
        """Включает измерение температуры при enable в Истина
149
        Для переопределения программистом!!!"""
150
        raise NotImplementedError
151

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

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

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

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

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