如何将接收器连接到REDHAWK中的外部波形端口?

时间:2019-07-18 15:10:45

标签: redhawksdr

我正在尝试为REDHAWK波形编写单元测试。我想使用流源来输入数据,并使用流/消息接收器来存储输出。我已经以这种方式编写了组件的单元测试,但也想创建一个波形测试。我找到了一种将StreamSource连接到波形端口的解决方案,但无法确定如何将接收器连接到波形端口。

对于源和组件(其中self.comp是组件),通常可以使用以下内容进行连接:

src = StreamSource(streamId='strm1', format='short')
src.connect(providesComponent=self.comp,
            providesPortName='dataShort_in',
            connectionId='testConn')

对于源和波形(其中self.app是波形),我能够进行以下操作:

src = StreamSource(streamId='strm1', format='short')
src.connect(providesComponent=CorbaObject(self.app.getPort('dataShort_in')),
            connectionId='testConn')

但是,对于接收器,我通常会在组件上调用connect

sink = StreamSink('short')
self.comp.connect(sink, usesPortName='dataShort_out')

我试图通过从波形中获取端口来使用与源情况类似的方法:

sink = StreamSink('short')
self.app.getPort('dataShort_out').connectPort(sink, 'outputConn')

但是,这给出了错误:

File "/usr/local/redhawk/core/lib/python/ossie/cf/Port_idl.py", line 86, in connectPort
  return self._obj.invoke("connectPort", _0_CF.Port._d_connectPort, args)
BAD_PARAM: CORBA.BAD_PARAM(omniORB.BAD_PARAM_WrongPythonType, CORBA.COMPLETED_NO, ["Expecting object reference, got <class 'bulkio.sandbox.streamsink.StreamSink'>", "Operation 'connectPort' parameter 0"])

我不确定如何获取要在此处使用的接收器的CORBA obj ref。还是我可以在这里使用另一种方法将端口连接到接收器?

我在Centos 7上使用REDHAWK 2.2.2。

2 个答案:

答案 0 :(得分:0)

我想我已经找到了解决自己问题的方法。我最终创建了一个新类,该类管理适用于接收器和源的端口连接。我称它为ConnectionManager(希望它不会与ossie.utils.model.connection.ConnectionManager类混淆。

class ConnectionManager:
    def __init__(self):
        self.connections = list()

    def clear(self):
        del self.connections[:]

    def connect(self, usesPort, providesPort, id):
        usesPort.connectPort(providesPort, id)
        self.connections.append( (usesPort, id))

    def disconnectAll(self):
        for port, id in self.connections:
            port.disconnectPort(id)
        self.clear()

以下是使用StreamSourceself.cmConnectionManager)的示例:

strm = sb.StreamSource(streamID='strm1', format='short')
self.cm.connect(strm.getPort('shortOut'),
                self.app.getPort('dataShort_in'),
                'connID')

还有一个使用StreamSink的示例:

sink = sb.StreamSink('short')
self.cm.connect(self.app.getPort('dataShort_out'),
                sink.getPort('shortIn'),
                'conn2ID')

我的单元测试setUp方法调用self.cm.clear()tearDown方法调用self.cm.disconnectAll()以在每次测试后清理连接。

我唯一不了解的是接收器和源类的端口名称。使用{format}{In|Out}名称有效,但是我不知道为什么。

答案 1 :(得分:0)

您将组件连接到接收器的过程与该过程相同,只要该应用程序是沙箱对象而不是CORBA对象即可。

dom = redhawk.attach()
app = dom.apps[0]
sink = sb.StreamSink('short')
app.connect(sink)

下面的代码显示端口的名称。在这种情况下,只有short类型之一。

from pprint import pprint
pprint(sink._providesPortDict)

下面的代码显示了使用CORBA引用而不是沙箱对象的语法。

sink_port = sink.getPort('shortIn')
ref = app.ref
ref.getPort('dataShort_out').connectPort(sink_port, 'outputConn')

您可以在沙箱中运行波形。请注意,波形的组件需要在本地主机上运行。

使用nodeBooter shell命令或kickDomain Python软件包中的redhawk启动域管理器和设备管理器。

在沙箱中运行波形的示例代码:

import os
from ossie.utils import redhawk, sb

dom = redhawk.attach()
SDRROOT = os.getenv('SDRROOT')
waveform_dir = os.path.join(SDRROOT, 'dom', 'waveforms')
waveform_name = os.listdir(waveform_dir)[0]
app = dom.createApplication(waveform_name)
sink = sb.StreamSink()
app.connect(sink)