иметь компонент redhawk для доступа к свойствам другого компонента

Скажем, у меня есть два компонента Redhawk. Компонент 1 имеет свойство, называемое «отводы». Компонент 2 также должен знать значение «отводов». Было бы намного проще, если бы Компонент 2 мог искать значение «отводов» для Компонента 1, вместо того чтобы иметь свое собственное значение «отводов», присвоенное ему. Как Компонент 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», связанный с компонентом. Код просто печатает пустые строки независимо от того, подключен порт ресурса или нет. Что тут происходит? Кроме того, является ли порт ресурса хорошим способом для реализации этого или есть лучшая реализация?

0

Решение

Используя REDHAWK 2.1.3, я смог успешно запросить Компонент 1 (со свойством, имеющим идентификатор «имя») из Компонента 2, используя ваш пример кода.

Следует отметить две вещи: вы получите исключение из запроса для несуществующего свойства — есть ли у Component1 свойство с идентификатором name? Если вы попытаетесь удалить неправильный тип из свойства, вы не получите никакого значения. С использованием Осси :: any_to_string () хелпер — это предпочтительный способ разобрать простые объекты CORBA.

Альтернативная реализация будет использовать PropertyChangeListeners. Когда свойство получает новое значение, генерируется и публикуется событие, которое может получить любой желающий. В Component2 вам необходимо унаследовать от PropertyChangeListener, вызвать registerPropertyChangeListener () с Я бы свойства на Component1 и обработать событие изменения. Ты можешь видеть Redhawk / SRC / тестирование / тесты / test_08_PropertyChange * .py для кода Python, который обрабатывает PropertyChangeEvents.

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

Проблема с моим кодом выше заключалась в том, что я подключил порт выходного ресурса «NeedsProperties» к мой собственный порт входного ресурса на другом компоненте, который я создал. Вы должны подключить выходной порт к «леденцу» на другом компоненте. Это та маленькая точка, выступающая из имени.

Спасибо за ответы, хотя.

0
По вопросам рекламы [email protected]