![](/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.