我正在尝试为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。
答案 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()
以下是使用StreamSource
(self.cm
是ConnectionManager
)的示例:
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)