Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 13 additions & 141 deletions examples/rust/mini-adas/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -12,165 +12,37 @@
# *******************************************************************************

load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library")
load(":adas_variants.bzl", "adas_variants")

rust_library(
name = "libmini_adas_rust",
srcs = [
"src/activities/components.rs",
"src/activities/input.rs",
"src/activities/mod.rs",
"src/activities/output.rs",
"src/config.rs",
"src/lib.rs",
],
crate_features = [
"com_linux_shm",
"signalling_relayed_tcp",
],
crate_name = "mini_adas",
visibility = ["//visibility:public"],
deps = [
"//examples/rust/mini-adas/mini-adas-gen:mini_adas_gen_rs",
"//src/feo:libfeo_rust",
"//src/feo-com:libfeo_com_rust",
"//src/feo-time:libfeo_time_rust",
"//src/feo-tracing:libfeo_tracing_rust",
"@score_baselibs_rust//src/log/score_log",
"@score_crates//:tracing",
],
)

rust_library(
name = "libmini_adas_rust_mw_com",
srcs = [
adas_variants(
name = "adas",
env = {
"MW_LOG_CONFIG_FILE": "examples/rust/mini-adas/etc/logging.json",
},
lib_srcs = [
"src/activities/components.rs",
"src/activities/input.rs",
"src/activities/mod.rs",
"src/activities/output.rs",
"src/config.rs",
"src/lib.rs",
],
crate_features = [
"com_mw",
"signalling_relayed_tcp",
],
crate_name = "mini_adas",
visibility = ["//visibility:public"],
deps = [
"//examples/rust/mini-adas/mini-adas-gen:mini_adas_gen_rs_mw_com",
"//src/feo:libfeo_rust",
"//src/feo-com:libfeo_com_rust_mw_com",
"//src/feo-time:libfeo_time_rust",
"//src/feo-tracing:libfeo_tracing_rust",
"@score_baselibs_rust//src/log/score_log",
"@score_communication//score/mw/com/impl/rust/com-api/com-api",
"@score_crates//:tracing",
],
)

rust_binary(
name = "adas_primary",
srcs = [
"src/bin/adas_primary.rs",
],
crate_features = ["signalling_relayed_tcp"],
visibility = ["//visibility:public"],
deps = [
":libmini_adas_rust",
"//src/feo:libfeo_rust",
"//src/feo-com:libfeo_com_rust",
"//src/feo-time:libfeo_time_rust",
"//src/feo-tracing:libfeo_tracing_rust",
"@score_baselibs_rust//src/log/score_log",
"@score_baselibs_rust//src/log/stdout_logger",
],
)

rust_binary(
name = "adas_primary_mw_com",
srcs = [
"src/bin/adas_primary.rs",
],
crate_features = [
"signalling_relayed_tcp",
"com_mw",
],
data = [
primary_data = [
"etc/logging.json",
"etc/mw_com_config_100.json",
],
env = {
"MW_LOG_CONFIG_FILE": "examples/rust/mini-adas/etc/logging.json",
},
rustc_flags = [
"-Clink-arg=-lstdc++",
"-Clink-arg=-lm",
"-Clink-arg=-lc",
],
visibility = ["//visibility:public"],
deps = [
":libmini_adas_rust_mw_com",
"//src/feo:libfeo_rust",
"//src/feo-com:libfeo_com_rust_mw_com",
"//src/feo-time:libfeo_time_rust",
"//src/feo-tracing:libfeo_tracing_rust",
"@score_baselibs_rust//src/log/score_log",
"@score_baselibs_rust//src/log/stdout_logger",
"@score_communication//score/mw/com/impl/rust/com-api/com-api",
],
)

rust_binary(
name = "adas_secondary",
srcs = [
"src/bin/adas_secondary.rs",
],
crate_features = ["signalling_relayed_tcp"],
visibility = ["//visibility:public"],
deps = [
":libmini_adas_rust",
"//src/feo:libfeo_rust",
"//src/feo-com:libfeo_com_rust",
"//src/feo-time:libfeo_time_rust",
"//src/feo-tracing:libfeo_tracing_rust",
"@score_baselibs_rust//src/log/score_log",
"@score_baselibs_rust//src/log/stdout_logger",
],
)

rust_binary(
name = "adas_secondary_mw_com",
srcs = [
"src/bin/adas_secondary.rs",
],
crate_features = [
"signalling_relayed_tcp",
"com_mw",
primary_srcs = [
"src/bin/adas_primary.rs",
],
data = [
secondary_data = [
"etc/logging.json",
"etc/mw_com_config_101.json",
"etc/mw_com_config_102.json",
],
env = {
"MW_LOG_CONFIG_FILE": "examples/rust/mini-adas/etc/logging.json",
},
rustc_flags = [
"-Clink-arg=-lstdc++",
"-Clink-arg=-lm",
"-Clink-arg=-lc",
secondary_srcs = [
"src/bin/adas_secondary.rs",
],
visibility = ["//visibility:public"],
deps = [
":libmini_adas_rust_mw_com",
"//src/feo:libfeo_rust",
"//src/feo-com:libfeo_com_rust_mw_com",
"//src/feo-time:libfeo_time_rust",
"//src/feo-tracing:libfeo_tracing_rust",
"@score_baselibs_rust//src/log/score_log",
"@score_baselibs_rust//src/log/stdout_logger",
"@score_communication//score/mw/com/impl/rust/com-api/com-api",
],
)

cc_library(
Expand Down
35 changes: 18 additions & 17 deletions examples/rust/mini-adas/README.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,51 @@
# Mini ADAS Example

Example of a minimal dummy ADAS activity set.
A recorder can be added to the example and switched on in the primary via a CLI flag.

## Running

You need to run the following commands in separate terminals.

```sh
# Use 400ms cycle time
bazelisk run //examples/rust/mini-adas:adas_primary -- 400
bazelisk run //examples/rust/mini-adas:adas_primary_com_iox2_direct_unix -- 400
```

```sh
bazelisk run //examples/rust/mini-adas:adas_secondary -- 1
bazelisk run //examples/rust/mini-adas:adas_secondary_com_iox2_direct_unix -- 1
```

```sh
bazelisk run //examples/rust/mini-adas:adas_secondary -- 2
bazelisk run //examples/rust/mini-adas:adas_secondary_com_iox2_direct_unix -- 2
```

## Using middleware COM for data exchange
It's possible to switch between com backend implementations:
* com_iox2 for Iceoryx2
* com_linux_shm for Linux shared memory backend
* com_mw for middleware COM backend

In order to use mw com instead of feo-com for data exchange use the following bazel targets instead:
And signalling implementations:
* direct_tcp for direct connections via TCP sockets
* direct_unix for direct connections via UNIX sockets
* relayed_tcp for relayed signalling via TCP sockets
* relayed_unix for relayed signalling via UNIX sockets
* direct_mw_com for direct connections via middleware COM (WIP, not available yet)

For instance, Linux shared memory com backend with TCP scokets signalling implementation may be started with:

```sh
# Use 400ms cycle time
bazelisk run //examples/rust/mini-adas:adas_primary_mw_com -- 400
bazelisk run //examples/rust/mini-adas:adas_primary_com_linux_shm_direct_tcp -- 400
```

```sh
bazelisk run //examples/rust/mini-adas:adas_secondary_mw_com -- 1
bazelisk run //examples/rust/mini-adas:adas_secondary_com_linux_shm_direct_tcp -- 1
```

```sh
bazelisk run //examples/rust/mini-adas:adas_secondary_mw_com -- 2
bazelisk run //examples/rust/mini-adas:adas_secondary_com_linux_shm_direct_tcp -- 2
```

## Different signalling layer

The easiest way to switch the signalling layer is by changing the crate_features in the `BUILD.bazel`,
make sure to switch it for every target you're using. Then you can just use the commands from above.

Note that for mpsc-only signalling, there can be only a primary process without
any secondaries or recorders, because mpsc does not support inter-process signalling.

## Running tracer

In order to start tracing use:
Expand Down
109 changes: 109 additions & 0 deletions examples/rust/mini-adas/adas_variants.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# *******************************************************************************
# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Apache License Version 2.0 which is available at
# https://www.apache.org/licenses/LICENSE-2.0
#
# SPDX-License-Identifier: Apache-2.0
# *******************************************************************************

load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library")

COM_BACKENDS = [
"com_iox2",
"com_linux_shm",
"com_mw",
]

SIGNALLINGS = [
"direct_tcp",
"direct_unix",
"relayed_tcp",
"relayed_unix",
# Not yet merged
# "direct_mw_com",
]

COMMON_DEPS = [
"//src/feo:libfeo_rust",
"//src/feo-com:libfeo_com_rust_mw_com", # libfeo uses _mw_com feo-com, so we must use the same
"//src/feo-time:libfeo_time_rust",
"//src/feo-tracing:libfeo_tracing_rust",
"@score_baselibs_rust//src/log/score_log",
"@score_communication//score/mw/com/impl/rust/com-api/com-api",
"//examples/rust/mini-adas/mini-adas-gen:mini_adas_gen_rs_mw_com",
]

LIBRARY_COMMON_DEPS = COMMON_DEPS + [
"@score_crates//:tracing",
]

BINARY_COMMON_DEPS = COMMON_DEPS + [
"@score_baselibs_rust//src/log/stdout_logger",
]

# Generate mini-adas bazel targets for each and every combination of COM backend
# and signalling implementation
# Input:
# lib_srcs - source files of the library
# primary_srcs - source files of the primary agent
# secondary_srcs - source files of the secondary agent
# primary_data - data files of the primary agent
# secondary_data - data files of the secondary agent
# env - envioronment variables of the binaries
# Generates adas_{com backend}_signalling_{signalling} library and two binaries:
# adas_primary_{com backend}_signalling_{signalling}
# and adas_secondary_{com backend}_signalling_{signalling}
def _adas_variants_impl(name, visibility, lib_srcs, primary_srcs, secondary_srcs, primary_data, secondary_data, env):
for backend in COM_BACKENDS:
for signalling in SIGNALLINGS:
signalling_feature = "signalling_" + signalling
crate_features = [backend, signalling_feature]
library_name = "adas_{}_{}".format(backend, signalling)

rust_library(
name = library_name,
crate_name = "adas",
visibility = visibility,
crate_features = crate_features,
srcs = lib_srcs,
deps = LIBRARY_COMMON_DEPS,
)

rust_binary(
name = "adas_primary_{}_{}".format(backend, signalling),
crate_name = "adas_primary",
visibility = visibility,
crate_features = crate_features,
srcs = primary_srcs,
data = primary_data,
env = env,
deps = BINARY_COMMON_DEPS + [":" + library_name],
)

rust_binary(
name = "adas_secondary_{}_{}".format(backend, signalling),
crate_name = "adas_secondary",
visibility = visibility,
crate_features = crate_features,
srcs = secondary_srcs,
data = secondary_data,
env = env,
deps = BINARY_COMMON_DEPS + [":" + library_name],
)

adas_variants = macro(
implementation = _adas_variants_impl,
attrs = {
"lib_srcs": attr.label_list(allow_files = True),
"primary_srcs": attr.label_list(allow_files = True),
"secondary_srcs": attr.label_list(allow_files = True),
"primary_data": attr.label_list(allow_files = True, default = []),
"secondary_data": attr.label_list(allow_files = True, default = []),
"env": attr.string_dict(default = {}),
},
)
13 changes: 6 additions & 7 deletions examples/rust/mini-adas/src/activities/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,12 @@ use feo_com::interface::ActivityInput;
#[cfg(feature = "com_mw")]
use crate::config::mw_com_runtime;

#[cfg(not(feature = "com_mw"))]
use score_log::fmt::ScoreDebug;

#[cfg(not(feature = "com_mw"))]
use core::fmt::Debug;

#[cfg(feature = "com_mw")]
use score_log::debug;

#[cfg(not(feature = "com_mw"))]
use feo_com::interface::FeoComData;

#[cfg(feature = "com_mw")]
use com_api::{
Builder, FindServiceSpecifier, InstanceSpecifier, Interface, LolaRuntimeImpl, Runtime, ServiceDiscovery,
Expand Down Expand Up @@ -87,8 +84,10 @@ pub fn create_consumer<I: Interface + Send>(topic: &str) -> <I as Interface>::Co
#[cfg(not(feature = "com_mw"))]
pub fn activity_input<T>(topic: &str) -> Box<dyn ActivityInput<T>>
where
T: Debug + ScoreDebug + 'static,
T: FeoComData + 'static,
{
#[cfg(feature = "com_iox2")]
use feo_com::iox2::Iox2Input;
#[cfg(feature = "com_linux_shm")]
use feo_com::linux_shm::LinuxShmInput;

Expand Down
Loading
Loading