我想在启动时在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脚本完成时,波形似乎结束。我希望波形不会消失,但我可以在以后检索它。
我是否需要启动一项用于帮助保持波形存活的服务?
答案 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]', [], [])