我可以将变量挂接到自定义非处理块吗?

Can I hook a variable to a custom non-processing block?

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

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)

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

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

我没有亲自为 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来匹配你的代码,但它实际上是你的块的参数的名称,而不是变量的名称。您的块定义不知道也不需要知道参数是常量、变量还是包含变量的表达式。