78fb0c3826
E42 was an explicit out-of-scope item in the prior COMPLIANCE.md.
This commit closes it.
Wire messages added via the catalog:
S7F23 Formatted PP Send (H↔E, W=1)
S7F24 Formatted PP Ack (ProcessProgramAck)
S7F25 Formatted PP Request (PPID, W=1)
S7F26 Formatted PP Data (E→H, no reply)
Body shape: <L,4 PPID MDLN SOFTREV <L,n <L,2 CCODE <L,m <L,2
PNAME PVAL>>>>>. PVAL is declared ITEM so any SECS-II Item type
round-trips — proven by a test that mixes ASCII, BOOLEAN, U4, F8,
Binary, and nested List values in one step.
RecipeStore extension:
add_formatted(ppid, FormattedRecipe{mdln, softrev, steps})
get_formatted(ppid) -> optional<FormattedRecipe>
has_formatted(ppid) -> bool
Formatted + opaque views live alongside each other: a PPID can carry
both, size() counts unique PPIDs. remove() kills both views.
Six new tests cover wire round-trip per function, every
ProcessProgramAck code, ITEM passthrough, and the store's dual-view
semantics.
COMPLIANCE.md updated: E30 §6.17 row mentions S7F23-F26, S5 message
table grows two rows, §8 "out of scope" entry for E42 removed.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2292 lines
71 KiB
YAML
2292 lines
71 KiB
YAML
# 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 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 (S7F23–F26).
|
||
#
|
||
# 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}
|