From b11b91c77dee1356d3b08b08709a8d8b3a9d0d40 Mon Sep 17 00:00:00 2001 From: zenonet Date: Fri, 20 Feb 2026 00:40:48 +0100 Subject: [PATCH] Added msg command for http server --- src/main.rs | 80 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index db5bbfe..3760dda 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,8 +15,6 @@ use embedded_graphics::{ }; use embedded_hal::delay::DelayNs; use epd_waveshare::{color::Color, epd7in5_v2::Epd7in5, prelude::WaveshareDisplay}; -use esp_idf_hal::delay::Delay; -use esp_idf_hal::modem::Modem; use esp_idf_hal::{ delay::{Ets}, gpio::{Gpio19, PinDriver}, @@ -193,11 +191,11 @@ fn main() -> anyhow::Result<()> { ..Default::default() })?; - let do_update = Arc::new(RwLock::new(false)); + let do_update = Arc::new(RwLock::new(Option::::None)); let writer = do_update.clone(); httpserver.fn_handler("/", Method::Get, move |request| -> anyhow::Result<()> { - *writer.write().unwrap() = true; + *writer.write().unwrap() = Some(Command::Timetable); // Retrieve html String @@ -209,25 +207,49 @@ fn main() -> anyhow::Result<()> { Ok(()) })?; + let writer = do_update.clone(); + httpserver.fn_handler("/msg", Method::Get, move |request| -> anyhow::Result<()> { + + *writer.write().unwrap() = Some(Command::Message(request.header("msg").unwrap().to_string())); + + // Retrieve html String + let html = String::from("OK"); + // Respond with OK status + let mut response = request.into_ok_response()?; + // Return Requested Object (Index Page) + response.write(html.as_bytes())?; + Ok(()) + })?; + loop { delay.delay_ns(100); - if *do_update.read().unwrap(){ - update_display_buffer(&mut display); - println!("Rendered to buffer"); - epd7in5.wake_up(&mut spi, &mut delay)?; - epd7in5.update_and_display_frame(&mut spi, &*display.buffer(), &mut delay)?; - println!("Updated frame"); - epd7in5.sleep(&mut spi, &mut delay)?; - println!("Sleep"); - unsafe { - WAKEUP_COUNTER += 1; - } + match &*do_update.read().unwrap(){ + Some(Command::Timetable) => { + update_display_buffer(&mut display); + println!("Rendered to buffer"); + epd7in5.wake_up(&mut spi, &mut delay)?; + epd7in5.update_and_display_frame(&mut spi, &*display.buffer(), &mut delay)?; + println!("Updated frame"); + epd7in5.sleep(&mut spi, &mut delay)?; + println!("Sleep"); + unsafe { + WAKEUP_COUNTER += 1; + } + }, + Some(Command::Message(msg)) => { + display_custom_message(&mut display, &msg); - if let Ok(mut writer) = do_update.try_write(){ - *writer = false; - println!("Successfully reset rw lock") + epd7in5.wake_up(&mut spi, &mut delay)?; + epd7in5.update_and_display_frame(&mut spi, &*display.buffer(), &mut delay)?; + epd7in5.sleep(&mut spi, &mut delay)?; } + None => continue + } + + if let Ok(mut writer) = do_update.try_write(){ + *writer = Option::::None; + println!("Successfully reset rw lock") } } @@ -249,6 +271,13 @@ fn main() -> anyhow::Result<()> { Ok(()) } + +#[derive(Clone)] +enum Command{ + Timetable, + Message(String) +} + fn update_display_buffer(display: &mut epd_waveshare::epd7in5_v2::Display7in5){ let (tt, now) = match fetch_data(){ Ok(d) => d, @@ -289,6 +318,21 @@ fn update_display_buffer(display: &mut epd_waveshare::epd7in5_v2::Display7in5){ } +fn display_custom_message(display: &mut epd_waveshare::epd7in5_v2::Display7in5, msg: &str){ + display.clear(Color::Black).unwrap(); + let text_style = U8g2TextStyle::new(u8g2_fonts::fonts::u8g2_font_profont22_mr, Color::White); + + let display_area = display.bounding_box(); + let text = Text::new(msg, Point::zero(), &text_style); + + LinearLayout::vertical(Chain::new(text)) + .with_alignment(horizontal::Center) + .arrange() + .align_to(&display_area, horizontal::Center, vertical::Center) + .draw(display) + .unwrap(); +} + fn get_full_subject_name(shortname: &str) -> Option<&'static str>{ if shortname.len() < 2{ return None;