波形的生命周期

时间:2013-12-18 21:15:09

标签: redhawksdr

我想在启动时在cpu上启动Redhawk Domain Mgr,Device Mgrs和Waveform,无需任何用户干预。然后,我应该能够使用IDE连接到它。

我创建了一个执行以下操作的python脚本:

#! /usr/local/bin/python
from ossie.utils import redhawk
#Start a new domain and device managers
domain = redhawk.kickDomain()
wave = domain.createApplication("/waveforms/msgWaveform/msgWaveform.sad.xml")
wave.start()

这将启动Domain mgr,Device mgr和Msg波形。

在这个perl脚本完成之后,我将调出IDE。我连接到域。我看到了设备,但波形不存在。当perl脚本完成时,波形似乎结束。我希望波形不会消失,但我可以在以后检索它。

我是否需要启动一项用于帮助保持波形存活的服务?

2 个答案:

答案 0 :(得分:2)

请尝试使用以下脚本:

from ossie.utils import redhawk
#Start a new domain and device managers
domain = redhawk.kickDomain()
domain.installApplication("/waveforms/msgWaveform/msgWaveform.sad.xml")
appFactory = domain._get_applicationFactories()[0]
wave = appFactory.create(appFactory._get_name(), [], [])
wave.start()
# Uninstall the Application Factory
domain.uninstallApplication(appFactory._get_identifier())

你的wave被释放的原因是因为createApplication()函数特定于你导入的redhawk python模块。它基本上将上述调用包装成一个干净的用户调用。此外,它还会跟踪已启动的应用程序,以便在脚本退出时清除它们,这就是您所看到的。

通过执行上述操作,您将直接访问CORBA接口方法,这样可以避免从python代码中记录应用程序,因此在脚本退出时不会清除。

答案 1 :(得分:2)

当脚本退出时,“createApplication”会有意清理,但有两种方法可以解决它。

最简单的方法是在脚本末尾添加while循环。只要脚本正在运行,这将使波形保持运行,并且您将在运行脚本的终端中通过Ctrl-C停止它。根据您的原始脚本,它看起来像:

#! /usr/local/bin/python
import time
from ossie.utils import redhawk
#Start a new domain and device managers
domain = redhawk.kickDomain()
time.sleep(1)

wave = domain.createApplication("/waveforms/Test/Test.sad.xml")
wave.start()

while True:
  time.sleep(1)

除了测试之外,建议不要使用此功能。除了在脚本结束时关闭Waveform之外,上述代码还会停止域和设备管理器。对于在启动时启动波形的系统,通常通过/etc/init.d脚本启动域和设备管理器,如下所示:

nodeBooter -D --daemon
nodeBooter -d /nodes/DevMgr_[hostname]/DeviceManager.dcd.xml --daemon

然后在你的脚本中你会做类似的事情:

from ossie.utils import redhawk
from ossie.cf import CF

domain = redhawk.Domain('REDHAWK_DEV')

try:
  domain.installApplication("/waveforms/Test/Test.sad.xml")
except CF.DomainManager.ApplicationAlreadyInstalled:
  print "Already Installed, skipping."

factories = domain._get_applicationFactories()
#if multiple applications are installed you can look for the correct factory
#  using factories[i]._get_name() == 'Test'
myFactory = factories[0]

myFactory.create('Test_[UNIQUEID]', [], [])