use serde::Serialize;
use crate::plc::function_block_base::{FunctionBlockBase, IFunctionBlock};
use crate::plc::{library::edge_detect::rising_edge, types};
#[derive(Clone, Default, Serialize)]
pub struct I {
pub input: bool,
pub preset_time: types::TimeDuration,
}
#[derive(Clone, Default, Serialize)]
pub struct Q {
pub output: bool,
pub elapsed_time: types::TimeDuration,
}
#[derive(Clone, Default, Serialize)]
pub struct S {
input_rising_edge: rising_edge::FunctionBlock,
delay: types::TimeInstant,
}
impl IFunctionBlock<I, Q, S> for FunctionBlockBase<I, Q, S> {
fn logic(&mut self) -> Q {
if self
.stat
.input_rising_edge
.call(rising_edge::VarInput {
i: self.input.input,
})
.q
{
self.stat.delay = types::TimeInstant::now();
}
Q {
output: self.stat.delay.elapsed() >= self.input.preset_time,
elapsed_time: self.stat.delay.elapsed(),
}
}
}
pub type FB = FunctionBlockBase<I, Q, S>;