@@ -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
+ k_oops ();
489
+ }
490
+
468
491
/* ======================== Receiving Packets ======================== */
469
492
470
493
/* Find in array and execute command or event handler */
@@ -1091,23 +1114,18 @@ void nrf_rpc_set_bound_handler(nrf_rpc_group_bound_handler_t bound_handler)
1091
1114
global_bound_handler = bound_handler ;
1092
1115
}
1093
1116
1094
- int nrf_rpc_init ( nrf_rpc_err_handler_t err_handler )
1117
+ static int nrf_rpc_prepare_init ( void )
1095
1118
{
1096
1119
int err ;
1097
- int i ;
1098
1120
void * iter ;
1099
1121
const struct nrf_rpc_group * group ;
1100
1122
uint8_t group_id = 0 ;
1101
1123
uint8_t wait_count = 0 ;
1102
1124
1103
- NRF_RPC_DBG ("Initializing nRF RPC module" );
1104
-
1105
1125
if (is_initialized ) {
1106
1126
return 0 ;
1107
1127
}
1108
1128
1109
- global_err_handler = err_handler ;
1110
-
1111
1129
for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
1112
1130
const struct nrf_rpc_group )) {
1113
1131
struct nrf_rpc_group_data * data = group -> data ;
@@ -1144,20 +1162,66 @@ int nrf_rpc_init(nrf_rpc_err_handler_t err_handler)
1144
1162
return err ;
1145
1163
}
1146
1164
1147
- for (i = 0 ; i < CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ; i ++ ) {
1165
+ for (size_t i = 0 ; i < CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ; i ++ ) {
1148
1166
cmd_ctx_pool [i ].id = i ;
1149
1167
err = nrf_rpc_os_msg_init (& cmd_ctx_pool [i ].recv_msg );
1150
1168
if (err < 0 ) {
1151
1169
return err ;
1152
1170
}
1153
1171
}
1154
1172
1155
- err = transport_init (receive_handler );
1173
+ global_err_handler = default_err_handler ;
1174
+
1175
+ is_initialized = true;
1176
+
1177
+ return 0 ;
1178
+ }
1179
+
1180
+ int nrf_rpc_init_group (const struct nrf_rpc_group * group )
1181
+ {
1182
+ int err = nrf_rpc_prepare_init ();
1183
+ if (err < 0 ) {
1184
+ return err ;
1185
+ }
1186
+
1187
+ err = transport_init_single (receive_handler , group );
1188
+ if (err < 0 ) {
1189
+ return err ;
1190
+ }
1191
+
1192
+ NRF_RPC_ASSERT (group_count > 0 );
1193
+ if (initialized_group_count == group_count - 1 ) {
1194
+ return groups_init_event_wait ();
1195
+ }
1196
+
1197
+ return 0 ;
1198
+ }
1199
+
1200
+ int nrf_rpc_init (nrf_rpc_err_handler_t err_handler )
1201
+ {
1202
+ int err ;
1203
+
1204
+ /* Everything is initialized, nothing to do here */
1205
+ if (group_count > 0 && group_count == initialized_group_count ) {
1206
+ return 0 ;
1207
+ }
1208
+
1209
+ NRF_RPC_DBG ("Initializing nRF RPC module" );
1210
+
1211
+ err = nrf_rpc_prepare_init ();
1212
+ if (err < 0 ) {
1213
+ return err ;
1214
+ }
1215
+
1216
+ /* The nrf_rpc_prepare_init sets a default error handler,
1217
+ * override it here with the one passed as parameter */
1218
+ global_err_handler = err_handler ;
1219
+
1220
+ err = transport_init_all (receive_handler );
1156
1221
if (err < 0 ) {
1157
1222
return err ;
1158
1223
}
1159
1224
1160
- is_initialized = true;
1161
1225
NRF_RPC_DBG ("Done initializing nRF RPC module" );
1162
1226
1163
1227
return err ;
0 commit comments