Outdoor doorbell chime

This commit is contained in:
2020-10-28 18:01:54 -07:00
parent 9e8543610b
commit e173f58da1

View File

@@ -1,4 +1,6 @@
use std::cell::RefCell;
use std::convert::Infallible; use std::convert::Infallible;
use std::process;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::time::Duration; use std::time::Duration;
@@ -24,6 +26,10 @@ fn button_pressed(_level: Level, clients: &Arc<Mutex<SmallVec<[mpsc::Sender<()>;
}); });
} }
thread_local! {
static AUDIO_CHILD: RefCell<Option<process::Child>> = RefCell::new(None)
}
#[tokio::main(basic_scheduler)] #[tokio::main(basic_scheduler)]
async fn main() { async fn main() {
pretty_env_logger::init_timed(); pretty_env_logger::init_timed();
@@ -57,9 +63,27 @@ async fn main() {
Ok::<_, Infallible>((sse::event("ping"), sse::data("")).into_a()) Ok::<_, Infallible>((sse::event("ping"), sse::data("")).into_a())
}), }),
rx.map(|()| { rx.filter_map(|()| async {
AUDIO_CHILD.with(|cell| {
if let Some(ref mut audio_child) = *cell.borrow_mut() {
if let Ok(None) = audio_child.try_wait() {
debug!("doorbell still ringing, ignoring press");
return None;
}
}
Some(())
})?;
debug!("Playing doorbell chime");
match process::Command::new("mplayer")
.arg("static/outdoor.mp3")
.stdout(process::Stdio::null())
.stderr(process::Stdio::null())
.spawn() {
Ok(child) => { AUDIO_CHILD.with(|cell| cell.replace(Some(child))); },
Err(err) => error!("Error playing outdoor chime: {}", err)
};
debug!("sending ring sse"); debug!("sending ring sse");
Ok::<_, Infallible>((sse::event("ring"), sse::data("")).into_b()) Some(Ok::<_, Infallible>((sse::event("ring"), sse::data("")).into_b()))
}) })
); );
sse::reply(stream) sse::reply(stream)