1

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

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 类型的结构?

4

1 回答 1

0

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

以下代码片段通过 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()。

于 2014-06-24T13:02:03.257 回答