pub struct BootConfig<'a> {
pub node_name: Option<&'a str>,
pub locator: Option<&'a str>,
pub domain_id: Option<u32>,
pub namespace: Option<&'a str>,
pub rmw: Option<&'a str>,
}Expand description
Session-identity subset a caller supplies to ExecutorConfig::resolve.
None on a field means “not specified — fall through to the next
precedence level”. The precedence model (A) resolved by
ExecutorConfig::resolve is:
env rung (a Some field on the [`EnvRung`] the caller supplies)
> baked (a Some field here)
> compiled defaultFields are resolved independently: an env locator and a baked
node_name can both apply in the same call.
Note: mode (session mode) is not configurable through BootConfig.
Session mode comes from the env rung, defaulting to SessionMode::Client.
Fields§
§node_name: Option<&'a str>Node name override. Maps to ExecutorConfig::node_name.
locator: Option<&'a str>Middleware locator override. Maps to ExecutorConfig::locator.
domain_id: Option<u32>ROS 2 domain ID override. Maps to ExecutorConfig::domain_id.
namespace: Option<&'a str>Node namespace override. Maps to ExecutorConfig::namespace.
rmw: Option<&'a str>RMW backend selector. Maps to ExecutorConfig::rmw, the name
nros_rmw_cffi::resolve_backend looks up.
Issue 1050 defect (3) — this rung did not exist. Every other field of
ExecutorConfig resolved env > baked > compiled default; rmw
resolved from the environment ALONE, so $NROS_RMW was the only way in
the tree to name a backend. An image that knows perfectly well which
backend it wants — a PX4 module declaring BACKENDS uorb, a C entry
built against one RMW, any embedded target with no environment to read —
could not say so, and got whichever backend registered first.
The environment still wins, because a deployment overriding a build is the whole point of precedence model A. What changed is that there is now something for it to override.
Implementations§
Source§impl<'a> BootConfig<'a>
impl<'a> BootConfig<'a>
Sourcepub fn from_baked(baked: &'a BakedBootConfig) -> BootConfig<'a>
pub fn from_baked(baked: &'a BakedBootConfig) -> BootConfig<'a>
Read a baked config into the plain-field BootConfig the resolver consumes.
Returns all-None (→ resolver uses compiled defaults) if magic/version
don’t match — defensive against a corrupt or zero-initialised section.
Each Option is Some iff its set_flags bit is set; string values are
the bytes up to the first NUL (or full buffer if no NUL). Invalid UTF-8 in
a set field is treated as unset for that field.
Sourcepub fn over_board_defaults(
self,
locator: &'a str,
domain_id: u32,
default_node_name: &'a str,
) -> BootConfig<'a>
pub fn over_board_defaults( self, locator: &'a str, domain_id: u32, default_node_name: &'a str, ) -> BootConfig<'a>
Issue 1434 — the rung an EMBEDDED board hands the resolver: this bake’s IDENTITY over the board’s own connect facts.
Six boards (nros-board-freertos ×2, nros-board-threadx ×2,
nros-board-mps2-an385, nros-board-esp32-qemu) wrote this struct
literal out by hand, character for character, and every one of them
wrote namespace: None — so a launch-declared namespace reached the
blob, from_baked read it correctly, and then the board dropped it on
the floor. It is ONE function now, for the reason issue 0196 gives: six
copies are six places for the next field to be forgotten, and the
forgetting is silent (a None is a legal value, not a compile error).
What comes from where, and why the split is not symmetric:
- Identity (
node_name,namespace) — the BAKE wins, falling back todefault_node_nameand to the resolver’s"". A launch file that names a node is stating what the graph should call it; the board has no opinion worth overriding that with. - Connect (
locator,domain_id) — the BOARD wins, unconditionally and exactly as before this function existed. An embedded board has no environment rung, so itsConfig(per-board TOML / Kconfig) IS the deployment statement for where to dial and on which domain. Changing that is a separate decision from this one and is deliberately NOT made here. rmw— the bake (issue 1050 defect (3)), unchanged.
The NEGATIVE direction is the half that matters: a blob with
BOOT_SET_NAMESPACE clear arrives as namespace: None from
Self::from_baked, travels through here as None, and lands on the
resolver’s compiled default. It never becomes Some(""), which would
read as “configured to the empty namespace” to every rung above it.
Trait Implementations§
Source§impl<'a> Clone for BootConfig<'a>
impl<'a> Clone for BootConfig<'a>
Source§fn clone(&self) -> BootConfig<'a>
fn clone(&self) -> BootConfig<'a>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more