18
18
use core:: borrow:: Borrow ;
19
19
use core:: pin:: pin;
20
20
21
+ use embassy_futures:: select:: select3;
21
22
use log:: info;
22
23
use matter:: core:: { CommissioningData , Matter } ;
23
24
use matter:: data_model:: cluster_basic_information:: BasicInfoConfig ;
@@ -27,18 +28,18 @@ use matter::data_model::objects::*;
27
28
use matter:: data_model:: root_endpoint;
28
29
use matter:: data_model:: system_model:: descriptor;
29
30
use matter:: error:: Error ;
30
- use matter:: mdns:: MdnsService ;
31
- use matter:: persist:: FilePsm ;
31
+ use matter:: mdns:: { MdnsRunBuffers , MdnsService } ;
32
32
use matter:: secure_channel:: spake2p:: VerifierData ;
33
+ use matter:: transport:: core:: RunBuffers ;
33
34
use matter:: transport:: network:: { Ipv4Addr , Ipv6Addr , NetworkStack } ;
34
- use matter:: transport :: runner :: { AllUdpBuffers , TransportRunner } ;
35
+ use matter:: utils :: select :: EitherUnwrap ;
35
36
36
37
mod dev_att;
37
38
38
39
#[ cfg( feature = "std" ) ]
39
40
fn main ( ) -> Result < ( ) , Error > {
40
41
let thread = std:: thread:: Builder :: new ( )
41
- . stack_size ( 140 * 1024 )
42
+ . stack_size ( 150 * 1024 )
42
43
. spawn ( run)
43
44
. unwrap ( ) ;
44
45
@@ -56,11 +57,11 @@ fn run() -> Result<(), Error> {
56
57
initialize_logger ( ) ;
57
58
58
59
info ! (
59
- "Matter memory: mDNS={}, Matter={}, TransportRunner ={}, UdpBuffers ={}" ,
60
+ "Matter memory: mDNS={}, Matter={}, MdnsBuffers ={}, RunBuffers ={}" ,
60
61
core:: mem:: size_of:: <MdnsService >( ) ,
61
62
core:: mem:: size_of:: <Matter >( ) ,
62
- core:: mem:: size_of:: <TransportRunner >( ) ,
63
- core:: mem:: size_of:: <AllUdpBuffers >( ) ,
63
+ core:: mem:: size_of:: <MdnsRunBuffers >( ) ,
64
+ core:: mem:: size_of:: <RunBuffers >( ) ,
64
65
) ;
65
66
66
67
let dev_det = BasicInfoConfig {
@@ -73,12 +74,6 @@ fn run() -> Result<(), Error> {
73
74
device_name : "OnOff Light" ,
74
75
} ;
75
76
76
- let psm_path = std:: env:: temp_dir ( ) . join ( "matter-iot" ) ;
77
- info ! ( "Persisting from/to {}" , psm_path. display( ) ) ;
78
-
79
- #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
80
- let psm = matter:: persist:: FilePsm :: new ( psm_path) ?;
81
-
82
77
let ( ipv4_addr, ipv6_addr, interface) = initialize_network ( ) ?;
83
78
84
79
let dev_att = dev_att:: HardCodedDevAtt :: new ( ) ;
@@ -106,7 +101,7 @@ fn run() -> Result<(), Error> {
106
101
matter:: MATTER_PORT ,
107
102
) ;
108
103
109
- info ! ( "mDNS initialized: {:p}" , & mdns ) ;
104
+ info ! ( "mDNS initialized" ) ;
110
105
111
106
let matter = Matter :: new (
112
107
// vid/pid should match those in the DAC
@@ -118,53 +113,59 @@ fn run() -> Result<(), Error> {
118
113
matter:: MATTER_PORT ,
119
114
) ;
120
115
121
- info ! ( "Matter initialized: {:p}" , & matter ) ;
116
+ info ! ( "Matter initialized" ) ;
122
117
123
118
#[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
124
- {
125
- let mut buf = [ 0 ; 4096 ] ;
126
- let buf = & mut buf;
127
- if let Some ( data) = psm. load ( "acls" , buf) ? {
128
- matter. load_acls ( data) ?;
129
- }
130
-
131
- if let Some ( data) = psm. load ( "fabrics" , buf) ? {
132
- matter. load_fabrics ( data) ?;
133
- }
134
- }
135
-
136
- let mut runner = TransportRunner :: new ( & matter) ;
137
-
138
- info ! ( "Transport runner initialized: {:p}" , & runner) ;
119
+ let mut psm = matter:: persist:: Psm :: new ( & matter, std:: env:: temp_dir ( ) . join ( "matter-iot" ) ) ?;
139
120
140
121
let handler = HandlerCompat ( handler ( & matter) ) ;
141
122
142
- // NOTE (no_std): If using the `embassy-net` UDP implementation, replace this dummy stack with the `embassy-net` one
143
- // When using a custom UDP stack, remove this
123
+ // When using a custom UDP stack, remove the network stack initialization below
124
+ // and call `Matter::run_piped()` instead, by utilizing the TX & RX `Pipe` structs
125
+ // to push/pull your UDP packets from/to the Matter stack.
126
+ // Ditto for `MdnsService`.
127
+ //
128
+ // When using the `embassy-net` feature (as opposed to the Rust Standard Library network stack),
129
+ // this initialization would be more complex.
144
130
let stack = NetworkStack :: new ( ) ;
145
131
146
- let mut buffers = AllUdpBuffers :: new ( ) ;
132
+ let mut mdns_buffers = MdnsRunBuffers :: new ( ) ;
133
+ let mut mdns_runner = pin ! ( mdns. run( & stack, & mut mdns_buffers) ) ;
147
134
148
- let mut fut = pin ! ( runner. run_udp_all(
135
+ let mut buffers = RunBuffers :: new ( ) ;
136
+ let mut runner = matter. run (
149
137
& stack,
150
- & mdns,
151
138
& mut buffers,
152
139
CommissioningData {
153
140
// TODO: Hard-coded for now
154
141
verifier : VerifierData :: new_with_pw ( 123456 , * matter. borrow ( ) ) ,
155
142
discriminator : 250 ,
156
143
} ,
157
144
& handler,
158
- ) ) ;
145
+ ) ;
146
+
147
+ info ! (
148
+ "Matter transport runner memory: {}" ,
149
+ core:: mem:: size_of_val( & runner)
150
+ ) ;
151
+
152
+ let mut runner = pin ! ( runner) ;
153
+
154
+ #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
155
+ let mut psm_runner = pin ! ( psm. run( ) ) ;
156
+
157
+ #[ cfg( not( all( feature = "std" , not( target_os = "espidf" ) ) ) ) ]
158
+ let mut psm_runner = pin ! ( core:: future:: pending( ) ) ;
159
+
160
+ let mut runner = select3 ( & mut runner, & mut mdns_runner, & mut psm_runner) ;
159
161
160
- // NOTE: For no_std, replace with your own no_std way of polling the future
161
162
#[ cfg( feature = "std" ) ]
162
- async_io:: block_on ( & mut fut ) ?;
163
+ async_io:: block_on ( & mut runner ) . unwrap ( ) ?;
163
164
164
165
// NOTE (no_std): For no_std, replace with your own more efficient no_std executor,
165
166
// because the executor used below is a simple busy-loop poller
166
167
#[ cfg( not( feature = "std" ) ) ]
167
- embassy_futures:: block_on ( & mut fut ) ?;
168
+ embassy_futures:: block_on ( & mut runner ) . unwrap ( ) ?;
168
169
169
170
Ok ( ( ) )
170
171
}
@@ -268,26 +269,6 @@ fn initialize_network() -> Result<(Ipv4Addr, Ipv6Addr, u32), Error> {
268
269
Ok ( ( ip, ipv6, 0 as _ ) )
269
270
}
270
271
271
- #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
272
- #[ inline( never) ]
273
- async fn save ( matter : & Matter < ' _ > , psm : & FilePsm ) -> Result < ( ) , Error > {
274
- let mut buf = [ 0 ; 4096 ] ;
275
- let buf = & mut buf;
276
-
277
- loop {
278
- matter. wait_changed ( ) . await ;
279
- if matter. is_changed ( ) {
280
- if let Some ( data) = matter. store_acls ( buf) ? {
281
- psm. store ( "acls" , data) ?;
282
- }
283
-
284
- if let Some ( data) = matter. store_fabrics ( buf) ? {
285
- psm. store ( "fabrics" , data) ?;
286
- }
287
- }
288
- }
289
- }
290
-
291
272
#[ cfg( target_os = "espidf" ) ]
292
273
#[ inline( never) ]
293
274
fn initialize_logger ( ) {
0 commit comments