diff --git a/dashboard/src/battery.rs b/dashboard/src/battery.rs new file mode 100644 index 0000000..1f6570a --- /dev/null +++ b/dashboard/src/battery.rs @@ -0,0 +1,20 @@ +use slint::Weak; +use tokio::sync::mpsc::UnboundedSender; + +use crate::{error::AppError, messages::EventMessage, ui::AppWindow}; + +pub async fn battery_listener( + app_weak: Weak, + mut s2c_tx: UnboundedSender, +) -> Result<(), AppError> { + let manager = ::battery::Manager::new()?; + + let battery = manager + .batteries()? + .next() + .ok_or_else(|| AppError::NoBattery)??; + + dbg!(battery); + + Ok(()) +} diff --git a/dashboard/src/error.rs b/dashboard/src/error.rs index d73b1eb..68220ac 100644 --- a/dashboard/src/error.rs +++ b/dashboard/src/error.rs @@ -6,12 +6,15 @@ pub enum AppError { #[error("HASS_TOKEN is not set")] MissingToken, - #[error("invalid HASS_URL")] + #[error("Invalid HASS_URL")] InvalidUrl, #[error("Unsupported HASS_URL scheme: {0}")] InvalidScheme(String), + #[error("No battery found")] + NoBattery, + #[error(transparent)] SlintPlatform(#[from] slint::PlatformError), diff --git a/dashboard/src/main.rs b/dashboard/src/main.rs index adb61fd..89eb1c3 100644 --- a/dashboard/src/main.rs +++ b/dashboard/src/main.rs @@ -1,3 +1,4 @@ +mod battery; mod error; mod ha_ext; mod home_assistant; @@ -19,18 +20,6 @@ use crate::{ async fn main() -> Result<(), AppError> { dotenvy::dotenv().ok(); - let manager = battery::Manager::new()?; - - for (idx, maybe_battery) in manager.batteries()?.enumerate() { - let battery = maybe_battery?; - println!("Battery #{}:", idx); - println!("Vendor: {:?}", battery.vendor()); - println!("Model: {:?}", battery.model()); - println!("State: {:?}", battery.state()); - println!("Time to full charge: {:?}", battery.time_to_full()); - println!(); - } - #[cfg(not(feature = "dev"))] slint::platform::set_platform(Box::new(trekstor::Trekstor::new())).expect("set platform"); @@ -43,6 +32,11 @@ async fn main() -> Result<(), AppError> { ui::bind_buttons(&app, c2s_tx); + tokio::spawn({ + let s2c_tx = s2c_tx.clone(); + battery::battery_listener(app.as_weak(), s2c_tx) + }); + // listen for data tokio::spawn(ui::update_listener(app.as_weak(), s2c_rx)); diff --git a/dashboard/src/messages.rs b/dashboard/src/messages.rs index a1eb2da..78bda63 100644 --- a/dashboard/src/messages.rs +++ b/dashboard/src/messages.rs @@ -1,3 +1,4 @@ +use battery::units::Ratio; use hass_rs::HassEntity; use crate::home_assistant::CalendarEvent; @@ -17,4 +18,5 @@ pub enum EventMessage { EntityUpdated(HassEntity), EntityRemoved(HassEntity), CalendarUpdated(Vec), + BatteryPercentage(Ratio), } diff --git a/dashboard/src/ui.rs b/dashboard/src/ui.rs index a5de969..5e7961a 100644 --- a/dashboard/src/ui.rs +++ b/dashboard/src/ui.rs @@ -6,6 +6,7 @@ use crate::{ messages::{CommandMessage, EventMessage}, }; +use battery::units::Ratio; use hass_rs::HassEntity; use paste::paste; use slint::{Model, ModelRc, VecModel, Weak, language::ColorScheme}; @@ -121,6 +122,11 @@ pub fn apply_calendars(app: &Weak, entities: Vec) { } } +pub fn apply_battery(app: &Weak, batt: Ratio) { + // .. + dbg!(batt); +} + pub fn apply_state(app: &Weak, entities: Vec) { if let Err(err) = app.upgrade_in_event_loop(move |app| { apply_theme(&app, &entities); @@ -189,6 +195,9 @@ pub async fn update_listener( EventMessage::CalendarUpdated(events) => { apply_calendars(&app_weak, events); } + EventMessage::BatteryPercentage(batt) => { + apply_battery(&app_weak, batt); + } } } }