Files
raphael fc3422a4a9 docs: move root .md files into docs/ + update every reference
Picks up the file renames that landed alongside the previous commit
and fixes everything that pointed at the old root locations:

- README.md doc-map updated: every entry now points at docs/X.md,
  with a new "docs/" lead entry pointing at the guided-tour index.
- README inline cross-refs (ARCHITECTURE / INTEGRATION / SECURITY /
  BENCHMARKS / MES_INTEROP / PROOFS) repointed to docs/.
- README "Interop" section rewritten — used to mention only
  secsgem-py; now covers all four external validators (secsgem-py
  31 / secs4java8 55 / tshark 69 frames / libFuzzer 200 k+ runs)
  with a one-line summary each, plus pointers to interop/README.md
  and docs/VERIFICATION.md.
- README "Deferred follow-ups" cleaned: dropped the explanatory
  "Listed here so reviewers don't go looking for them in
  COMPLIANCE.md and find an 'out of scope' entry that sounds
  defensive" sentence — the section header speaks for itself.
- docs/00_index.md "Where the rest of the docs live" table: dropped
  every `../` prefix since the docs are now siblings.
- docs/01_what_is_secs_gem.md PROOFS reference updated to sibling.
- docs/02_the_cast.md INTEGRATION + MES_INTEROP refs updated to
  siblings; dropped the stale "at the repo root" wording.
- interop/README.md: VERIFICATION + PROOFS refs updated to
  ../docs/X.md; stale "~24 + 4 checks" updated to 31 (matches
  PROOFS.md and README).
- examples/pvd_tool/README.md: every doc cross-ref now points at
  ../../docs/X.md.
- Source / data / CI comments mentioning doc names (e.g.
  "INTEGRATION.md §3", "COMPLIANCE.md gap") rewritten to
  "docs/INTEGRATION.md §3" etc. — affects 9 files across
  include/, apps/, tests/, data/, examples/, .gitea/workflows/.

Verified: full build under docker passes, 445/445 test cases pass,
2 753/2 753 assertions pass.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 19:36:27 +02:00

2292 lines
71 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SECS-II message catalog. Each entry describes one SxFy primary or reply;
# the codegen (tools/gen_messages.py) reads this and emits builders + parsers.
#
# Shape grammar (see tools/gen_messages.py for the full description):
#
# none - header-only (no body)
# scalar: - single Item; cpp_type derived from item_type/enum
# item_type: ASCII | BINARY_BYTE | BOOLEAN | U1..U8 | I1..I8 | F4 | F8 | ITEM
# enum: <C++ enum> - optional
# param: <name> - optional, default "value"
# list: - fixed-arity <L,k>
# fields: [{name, shape}, ...]
# struct_name: <Name> - optional; if set, parser returns the struct
# external_struct: bool - optional; struct is assumed to exist already
# list_of: - variable-arity <L,n>
# element: <shape>
# name: <param-name> - optional, default "values"
#
# Special-case messages whose shape can't be expressed (S1F4's optional-item
# semantics, S5F6's per-row ALCD callback) live in messages_helpers.hpp.
messages:
# =====================================================================
# S1 — Equipment status
# =====================================================================
- id: S1F1
stream: 1
function: 1
w: true
builder: s1f1_are_you_there
- id: S1F2
stream: 1
function: 2
builder: s1f2_on_line_data
body:
kind: list
fields:
- {name: mdln, shape: {kind: scalar, item_type: ASCII}}
- {name: softrev, shape: {kind: scalar, item_type: ASCII}}
- id: S1F3
stream: 1
function: 3
w: true
builder: s1f3_selected_status_request
parser: parse_s1f3
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: svids
- id: S1F11
stream: 1
function: 11
w: true
builder: s1f11_status_namelist_request
parser: parse_s1f11
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: svids
- id: S1F12
stream: 1
function: 12
builder: s1f12_status_namelist_data
parser: parse_s1f12
body:
kind: list_of
name: items
element:
kind: list
struct_name: StatusName
fields:
- {name: id, shape: {kind: scalar, item_type: U4}}
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: units, shape: {kind: scalar, item_type: ASCII}}
- id: S1F13
stream: 1
function: 13
w: true
builder: s1f13_establish_comms
body:
kind: list
fields:
- {name: mdln, shape: {kind: scalar, item_type: ASCII}}
- {name: softrev, shape: {kind: scalar, item_type: ASCII}}
- id: S1F14
stream: 1
function: 14
builder: s1f14_establish_comms_ack
body:
kind: list
fields:
- {name: ack, shape: {kind: scalar, item_type: BINARY_BYTE, enum: CommAck}}
- name: identity
shape:
kind: list
struct_name: McAck
fields:
- {name: mdln, shape: {kind: scalar, item_type: ASCII}}
- {name: softrev, shape: {kind: scalar, item_type: ASCII}}
- id: S1F15
stream: 1
function: 15
w: true
builder: s1f15_request_offline
- id: S1F16
stream: 1
function: 16
builder: s1f16_offline_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: OfflineAck, param: ack}
- id: S1F17
stream: 1
function: 17
w: true
builder: s1f17_request_online
- id: S1F18
stream: 1
function: 18
builder: s1f18_online_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: OnlineAck, param: ack}
# S1F19 / S1F20 — Get GEM Compliance. Host asks the equipment which GEM
# capabilities it supports; equipment replies with its SOFTREV, an
# implementer-defined equipment-type string, and a (CCODE, CDESC) list
# per E30 Appendix A. Closes the "Documentation" Fundamental capability
# by letting the equipment self-report its own docs/COMPLIANCE.md status.
- id: S1F19
stream: 1
function: 19
w: true
builder: s1f19_get_gem_compliance_request
- id: S1F20
stream: 1
function: 20
builder: s1f20_get_gem_compliance_data
parser: parse_s1f20
body:
kind: list
struct_name: GemCompliance
fields:
- {name: softrev, shape: {kind: scalar, item_type: ASCII}}
- {name: equipment_type, shape: {kind: scalar, item_type: ASCII}}
- name: capabilities
shape:
kind: list_of
element:
kind: list
struct_name: CapabilityEntry
fields:
- {name: ccode, shape: {kind: scalar, item_type: U1}}
- {name: cdesc, shape: {kind: scalar, item_type: ASCII}}
# S1F21 / S1F22 — Data Variable Namelist (same wire shape as S1F11/F12
# but for DVIDs). Reuses the StatusName struct emitted by S1F12.
- id: S1F21
stream: 1
function: 21
w: true
builder: s1f21_data_variable_namelist_request
parser: parse_s1f21
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: vids
- id: S1F22
stream: 1
function: 22
builder: s1f22_data_variable_namelist_data
parser: parse_s1f22
body:
kind: list_of
name: items
element:
kind: list
struct_name: StatusName
fields:
- {name: id, shape: {kind: scalar, item_type: U4}}
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: units, shape: {kind: scalar, item_type: ASCII}}
# S1F23 / S1F24 — Collection Event Namelist (CEID directory).
# Body of S1F23 is a list of CEIDs; an empty list means "every CEID".
# The S1F24 reply has rows of (CEID, CENAME, [VID...]) listing every
# status variable referenced by the reports linked to that CEID.
- id: S1F23
stream: 1
function: 23
w: true
builder: s1f23_collection_event_namelist_request
parser: parse_s1f23
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: ceids
- id: S1F24
stream: 1
function: 24
builder: s1f24_collection_event_namelist_data
parser: parse_s1f24
body:
kind: list_of
name: items
element:
kind: list
struct_name: CollectionEventName
fields:
- {name: ceid, shape: {kind: scalar, item_type: U4}}
- {name: cename, shape: {kind: scalar, item_type: ASCII}}
- name: vids
shape: {kind: list_of, element: {kind: scalar, item_type: U4}}
# =====================================================================
# S2 — Equipment control + reports
# =====================================================================
- id: S2F13
stream: 2
function: 13
w: true
builder: s2f13_ec_request
parser: parse_s2f13
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: ecids
- id: S2F14
stream: 2
function: 14
builder: s2f14_ec_data
parser: parse_s2f14
body:
kind: list_of
element: {kind: scalar, item_type: ITEM}
name: values
- id: S2F15
stream: 2
function: 15
w: true
builder: s2f15_ec_send
parser: parse_s2f15
body:
kind: list_of
name: sets
element:
kind: list
struct_name: EcSet
fields:
- {name: ecid, shape: {kind: scalar, item_type: U4}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- id: S2F16
stream: 2
function: 16
builder: s2f16_ec_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: EquipmentAck, param: eac}
- id: S2F17
stream: 2
function: 17
w: true
builder: s2f17_date_time_request
- id: S2F18
stream: 2
function: 18
builder: s2f18_date_time_data
parser: parse_s2f18
body: {kind: scalar, item_type: ASCII, param: time_str}
# S2F25 / S2F26 — Loopback Diagnostic. Host sends an arbitrary byte
# blob; equipment echoes it back unchanged in S2F26. Useful for round-
# trip diagnostics and as a "keep-alive at the application layer."
- id: S2F25
stream: 2
function: 25
w: true
builder: s2f25_loopback_diagnostic_request
parser: parse_s2f25
body: {kind: scalar, item_type: BINARY, param: payload}
- id: S2F26
stream: 2
function: 26
builder: s2f26_loopback_diagnostic_data
parser: parse_s2f26
body: {kind: scalar, item_type: BINARY, param: payload}
- id: S2F29
stream: 2
function: 29
w: true
builder: s2f29_ec_namelist_request
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: ecids
- id: S2F30
stream: 2
function: 30
builder: s2f30_ec_namelist_data
body:
kind: list_of
name: items
element:
kind: list
struct_name: EcNameRow
fields:
- {name: ecid, shape: {kind: scalar, item_type: U4}}
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: min_str, shape: {kind: scalar, item_type: ASCII}}
- {name: max_str, shape: {kind: scalar, item_type: ASCII}}
- {name: default_str, shape: {kind: scalar, item_type: ASCII}}
- {name: units, shape: {kind: scalar, item_type: ASCII}}
- id: S2F31
stream: 2
function: 31
w: true
builder: s2f31_date_time_set
parser: parse_s2f31
body: {kind: scalar, item_type: ASCII, param: time_str}
- id: S2F32
stream: 2
function: 32
builder: s2f32_date_time_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: TimeAck, param: ack}
- id: S2F33
stream: 2
function: 33
w: true
builder: s2f33_define_report
parser: parse_s2f33
body:
kind: list
struct_name: DefineReportRequest
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- name: reports
shape:
kind: list_of
element:
kind: list
struct_name: DefineReportEntry
fields:
- {name: rptid, shape: {kind: scalar, item_type: U4}}
- name: vids
shape:
kind: list_of
element: {kind: scalar, item_type: U4}
- id: S2F34
stream: 2
function: 34
builder: s2f34_define_report_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: DefineReportAck, param: ack}
- id: S2F35
stream: 2
function: 35
w: true
builder: s2f35_link_event_report
parser: parse_s2f35
body:
kind: list
struct_name: LinkEventReportRequest
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- name: links
shape:
kind: list_of
element:
kind: list
struct_name: LinkEventEntry
fields:
- {name: ceid, shape: {kind: scalar, item_type: U4}}
- name: rptids
shape:
kind: list_of
element: {kind: scalar, item_type: U4}
- id: S2F36
stream: 2
function: 36
builder: s2f36_link_event_report_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: LinkEventAck, param: ack}
- id: S2F37
stream: 2
function: 37
w: true
builder: s2f37_enable_event
parser: parse_s2f37
body:
kind: list
struct_name: EnableEventRequest
fields:
- {name: enable, shape: {kind: scalar, item_type: BOOLEAN}}
- name: ceids
shape: {kind: list_of, element: {kind: scalar, item_type: U4}}
- id: S2F38
stream: 2
function: 38
builder: s2f38_enable_event_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: EnableEventAck, param: ack}
- id: S2F41
stream: 2
function: 41
w: true
builder: s2f41_host_command
parser: parse_s2f41
body:
kind: list
struct_name: HostCommand
fields:
- {name: rcmd, shape: {kind: scalar, item_type: ASCII}}
- name: params
shape:
kind: list_of
element:
kind: list
struct_name: CommandParameter
external_struct: true
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- id: S2F42
stream: 2
function: 42
builder: s2f42_host_command_ack
parser: parse_s2f42
body:
kind: list
struct_name: HostCommandReply
fields:
- {name: hcack, shape: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck}}
- name: cpacks
shape:
kind: list_of
element:
kind: list
struct_name: CommandParameterAck
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: code, shape: {kind: scalar, item_type: BINARY_BYTE}}
# S2F49 / S2F50 — Enhanced Remote Command (E30 §6.4, E5 §10.4). Same
# intent as S2F41/F42 but routes a command at a specific object via
# OBJSPEC, carries a DATAID transaction handle, and the reply uses
# extended per-CP acks (CPACK + CEPACK) so the equipment can flag both
# "name unknown" (CPACK) and "value invalid" (CEPACK) independently.
- id: S2F49
stream: 2
function: 49
w: true
builder: s2f49_enhanced_host_command
parser: parse_s2f49
body:
kind: list
struct_name: EnhancedHostCommand
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- {name: objspec, shape: {kind: scalar, item_type: ASCII}}
- {name: rcmd, shape: {kind: scalar, item_type: ASCII}}
- name: params
shape:
kind: list_of
element:
kind: list
struct_name: CommandParameter
external_struct: true
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- id: S2F50
stream: 2
function: 50
builder: s2f50_enhanced_host_command_ack
parser: parse_s2f50
body:
kind: list
struct_name: EnhancedHostCommandReply
fields:
- {name: hcack, shape: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck}}
- name: cpacks
shape:
kind: list_of
element:
kind: list
struct_name: EnhancedCommandParameterAck
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: cpack, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: cepack, shape: {kind: scalar, item_type: BINARY_BYTE}}
# S2F23 / S2F24 — Trace Initialize Send (E30 §6.12). Host requests
# periodic SVID sampling: every DSPER, equipment captures the SVID
# values; every REPGSZ samples it emits an S6F1 batch; after TOTSMP
# total samples it stops. Periodic execution is the application's
# responsibility; this codebase only stores the request.
# S2F21 / S2F22 — Remote Command (legacy form, E5). No parameter
# list — just the command name. Modern usage prefers S2F41/F42 which
# carry CP name/value pairs, but some older hosts still send the F21
# form so we accept it. CMDA is a U1 ack code: 0=Accept,
# 1=CannotPerformNow, 2=CommandDoesNotExist, etc. (same enum as
# HostCmdAck which we use throughout the codebase).
- id: S2F21
stream: 2
function: 21
w: true
builder: s2f21_remote_command
parser: parse_s2f21
body: {kind: scalar, item_type: ASCII, param: rcmd}
- id: S2F22
stream: 2
function: 22
builder: s2f22_remote_command_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck, param: cmda}
- id: S2F23
stream: 2
function: 23
w: true
builder: s2f23_trace_initialize_send
parser: parse_s2f23
body:
kind: list
struct_name: TraceInit
fields:
- {name: trid, shape: {kind: scalar, item_type: U4}}
- {name: dsper, shape: {kind: scalar, item_type: ASCII}}
- {name: totsmp, shape: {kind: scalar, item_type: U4}}
- {name: repgsz, shape: {kind: scalar, item_type: U4}}
- name: svids
shape:
kind: list_of
element: {kind: scalar, item_type: U4}
- id: S2F24
stream: 2
function: 24
builder: s2f24_trace_initialize_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: TraceAck, param: tiaack}
# S6F1 / S6F2 — Trace Data Send. Emitted by equipment when a batch
# completes. `values` holds REPGSZ * len(svids) Items (REPGSZ samples
# of len(svids) values each), but the shape lets the application choose
# any layout it wants.
- id: S6F1
stream: 6
function: 1
w: true
builder: s6f1_trace_data_send
parser: parse_s6f1
body:
kind: list
struct_name: TraceSample
fields:
- {name: trid, shape: {kind: scalar, item_type: U4}}
- {name: smpln, shape: {kind: scalar, item_type: U4}}
- {name: stime, shape: {kind: scalar, item_type: ASCII}}
- name: values
shape:
kind: list_of
element: {kind: scalar, item_type: ITEM}
- id: S6F2
stream: 6
function: 2
builder: s6f2_trace_data_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: EventReportAck, param: ack}
# S2F45 / S2F46 / S2F47 / S2F48 — Limits Monitoring (E30 §6.21). Each
# VID may carry several LimitDefinitions (one per LIMITID), each with
# an upper / lower deadband expressed as an arbitrary Item.
- id: S2F45
stream: 2
function: 45
w: true
builder: s2f45_define_variable_limits
parser: parse_s2f45
body:
kind: list
struct_name: DefineLimitsRequest
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- name: entries
shape:
kind: list_of
element:
kind: list
struct_name: VidLimitsEntry
fields:
- {name: vid, shape: {kind: scalar, item_type: U4}}
- name: limits
shape:
kind: list_of
element:
kind: list
struct_name: LimitDefinition
external_struct: true
fields:
- {name: limitid, shape: {kind: scalar, item_type: U1}}
- {name: upper, shape: {kind: scalar, item_type: ITEM}}
- {name: lower, shape: {kind: scalar, item_type: ITEM}}
- id: S2F46
stream: 2
function: 46
builder: s2f46_define_variable_limits_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: LimitMonitorAck, param: vlaack}
- id: S2F47
stream: 2
function: 47
w: true
builder: s2f47_variable_limit_attribute_request
parser: parse_s2f47
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: vids
- id: S2F48
stream: 2
function: 48
builder: s2f48_variable_limit_attribute_data
body:
kind: list_of
name: entries
element:
kind: list
struct_name: VidLimitsEntry
fields:
- {name: vid, shape: {kind: scalar, item_type: U4}}
- name: limits
shape:
kind: list_of
element:
kind: list
struct_name: LimitDefinition
external_struct: true
fields:
- {name: limitid, shape: {kind: scalar, item_type: U1}}
- {name: upper, shape: {kind: scalar, item_type: ITEM}}
- {name: lower, shape: {kind: scalar, item_type: ITEM}}
# S2F43 / S2F44 — Reset Spooling (E30 §6.22, configure spoolable streams).
- id: S2F43
stream: 2
function: 43
w: true
builder: s2f43_reset_spooling
parser: parse_s2f43
body:
kind: list_of
element: {kind: scalar, item_type: BINARY_BYTE}
name: streams
- id: S2F44
stream: 2
function: 44
builder: s2f44_reset_spooling_ack
parser: parse_s2f44
body:
kind: list
struct_name: ResetSpoolingReply
fields:
- {name: rspack, shape: {kind: scalar, item_type: BINARY_BYTE, enum: ResetSpoolAck}}
- name: per_stream
shape:
kind: list_of
element:
kind: list
struct_name: ResetSpoolStreamAck
fields:
- {name: stream, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: strack, shape: {kind: scalar, item_type: BINARY_BYTE}}
# =====================================================================
# S5 — Alarms
# =====================================================================
- id: S5F1
stream: 5
function: 1
w: true
builder: s5f1_alarm_report
parser: parse_s5f1
body:
kind: list
struct_name: AlarmReport
fields:
- {name: alcd, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: alid, shape: {kind: scalar, item_type: U4}}
- {name: altx, shape: {kind: scalar, item_type: ASCII}}
- id: S5F2
stream: 5
function: 2
builder: s5f2_alarm_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: AlarmAck, param: ack}
- id: S5F3
stream: 5
function: 3
w: true
builder: s5f3_enable_alarm
parser: parse_s5f3
body:
kind: list
struct_name: EnableAlarmRequest
fields:
- {name: aled, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: alid, shape: {kind: scalar, item_type: U4}}
- id: S5F4
stream: 5
function: 4
builder: s5f4_enable_alarm_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: AlarmAck, param: ack}
- id: S5F5
stream: 5
function: 5
w: true
builder: s5f5_list_alarms_request
parser: parse_s5f5
body:
kind: list_of
element: {kind: scalar, item_type: U4}
name: alids
# S5F6 is hand-written (per-row ALCD requires an active-callback API).
# S5F7 / S5F8 — List Enabled Alarms. Same wire shape as S5F6 but only
# alarms with bit-7 of their stored "enabled" flag are returned.
- id: S5F7
stream: 5
function: 7
w: true
builder: s5f7_list_enabled_alarms_request
- id: S5F8
stream: 5
function: 8
builder: s5f8_list_enabled_alarms_data
parser: parse_s5f8
body:
kind: list_of
name: items
element:
kind: list
struct_name: AlarmListing
fields:
- {name: alcd, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: alid, shape: {kind: scalar, item_type: U4}}
- {name: altx, shape: {kind: scalar, item_type: ASCII}}
# S5F9 / S5F10 — Exception Post Notify / Confirm (E5).
# Equipment posts a recoverable exception; the body lists the allowed
# recovery actions that S5F13 may then send. Host acks via S5F10.
- id: S5F9
stream: 5
function: 9
w: true
builder: s5f9_exception_post_notify
parser: parse_s5f9
body:
kind: list
struct_name: ExceptionPost
fields:
- {name: exid, shape: {kind: scalar, item_type: U4}}
- {name: extype, shape: {kind: scalar, item_type: ASCII}}
- {name: exmessage, shape: {kind: scalar, item_type: ASCII}}
- name: exrecvra
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- id: S5F10
stream: 5
function: 10
builder: s5f10_exception_post_confirm
body: {kind: scalar, item_type: BINARY_BYTE, enum: AlarmAck, param: ack}
# S5F11 / S5F12 — Exception Clear Notify / Confirm. Equipment signals
# that a previously-posted exception has cleared.
- id: S5F11
stream: 5
function: 11
w: true
builder: s5f11_exception_clear_notify
parser: parse_s5f11
body:
kind: list
struct_name: ExceptionClear
fields:
- {name: exid, shape: {kind: scalar, item_type: U4}}
- {name: extype, shape: {kind: scalar, item_type: ASCII}}
- {name: exmessage, shape: {kind: scalar, item_type: ASCII}}
- id: S5F12
stream: 5
function: 12
builder: s5f12_exception_clear_confirm
body: {kind: scalar, item_type: BINARY_BYTE, enum: AlarmAck, param: ack}
# S5F13 / S5F14 — Exception Recover Request / Acknowledge (E5 §9.5).
# Host asks the equipment to execute a specific recovery action from
# the EXRECVRA list that the prior S5F9 advertised. EXRECVRA on F13
# is a single action string, distinct from the list of allowed actions
# on F9. F14 echoes ACKC5 as our AlarmAck byte.
- id: S5F13
stream: 5
function: 13
w: true
builder: s5f13_exception_recover_request
parser: parse_s5f13
body:
kind: list
struct_name: ExceptionRecoverRequest
fields:
- {name: exid, shape: {kind: scalar, item_type: U4}}
- {name: exrecvra, shape: {kind: scalar, item_type: ASCII}}
- id: S5F14
stream: 5
function: 14
builder: s5f14_exception_recover_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: AlarmAck, param: ack}
# S5F15 / S5F16 — Exception Recover Complete Notify / Acknowledge
# (E5 §9.6). Equipment signals that the recovery action requested by
# the matching S5F13 has finished; EXRESULT carries any structured
# outcome the equipment wishes to report (we model it as ASCII, which
# is the common case — vendor-specific richer shapes are a YAML edit).
- id: S5F15
stream: 5
function: 15
w: true
builder: s5f15_exception_recover_complete_notify
parser: parse_s5f15
body:
kind: list
struct_name: ExceptionRecoverComplete
fields:
- {name: exid, shape: {kind: scalar, item_type: U4}}
- {name: exresult, shape: {kind: scalar, item_type: ASCII}}
- id: S5F16
stream: 5
function: 16
builder: s5f16_exception_recover_complete_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: AlarmAck, param: ack}
# S5F17 / S5F18 — Exception Recover Abort Request / Acknowledge
# (E5 §9.7). Host aborts a recovery action currently in flight.
- id: S5F17
stream: 5
function: 17
w: true
builder: s5f17_exception_recover_abort_request
parser: parse_s5f17
body: {kind: scalar, item_type: U4, param: exid}
- id: S5F18
stream: 5
function: 18
builder: s5f18_exception_recover_abort_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: AlarmAck, param: ack}
# =====================================================================
# S6 — Data collection
# =====================================================================
- id: S6F11
stream: 6
function: 11
w: true
builder: s6f11_event_report
parser: parse_s6f11
body:
kind: list
struct_name: EventReportMessage
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- {name: ceid, shape: {kind: scalar, item_type: U4}}
- name: reports
shape:
kind: list_of
element:
kind: list
struct_name: ReportData
external_struct: true
fields:
- {name: rptid, shape: {kind: scalar, item_type: U4}}
- name: values
shape: {kind: list_of, element: {kind: scalar, item_type: ITEM}}
- id: S6F12
stream: 6
function: 12
builder: s6f12_event_report_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: EventReportAck, param: ack}
# S6F5 / S6F6 — Multi-block Data Send Inquire / Grant. Equipment
# asks permission before pushing a large S6F11 (or other primary) of
# DATALENGTH bytes; host replies with GRANT6 (0=OK, 1=Busy, 2=NoSpace,
# 3=DuplicateMsg, 4=BadMsg). HSMS doesn't need this for sizing
# reasons (no 244-byte block ceiling), but the spec contract is kept.
- id: S6F5
stream: 6
function: 5
w: true
builder: s6f5_multi_block_inquire
parser: parse_s6f5
body:
kind: list
struct_name: MultiBlockInquire
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- {name: datalength, shape: {kind: scalar, item_type: U4}}
- id: S6F6
stream: 6
function: 6
builder: s6f6_multi_block_grant
body: {kind: scalar, item_type: BINARY_BYTE, enum: MultiBlockGrant, param: grant6}
# S6F7 / S6F8 — Data Transfer Request / Send. Host pulls a previously
# announced data set by DATAID; equipment responds with the full
# `[CEID, [[DSID, [[DVNAME, DVVAL], ...]], ...]]` structure.
- id: S6F7
stream: 6
function: 7
w: true
builder: s6f7_data_transfer_request
parser: parse_s6f7
body: {kind: scalar, item_type: U4, param: dataid}
- id: S6F8
stream: 6
function: 8
builder: s6f8_data_transfer_send
parser: parse_s6f8
body:
kind: list
struct_name: DataTransferSend
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- {name: ceid, shape: {kind: scalar, item_type: U4}}
- name: data_sets
shape:
kind: list_of
element:
kind: list
struct_name: DataSet
fields:
- {name: dsid, shape: {kind: scalar, item_type: U4}}
- name: values
shape:
kind: list_of
element:
kind: list
struct_name: NamedValue
fields:
- {name: dvname, shape: {kind: scalar, item_type: ASCII}}
- {name: dvval, shape: {kind: scalar, item_type: ITEM}}
# S6F15 / S6F16 — Event Report Request / Send (host-initiated).
# Host asks for the latest report payload bound to CEID; equipment
# replies with the same body shape as the unsolicited S6F11.
- id: S6F15
stream: 6
function: 15
w: true
builder: s6f15_event_report_request
parser: parse_s6f15
body: {kind: scalar, item_type: U4, param: ceid}
- id: S6F16
stream: 6
function: 16
builder: s6f16_event_report_data
parser: parse_s6f16
body:
kind: list
struct_name: EventReportMessage
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- {name: ceid, shape: {kind: scalar, item_type: U4}}
- name: reports
shape:
kind: list_of
element:
kind: list
struct_name: ReportData
external_struct: true
fields:
- {name: rptid, shape: {kind: scalar, item_type: U4}}
- name: values
shape: {kind: list_of, element: {kind: scalar, item_type: ITEM}}
# S6F19 / S6F20 — Individual Report Request / Data (host-initiated).
# Host pulls a specific RPTID; equipment replies with the list of VID
# values that report currently holds.
- id: S6F19
stream: 6
function: 19
w: true
builder: s6f19_individual_report_request
parser: parse_s6f19
body: {kind: scalar, item_type: U4, param: rptid}
- id: S6F20
stream: 6
function: 20
builder: s6f20_individual_report_data
parser: parse_s6f20
body:
kind: list_of
element: {kind: scalar, item_type: ITEM}
name: values
# S6F21 / S6F22 — Annotated Individual Report Request / Data.
# Same as S6F19 but the reply carries (VID, V) pairs so the host
# doesn't need to remember the report definition.
- id: S6F21
stream: 6
function: 21
w: true
builder: s6f21_annotated_report_request
parser: parse_s6f21
body: {kind: scalar, item_type: U4, param: rptid}
- id: S6F22
stream: 6
function: 22
builder: s6f22_annotated_report_data
parser: parse_s6f22
body:
kind: list_of
name: items
element:
kind: list
struct_name: AnnotatedValue
fields:
- {name: vid, shape: {kind: scalar, item_type: U4}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
# S6F23 / S6F24 — Request Spooled Data (E30 §6.22; host transmits or purges).
- id: S6F23
stream: 6
function: 23
w: true
builder: s6f23_request_spool_data
parser: parse_s6f23
body: {kind: scalar, item_type: BINARY_BYTE, enum: SpoolRequestCode, param: rsdc}
- id: S6F24
stream: 6
function: 24
builder: s6f24_request_spool_data_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: SpoolRequestAck, param: rsda}
# S6F25 / S6F26 — Spool data ready notification (equipment-initiated;
# fires on re-SELECT when there's queued data). Host acks with S6F26;
# then host decides whether to issue S6F23(Transmit) or S6F23(Purge).
- id: S6F25
stream: 6
function: 25
w: true
builder: s6f25_spool_data_ready
parser: parse_s6f25
body: {kind: scalar, item_type: U4, param: num_msg}
- id: S6F26
stream: 6
function: 26
builder: s6f26_spool_data_ready_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: EventReportAck, param: ack}
# =====================================================================
# S7 — Process programs
# =====================================================================
# S7F1 / S7F2 — Process Program Load Inquire / Grant. Host announces
# an intended S7F3 of LENGTH bytes; equipment grants or denies based
# on space, busy state, mode etc. PPGNT is the 7-value
# ProcessProgramAck enum (Accept=0 / PermissionNotGranted=1 / ...).
- id: S7F1
stream: 7
function: 1
w: true
builder: s7f1_pp_load_inquire
parser: parse_s7f1
body:
kind: list
struct_name: PPLoadInquire
fields:
- {name: ppid, shape: {kind: scalar, item_type: ASCII}}
- {name: length, shape: {kind: scalar, item_type: U4}}
- id: S7F2
stream: 7
function: 2
builder: s7f2_pp_load_grant
body: {kind: scalar, item_type: BINARY_BYTE, enum: ProcessProgramAck, param: ppgnt}
- id: S7F3
stream: 7
function: 3
w: true
builder: s7f3_process_program_send
parser: parse_s7f3
body:
kind: list
struct_name: ProcessProgram
fields:
- {name: ppid, shape: {kind: scalar, item_type: ASCII}}
- {name: ppbody, shape: {kind: scalar, item_type: BINARY_OR_ASCII}}
- id: S7F4
stream: 7
function: 4
builder: s7f4_process_program_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: ProcessProgramAck, param: ack}
- id: S7F5
stream: 7
function: 5
w: true
builder: s7f5_process_program_request
parser: parse_s7f5
body: {kind: scalar, item_type: ASCII, param: ppid}
- id: S7F6
stream: 7
function: 6
builder: s7f6_process_program_data
parser: parse_s7f6
body:
kind: list
struct_name: ProcessProgram
fields:
- {name: ppid, shape: {kind: scalar, item_type: ASCII}}
- {name: ppbody, shape: {kind: scalar, item_type: BINARY_OR_ASCII}}
- id: S7F19
stream: 7
function: 19
w: true
builder: s7f19_current_eppd_request
- id: S7F20
stream: 7
function: 20
builder: s7f20_current_eppd_data
parser: parse_s7f20
body:
kind: list_of
element: {kind: scalar, item_type: ASCII}
name: ppids
# S7F17 / S7F18 — Delete Process Program Send / Acknowledge. Body is
# a list of PPIDs to delete; an empty list deletes every PP (the spec
# calls this "delete all"). ACKC7 reuses the S7F4 ack enum.
- id: S7F17
stream: 7
function: 17
w: true
builder: s7f17_delete_pp_send
parser: parse_s7f17
body:
kind: list_of
element: {kind: scalar, item_type: ASCII}
name: ppids
- id: S7F18
stream: 7
function: 18
builder: s7f18_delete_pp_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: ProcessProgramAck, param: ack}
# =====================================================================
# E42 — Enhanced (formatted) Process Programs (S7F23F26).
#
# An enhanced PP is a list of (CCODE, params) rows: each row is one
# command + its parameters. Unlike the opaque PPBODY in S7F3/F6
# (which is just a text blob), the formatted form lets the host
# inspect / synthesize a recipe step-by-step.
#
# CCODE is a free-form ASCII command name (e.g. "HEAT", "GAS_FLOW",
# "STEP_END"); each parameter is a (PNAME, PVAL) pair where PVAL is
# any SECS-II Item (carried as ITEM in the schema).
# =====================================================================
- id: S7F23
stream: 7
function: 23
w: true
builder: s7f23_formatted_pp_send
parser: parse_s7f23
body:
kind: list
struct_name: FormattedProcessProgram
fields:
- {name: ppid, shape: {kind: scalar, item_type: ASCII}}
- {name: mdln, shape: {kind: scalar, item_type: ASCII}}
- {name: softrev, shape: {kind: scalar, item_type: ASCII}}
- name: steps
shape:
kind: list_of
element:
kind: list
struct_name: FormattedStep
fields:
- {name: ccode, shape: {kind: scalar, item_type: ASCII}}
- name: params
shape:
kind: list_of
element:
kind: list
struct_name: FormattedParam
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- id: S7F24
stream: 7
function: 24
builder: s7f24_formatted_pp_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: ProcessProgramAck, param: ack}
- id: S7F25
stream: 7
function: 25
w: true
builder: s7f25_formatted_pp_request
parser: parse_s7f25
body: {kind: scalar, item_type: ASCII, param: ppid}
- id: S7F26
stream: 7
function: 26
builder: s7f26_formatted_pp_data
parser: parse_s7f26
body:
kind: list
struct_name: FormattedProcessProgram
fields:
- {name: ppid, shape: {kind: scalar, item_type: ASCII}}
- {name: mdln, shape: {kind: scalar, item_type: ASCII}}
- {name: softrev, shape: {kind: scalar, item_type: ASCII}}
- name: steps
shape:
kind: list_of
element:
kind: list
struct_name: FormattedStep
fields:
- {name: ccode, shape: {kind: scalar, item_type: ASCII}}
- name: params
shape:
kind: list_of
element:
kind: list
struct_name: FormattedParam
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
# =====================================================================
# S9 — Protocol error notifications (E5). All carry the 10-byte
# offending message header (MHEAD) as a single BINARY item, except
# S9F13 which carries <L,2 <A MEXP> <A EDID>>. These are
# equipment-initiated (typically W=0) and host-side acks are not
# mandatory; we emit them on the wire but don't expect replies.
# =====================================================================
- id: S9F1
stream: 9
function: 1
builder: s9f1_unrecognized_device_id
parser: parse_s9f1
body: {kind: scalar, item_type: BINARY, param: mhead}
- id: S9F3
stream: 9
function: 3
builder: s9f3_unrecognized_stream_type
parser: parse_s9f3
body: {kind: scalar, item_type: BINARY, param: mhead}
- id: S9F5
stream: 9
function: 5
builder: s9f5_unrecognized_function_type
parser: parse_s9f5
body: {kind: scalar, item_type: BINARY, param: mhead}
- id: S9F7
stream: 9
function: 7
builder: s9f7_illegal_data
parser: parse_s9f7
body: {kind: scalar, item_type: BINARY, param: mhead}
- id: S9F9
stream: 9
function: 9
builder: s9f9_transaction_timer_timeout
parser: parse_s9f9
body: {kind: scalar, item_type: BINARY, param: mhead}
- id: S9F11
stream: 9
function: 11
builder: s9f11_data_too_long
parser: parse_s9f11
body: {kind: scalar, item_type: BINARY, param: mhead}
- id: S9F13
stream: 9
function: 13
builder: s9f13_conversation_timeout
parser: parse_s9f13
body:
kind: list
struct_name: ConversationTimeout
fields:
- {name: mexp, shape: {kind: scalar, item_type: ASCII}}
- {name: edid, shape: {kind: scalar, item_type: ASCII}}
# =====================================================================
# S10 — Terminal services
# =====================================================================
- id: S10F1
stream: 10
function: 1
w: true
builder: s10f1_terminal_display_single
parser: parse_s10f1
body:
kind: list
struct_name: TerminalDisplay
fields:
- {name: tid, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: text, shape: {kind: scalar, item_type: ASCII}}
- id: S10F2
stream: 10
function: 2
builder: s10f2_terminal_display_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: TerminalAck, param: ack}
- id: S10F3
stream: 10
function: 3
w: true
builder: s10f3_terminal_display_single
parser: parse_s10f3
body:
kind: list
struct_name: TerminalDisplay
fields:
- {name: tid, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: text, shape: {kind: scalar, item_type: ASCII}}
- id: S10F4
stream: 10
function: 4
builder: s10f4_terminal_display_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: TerminalAck, param: ack}
# S10F5 / S10F6 — Terminal Display, Multi-line (host -> equipment).
- id: S10F5
stream: 10
function: 5
w: true
builder: s10f5_terminal_display_multi
parser: parse_s10f5
body:
kind: list
struct_name: TerminalDisplayMulti
fields:
- {name: tid, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: lines
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- id: S10F6
stream: 10
function: 6
builder: s10f6_terminal_display_multi_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: TerminalAck, param: ack}
# S10F7 — Terminal Display, Broadcast (host -> equipment, no reply).
# E5: a one-way push of a multi-line broadcast message to all terminals.
# Same TID + LINES shape as S10F5 but no ack expected (W=0).
- id: S10F7
stream: 10
function: 7
builder: s10f7_terminal_display_broadcast
parser: parse_s10f7
body:
kind: list
struct_name: TerminalDisplayBroadcast
fields:
- {name: tid, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: lines
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
# =====================================================================
# S12 — Wafer Maps (E5 §13).
#
# IDTYP discriminates the kind of identifier carried by MID:
# 0 wafer ID, 1 substrate ID, 2 lot+slot, 3 design ID.
# MAPFT selects the data-payload format:
# 0 row format (F7/F8), 1 array format (F9/F10), 2 coordinate (F11/F12).
# Reference points are <L,2 RPX RPY> pairs (I4 coordinates).
#
# This first pass covers the setup + transmit-inquire + row-format data
# + error fan; the alternative-encoding pairs (F9/F10 array, F11/F12
# coord, F13-F18 corresponding requests) are scope-deferred — they're
# mechanical YAML edits once a tool needs them.
# =====================================================================
# S12F1 / F2 — Map Setup Data Send.
- id: S12F1
stream: 12
function: 1
w: true
builder: s12f1_map_setup_send
parser: parse_s12f1
body:
kind: list
struct_name: MapSetupData
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: fnloc, shape: {kind: scalar, item_type: U2}}
- {name: ffrot, shape: {kind: scalar, item_type: U2}}
- {name: orloc, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: rpsel, shape: {kind: scalar, item_type: U1}}
- name: refp
shape:
kind: list_of
element:
kind: list
struct_name: ReferencePoint
external_struct: true
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- name: dutms
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- id: S12F2
stream: 12
function: 2
builder: s12f2_map_setup_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: MapSetupAck, param: sdack}
# S12F3 / F4 — Map Setup Data Request.
- id: S12F3
stream: 12
function: 3
w: true
builder: s12f3_map_setup_request
parser: parse_s12f3
body:
kind: list
struct_name: MapSetupRequest
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: mapft, shape: {kind: scalar, item_type: BINARY_BYTE}}
- id: S12F4
stream: 12
function: 4
builder: s12f4_map_setup_reply
parser: parse_s12f4
body:
kind: list
struct_name: MapSetupReply
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: fnloc, shape: {kind: scalar, item_type: U2}}
- {name: orloc, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: rpsel, shape: {kind: scalar, item_type: U1}}
- name: refp
shape:
kind: list_of
element:
kind: list
struct_name: ReferencePoint
external_struct: true
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- name: dutms
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- {name: xdies, shape: {kind: scalar, item_type: U2}}
- {name: ydies, shape: {kind: scalar, item_type: U2}}
# S12F5 / F6 — Map Transmit Inquire / Grant. Equipment asks the host
# for permission to send a map (MAPFT specifies the format, MLCL is
# the predicted data length in die units).
- id: S12F5
stream: 12
function: 5
w: true
builder: s12f5_map_transmit_inquire
parser: parse_s12f5
body:
kind: list
struct_name: MapTransmitInquire
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: mapft, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: mlcl, shape: {kind: scalar, item_type: U4}}
- id: S12F6
stream: 12
function: 6
builder: s12f6_map_transmit_grant
body: {kind: scalar, item_type: BINARY_BYTE, enum: MapTransmitGrant, param: grant}
# S12F7 / F8 — Map Data Send (row format, MAPFT=0). Each row of the
# map is one BINARY blob of packed bin codes; the outer list orders
# rows top-to-bottom relative to ORLOC.
- id: S12F7
stream: 12
function: 7
w: true
builder: s12f7_map_data_send_row
parser: parse_s12f7
body:
kind: list
struct_name: MapDataRow
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: rows
shape: {kind: list_of, element: {kind: scalar, item_type: BINARY}}
- id: S12F8
stream: 12
function: 8
builder: s12f8_map_data_send_row_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: MapDataAck, param: maper}
# S12F9 / F10 — Map Data Send (array format, MAPFT=1). The entire
# die grid is one BINARY blob, scanned in the order defined by ORLOC.
# STRP is the starting (col, row) for the first byte of BINLT.
- id: S12F9
stream: 12
function: 9
w: true
builder: s12f9_map_data_send_array
parser: parse_s12f9
body:
kind: list
struct_name: MapDataArray
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: strp
shape:
kind: list
struct_name: ReferencePoint
external_struct: true
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- {name: binlt, shape: {kind: scalar, item_type: BINARY}}
- id: S12F10
stream: 12
function: 10
builder: s12f10_map_data_send_array_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: MapDataAck, param: maper}
# S12F11 / F12 — Map Data Send (coordinate format, MAPFT=2). Each
# entry is a (XYPOS, BIN-byte) pair; sparse maps only carry the dies
# that actually exist. BINLT here is a single BINARY byte (the bin
# code) per coordinate.
- id: S12F11
stream: 12
function: 11
w: true
builder: s12f11_map_data_send_coord
parser: parse_s12f11
body:
kind: list
struct_name: MapDataCoord
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: entries
shape:
kind: list_of
element:
kind: list
struct_name: MapDataCoordEntry
fields:
- name: xypos
shape:
kind: list
struct_name: ReferencePoint
external_struct: true
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- {name: binlt, shape: {kind: scalar, item_type: BINARY}}
- id: S12F12
stream: 12
function: 12
builder: s12f12_map_data_send_coord_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: MapDataAck, param: maper}
# S12F13 / F14 — Map Data Request (row format). Host asks for the
# current map; equipment replies with row payload (RSINF row-start
# info + per-row bin blob).
- id: S12F13
stream: 12
function: 13
w: true
builder: s12f13_map_data_request_row
parser: parse_s12f13
body:
kind: list
struct_name: MapDataIdentifier
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- id: S12F14
stream: 12
function: 14
builder: s12f14_map_data_send_row_reply
parser: parse_s12f14
body:
kind: list
struct_name: MapDataRowReply
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: rows
shape:
kind: list_of
element:
kind: list
struct_name: MapDataRowEntry
fields:
- name: rsinf
shape:
kind: list
struct_name: RowStartInfo
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- {name: direction, shape: {kind: scalar, item_type: I4}}
- {name: binlt, shape: {kind: scalar, item_type: BINARY}}
# S12F15 / F16 — Map Data Request (array format). Same request shape
# as F13; reply mirrors F9.
- id: S12F15
stream: 12
function: 15
w: true
builder: s12f15_map_data_request_array
parser: parse_s12f15
body:
kind: list
struct_name: MapDataIdentifier
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- id: S12F16
stream: 12
function: 16
builder: s12f16_map_data_send_array_reply
parser: parse_s12f16
body:
kind: list
struct_name: MapDataArray
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: strp
shape:
kind: list
struct_name: ReferencePoint
external_struct: true
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- {name: binlt, shape: {kind: scalar, item_type: BINARY}}
# S12F17 / F18 — Map Data Request (coordinate format). Request carries
# SDBIN (the single bin code to filter on, or 0xFF for "all"); reply
# mirrors F11.
- id: S12F17
stream: 12
function: 17
w: true
builder: s12f17_map_data_request_coord
parser: parse_s12f17
body:
kind: list
struct_name: MapDataCoordRequest
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: sdbin, shape: {kind: scalar, item_type: BINARY_BYTE}}
- id: S12F18
stream: 12
function: 18
builder: s12f18_map_data_send_coord_reply
parser: parse_s12f18
body:
kind: list
struct_name: MapDataCoord
fields:
- {name: mid, shape: {kind: scalar, item_type: ASCII}}
- {name: idtyp, shape: {kind: scalar, item_type: BINARY_BYTE}}
- name: entries
shape:
kind: list_of
element:
kind: list
struct_name: MapDataCoordEntry
fields:
- name: xypos
shape:
kind: list
struct_name: ReferencePoint
external_struct: true
fields:
- {name: x, shape: {kind: scalar, item_type: I4}}
- {name: y, shape: {kind: scalar, item_type: I4}}
- {name: binlt, shape: {kind: scalar, item_type: BINARY}}
# S12F19 — Map Error Send. Equipment reports a non-recoverable map
# error (e.g. format mismatch, oversize payload). One-way (no reply).
- id: S12F19
stream: 12
function: 19
builder: s12f19_map_error_send
parser: parse_s12f19
body:
kind: list
struct_name: MapError
fields:
- {name: mapercd, shape: {kind: scalar, item_type: BINARY_BYTE}}
- {name: errtext, shape: {kind: scalar, item_type: ASCII}}
# =====================================================================
# S3 — E87 Carrier Management.
#
# CARRIERID is an ASCII identifier (per E87-0716 §10.2 typically up to
# 40 chars). CAACK is the host/equipment ack byte for carrier-action
# requests, modelled here as CarrierActionAck. PORTID is U1, SLOTID
# is U1. We carry only the most common subset of S3 here; richer
# forms (E14 generic ObjectService) are YAML extension points.
# =====================================================================
# S3F17 / S3F18 — CarrierAction. Host instructs equipment to perform
# a carrier-level operation (ProceedWithCarrier, CancelCarrier,
# CancelCarrierAtPort, BindCarrierID, ResetCarrier, ...). The list of
# parameters is action-specific; we carry it as a parallel name/value
# list mirroring S2F41's CommandParameter shape.
- id: S3F17
stream: 3
function: 17
w: true
builder: s3f17_carrier_action
parser: parse_s3f17
body:
kind: list
struct_name: CarrierActionRequest
fields:
- {name: dataid, shape: {kind: scalar, item_type: U4}}
- {name: carrieraction, shape: {kind: scalar, item_type: ASCII}}
- {name: carrierid, shape: {kind: scalar, item_type: ASCII}}
- name: params
shape:
kind: list_of
element:
kind: list
struct_name: CommandParameter
external_struct: true
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- id: S3F18
stream: 3
function: 18
builder: s3f18_carrier_action_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: CarrierActionAck, param: caack}
# S3F23 / S3F24 — Port Group Change Report (equipment notifies host of
# a port-grouping change; E87-0716 §10.4).
- id: S3F23
stream: 3
function: 23
w: true
builder: s3f23_port_group_change_report
parser: parse_s3f23
body:
kind: list
struct_name: PortGroupChangeReport
fields:
- {name: ctngrpid, shape: {kind: scalar, item_type: ASCII}}
- name: portids
shape: {kind: list_of, element: {kind: scalar, item_type: U1}}
- id: S3F24
stream: 3
function: 24
builder: s3f24_port_group_change_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: PortGroupAck, param: pgack}
# S3F25 / S3F26 — Carrier Transfer (host instructs equipment to move
# a carrier between source and target ports).
- id: S3F25
stream: 3
function: 25
w: true
builder: s3f25_carrier_transfer
parser: parse_s3f25
body:
kind: list
struct_name: CarrierTransferRequest
fields:
- {name: carrierid, shape: {kind: scalar, item_type: ASCII}}
- {name: source_portid, shape: {kind: scalar, item_type: U1}}
- {name: target_portid, shape: {kind: scalar, item_type: U1}}
- id: S3F26
stream: 3
function: 26
builder: s3f26_carrier_transfer_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: CarrierActionAck, param: caack}
# S3F19 / S3F20 — Slot Map Verify. Host sends its expected slot map
# for the carrier; equipment compares against its locally-read map
# and replies SVACK (Accept/Mismatch). On Accept, CSMS transitions
# to Read; on Mismatch, CSMS goes to Mismatched.
- id: S3F19
stream: 3
function: 19
w: true
builder: s3f19_slot_map_verify
parser: parse_s3f19
body:
kind: list
struct_name: SlotMapVerifyRequest
fields:
- {name: carrierid, shape: {kind: scalar, item_type: ASCII}}
- name: slots
shape: {kind: list_of, element: {kind: scalar, item_type: BINARY_BYTE}}
- id: S3F20
stream: 3
function: 20
builder: s3f20_slot_map_verify_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: SlotMapVerifyAck, param: svack}
# S3F21 / S3F22 — Slot Map Report. Equipment-initiated report of
# the slot map it sees (typically pushed after a CARRIERID is read
# so the host can decide whether to ProceedWithCarrier).
- id: S3F21
stream: 3
function: 21
w: true
builder: s3f21_slot_map_report
parser: parse_s3f21
body:
kind: list
struct_name: SlotMapReport
fields:
- {name: carrierid, shape: {kind: scalar, item_type: ASCII}}
- name: slots
shape: {kind: list_of, element: {kind: scalar, item_type: BINARY_BYTE}}
- id: S3F22
stream: 3
function: 22
builder: s3f22_slot_map_report_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: SlotMapVerifyAck, param: svack}
# S3F27 / S3F28 — Cancel Carrier (host cancels a carrier operation).
- id: S3F27
stream: 3
function: 27
w: true
builder: s3f27_cancel_carrier
parser: parse_s3f27
body: {kind: scalar, item_type: ASCII, param: carrierid}
- id: S3F28
stream: 3
function: 28
builder: s3f28_cancel_carrier_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: CarrierActionAck, param: caack}
# =====================================================================
# S14 — Object services (E94 ControlJob create/delete).
#
# Real E14 ObjectService is a fully generic generic-attribute carrier;
# for the E94 demo we use a simplified shape that names the object
# type ("ControlJob") and carries the CTLJOBID + contained PRJOBIDs
# directly. The wire shape is a defensible subset of E14F9 with the
# generic ATTRIBUTES list specialized.
# =====================================================================
# S14F1 / F2 — GetAttr (generic). E39/E14 ObjectService form: host
# requests one or more attribute values from a named object. OBJSPEC
# is the dotted path through the CEM tree, OBJTYPE is the expected
# type (validated by the equipment), ATTRID is a list of names.
# Reply carries the values in the same order, plus an OBJACK code.
- id: S14F1
stream: 14
function: 1
w: true
builder: s14f1_get_attr
parser: parse_s14f1
body:
kind: list
struct_name: GetAttrRequest
fields:
- {name: objspec, shape: {kind: scalar, item_type: ASCII}}
- {name: objtype, shape: {kind: scalar, item_type: ASCII}}
- name: attrids
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- id: S14F2
stream: 14
function: 2
builder: s14f2_get_attr_data
parser: parse_s14f2
body:
kind: list
struct_name: GetAttrReply
fields:
- name: attrs
shape:
kind: list_of
element:
kind: list
struct_name: AttrValue
fields:
- {name: attrid, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- {name: ack, shape: {kind: scalar, item_type: BINARY_BYTE, enum: ObjectAck}}
# S14F3 / F4 — SetAttr (generic). Same OBJSPEC/OBJTYPE addressing as
# GetAttr; body carries (ATTRID, VALUE) pairs the equipment applies
# in order. Reply echoes whatever the equipment now has.
- id: S14F3
stream: 14
function: 3
w: true
builder: s14f3_set_attr
parser: parse_s14f3
body:
kind: list
struct_name: SetAttrRequest
fields:
- {name: objspec, shape: {kind: scalar, item_type: ASCII}}
- {name: objtype, shape: {kind: scalar, item_type: ASCII}}
- name: attrs
shape:
kind: list_of
element:
kind: list
struct_name: AttrValue
external_struct: true
fields:
- {name: attrid, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- id: S14F4
stream: 14
function: 4
builder: s14f4_set_attr_ack
parser: parse_s14f4
body:
kind: list
struct_name: SetAttrReply
fields:
- name: attrs
shape:
kind: list_of
element:
kind: list
struct_name: AttrValue
external_struct: true
fields:
- {name: attrid, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- {name: ack, shape: {kind: scalar, item_type: BINARY_BYTE, enum: ObjectAck}}
# S14F9 / F10 — CreateObject (CJ). Host asks the equipment to bring
# a new ControlJob into existence and registers the list of PJs it
# contains; the CJ starts in CJ-QUEUED.
- id: S14F9
stream: 14
function: 9
w: true
builder: s14f9_create_control_job
parser: parse_s14f9
body:
kind: list
struct_name: CreateControlJobRequest
fields:
- {name: ctljobid, shape: {kind: scalar, item_type: ASCII}}
- name: prjobids
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- id: S14F10
stream: 14
function: 10
builder: s14f10_create_control_job_ack
parser: parse_s14f10
body:
kind: list
struct_name: CreateControlJobAck
fields:
- {name: ctljobid, shape: {kind: scalar, item_type: ASCII}}
- {name: ack, shape: {kind: scalar, item_type: BINARY_BYTE, enum: ObjectAck}}
# S14F11 / F12 — DeleteObject (CJ).
- id: S14F11
stream: 14
function: 11
w: true
builder: s14f11_delete_control_job
parser: parse_s14f11
body: {kind: scalar, item_type: ASCII, param: ctljobid}
- id: S14F12
stream: 14
function: 12
builder: s14f12_delete_control_job_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: ObjectAck, param: ack}
# =====================================================================
# S16 — Process Management (E40 Process Jobs, E94 Control Jobs).
#
# Wire shapes are E40-0705 / E94-0705 with a couple of deliberate
# simplifications documented inline. The PJ/CJ state set and the legal
# transitions live in data/process_job_state.yaml and
# data/control_job_state.yaml respectively (data-driven, same pattern
# as data/control_state.yaml).
# =====================================================================
# S16F5 / F6 — PRJobCommand. Host issues Start / Pause / Resume /
# Stop / Abort / HOQ against an existing process job.
- id: S16F5
stream: 16
function: 5
w: true
builder: s16f5_pr_job_command
parser: parse_s16f5
body:
kind: list
struct_name: PRJobCommandRequest
fields:
- {name: prjobid, shape: {kind: scalar, item_type: ASCII}}
- {name: prcmd, shape: {kind: scalar, item_type: ASCII}}
- id: S16F6
stream: 16
function: 6
builder: s16f6_pr_job_command_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck, param: ack}
# S16F9 — PRJobAlert. E->H one-way alert that a PJ entered a new
# state. PRJOBSTATE is the E40 PJ state code (0..7). Equipment
# emits one per PJ state transition when alerts are enabled.
- id: S16F9
stream: 16
function: 9
builder: s16f9_pr_job_alert
parser: parse_s16f9
body:
kind: list
struct_name: PRJobAlert
fields:
- {name: prjobid, shape: {kind: scalar, item_type: ASCII}}
- {name: prjobstate, shape: {kind: scalar, item_type: BINARY_BYTE, enum: ProcessJobState}}
# S16F11 / F12 — PRJobCreate. Full E40-0705 §10.2 body:
#
# <L,5 PRJOBID MF PRRECIPEMETHOD RCPSPEC <L,n MTRLOUTSPEC> <L,n PRPROCESSPARAMS>>
# where RCPSPEC = <L,2 PPID <L,n <L,2 RCPPARNM RCPPARVAL>>>
# PRPROCESSPARAMS entry = <L,2 PARAMNAME PARAMVAL>
#
# The earlier simplified 3-field form (PRJOBID, PPID, MTRLOUTSPEC) is
# still available via a hand-written convenience overload
# `s16f11_pr_job_create_simple` for callers that don't care about
# MF / PRRECIPEMETHOD / process params.
- id: S16F11
stream: 16
function: 11
w: true
builder: s16f11_pr_job_create
parser: parse_s16f11
body:
kind: list
struct_name: PRJobCreateRequest
fields:
- {name: prjobid, shape: {kind: scalar, item_type: ASCII}}
- {name: mf, shape: {kind: scalar, item_type: BINARY_BYTE, enum: MaterialFlag}}
- {name: prrecipemethod,
shape: {kind: scalar, item_type: BINARY_BYTE, enum: ProcessRecipeMethod}}
- name: rcpspec
shape:
kind: list
struct_name: RecipeSpec
fields:
- {name: ppid, shape: {kind: scalar, item_type: ASCII}}
- name: rcpvars
shape:
kind: list_of
element:
kind: list
struct_name: RecipeVariable
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- name: mtrloutspec
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- name: prprocessparams
shape:
kind: list_of
element:
kind: list
struct_name: ProcessParameter
fields:
- {name: name, shape: {kind: scalar, item_type: ASCII}}
- {name: value, shape: {kind: scalar, item_type: ITEM}}
- id: S16F12
stream: 16
function: 12
builder: s16f12_pr_job_create_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck, param: ack}
# S16F13 / F14 — PRJobDequeue. Host removes a queued PJ.
- id: S16F13
stream: 16
function: 13
w: true
builder: s16f13_pr_job_dequeue
parser: parse_s16f13
body: {kind: scalar, item_type: ASCII, param: prjobid}
- id: S16F14
stream: 16
function: 14
builder: s16f14_pr_job_dequeue_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck, param: ack}
# S16F7 / S16F8 — PRJobMonitor. Host enables or disables S16F9
# PRJobAlert emission per PRJOBID. PRALERT is a 1-byte boolean
# (0 = disable, 0x80 = enable, per E40-0705 §10).
- id: S16F7
stream: 16
function: 7
w: true
builder: s16f7_pr_job_monitor
parser: parse_s16f7
body:
kind: list
struct_name: PRJobMonitorRequest
fields:
- name: entries
shape:
kind: list_of
element:
kind: list
struct_name: PRJobMonitorEntry
fields:
- {name: prjobid, shape: {kind: scalar, item_type: ASCII}}
- {name: pralert, shape: {kind: scalar, item_type: BINARY_BYTE}}
- id: S16F8
stream: 16
function: 8
builder: s16f8_pr_job_monitor_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck, param: ack}
# S16F15 / S16F16 — PRJobCreateMultiple. Bulk create variant of
# S16F11; the host posts a batch of jobs in one round-trip. The
# equipment processes them in order and replies with a per-job ACK
# list so the host can tell which subset failed.
- id: S16F15
stream: 16
function: 15
w: true
builder: s16f15_pr_job_create_multi
parser: parse_s16f15
body:
kind: list
struct_name: PRJobCreateMultiRequest
fields:
- name: jobs
shape:
kind: list_of
element:
kind: list
struct_name: PRJobCreateEntry
fields:
- {name: prjobid, shape: {kind: scalar, item_type: ASCII}}
- {name: ppid, shape: {kind: scalar, item_type: ASCII}}
- name: mtrloutspec
shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}}
- id: S16F16
stream: 16
function: 16
builder: s16f16_pr_job_create_multi_ack
parser: parse_s16f16
body:
kind: list
struct_name: PRJobCreateMultiAck
fields:
- name: results
shape:
kind: list_of
element:
kind: list
struct_name: PRJobCreateMultiResult
fields:
- {name: prjobid, shape: {kind: scalar, item_type: ASCII}}
- {name: ack, shape: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck}}
# S16F27 / F28 — CJobCommand (E94). Host issues Start / Pause /
# Resume / Stop / Abort against an existing CJ.
- id: S16F27
stream: 16
function: 27
w: true
builder: s16f27_cj_command
parser: parse_s16f27
body:
kind: list
struct_name: CJobCommandRequest
fields:
- {name: ctljobid, shape: {kind: scalar, item_type: ASCII}}
- {name: ctljobcmd, shape: {kind: scalar, item_type: ASCII}}
- id: S16F28
stream: 16
function: 28
builder: s16f28_cj_command_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: HostCmdAck, param: ack}