Compare commits
3 commits
6fc395baca
...
fa367e6436
Author | SHA1 | Date | |
---|---|---|---|
|
fa367e6436 | ||
|
0dc9d38d42 | ||
|
d8447ee361 |
150
Cargo.lock
generated
150
Cargo.lock
generated
|
@ -119,52 +119,6 @@ version = "0.7.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
|
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "askama"
|
|
||||||
version = "0.12.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28"
|
|
||||||
dependencies = [
|
|
||||||
"askama_derive",
|
|
||||||
"askama_escape",
|
|
||||||
"humansize",
|
|
||||||
"num-traits",
|
|
||||||
"percent-encoding",
|
|
||||||
"serde",
|
|
||||||
"serde_json",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "askama_derive"
|
|
||||||
version = "0.12.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83"
|
|
||||||
dependencies = [
|
|
||||||
"askama_parser",
|
|
||||||
"basic-toml",
|
|
||||||
"mime",
|
|
||||||
"mime_guess",
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"serde",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "askama_escape"
|
|
||||||
version = "0.10.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "askama_parser"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0"
|
|
||||||
dependencies = [
|
|
||||||
"nom",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-trait"
|
name = "async-trait"
|
||||||
version = "0.1.81"
|
version = "0.1.81"
|
||||||
|
@ -294,15 +248,6 @@ dependencies = [
|
||||||
"rustc-demangle",
|
"rustc-demangle",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "basic-toml"
|
|
||||||
version = "0.1.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8"
|
|
||||||
dependencies = [
|
|
||||||
"serde",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bit_field"
|
name = "bit_field"
|
||||||
version = "0.10.2"
|
version = "0.10.2"
|
||||||
|
@ -772,15 +717,6 @@ version = "1.0.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "humansize"
|
|
||||||
version = "2.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
|
|
||||||
dependencies = [
|
|
||||||
"libm",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper"
|
name = "hyper"
|
||||||
version = "1.4.1"
|
version = "1.4.1"
|
||||||
|
@ -962,12 +898,6 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libm"
|
|
||||||
version = "0.2.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linux-embedded-hal"
|
name = "linux-embedded-hal"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
|
@ -1026,16 +956,6 @@ version = "0.7.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
|
checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "matrixmultiply"
|
|
||||||
version = "0.3.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg",
|
|
||||||
"rawpointer",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "maybe-rayon"
|
name = "maybe-rayon"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
@ -1076,13 +996,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mime_guess"
|
name = "minijinja"
|
||||||
version = "2.0.5"
|
version = "2.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
|
checksum = "45f7e8e35b6c7b169bf40b0176d2c79291ab8ee53290b84e0668ab21d841aa9d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"mime",
|
"serde",
|
||||||
"unicase",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1136,19 +1055,6 @@ version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d"
|
checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ndarray"
|
|
||||||
version = "0.15.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32"
|
|
||||||
dependencies = [
|
|
||||||
"matrixmultiply",
|
|
||||||
"num-complex",
|
|
||||||
"num-integer",
|
|
||||||
"num-traits",
|
|
||||||
"rawpointer",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "new_debug_unreachable"
|
name = "new_debug_unreachable"
|
||||||
version = "1.0.6"
|
version = "1.0.6"
|
||||||
|
@ -1228,15 +1134,6 @@ dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-complex"
|
|
||||||
version = "0.4.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
|
||||||
dependencies = [
|
|
||||||
"num-traits",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-derive"
|
name = "num-derive"
|
||||||
version = "0.4.2"
|
version = "0.4.2"
|
||||||
|
@ -1404,20 +1301,17 @@ name = "pi-frame-server"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"askama",
|
|
||||||
"axum",
|
"axum",
|
||||||
"axum-macros",
|
"axum-macros",
|
||||||
"clap",
|
"clap",
|
||||||
"epd-waveshare",
|
"epd-waveshare",
|
||||||
"image",
|
"image",
|
||||||
"linux-embedded-hal",
|
"linux-embedded-hal",
|
||||||
"ndarray",
|
"minijinja",
|
||||||
"num-traits",
|
|
||||||
"palette",
|
"palette",
|
||||||
"rayon",
|
|
||||||
"rgb",
|
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"tower-http",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
@ -1610,12 +1504,6 @@ dependencies = [
|
||||||
"rgb",
|
"rgb",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rawpointer"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rayon"
|
name = "rayon"
|
||||||
version = "1.10.0"
|
version = "1.10.0"
|
||||||
|
@ -2039,6 +1927,23 @@ dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tower-http"
|
||||||
|
version = "0.5.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.6.0",
|
||||||
|
"bytes",
|
||||||
|
"http",
|
||||||
|
"http-body",
|
||||||
|
"http-body-util",
|
||||||
|
"pin-project-lite",
|
||||||
|
"tower-layer",
|
||||||
|
"tower-service",
|
||||||
|
"tracing",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-layer"
|
name = "tower-layer"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
|
@ -2118,15 +2023,6 @@ dependencies = [
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicase"
|
|
||||||
version = "2.7.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
|
|
||||||
dependencies = [
|
|
||||||
"version_check",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.12"
|
version = "1.0.12"
|
||||||
|
|
|
@ -7,19 +7,16 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.86"
|
anyhow = "1.0.86"
|
||||||
askama = { version = "0.12.1", features = ["serde-json", "with-axum"] }
|
|
||||||
axum = { version = "0.7.5", features = ["multipart"] }
|
axum = { version = "0.7.5", features = ["multipart"] }
|
||||||
axum-macros = "0.4.1"
|
axum-macros = "0.4.1"
|
||||||
clap = { version = "4.5.7", features = ["derive"] }
|
clap = { version = "4.5.7", features = ["derive"] }
|
||||||
epd-waveshare = { git = "https://github.com/caemor/epd-waveshare.git"}
|
epd-waveshare = { git = "https://github.com/caemor/epd-waveshare.git"}
|
||||||
image = "0.25.1"
|
image = "0.25.1"
|
||||||
linux-embedded-hal = { version = "0.4.0"}
|
linux-embedded-hal = { version = "0.4.0"}
|
||||||
ndarray = "0.15.6"
|
minijinja = "2.1.0"
|
||||||
num-traits = "0.2.19"
|
|
||||||
palette = "0.7.6"
|
palette = "0.7.6"
|
||||||
rayon = "1.10.0"
|
|
||||||
rgb = "0.8.40"
|
|
||||||
thiserror = "1.0.63"
|
thiserror = "1.0.63"
|
||||||
tokio = { version = "1.38.1", features = ["full"] }
|
tokio = { version = "1.38.1", features = ["full"] }
|
||||||
|
tower-http = { version = "0.5.2", features = ["trace"] }
|
||||||
tracing = "0.1.40"
|
tracing = "0.1.40"
|
||||||
tracing-subscriber = "0.3.18"
|
tracing-subscriber = "0.3.18"
|
||||||
|
|
4
build.sh
4
build.sh
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set +x
|
set +x
|
||||||
cross build --target aarch64-unknown-linux-gnu --release --features eink
|
cross build --target aarch64-unknown-linux-gnu --release
|
||||||
rsync -aczP target/aarch64-unknown-linux-gnu/release/pi-frame-server 192.168.0.185:
|
rsync -aczP target/aarch64-unknown-linux-gnu/release/pi-frame-server 192.168.0.185:
|
||||||
# scp target/aarch64-unknown-linux-gnu/debug/pi-frame-server 192.168.0.186:
|
# scp target/aarch64-unknown-linux-gnu/debug/pi-frame-server 192.168.0.186:
|
||||||
ssh 192.168.0.185 ./pi-frame-server show
|
ssh 192.168.0.185 ./pi-frame-server serve
|
||||||
|
|
55
src/api.rs
55
src/api.rs
|
@ -1,12 +1,17 @@
|
||||||
|
use crate::imageproc::{DiffusionMatrix, Ditherer, EInkImage, ErrorDiffusionDither};
|
||||||
use axum::extract::Multipart;
|
use axum::extract::Multipart;
|
||||||
use axum::http::StatusCode;
|
use axum::http::StatusCode;
|
||||||
use axum::response::IntoResponse;
|
use axum::response::IntoResponse;
|
||||||
use axum::{extract::State, response::Response, routing::post, Router};
|
use axum::{extract::State, response::Response, routing::post, Router};
|
||||||
use image::ImageReader;
|
use image::{ImageReader, RgbImage};
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
use std::time::Duration;
|
||||||
|
use tracing::{error, info, debug, instrument};
|
||||||
|
|
||||||
use crate::display::EInkPanel;
|
use crate::display::EInkPanel;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::Arc;
|
||||||
|
use tokio::sync::mpsc::{self, Receiver, Sender};
|
||||||
|
use tokio::task::JoinHandle;
|
||||||
|
|
||||||
pub enum ImageFormFields {
|
pub enum ImageFormFields {
|
||||||
DitherType,
|
DitherType,
|
||||||
|
@ -15,17 +20,42 @@ pub enum ImageFormFields {
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Context {
|
pub struct Context {
|
||||||
display: Arc<Mutex<Box<dyn EInkPanel + Send>>>,
|
display_channel: Sender<DisplaySetCommand>,
|
||||||
|
display_task: Arc<JoinHandle<()>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new(w: Box<dyn EInkPanel + Send>) -> Self {
|
pub fn new(disp: Box<dyn EInkPanel + Send>) -> Self {
|
||||||
|
let (tx, rx) = mpsc::channel(2);
|
||||||
|
let task = tokio::spawn(display_task(rx, disp));
|
||||||
Self {
|
Self {
|
||||||
display: Arc::new(Mutex::new(w)),
|
display_channel: tx,
|
||||||
|
display_task: Arc::new(task),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct DisplaySetCommand {
|
||||||
|
img: Box<EInkImage>,
|
||||||
|
}
|
||||||
|
#[instrument(skip_all)]
|
||||||
|
pub async fn display_task(
|
||||||
|
mut rx: Receiver<DisplaySetCommand>,
|
||||||
|
mut display: Box<dyn EInkPanel + Send>,
|
||||||
|
) {
|
||||||
|
while let Some(cmd) = rx.recv().await {
|
||||||
|
info!("Got a display set command");
|
||||||
|
let raw_buf = cmd.img.into_display_buffer();
|
||||||
|
if let Err(e) = display.display(&raw_buf) {
|
||||||
|
error!("Error displaying command {e}");
|
||||||
|
}
|
||||||
|
info!("Done setting display");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Make our own error that wraps `anyhow::Error`.
|
// Make our own error that wraps `anyhow::Error`.
|
||||||
struct AppError(anyhow::Error);
|
struct AppError(anyhow::Error);
|
||||||
|
|
||||||
|
@ -58,6 +88,7 @@ pub fn router() -> Router<Context> {
|
||||||
Router::new().route("/setimage", post(set_image))
|
Router::new().route("/setimage", post(set_image))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(skip(ctx))]
|
||||||
async fn set_image(
|
async fn set_image(
|
||||||
State(ctx): State<Context>,
|
State(ctx): State<Context>,
|
||||||
mut parts: Multipart,
|
mut parts: Multipart,
|
||||||
|
@ -65,13 +96,21 @@ async fn set_image(
|
||||||
while let Some(field) = parts.next_field().await? {
|
while let Some(field) = parts.next_field().await? {
|
||||||
let name = field.name().expect("fields always have names").to_string();
|
let name = field.name().expect("fields always have names").to_string();
|
||||||
let data = field.bytes().await?;
|
let data = field.bytes().await?;
|
||||||
println!("Length of `{}` is {} bytes", name, data.len());
|
debug!("Length of `{}` is {} bytes", name, data.len());
|
||||||
if &name == "image" {
|
if &name == "image" {
|
||||||
let reader = ImageReader::new(Cursor::new(data))
|
let reader = ImageReader::new(Cursor::new(data))
|
||||||
.with_guessed_format()
|
.with_guessed_format()
|
||||||
.expect("Cursor io never fails");
|
.expect("Cursor io never fails");
|
||||||
println!("Guessed format: {:?}", reader.format());
|
debug!("Guessed format: {:?}", reader.format());
|
||||||
let _image = reader.decode()?;
|
|
||||||
|
let image = reader.decode()?;
|
||||||
|
let mut buf = EInkImage::new(800, 480);
|
||||||
|
let dither = ErrorDiffusionDither::new(DiffusionMatrix::Atkinson);
|
||||||
|
dither.dither(&image.into(), &mut buf);
|
||||||
|
let cmd = DisplaySetCommand {
|
||||||
|
img: Box::new(buf),
|
||||||
|
};
|
||||||
|
ctx.display_channel.send_timeout(cmd, Duration::from_secs(10)).await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -2,8 +2,8 @@ use epd_waveshare::{epd7in3f::Epd7in3f, prelude::WaveshareDisplay};
|
||||||
use linux_embedded_hal::spidev::SpiModeFlags;
|
use linux_embedded_hal::spidev::SpiModeFlags;
|
||||||
use linux_embedded_hal::spidev::SpidevOptions;
|
use linux_embedded_hal::spidev::SpidevOptions;
|
||||||
use linux_embedded_hal::{CdevPin, Delay, SpidevDevice};
|
use linux_embedded_hal::{CdevPin, Delay, SpidevDevice};
|
||||||
use tracing::debug_span;
|
use tracing::instrument;
|
||||||
use tracing::{info, instrument, error, warn, debug};
|
use tracing::{debug, debug_span, warn};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use linux_embedded_hal::gpio_cdev::{Chip, LineRequestFlags};
|
use linux_embedded_hal::gpio_cdev::{Chip, LineRequestFlags};
|
||||||
|
@ -12,7 +12,6 @@ pub trait EInkPanel {
|
||||||
fn display(&mut self, buf: &[u8]) -> Result<()>;
|
fn display(&mut self, buf: &[u8]) -> Result<()>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct Wrapper {
|
pub struct Wrapper {
|
||||||
spi: SpidevDevice,
|
spi: SpidevDevice,
|
||||||
gpiochip: Chip,
|
gpiochip: Chip,
|
||||||
|
@ -64,9 +63,8 @@ impl Wrapper {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EInkPanel for Wrapper {
|
impl EInkPanel for Wrapper {
|
||||||
|
#[instrument(skip_all)]
|
||||||
fn display(&mut self, buf: &[u8]) -> Result<()> {
|
fn display(&mut self, buf: &[u8]) -> Result<()> {
|
||||||
let span = debug_span!("display");
|
|
||||||
let _enter = span.enter();
|
|
||||||
self.panel
|
self.panel
|
||||||
.update_and_display_frame(&mut self.spi, buf, &mut self.delay)?;
|
.update_and_display_frame(&mut self.spi, buf, &mut self.delay)?;
|
||||||
debug!("Finished updating frame");
|
debug!("Finished updating frame");
|
||||||
|
@ -78,8 +76,9 @@ impl EInkPanel for Wrapper {
|
||||||
|
|
||||||
pub struct FakeEInk();
|
pub struct FakeEInk();
|
||||||
impl EInkPanel for FakeEInk {
|
impl EInkPanel for FakeEInk {
|
||||||
fn display(&mut self, buf: &[u8]) -> Result<()> {
|
fn display(&mut self, _buf: &[u8]) -> Result<()> {
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
|
warn!("Fake display was called");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
use thiserror;
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use image::RgbImage;
|
use image::RgbImage;
|
||||||
use tracing::{info, debug, instrument};
|
use tracing::instrument;
|
||||||
|
|
||||||
use image::Rgb as imgRgb;
|
use image::Rgb as imgRgb;
|
||||||
use palette::color_difference::Ciede2000;
|
use palette::color_difference::Ciede2000;
|
||||||
|
|
|
@ -5,6 +5,7 @@ pub mod imageproc;
|
||||||
|
|
||||||
use crate::display::{EInkPanel, FakeEInk, Wrapper};
|
use crate::display::{EInkPanel, FakeEInk, Wrapper};
|
||||||
use crate::imageproc::{DiffusionMatrix, Ditherer, EInkImage, ErrorDiffusionDither};
|
use crate::imageproc::{DiffusionMatrix, Ditherer, EInkImage, ErrorDiffusionDither};
|
||||||
|
use tracing::info;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
use image::RgbImage;
|
use image::RgbImage;
|
||||||
|
|
||||||
|
@ -50,11 +51,13 @@ async fn main() -> anyhow::Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if matches!(cli.command, Command::Serve) {
|
if matches!(cli.command, Command::Serve) {
|
||||||
let display = FakeEInk {};
|
let display = Wrapper::new()?;
|
||||||
|
|
||||||
let ctx = api::Context::new(Box::new(display));
|
let ctx = api::Context::new(Box::new(display));
|
||||||
|
|
||||||
let app = api::router().with_state(ctx);
|
let app = api::router().with_state(ctx);
|
||||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await?;
|
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await?;
|
||||||
|
info!("Listening on 0.0.0.0:3000");
|
||||||
axum::serve(listener, app).await?;
|
axum::serve(listener, app).await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue