chalkydri/cameras/
publisher.rs

1use std::collections::HashMap;
2
3use minint::{NtSubscription, NtTopic};
4
5use crate::{config, Nt};
6
7struct Cam<'p> {
8    source: NtTopic<'p, String>,
9    streams: NtTopic<'p, Vec<String>>,
10    description: NtTopic<'p, String>,
11    connected: NtTopic<'p, bool>,
12    mode: NtSubscription<'p>,
13    modes: NtTopic<'p, Vec<String>>,
14}
15
16pub struct CamPublisher<'p> {
17    cams: HashMap<String, Cam<'p>>,
18}
19impl CamPublisher<'_> {
20    pub fn new() -> Self {
21        Self {
22            cams: HashMap::new(),
23        }
24    }
25
26    pub async fn publish(&mut self, cam_config: config::Camera) {
27        let cam = if let Some(cam) = self.cams.get_mut(&cam_config.name) {
28            cam
29        } else {
30            let source = Nt
31                .publish::<String>(&format!("/CameraPublisher/{}/source", cam_config.id))
32                .await
33                .unwrap();
34            let streams = Nt
35                .publish::<Vec<String>>(&format!("/CameraPublisher/{}/streams", cam_config.id))
36                .await
37                .unwrap();
38            let description = Nt
39                .publish::<String>(&format!("/CameraPublisher/{}/description", cam_config.id))
40                .await
41                .unwrap();
42            let connected = Nt
43                .publish::<bool>(&format!("/CameraPublisher/{}/connected", cam_config.id))
44                .await
45                .unwrap();
46            let mode = Nt
47                .subscribe(&format!("/CameraPublisher/{}/mode", cam_config.id))
48                .await
49                .unwrap();
50            let modes = Nt
51                .publish::<Vec<String>>(&format!("/CameraPublisher/{}/modes", cam_config.id))
52                .await
53                .unwrap();
54
55            let cam = Cam {
56                source,
57                streams,
58                description,
59                connected,
60                mode,
61                modes,
62            };
63
64            self.cams.insert(cam_config.name.clone(), cam);
65
66            self.cams.get_mut(&cam_config.name).unwrap()
67        };
68        debug!("publishing camera {}", cam_config.name);
69
70        let hostname = rustix::system::uname()
71            .nodename()
72            .to_str()
73            .unwrap()
74            .to_string();
75
76        cam.source.set("usb:0".to_string()).await.unwrap();
77        cam.streams.set(vec![format!(
78            "mjpeg:http://{hostname}.local:6942/stream/{}",
79            cam_config.id,
80        )]).await.unwrap();
81        cam.description.set("Chalkydri".to_string()).await.unwrap();
82        cam.connected.set(true).await.unwrap();
83        cam.modes.set(vec!["On".to_owned(), "Off".to_owned()]).await.unwrap();
84    }
85}