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)
27KB
604 行
FutureSDR宏
使FutureSDR的工作更便捷的宏。
连接宏
在设置流程图时避免样板代码。此宏简化了将块添加到流程图并将它们连接起来的操作。
假设您已创建了一个流程图 fg
和几个块 (src
、shift
、...),并需要将块添加到流程图中并连接它们。使用 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
)可以省略。当端口名称不同于标准 in
和 out
时,可以使用以下表示法。
流连接用 >
表示,而消息连接用 |
表示。
只需单独在一行上放置它们,就可以添加没有连接的块。
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