Skip to main content

rsiot/components/cmp_linux_can/
config.rs

1use std::time::Duration;
2
3use crate::{
4    components_config::can_general::{BufferBound, CanFilter, CanFrame, CanSettings},
5    message::MsgDataBound,
6};
7
8// ANCHOR: Config
9/// Конфигурация компонента cmp_linux_can
10#[derive(Clone)]
11pub struct Config<TMsg, TBuffer>
12where
13    TMsg: MsgDataBound,
14    TBuffer: BufferBound,
15{
16    /// Интерфейс CAN, например "vcan0"
17    pub ifname: String,
18
19    /// Задание режимов CAN-протокола
20    pub can_settings: CanSettings,
21
22    /// Значение в буфере по умолчанию.
23    ///
24    /// Буфер используется для отправки периодических сообщений.
25    ///
26    /// Если буфер не используется, можно задать значение `()`.
27    pub buffer_default: TBuffer,
28
29    /// Преобразование входящих сообщений в CAN-сообщения
30    ///
31    /// # Примеры
32    ///
33    /// ## Задать f32
34    ///
35    /// ```rs
36    /// let mut data = [0u8; 8];
37    /// data[4..8].copy_from_slice(&f.to_be_bytes());
38    /// ```
39    ///
40    /// ## Задать u16
41    ///
42    /// ```rs
43    /// let mut data = [0u8; 8];
44    /// let bits = data.view_bits_mut::<Msb0>();
45    /// bits[32..48].store_be(*v);
46    /// ```
47    pub fn_input: fn(&TMsg, &mut TBuffer) -> anyhow::Result<Option<Vec<CanFrame>>>,
48
49    /// Функция периодического создания кадров
50    pub fn_periodic: fn(&TBuffer) -> anyhow::Result<Option<Vec<CanFrame>>>,
51
52    /// Период создания кадров
53    pub period: Duration,
54
55    /// Настройка фильтрации получаемых CAN-сообщений
56    ///
57    /// Пустой вектор означает приём всех сообщений
58    ///
59    /// Приём от источника с адресом 1:
60    /// - id: 0x00_01_00_00
61    /// - mask: 0x00_FF_00_00
62    ///
63    /// Приём для адресата с адресом 1:
64    /// - id: 0x00_00_01_00
65    /// - mask: 0x00_00_FF_00
66    pub filters: Vec<CanFilter>,
67
68    /// Преобразование полученного CAN-сообщения в исходящие сообщения
69    ///
70    /// # Примеры
71    ///
72    /// ## Загрузить u8
73    /// ```rs
74    /// let bits = data.view_bits::<Lsb0>();
75    /// let value = bits[0..8].load_be::<u8>();
76    /// let msg = Msg::CanDataFromBus(value);
77    /// ```
78    pub fn_output: fn(CanFrame) -> Option<Vec<TMsg>>,
79
80    /// true - асинхронная версия
81    ///
82    /// Синхронная версия запускается в отдельных потоках, производительность в ~5 раз выше
83    pub async_version: bool,
84}
85// ANCHOR: Config