#satellite #hardware-devices #aerospace #yamcs #egse #spacecraft

ygw

Yamcs网关的目的是允许Yamcs作为EGSE的一部分控制仪器/有效载荷。

1 个不稳定版本

0.1.0 2024年4月20日

#625 in 硬件支持

MIT 协议

58KB
1.5K SLoC

Yamcs网关

本项目旨在使Yamcs能够作为EGSE的一部分控制仪器/有效载荷。

该项目使用Rust编写,以实现接近实时行为。Yamcs的连接是通过TCP实现的。

如图所示,程序由tokio之上的异步部分组成,与一组组件(称为 ygw 节点)进行交互,这些组件实现了与硬件设备的通信。节点可以选择同步或异步,如果需要,同步节点可以在实时优先级的线程中运行。异步节点和同步节点之间的通信是通过Tokio通道完成的。

 ALT

每个节点(对应一个端设备)都会分配一个名称和一个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