18
18
use core:: borrow:: Borrow ;
19
19
use core:: pin:: pin;
20
20
21
- use embassy_futures:: select:: select ;
21
+ use embassy_futures:: select:: select3 ;
22
22
use log:: info;
23
23
use matter:: core:: { CommissioningData , Matter } ;
24
24
use matter:: data_model:: cluster_basic_information:: BasicInfoConfig ;
@@ -29,6 +29,7 @@ use matter::data_model::root_endpoint;
29
29
use matter:: data_model:: system_model:: descriptor;
30
30
use matter:: error:: Error ;
31
31
use matter:: mdns:: { DefaultMdns , DefaultMdnsRunner } ;
32
+ use matter:: persist:: FilePsm ;
32
33
use matter:: secure_channel:: spake2p:: VerifierData ;
33
34
use matter:: transport:: network:: { Ipv4Addr , Ipv6Addr } ;
34
35
use matter:: transport:: runner:: { RxBuf , TransportRunner , TxBuf } ;
@@ -73,6 +74,12 @@ fn run() -> Result<(), Error> {
73
74
device_name : "OnOff Light" ,
74
75
} ;
75
76
77
+ let psm_path = std:: env:: temp_dir ( ) . join ( "matter-iot" ) ;
78
+ info ! ( "Persisting from/to {}" , psm_path. display( ) ) ;
79
+
80
+ #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
81
+ let psm = matter:: persist:: FilePsm :: new ( psm_path) ?;
82
+
76
83
let ( ipv4_addr, ipv6_addr, interface) = initialize_network ( ) ?;
77
84
78
85
let mdns = DefaultMdns :: new (
@@ -124,16 +131,18 @@ fn run() -> Result<(), Error> {
124
131
let mut tx_buf = TxBuf :: uninit ( ) ;
125
132
let mut rx_buf = RxBuf :: uninit ( ) ;
126
133
127
- // #[cfg(all(feature = "std", not(target_os = "espidf")))]
128
- // {
129
- // if let Some(data) = psm.load("acls", buf)? {
130
- // matter.load_acls(data)?;
131
- // }
132
-
133
- // if let Some(data) = psm.load("fabrics", buf)? {
134
- // matter.load_fabrics(data)?;
135
- // }
136
- // }
134
+ #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
135
+ {
136
+ let mut buf = [ 0 ; 4096 ] ;
137
+ let buf = & mut buf;
138
+ if let Some ( data) = psm. load ( "acls" , buf) ? {
139
+ matter. load_acls ( data) ?;
140
+ }
141
+
142
+ if let Some ( data) = psm. load ( "fabrics" , buf) ? {
143
+ matter. load_fabrics ( data) ?;
144
+ }
145
+ }
137
146
138
147
let node = Node {
139
148
id : 0 ,
@@ -179,13 +188,8 @@ fn run() -> Result<(), Error> {
179
188
// connect the pipes of the `run` method with your own UDP stack
180
189
let mut mdns = pin!( mdns_runner. run_udp( ) ) ;
181
190
182
- select(
183
- & mut transport,
184
- & mut mdns,
185
- //save(transport, &psm),
186
- )
187
- . await
188
- . unwrap( )
191
+ let mut save = pin!( save( matter, & psm) ) ;
192
+ select3( & mut transport, & mut mdns, & mut save) . await . unwrap( )
189
193
} ) ;
190
194
191
195
// 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> {
299
303
Ok ( ( ip, ipv6, 0 as _ ) )
300
304
}
301
305
306
+ #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
307
+ #[ inline( never) ]
308
+ async fn save ( matter : & Matter < ' _ > , psm : & FilePsm ) -> Result < ( ) , Error > {
309
+ let mut buf = [ 0 ; 4096 ] ;
310
+ let buf = & mut buf;
311
+
312
+ loop {
313
+ matter. wait_changed ( ) . await ;
314
+ if matter. is_changed ( ) {
315
+ if let Some ( data) = matter. store_acls ( buf) ? {
316
+ psm. store ( "acls" , data) ?;
317
+ }
318
+
319
+ if let Some ( data) = matter. store_fabrics ( buf) ? {
320
+ psm. store ( "fabrics" , data) ?;
321
+ }
322
+ }
323
+ }
324
+ }
325
+
302
326
#[ cfg( target_os = "espidf" ) ]
303
327
#[ inline( never) ]
304
328
fn initialize_logger ( ) {
0 commit comments