@@ -419,48 +419,6 @@ static void internal_tx_handler(void)
419419 }
420420}
421421
422- static int transport_init (nrf_rpc_tr_receive_handler_t receive_cb )
423- {
424- int err = 0 ;
425- void * iter ;
426- const struct nrf_rpc_group * group ;
427-
428- for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
429- const struct nrf_rpc_group )) {
430- const struct nrf_rpc_tr * transport = group -> transport ;
431- struct nrf_rpc_group_data * data = group -> data ;
432-
433- err = transport -> api -> init (transport , receive_cb , NULL );
434- if (err ) {
435- NRF_RPC_ERR ("Failed to initialize transport, err: %d" , err );
436- continue ;
437- }
438-
439- group -> data -> transport_initialized = true;
440-
441- if (group -> flags & NRF_RPC_FLAGS_INITIATOR ) {
442- err = group_init_send (group );
443- if (err ) {
444- NRF_RPC_ERR ("Failed to send group init packet for group id: %d strid: %s err: %d" ,
445- data -> src_group_id , group -> strid , err );
446- continue ;
447- }
448- }
449- }
450-
451- /* Group initialization errors are not propagated to the caller. */
452- err = 0 ;
453-
454- if (waiting_group_count > 0 ) {
455- err = nrf_rpc_os_event_wait (& groups_init_event , CONFIG_NRF_RPC_GROUP_INIT_WAIT_TIME );
456- if (err ) {
457- NRF_RPC_ERR ("Not all groups are ready to use." );
458- }
459- }
460-
461- return err ;
462- }
463-
464422/* ======================== Receiving Packets ======================== */
465423
466424/* Find in array and execute command or event handler */
@@ -1143,10 +1101,9 @@ void nrf_rpc_set_bound_handler(nrf_rpc_group_bound_handler_t bound_handler)
11431101 global_bound_handler = bound_handler ;
11441102}
11451103
1146- int nrf_rpc_init (nrf_rpc_err_handler_t err_handler )
1104+ int nrf_rpc_setup (nrf_rpc_err_handler_t err_handler , nrf_rpc_group_bound_handler_t bound_handler )
11471105{
11481106 int err ;
1149- int i ;
11501107 void * iter ;
11511108 const struct nrf_rpc_group * group ;
11521109 uint8_t group_id = 0 ;
@@ -1161,6 +1118,7 @@ int nrf_rpc_init(nrf_rpc_err_handler_t err_handler)
11611118 nrf_rpc_os_mutex_init (& cleanup_mutex );
11621119
11631120 global_err_handler = err_handler ;
1121+ global_bound_handler = bound_handler ;
11641122
11651123 for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
11661124 const struct nrf_rpc_group )) {
@@ -1194,8 +1152,6 @@ int nrf_rpc_init(nrf_rpc_err_handler_t err_handler)
11941152 group_count = group_id ;
11951153 waiting_group_count = wait_count ;
11961154
1197- memset (& cmd_ctx_pool , 0 , sizeof (cmd_ctx_pool ));
1198-
11991155 err = nrf_rpc_os_init (execute_packet );
12001156 if (err < 0 ) {
12011157 return err ;
@@ -1211,7 +1167,7 @@ int nrf_rpc_init(nrf_rpc_err_handler_t err_handler)
12111167 return err ;
12121168 }
12131169
1214- for (i = 0 ; i < CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ; i ++ ) {
1170+ for (int i = 0 ; i < CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ; i ++ ) {
12151171 cmd_ctx_pool [i ].id = i ;
12161172 err = nrf_rpc_os_mutex_init (& cmd_ctx_pool [i ].mutex );
12171173 if (err < 0 ) {
@@ -1223,17 +1179,85 @@ int nrf_rpc_init(nrf_rpc_err_handler_t err_handler)
12231179 }
12241180 }
12251181
1226- err = transport_init (receive_handler );
1227- if (err < 0 ) {
1228- return err ;
1229- }
1230-
12311182 is_initialized = true;
12321183 NRF_RPC_DBG ("Done initializing nRF RPC module" );
12331184
12341185 return err ;
12351186}
12361187
1188+ int nrf_rpc_bind (void )
1189+ {
1190+ int err ;
1191+ void * iter ;
1192+ const struct nrf_rpc_group * group ;
1193+
1194+ for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array , const struct nrf_rpc_group )) {
1195+ const struct nrf_rpc_tr * transport = group -> transport ;
1196+ struct nrf_rpc_group_data * data = group -> data ;
1197+
1198+ if (!group -> data -> transport_initialized ) {
1199+ err = transport -> api -> init (transport , receive_handler , NULL );
1200+ if (err ) {
1201+ NRF_RPC_ERR ("Failed to initialize transport, err: %d" , err );
1202+ continue ;
1203+ }
1204+
1205+ group -> data -> transport_initialized = true;
1206+ }
1207+
1208+ if (group -> flags & NRF_RPC_FLAGS_INITIATOR ) {
1209+ err = group_init_send (group );
1210+ if (err ) {
1211+ NRF_RPC_ERR ("Failed to send group init packet for group id: %d "
1212+ "strid: %s err: %d" ,
1213+ data -> src_group_id , group -> strid , err );
1214+ continue ;
1215+ }
1216+ }
1217+ }
1218+
1219+ /* Group initialization errors are not propagated to the caller. */
1220+ err = 0 ;
1221+
1222+ if (waiting_group_count > 0 ) {
1223+ err = nrf_rpc_os_event_wait (& groups_init_event ,
1224+ CONFIG_NRF_RPC_GROUP_INIT_WAIT_TIME );
1225+ if (err ) {
1226+ NRF_RPC_ERR ("Not all groups are ready to use." );
1227+ }
1228+ }
1229+
1230+ return err ;
1231+ }
1232+
1233+ void nrf_rpc_unbind (void )
1234+ {
1235+ void * iter ;
1236+ const struct nrf_rpc_group * group ;
1237+
1238+ initialized_group_count = 0 ;
1239+
1240+ for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array , const struct nrf_rpc_group )) {
1241+ group -> data -> dst_group_id = NRF_RPC_ID_UNKNOWN ;
1242+ }
1243+ }
1244+
1245+ int nrf_rpc_init (nrf_rpc_err_handler_t err_handler )
1246+ {
1247+ int err ;
1248+
1249+ if (is_initialized ) {
1250+ return 0 ;
1251+ }
1252+
1253+ err = nrf_rpc_setup (err_handler , /* bound_handler */ NULL );
1254+ if (err < 0 ) {
1255+ return err ;
1256+ }
1257+
1258+ return nrf_rpc_bind ();
1259+ }
1260+
12371261void nrf_rpc_register_cleanup_handler (struct nrf_rpc_cleanup_handler * handler )
12381262{
12391263 nrf_rpc_os_mutex_lock (& cleanup_mutex );
0 commit comments