Yamcs Gateway
The goal of this project is to allow Yamcs to control instruments/payloads as part of an EGSE.
It is implemented in Rust to allow close to realtime behavior. The connection to Yamcs is via TCP.
As seen in the diagram below the program is composed of an async part on top of tokio interacting with a set of components (called ygw nodes) that implement the communication with the hardware devices. The nodes may chose to be sync or async and the sync ones can run into their own thread set to realtime priority if required. Communication between the async and sync nodes is done using Tokio channels.

Each node (corresponding to an end device) gets assigned a name and a u32 id. The names and ids are communicated to Yamcs which will use them to route commands and parameters.
This crate (yamcs-if) contains the code for communication with Yamcs and several standard nodes:
- UDP TM - receives TM packets via UDP and passes them to Yamcs
- UDP TC - passes TC from Yamcs via UDP to a remote device.
The create does not contain an executable. Each project should setup a separate binary executable crate combining the components from this crate possibly with its own components.
Node implementation and usage To create a node, each implementation will have to implement the YgwNode trait
Once the nodes have been implemented, the main program will look something like:
main
In Yamcs, each node appears as a link with possible sub-links. The link up/down commands and events are propagated from Yamcs to the node as messages.
The quickstart project illustrates the usage of the ygw framework for building an executable. It also showcases the ygw-macros crate for easing the publishing of parameters and commands in Yamcs.