/ firmware / src / boot / networking.rs
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  }