diff --git a/embassy/demos/picow/src/main.rs b/embassy/demos/picow/src/main.rs index 47d64ea8e8f0d8c2484eb6eba3757d3f0a79b607..9603fd6a43923d12c1a8815fce79db9e1d4de4eb 100644 --- a/embassy/demos/picow/src/main.rs +++ b/embassy/demos/picow/src/main.rs @@ -105,12 +105,8 @@ async fn main(spawner: Spawner) { embassy_rp::watchdog::Watchdog::new(p.WATCHDOG) )); - let state = GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog }; - let state = singleton!(state); + let state; - spawner.spawn(usbserial::task(p.USB, state)).unwrap(); - - // spawn the wifi stack #[cfg(feature = "cyw43")] { let stack = wifi::wifi_stack( @@ -119,12 +115,15 @@ async fn main(spawner: Spawner) { ) .await; + let net_mac = stack.ethernet_address(); + let g = GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog, net_mac }; + state = singleton!(g); for _ in 0..NUM_LISTENERS { spawner.spawn(cyw43_listener(&stack, config, state)).unwrap(); } } - // spawn the ethernet stack + #[cfg(feature = "w5500")] { let stack = w5500::w5500_stack( @@ -133,10 +132,15 @@ async fn main(spawner: Spawner) { ) .await; + let net_mac = stack.ethernet_address(); + let g = GlobalState { usb_pipe, serial1_pipe, config, flash, watchdog, net_mac }; + state = singleton!(g); for _ in 0..NUM_LISTENERS { spawner.spawn(w5500_listener(&stack, config, state)).unwrap(); } } + + spawner.spawn(usbserial::task(p.USB, state)).unwrap(); } // TODO: pool_size should be NUM_LISTENERS but needs a literal @@ -170,6 +174,8 @@ pub(crate) struct GlobalState { embassy_rp::flash::Flash<'static, FLASH, { flashconfig::FLASH_SIZE }>, >, pub watchdog: &'static SunsetMutex<embassy_rp::watchdog::Watchdog>, + + pub net_mac: [u8; 6], } struct DemoShell { diff --git a/embassy/demos/picow/src/picowmenu.rs b/embassy/demos/picow/src/picowmenu.rs index 58c54922f1ab80729958ad10d0dee58b5e05c337..6088c77913ca5cc7b87f944ff7abd7001b0b9124 100644 --- a/embassy/demos/picow/src/picowmenu.rs +++ b/embassy/demos/picow/src/picowmenu.rs @@ -9,7 +9,7 @@ pub use log::{debug, error, info, log, trace, warn}; #[cfg(feature = "defmt")] pub use defmt::{debug, error, info, panic, trace, warn}; -use core::fmt::Write; +use core::fmt::{Write, Debug, Display}; use core::future::{poll_fn, Future}; use core::ops::DerefMut; use core::sync::atomic::Ordering::{Relaxed, SeqCst}; @@ -23,6 +23,8 @@ use embassy_net::{Ipv4Cidr, Ipv4Address}; use heapless::{String, Vec}; +use pretty_hex::PrettyHex; + use crate::demo_common; use crate::flashconfig; use crate::GlobalState; @@ -723,9 +725,29 @@ fn do_wifi_open(_item: &Item<MenuCtx>, args: &[&str], context: &mut MenuCtx) { wifi_entry(context); } +struct Mac([u8; 6]); + +impl Display for Mac { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}", + self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5]) + } +} + fn do_net_info(_item: &Item<MenuCtx>, _args: &[&str], context: &mut MenuCtx) { + #[cfg(feature = "w5500")] + let _ = writeln!(context.out, "w5500 wired ethernet"); + #[cfg(feature = "cyw43")] + let _ = writeln!(context.out, "cyw43 wifi"); + let _ = writeln!(context.out, "mac address {}", Mac(context.state.net_mac)); + context.with_config(|c, out| { - let _ = write!(out, "wired mac {:x?} ", c.mac); + if let Some(ref stat) = c.ip4_static { + let _ = writeln!(out, "static ip4 {stat:?}"); + } else { + // TODO the actual address + let _ = writeln!(out, "Using dhcp"); + } }); } @@ -733,6 +755,7 @@ fn do_net_dhcp(_item: &Item<MenuCtx>, _args: &[&str], context: &mut MenuCtx) { context.with_config(|c, out| { c.ip4_static = None; }); + context.need_save = true; } fn do_net_static(_item: &Item<MenuCtx>, args: &[&str], context: &mut MenuCtx) { @@ -756,6 +779,7 @@ fn do_net_static(_item: &Item<MenuCtx>, args: &[&str], context: &mut MenuCtx) { } } }); + context.need_save = true; } // Returns an error on EOF etc.