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