Add wake schedule to BulbMode/BulbState server msg

This commit is contained in:
2022-10-11 22:58:16 +02:00
parent 1f05c6dc3d
commit 85b449dcdc
2 changed files with 17 additions and 6 deletions

View File

@ -16,7 +16,7 @@ use crate::{ClientRequest, State};
#[derive(Default, Clone, PartialEq, Eq, Serialize, Deserialize)] #[derive(Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
struct LightsState { struct LightsState {
wake_schedule: HashMap<(BulbId, Weekday), NaiveTime>, wake_schedule: HashMap<BulbId, HashMap<Weekday, NaiveTime>>,
} }
pub async fn lights_task(state: &State) { pub async fn lights_task(state: &State) {
@ -33,7 +33,8 @@ pub async fn lights_task(state: &State) {
.get() .get()
.wake_schedule .wake_schedule
.iter() .iter()
.map(|((bulb, day), time)| { .flat_map(|(bulb, schedule)| schedule.iter().map(move |(day, time)| (bulb, day, time)))
.map(|(bulb, day, time)| {
let handle = spawn(wake_task( let handle = spawn(wake_task(
state.client_message.clone(), state.client_message.clone(),
bulb.clone(), bulb.clone(),
@ -54,8 +55,11 @@ pub async fn lights_task(state: &State) {
sleep(tokio::time::Duration::from_millis(1000 / 10)).await; // limit to 10 updates/second sleep(tokio::time::Duration::from_millis(1000 / 10)).await; // limit to 10 updates/second
select! { select! {
_ = notify => { _ = notify => {
let lights_state = lights_state.get();
for (id, mode) in bulb_states.bulbs().await.clone().into_iter() { for (id, mode) in bulb_states.bulbs().await.clone().into_iter() {
if let Err(e) = server_message.send(ServerMessage::BulbMode { id, mode }) { let wake_schedule = lights_state.wake_schedule.get(&id).cloned().unwrap_or_default();
let msg = ServerMessage::BulbState { id, mode, wake_schedule };
if let Err(e) = server_message.send(msg) {
error!("broadcast channel error: {e}"); error!("broadcast channel error: {e}");
return; return;
} }
@ -83,8 +87,11 @@ pub async fn lights_task(state: &State) {
error!("GetBulbs response channel error: {e}"); error!("GetBulbs response channel error: {e}");
return; return;
} }
let lights_state = lights_state.get();
for (id, mode) in bulb_states.bulbs().await.clone().into_iter() { for (id, mode) in bulb_states.bulbs().await.clone().into_iter() {
if let Err(e) = request.response.send(ServerMessage::BulbMode { id, mode }).await { let wake_schedule = lights_state.wake_schedule.get(&id).cloned().unwrap_or_default();
let msg = ServerMessage::BulbState { id, mode, wake_schedule };
if let Err(e) = request.response.send(msg).await {
error!("GetBulbs response channel error: {e}"); error!("GetBulbs response channel error: {e}");
return; return;
} }
@ -92,7 +99,8 @@ pub async fn lights_task(state: &State) {
} }
ClientMessage::SetBulbWakeTime { id, day, time } => { ClientMessage::SetBulbWakeTime { id, day, time } => {
if let Err(e) = lights_state.update(|lights_state| { if let Err(e) = lights_state.update(|lights_state| {
lights_state.wake_schedule.insert((id.clone(), day), time); let schedule = lights_state.wake_schedule.entry(id.clone()).or_default();
schedule.insert(day, time);
}).await { }).await {
error!("Failed to save wake schedule: {e}"); error!("Failed to save wake schedule: {e}");
}; };

View File

@ -1,3 +1,5 @@
use std::collections::HashMap;
use chrono::{NaiveTime, Weekday}; use chrono::{NaiveTime, Weekday};
use lighter_lib::{BulbColor, BulbId, BulbMode}; use lighter_lib::{BulbColor, BulbId, BulbMode};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -10,9 +12,10 @@ pub enum ServerMessage {
}, },
/// Update the state of a bulb /// Update the state of a bulb
BulbMode { BulbState {
id: BulbId, id: BulbId,
mode: BulbMode, mode: BulbMode,
wake_schedule: HashMap<Weekday, NaiveTime>,
}, },
BulbMap(BulbMap), BulbMap(BulbMap),