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 {}