From ca6988b01f9ae19e6d92e40d018cf79ed89ebaf2 Mon Sep 17 00:00:00 2001 From: Tobias Reisinger Date: Fri, 10 May 2024 16:47:28 +0200 Subject: [PATCH] Improve relay initialization --- Cargo.lock | Bin 69024 -> 68925 bytes src/main.rs | 11 ++++++++--- src/settings.rs | 16 +++++++++++----- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e313d9a337db5a8f951892d513359731bbf6a679..637c455bde05db6a9644b77aaa379bac37a8b435 100644 GIT binary patch delta 26 icmZ25n`Q4TmJMP~lb5^_o@~I&I(dOJ>*i@rT&Dq(Lkfog delta 113 zcmdlxi)F!VmJMP~lka43g{5bfXlIm^6ck(O>jT+(#i>QoLkrWS6jP(*MB_B`L}QCI Result<(), std::io::Error> { init_logging(&settings.logging.level)?; - let mut pfd: Option = None; - let drivers = settings.relays_make_drivers(&mut pfd)?; - let pool = db::init(&settings.database) .await .map_err(EmgauwaError::from)?; @@ -105,6 +102,12 @@ async fn main() -> Result<(), std::io::Error> { let this = Controller::from_db_model(&mut conn, db_controller).map_err(EmgauwaError::from)?; + let now = chrono::Local::now().time(); + let initial_states: Vec = this.relays.iter().map(|r| r.active_schedule.is_on(&now)).collect(); + + let mut pfd: Option = None; + let drivers = settings.relays_make_drivers(&mut pfd, initial_states)?; + let url = format!( "ws://{}:{}/api/v1/ws/controllers", settings.server.host, settings.server.port @@ -112,6 +115,8 @@ async fn main() -> Result<(), std::io::Error> { let app_state = app_state::AppState::new(pool.clone(), this, settings, drivers).start(); + log::info!("Starting main loops"); + let _ = tokio::join!( tokio::spawn(run_relays_loop(app_state.clone())), tokio::spawn(run_ws_loop(pool.clone(), app_state.clone(), url)), diff --git a/src/settings.rs b/src/settings.rs index 445f531..a5fd5bf 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -68,11 +68,15 @@ impl Settings { pub fn relays_make_drivers( &self, pfd: &mut Option, - ) -> Result>, EmgauwaError> { + initial_states: Vec, + ) -> Result>, EmgauwaError> { let mut drivers = Vec::new(); - for relay in &self.relays { - drivers.push(relay.make_driver(pfd)?); - } + let result: Result<(), EmgauwaError> = self.relays.iter().zip(initial_states.into_iter()).try_for_each(|(relay, state)| { + let driver = relay.make_driver(pfd, state)?; + drivers.push(driver); + Ok(()) + }); + result?; Ok(drivers) } } @@ -81,8 +85,9 @@ impl Relay { pub fn make_driver( &self, pfd: &mut Option, + state: bool, ) -> Result, EmgauwaError> { - let driver: Box = match self.driver { + let mut driver: Box = match self.driver { drivers::Driver::Null => Box::new(drivers::NullDriver::new(self.pin)), drivers::Driver::Gpio => Box::new(drivers::GpioDriver::new(self.pin, self.inverted)?), drivers::Driver::PiFace => { @@ -92,6 +97,7 @@ impl Relay { Box::new(drivers::PiFaceDriver::new(self.pin, pfd)?) } }; + driver.set(state)?; Ok(driver) } }