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

时间:2018-08-09 16:42:23

标签: c++ redhawksdr

说我有两个Redhawk组件。组件1具有称为“抽头”的属性。组件2还需要知道“抽头”的值。如果组件2可以查找组件1的“ taps”值,而不是赋予它自己的“ taps”值,则事情将变得容易得多。组件2如何访问组件1的属性?我正在用C ++实现这些组件。

我使用以下代码尝试了resource port

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,它正试图从另一个组件获取属性“名称”。 NeedsProperties的输出资源端口“ resourceOut”已连接到组件。无论资源端口是否连接,该代码仅输出空字符串。这里发生了什么?另外,资源端口是否是实现此目的的好方法,还是有更好的实现方法?

3 个答案:

答案 0 :(得分:0)

使用REDHAWK 2.1.3,我可以使用示例代码从组件2成功查询组件1(具有ID为“名称”的属性)。

要注意的两件事是,您将从查询中获取不存在的属性时发生异常-Component1是否具有ID为“ name”的属性?如果尝试从属性中解组错误的类型,则将没有任何价值。使用 ossie :: any_to_string()帮助程序是取消编组简单CORBA对象的首选方法。

替代实现将使用PropertyChangeListeners。当“属性”获得新值时,将生成并发布一个事件供任何人抓取。在Component2中,您需要从PropertyChangeListener继承,使用Component1上属性的 id 调用registerPropertyChangeListener()并处理更改事件。您可以查看 redhawk / src / testing / tests / test_08_PropertyChange * .py 了解处理PropertyChangeEvent的python代码。

答案 1 :(得分:0)

尝试一下:

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;   
    }
}

答案 2 :(得分:0)

上述代码的问题是,我已将“ NeedsProperties”的输出资源端口连接到我在创建的其他组件上的“ 我自己的”输入资源端口。您应该将输出端口连接到另一个组件上的“棒棒糖”。它是名字中突出的那个小圆点。

不过,谢谢您的回答。