rsiot/components_config/i2c_master/fieldbus_request.rs
1use std::time::{Duration, Instant};
2
3use crate::components_config::master_device::RequestResponseBound;
4
5/// Структура отдельного запроса на коммуникацию по шине SPI
6#[derive(Clone, Debug)]
7pub struct FieldbusRequest {
8 /// Время создания запроса.
9 ///
10 /// Можно контролировать время выполнения запросов
11 pub request_creation_time: Instant,
12
13 /// Адрес устройства
14 pub address: u8,
15
16 /// Вид запроса.
17 ///
18 /// Необходим для правильной расшифровки ответа
19 pub request_kind: u8,
20
21 /// Массив операций
22 pub operations: Vec<Operation>,
23}
24
25impl FieldbusRequest {
26 /// Создание запроса. Адрес задается позже
27 pub fn new(address: u8, request_kind: impl Into<u8>, operations: Vec<Operation>) -> Self {
28 Self {
29 request_creation_time: Instant::now(),
30 address,
31 request_kind: request_kind.into(),
32 operations,
33 }
34 }
35}
36
37/// Виды операций
38#[derive(Clone, Debug)]
39pub enum Operation {
40 /// Задержка между операциями
41 Delay {
42 /// Значение задержки
43 delay: Duration,
44 },
45
46 /// Запрос записи и чтения. Вложенные данные - количество байт для чтения
47 WriteRead {
48 /// Данные для записи
49 write_data: Vec<u8>,
50 /// Количество байт для чтения
51 read_size: u8,
52 },
53
54 /// Запрос записи
55 Write {
56 /// Данные для записи
57 write_data: Vec<u8>,
58 },
59
60 /// Запрос чтения
61 Read {
62 /// Количество байт для чтения
63 read_size: u8,
64 },
65}
66
67impl RequestResponseBound for FieldbusRequest {}