diff --git a/Cargo.lock b/Cargo.lock index cf750c4..9fa1831 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,18 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -95,12 +83,6 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" -[[package]] -name = "bitfield" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" - [[package]] name = "bitflags" version = "1.3.2" @@ -122,6 +104,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bt-hci" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7f7c19df9648c1da4f5356c4256533e38bd65633b6a41654922475a1c6d777" +dependencies = [ + "defmt 1.0.1", + "embassy-sync 0.7.1", + "embedded-io", + "embedded-io-async", + "futures-intrusive", + "heapless", +] + [[package]] name = "bytemuck" version = "1.23.2" @@ -157,7 +153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" dependencies = [ "bare-metal", - "bitfield 0.13.2", + "bitfield", "embedded-hal 0.2.7", "volatile-register", ] @@ -234,13 +230,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "154c5dd2b077718c534593c50f90e854aa143a19191b9be9c41afc21a5045d83" dependencies = [ + "bt-hci", "cortex-m", "cortex-m-rt", + "defmt 1.0.1", "embassy-futures", "embassy-net-driver-channel", "embassy-sync 0.7.1", "embassy-time", "embedded-hal 1.0.0", + "embedded-io-async", "futures", "heapless", "num_enum 0.5.11", @@ -253,6 +252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "689597733e607ed9e2b6b41c2c3a0be88420d98eef09f254de3e1c71e22a4b1f" dependencies = [ "cyw43", + "defmt 1.0.1", "embassy-rp", "fixed", ] @@ -298,6 +298,57 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" +[[package]] +name = "defmt" +version = "0.3.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0963443817029b2024136fc4dd07a5107eb8f977eaf18fcd1fdeb11306b64ad" +dependencies = [ + "defmt 1.0.1", +] + +[[package]] +name = "defmt" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + +[[package]] +name = "defmt-rtt" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cac3b8a5644a9e02b75085ebad3b6deafdbdbdec04bb25086523828aa4dfd1" +dependencies = [ + "critical-section", + "defmt 1.0.1", +] + [[package]] name = "dhcparse" version = "1.0.0" @@ -366,6 +417,7 @@ checksum = "f102d5e04befe3ea74b6f41a0e26218740124636eb2f59e1cc215b5839b96df2" dependencies = [ "cortex-m", "critical-section", + "defmt 1.0.1", "document-features", "embassy-executor-macros", ] @@ -396,6 +448,7 @@ checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" dependencies = [ "cortex-m", "critical-section", + "defmt 1.0.1", "num-traits", ] @@ -405,6 +458,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "940c4b9fe5c1375b09a0c6722c0100d6b2ed46a717a34f632f26e8d7327c4383" dependencies = [ + "defmt 0.3.100", "document-features", "embassy-net-driver", "embassy-sync 0.6.2", @@ -421,6 +475,9 @@ name = "embassy-net-driver" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" +dependencies = [ + "defmt 0.3.100", +] [[package]] name = "embassy-net-driver-channel" @@ -444,6 +501,7 @@ dependencies = [ "cortex-m", "cortex-m-rt", "critical-section", + "defmt 1.0.1", "document-features", "embassy-embedded-hal", "embassy-futures", @@ -494,6 +552,7 @@ checksum = "03c372c90d3525a648684fa1c131decaf7d9ff181030db09c876fad6043443b9" dependencies = [ "cfg-if", "critical-section", + "defmt 1.0.1", "embedded-io-async", "futures-core", "futures-sink", @@ -508,6 +567,7 @@ checksum = "f820157f198ada183ad62e0a66f554c610cdcd1a9f27d4b316358103ced7a1f8" dependencies = [ "cfg-if", "critical-section", + "defmt 0.3.100", "document-features", "embassy-time-driver", "embedded-hal 0.2.7", @@ -535,43 +595,16 @@ dependencies = [ "heapless", ] -[[package]] -name = "embassy-usb" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb69c7ca7fa90b9ae590e3dea985ef80df06d900a350f9cc9d3f3c8113fc4370" -dependencies = [ - "embassy-futures", - "embassy-net-driver-channel", - "embassy-sync 0.7.1", - "embassy-usb-driver", - "embedded-io-async", - "heapless", - "ssmarshal", - "usbd-hid", -] - [[package]] name = "embassy-usb-driver" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17119855ccc2d1f7470a39756b12068454ae27a3eabb037d940b5c03d9c77b7a" dependencies = [ + "defmt 1.0.1", "embedded-io-async", ] -[[package]] -name = "embassy-usb-logger" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de76d58c51b4d49bfc9401f756aa391988a7d1c099dfc4fd0c42f1f281b04b5f" -dependencies = [ - "embassy-futures", - "embassy-sync 0.7.1", - "embassy-usb", - "log", -] - [[package]] name = "embedded-hal" version = "0.2.7" @@ -612,6 +645,9 @@ name = "embedded-io" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +dependencies = [ + "defmt 0.3.100", +] [[package]] name = "embedded-io-async" @@ -619,6 +655,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" dependencies = [ + "defmt 0.3.100", "embedded-io", ] @@ -665,12 +702,6 @@ dependencies = [ "log", ] -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - [[package]] name = "equivalent" version = "1.0.2" @@ -731,6 +762,16 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -803,15 +844,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - [[package]] name = "hashbrown" version = "0.15.5" @@ -824,6 +856,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ + "defmt 0.3.100", "hash32", "serde", "stable_deref_trait", @@ -842,7 +875,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown", ] [[package]] @@ -1007,10 +1040,14 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.21.3" +name = "panic-probe" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "fd402d00b0fb94c5aee000029204a46884b1262e0c443f166d86d2c0747e1a1a" +dependencies = [ + "cortex-m", + "defmt 1.0.1", +] [[package]] name = "parking_lot" @@ -1081,6 +1118,8 @@ dependencies = [ "cortex-m-rt", "cyw43", "cyw43-pio", + "defmt 1.0.1", + "defmt-rtt", "dhcparse", "dnsparse", "embassy-executor", @@ -1088,10 +1127,10 @@ dependencies = [ "embassy-rp", "embassy-sync 0.7.1", "embassy-time", - "embassy-usb-logger", "embedded-io-async", "heapless", "log", + "panic-probe", "percent-encoding", "portable-atomic", "rand_core 0.9.3", @@ -1483,20 +1522,11 @@ dependencies = [ "bitflags 1.3.2", "byteorder", "cfg-if", + "defmt 0.3.100", "heapless", "managed", ] -[[package]] -name = "ssmarshal" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e6ad23b128192ed337dfa4f1b8099ced0c2bf30d61e551b65fda5916dbb850" -dependencies = [ - "encode_unicode", - "serde", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1570,6 +1600,26 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thiserror" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + [[package]] name = "typenum" version = "1.18.0" @@ -1594,53 +1644,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "usb-device" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6" -dependencies = [ - "heapless", - "portable-atomic", -] - -[[package]] -name = "usbd-hid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f291ab53d428685cc780f08a2eb9d5d6ff58622db2b36e239a4f715f1e184c" -dependencies = [ - "serde", - "ssmarshal", - "usb-device", - "usbd-hid-macros", -] - -[[package]] -name = "usbd-hid-descriptors" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee54712c5d778d2fb2da43b1ce5a7b5060886ef7b09891baeb4bf36910a3ed" -dependencies = [ - "bitfield 0.14.0", -] - -[[package]] -name = "usbd-hid-macros" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb573c76e7884035ac5e1ab4a81234c187a82b6100140af0ab45757650ccda38" -dependencies = [ - "byteorder", - "hashbrown 0.13.2", - "log", - "proc-macro2", - "quote", - "serde", - "syn 1.0.109", - "usbd-hid-descriptors", -] - [[package]] name = "vcell" version = "0.1.3" @@ -1839,23 +1842,3 @@ name = "windows_x86_64_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "zerocopy" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] diff --git a/Cargo.toml b/Cargo.toml index 9e14b24..d1bc2fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ dhcp = ["dep:dhcparse"] dns = ["dep:dnsparse"] chat = ["dep:ringbuf", "json"] ttt = ["json"] -default = ["dhcp", "dns", "chat"] +default = ["dhcp", "dns", "chat", "ttt"] [dependencies] # git = "https://github.com/embassy-rs/embassy", @@ -22,24 +22,31 @@ embassy-executor = { version = "*", features = [ "arch-cortex-m", "executor-thread", "executor-interrupt", + "defmt" ] } embassy-rp = { version = "*", features = [ "unstable-pac", "rp2040", "time-driver", "critical-section-impl", + "defmt" ] } -embassy-time = { version = "*" } -embassy-usb-logger = { version = "*" } +embassy-time = { version = "*", features = ["defmt"] } +# embassy-usb-logger = { version = "*" } embassy-net = { version = "*", features = [ "proto-ipv4", "tcp", "udp", "dhcpv4", + "defmt" ] } -embassy-sync = { version = "*" } -cyw43-pio = { version = "*" } -cyw43 = { version = "*" } +embassy-sync = { version = "*", features = ["defmt"] } +cyw43-pio = { version = "*", features = ["defmt"] } +cyw43 = { version = "*", features = ["defmt"] } + +defmt = "1.0.1" +defmt-rtt = "1.0.0" +panic-probe = { version = "1.0.0", features = ["print-defmt"] } embedded-io-async = "*" cortex-m = { version = "*", features = ["inline-asm"] } diff --git a/build.rs b/build.rs index 113c72e..3f915f9 100644 --- a/build.rs +++ b/build.rs @@ -32,5 +32,5 @@ fn main() { println!("cargo:rustc-link-arg-bins=--nmagic"); println!("cargo:rustc-link-arg-bins=-Tlink.x"); println!("cargo:rustc-link-arg-bins=-Tlink-rp.x"); - // println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); + println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); } diff --git a/src/apps/chat.rs b/src/apps/chat.rs index b825ffe..837c899 100644 --- a/src/apps/chat.rs +++ b/src/apps/chat.rs @@ -3,8 +3,9 @@ use core::sync::atomic::Ordering; use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, mutex::Mutex}; use embassy_time::{Duration, Timer}; use heapless::String; -use log::{info, warn}; -use pico_website::unimplemented; +// use log::{info, warn}; +// use pico_website::unimplemented; +use defmt::*; use portable_atomic::AtomicUsize; use serde::Serialize; @@ -21,7 +22,8 @@ struct Msg<'a> { content: &'a str, } -const MSGS_SIZE: usize = 30; +const MSGS_SIZE: usize = 100000; +const _: () = core::assert!(MSGS_SIZE > MSG_MAX_SIZE); #[derive(Debug)] struct Msgs { /// * Memory layout with sizes in bytes : ...|content: len|len: 2|author+1: 1|... @@ -186,6 +188,8 @@ impl App for ChatApp { _path: &str, mut ws: crate::socket::ws::Ws<'_, BUF_SIZE>, ) { + self.usernames_version = 0; + self.next_msg = 0; Timer::after_millis(500).await; let r: Result<(), ()> = try { loop { @@ -195,6 +199,7 @@ impl App for ChatApp { if self.usernames_version < uv { ws.send_json(&(*USERNAMES.lock().await)).await?; } + self.usernames_version = uv; } { let msgs = MSGS.lock().await; @@ -253,6 +258,6 @@ pub async fn id_to_static_str(id: u8) -> &'static str { 13 => "13", 14 => "14", 15 => "15", - _ => unimplemented().await, + _ => defmt::unimplemented!(), } } diff --git a/src/apps/index.rs b/src/apps/index.rs index 029f6ef..323f611 100644 --- a/src/apps/index.rs +++ b/src/apps/index.rs @@ -1,10 +1,10 @@ use heapless::Vec; -use pico_website::unwrap; - +// use pico_website::unwrap; use crate::{ apps::{self, Content, chat::id_to_static_str}, socket::{HttpRequestType, HttpResCode}, }; +use defmt::*; use super::App; @@ -79,7 +79,7 @@ impl App for IndexApp { content.push(team)?; content.push(html2)?; }; - unwrap(r).await; + unwrap!(r); (HttpResCode::Ok, "html", Some(Content(content))) } "/ttt.js" => { @@ -97,7 +97,7 @@ impl App for IndexApp { #[cfg(not(debug_assertions))] content.push(include_str!("../../static/ttt.min.js"))?; }; - unwrap(r).await; + unwrap!(r); (HttpResCode::Ok, "javascript", Some(Content(content))) } "/chat" => { @@ -121,7 +121,7 @@ impl App for IndexApp { content.push(id_to_static_str(id).await)?; content.push(html2)?; }; - unwrap(r).await; + unwrap!(r); (HttpResCode::Ok, "html", Some(Content(content))) } "/chat.js" => { @@ -139,7 +139,7 @@ impl App for IndexApp { // #[cfg(not(debug_assertions))] // content.push(include_str!("../../static/chat.min.js"))?; }; - unwrap(r).await; + unwrap!(r); (HttpResCode::Ok, "javascript", Some(Content(content))) } _ => (HttpResCode::NotFound, "", None), diff --git a/src/apps/ttt.rs b/src/apps/ttt.rs index b4f3d4e..a7a4ca5 100644 --- a/src/apps/ttt.rs +++ b/src/apps/ttt.rs @@ -3,8 +3,9 @@ use core::str::from_utf8_unchecked; use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; use embassy_sync::mutex::Mutex; use embassy_time::{Duration, Instant, Timer}; -use log::{info, warn}; -use pico_website::{unwrap, unwrap_opt}; +// use log::{info, warn}; +use defmt::*; +// use pico_website::{unwrap, unwrap_opt}; use serde::Serialize; use crate::apps::Content; @@ -89,11 +90,7 @@ impl App for TttApp { fn accept_ws(&self, path: &str) -> bool { (self.team == Team::Zero && path == "/blue") || (self.team == Team::One && path == "/red") } - async fn handle_ws<'a, const BUF_SIZE: usize>( - &'a mut self, - _path: &str, - mut ws: Ws<'a, BUF_SIZE>, - ) { + async fn handle_ws(&mut self, _path: &str, mut ws: Ws<'_, BUF_SIZE>) { Timer::after_millis(500).await; let r: Result<(), ()> = try { loop { @@ -103,9 +100,8 @@ impl App for TttApp { continue; }; if self.last_game != *game { - let n = unwrap(serde_json_core::to_slice(&(*game), &mut self.json_buf)).await; - let json = - unsafe { from_utf8_unchecked(&unwrap_opt(self.json_buf.get(..n)).await) }; + let n = serde_json_core::to_slice(&(*game), &mut self.json_buf).unwrap(); + let json = unsafe { from_utf8_unchecked(&unwrap!(self.json_buf.get(..n))) }; ws.send(WsMsg::Text(json)).await?; self.last_game = game.clone(); } diff --git a/src/dhcp.rs b/src/dhcp.rs index 5ff54b2..6de5c8e 100644 --- a/src/dhcp.rs +++ b/src/dhcp.rs @@ -10,8 +10,9 @@ use embassy_net::{ }; use embassy_time::Timer; use heapless::Vec; -use log::{info, warn}; -use pico_website::{unwrap, unwrap_opt}; +// use log::{info, warn}; +use defmt::*; +// use pico_website::{unwrap, unwrap_opt}; #[embassy_executor::task(pool_size = 1)] pub async fn dhcp_server(stack: Stack<'static>) { @@ -32,29 +33,33 @@ pub async fn dhcp_server(stack: Stack<'static>) { &mut tx_meta, &mut tx_buffer, ); - unwrap(socket.bind(67)).await; + unwrap!(socket.bind(67)); info!("Starting DHCP server"); loop { Timer::after_secs(0).await; - let (n, _) = unwrap(socket.recv_from(&mut buf).await).await; + let (n, _) = unwrap!(socket.recv_from(&mut buf).await); - let msg = unwrap_opt(buf.get(..n)).await; - let msg = unwrap(dhcpv4::Message::new(&msg)).await; + let msg = unwrap!(buf.get(..n)); + let msg = dhcpv4::Message::new(&msg).unwrap(); - let msg_type = unwrap(v4_options!(msg; MessageType required)).await; + let msg_type = v4_options!(msg; MessageType required).unwrap(); let mut rapid_commit = false; - if unwrap(msg.options()) - .await + if msg + .options() + .unwrap() .any(|opt| matches!(opt, Ok((DhcpOption::Unknown(80, _), _)))) { if msg_type != DhcpMsgType::DISCOVER { - warn!("WARN : dhcp rapid commit option on {:?} message", msg_type); + warn!( + "WARN : dhcp rapid commit option on {:?} message", + Debug2Format(&msg_type) + ); continue 'listen; } rapid_commit = true; } - info!("Dhcp: received {:?} message", msg_type); + info!("Dhcp: received {:?} message", Debug2Format(&msg_type)); match msg_type { DhcpMsgType::DISCOVER | DhcpMsgType::REQUEST => { @@ -89,8 +94,8 @@ pub async fn dhcp_server(stack: Stack<'static>) { opts.clear(); opts.extend_from_slice( - unwrap(v4_options!(msg; ParameterRequestList)) - .await + v4_options!(msg; ParameterRequestList) + .unwrap() .unwrap_or(&[]), ) .unwrap(); @@ -99,7 +104,7 @@ pub async fn dhcp_server(stack: Stack<'static>) { (DhcpMsgType::DISCOVER, false) => &[54], (DhcpMsgType::DISCOVER, true) => &[54, 80], (DhcpMsgType::REQUEST, false) => &[1, 3, 51, 6, 54], - _ => unreachable!(), + _ => defmt::unreachable!(), }; for o in default_opts { if !opts.contains(o) { @@ -107,10 +112,10 @@ pub async fn dhcp_server(stack: Stack<'static>) { } } - unwrap(write_dhcp_opts(&mut res_buf, &opts).await).await; + unwrap!(write_dhcp_opts(&mut res_buf, &opts)); res_buf.push(255).unwrap(); // end option - unwrap( + unwrap!( socket .send_to( &res_buf, @@ -124,8 +129,7 @@ pub async fn dhcp_server(stack: Stack<'static>) { }, ) .await, - ) - .await; + ); info!("Dhcp: offer/ack sent for ip 192.254.0.{}", current_ip); if msg_type == DhcpMsgType::REQUEST || rapid_commit { @@ -143,7 +147,7 @@ pub async fn dhcp_server(stack: Stack<'static>) { } } -async fn write_dhcp_opts(buf: &mut Vec, op_codes: &[u8]) -> Result<(), ()> { +fn write_dhcp_opts(buf: &mut Vec, op_codes: &[u8]) -> Result<(), ()> { for o in op_codes { let (opt_len, opt): (u8, &[u8]) = match o { 1 => (4, &[255, 255, 255, 0]), // DhcpOption::SubnetMask(&dhcpv4::Addr([255, 255, 255, 0])), diff --git a/src/dns.rs b/src/dns.rs index 519ce60..ad93279 100644 --- a/src/dns.rs +++ b/src/dns.rs @@ -4,8 +4,9 @@ use embassy_net::{ udp::{PacketMetadata, UdpSocket}, }; use embassy_time::Timer; -use log::{info, warn}; -use pico_website::{unwrap, unwrap_opt}; +// use log::{info, warn}; +use defmt::*; +// use pico_website::{unwrap, unwrap_opt}; #[embassy_executor::task(pool_size = 1)] pub async fn dns_server(stack: Stack<'static>) { @@ -23,18 +24,21 @@ pub async fn dns_server(stack: Stack<'static>) { &mut tx_meta, &mut tx_buffer, ); - unwrap(socket.bind(53)).await; + unwrap!(socket.bind(53)); info!("Starting DNS server"); loop { Timer::after_secs(0).await; - let (n, meta) = unwrap(socket.recv_from(&mut buf).await).await; + let (n, meta) = unwrap!(socket.recv_from(&mut buf).await); - let msg = unwrap_opt(buf.get_mut(..n)).await; + let msg = unwrap!(buf.get_mut(..n)); let msg = match dnsparse::Message::parse(msg) { Ok(msg) => msg, Err(e) => { - warn!("Dns: Error while parsing DNS message : {:#?}", e); + warn!( + "Dns: Error while parsing DNS message : {}", + Display2Format(&e) + ); continue; } }; @@ -42,7 +46,7 @@ pub async fn dns_server(stack: Stack<'static>) { if msg.header().opcode() != OpCode::Query { info!( "Dns: Received unknown dns opcode ({:?}), ignoring", - msg.header().opcode() + Debug2Format(&msg.header().opcode()) ); continue; } @@ -69,9 +73,9 @@ pub async fn dns_server(stack: Stack<'static>) { ttl: 600, rdata: &[192, 254, 0, 2], }); - info!("Dns: Giving {}", q.name()); + info!("Dns: Giving {}", Display2Format(&q.name())); } else { - info!("Dns: Unknown uri, ignoring ({})", q.name()); + info!("Dns: Unknown uri, ignoring ({})", Display2Format(&q.name())); } } _ => { diff --git a/src/lib.rs b/src/lib.rs index 21609b8..7d19ad3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,13 +2,13 @@ use core::{fmt::Debug, panic::PanicInfo}; use embassy_time::Timer; -use log::error; +// use log::error; pub async fn unwrap(res: Result) -> T { match res { Ok(v) => v, Err(e) => loop { - error!("FATAL ERROR : {:?}", e); + // error!("FATAL ERROR : {:?}", e); Timer::after_secs(5).await; }, } @@ -34,9 +34,9 @@ pub async fn unimplemented() -> ! { loop {} } -// TODO: make this log work -#[panic_handler] -fn panic(info: &PanicInfo) -> ! { - error!("PANIC: {}", info); - loop {} -} +// // TODO: make this log work +// #[panic_handler] +// fn panic(info: &PanicInfo) -> ! { +// // error!("PANIC: {}", info); +// loop {} +// } diff --git a/src/main.rs b/src/main.rs index 8a5b451..04d12ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use core::net::Ipv4Addr; use cyw43_pio::{DEFAULT_CLOCK_DIVIDER, PioSpi}; +use defmt::*; use embassy_executor::Spawner; use embassy_net::{Config, StackResources}; use embassy_rp::bind_interrupts; @@ -22,10 +23,11 @@ use embassy_rp::peripherals::USB; use embassy_rp::peripherals::{DMA_CH0, PIO0}; use embassy_rp::pio::{InterruptHandler as PioInterruptHandler, Pio}; use embassy_rp::usb::{Driver, InterruptHandler as UsbInterruptHandler}; -use log::info; -use pico_website::unwrap; +// use log::info; +// use pico_website::unwrap; use rand_core::RngCore; use static_cell::StaticCell; +use {defmt_rtt as _, panic_probe as _}; #[cfg(feature = "dhcp")] mod dhcp; @@ -41,10 +43,10 @@ bind_interrupts!(struct Irqs { PIO0_IRQ_0 => PioInterruptHandler; }); -#[embassy_executor::task] -async fn logger_task(driver: Driver<'static, USB>) { - embassy_usb_logger::run!(1024, log::LevelFilter::Info, driver); -} +// #[embassy_executor::task] +// async fn logger_task(driver: Driver<'static, USB>) { +// embassy_usb_logger::run!(1024, log::LevelFilter::Info, driver); +// } #[embassy_executor::task] async fn cyw43_task( @@ -62,7 +64,7 @@ async fn net_task(mut runner: embassy_net::Runner<'static, cyw43::NetDriver<'sta async fn main(spawner: Spawner) { let p = embassy_rp::init(Default::default()); let driver = Driver::new(p.USB, Irqs); - spawner.spawn(logger_task(driver)).unwrap(); + // spawner.spawn(logger_task(driver)).unwrap(); let mut rng = RoscRng; let fw = include_bytes!("../cyw43-firmware/43439A0.bin"); @@ -84,7 +86,7 @@ async fn main(spawner: Spawner) { static STATE: StaticCell = StaticCell::new(); let state = STATE.init(cyw43::State::new()); let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; - unwrap(spawner.spawn(cyw43_task(runner))).await; + unwrap!(spawner.spawn(cyw43_task(runner))); control.init(clm).await; control @@ -131,7 +133,7 @@ async fn main(spawner: Spawner) { seed, ); - unwrap(spawner.spawn(net_task(runner))).await; + unwrap!(spawner.spawn(net_task(runner))); #[cfg(not(feature = "wifi-connect"))] control.start_ap_open("pico", 5).await; @@ -162,27 +164,25 @@ async fn main(spawner: Spawner) { info!("DHCP is now up!"); info!( "ip : {}", - unwrap(stack.config_v4().ok_or("no dhcp config")) - .await - .address + unwrap!(stack.config_v4().ok_or("no dhcp config")).address ) } #[cfg(feature = "dhcp")] - unwrap(spawner.spawn(dhcp::dhcp_server(stack))).await; + unwrap!(spawner.spawn(dhcp::dhcp_server(stack))); #[cfg(feature = "dns")] - unwrap(spawner.spawn(dns::dns_server(stack))).await; + unwrap!(spawner.spawn(dns::dns_server(stack))); - unwrap(spawner.spawn(socket::index_listen_task(stack, 80))).await; + unwrap!(spawner.spawn(socket::index_listen_task(stack, 80))); #[cfg(feature = "ttt")] { - unwrap(spawner.spawn(socket::ttt_listen_task(stack, apps::ttt::Team::Zero, 8080))).await; - unwrap(spawner.spawn(socket::ttt_listen_task(stack, apps::ttt::Team::One, 8081))).await; + unwrap!(spawner.spawn(socket::ttt_listen_task(stack, apps::ttt::Team::Zero, 8080))); + unwrap!(spawner.spawn(socket::ttt_listen_task(stack, apps::ttt::Team::One, 8081))); } #[cfg(feature = "chat")] for i in 0..4 { - unwrap(spawner.spawn(socket::chat_listen_task(stack, i, 9000 + i as u16))).await; + unwrap!(spawner.spawn(socket::chat_listen_task(stack, i, 9000 + i as u16))); } info!("All apps lauched!"); } diff --git a/src/socket.rs b/src/socket.rs index bfc8dcc..9a8c614 100644 --- a/src/socket.rs +++ b/src/socket.rs @@ -1,12 +1,16 @@ use base64::prelude::*; + use core::fmt::Write; use core::str::from_utf8; +use core::write; +use defmt::*; use embassy_net::tcp::TcpSocket; use embassy_time::{Duration, Timer}; use embedded_io_async::Write as _; use heapless::{String, Vec}; -use log::{info, warn}; -use pico_website::unwrap; +// use log::{info, warn}; + +// use pico_website::unwrap; use sha1::{Digest, Sha1}; use crate::apps::Content; @@ -47,7 +51,7 @@ pub async fn listen_task< loop { Timer::after_secs(0).await; let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); - socket.set_timeout(Some(Duration::from_secs(30))); + socket.set_timeout(Some(Duration::from_secs(10))); info!("Socket {}: Listening on TCP:{}...", app.socket_name(), port); if let Err(e) = socket.accept(port).await { @@ -190,9 +194,7 @@ pub async fn listen_task< )?; None } else { - let Ok(accept) = compute_ws_accept(&buf) else { - break; - }; + let accept = compute_ws_accept(&buf); write!( &mut head_buf, "{}\r\n\ @@ -227,7 +229,7 @@ pub async fn listen_task< let res_content = match res_content { Ok(rc) => rc, Err(e) => { - warn!("res buffer write error: {:?}", e); + warn!("res buffer write error : {}", Debug2Format(&e)); break; } }; @@ -252,12 +254,12 @@ pub async fn listen_task< } if is_ws { let mut buf = buf.into_bytes(); - unwrap(buf.resize_default(BUF_LEN)).await; + unwrap!(buf.resize_default(BUF_LEN)); app.handle_ws::( &path, Ws::new( &mut socket, - &mut unwrap(buf.into_array()).await, + &mut unwrap!(buf.into_array()), app.socket_name(), ), ) @@ -266,7 +268,7 @@ pub async fn listen_task< } } -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, Format)] pub enum HttpRequestType { Get, Post, @@ -302,22 +304,13 @@ impl Into<&str> for HttpResCode { } } -fn compute_ws_accept(key: &str) -> Result, ()> { +fn compute_ws_accept(key: &str) -> String<28> { let mut res = Vec::::new(); - res.resize_default(28)?; + res.resize_default(28).unwrap(); let mut hasher = Sha1::new(); hasher.update(key.as_bytes()); hasher.update(b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); let hash = hasher.finalize(); - if let Err(e) = BASE64_STANDARD.encode_slice(hash, &mut res) { - warn!("Error while base64 encoding : {}\nkey: {}", e, key); - return Err(()); - }; - match String::from_utf8(res) { - Ok(r) => Ok(r), - Err(e) => { - warn!("Ws accept is not utf8! ({})", e); - Err(()) - } - } + BASE64_STANDARD.encode_slice(hash, &mut res).unwrap(); + String::from_utf8(res).unwrap() } diff --git a/src/socket/ws.rs b/src/socket/ws.rs index a9296fa..8ab98d8 100644 --- a/src/socket/ws.rs +++ b/src/socket/ws.rs @@ -3,10 +3,11 @@ use core::str::from_utf8; use embassy_net::tcp::{TcpReader, TcpSocket, TcpWriter}; use embassy_time::Instant; use embedded_io_async::ReadReady; -use log::warn; -use pico_website::{assert, unwrap, unwrap_opt}; +// use log::warn; +use defmt::*; +// use pico_website::{assert, unwrap, unwrap_opt}; -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, Format)] pub enum WsMsg<'a> { Ping(&'a [u8]), Pong(&'a [u8]), @@ -130,9 +131,9 @@ impl<'a, const BUF_SIZE: usize> Ws<'a, BUF_SIZE> { pub async fn rcv(&mut self) -> Result, ()> { let n = match self.rx.msg_in_buf.take() { Some(n) => { - assert(n.0 + n.1 <= self.rx.buf.len()).await; + defmt::assert!(n.0 + n.1 <= self.rx.buf.len()); self.rx.buf.copy_within(n.0..n.0 + n.1, 0); - if unwrap(self.rx.socket.read_ready()).await { + if unwrap!(self.rx.socket.read_ready()) { let n_rcv = match self.rx.socket.read(&mut self.rx.buf[n.1..]).await { Ok(0) => { warn!("read EOF"); @@ -150,7 +151,7 @@ impl<'a, const BUF_SIZE: usize> Ws<'a, BUF_SIZE> { } } None => { - if unwrap(self.rx.socket.read_ready()).await { + if unwrap!(self.rx.socket.read_ready()) { match self.rx.socket.read(self.rx.buf).await { Ok(0) => { warn!("read EOF"); @@ -208,7 +209,7 @@ impl<'a, const BUF_SIZE: usize> Ws<'a, BUF_SIZE> { .iter_mut() .enumerate() { - *x ^= unwrap_opt(mask_key.get(i % 4)).await; + *x ^= unwrap!(mask_key.get(i % 4)); } if n_after_length + 4 + (length as usize) < n { self.rx.msg_in_buf = Some((