rsiot/components/cmp_plc/
config.rs1use std::time::Duration;
2
3use serde::Serialize;
4
5use crate::message::{Message, MsgDataBound};
6
7use super::plc::{FunctionBlockBase, IFunctionBlock};
8
9type TFnExport<TMsg, I, Q, S> = fn(&I, &Q, &S) -> Option<Vec<Message<TMsg>>>;
10
11#[derive(Clone)]
15pub struct Config<TMsg, I, Q, S>
16where
17 TMsg: MsgDataBound,
18 I: Clone + Default + Serialize,
19 Q: Clone + Default + Serialize,
20 S: Clone + Default + Serialize,
21 FunctionBlockBase<I, Q, S>: IFunctionBlock<I, Q, S>,
22{
23 pub fn_cycle_init: fn(&mut I) -> (),
31
32 pub fn_input: fn(&mut I, &TMsg) -> (),
34
35 pub fn_output: fn(&Q) -> Vec<TMsg>,
43
44 pub fb_main: FunctionBlockBase<I, Q, S>,
52
53 pub period: Duration,
61
62 pub retention: Option<ConfigRetention<TMsg, I, Q, S>>,
64}
65impl<TMsg, I, Q, S> Default for Config<TMsg, I, Q, S>
68where
69 TMsg: MsgDataBound,
70 I: Clone + Default + Serialize,
71 Q: Clone + Default + Serialize,
72 S: Clone + Default + Serialize,
73 FunctionBlockBase<I, Q, S>: IFunctionBlock<I, Q, S>,
74{
75 fn default() -> Self {
76 Self {
77 fn_cycle_init: |_| (),
78 fn_input: |_, _| (),
79 fn_output: |_| vec![],
80 fb_main: FunctionBlockBase::new(),
81 period: Duration::default(),
82 retention: None,
83 }
84 }
85}
86
87#[derive(Clone)]
90pub struct ConfigRetention<TMsg, I, Q, S>
91where
92 TMsg: MsgDataBound,
93 I: Clone + Default + Serialize,
94 Q: Clone + Default + Serialize,
95 S: Clone + Default + Serialize,
96{
97 pub save_period: Duration,
99
100 pub fn_export: TFnExport<TMsg, I, Q, S>,
103
104 pub fn_import_static: fn(&Message<TMsg>) -> anyhow::Result<Option<S>>,
106
107 pub restore_timeout: Duration,
112}
113pub enum ConfigRetentionRestoreResult<S>
116where
117 S: Clone + Default + Serialize,
118{
119 NoRestoreData,
120 RestoreDeserializationError,
121 RestoreData(S),
122}