Added msg command for http server

This commit is contained in:
zenonet
2026-02-20 00:40:48 +01:00
parent 9cec79191c
commit b11b91c77d

View File

@@ -15,8 +15,6 @@ use embedded_graphics::{
}; };
use embedded_hal::delay::DelayNs; use embedded_hal::delay::DelayNs;
use epd_waveshare::{color::Color, epd7in5_v2::Epd7in5, prelude::WaveshareDisplay}; 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::{ use esp_idf_hal::{
delay::{Ets}, delay::{Ets},
gpio::{Gpio19, PinDriver}, gpio::{Gpio19, PinDriver},
@@ -193,11 +191,11 @@ fn main() -> anyhow::Result<()> {
..Default::default() ..Default::default()
})?; })?;
let do_update = Arc::new(RwLock::new(false)); let do_update = Arc::new(RwLock::new(Option::<Command>::None));
let writer = do_update.clone(); let writer = do_update.clone();
httpserver.fn_handler("/", Method::Get, move |request| -> anyhow::Result<()> { httpserver.fn_handler("/", Method::Get, move |request| -> anyhow::Result<()> {
*writer.write().unwrap() = true; *writer.write().unwrap() = Some(Command::Timetable);
// Retrieve html String // Retrieve html String
@@ -209,25 +207,49 @@ fn main() -> anyhow::Result<()> {
Ok(()) 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 { loop {
delay.delay_ns(100); delay.delay_ns(100);
if *do_update.read().unwrap(){ match &*do_update.read().unwrap(){
update_display_buffer(&mut display); Some(Command::Timetable) => {
println!("Rendered to buffer"); update_display_buffer(&mut display);
epd7in5.wake_up(&mut spi, &mut delay)?; println!("Rendered to buffer");
epd7in5.update_and_display_frame(&mut spi, &*display.buffer(), &mut delay)?; epd7in5.wake_up(&mut spi, &mut delay)?;
println!("Updated frame"); epd7in5.update_and_display_frame(&mut spi, &*display.buffer(), &mut delay)?;
epd7in5.sleep(&mut spi, &mut delay)?; println!("Updated frame");
println!("Sleep"); epd7in5.sleep(&mut spi, &mut delay)?;
unsafe { println!("Sleep");
WAKEUP_COUNTER += 1; unsafe {
} WAKEUP_COUNTER += 1;
}
},
Some(Command::Message(msg)) => {
display_custom_message(&mut display, &msg);
if let Ok(mut writer) = do_update.try_write(){ epd7in5.wake_up(&mut spi, &mut delay)?;
*writer = false; epd7in5.update_and_display_frame(&mut spi, &*display.buffer(), &mut delay)?;
println!("Successfully reset rw lock") epd7in5.sleep(&mut spi, &mut delay)?;
} }
None => continue
}
if let Ok(mut writer) = do_update.try_write(){
*writer = Option::<Command>::None;
println!("Successfully reset rw lock")
} }
} }
@@ -249,6 +271,13 @@ fn main() -> anyhow::Result<()> {
Ok(()) Ok(())
} }
#[derive(Clone)]
enum Command{
Timetable,
Message(String)
}
fn update_display_buffer(display: &mut epd_waveshare::epd7in5_v2::Display7in5){ fn update_display_buffer(display: &mut epd_waveshare::epd7in5_v2::Display7in5){
let (tt, now) = match fetch_data(){ let (tt, now) = match fetch_data(){
Ok(d) => d, 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>{ fn get_full_subject_name(shortname: &str) -> Option<&'static str>{
if shortname.len() < 2{ if shortname.len() < 2{
return None; return None;