#pragma once #include "secsgem/gem/runtime.hpp" namespace secsgem::gem { // The default GEM behaviour, decomposed along the capability lines GEM // itself defines (the S1F19 compliance list): each function registers one // capability's message handlers and/or state-change emitters onto a runtime. // Equipment implementing a subset of GEM (a sensor with no carriers, a // recipe-less tool) registers only what it is; register_default_handlers // registers everything and is what `secs_server` and `secs_gemd` use. // // All functions are idempotent-per-slot (later registration replaces the // Router entry / primary handler slot) and must be called before run(). // Application behaviour (host-command callbacks via on_command, sensor value // updates) is layered on top by the caller. // // The ids the built-ins target (control-state/clock SVIDs, CJ state CEIDs) // come from the config's `roles:` block — see EquipmentDescriptor. void register_identification(EquipmentRuntime& R); // S1 + E30 control state void register_equipment_constants(EquipmentRuntime& R); // S2F13/15/29 void register_clock(EquipmentRuntime& R); // S2F17/31 void register_event_reports(EquipmentRuntime& R); // S2F33/35/37, S6F5/15/19/21 void register_remote_commands(EquipmentRuntime& R); // S2F21/41/49 void register_trace_and_limits(EquipmentRuntime& R); // S2F23/45/47 void register_spooling(EquipmentRuntime& R); // S2F43, S6F23 void register_alarms(EquipmentRuntime& R); // S5F3/5/7 void register_exceptions(EquipmentRuntime& R); // S5F9/11/15 emitters, S5F13/17 void register_material_tracking(EquipmentRuntime& R); // E90/E116/E157 emitters void register_carriers(EquipmentRuntime& R); // E87: S3F17/19/25/27 void register_recipes(EquipmentRuntime& R); // S7F1/3/5/17/19 void register_object_services(EquipmentRuntime& R); // E39: S14F1/3 void register_jobs(EquipmentRuntime& R); // E40/E94: S14F9/11, S16Fxx void register_terminal_services(EquipmentRuntime& R); // S10F1/3/5 // Everything above, in one call. void register_default_handlers(EquipmentRuntime& R); } // namespace secsgem::gem