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