diff --git a/COMPLIANCE.md b/COMPLIANCE.md index 48acf9e..4ee8df7 100644 --- a/COMPLIANCE.md +++ b/COMPLIANCE.md @@ -288,6 +288,7 @@ Legend: | S10F1 / S10F2 | E→H | ✅ | terminal request (equipment originated) | | S10F3 / S10F4 | H→E | ✅ | terminal display single | | S10F5 / S10F6 | H→E | ✅ | terminal display multi | +| S10F7 | H→E | ✅ | terminal display broadcast (W=0, no reply) | | S12F1–F19 | H↔E | ✅ | wafer maps — row, array, coord; setup, request, send, error | | S14F1 / S14F2 | H→E | ✅ | E39 GetAttr | | S14F3 / S14F4 | H→E | ✅ | E39 SetAttr | @@ -384,7 +385,6 @@ compliance claim. | HSMS-GS (multi-session) | Out of scope — modern HSMS-SS covers virtually all current GEM equipment. | | Equipment Processing States (concrete states) | E30 §6.3 says the specific states are tool-defined. We provide the engine (`ControlTransitionTable` + the YAML loader); equipment vendors load their concrete states (IDLE / SETUP / READY / EXECUTING / PAUSE / …) the same way `data/control_state.yaml` is loaded today. Spec-compliant either way. | | E42 Enhanced Process Programs (S7F23–F26) | A separate SEMI standard. E30 GEM Process Program Management only requires the unformatted set (S7F1/F3/F5/F17/F19), which we have. | -| S10F7 Broadcast Terminal Display | Rarely used; equipment vendors typically forgo it. Not required for the Terminal Services capability. | --- diff --git a/data/messages.yaml b/data/messages.yaml index 18d7596..d5bf5f3 100644 --- a/data/messages.yaml +++ b/data/messages.yaml @@ -1329,6 +1329,22 @@ messages: 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). # diff --git a/tests/test_messages.cpp b/tests/test_messages.cpp index 4a277fe..cc3e866 100644 --- a/tests/test_messages.cpp +++ b/tests/test_messages.cpp @@ -218,6 +218,20 @@ TEST_CASE("S10F5 carries TID + line list; S10F6 ack round-trip") { CHECK(*ack_byte(s10f6_terminal_display_multi_ack(TerminalAck::Accepted)) == 0); } +TEST_CASE("S10F7 broadcast: round-trip TID + lines, W=0") { + auto m = s10f7_terminal_display_broadcast( + 5, {"ALERT: pressure", "EVAC NOW", "STATUS UNKNOWN"}); + CHECK(m.stream == 10); + CHECK(m.function == 7); + CHECK_FALSE(m.reply_expected); // E5: S10F7 is a one-way broadcast. + auto td = parse_s10f7(m); + REQUIRE(td.has_value()); + CHECK(td->tid == 5); + REQUIRE(td->lines.size() == 3); + CHECK(td->lines[0] == "ALERT: pressure"); + CHECK(td->lines[2] == "STATUS UNKNOWN"); +} + // ---- Spool data ready (S6F25/F26) -------------------------------------- TEST_CASE("S6F25 carries NUM-MSG; S6F26 ack round-trip") {