天天看點

Gnuradio中的SWIG接口

一、GNU無線電中SWIG接口

從http://gnuradio.org/releases/gnuradio/gr-howto-write-a-block-3.3.0.tar.gz下載下傳 gr-howto-write-a-block-3.3.0.tar.gz檔案。

(1)塊名的命名約定:

在建立塊之後,我們在GNU Radio中使用它的唯一方法是建立一個python腳本,先載入包含我們塊的包/子產品,然後将我們的塊連接配接到GNU Radio流圖,将如下所示:

from package_name import module_name 

new_block = module_name.block_name()

在python中調用的子產品和塊名稱之間有一個統一規定。GNU Radio所有的C ++源代碼和頭檔案都是

[module_name] _ [block_name] .h和[module_name] _ [block_name] .cc形式。

是以,如果将C ++類命名為newModule_newBlock,那麼GNU Radio的build系統将可以從子產品“newModule”中獲得塊名稱為“newBlock” 。

(2)boost智能指針的命名約定:

所有指向GNU無線電塊的指針必須使用boost共享指針。如果我們在代碼中使用正常的C ++指針指向newBlock_newFunction,那麼這個“newModule_newBlock”的C ++信号處理子產品在GNU Radio的内部将不起作用。

換句話說,指令newModule_newBlock * ptr newBlock_newFunction()不會在GNU Radio中起作用。

這個規定是通過塊的構造函數私有化并確定正常C ++指針永遠不會指向塊對象來實作的

但如果構造函數是私有的,我們如何建立新的執行個體我們的塊,畢竟我們需要一些公共接口來建立新的塊執行個體。解決方案是聲明一個友元函數。

通過首先聲明該類的友元函數,以便它可以通路該類的所有私有成員(包括私有構造函數)。此友元函數調用私有構造函數并傳回一個智能指針。我們每次調用此友元函數構造一個我們想要的新的類對象。

假設我們的新信号處理子產品的名稱是newModule_newBlock_cc,那麼我們将建立一個檔案

newModule_newBlock_cc.cc,其中我們将包含以下函數聲明:

typedef boost :: shared_ptr newModule_newBlock_cc_sptr
friend newModule_newBlock_cc_sptr newModule_ make_ newBlock_cc()
           

現在函數newModule_make_newBlock_cc有權通路類的私有成員newModule_newBlock_cc 

最後一步是從原料C++中傳回資料類型指針到智能指針

newModule_newBlock_cc_sptr newModule_make_newBlock_cc() {
   return newModule_newBlock_cc_sptr (new newModule_newBlock_cc());
      }
           

可以直接調用的私有構造函數如下所示:

newModule_newBlock_cc() {
            gr_block("newBlock_cc",
            gr_makeio_signature (1,1, sizeof (gr_complex)),
            gr_make_iosignature (1,1, sizeof (gr_complex))) 
}
           

是以,總結一下私有構造實際上是建立一個新的對象gr_block 的“友元的構造”,這是公共接口私有的構造函數,作為替代通過包裝新由私有構造函數建立的對象到一個boost共享指針,這個複雜的過程確定所有指向該塊的指針都是boost智能指針。

建立對象的公共接口實際上不是對象構造函數newModule_newBlock_cc而是“代理”構造函數

newModule_make_newBlock_cc 

是以在我們的代碼我們必須使用下面的代碼來建立一個新的塊對象nb:

這裡要提到的一點很重要:如果一個塊的名字是newModule_newBlock_cc,那麼這個塊的共享指針的名字必須是newModule_newBlock_cc_sptr ,任何其他名字都會導緻代碼無法正常工作。

上面的命名無關緊要但是當這個C ++代碼塊在GNU Radio程式中被python調用時,GNU Radio希望共享指針的名字直接跟在塊名後面,并附加一個_sptr,否則會找不到block。

同時建立一個指向newModue_newBlock_cc的共享指針的代理構造函數必須有簽名

*注意在newModule和newBlock之間的make。