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)]
struct LightsState {
wake_schedule: HashMap<(BulbId, Weekday), NaiveTime>,
wake_schedule: HashMap<BulbId, HashMap<Weekday, NaiveTime>>,
}
pub async fn lights_task(state: &State) {
@ -33,7 +33,8 @@ pub async fn lights_task(state: &State) {
.get()
.wake_schedule
.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(
state.client_message.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
select! {
_ = notify => {
let lights_state = lights_state.get();
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}");
return;
}
@ -83,8 +87,11 @@ pub async fn lights_task(state: &State) {
error!("GetBulbs response channel error: {e}");
return;
}
let lights_state = lights_state.get();
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}");
return;
}
@ -92,7 +99,8 @@ pub async fn lights_task(state: &State) {
}
ClientMessage::SetBulbWakeTime { id, day, time } => {
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 {
error!("Failed to save wake schedule: {e}");
};

View File

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