我可以将变量挂接到自定义非处理块吗?
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
来匹配你的代码,但它实际上是你的块的参数的名称,而不是变量的名称。您的块定义不知道也不需要知道参数是常量、变量还是包含变量的表达式。
我正在为 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
来匹配你的代码,但它实际上是你的块的参数的名称,而不是变量的名称。您的块定义不知道也不需要知道参数是常量、变量还是包含变量的表达式。