让 redhawk 组件访问另一个组件的属性

have redhawk component access another component's properties

假设我有两个 Redhawk 组件。组件 1 有一个名为 "taps" 的 属性。组件 2 还需要知道 "taps" 的值。如果组件 2 可以查找组件 1 的 "taps" 值,而不是将其自己的 "taps" 值赋给它,事情就会变得容易得多。组件 2 如何访问组件 1 的属性?我正在用 C++ 实现这些组件。

我已经尝试 使用以下代码。

int NeedsProperties_i::serviceFunction(){

    CF::Properties otherProperties;

    otherProperties.length(1);

    otherProperties[0].id = "name";

    resourceOut->query(otherProperties);

    std::cout << "name: " << any_to_string(otherProperties[0].value) << 
    std::endl;

    sleep(1);

    return NORMAL;
}

std::string NeedsProperties_i::any_to_string(CORBA::Any value) {

    std::ostringstream result;
    const char* tmp;
    value >>= tmp;
    result << tmp;
    return result.str();

}

NeedsProperties 在本例中是组件 2,并试图从另一个组件获取 属性 "name"。 NeedsProperties 具有连接到组件的输出资源端口 "resourceOut"。无论资源端口是否连接,代码都只打印空字符串。这里发生了什么?另外,资源端口是实现这个的好方法,还是有更好的实现方式?

使用 REDHAWK 2.1.3,我能够使用您的示例代码从组件 2 成功查询组件 1(具有 ID 'name' 的 属性)。

需要注意的两件事是,您将在查询不存在的 属性 时得到异常 - Component1 是否有 ID 为 'name' 的 属性?如果您尝试从 属性 中解组出错误的类型,您将得不到任何值。使用 ossie::any_to_string() 助手是解组简单 CORBA 对象的首选方法。

另一种实现方式是使用 属性ChangeListeners。当 属性 获得新值时,会生成并发布一个事件供任何人获取。在Component2中,需要继承属性ChangeListener,用Component1上属性的id调用register属性ChangeListener(),处理变化事件。您可以看到 redhawk/src/testing/tests/test_08_PropertyChange*.py 用于处理 属性ChangeEvents 的 python 代码。

试试这个:

int NeedsProperties_i::serviceFunction(){

    CF::Properties otherProperties;

    otherProperties.length(1);

    otherProperties[0].id = CORBA::string_dup("name");

    if(resourceOut->isActive()){

        resourceOut->query(otherProperties);

        std::cout << "name: " << any_to_string(otherProperties[0].value) << 
        std::endl;

        sleep(1);
        return NORMAL;
    }else{
        sleep(1);
        return NOOP;   
    }
}

我上面的代码的问题是我将 "NeedsProperties" 的输出资源端口连接到我创建的其他组件上的 我自己的 输入资源端口。您应该将输出端口连接到另一个组件上的 "lollipop"。就是名字中突出的那个小点。

感谢您的回答。