From 1c0108cefa4039c3c67d92a89bc505f07b988ae5 Mon Sep 17 00:00:00 2001 From: Arkitu <85173315+Arkitu@users.noreply.github.com> Date: Fri, 2 May 2025 14:08:14 +0200 Subject: [PATCH] messages in mutex --- Cargo.lock | 1 + Cargo.toml | 1 + src/apps/chat.rs | 85 ++++++++++++++++-------------------------------- 3 files changed, 30 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c0442c..f8dbe71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1103,6 +1103,7 @@ dependencies = [ "embassy-executor", "embassy-net", "embassy-rp", + "embassy-sync", "embassy-time", "embassy-usb-logger", "embedded-io-async", diff --git a/Cargo.toml b/Cargo.toml index f430dbf..b44d3ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ embassy-net = { git = "https://github.com/embassy-rs/embassy", features = [ "udp", "dhcpv4", ] } +embassy-sync = { git = "https://github.com/embassy-rs/embassy" } cyw43-pio = { git = "https://github.com/embassy-rs/embassy" } cyw43 = { git = "https://github.com/embassy-rs/embassy" } diff --git a/src/apps/chat.rs b/src/apps/chat.rs index ea30145..fcd7259 100644 --- a/src/apps/chat.rs +++ b/src/apps/chat.rs @@ -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 log::info; use pico_website::unwrap; use ringbuffer::{ConstGenericRingBuffer, RingBuffer}; @@ -9,37 +9,15 @@ use crate::socket::{HttpRequestType, HttpResCode}; use super::App; const MEMORY_SIZE: usize = 16; +static MESSAGES: Mutex = Mutex::new(Messages::new()); pub struct ChatApp { res_buf: Vec, - msgs: ConstGenericRingBuffer, - next_msg: u16, } impl ChatApp { 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 { res_buf: Vec::new(), - msgs, - next_msg: 2, } } } @@ -57,7 +35,7 @@ impl App for ChatApp { (HttpRequestType::Get, "/" | "/index" | "/index.html" | "/chat" | "/chat.html") => { (HttpResCode::Ok, "html", include_bytes!("./chat.html")) } - (req_type, path) => { + (_, path) => { let (path, args) = path.split_once('?').unwrap_or((path, "")); let mut load = None; let mut username = None; @@ -102,20 +80,13 @@ impl App for ChatApp { Ok(n) => n, Err(_) => return (HttpResCode::BadRequest, "", &[]), }; - info!("msg_id = {:?}", msg_id); - if msg_id >= self.next_msg { + let msgs = MESSAGES.lock().await; + if msg_id >= msgs.next { 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, "", &[]); } - 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(); unwrap(write!(&mut self.res_buf, "
msg, + None => return (HttpResCode::NoContent, "", &[]), + }; unwrap(write!( &mut self.res_buf, ">{}: {}
", msg.author, msg.content )) .await; - // unwrap(write!( - // &mut self.res_buf, - // "
\ - // {}: {}\ - //
", - // 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); } else { (HttpResCode::NotFound, "", &[]) @@ -170,3 +124,20 @@ struct Message { author: String<16>, content: String<256>, } + +struct Messages { + inner: ConstGenericRingBuffer, + 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)) + } +}