rsiot/components/cmp_esp_nvs/config.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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
//! Тестирование документации:
//!
//! Нет тестируется - Exec format error (os error 8)
//!
//! ```bash
//! cargo test components::cmp_storage_esp --features="cmp_storage_esp, single-thread" --target="riscv32imc-esp-espidf";
//! ```
use serde::{de::DeserializeOwned, Serialize};
use crate::message::{Message, MsgDataBound};
/// Конфигурация cmp_storage_esp
#[derive(Debug)]
pub struct Config<TMsg, TStorageData>
where
TMsg: MsgDataBound,
TStorageData: std::fmt::Debug + Default + DeserializeOwned + PartialEq + Serialize,
{
/// Функция для сохранения информации из входных сообщений в памяти ESP.
///
/// # Примеры
///
/// ```rust
/// use rsiot::message::{example_message::*, *};
/// use serde::Deserialize;
///
/// #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
/// struct StorageData {
/// pub test_f64: f64,
/// pub test_i32: i32,
/// }
///
/// let _ = Config {
/// fn_input: |data: &StorageData, msg: &Message<Custom>| match msg.data {
/// MsgData::Custom(Custom::ValueInstantF64(value)) => Some(StorageData {
/// test_f64: value,
/// ..*data
/// }),
/// _ => None,
/// },
/// fn_output: |_| vec![],
/// };
///
/// ```
pub fn_input: fn(&TStorageData, &Message<TMsg>) -> Option<TStorageData>,
/// Функция для выдачи сообщений из сохраненных данных.
///
/// Вызывается один раз, при запуске ESP.
///
/// # Примеры
///
/// ```rust
/// use rsiot::message::{example_message::*, *};
/// use serde::{Deserialize, Serialize};
///
/// #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
/// struct StorageData {
/// pub test_f64: f64,
/// pub test_i32: i32,
/// }
///
/// let _ = Config {
/// fn_input: |_, _| None,
/// fn_output: |data: &StorageData| {
/// vec![Message::new(MsgData::Custom(Custom::ValueInstantF64(
/// data.test_f64,
/// )))]
/// },
/// };
/// ```
pub fn_output: fn(&TStorageData) -> Vec<Message<TMsg>>,
}
#[cfg(test)]
mod tests {
use super::Config;
#[test]
fn fn_input() {
use crate::message::{example_message::*, *};
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
struct StorageData {
pub test_f64: f64,
pub test_i32: i32,
}
let _ = Config {
fn_input: |data: &StorageData, msg: &Message<Custom>| match msg.data {
MsgData::Custom(Custom::ValueInstantF64(value)) => Some(StorageData {
test_f64: value,
..*data
}),
_ => None,
},
fn_output: |_| vec![],
};
}
#[test]
fn fn_output() {
use crate::message::{example_message::*, *};
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
struct StorageData {
pub test_f64: f64,
pub test_i32: i32,
}
let _ = Config {
fn_input: |_, _| None,
fn_output: |data: &StorageData| {
vec![Message::new(MsgData::Custom(Custom::ValueInstantF64(
data.test_f64,
)))]
},
};
}
}