0

我想在启动时在 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()

这将启动域管理器、设备管理器和消息波形。

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

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

4

2 回答 2

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)

除了测试之外,不建议这样做。除了在脚本结束时关闭波形之外,上述代码还停止域和设备管理器。对于在启动时启动波形的系统,域和设备管理器通常通过 /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]', [], [])
于 2013-12-19T13:18:33.513 回答
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 代码中记账应用程序,因此不会在脚本退出时被清理。

于 2013-12-19T11:54:43.020 回答