From 2accad049d07ee9dbb844093396968f68d406204 Mon Sep 17 00:00:00 2001 From: Silas Bartha Date: Wed, 25 Dec 2024 00:24:16 -0500 Subject: Initial Commit --- src/bin/pissd/main.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/bin/pissd/main.rs (limited to 'src/bin/pissd/main.rs') diff --git a/src/bin/pissd/main.rs b/src/bin/pissd/main.rs new file mode 100644 index 0000000..9f579b7 --- /dev/null +++ b/src/bin/pissd/main.rs @@ -0,0 +1,82 @@ +use std::{ + error::Error, + sync::{atomic::Ordering, Arc}, +}; + +use atomic_float::AtomicF32; +use lazy_static::lazy_static; +use lightstreamer_client::{ + ls_client::{LightstreamerClient, LogType, Transport}, + subscription::{Snapshot, Subscription, SubscriptionMode}, + subscription_listener::SubscriptionListener, +}; +use tokio::sync::Notify; +use tracing::info; +use zbus::interface; + +lazy_static! { + static ref PISS_PERCENTAGE: AtomicF32 = AtomicF32::new(0.0); +} + +#[derive(Debug)] +struct PissSubscriberListener; + +impl SubscriptionListener for PissSubscriberListener { + fn on_item_update(&self, update: &lightstreamer_client::item_update::ItemUpdate) { + if let Some(value) = update.get_value("Value") { + info!("Piss tank at {value}%"); + PISS_PERCENTAGE.store(value.parse::().unwrap(), Ordering::Relaxed); + } + } +} + +struct PissdInterface; + +#[interface(name = "dev.exvacuum.pissd")] +impl PissdInterface { + fn get_piss_percentage(&self) -> f32 { + PISS_PERCENTAGE.load(Ordering::Relaxed) + } +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + tracing_subscriber::fmt::init(); + let mut ls = match LightstreamerClient::new( + Some("http://push.lightstreamer.com/lightstreamer"), + Some("ISSLIVE"), + None, + None, + ) { + Ok(ls) => ls, + Err(e) => panic!("Could not establish ISS telemetry connection: {e:?}"), + }; + ls.set_logging_type(LogType::TracingLogs); + ls.connection_options.set_slowing_enabled(false); + ls.connection_options + .set_forced_transport(Some(Transport::WsStreaming)); + + let mut subscription = Subscription::new( + SubscriptionMode::Merge, + Some(vec!["NODE3000005".into()]), + Some(vec!["TimeStamp".into(), "Value".into()]), + ) + .unwrap(); + subscription + .set_requested_snapshot(Some(Snapshot::Yes)) + .unwrap(); + subscription.add_listener(Box::new(PissSubscriberListener)); + + let shutdown = Arc::new(Notify::new()); + ls.subscribe(subscription); + + let pissd_interface = PissdInterface; + let connection = zbus::connection::Builder::session()? + .name("dev.exvacuum.pissd")? + .serve_at("/dev/exvacuum/pissd", pissd_interface)? + .build() + .await?; + + ls.connect(shutdown.clone()).await?; + Ok(()) +} -- cgit v1.2.3