diff --git a/src/grid.rs b/src/grid.rs index 5f0731a..a3a20d8 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -1,5 +1,6 @@ use std::{ cell::SyncUnsafeCell, + hash::{DefaultHasher, Hash, Hasher}, sync::{RwLock, RwLockReadGuard}, }; @@ -18,6 +19,7 @@ pub struct Flut { size_x: usize, size_y: usize, cells: SyncUnsafeCell>, + last_hash: SyncUnsafeCell, jpgbuf: RwLock>, } @@ -31,6 +33,7 @@ impl Flut { size_x, size_y, cells: vec.into(), + last_hash: 0.into(), jpgbuf: RwLock::new(Vec::new()), } } @@ -89,7 +92,21 @@ impl GenericImageView for Flut { } impl Flut { + pub fn check_changed(&self) -> bool { + let previous = unsafe { *self.last_hash.get() }; + let mut hasher = DefaultHasher::new(); + unsafe { (*self.cells.get()).hash(&mut hasher) }; + if hasher.finish() == previous { + return false; + } + unsafe { *self.last_hash.get() = hasher.finish() } + true + } + pub fn update_jpg_buffer(&self) { + if !self.check_changed() { + return; + } let mut jpgbuf = self.jpgbuf.write().expect("Could not get write RWlock"); jpgbuf.clear(); let encoder = image::codecs::jpeg::JpegEncoder::new_with_quality(&mut *jpgbuf, 50); diff --git a/src/webapi.rs b/src/webapi.rs index 6aef64c..d5c2e60 100644 --- a/src/webapi.rs +++ b/src/webapi.rs @@ -1,4 +1,4 @@ -use std::{net::SocketAddr, process::exit, sync::Arc}; +use std::{net::SocketAddr, process::exit, sync::Arc, time::Duration}; use axum::{ extract::{ConnectInfo, Query, State}, @@ -12,7 +12,7 @@ use axum_streams::StreamBodyAs; use futures::{never::Never, stream::repeat_with, Stream}; use rust_embed::RustEmbed; use serde::Deserialize; -use tokio::net::TcpListener; +use tokio::{net::TcpListener, time::sleep}; use tower_http::trace::{DefaultMakeSpan, TraceLayer}; use crate::{