use core::pin::pin;
use odem_rs::{
prelude::*,
sync::control::ControlExpr,
tracing::{Level, debug},
};
async fn releaser(sim: &Sim, sig: &Control<bool>, delay: f64) {
sim.advance(delay).await;
debug!("A signal has been sent.");
sig.set(true);
}
async fn gates(sim: &Sim) {
debug!("Gate is closed. Waiting for signals.");
let signal_a = Control::new(false);
let signal_b = Control::new(false);
let r1 = pin!(Job::new(releaser(sim, &signal_a, 5.0)));
let r2 = pin!(Job::new(releaser(sim, &signal_b, 10.0)));
sim.activate(r1);
sim.activate(r2);
ControlExpr::new((&signal_a, &signal_b), |(a, b)| a.get() && b.get()).await;
until!(signal_a && signal_b).await;
debug!("Both signals received. Gate is open!");
}
fn main() {
tracing_subscriber::fmt()
.with_max_level(Level::DEBUG)
.with_target(false)
.with_timer(model_time!("[{time:2}]"))
.init();
simulation(gates).expect("deadlock unexpected");
}