use std::time::Duration;
use hiroz::{
Builder, Result,
context::ZContextBuilder,
lifecycle::{CallbackReturn, ZLifecycleClient},
};
fn main() -> Result<()> {
let ctx = ZContextBuilder::default().build()?;
let mut node = ctx.create_lifecycle_node("camera_driver").build()?;
node.on_configure = Box::new(|_| {
println!("[camera_driver] on_configure: opening device");
CallbackReturn::Success
});
node.on_activate = Box::new(|_| {
println!("[camera_driver] on_activate: streaming");
CallbackReturn::Success
});
node.on_deactivate = Box::new(|_| {
println!("[camera_driver] on_deactivate: paused");
CallbackReturn::Success
});
node.on_shutdown = Box::new(|_| {
println!("[camera_driver] on_shutdown: releasing device");
CallbackReturn::Success
});
std::thread::sleep(Duration::from_millis(200));
let mgr = ctx.create_node("bringup_manager").build()?;
let client = ZLifecycleClient::new(&mgr, "camera_driver")?;
std::thread::sleep(Duration::from_millis(300));
let timeout = Duration::from_secs(5);
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
let state = client.get_state(timeout).await?;
println!("[bringup] camera_driver is {:?}", state);
println!("[bringup] configuring...");
assert!(client.configure(timeout).await?);
println!("[bringup] activating...");
assert!(client.activate(timeout).await?);
let state = client.get_state(timeout).await?;
println!("[bringup] camera_driver is now {:?}", state);
println!("[bringup] node is running... (would do work here)");
println!("[bringup] deactivating...");
assert!(client.deactivate(timeout).await?);
println!("[bringup] shutting down...");
assert!(client.shutdown(timeout).await?);
let state = client.get_state(timeout).await?;
println!("[bringup] camera_driver is now {:?}", state);
Ok(())
})
}