首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法连接到IDM_Channel

无法连接到IDM_Channel
EN

Stack Overflow用户
提问于 2013-12-02 15:54:50
回答 1查看 454关注 0票数 0

我正在使用在这里找到的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

代码语言:javascript
复制
#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");
        }
    }
#endif

USRP设备似乎没有获得我在USRP_UHD.prf.xml中设置的任何属性--我希望解决这个问题会有所帮助。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++设备的头类中,以及在现有包含语句下面添加以下内容:

代码语言:javascript
复制
#if ENABLE_EVENTS
#include <COS/CosEventChannelAdmin.hh>
#include "ossie/CorbaUtils.h"
#endif

然后在公共方法声明中添加以下内容:

代码语言:javascript
复制
#if ENABLE_EVENTS
    void connectSupplierToIncomingEventChannel (CosEventChannelAdmin::EventChannel_ptr idmChannel);
    CosEventChannelAdmin::EventChannel_var IDM_channel;
    CosEventChannelAdmin::ProxyPushConsumer_var proxy_consumer;
#endif

在设备的cpp类中,在服务函数下面添加以下方法。

代码语言:javascript
复制
#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;
        }
    }

}
#endif
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20332358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档