# 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}} # ===================================================================== # 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. - 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} # 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 # ===================================================================== - 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}} - 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}} - 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 # ===================================================================== # 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} # ===================================================================== # 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} # 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} # 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. # ===================================================================== # 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. # # Real E40-0705 S16F11 body is . We simplify to the # three pieces that actually drive the demo state machine: # PRJOBID, recipe (PPID), and the list of material identifiers. MF # / PRRECIPEMETHOD / PRPROCESSPARAMS are tool-specific; layering # them in is a YAML edit + builder overload, not surgery. - 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: ppid, shape: {kind: scalar, item_type: ASCII}} - name: mtrloutspec shape: {kind: list_of, element: {kind: scalar, item_type: ASCII}} - 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} # 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}