diff --git a/bin/src/daemon.rs b/bin/src/daemon.rs index 253b2b2..c748e34 100644 --- a/bin/src/daemon.rs +++ b/bin/src/daemon.rs @@ -24,6 +24,7 @@ use axum::routing::{get, post}; use axum::Router; use stats::get_qmdl_manifest; use tokio::sync::mpsc::{self, Sender}; +use tokio::sync::oneshot::error::TryRecvError; use tokio::task::JoinHandle; use tokio_util::task::TaskTracker; use std::net::SocketAddr; @@ -90,6 +91,7 @@ fn run_ctrl_c_thread( task_tracker: &TaskTracker, diag_device_sender: Sender, server_shutdown_tx: oneshot::Sender<()>, + ui_shutdown_tx: oneshot::Sender<()>, qmdl_store_lock: Arc> ) -> JoinHandle> { task_tracker.spawn(async move { @@ -104,6 +106,9 @@ fn run_ctrl_c_thread( server_shutdown_tx.send(()) .expect("couldn't send server shutdown signal"); + info!("sending UI shutdown"); + ui_shutdown_tx.send(()) + .expect("couldn't send ui shutdown signal"); diag_device_sender.send(DiagDeviceCtrlMessage::Exit).await .expect("couldn't send Exit message to diag thread"); }, @@ -115,11 +120,23 @@ fn run_ctrl_c_thread( }) } -async fn update_ui(task_tracker: &TaskTracker){ - task_tracker.spawn_blocking(|| { +async fn update_ui(task_tracker: &TaskTracker, mut ui_shutdown_rx: oneshot::Receiver<()>){ + task_tracker.spawn_blocking(move || { let mut fb: Framebuffer = Framebuffer::new(); - fb.draw_img("/data/rayhunter/orca.gif"); + loop { + match ui_shutdown_rx.try_recv() { + Ok(_) => { + info!("received UI shutdown"); + break; + }, + Err(TryRecvError::Empty) => {}, + Err(e) => panic!("what the fuck {e}") + + } + fb.draw_img("/data/rayhunter/orca.gif"); + } }).await.unwrap(); + } #[tokio::main] @@ -143,11 +160,11 @@ async fn main() -> Result<(), RayhunterError> { run_diag_read_thread(&task_tracker, dev, rx, qmdl_store_lock.clone()); } - + let (ui_shutdown_tx, ui_shutdown_rx) = oneshot::channel(); let (server_shutdown_tx, server_shutdown_rx) = oneshot::channel::<()>(); - run_ctrl_c_thread(&task_tracker, tx.clone(), server_shutdown_tx, qmdl_store_lock.clone()); + run_ctrl_c_thread(&task_tracker, tx.clone(), server_shutdown_tx, ui_shutdown_tx, qmdl_store_lock.clone()); run_server(&task_tracker, &config, qmdl_store_lock.clone(), server_shutdown_rx, tx).await; - update_ui(&task_tracker).await; + update_ui(&task_tracker, ui_shutdown_rx).await; task_tracker.close(); task_tracker.wait().await; diff --git a/bin/src/framebuffer.rs b/bin/src/framebuffer.rs index afa643a..45e780d 100644 --- a/bin/src/framebuffer.rs +++ b/bin/src/framebuffer.rs @@ -1,7 +1,6 @@ use image::{io::Reader as ImageReader, AnimationDecoder, imageops::FilterType, codecs::gif::GifDecoder, DynamicImage}; use std::{io::BufReader, fs::File, time::Duration}; use include_dir::{include_dir, Dir}; -use log::{info, error}; const FB_PATH:&str = "/dev/fb0"; static IMAGE_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/static/images/"); @@ -52,19 +51,16 @@ impl Framebuffer<'_>{ pub fn draw_img(&mut self, img_name: &str) { //let img_path = IMAGE_DIR.get_file(img_name).unwrap().path(); let img_path = img_name; - info!("img_path: {:?}", img_path); if img_path.ends_with(".gif") { - loop{ - // this is dumb and i'm sure there's a better way to loop this - let stream = BufReader::new(File::open(&img_path).unwrap()); - let decoder = GifDecoder::new(stream).unwrap(); - for maybe_frame in decoder.into_frames() { - let frame = maybe_frame.unwrap(); - let (numerator, _) = frame.delay().numer_denom_ms(); - let img = DynamicImage::from(frame.into_buffer()); - self.write(img); - std::thread::sleep(Duration::from_millis(numerator as u64)); - } + // this is dumb and i'm sure there's a better way to loop this + let stream = BufReader::new(File::open(&img_path).unwrap()); + let decoder = GifDecoder::new(stream).unwrap(); + for maybe_frame in decoder.into_frames() { + let frame = maybe_frame.unwrap(); + let (numerator, _) = frame.delay().numer_denom_ms(); + let img = DynamicImage::from(frame.into_buffer()); + self.write(img); + std::thread::sleep(Duration::from_millis(numerator as u64)); } } else { let img_reader = ImageReader::open(img_path).unwrap();