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}