![](/img/trans.png)
[英]Printing from within an embedded Python program in GNU Radio Companion
[英]Develop in GNU Radio Companion; call top block's methods in separate Python file
我想...
例如,假设我想扫描此流程图中的中心频率:
Osmocom source --> NBFM Receive --> Audio sink
我猜消息传递将允许我以编程方式设置 osmocom 的中心频率,但在 Python 中做这样的事情会更容易(我认为......?):
freqs = [100e6, 101e6]
for freq in freqs:
set_center_freq(freq)
你有什么建议? (我正在回答我自己的问题,但我很好奇其他人是否提出了改进建议!🙂 )
您可以从 GRC 生成的 Python 文件中导入顶部块。 这样,当文件重新生成时,您不会丢失所做的更改。
from my_generated_FM_receiver import my_generated_FM_receiver
tb = my_generated_FM_receiver()
运行流程图需要做更多的设置。 (参见此处,第 103-128 行,从def main(top_block_cls...
) 开始。
如果您想访问tb
变量,您可以创建一个线程并将tb
作为参数传递,如下所示(此代码与通常生成的代码相同,除了末尾附近添加的两行):
from threading import Thread
def set_up_qt_top_block_and_run_func_in_thread(top_block_cls, func_to_run):
if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
style = gr.prefs().get_string('qtgui', 'style', 'raster')
Qt.QApplication.setGraphicsSystem(style)
qapp = Qt.QApplication(sys.argv)
tb = top_block_cls()
tb.start()
tb.show()
def sig_handler(sig=None, frame=None):
Qt.QApplication.quit()
signal.signal(signal.SIGINT, sig_handler)
signal.signal(signal.SIGTERM, sig_handler)
timer = Qt.QTimer()
timer.start(500)
timer.timeout.connect(lambda: None)
def quitting():
tb.stop()
tb.wait()
qapp.aboutToQuit.connect(quitting)
#######################
## this is my addition
##
thread = Thread(target = func_to_run, args = (tb, ), daemon=True)
thread.start()
## end my addition
#######################
qapp.exec_()
以下是您可以使用它的方法:
# This is your GRC-generated Python module
from my_generated_FM_receiver import my_generated_FM_receiver
def runMe(tb):
freqs = [100e6, 101e6]
for freq in freqs:
tb.osmosdr_source_0.set_center_freq(freq)
set_up_qt_top_block_and_run_func_in_thread(my_generated_FM_receiver, runMe)
PS:在 GRC 3.9+ 中, Python Snippit可能会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.