messages in mutex

This commit is contained in:
Arkitu 2025-05-02 14:08:14 +02:00
parent e6bc8561d4
commit 1c0108cefa
3 changed files with 30 additions and 57 deletions

1
Cargo.lock generated
View File

@ -1103,6 +1103,7 @@ dependencies = [
"embassy-executor", "embassy-executor",
"embassy-net", "embassy-net",
"embassy-rp", "embassy-rp",
"embassy-sync",
"embassy-time", "embassy-time",
"embassy-usb-logger", "embassy-usb-logger",
"embedded-io-async", "embedded-io-async",

View File

@ -36,6 +36,7 @@ embassy-net = { git = "https://github.com/embassy-rs/embassy", features = [
"udp", "udp",
"dhcpv4", "dhcpv4",
] } ] }
embassy-sync = { git = "https://github.com/embassy-rs/embassy" }
cyw43-pio = { git = "https://github.com/embassy-rs/embassy" } cyw43-pio = { git = "https://github.com/embassy-rs/embassy" }
cyw43 = { git = "https://github.com/embassy-rs/embassy" } cyw43 = { git = "https://github.com/embassy-rs/embassy" }

View File

@ -1,6 +1,6 @@
use core::{fmt::Write, str::from_utf8}; use core::fmt::Write;
use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, mutex::Mutex};
use heapless::{String, Vec}; use heapless::{String, Vec};
use log::info;
use pico_website::unwrap; use pico_website::unwrap;
use ringbuffer::{ConstGenericRingBuffer, RingBuffer}; use ringbuffer::{ConstGenericRingBuffer, RingBuffer};
@ -9,37 +9,15 @@ use crate::socket::{HttpRequestType, HttpResCode};
use super::App; use super::App;
const MEMORY_SIZE: usize = 16; const MEMORY_SIZE: usize = 16;
static MESSAGES: Mutex<ThreadModeRawMutex, Messages> = Mutex::new(Messages::new());
pub struct ChatApp { pub struct ChatApp {
res_buf: Vec<u8, 2048>, res_buf: Vec<u8, 2048>,
msgs: ConstGenericRingBuffer<Message, MEMORY_SIZE>,
next_msg: u16,
} }
impl ChatApp { impl ChatApp {
pub fn new() -> Self { pub fn new() -> Self {
let mut msgs = ConstGenericRingBuffer::new();
let mut aut0 = String::new();
write!(&mut aut0, "rael").unwrap();
let mut msg0 = String::new();
write!(&mut msg0, "Prout...").unwrap();
msgs.push(Message {
author: aut0,
content: msg0,
});
let mut aut1 = String::new();
write!(&mut aut1, "josh").unwrap();
let mut msg1 = String::new();
write!(&mut msg1, "Salut !\nJe m'appelle...").unwrap();
msgs.push(Message {
author: aut1,
content: msg1,
});
Self { Self {
res_buf: Vec::new(), res_buf: Vec::new(),
msgs,
next_msg: 2,
} }
} }
} }
@ -57,7 +35,7 @@ impl App for ChatApp {
(HttpRequestType::Get, "/" | "/index" | "/index.html" | "/chat" | "/chat.html") => { (HttpRequestType::Get, "/" | "/index" | "/index.html" | "/chat" | "/chat.html") => {
(HttpResCode::Ok, "html", include_bytes!("./chat.html")) (HttpResCode::Ok, "html", include_bytes!("./chat.html"))
} }
(req_type, path) => { (_, path) => {
let (path, args) = path.split_once('?').unwrap_or((path, "")); let (path, args) = path.split_once('?').unwrap_or((path, ""));
let mut load = None; let mut load = None;
let mut username = None; let mut username = None;
@ -102,20 +80,13 @@ impl App for ChatApp {
Ok(n) => n, Ok(n) => n,
Err(_) => return (HttpResCode::BadRequest, "", &[]), Err(_) => return (HttpResCode::BadRequest, "", &[]),
}; };
info!("msg_id = {:?}", msg_id); let msgs = MESSAGES.lock().await;
if msg_id >= self.next_msg { if msg_id >= msgs.next {
return (HttpResCode::BadRequest, "", &[]); return (HttpResCode::BadRequest, "", &[]);
} }
if msg_id < self.next_msg.saturating_sub(MEMORY_SIZE as u16 + 1) { if msg_id < msgs.next.saturating_sub(MEMORY_SIZE as u16 + 1) {
return (HttpResCode::NoContent, "", &[]); return (HttpResCode::NoContent, "", &[]);
} }
let msg = match self
.msgs
.get_signed((msg_id as isize) + 1 - (self.next_msg as isize))
{
Some(msg) => msg,
None => return (HttpResCode::NoContent, "", &[]),
};
self.res_buf.clear(); self.res_buf.clear();
unwrap(write!(&mut self.res_buf, "<div class=\"message\"")).await; unwrap(write!(&mut self.res_buf, "<div class=\"message\"")).await;
if let Some(n) = load { if let Some(n) = load {
@ -130,33 +101,16 @@ impl App for ChatApp {
)) ))
.await; .await;
} }
let msg = match msgs.get_abs(msg_id) {
Some(msg) => msg,
None => return (HttpResCode::NoContent, "", &[]),
};
unwrap(write!( unwrap(write!(
&mut self.res_buf, &mut self.res_buf,
"><b>{}</b>: {}</div>", "><b>{}</b>: {}</div>",
msg.author, msg.content msg.author, msg.content
)) ))
.await; .await;
// unwrap(write!(
// &mut self.res_buf,
// "<div class=\"message\" \
// hx-get=\"/chat/message{}\" \
// hx-target=\"next .message\" \
// hx-swap=\"outerHTML\" \
// hx-trigger=\"load\"\
// >\
// <b>{}</b>: {}\
// </div>",
// match load {
// Some(target) => "hx-get=\"/chat/message{}\" \
// hx-target=\"next .message\" \
// hx-swap=\"outerHTML\" \
// hx-trigger=\"load\"\"
// }
// (msg_num + 1),
// msg.author,
// msg.content
// ))
// .await;
return (HttpResCode::Ok, "html", &self.res_buf); return (HttpResCode::Ok, "html", &self.res_buf);
} else { } else {
(HttpResCode::NotFound, "", &[]) (HttpResCode::NotFound, "", &[])
@ -170,3 +124,20 @@ struct Message {
author: String<16>, author: String<16>,
content: String<256>, content: String<256>,
} }
struct Messages {
inner: ConstGenericRingBuffer<Message, MEMORY_SIZE>,
next: u16,
}
impl Messages {
const fn new() -> Self {
Self {
inner: ConstGenericRingBuffer::new(),
next: 2,
}
}
fn get_abs(&self, id: u16) -> Option<&Message> {
self.inner
.get_signed((id as isize) + 1 - (self.next as isize))
}
}