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