diff --git a/src/app_state.rs b/src/app_state.rs index 624621e..94f05eb 100644 --- a/src/app_state.rs +++ b/src/app_state.rs @@ -179,7 +179,7 @@ impl Handler for AppState { weekday ); - relay.override_schedule = Some(schedule); + relay.override_schedule = schedule; relay.override_schedule_weekday = weekday; Ok(()) diff --git a/src/relay_loop.rs b/src/relay_loop.rs index 972824b..9f1846a 100644 --- a/src/relay_loop.rs +++ b/src/relay_loop.rs @@ -5,7 +5,7 @@ use chrono::Timelike; use emgauwa_common::constants::RELAYS_RETRY_TIMEOUT; use emgauwa_common::errors::EmgauwaError; use emgauwa_common::models::Controller; -use emgauwa_common::types::{EmgauwaNow, RelayState, RelayStates, Weekday}; +use emgauwa_common::types::{EmgauwaNow, Weekday}; use emgauwa_common::utils::printable_relay_states; use futures::pin_mut; use tokio::time; @@ -31,11 +31,6 @@ async fn run_relays(app_state: &Addr) -> Result<(), EmgauwaError> { let mut last_weekday = emgauwa_common::utils::get_weekday(); let mut this = utils::app_state_get_this(app_state).await?; - let mut relay_states: RelayStates = Vec::new(); - let now = EmgauwaNow::now(); - - init_relay_states(&mut relay_states, &this); - calc_relay_states(&mut relay_states, &mut this, app_state, &now).await?; let mut duration_override = None; @@ -81,40 +76,26 @@ async fn run_relays(app_state: &Addr) -> Result<(), EmgauwaError> { }) .min(); - calc_relay_states(&mut relay_states, &mut this, app_state, &now).await?; + calc_relay_states(&mut this, app_state, &now).await?; } } -fn init_relay_states(relay_states: &mut RelayStates, this: &Controller) { - relay_states.clear(); - this.relays.iter().for_each(|r| { - relay_states.push(RelayState { - active_schedule: r.active_schedule.clone(), - is_on: None - }); - }); -} - async fn calc_relay_states( - relay_states: &mut RelayStates, this: &mut Controller, app_state: &Addr, now: &EmgauwaNow, ) -> Result<(), EmgauwaError> { this.relays .iter_mut() - .zip(relay_states.iter_mut()) - .for_each(|(relay, state)| { + .for_each(|relay| { relay.reload_active_schedule(now.weekday); relay.is_on = Some( relay.active_schedule.is_on(&now.time) || relay.check_pulsing(&now.instant).is_some(), ); - - state.is_on = relay.is_on; - state.active_schedule = relay.active_schedule.clone(); }); - utils::app_state_update_relays_on(app_state, relay_states.clone()).await + let relay_states = this.get_relay_states(); + utils::app_state_update_relay_states(app_state, relay_states.clone()).await } fn get_next_duration( diff --git a/src/utils.rs b/src/utils.rs index 2080c50..3ea7854 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -42,7 +42,7 @@ pub async fn app_state_reload(app_state: &Addr) -> Result<(), EmgauwaE .map_err(EmgauwaError::from)? } -pub async fn app_state_update_relays_on( +pub async fn app_state_update_relay_states( app_state: &Addr, relay_states: RelayStates, ) -> Result<(), EmgauwaError> { diff --git a/src/ws/handlers.rs b/src/ws/handlers.rs index 20ada8c..1ad709a 100644 --- a/src/ws/handlers.rs +++ b/src/ws/handlers.rs @@ -1,12 +1,13 @@ use actix::Addr; +use sqlx::{Pool, Sqlite}; +use sqlx::pool::PoolConnection; +use tokio_tungstenite::tungstenite; +use tokio_tungstenite::tungstenite::Message; + use emgauwa_common::db::{DbController, DbJunctionRelaySchedule, DbRelay, DbSchedule}; use emgauwa_common::errors::{DatabaseError, EmgauwaError}; use emgauwa_common::models::{Controller, Relay}; use emgauwa_common::types::{ControllerWsAction, ScheduleUid}; -use sqlx::pool::PoolConnection; -use sqlx::{Pool, Sqlite}; -use tokio_tungstenite::tungstenite; -use tokio_tungstenite::tungstenite::Message; use crate::app_state::AppState; use crate::utils; @@ -153,15 +154,13 @@ async fn handle_relays( ); } - if let Some((override_schedule, weekday)) = relay.unwrap_override_schedule() { - utils::app_state_relay_override_schedule( - app_state, - relay.r.number, - override_schedule.clone(), - weekday, - ) - .await?; - } + utils::app_state_relay_override_schedule( + app_state, + relay.r.number, + relay.override_schedule.clone(), + relay.override_schedule_weekday, + ) + .await?; DbJunctionRelaySchedule::set_schedules(conn, &db_relay, schedules.iter().collect()).await?; }