我正在使用在这里找到的USRP_UHD项目:UHD
我看到了一个问题:Component uses a device - failed to allocateCapacity。这位先生似乎有类似的问题,但我没有他的任何其他问题。
我试图通过"Target“启动一个包含USRP_UHD设备的节点。最后,我提出了这样的警告:
WARN:Device_impl -无法连接到IDM信道
系统说明:
CentOS 6.4 64位
红鹰1.8.4
Ettus N200 + XCVR 2450 Daughtercard
GNU C++版本4.4.7 20120313 (红帽4.4.7-3);Boost_104100;uhd003.005.002-0-未知
当节点未运行时:
REDHAWK_DEV列表
列表: NotFound异常:缺少节点
节点运行时的:
REDHAWK_DEV列表
ODM_Channel
IDM_Channel
REDHAWK_DEV
USRP-TEST/ (这是我的节点名)
和
事件查看器REDHAWK_DEV IDM_Channel
接收事件。按“enter”键退出
我觉得一切都还好。我相信这个警告是在这里提出的: Device_impl.h
#if ENABLE_EVENTS
if (idm_channel_ior) {
try {
CORBA::Object_var IDM_channel_obj = ossie::corba::Orb()->string_to_object(idm_channel_ior);
if (CORBA::is_nil(IDM_channel_obj)) {
LOG_ERROR(Device_impl, "Invalid IDM channel IOR: " << idm_channel_ior);
} else {
CosEventChannelAdmin::EventChannel_var idm_channel = CosEventChannelAdmin::EventChannel::_narrow(IDM_channel_obj);
(*devPtr)->connectSupplierToIncomingEventChannel(idm_channel);
}
} catch (...) {
LOG_WARN(Device_impl, "Unable to connect to IDM channel");
}
}
#endifUSRP设备似乎没有获得我在USRP_UHD.prf.xml中设置的任何属性--我希望解决这个问题会有所帮助。谢谢!
发布于 2013-12-09 17:07:03
关于连接到IDM通道的问题,这是最近发现的核心框架1.9.0版本中的一个错误。当在AdapterNonExistent类的第833行上调用find_POA时,将引发一个Device_Impl.cpp异常。Device_Impl.cpp类是所有C++设备使用的基类,因此问题不仅限于USRP C++设备。
设备使用IDM通道发送StateChangeEventType事件(参见http://redhawksdr.github.io/Documentation/mainch16.html#x18-26800016.3.1)
如果您的系统依赖于这些事件类型,那么您的设备就是C++,并且您正在使用框架的v1.9.0,您可以通过覆盖设备中的connectSupplierToIncomingEventChannel方法来解决这个问题。然而,当升级到v1.9.1时,这个工作应该被删除。
在C++设备的头类中,以及在现有包含语句下面添加以下内容:
#if ENABLE_EVENTS
#include <COS/CosEventChannelAdmin.hh>
#include "ossie/CorbaUtils.h"
#endif然后在公共方法声明中添加以下内容:
#if ENABLE_EVENTS
void connectSupplierToIncomingEventChannel (CosEventChannelAdmin::EventChannel_ptr idmChannel);
CosEventChannelAdmin::EventChannel_var IDM_channel;
CosEventChannelAdmin::ProxyPushConsumer_var proxy_consumer;
#endif在设备的cpp类中,在服务函数下面添加以下方法。
#if ENABLE_EVENTS
void workAroundDevice_i::connectSupplierToIncomingEventChannel(CosEventChannelAdmin::EventChannel_ptr idm_channel)
{
TRACE_ENTER(Device_impl);
IDM_channel = CosEventChannelAdmin::EventChannel::_duplicate(idm_channel);
CosEventChannelAdmin::SupplierAdmin_var supplier_admin;
unsigned int number_tries;
unsigned int maximum_tries = 10;
number_tries = 0;
while (true)
{
try {
supplier_admin = IDM_channel->for_suppliers ();
if (CORBA::is_nil(supplier_admin))
{
IDM_channel = CosEventChannelAdmin::EventChannel::_nil();
return;
}
break;
}
catch (CORBA::COMM_FAILURE& ex) {
if (number_tries == maximum_tries) {
IDM_channel = CosEventChannelAdmin::EventChannel::_nil();
return;
}
usleep(1000); // wait 1 ms
number_tries++;
continue;
}
}
proxy_consumer = CosEventChannelAdmin::ProxyPushConsumer::_nil();
number_tries = 0;
while (true)
{
try {
proxy_consumer = supplier_admin->obtain_push_consumer ();
if (CORBA::is_nil(proxy_consumer))
{
IDM_channel = CosEventChannelAdmin::EventChannel::_nil();
return;
}
break;
}
catch (CORBA::COMM_FAILURE& ex) {
if (number_tries == maximum_tries) {
IDM_channel = CosEventChannelAdmin::EventChannel::_nil();
return;
}
usleep(1000); // wait 1 ms
number_tries++;
continue;
}
}
//
// Connect Push Supplier - retrying on Comms Failure.
PortableServer::POA_var root_poa = PortableServer::POA::_narrow(ossie::corba::RootPOA());
IDM_Channel_Supplier_i* supplier_servant = new IDM_Channel_Supplier_i(this);
PortableServer::ObjectId_var oid = root_poa->activate_object(supplier_servant);
CosEventComm::PushSupplier_var sptr = supplier_servant->_this();
supplier_servant->_remove_ref();
number_tries = 0;
while (true)
{
try {
proxy_consumer->connect_push_supplier(sptr.in());
break;
}
catch (CORBA::BAD_PARAM& ex) {
IDM_channel = CosEventChannelAdmin::EventChannel::_nil();
return;
}
catch (CosEventChannelAdmin::AlreadyConnected& ex) {
break;
}
catch (CORBA::COMM_FAILURE& ex) {
if (number_tries == maximum_tries) {
IDM_channel = CosEventChannelAdmin::EventChannel::_nil();
return;
}
usleep(1000); // wait 1 ms
number_tries++;
continue;
}
}
}
#endifhttps://stackoverflow.com/questions/20332358
复制相似问题