1 个不稳定版本
0.1.0 | 2024年4月20日 |
---|
#625 in 硬件支持
58KB
1.5K SLoC
Yamcs网关
本项目旨在使Yamcs能够作为EGSE的一部分控制仪器/有效载荷。
该项目使用Rust编写,以实现接近实时行为。Yamcs的连接是通过TCP实现的。
如图所示,程序由tokio之上的异步部分组成,与一组组件(称为 ygw 节点
)进行交互,这些组件实现了与硬件设备的通信。节点可以选择同步或异步,如果需要,同步节点可以在实时优先级的线程中运行。异步节点和同步节点之间的通信是通过Tokio通道完成的。
每个节点(对应一个端设备)都会分配一个名称和一个u32 ID。名称和ID会传达给Yamcs,Yamcs将使用它们来路由命令和参数。
该crate(yamcs-if)包含了与Yamcs通信的代码以及几个标准节点
- UDP TM - 通过UDP接收TM数据包并将它们传递给Yamcs
- UDP TC - 将Yamcs的TC通过UDP传递到远程设备。
该crate不包含可执行文件。每个项目都应该设置一个独立的二进制可执行crate,将此crate中的组件与可能的自定义组件结合。
节点实现和使用 要创建一个节点,每个实现都必须实现YgwNode trait
#[async_trait]
pub trait YgwNode:Send {
/// the properties of the node (name, description,...) - will be communicated to Yamcs
fn properties(&self) -> &YgwLinkNodeProperties;
/// the list of sub links - will also be communicated to Yamcs
fn sub_links(&self) -> &[Link];
/// method called by the ygw server to run the node
/// tx and rx are used to communicate between the node and the server
/// the node_id is the id allocated to this node, it has to be used for all the messages sent to the server
async fn run(&mut self, node_id: u32, tx: Sender<YgwMessage>, rx: Receiver<YgwMessage>);
}
节点实现后,主程序看起来可能如下所示
fn async main() {
let addr = ([127, 0, 0, 1], 56789).into();
let node1 = ...
let node2 = ...
let server = ServerBuilder::new(addr)
.add_node(Box::new(node1))
.add_node(Box::new(node2))
.build();
let server_handle = server.start().await.unwrap();
server_handle.join();
}
在Yamcs中,每个节点都显示为带有可能子链接的链接。链接的上下文命令和事件作为消息从Yamcs传播到节点。
快速入门项目展示了使用ygw框架构建可执行文件的使用方法。它还展示了ygw-macros crate,用于简化在Yamcs中发布参数和命令。
依赖关系
~5–13MB
~141K SLoC