Files
raphael a2ebbf7c65 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>
2026-06-26 21:43:07 +02:00

729 lines
33 KiB
Python

# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
from . import equipment_pb2 as equipment__pb2
class EquipmentStub(object):
"""=============================================================================
SECS/GEM Equipment API
The daemon *is* one piece of SEMI equipment: it owns the HSMS link to the
host (MES) and speaks GEM on your behalf. Your tool software connects as a
client and only ever does two things:
• tell the equipment about itself — set variables, fire events, raise alarms
• react to what the host asks for — receive commands/jobs, answer them
Everything SECS lives inside the daemon: message framing, report definitions,
the GEM state machines, timers, spooling. You need no SEMI knowledge to use
this API. Items are addressed by the human names from your equipment config
(e.g. "chamber_pressure"), never by numeric SVID / CEID / ALID.
CAPABILITY TIERS — wire up only what your equipment is:
• Universal — variables, events, alarms, control state, commands. Every tool.
• Carriers — E87 carrier/load-port flows. Only carrier-based equipment.
• Recipes — S7 process-program transfer. Only recipe-driven equipment.
• Jobs — E40 process jobs. Only job-based process/front-end equipment.
If a tier doesn't apply, you simply never receive its HostRequest variants and
never call its report RPCs.
=============================================================================
---- Universal: report state to the host --------------------------------
"""
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.SetVariables = channel.unary_unary(
'/secsgem.v1.Equipment/SetVariables',
request_serializer=equipment__pb2.VariableUpdate.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.GetVariables = channel.unary_unary(
'/secsgem.v1.Equipment/GetVariables',
request_serializer=equipment__pb2.VariableQuery.SerializeToString,
response_deserializer=equipment__pb2.VariableSnapshot.FromString,
)
self.FireEvent = channel.unary_unary(
'/secsgem.v1.Equipment/FireEvent',
request_serializer=equipment__pb2.Event.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.SetAlarm = channel.unary_unary(
'/secsgem.v1.Equipment/SetAlarm',
request_serializer=equipment__pb2.Alarm.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.ClearAlarm = channel.unary_unary(
'/secsgem.v1.Equipment/ClearAlarm',
request_serializer=equipment__pb2.Alarm.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.GetControlState = channel.unary_unary(
'/secsgem.v1.Equipment/GetControlState',
request_serializer=equipment__pb2.Empty.SerializeToString,
response_deserializer=equipment__pb2.ControlState.FromString,
)
self.RequestControlState = channel.unary_unary(
'/secsgem.v1.Equipment/RequestControlState',
request_serializer=equipment__pb2.ControlStateRequest.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.Subscribe = channel.unary_stream(
'/secsgem.v1.Equipment/Subscribe',
request_serializer=equipment__pb2.SubscribeRequest.SerializeToString,
response_deserializer=equipment__pb2.HostRequest.FromString,
)
self.CompleteCommand = channel.unary_unary(
'/secsgem.v1.Equipment/CompleteCommand',
request_serializer=equipment__pb2.CommandResult.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.ReportProcessJob = channel.unary_unary(
'/secsgem.v1.Equipment/ReportProcessJob',
request_serializer=equipment__pb2.ProcessJobState.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.ReportCarrier = channel.unary_unary(
'/secsgem.v1.Equipment/ReportCarrier',
request_serializer=equipment__pb2.CarrierState.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.ReportSubstrate = channel.unary_unary(
'/secsgem.v1.Equipment/ReportSubstrate',
request_serializer=equipment__pb2.SubstrateReport.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.ReportModule = channel.unary_unary(
'/secsgem.v1.Equipment/ReportModule',
request_serializer=equipment__pb2.ModuleReport.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.WatchHealth = channel.unary_stream(
'/secsgem.v1.Equipment/WatchHealth',
request_serializer=equipment__pb2.Empty.SerializeToString,
response_deserializer=equipment__pb2.Health.FromString,
)
self.Describe = channel.unary_unary(
'/secsgem.v1.Equipment/Describe',
request_serializer=equipment__pb2.Empty.SerializeToString,
response_deserializer=equipment__pb2.EquipmentDescription.FromString,
)
self.FlushSpool = channel.unary_unary(
'/secsgem.v1.Equipment/FlushSpool',
request_serializer=equipment__pb2.SpoolFlushRequest.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
self.SendTerminalMessage = channel.unary_unary(
'/secsgem.v1.Equipment/SendTerminalMessage',
request_serializer=equipment__pb2.TerminalMessage.SerializeToString,
response_deserializer=equipment__pb2.Ack.FromString,
)
class EquipmentServicer(object):
"""=============================================================================
SECS/GEM Equipment API
The daemon *is* one piece of SEMI equipment: it owns the HSMS link to the
host (MES) and speaks GEM on your behalf. Your tool software connects as a
client and only ever does two things:
• tell the equipment about itself — set variables, fire events, raise alarms
• react to what the host asks for — receive commands/jobs, answer them
Everything SECS lives inside the daemon: message framing, report definitions,
the GEM state machines, timers, spooling. You need no SEMI knowledge to use
this API. Items are addressed by the human names from your equipment config
(e.g. "chamber_pressure"), never by numeric SVID / CEID / ALID.
CAPABILITY TIERS — wire up only what your equipment is:
• Universal — variables, events, alarms, control state, commands. Every tool.
• Carriers — E87 carrier/load-port flows. Only carrier-based equipment.
• Recipes — S7 process-program transfer. Only recipe-driven equipment.
• Jobs — E40 process jobs. Only job-based process/front-end equipment.
If a tier doesn't apply, you simply never receive its HostRequest variants and
never call its report RPCs.
=============================================================================
---- Universal: report state to the host --------------------------------
"""
def SetVariables(self, request, context):
"""Update one or more status/data variables by name. The daemon remembers the
values, so the host always sees the latest when it polls (S1F3).
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def GetVariables(self, request, context):
"""Read back what the daemon currently holds (useful on tool restart/reconnect).
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def FireEvent(self, request, context):
"""Fire a collection event by name. The daemon assembles the configured report
and sends S6F11. Values in `data` override current values for this one event.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def SetAlarm(self, request, context):
"""Raise (S5F1 set) or clear an alarm by name.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ClearAlarm(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def GetControlState(self, request, context):
"""---- Universal: control state -------------------------------------------
Current GEM control state (ONLINE/LOCAL/REMOTE/OFFLINE).
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def RequestControlState(self, request, context):
"""Request a transition — e.g. an operator panel taking the tool OFFLINE for
maintenance, or back ONLINE. The daemon applies E30 rules and may decline.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def Subscribe(self, request, context):
"""---- Universal: react to the host ---------------------------------------
Subscribe to everything the host asks of this equipment. The daemon streams
HostRequest messages for as long as the call stays open.
Delivery contract (v1):
- firehose: every subscriber receives every host request;
- NO buffering: a command arriving while no client is subscribed is
answered with its declarative ack from the equipment config (the
pre-daemon behaviour) and is NOT replayed on reconnect — the daemon
never tells the host "will finish later" for work no tool will do;
- when a Command does arrive here, the host has ALREADY been answered
with S2F42 HCACK=4; report the real outcome via FireEvent/SetAlarm.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def CompleteCommand(self, request, context):
"""Report the outcome of a Command delivered on the stream, quoting its `id`.
NOTE the contract (SEMI-conformant, non-blocking): the daemon has ALREADY
answered the host with S2F42 HCACK=4 ("accepted, will finish later") when
it pushed the command onto the stream — the host's transaction is closed.
CompleteCommand therefore correlates/audits the command lifecycle; the
host learns the real outcome via the events/alarms you fire (FireEvent /
SetAlarm), exactly as E30 intends. A synchronous gating mode (tool decides
the HCACK before S2F42 goes out) is a possible v2 extension.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ReportProcessJob(self, request, context):
"""---- Jobs / Carriers: report progress of work the host asked for --------
Keyed by the durable id (job_id / carrier_id), not a per-message id — these
are long-lived objects you report against as the physical work proceeds.
E40 — job-based tools
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ReportCarrier(self, request, context):
"""E87 — carrier-based tools. WAITING announces a physically-arrived
carrier (creates it; idempotent — re-announce updates the slot map);
IN_ACCESS / COMPLETE drive the access FSM. The host's S3F17 decisions
(ProceedWithCarrier / CancelCarrier) come back on the Subscribe stream
as CarrierAction.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ReportSubstrate(self, request, context):
"""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.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ReportModule(self, request, context):
"""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.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def WatchHealth(self, request, context):
"""---- Diagnostics --------------------------------------------------------
Live daemon/link status: distinguishes "host went offline" from "cable
unplugged" from "spool filling up". Streams a snapshot on every change.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def Describe(self, request, context):
"""Everything this equipment is configured with, by name — for tooling,
diagnostics, and client-side validation/autocomplete.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def FlushSpool(self, request, context):
"""Flush the spool: purge=true discards queued messages, purge=false drains
them toward the host (requires a SELECTED session).
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def SendTerminalMessage(self, request, context):
"""Equipment-initiated operator message to the host (S10F1). Fails with
CANNOT_DO_NOW when no host is connected and stream 10 isn't spoolable.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_EquipmentServicer_to_server(servicer, server):
rpc_method_handlers = {
'SetVariables': grpc.unary_unary_rpc_method_handler(
servicer.SetVariables,
request_deserializer=equipment__pb2.VariableUpdate.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'GetVariables': grpc.unary_unary_rpc_method_handler(
servicer.GetVariables,
request_deserializer=equipment__pb2.VariableQuery.FromString,
response_serializer=equipment__pb2.VariableSnapshot.SerializeToString,
),
'FireEvent': grpc.unary_unary_rpc_method_handler(
servicer.FireEvent,
request_deserializer=equipment__pb2.Event.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'SetAlarm': grpc.unary_unary_rpc_method_handler(
servicer.SetAlarm,
request_deserializer=equipment__pb2.Alarm.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'ClearAlarm': grpc.unary_unary_rpc_method_handler(
servicer.ClearAlarm,
request_deserializer=equipment__pb2.Alarm.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'GetControlState': grpc.unary_unary_rpc_method_handler(
servicer.GetControlState,
request_deserializer=equipment__pb2.Empty.FromString,
response_serializer=equipment__pb2.ControlState.SerializeToString,
),
'RequestControlState': grpc.unary_unary_rpc_method_handler(
servicer.RequestControlState,
request_deserializer=equipment__pb2.ControlStateRequest.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'Subscribe': grpc.unary_stream_rpc_method_handler(
servicer.Subscribe,
request_deserializer=equipment__pb2.SubscribeRequest.FromString,
response_serializer=equipment__pb2.HostRequest.SerializeToString,
),
'CompleteCommand': grpc.unary_unary_rpc_method_handler(
servicer.CompleteCommand,
request_deserializer=equipment__pb2.CommandResult.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'ReportProcessJob': grpc.unary_unary_rpc_method_handler(
servicer.ReportProcessJob,
request_deserializer=equipment__pb2.ProcessJobState.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'ReportCarrier': grpc.unary_unary_rpc_method_handler(
servicer.ReportCarrier,
request_deserializer=equipment__pb2.CarrierState.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'ReportSubstrate': grpc.unary_unary_rpc_method_handler(
servicer.ReportSubstrate,
request_deserializer=equipment__pb2.SubstrateReport.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'ReportModule': grpc.unary_unary_rpc_method_handler(
servicer.ReportModule,
request_deserializer=equipment__pb2.ModuleReport.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'WatchHealth': grpc.unary_stream_rpc_method_handler(
servicer.WatchHealth,
request_deserializer=equipment__pb2.Empty.FromString,
response_serializer=equipment__pb2.Health.SerializeToString,
),
'Describe': grpc.unary_unary_rpc_method_handler(
servicer.Describe,
request_deserializer=equipment__pb2.Empty.FromString,
response_serializer=equipment__pb2.EquipmentDescription.SerializeToString,
),
'FlushSpool': grpc.unary_unary_rpc_method_handler(
servicer.FlushSpool,
request_deserializer=equipment__pb2.SpoolFlushRequest.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
'SendTerminalMessage': grpc.unary_unary_rpc_method_handler(
servicer.SendTerminalMessage,
request_deserializer=equipment__pb2.TerminalMessage.FromString,
response_serializer=equipment__pb2.Ack.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'secsgem.v1.Equipment', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
# This class is part of an EXPERIMENTAL API.
class Equipment(object):
"""=============================================================================
SECS/GEM Equipment API
The daemon *is* one piece of SEMI equipment: it owns the HSMS link to the
host (MES) and speaks GEM on your behalf. Your tool software connects as a
client and only ever does two things:
• tell the equipment about itself — set variables, fire events, raise alarms
• react to what the host asks for — receive commands/jobs, answer them
Everything SECS lives inside the daemon: message framing, report definitions,
the GEM state machines, timers, spooling. You need no SEMI knowledge to use
this API. Items are addressed by the human names from your equipment config
(e.g. "chamber_pressure"), never by numeric SVID / CEID / ALID.
CAPABILITY TIERS — wire up only what your equipment is:
• Universal — variables, events, alarms, control state, commands. Every tool.
• Carriers — E87 carrier/load-port flows. Only carrier-based equipment.
• Recipes — S7 process-program transfer. Only recipe-driven equipment.
• Jobs — E40 process jobs. Only job-based process/front-end equipment.
If a tier doesn't apply, you simply never receive its HostRequest variants and
never call its report RPCs.
=============================================================================
---- Universal: report state to the host --------------------------------
"""
@staticmethod
def SetVariables(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/SetVariables',
equipment__pb2.VariableUpdate.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def GetVariables(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/GetVariables',
equipment__pb2.VariableQuery.SerializeToString,
equipment__pb2.VariableSnapshot.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def FireEvent(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/FireEvent',
equipment__pb2.Event.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def SetAlarm(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/SetAlarm',
equipment__pb2.Alarm.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def ClearAlarm(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/ClearAlarm',
equipment__pb2.Alarm.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def GetControlState(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/GetControlState',
equipment__pb2.Empty.SerializeToString,
equipment__pb2.ControlState.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def RequestControlState(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/RequestControlState',
equipment__pb2.ControlStateRequest.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def Subscribe(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_stream(request, target, '/secsgem.v1.Equipment/Subscribe',
equipment__pb2.SubscribeRequest.SerializeToString,
equipment__pb2.HostRequest.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def CompleteCommand(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/CompleteCommand',
equipment__pb2.CommandResult.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def ReportProcessJob(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/ReportProcessJob',
equipment__pb2.ProcessJobState.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def ReportCarrier(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/ReportCarrier',
equipment__pb2.CarrierState.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def ReportSubstrate(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/ReportSubstrate',
equipment__pb2.SubstrateReport.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def ReportModule(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/ReportModule',
equipment__pb2.ModuleReport.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def WatchHealth(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_stream(request, target, '/secsgem.v1.Equipment/WatchHealth',
equipment__pb2.Empty.SerializeToString,
equipment__pb2.Health.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def Describe(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/Describe',
equipment__pb2.Empty.SerializeToString,
equipment__pb2.EquipmentDescription.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def FlushSpool(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/FlushSpool',
equipment__pb2.SpoolFlushRequest.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def SendTerminalMessage(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/secsgem.v1.Equipment/SendTerminalMessage',
equipment__pb2.TerminalMessage.SerializeToString,
equipment__pb2.Ack.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)