1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
use tokio::select; use apigpio::Connection; use picollar::local::*; use picollar::ksmode::keyswitch_tracker; use picollar::tasktrack; use picollar::config; use picollar::RecvError; type E = anyhow::Error; #[path="application/webtalk.rs"] mod webtalk; async fn real_main() -> Result<(),E> { let pi = Connection::new().await?; let mut tt = tasktrack::Tracker::new(); let (dsender, mut hreceiver) = generate_demands(&pi, &mut tt).await?; let cfg = config::read()?; let key = cfg.collar_key()?; prepare_xmit(&pi).await?; let channel = 0; { let hreceiver = hreceiver.clone(); tt.spawn("implementor", implementor(pi.clone(), key, channel, hreceiver) ); } let keyswitch = keyswitch_tracker(pi.clone(), &mut tt, None).await?; tt.spawn("webserver runner", webtalk::mainloop(pi.clone(), cfg.clone(), keyswitch, dsender) ); select!{ r = async { loop { let got = hreceiver.recv().await.ok_or(RecvError{})?; println!("application: demand {:?}", got); } #[allow(unreachable_code)] <Result<(),E>>::Ok(()) } => r?, r = tt.failfast() => r?, }; Ok(()) } picollar::wrap_main!("application");