feat(client)+feat(daemon): eq.names, @eq.command, E90/E157 RPCs

Python client:
- eq.names.event.* / .alarm.* / .command.* / .var.* / .constant.*  —
  autocomplete-able, typo-safe name lookup backed by the Describe RPC
  (lazy, cached; AttributeError on bad name with close-match hints)
- @eq.command decorator — binds a handler by function name, validated
  against the equipment's real command set at decoration time
- eq.report_substrate() — E90 wafer milestone reporting
- eq.report_module() — E157 module state reporting (auto-create)

Daemon (C++ service):
- ReportSubstrate RPC — drives E90 location + processing FSMs
- ReportModule RPC — drives E157 module FSM (auto-create on first report)
- ack_from_outcome() helper — consistent Ack mapping for read_sync results

Proto: SubstrateReport, ModuleReport, EquipmentDescription,
       SpoolFlushRequest, TerminalMessage; Describe, FlushSpool,
       SendTerminalMessage RPCs

Tests: C++ FSM test (journey + ghost rejection + E157 illegal jump);
       interop coverage for names API and E90/E157 round-trip

Docs: ch42 RPC table + Python example updated; ch16 daemon-path section added

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 21:43:07 +02:00
parent 9876dd9b5a
commit a2ebbf7c65
14 changed files with 602 additions and 27 deletions
+38
View File
@@ -91,6 +91,17 @@ service Equipment {
// as CarrierAction.
rpc ReportCarrier(CarrierState) returns (Ack);
// E90 — substrate (wafer) tracking. Report each milestone of a wafer's
// journey; the daemon drives the E90 FSMs and emits the standard CEIDs to
// the host. ARRIVED creates the substrate. Only for tools that track
// individual substrates.
rpc ReportSubstrate(SubstrateReport) returns (Ack);
// E157 — module process tracking. Report a module's execution state; the
// daemon drives the E157 FSM and emits the standard CEIDs. The module is
// auto-created on first report. Only for tools with tracked modules.
rpc ReportModule(ModuleReport) returns (Ack);
// ---- Diagnostics --------------------------------------------------------
// Live daemon/link status: distinguishes "host went offline" from "cable
@@ -278,6 +289,33 @@ message Health {
}
}
// ---- Material tracking (E90 / E157) ----------------------------------------
message SubstrateReport {
string substrate_id = 1;
Milestone milestone = 2;
string carrier_id = 3; // optional; recorded on ARRIVED
uint32 slot = 4; // optional; 1-based slot within the carrier
enum Milestone {
ARRIVED = 0; // create; AtSource / NeedsProcessing
AT_WORK = 1; // picked up for processing
PROCESSING = 2; // processing started
PROCESSED = 3; // processing finished
AT_DESTINATION = 4; // returned / deposited
}
}
message ModuleReport {
string module_id = 1;
State state = 2;
enum State {
NOT_EXECUTING = 0;
GENERAL_EXECUTING = 1;
STEP_EXECUTING = 2;
STEP_COMPLETED = 3;
}
}
// ---- Diagnostics & operations -----------------------------------------------
message EquipmentDescription {