networking.rs
1 use bt_hci::controller::ExternalController; 2 use defmt::info; 3 use embassy_executor::Spawner; 4 use embassy_net::{Stack, StackResources}; 5 use esp_hal::rng::Rng; 6 use esp_radio::ble::controller::BleConnector; 7 use static_cell::StaticCell; 8 9 use crate::{ 10 networking, 11 networking::wifi::credentials::WifiCredentials, 12 }; 13 14 macro_rules! mk_static { 15 ($type:ty, $value:expr) => {{ 16 static STATIC_CELL: StaticCell<$type> = StaticCell::new(); 17 STATIC_CELL.uninit().write($value) 18 }}; 19 } 20 21 pub struct NetworkResources { 22 pub stack: Stack<'static>, 23 pub ble_controller: ExternalController<BleConnector<'static>, 1>, 24 } 25 26 pub async fn initialize_networking( 27 spawner: Spawner, 28 wifi_peripheral: esp_hal::peripherals::WIFI<'static>, 29 bt_peripheral: esp_hal::peripherals::BT<'static>, 30 credentials: &WifiCredentials, 31 ) -> NetworkResources { 32 let mode_config = networking::wifi::station_config(credentials); 33 34 info!( 35 "starting Wi-Fi in STA mode with ssid='{}'", 36 credentials.ssid.as_str() 37 ); 38 39 let ble_connector = BleConnector::new(bt_peripheral, Default::default()).unwrap(); 40 let ble_controller = ExternalController::<_, 1>::new(ble_connector); 41 42 let (wifi_controller, interfaces) = esp_radio::wifi::new( 43 wifi_peripheral, 44 esp_radio::wifi::ControllerConfig::default() 45 .with_static_rx_buf_num(4) 46 .with_dynamic_rx_buf_num(16) 47 .with_dynamic_tx_buf_num(16) 48 .with_initial_config(mode_config), 49 ) 50 .expect("Failed to initialize Wi-Fi controller"); 51 52 info!( 53 "attempting STA connection to '{}'", 54 credentials.ssid.as_str() 55 ); 56 57 let random_number_generator = Rng::new(); 58 let seed = { 59 (u64::from(random_number_generator.random()) << 32) 60 | u64::from(random_number_generator.random()) 61 }; 62 63 let network_config = embassy_net::Config::dhcpv4(Default::default()); 64 let (stack, runner) = embassy_net::new( 65 interfaces.station, 66 network_config, 67 mk_static!(StackResources<7>, StackResources::<7>::new()), 68 seed, 69 ); 70 71 spawner.spawn(networking::wifi::sta::connection_task(wifi_controller).unwrap()); 72 spawner.spawn(networking::wifi::sta::net_task(runner).unwrap()); 73 spawner.spawn(networking::wifi::sta::lease_monitor_task(stack).unwrap()); 74 75 NetworkResources { 76 stack, 77 ble_controller, 78 } 79 }