@@ -411,49 +411,51 @@ static void internal_tx_handler(void)
411
411
}
412
412
}
413
413
414
- static int transport_init (nrf_rpc_tr_receive_handler_t receive_cb )
414
+ static int transport_init_single (nrf_rpc_tr_receive_handler_t receive_cb , const struct nrf_rpc_group * group )
415
415
{
416
- int err = 0 ;
417
- void * iter ;
418
- const struct nrf_rpc_group * group ;
416
+ const struct nrf_rpc_tr * transport = group -> transport ;
417
+ struct nrf_rpc_group_data * data = group -> data ;
418
+ int err ;
419
419
420
- for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
421
- const struct nrf_rpc_group )) {
422
- const struct nrf_rpc_tr * transport = group -> transport ;
423
- struct nrf_rpc_group_data * data = group -> data ;
420
+ NRF_RPC_ASSERT (transport != NULL );
424
421
425
- NRF_RPC_ASSERT (transport != NULL );
422
+ if (group -> data -> transport_initialized ) {
423
+ return 0 ;
424
+ }
426
425
427
- /* Initialize all dependencies of `receive_handler` before calling the transport
428
- * init to avoid possible data race if `receive_handler` was invoked before this
429
- * function was completed. */
430
- if (auto_free_rx_buf (transport )) {
431
- err = nrf_rpc_os_event_init (& data -> decode_done_event );
432
- if (err < 0 ) {
433
- continue ;
434
- }
426
+ /* Initialize all dependencies of `receive_handler` before calling the transport
427
+ * init to avoid possible data race if `receive_handler` was invoked before this
428
+ * function was completed. */
429
+ if (auto_free_rx_buf (transport )) {
430
+ err = nrf_rpc_os_event_init (& data -> decode_done_event );
431
+ if (err < 0 ) {
432
+ return err ;
435
433
}
434
+ }
436
435
437
- err = transport -> api -> init (transport , receive_cb , NULL );
438
- if (err ) {
439
- NRF_RPC_ERR ("Failed to initialize transport, err: %d" , err );
440
- continue ;
441
- }
436
+ err = transport -> api -> init (transport , receive_cb , NULL );
437
+ if (err ) {
438
+ NRF_RPC_ERR ("Failed to initialize transport, err: %d" , err );
439
+ return err ;
440
+ }
442
441
443
- group -> data -> transport_initialized = true;
442
+ group -> data -> transport_initialized = true;
444
443
445
- if (group -> flags & NRF_RPC_FLAGS_INITIATOR ) {
446
- err = group_init_send (group );
447
- if (err ) {
448
- NRF_RPC_ERR ("Failed to send group init packet for group id: %d strid: %s err: %d" ,
449
- data -> src_group_id , group -> strid , err );
450
- continue ;
451
- }
444
+ if (group -> flags & NRF_RPC_FLAGS_INITIATOR ) {
445
+ err = group_init_send (group );
446
+ if (err ) {
447
+ NRF_RPC_ERR ("Failed to send group init packet for group id: %d strid: %s err: %d" ,
448
+ data -> src_group_id , group -> strid , err );
449
+ return err ;
452
450
}
453
451
}
454
452
455
- /* Group initialization errors are not propagated to the caller. */
456
- err = 0 ;
453
+ return 0 ;
454
+ }
455
+
456
+ static int groups_init_event_wait (void )
457
+ {
458
+ int err = 0 ;
457
459
458
460
if (waiting_group_count > 0 ) {
459
461
err = nrf_rpc_os_event_wait (& groups_init_event , CONFIG_NRF_RPC_GROUP_INIT_WAIT_TIME );
@@ -465,6 +467,27 @@ static int transport_init(nrf_rpc_tr_receive_handler_t receive_cb)
465
467
return err ;
466
468
}
467
469
470
+ static int transport_init_all (nrf_rpc_tr_receive_handler_t receive_cb )
471
+ {
472
+ void * iter ;
473
+ const struct nrf_rpc_group * group ;
474
+
475
+ for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
476
+ const struct nrf_rpc_group )) {
477
+
478
+ transport_init_single (receive_cb , group );
479
+ }
480
+
481
+ /* Group initialization errors are not propagated to the caller. */
482
+ return groups_init_event_wait ();
483
+ }
484
+
485
+ static void default_err_handler (const struct nrf_rpc_err_report * report )
486
+ {
487
+ NRF_RPC_ERR ("nRF RPC error %d ocurred. See nRF RPC logs for more details" , report -> code );
488
+ nrf_rpc_os_fatal_error ();
489
+ }
490
+
468
491
/* ======================== Receiving Packets ======================== */
469
492
470
493
/* Find in array and execute command or event handler */
@@ -1098,23 +1121,18 @@ void nrf_rpc_set_bound_handler(nrf_rpc_group_bound_handler_t bound_handler)
1098
1121
global_bound_handler = bound_handler ;
1099
1122
}
1100
1123
1101
- int nrf_rpc_init ( nrf_rpc_err_handler_t err_handler )
1124
+ static int nrf_rpc_prepare_init ( void )
1102
1125
{
1103
1126
int err ;
1104
- int i ;
1105
1127
void * iter ;
1106
1128
const struct nrf_rpc_group * group ;
1107
1129
uint8_t group_id = 0 ;
1108
1130
uint8_t wait_count = 0 ;
1109
1131
1110
- NRF_RPC_DBG ("Initializing nRF RPC module" );
1111
-
1112
1132
if (is_initialized ) {
1113
1133
return 0 ;
1114
1134
}
1115
1135
1116
- global_err_handler = err_handler ;
1117
-
1118
1136
for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
1119
1137
const struct nrf_rpc_group )) {
1120
1138
struct nrf_rpc_group_data * data = group -> data ;
@@ -1151,20 +1169,82 @@ int nrf_rpc_init(nrf_rpc_err_handler_t err_handler)
1151
1169
return err ;
1152
1170
}
1153
1171
1154
- for (i = 0 ; i < CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ; i ++ ) {
1172
+ for (size_t i = 0 ; i < CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ; i ++ ) {
1155
1173
cmd_ctx_pool [i ].id = i ;
1156
1174
err = nrf_rpc_os_msg_init (& cmd_ctx_pool [i ].recv_msg );
1157
1175
if (err < 0 ) {
1158
1176
return err ;
1159
1177
}
1160
1178
}
1161
1179
1162
- err = transport_init (receive_handler );
1180
+ global_err_handler = default_err_handler ;
1181
+
1182
+ is_initialized = true;
1183
+
1184
+ return 0 ;
1185
+ }
1186
+
1187
+ static bool all_groups_transport_finished (void ){
1188
+ void * iter ;
1189
+ const struct nrf_rpc_group * group ;
1190
+
1191
+ for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
1192
+ const struct nrf_rpc_group )) {
1193
+ if (!group -> data -> transport_initialized ) {
1194
+ return false;
1195
+ }
1196
+ }
1197
+
1198
+ return true;
1199
+ }
1200
+
1201
+ int nrf_rpc_init_group (const struct nrf_rpc_group * group )
1202
+ {
1203
+ int err = nrf_rpc_prepare_init ();
1204
+ if (err < 0 ) {
1205
+ return err ;
1206
+ }
1207
+
1208
+ err = transport_init_single (receive_handler , group );
1209
+ if (err < 0 ) {
1210
+ return err ;
1211
+ }
1212
+
1213
+ /* If all the groups have the their transport initialized this is the last call
1214
+ * to nrf_rpc_init_group.
1215
+ */
1216
+ if (all_groups_transport_finished ()) {
1217
+ return groups_init_event_wait ();
1218
+ }
1219
+
1220
+ return 0 ;
1221
+ }
1222
+
1223
+ int nrf_rpc_init (nrf_rpc_err_handler_t err_handler )
1224
+ {
1225
+ int err ;
1226
+
1227
+ /* Everything is initialized, nothing to do here */
1228
+ if (group_count > 0 && group_count == initialized_group_count ) {
1229
+ return 0 ;
1230
+ }
1231
+
1232
+ NRF_RPC_DBG ("Initializing nRF RPC module" );
1233
+
1234
+ err = nrf_rpc_prepare_init ();
1235
+ if (err < 0 ) {
1236
+ return err ;
1237
+ }
1238
+
1239
+ /* The nrf_rpc_prepare_init sets a default error handler,
1240
+ * override it here with the one passed as parameter */
1241
+ global_err_handler = err_handler ;
1242
+
1243
+ err = transport_init_all (receive_handler );
1163
1244
if (err < 0 ) {
1164
1245
return err ;
1165
1246
}
1166
1247
1167
- is_initialized = true;
1168
1248
NRF_RPC_DBG ("Done initializing nRF RPC module" );
1169
1249
1170
1250
return err ;
0 commit comments