#![no_std]
use core::cell::Cell;
use standard_plugin::daemon::{Context, DaemonPlugin};
use standard_plugin::prelude::{Event, Target};
#[standard_plugin::daemon]
struct Heartbeat {
beats: Cell<u64>,
}
impl DaemonPlugin for Heartbeat {
fn activate(_cx: &Context) -> Self {
Self {
beats: Cell::new(0),
}
}
async fn run(&self, cx: Context) {
let _ = cx.events().on("heartbeat.ping");
let events = cx.clone();
cx.spawn(async move {
loop {
if let Event::Plugin { name, .. } = events.next_event().await
&& name == "heartbeat.ping"
{
let _ = events.events().emit("heartbeat.pong", &(), Target::All);
}
}
});
loop {
self.beats.set(self.beats.get() + 1);
let _ = cx.live().publish("heartbeat.beat", &self.beats.get());
cx.sleep(30_000).await;
}
}
}