5个版本

0.0.5 2023年9月11日
0.0.4 2023年2月17日
0.0.3 2023年2月6日
0.0.2 2022年10月3日
0.0.1 2022年10月3日

#27 in #acceleration


用于 4 个crate(通过 futuresdr

Apache-2.0

27KB
604

FutureSDR宏

使FutureSDR的工作更便捷的宏。

连接宏

在设置流程图时避免样板代码。此宏简化了将块添加到流程图并将它们连接起来的操作。

假设您已创建了一个流程图 fg 和几个块 (srcshift、...),并需要将块添加到流程图中并连接它们。使用 connect! 宏,这可以这样做

connect!(fg,
    src.out > shift.in;
    shift > resamp1 > demod;
    demod > resamp2 > snk;
);

它生成以下代码

// Add all the blocks to the `Flowgraph`...
let src = fg.add_block(src);
let shift = fg.add_block(shift);
let resamp1 = fg.add_block(resamp1);
let demod = fg.add_block(demod);
let resamp2 = fg.add_block(resamp2);
let snk = fg.add_block(snk);

// ... and connect the ports appropriately
fg.connect_stream(src, "out", shift, "in")?;
fg.connect_stream(shift, "out", resamp1, "in")?;
fg.connect_stream(resamp1, "out", demod, "in")?;
fg.connect_stream(demod, "out", resamp2, "in")?;
fg.connect_stream(resamp2, "out", snk, "in")?;

连接端点由 block.port_name 定义。标准名称(即,out/in)可以省略。当端口名称不同于标准 inout 时,可以使用以下表示法。

流连接用 > 表示,而消息连接用 | 表示。

只需单独在一行上放置它们,就可以添加没有连接的块。

connect!(fg, dummy);

带有空格的端口名称必须加引号。

connect!(fg,
    src."out port" > snk
);

消息处理宏

在创建消息处理程序时避免样板代码。

假设一个带有消息处理程序的块,该处理程序引用一个块函数 Self::my_handler

pub fn new() -> Block {
    Block::new(
        BlockMetaBuilder::new("MyBlock").build(),
        StreamIoBuilder::new().build(),
        MessageIoBuilder::new()
            .add_input("handler", Self::my_handler)
            .build(),
        Self,
    )
}

处理程序实现的后台机制相当复杂。使用 message_handler 宏,它可以简化为

#[message_handler]
async fn my_handler(
    &mut self,
    _io: &mut WorkIo,
    _mio: &mut MessageIo<Self>,
    _meta: &mut BlockMeta,
    _p: Pmt,
) -> Result<Pmt> {
    Ok(Pmt::Null)
}

依赖项

~1.2–1.8MB
~34K SLoC