@@ -23,28 +23,23 @@ use log::info;
23
23
use matter:: core:: { CommissioningData , Matter } ;
24
24
use matter:: data_model:: cluster_basic_information:: BasicInfoConfig ;
25
25
use matter:: data_model:: cluster_on_off;
26
- use matter:: data_model:: core:: DataModel ;
27
26
use matter:: data_model:: device_types:: DEV_TYPE_ON_OFF_LIGHT ;
28
27
use matter:: data_model:: objects:: * ;
29
28
use matter:: data_model:: root_endpoint;
30
29
use matter:: data_model:: system_model:: descriptor;
31
30
use matter:: error:: Error ;
32
- use matter:: interaction_model:: core:: InteractionModel ;
33
31
use matter:: mdns:: { DefaultMdns , DefaultMdnsRunner } ;
34
32
use matter:: secure_channel:: spake2p:: VerifierData ;
35
- use matter:: transport:: network:: { Address , IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr } ;
36
- use matter:: transport:: {
37
- core:: RecvAction , core:: Transport , packet:: MAX_RX_BUF_SIZE , packet:: MAX_TX_BUF_SIZE ,
38
- udp:: UdpListener ,
39
- } ;
33
+ use matter:: transport:: network:: { Ipv4Addr , Ipv6Addr } ;
34
+ use matter:: transport:: runner:: { RxBuf , TransportRunner , TxBuf } ;
40
35
use matter:: utils:: select:: EitherUnwrap ;
41
36
42
37
mod dev_att;
43
38
44
39
#[ cfg( feature = "std" ) ]
45
40
fn main ( ) -> Result < ( ) , Error > {
46
41
let thread = std:: thread:: Builder :: new ( )
47
- . stack_size ( 120 * 1024 )
42
+ . stack_size ( 140 * 1024 )
48
43
. spawn ( run)
49
44
. unwrap ( ) ;
50
45
@@ -62,10 +57,10 @@ fn run() -> Result<(), Error> {
62
57
initialize_logger ( ) ;
63
58
64
59
info ! (
65
- "Matter memory: mDNS={}, Matter={}, Transport ={}" ,
60
+ "Matter memory: mDNS={}, Matter={}, TransportRunner ={}" ,
66
61
core:: mem:: size_of:: <DefaultMdns >( ) ,
67
62
core:: mem:: size_of:: <Matter >( ) ,
68
- core:: mem:: size_of:: <Transport >( ) ,
63
+ core:: mem:: size_of:: <TransportRunner >( ) ,
69
64
) ;
70
65
71
66
let dev_det = BasicInfoConfig {
@@ -92,6 +87,8 @@ fn run() -> Result<(), Error> {
92
87
93
88
let mut mdns_runner = DefaultMdnsRunner :: new ( & mdns) ;
94
89
90
+ info ! ( "mDNS initialized: {:p}, {:p}" , & mdns, & mdns_runner) ;
91
+
95
92
let dev_att = dev_att:: HardCodedDevAtt :: new ( ) ;
96
93
97
94
#[ cfg( feature = "std" ) ]
@@ -118,36 +115,25 @@ fn run() -> Result<(), Error> {
118
115
matter:: MATTER_PORT ,
119
116
) ;
120
117
121
- let psm_path = std:: env:: temp_dir ( ) . join ( "matter-iot" ) ;
122
- info ! ( "Persisting from/to {}" , psm_path. display( ) ) ;
123
-
124
- #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
125
- let psm = matter:: persist:: FilePsm :: new ( psm_path) ?;
118
+ info ! ( "Matter initialized: {:p}" , & matter) ;
126
119
127
- let mut buf = [ 0 ; 4096 ] ;
128
- let buf = & mut buf;
120
+ let mut runner = TransportRunner :: new ( & matter) ;
129
121
130
- #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
131
- {
132
- if let Some ( data) = psm. load ( "acls" , buf) ? {
133
- matter. load_acls ( data) ?;
134
- }
122
+ info ! ( "Transport Runner initialized: {:p}" , & runner) ;
135
123
136
- if let Some ( data) = psm. load ( "fabrics" , buf) ? {
137
- matter. load_fabrics ( data) ?;
138
- }
139
- }
124
+ let mut tx_buf = TxBuf :: uninit ( ) ;
125
+ let mut rx_buf = RxBuf :: uninit ( ) ;
140
126
141
- let mut transport = Transport :: new ( & matter) ;
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
+ // }
142
132
143
- transport. start (
144
- CommissioningData {
145
- // TODO: Hard-coded for now
146
- verifier : VerifierData :: new_with_pw ( 123456 , * matter. borrow ( ) ) ,
147
- discriminator : 250 ,
148
- } ,
149
- buf,
150
- ) ?;
133
+ // if let Some(data) = psm.load("fabrics", buf)? {
134
+ // matter.load_fabrics(data)?;
135
+ // }
136
+ // }
151
137
152
138
let node = Node {
153
139
id : 0 ,
@@ -161,69 +147,48 @@ fn run() -> Result<(), Error> {
161
147
] ,
162
148
} ;
163
149
164
- let mut handler = handler ( & matter) ;
150
+ let handler = HandlerCompat ( handler ( & matter) ) ;
165
151
166
- let mut im = InteractionModel ( DataModel :: new ( matter. borrow ( ) , & node, & mut handler) ) ;
167
-
168
- let mut rx_buf = [ 0 ; MAX_RX_BUF_SIZE ] ;
169
- let mut tx_buf = [ 0 ; MAX_TX_BUF_SIZE ] ;
170
-
171
- let im = & mut im;
172
- let mdns_runner = & mut mdns_runner;
173
- let transport = & mut transport;
174
- let rx_buf = & mut rx_buf;
152
+ let matter = & matter;
153
+ let node = & node;
154
+ let handler = & handler;
155
+ let runner = & mut runner;
175
156
let tx_buf = & mut tx_buf;
157
+ let rx_buf = & mut rx_buf;
176
158
177
- let mut io_fut = pin ! ( async move {
178
- // NOTE (no_std): On no_std, the `UdpListener` implementation is a no-op so you might want to
179
- // replace it with your own UDP stack
180
- let udp = UdpListener :: new( SocketAddr :: new(
181
- IpAddr :: V6 ( Ipv6Addr :: UNSPECIFIED ) ,
182
- matter:: MATTER_PORT ,
183
- ) )
184
- . await ?;
185
-
186
- loop {
187
- let ( len, addr) = udp. recv( rx_buf) . await ?;
188
-
189
- let mut completion = transport. recv( Address :: Udp ( addr) , & mut rx_buf[ ..len] , tx_buf) ;
190
-
191
- while let Some ( action) = completion. next_action( ) ? {
192
- match action {
193
- RecvAction :: Send ( addr, buf) => {
194
- udp. send( addr. unwrap_udp( ) , buf) . await ?;
195
- }
196
- RecvAction :: Interact ( mut ctx) => {
197
- if im. handle( & mut ctx) ? && ctx. send( ) ? {
198
- udp. send( ctx. tx. peer. unwrap_udp( ) , ctx. tx. as_slice( ) )
199
- . await ?;
200
- }
201
- }
202
- }
203
- }
204
-
205
- #[ cfg( all( feature = "std" , not( target_os = "espidf" ) ) ) ]
206
- {
207
- if let Some ( data) = transport. matter( ) . store_fabrics( buf) ? {
208
- psm. store( "fabrics" , data) ?;
209
- }
210
-
211
- if let Some ( data) = transport. matter( ) . store_acls( buf) ? {
212
- psm. store( "acls" , data) ?;
213
- }
214
- }
215
- }
216
-
217
- #[ allow( unreachable_code) ]
218
- Ok :: <_, matter:: error:: Error >( ( ) )
219
- } ) ;
159
+ info ! (
160
+ "About to run wth node {:p}, handler {:p}, transport runner {:p}, mdns_runner {:p}" ,
161
+ node, handler, runner, & mdns_runner
162
+ ) ;
163
+
164
+ let mut fut = pin ! ( async move {
165
+ // NOTE (no_std): On no_std, the `run_udp` is a no-op so you might want to replace it with `run` and
166
+ // connect the pipes of the `run` method with your own UDP stack
167
+ let mut transport = pin!( runner. run_udp(
168
+ tx_buf,
169
+ rx_buf,
170
+ CommissioningData {
171
+ // TODO: Hard-coded for now
172
+ verifier: VerifierData :: new_with_pw( 123456 , * matter. borrow( ) ) ,
173
+ discriminator: 250 ,
174
+ } ,
175
+ & handler,
176
+ ) ) ;
220
177
221
- // NOTE (no_std): On no_std, the `run_udp` is a no-op so you might want to replace it with `run` and
222
- // connect the pipes of the `run` method with your own UDP stack
223
- let mut mdns_fut = pin ! ( async move { mdns_runner. run_udp( ) . await } ) ;
178
+ // NOTE (no_std): On no_std, the `run_udp` is a no-op so you might want to replace it with `run` and
179
+ // connect the pipes of the `run` method with your own UDP stack
180
+ let mut mdns = pin!( mdns_runner. run_udp( ) ) ;
224
181
225
- let mut fut = pin ! ( async move { select( & mut io_fut, & mut mdns_fut) . await . unwrap( ) } ) ;
182
+ select(
183
+ & mut transport,
184
+ & mut mdns,
185
+ //save(transport, &psm),
186
+ )
187
+ . await
188
+ . unwrap( )
189
+ } ) ;
226
190
191
+ // NOTE: For no_std, replace with your own no_std way of polling the future
227
192
#[ cfg( feature = "std" ) ]
228
193
smol:: block_on ( & mut fut) ?;
229
194
@@ -235,18 +200,33 @@ fn run() -> Result<(), Error> {
235
200
Ok ( ( ) )
236
201
}
237
202
238
- fn handler < ' a > ( matter : & ' a Matter < ' a > ) -> impl Handler + ' a {
239
- root_endpoint:: handler ( 0 , matter)
240
- . chain (
241
- 1 ,
242
- descriptor:: ID ,
243
- descriptor:: DescriptorCluster :: new ( * matter. borrow ( ) ) ,
244
- )
245
- . chain (
246
- 1 ,
247
- cluster_on_off:: ID ,
248
- cluster_on_off:: OnOffCluster :: new ( * matter. borrow ( ) ) ,
249
- )
203
+ const NODE : Node < ' static > = Node {
204
+ id : 0 ,
205
+ endpoints : & [
206
+ root_endpoint:: endpoint ( 0 ) ,
207
+ Endpoint {
208
+ id : 1 ,
209
+ device_type : DEV_TYPE_ON_OFF_LIGHT ,
210
+ clusters : & [ descriptor:: CLUSTER , cluster_on_off:: CLUSTER ] ,
211
+ } ,
212
+ ] ,
213
+ } ;
214
+
215
+ fn handler < ' a > ( matter : & ' a Matter < ' a > ) -> impl Metadata + NonBlockingHandler + ' a {
216
+ (
217
+ NODE ,
218
+ root_endpoint:: handler ( 0 , matter)
219
+ . chain (
220
+ 1 ,
221
+ descriptor:: ID ,
222
+ descriptor:: DescriptorCluster :: new ( * matter. borrow ( ) ) ,
223
+ )
224
+ . chain (
225
+ 1 ,
226
+ cluster_on_off:: ID ,
227
+ cluster_on_off:: OnOffCluster :: new ( * matter. borrow ( ) ) ,
228
+ ) ,
229
+ )
250
230
}
251
231
252
232
// NOTE (no_std): For no_std, implement here your own way of initializing the logger
0 commit comments