From 7c3f6431c0f162eadffda456366c1071eaf9dfe8 Mon Sep 17 00:00:00 2001 From: Serguey Parkhomovsky Date: Tue, 3 Mar 2026 20:14:05 -0800 Subject: Initial commit --- src/main.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/main.rs (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..7660108 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,63 @@ +use printstats::*; +use rumqttc::{AsyncClient, Event, MqttOptions, Packet, QoS}; +use std::collections::HashMap; +use std::fs; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::Mutex; + +#[tokio::main] +async fn main() { + let content = fs::read_to_string("config.toml").expect("Couldn't read config.toml"); + let config: Config = toml::from_str(&content).expect("Couldn't parse config.toml"); + let state = Arc::new(Mutex::new(HashMap::::new())); + + for printer in &config.printers { + match printer { + Printer::Prusa { name, host, .. } => { + println!("Found Prusa: {} at {}", name, host); + } + Printer::Bambu { + name, + host, + serial_number, + .. + } => { + println!("Found Bambu: {} at {}", name, host); + let state_clone = Arc::clone(&state); + tokio::spawn(async move { + let mut mqttoptions = MqttOptions::new(name, host, 1883); + mqttoptions.set_keep_alive(Duration::from_secs(5)); + + let (client, mut eventloop) = AsyncClient::new(mqttoptions, 10); + client + .subscribe(format!("device/{}/report", serial_number), QoS::AtMostOnce) + .await + .unwrap(); + + loop { + // eventloop.poll() yields back to Tokio when there's no data + match eventloop.poll().await { + Ok(notification) => { + if let Event::Incoming(Packet::Publish(p)) = notification { + let mut lock = state_clone.lock().await; + // TODO - Update struct + println!("Updated state from {:?}", p.payload); + } + } + Err(_) => { + tokio::time::sleep(Duration::from_secs(5)).await; // Simple retry + } + } + } + }); + } + } + } + + loop { + print!("\x1B[2J\x1B[1;1H"); // clear screen + + std::thread::sleep(Duration::from_secs(5)); + } +} -- cgit v1.2.3