chalkydri/cameras/
publisher.rs1use 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}