【问题标题】:Can I hook a variable to a custom non-processing block?我可以将变量挂钩到自定义非处理块吗?
【发布时间】:2020-05-14 04:10:22
【问题描述】:

我正在为 GRC 实现一个自定义块,它通过串行向硬件发送命令。每次变量(例如 QT GUI 范围)更改时,我都需要它发送命令。我对 GNU 无线电很陌生,所以我不知道最好的方法是什么。我是否需要从 GNU radio 的块类之一(例如同步块)派生我的类,还是应该使用自定义类创建一个自定义块并将其以其他方式连接到系统中?如何设置它以便更改的变量调用我的块的串行发送函数?

MESSAGE_STR = 'SET '


class SerialBlock:
    def __init__(self):
        self.ser = detect_device()

    def send_var(self, var):
        if self.ser is None:
            raise RuntimeError("No device found")

        bytes_to_write = bytearray(f"{MESSAGE_STR}{int(var)}", 'utf8')
        self.ser.write(bytes_to_write)

这是课程。如果我想更改滑块以使用新值调用 send_var(),最好的做法是什么?

【问题讨论】:

    标签: python gnuradio


    【解决方案1】:

    当您为 GRC 定义一个块的结构时(在 .xml (3.7).block.yml (3.8) 文件中),您指定“回调”,这些代码应该插入到 GRC 生成的代码中,以便在任何时候调用参数(您的块)取决于变量(GRC 用户创建的)更改,通常调用“setter 方法”。你只需要写一个这样的回调。

    我没有亲自为 GR 3.8 编写过这样的文件,但通过检查示例,您的 .block.yml 看起来应该类似于:

    templates:
        [...other things in the templates section...]
        callbacks:
        - send_var(${var})
    

    在 3.7 中它将是 XML

    <callback>send_var($var)</callback>
    

    我写了var 来匹配您的代码,但它实际上是您的块的参数 的名称,而不是变量的名称。您的块定义不知道也不需要知道参数是常量、变量还是包含变量的表达式。

    【讨论】:

    • 谢谢!你知道这是在哪里记录的吗?我只是错过了它,还是我可以为 GNU Radio 贡献一些文档?我还在 Ubuntu 上使用 3.7,所以 XML 是完美的。但是,我相信将来有相同问题的其他人会感谢您添加 .yml 格式。
    • @LouisCloete 我已经添加了指向我找到的 wiki 页面的链接。我还在 GR 的源代码中搜索了标准块的文件示例。不幸的是,我没有找到任何关于 GRC 操作原理的参考文档。
    猜你喜欢
    • 1970-01-01
    • 2021-04-18
    • 2022-07-20
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2021-07-22
    • 2011-10-27
    • 2014-05-01
    相关资源
    最近更新 更多