Files
secs-gem/include/secsgem/gem/data_model.hpp
T
raphael 6cedaa10dc
tests / build-and-test (push) Failing after 32s
100%/D: Trace Data Collection (S2F23/F24 + S6F1/F2, E30 §6.12)
New TraceStore keyed by TRID; each entry is a TraceConfig with
DSPER + TOTSMP + REPGSZ + SVID list.  S2F23 validates that every SVID
exists (TIAACK=4 otherwise) and registers the trace.

S6F1's body is L,4 of {TRID U4, SMPLN U4, STIME ASCII, list_of <Item>}
— the application chooses whether each value Item is a scalar SVID
value or a packed batch.

The periodic sampling timer that turns an active TraceConfig into
S6F1 emissions is intentionally left to the application (E5 doesn't
mandate a specific scheduler and vendors typically already have one).

Four new SxFy in the catalog.

COMPLIANCE.md: Trace Data Collection Additional capability flips .
Tests: 82 cases / 477 assertions.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 02:16:50 +02:00

64 lines
2.4 KiB
C++

#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"
#include "secsgem/gem/store/trace.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;
TraceStore traces;
// Convenience: VID -> value lookup spanning SVIDs and DVIDs.
std::optional<s2::Item> 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<std::pair<uint32_t, std::vector<uint32_t>>>& rows) {
return events.define_reports(rows, [this](uint32_t vid) { return vid_exists(vid); });
}
LinkEventAck link_event_reports(
const std::vector<std::pair<uint32_t, std::vector<uint32_t>>>& rows) {
return events.link_event_reports(rows);
}
EnableEventAck enable_events(bool enable, const std::vector<uint32_t>& ceids) {
return events.enable_events(enable, ceids);
}
bool is_event_enabled(uint32_t ceid) const { return events.is_enabled(ceid); }
std::vector<ReportData> compose_reports_for(uint32_t ceid) const {
return events.compose_for(ceid, [this](uint32_t vid) { return vid_value(vid); });
}
};
} // namespace secsgem::gem