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");