Add wake schedule to BulbMode/BulbState server msg
This commit is contained in:
@ -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}");
|
||||
};
|
||||
|
||||
@ -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),
|
||||
|
||||
Reference in New Issue
Block a user