【问题标题】:Allocating tuner on Frontend 2.0 compliant device in Java在 Java 中的 Frontend 2.0 兼容设备上分配调谐器
【发布时间】:2014-06-23 14:58:41
【问题描述】:

我正在使用 RHEL 5 上的 Redhawk 1.9 开发符合 Frontend 2.0 接口的设备。我的实现是使用 Java,并且我在 JUnit 中设置了一个测试框架,以简化开发过程中的测试和指标。我希望通过传入“FRONTEND::tuner_allocation”结构属性来进行分配单个可用调谐器的自动化测试。使用this question 的答案,我想出了以下代码:

List<DataType> props = new LinkedList<DataType>();
props.add(new DataType("FRONTEND::tuner_allocation::tuner_type", AnyUtils.toAny("DDC", TCKind.tk_string)));
props.add(new DataType("FRONTEND::tuner_allocation::allocation_id", AnyUtils.toAny(allocId, TCKind.tk_string)));
props.add(new DataType("FRONTEND::tuner_allocation::center_frequency", AnyUtils.toAny(98700000.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::bandwidth", AnyUtils.toAny(200000.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::bandwidth_tolerance", AnyUtils.toAny(25.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::sample_rate", AnyUtils.toAny(200000.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::sample_rate_tolerance", AnyUtils.toAny(25.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::device_control", AnyUtils.toAny(true, TCKind.tk_boolean)));
props.add(new DataType("FRONTEND::tuner_allocation::group_id", AnyUtils.toAny("", TCKind.tk_string)));
props.add(new DataType("FRONTEND::tuner_allocation::rf_flow_id", AnyUtils.toAny("", TCKind.tk_string)));

DataType[] tunersToAllocate = new DataType[1];
tunersToAllocate[0] = new DataType("FRONTEND::tuner_allocation", AnyUtils.toAny(props, TCKind.tk_struct));

try
{
    assertTrue(rhDevice.allocateCapacity(tunersToAllocate));
}
catch (InvalidCapacity invalidCapacity)
{
    logger.error("Unexpected allocation failure (invalid capacity)", invalidCapacity);
    assertTrue(invalidCapacity.getMessage(), false);
}
catch (InvalidState invalidState)
{
    logger.error("Unexpected allocation failure (invalid state)", invalidState);
    assertTrue(invalidState.getMessage(), false);
}

但是,这会导致最终 AnyUtils.toAny() 调用中出现空指针异常,因为采用 TCKind 的 toAny() 版本显然不支持非原始类型:

java.lang.NullPointerException
at org.ossie.properties.AnyUtils.insertInto(AnyUtils.java:636)
at org.ossie.properties.AnyUtils.toAny(AnyUtils.java:606)
at org.ossie.properties.AnyUtils.toAny(AnyUtils.java:616)
at com.<company-name>.redhawk.nsi.test.NsiClientDeviceTest.testAllocateTuner(NsiClientDeviceTest.java:247)

第 247 行是带有“toAny(props, TCKind.tk_struct)”的行。

查看 AnyUtils 类代码,似乎我应该传递一个 TypeCode。但是,我不确定如何获取结构属性的 TypeCode,因为 getComplexTypeCode() 和 getPrimitiveTypeCode() 的代码看起来都不包含对结构类型的检查。

我是不是完全走错了路?如果不是,如何表示我要创建 Any of 类型的结构?

【问题讨论】:

    标签: redhawksdr


    【解决方案1】:

    结构属性作为 CF.Properties 打包到 CORBA Anys 中,但不幸的是,AnyUtils 中没有方法可以做到这一点。相反,您必须创建 Any 然后将您的值插入其中。用户定义的 CORBA 数据类型(如 CF.Properties)有一个生成的辅助类,其中包含适用于 Anys 的插入和提取方法,而原始类型可以通过 Any 的成员函数插入或提取。

    以下代码 sn-p 通过 ORB 创建一个 Any 并使用静态 CF.PropertiesHelper.insert() 方法将属性存储在其中:

    org.omg.CORBA.Any tunerAlloc = org.omg.CORBA.ORB.init().create_any();
    CF.PropertiesHelper.insert(tunerAlloc, props.toArray(new DataType[props.size()]));
    tunersToAllocate[0] = new DataType("FRONTEND::tuner_allocation", tunerAlloc);
    

    生成的 CORBA 帮助程序仅适用于数组,因此必须转换 Java 集合类型(在上面的示例中,它是内联完成的)。如果您有自己的 ORB 引用,则可以使用它来代替 ORB.init()。

    【讨论】:

    • 为我工作;没想到只是通过 insert() 手动制作 Any ,因为我对这个概念还很陌生。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多