tweaks for matter boot

This commit is contained in:
Pat Nakajima 2026-05-18 13:52:06 -07:00
parent 1062d5ba7b
commit 3d588a553a

View File

@ -52,7 +52,7 @@ use rs_matter::transport::network::btp::{AdvData, Btp};
use rs_matter::transport::network::mdns::zeroconf::ZeroconfMdnsResponder; use rs_matter::transport::network::mdns::zeroconf::ZeroconfMdnsResponder;
use rs_matter::transport::network::wifi::wpa_supp::unix::DhClientCtl; use rs_matter::transport::network::wifi::wpa_supp::unix::DhClientCtl;
use rs_matter::transport::network::wifi::wpa_supp::WpaSuppCtl; use rs_matter::transport::network::wifi::wpa_supp::WpaSuppCtl;
use rs_matter::transport::network::NoNetwork; use rs_matter::transport::network::{Address, ChainedNetwork};
use rs_matter::transport::MATTER_SOCKET_BIND_ADDR; use rs_matter::transport::MATTER_SOCKET_BIND_ADDR;
use rs_matter::utils::select::Coalesce; use rs_matter::utils::select::Coalesce;
use rs_matter::utils::storage::pooled::PooledBuffers; use rs_matter::utils::storage::pooled::PooledBuffers;
@ -67,6 +67,8 @@ const DEFAULT_CREDS_DIR: &str = "./creds";
const DEFAULT_WIFI_IFACE: &str = "wlan0"; const DEFAULT_WIFI_IFACE: &str = "wlan0";
const LIGHT_ENDPOINT_ID: u16 = 1; const LIGHT_ENDPOINT_ID: u16 = 1;
const KV_BUF_SIZE: usize = 4096; const KV_BUF_SIZE: usize = 4096;
const BLE_SERVICE_NAME: &str = "TOES";
const COMMISSIONING_HANDOFF_SECS: u64 = 20;
const DEV_TYPE_EXTENDED_COLOR_LIGHT: rs_matter::dm::DeviceType = rs_matter::dm::DeviceType { const DEV_TYPE_EXTENDED_COLOR_LIGHT: rs_matter::dm::DeviceType = rs_matter::dm::DeviceType {
dtype: 0x010d, dtype: 0x010d,
@ -360,28 +362,58 @@ where
let btp = Btp::new(); let btp = Btp::new();
btp.set_relaxed_mtu_nego(true); btp.set_relaxed_mtu_nego(true);
let udp = async_io::Async::<UdpSocket>::bind(MATTER_SOCKET_BIND_ADDR)?;
let mut mdns_responder = ZeroconfMdnsResponder::new();
let mut mdns = pin!(mdns_responder.run(&matter));
let adv_data = AdvData::new(&TEST_DEV_DET, comm.discriminator); let adv_data = AdvData::new(&TEST_DEV_DET, comm.discriminator);
let mut bluetooth = pin!(bluez::run_peripheral( let mut bluetooth = pin!(bluez::run_peripheral(
connection, None, "TOES", &adv_data, &btp connection,
None,
BLE_SERVICE_NAME,
&adv_data,
&btp,
)); ));
let mut transport = pin!(matter.run(&crypto, &btp, &btp, NoNetwork)); let mut transport = pin!(matter.run(
let mut wifi_prov_task = pin!(async { &crypto,
ChainedNetwork::new(Address::is_udp, &udp, &btp),
ChainedNetwork::new(Address::is_udp, &udp, &btp),
&udp,
));
info!("Running Matter over concurrent BLE commissioning and IP transport");
let mut commissioning_done_task = pin!(async {
NetCtlState::wait_prov_ready(&net_ctl_state, &btp).await; NetCtlState::wait_prov_ready(&net_ctl_state, &btp).await;
info!("Wi-Fi credentials accepted; waiting for Matter fabric setup");
while !matter.is_commissioned() {
embassy_time::Timer::after_secs(1).await;
}
info!(
"Matter fabric added; keeping BLE/IP commissioning transports alive for {}s handoff",
COMMISSIONING_HANDOFF_SECS
);
embassy_time::Timer::after_secs(COMMISSIONING_HANDOFF_SECS).await;
Ok(()) Ok(())
}); });
select4( let mut matter_tasks = pin!(select4(
&mut transport, &mut transport,
&mut bluetooth, &mut bluetooth,
&mut wifi_prov_task, &mut mdns,
select(&mut respond, &mut dm_job).coalesce(), select(&mut respond, &mut dm_job).coalesce(),
) )
.coalesce());
select(&mut matter_tasks, &mut commissioning_done_task)
.coalesce() .coalesce()
.await?; .await?;
matter.reset_transport()?; matter.reset_transport()?;
info!("Wi-Fi provisioning completed; call toes_matter::listen().await next"); info!("Matter provisioning completed; call toes_matter::listen().await next");
Ok(()) Ok(())
} }