G: CemObjectStore (E120 Common Equipment Model)

Hierarchical object tree for equipment self-description.  Each object
carries a CemObjectType (Equipment / Subsystem / IODevice / Module /
MaterialLocation / Other), an optional parent_objid, and a flat
attribute map keyed by name (the wire shape S14F1 / F3 returns).

Operations covered:
  add(CemObject)        - dedup'd, validates parent exists
  get / has             - lookup by objid
  get_attr / set_attr   - E14 GetAttr / SetAttr semantics
  children(parent)      - tree traversal; empty parent = roots

The flat-map representation matches how E14 ObjectService traffic
addresses nodes (by OBJSPEC string).  Wiring S14F1/F2 GetAttr and
S14F3/F4 SetAttr to this store is a downstream commit; the data model
is what was missing.

Joins EquipmentDataModel alongside the other top-level stores.  Three
test cases cover hierarchical add+dedup, children() traversal, and
get/set/missing attribute semantics.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-08 03:35:05 +02:00
parent cdf4049016
commit d159bd39d7
6 changed files with 234 additions and 0 deletions
+2
View File
@@ -2,6 +2,7 @@
#include "secsgem/gem/store/alarms.hpp"
#include "secsgem/gem/store/carriers.hpp"
#include "secsgem/gem/store/cem_objects.hpp"
#include "secsgem/gem/store/clock.hpp"
#include "secsgem/gem/ept_state.hpp"
#include "secsgem/gem/store/control_jobs.hpp"
@@ -43,6 +44,7 @@ struct EquipmentDataModel {
LoadPortStore load_ports;
SubstrateStore substrates;
EptStateMachine ept;
CemObjectStore cem;
// Convenience: VID -> value lookup spanning SVIDs and DVIDs.
std::optional<s2::Item> vid_value(uint32_t vid) const {