Merge pull request #71 from kedars/psm_on_sequential

on_off_light: Save ACLs and Fabrics to PSM
This commit is contained in:
Kedar Sovani 2023-07-20 18:47:50 +05:30 committed by GitHub
commit 315da55b2b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 36 deletions

View file

@ -18,7 +18,7 @@
use core::borrow::Borrow; use core::borrow::Borrow;
use core::pin::pin; use core::pin::pin;
use embassy_futures::select::select; use embassy_futures::select::select3;
use log::info; use log::info;
use matter::core::{CommissioningData, Matter}; use matter::core::{CommissioningData, Matter};
use matter::data_model::cluster_basic_information::BasicInfoConfig; use matter::data_model::cluster_basic_information::BasicInfoConfig;
@ -29,6 +29,7 @@ use matter::data_model::root_endpoint;
use matter::data_model::system_model::descriptor; use matter::data_model::system_model::descriptor;
use matter::error::Error; use matter::error::Error;
use matter::mdns::{DefaultMdns, DefaultMdnsRunner}; use matter::mdns::{DefaultMdns, DefaultMdnsRunner};
use matter::persist::FilePsm;
use matter::secure_channel::spake2p::VerifierData; use matter::secure_channel::spake2p::VerifierData;
use matter::transport::network::{Ipv4Addr, Ipv6Addr}; use matter::transport::network::{Ipv4Addr, Ipv6Addr};
use matter::transport::runner::{RxBuf, TransportRunner, TxBuf}; use matter::transport::runner::{RxBuf, TransportRunner, TxBuf};
@ -73,6 +74,12 @@ fn run() -> Result<(), Error> {
device_name: "OnOff Light", device_name: "OnOff Light",
}; };
let psm_path = std::env::temp_dir().join("matter-iot");
info!("Persisting from/to {}", psm_path.display());
#[cfg(all(feature = "std", not(target_os = "espidf")))]
let psm = matter::persist::FilePsm::new(psm_path)?;
let (ipv4_addr, ipv6_addr, interface) = initialize_network()?; let (ipv4_addr, ipv6_addr, interface) = initialize_network()?;
let mdns = DefaultMdns::new( let mdns = DefaultMdns::new(
@ -124,16 +131,18 @@ fn run() -> Result<(), Error> {
let mut tx_buf = TxBuf::uninit(); let mut tx_buf = TxBuf::uninit();
let mut rx_buf = RxBuf::uninit(); let mut rx_buf = RxBuf::uninit();
// #[cfg(all(feature = "std", not(target_os = "espidf")))] #[cfg(all(feature = "std", not(target_os = "espidf")))]
// { {
// if let Some(data) = psm.load("acls", buf)? { let mut buf = [0; 4096];
// matter.load_acls(data)?; let buf = &mut buf;
// } if let Some(data) = psm.load("acls", buf)? {
matter.load_acls(data)?;
}
// if let Some(data) = psm.load("fabrics", buf)? { if let Some(data) = psm.load("fabrics", buf)? {
// matter.load_fabrics(data)?; matter.load_fabrics(data)?;
// } }
// } }
let node = Node { let node = Node {
id: 0, id: 0,
@ -179,13 +188,8 @@ fn run() -> Result<(), Error> {
// connect the pipes of the `run` method with your own UDP stack // connect the pipes of the `run` method with your own UDP stack
let mut mdns = pin!(mdns_runner.run_udp()); let mut mdns = pin!(mdns_runner.run_udp());
select( let mut save = pin!(save(matter, &psm));
&mut transport, select3(&mut transport, &mut mdns, &mut save).await.unwrap()
&mut mdns,
//save(transport, &psm),
)
.await
.unwrap()
}); });
// NOTE: For no_std, replace with your own no_std way of polling the future // NOTE: For no_std, replace with your own no_std way of polling the future
@ -299,6 +303,26 @@ fn initialize_network() -> Result<(Ipv4Addr, Ipv6Addr, u32), Error> {
Ok((ip, ipv6, 0 as _)) Ok((ip, ipv6, 0 as _))
} }
#[cfg(all(feature = "std", not(target_os = "espidf")))]
#[inline(never)]
async fn save(matter: &Matter<'_>, psm: &FilePsm) -> Result<(), Error> {
let mut buf = [0; 4096];
let buf = &mut buf;
loop {
matter.wait_changed().await;
if matter.is_changed() {
if let Some(data) = matter.store_acls(buf)? {
psm.store("acls", data)?;
}
if let Some(data) = matter.store_fabrics(buf)? {
psm.store("fabrics", data)?;
}
}
}
}
#[cfg(target_os = "espidf")] #[cfg(target_os = "espidf")]
#[inline(never)] #[inline(never)]
fn initialize_logger() { fn initialize_logger() {

View file

@ -28,6 +28,7 @@ use crate::{
mdns::Mdns, mdns::Mdns,
pairing::{print_pairing_code_and_qr, DiscoveryCapabilities}, pairing::{print_pairing_code_and_qr, DiscoveryCapabilities},
secure_channel::{pake::PaseMgr, spake2p::VerifierData}, secure_channel::{pake::PaseMgr, spake2p::VerifierData},
transport::exchange::Notification,
utils::{epoch::Epoch, rand::Rand}, utils::{epoch::Epoch, rand::Rand},
}; };
@ -48,6 +49,7 @@ pub struct Matter<'a> {
pub acl_mgr: RefCell<AclMgr>, pub acl_mgr: RefCell<AclMgr>,
pub pase_mgr: RefCell<PaseMgr>, pub pase_mgr: RefCell<PaseMgr>,
pub failsafe: RefCell<FailSafe>, pub failsafe: RefCell<FailSafe>,
pub persist_notification: Notification,
pub mdns: &'a dyn Mdns, pub mdns: &'a dyn Mdns,
pub epoch: Epoch, pub epoch: Epoch,
pub rand: Rand, pub rand: Rand,
@ -91,6 +93,7 @@ impl<'a> Matter<'a> {
acl_mgr: RefCell::new(AclMgr::new()), acl_mgr: RefCell::new(AclMgr::new()),
pase_mgr: RefCell::new(PaseMgr::new(epoch, rand)), pase_mgr: RefCell::new(PaseMgr::new(epoch, rand)),
failsafe: RefCell::new(FailSafe::new()), failsafe: RefCell::new(FailSafe::new()),
persist_notification: Notification::new(),
mdns, mdns,
epoch, epoch,
rand, rand,
@ -157,6 +160,15 @@ impl<'a> Matter<'a> {
Ok(false) Ok(false)
} }
} }
pub fn notify_changed(&self) {
if self.is_changed() {
self.persist_notification.signal(());
}
}
pub async fn wait_changed(&self) {
self.persist_notification.wait().await
}
} }
impl<'a> Borrow<RefCell<FabricMgr>> for Matter<'a> { impl<'a> Borrow<RefCell<FabricMgr>> for Matter<'a> {

View file

@ -58,7 +58,6 @@ pub struct Transport<'a> {
matter: &'a Matter<'a>, matter: &'a Matter<'a>,
pub(crate) exchanges: RefCell<heapless::Vec<ExchangeCtx, MAX_EXCHANGES>>, pub(crate) exchanges: RefCell<heapless::Vec<ExchangeCtx, MAX_EXCHANGES>>,
pub(crate) send_notification: Notification, pub(crate) send_notification: Notification,
pub(crate) persist_notification: Notification,
pub session_mgr: RefCell<SessionMgr>, pub session_mgr: RefCell<SessionMgr>,
} }
@ -72,7 +71,6 @@ impl<'a> Transport<'a> {
matter, matter,
exchanges: RefCell::new(heapless::Vec::new()), exchanges: RefCell::new(heapless::Vec::new()),
send_notification: Notification::new(), send_notification: Notification::new(),
persist_notification: Notification::new(),
session_mgr: RefCell::new(SessionMgr::new(epoch, rand)), session_mgr: RefCell::new(SessionMgr::new(epoch, rand)),
} }
} }
@ -128,7 +126,7 @@ impl<'a> Transport<'a> {
} }
} }
self.notify_changed(); self.matter().notify_changed();
} }
} }
@ -142,7 +140,7 @@ impl<'a> Transport<'a> {
construction_notification, construction_notification,
}; };
self.notify_changed(); self.matter().notify_changed();
Ok(Some(constructor)) Ok(Some(constructor))
} else if src_rx.proto.proto_id == PROTO_ID_SECURE_CHANNEL } else if src_rx.proto.proto_id == PROTO_ID_SECURE_CHANNEL
@ -169,7 +167,7 @@ impl<'a> Transport<'a> {
} }
} }
self.notify_changed(); self.matter().notify_changed();
Ok(None) Ok(None)
} }
@ -232,7 +230,7 @@ impl<'a> Transport<'a> {
}); });
if let Some(ctx) = ctx { if let Some(ctx) = ctx {
self.notify_changed(); self.matter().notify_changed();
let state = &mut ctx.state; let state = &mut ctx.state;
@ -291,7 +289,7 @@ impl<'a> Transport<'a> {
dest_tx.log("Sending packet"); dest_tx.log("Sending packet");
self.pre_send(ctx, dest_tx)?; self.pre_send(ctx, dest_tx)?;
self.notify_changed(); self.matter().notify_changed();
return Ok(true); return Ok(true);
} }
@ -414,14 +412,4 @@ impl<'a> Transport<'a> {
) -> Option<&'r mut ExchangeCtx> { ) -> Option<&'r mut ExchangeCtx> {
exchanges.iter_mut().find(|exchange| exchange.id == *id) exchanges.iter_mut().find(|exchange| exchange.id == *id)
} }
pub fn notify_changed(&self) {
if self.matter().is_changed() {
self.persist_notification.signal(());
}
}
pub async fn wait_changed(&self) {
self.persist_notification.wait().await
}
} }

View file

@ -370,7 +370,7 @@ impl<'a> TransportRunner<'a> {
sc.handle(&mut exchange, &mut rx, &mut tx).await?; sc.handle(&mut exchange, &mut rx, &mut tx).await?;
transport.notify_changed(); transport.matter().notify_changed();
} }
PROTO_ID_INTERACTION_MODEL => { PROTO_ID_INTERACTION_MODEL => {
let dm = DataModel::new(handler); let dm = DataModel::new(handler);
@ -380,7 +380,7 @@ impl<'a> TransportRunner<'a> {
dm.handle(&mut exchange, &mut rx, &mut tx, &mut rx_status) dm.handle(&mut exchange, &mut rx, &mut tx, &mut rx_status)
.await?; .await?;
transport.notify_changed(); transport.matter().notify_changed();
} }
other => { other => {
error!("Unknown Proto-ID: {}", other); error!("Unknown Proto-ID: {}", other);