v2.1.0 — RC Server lifecycle & register-map model
v2.1.0 — RC Server lifecycle & register-map model (Phase 13 milestone 45)
Second milestone of the full OPEN Alliance TC18 Remote Control Protocol replacement (see ROADMAP.md), building directly on v2.0.0's wire codec.
What changed
- New
rcp/lifecycle.hpp:- The 3-state RC Server lifecycle machine —
HW_UNCONFIGURED(0x00),HW_CONFIGURED(0x55),RCP_CONFIGURED(0xAA) - Forward-only, single-step
advance()transitions (no skipping, no going backward except via explicitdeconfigure()) - The
HW_CFG_INCONSISTENT/RCP_CFG_INCONSISTENTplausibility checks gating each transition - Independent generic/functional config-block locking, tied to lifecycle state
- The 3-state RC Server lifecycle machine —
- New
rcp/regmap.hpp:- The generic (server-owned, pin-mapping/queue-size) vs. functional (endpoint-type-specific) config split — a hard prerequisite every endpoint milestone from v2.3.0 onward depends on
- General bootstrap register fields: magic number, protocol version, vendor/device ID, endpoint count, stream/queue capacity,
svr_implemented_options, and pointer/capacity fields for the five bootstrap tables - HW pin-mapping config, request-stream config (including the
rx_wd_*/rx_safety_measurefields — present now, wired up for real at v2.6.0), the EP-ID/byte_bus_idmapping table (client-ordering risk flagged explicitly in comments, not server-enforced), and response/ack queue config - Persistent 8-bit sequencer-state storage (used starting v2.5.0)
Ep0— the RC Server acting as a pseudo-endpoint: whole-register-map read (unrestricted) and write (root-client-only viaclaim_root_client/svr_root_client_index), plus per-endpoint write restriction for every other client- The four mandatory register-map error codes as
rcp::regmap::RegMapErrc:UNAUTHORIZED_ACCESS,LOCKED_MEM_ACCESS,REQUEST_REJECTED,INVALID_PARAMETER
- New
REQ-LIFECYCLE-001..006andREQ-REGMAP-001..014requirements (.fusa-reqs.json), tested intests/test_lifecycle.cppandtests/test_regmap.cpp. rcp/rcp.hpp's pre-replacement Zone/Command/Controller/Registry model is unchanged in behavior — its header comment now points at the new replacement headers — since roughly three dozen other headers still build against it and aren't rebound until their own later milestones (v2.9.0 onward per the Release Plan).
Scope note
Per ROADMAP.md, this milestone is the lifecycle/register-map foundation only: no discovery, endpoint types, conditional requests, or E2E safe-state behavior is included (those are v2.2.0+). Field widths, the register-map magic-number value, and the locking policy are this implementation's own design choices for realizing the described behavior; no discovery mechanism or endpoint type exists yet to exercise the register map end-to-end over the wire.
Verification
44/44 ctest suites pass (clang, Debug/Release, C++17/C++20); all 20 CI checks green (full build matrix across Linux/macOS/Windows × clang/gcc/msvc, clang-tidy, coverage, relay conform, and the full cpp-FuSa safety/security/traceability lifecycle including 100% requirement coverage).
Full diff: v2.0.0...v2.1.0