我正在使用 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 类型的结构?