diff --git a/eink-display/Cargo.lock b/eink-display/Cargo.lock index 9b9b229..b317aa7 100644 --- a/eink-display/Cargo.lock +++ b/eink-display/Cargo.lock @@ -138,18 +138,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "atom_syndication" -version = "0.12.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39d8b8ef99e33deb2a51504888222225797f48bace2f0cab01975746a39c05bb" -dependencies = [ - "chrono", - "derive_builder", - "diligent-date-parser", - "quick-xml", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -434,41 +422,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn", -] - [[package]] name = "deranged" version = "0.5.8" @@ -478,46 +431,6 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn", -] - -[[package]] -name = "diligent-date-parser" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ede7d79366f419921e2e2f67889c12125726692a313bffb474bd5f37a581e9" -dependencies = [ - "chrono", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -601,15 +514,6 @@ dependencies = [ "syn", ] -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "env_filter" version = "0.1.4" @@ -728,12 +632,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "foldhash" version = "0.1.5" @@ -978,12 +876,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "1.1.0" @@ -1199,7 +1091,6 @@ dependencies = [ "itertools", "log", "rand 0.10.0", - "rss", "serde", "textwrap", "tinybmp", @@ -1529,16 +1420,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" -[[package]] -name = "quick-xml" -version = "0.39.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" -dependencies = [ - "encoding_rs", - "memchr", -] - [[package]] name = "quote" version = "1.0.44" @@ -1725,17 +1606,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rss" -version = "2.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e38781082c53bdde56e6081698c06831f69a27eac2593ed6b6cb2511424ad5" -dependencies = [ - "atom_syndication", - "derive_builder", - "quick-xml", -] - [[package]] name = "runner" version = "0.1.0" @@ -1912,12 +1782,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - [[package]] name = "subtle" version = "2.6.1" diff --git a/eink-display/crates/logic/Cargo.toml b/eink-display/crates/logic/Cargo.toml index 2273fc1..d0ff588 100644 --- a/eink-display/crates/logic/Cargo.toml +++ b/eink-display/crates/logic/Cargo.toml @@ -14,7 +14,6 @@ image = "0.25.9" itertools = "0.14.0" log = { workspace = true } rand = "0.10.0" -rss = "2.0.13" serde = { version = "1.0.228", features = ["derive"] } textwrap = { version = "0.16.2", default-features = false, features = [] } tinybmp = "0.7.0" diff --git a/eink-display/crates/logic/src/rss.rs b/eink-display/crates/logic/src/rss.rs index 0ed2e6e..a737149 100644 --- a/eink-display/crates/logic/src/rss.rs +++ b/eink-display/crates/logic/src/rss.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use rss::Channel; +use serde::{Deserialize, Serialize}; #[derive(Debug)] pub struct RSSClient { @@ -7,23 +7,16 @@ pub struct RSSClient { display_url: String, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Serialize)] pub struct RSSEntry { pub title: String, - pub description: Option, - pub author: Option, + pub domain: Option, } -impl TryFrom for RSSEntry { - type Error = (); - - fn try_from(value: rss::Item) -> std::result::Result { - Ok(Self { - title: value.title.ok_or(())?, - description: value.description, - author: value.author, - }) - } +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct RSSJson { + pub name: String, + pub items: Vec, } impl Default for RSSClient { @@ -41,16 +34,12 @@ impl RSSClient { return Ok(vec![]); } - let mut resp = ureq::get(&self.url).call()?; - let body_bytes = dbg!(resp.body_mut().read_to_vec()?); - let channel = Channel::read_from(&body_bytes[..])?; - dbg!(&channel); + let resp = ureq::get(&self.url) + .call()? + .body_mut() + .read_json::()?; - Ok(channel - .items - .into_iter() - .flat_map(TryFrom::try_from) - .collect()) + Ok(resp.items) } pub fn display_url(&self) -> &str { diff --git a/eink-display/crates/logic/src/screens/mod.rs b/eink-display/crates/logic/src/screens/mod.rs index 5b91ea5..cb83b6e 100644 --- a/eink-display/crates/logic/src/screens/mod.rs +++ b/eink-display/crates/logic/src/screens/mod.rs @@ -89,6 +89,12 @@ impl> Screen for ErrorScreen { crate::ColourTheme::Light => Rgb888::BLACK, crate::ColourTheme::Dark => Rgb888::WHITE, }; + display + .clear(match ctx.theme { + crate::ColourTheme::Light => Rgb888::WHITE, + crate::ColourTheme::Dark => Rgb888::BLACK, + }) + .map_err(|_| FakeDrawError)?; let text_style = U8g2TextStyle::new(u8g2_fonts::fonts::u8g2_font_lubR12_tf, colour); Text::new( diff --git a/eink-display/crates/logic/src/screens/rss.rs b/eink-display/crates/logic/src/screens/rss.rs index 8096d5b..fe32ae0 100644 --- a/eink-display/crates/logic/src/screens/rss.rs +++ b/eink-display/crates/logic/src/screens/rss.rs @@ -1,5 +1,9 @@ use anyhow::Context; -use embedded_graphics::{pixelcolor::Rgb888, prelude::*}; +use embedded_graphics::{ + pixelcolor::Rgb888, + prelude::*, + primitives::{Line, PrimitiveStyle}, +}; use u8g2_fonts::{ types::{FontColor, HorizontalAlignment, VerticalPosition}, FontRenderer, @@ -54,11 +58,18 @@ impl> Screen for RSSScreen { .map_err(|_| FakeDrawError)?, ); - for entry in entries.into_iter().take(4) { - if let Some(author) = entry.author { + let filter_text = |s: String| { + s.replace("’", "'") + .replace("'", "'") + .replace("‘", "'") + .replace("–", "-") + }; + + for entry in entries.into_iter() { + if let Some(domain) = entry.domain { item_name_renderer .render_aligned( - author.as_str(), + filter_text(domain).as_str(), Point::new( display.bounding_box().size.width as i32 - PADDING, next_line_start.y, @@ -72,39 +83,46 @@ impl> Screen for RSSScreen { } next_line_start = advance_line( - item_name_renderer - .render( - entry.title.as_str(), - next_line_start, - VerticalPosition::Top, - FontColor::Transparent(colour), - display, + match item_name_renderer.render( + textwrap::fill( + filter_text(entry.title).as_str(), + display.bounding_box().size.width as usize * 30 / 480, ) - .map_err(|_| FakeDrawError)?, - ); - - if let Some(description) = entry.description { - next_line_start = advance_line( - item_description_renderer + .as_str(), + next_line_start, + VerticalPosition::Top, + FontColor::Transparent(colour), + display, + ) { + Ok(x) => x, + Err(_) => item_name_renderer .render( - textwrap::fill( - &description, - textwrap::Options::new( - display.bounding_box().size.width as usize * 50 / 480, - ) - .subsequent_indent(" "), - ) - .as_str(), + "", next_line_start, VerticalPosition::Top, FontColor::Transparent(colour), display, ) .map_err(|_| FakeDrawError)?, - ); - } + }, + ); + + next_line_start += Point::new(0, LINE_SPACING / 4); + Line::new( + Point::new(30, next_line_start.y), + Point::new( + display.bounding_box().size.width as i32 - 30, + next_line_start.y, + ), + ) + .into_styled(PrimitiveStyle::with_stroke(colour, 1)) + .draw(display) + .map_err(|_| FakeDrawError)?; + next_line_start += Point::new(0, LINE_SPACING); - next_line_start += Point::new(0, LINE_SPACING / 2); + if display.bounding_box().size.height as i32 - next_line_start.y < LINE_SPACING * 4 { + break; + } } next_line_start += Point::new(0, LINE_SPACING * 2); diff --git a/eink-display/crates/runner/src/main.rs b/eink-display/crates/runner/src/main.rs index 3fcc0dd..723c936 100644 --- a/eink-display/crates/runner/src/main.rs +++ b/eink-display/crates/runner/src/main.rs @@ -53,6 +53,16 @@ fn main() { _ => unreachable!(), }; (Box::new(screens::AgendaScreen::default()), secondary) + } else if now.hour() > 12 && now.hour() < 18 { + layout = match rng.random() { + true => logic::Layout::HeaderOnlyPrimary, + false => logic::Layout::FooterOnlyPrimary, + }; + + ( + Box::new(screens::RSSScreen::default()), + Box::new(screens::TestScreen::default()), + ) } else { let primary: DynScreenType = match rng.random_range::(0..=1) { 0 => Box::new(screens::XKCDScreen::default()),