# 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: - optional # param: - optional, default "value" # list: - fixed-arity # fields: [{name, shape}, ...] # struct_name: - optional; if set, parser returns the struct # external_struct: bool - optional; struct is assumed to exist already # list_of: - variable-arity # element: # 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 >. 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 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: # # > # where RCPSPEC = >> # PRPROCESSPARAMS entry = # # 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}