Skip to main content

rsiot/components/cmp_esp_can/
config.rs

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