use serde::{Deserialize, Serialize};
use crate::plc::function_block_base::{FunctionBlockBase, IFunctionBlock};
#[derive(Clone, Default, Deserialize, Serialize)]
pub struct VarInput {
pub i: bool,
}
#[derive(Clone, Default, Deserialize, Serialize)]
pub struct VarOutput {
pub q: bool,
}
#[derive(Clone, Default, Deserialize, Serialize)]
pub struct VarStatic {
prev_i: bool,
}
impl IFunctionBlock<VarInput, VarOutput, VarStatic>
for FunctionBlockBase<VarInput, VarOutput, VarStatic>
{
fn logic(&mut self) -> VarOutput {
let rising_edge = self.input.i && !self.stat.prev_i;
self.stat.prev_i = self.input.i;
VarOutput { q: rising_edge }
}
}
pub type FunctionBlock = FunctionBlockBase<VarInput, VarOutput, VarStatic>;