【问题标题】:Lifecycle of Waveform波形生命周期
【发布时间】:2013-12-18 21:15:09
【问题描述】:

我想在启动时在 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 脚本完成时,波形似乎结束了。我希望波形不会消失,但我以后可以找回它。

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

【问题讨论】:

    标签: redhawksdr


    【解决方案1】:

    “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]', [], [])
    

    【讨论】:

      【解决方案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 代码中记账,因此不会在脚本退出时被清理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 2014-09-10
        • 2010-11-11
        • 2021-09-14
        • 2012-02-10
        • 1970-01-01
        相关资源
        最近更新 更多