#pragma once #include "secsgem/gem/store/alarms.hpp" #include "secsgem/gem/store/clock.hpp" #include "secsgem/gem/store/equipment_constants.hpp" #include "secsgem/gem/store/event_reports.hpp" #include "secsgem/gem/store/host_commands.hpp" #include "secsgem/gem/store/limits.hpp" #include "secsgem/gem/store/recipes.hpp" #include "secsgem/gem/store/spool.hpp" #include "secsgem/gem/store/status_variables.hpp" namespace secsgem::gem { // Composite over the seven focused stores. Each store is independently // testable and independently usable — the application can keep a reference // to just `alarms` and ignore the rest if that's all it needs. Variable // lookups span SVIDs and DVIDs through this composite (the host's view // per E30 §6.11). struct EquipmentDataModel { StatusVariableStore svids; DataVariableStore dvids; EquipmentConstantStore ecids; EventReportSubscriptions events; AlarmRegistry alarms; RecipeStore recipes; Clock clock; HostCommandRegistry commands; SpoolStore spool; LimitMonitorStore limits; // Convenience: VID -> value lookup spanning SVIDs and DVIDs. std::optional vid_value(uint32_t vid) const { if (auto v = svids.value(vid)) return v; if (auto v = dvids.value(vid)) return v; return std::nullopt; } bool vid_exists(uint32_t vid) const { return svids.has(vid) || dvids.has(vid); } // Sugar that adapts the EventReportSubscriptions API to the host-supplied // VID list shape (matches what parse_s2f33 / parse_s2f35 yield). DefineReportAck define_reports( const std::vector>>& rows) { return events.define_reports(rows, [this](uint32_t vid) { return vid_exists(vid); }); } LinkEventAck link_event_reports( const std::vector>>& rows) { return events.link_event_reports(rows); } EnableEventAck enable_events(bool enable, const std::vector& ceids) { return events.enable_events(enable, ceids); } bool is_event_enabled(uint32_t ceid) const { return events.is_enabled(ceid); } std::vector compose_reports_for(uint32_t ceid) const { return events.compose_for(ceid, [this](uint32_t vid) { return vid_value(vid); }); } }; } // namespace secsgem::gem