From 868d7777081645676c3c19f32925626b9f4cd404 Mon Sep 17 00:00:00 2001 From: Arkitu <85173315+Arkitu@users.noreply.github.com> Date: Sat, 29 Mar 2025 23:28:03 +0100 Subject: [PATCH] add cells logic (not working yet) --- src/main.rs | 123 +++++++++++++++++++++++++++++++++++++++---------- web/index.html | 13 +++--- 2 files changed, 104 insertions(+), 32 deletions(-) diff --git a/src/main.rs b/src/main.rs index f479720..52a5e9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,8 @@ use core::fmt::{Debug, Write}; use core::str::from_utf8; +use core::sync::atomic::{AtomicBool, AtomicU32, Ordering}; +use cortex_m::interrupt::Mutex; use cyw43_pio::{DEFAULT_CLOCK_DIVIDER, PioSpi}; use embassy_executor::Spawner; use embassy_net::tcp::TcpSocket; @@ -92,7 +94,7 @@ async fn main(spawner: Spawner) { let seed = rng.next_u64(); // Init network stack - static RESOURCES: StaticCell> = StaticCell::new(); + static RESOURCES: StaticCell> = StaticCell::new(); let (stack, runner) = embassy_net::new( net_device, config, @@ -105,21 +107,21 @@ async fn main(spawner: Spawner) { //control.start_ap_open("cyw43", 5).await; control.start_ap_wpa2("cyw43", "password", 5).await; - // loop { - // info!("test"); - // Timer::after_secs(0).await; - // } - spawner.spawn(listen_task(stack, Team::Zero, 80)).unwrap(); - spawner.spawn(listen_task(stack, Team::One, 81)).unwrap(); + // spawner.spawn(listen_task(stack, Team::One, 81)).unwrap(); } +static current_turn: AtomicBool = AtomicBool::new(false); +// bits [0; 8] : player zero board / bits [9; 17] : player one board +static board_atom: AtomicU32 = AtomicU32::new(0); + #[embassy_executor::task(pool_size = 2)] async fn listen_task(stack: Stack<'static>, team: Team, port: u16) { let mut rx_buffer = [0; 4096]; let mut tx_buffer = [0; 4096]; let mut buf = [0; 4096]; let mut res_head_buf = Vec::::new(); + let mut res_buf = Vec::::new(); loop { Timer::after_secs(0).await; let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); @@ -204,13 +206,39 @@ async fn listen_task(stack: Stack<'static>, team: Team, port: u16) { let (code, res_content): (HttpResCode, &[u8]) = match path { "/" => (HttpResCode::Ok, include_bytes!("../web/index.html")), "/htmx.min.js" => (HttpResCode::Ok, include_bytes!("../web/htmx.min.js")), - p => { - // if p.starts_with("/ppp/cell") { - // let clicked_c = match p[9] { - // '0' => - // }; - // } - (HttpResCode::NotFound, &[]) + p => 'res: { + if p.starts_with("/ppp/cell") && p.len() == 10 { + let clicked_c: Cell = match TryInto::::try_into(p.chars().nth(9).unwrap()) { + Ok(c) => c, + Err(_) => {break 'res (HttpResCode::NotFound, &[])} + }; + let mut board = board_atom.load(Ordering::Acquire); + if board & ((2^(clicked_c as u32)) + (2^(9+clicked_c as u32))) != 0 { + break 'res (HttpResCode::Forbidden, &[]) + } + board = board | 2^((team as u32 * 9) + clicked_c as u32); + board_atom.store(board, Ordering::Release); + res_buf.clear(); + for c in 0..=8 { + let picked_by = if board & (2^c) != 0 { + Some(Team::Zero) + } else if board & (2^(9+c)) != 0 { + Some(Team::One) + } else {None}; + match picked_by { + Some(Team::Zero) => {res_buf.extend_from_slice(b"
").unwrap();}, + Some(Team::One) => {res_buf.extend_from_slice(b"
").unwrap();}, + None => {write!( + &mut res_buf, + "", + c + ).unwrap();} + }; + } + (HttpResCode::Ok, &res_buf) + } else { + (HttpResCode::NotFound, &[]) + } } }; @@ -261,31 +289,76 @@ enum HttpRequestType { enum HttpResCode { Ok, NotFound, + Forbidden } impl Into<&str> for HttpResCode { fn into(self) -> &'static str { match self { HttpResCode::Ok => "HTTP/1.1 200 OK", HttpResCode::NotFound => "HTTP/1.1 404 NOT FOUND", + HttpResCode::Forbidden => "HTTP/1.1 403 FORBIDDEN" } } } #[derive(Debug, Clone, Copy)] enum Team { - Zero, - One, + Zero = 0, + One = 1, +} +impl From for Team { + fn from(value: bool) -> Self { + if value { + Team::One + } else { + Team::Zero + } + } } #[derive(Debug, Clone, Copy)] enum Cell { - C0, - C1, - C2, - C3, - C4, - C5, - C6, - C7, - C8, + C0 = 0, + C1 = 1, + C2 = 2, + C3 = 3, + C4 = 4, + C5 = 5, + C6 = 6, + C7 = 7, + C8 = 8, +} +impl TryFrom for Cell { + type Error = (); + fn try_from(value: char) -> Result { + Ok(match value { + '0' => Cell::C0, + '1' => Cell::C1, + '2' => Cell::C2, + '3' => Cell::C3, + '4' => Cell::C4, + '5' => Cell::C5, + '6' => Cell::C6, + '7' => Cell::C7, + '8' => Cell::C8, + _ => return Err(()) + }) + } +} +impl TryFrom for Cell { + type Error = (); + fn try_from(value: u8) -> Result { + Ok(match value { + 0 => Cell::C0, + 1 => Cell::C1, + 2 => Cell::C2, + 3 => Cell::C3, + 4 => Cell::C4, + 5 => Cell::C5, + 6 => Cell::C6, + 7 => Cell::C7, + 8 => Cell::C8, + _ => return Err(()) + }) + } } diff --git a/web/index.html b/web/index.html index d90dd48..daf154d 100644 --- a/web/index.html +++ b/web/index.html @@ -20,6 +20,12 @@

TicTacToe

+ -