Quatm’s services communicate over ZeroMQ. The design keeps the timing path independent of rendering, and makes local and remote clients interchangeable.
Hubs and streams
Each data type has a Hub that collects and redistributes messages:
- scalar data streams;
- image streams;
- command channels;
- property updates;
- messages and logs.
Clients connect to the Hubs they need. A client process does not need to know which other clients exist, and a Hub failure is visible and restartable.
Client types
| Client | Purpose |
|---|---|
DataClient | subscribe to scalar data series |
ImageClient | subscribe to camera images |
CommandClient | send commands to a controller |
MessageClient | publish and receive operational messages |
Properties | synchronise the distributed property tree |
Properties
The property tree is the shared configuration and state model. Properties are read and written by name through a filesystem-like path; the Property Logger persists the tree and applies the persistence policy. GUI panels, web dashboards and experiment code all read the same values.
Remote property writes use a persistent publisher and explicit acknowledgement, so a remote action is not silently lost when a connection is slow.
Transport choices
- IPC for processes on the same machine (lowest latency).
- TCP for split control/analysis machines and remote clients.
Curve encryption is available for local and network channels. The transport layer also handles multipart framing, malformed-frame recovery and request timeouts.
Configuration
Endpoints, project root and service selection are read from the project’s configuration/ directory. A service can be launched by the Operations Console, by a project launcher, or directly as a Python module for debugging.