FrontEnd Interfaces

FrontEnd Interfaces (FEI) is a module containing interfaces designed to standardize the interaction between applications and radio hardware. This appendix specifies the requirements of an FEI 2.0 compatible device, explains best-practices, provides advice for development, and describes related data structures. This appendix is not intended to be an API reference for FEI or an exhaustive description of the Interface Description Language (IDL). This appendix is intended to provide an additional resource for developers.

Theory of Operations

FEI were developed to standardize the allocation, operation, and development of tuner devices within the REDHAWK Core Framework (CF). Tuner devices in this context may consist of Radio Frequency (RF), Intermediate Frequency (IF), or purely digital tuning equipment or software. Explicit types for tuners have been defined, so that devices can be easily categorized by the capabilities they provide.

Tuner devices can provide individual tuners to other REDHAWK entities through tuner allocation. To allocate an individual tuner, the allocateCapacity() function of a device is called with an appropriate allocation structure as the only argument. Devices then allocate physical resources and, once a valid connection has been made, begin flowing data out of the device.

Common FEI Terminology

The following table describes the FEI terminology used for tuner devices.

FEI Terminology
Terminology Description
device A REDHAWK device.
FEI device Devices that have a device_kind of FRONTEND and implement one of the FEI IDLs. Typically, GPS and navigation devices fall into this category.
tuner A specific tuner capability in an FEI device.
FEI tuner device Devices that have a device_kind of FRONTEND::TUNER. These devices must implement the TunerControl IDL and contain tuners for allocation.

Required Properties for an FEI Tuner

The following table describes the required properties for an FEI tuner device.

Required Properties for an FEI Tuner
Name / ID Description
device_kind / DCE:cdc5ee18-7ceb-4ae6-bf4c-31f983179b4d Must be set to FRONTEND or FRONTEND::TUNER.
device_model / DCE:0f99b2e4-9903-4631-9846-ff349d18ecfb Used to specify the model of the hardware device.
frontend_tuner_status / FRONTEND::tuner_status A struct sequence where each struct in the sequence represents a single tuner. The structure is defined further in Status Elements.

Types of Tuners

Tuner types are defined so that device developers and users can categorize the basic behavior of disparate hardware. Behavior of each of these types is described below and must be adhered to during development to allow for interoperability between different hardware baselines.

Physical devices often need to be split into multiple logical REDHAWK tuners to fully describe their functionality. Splitting physical devices often involves multiple tuners of the same, or mixed, types. Common pairings are described in each of the type descriptions.

RX Tuner

A simple receiver, or RX tuner, is an RF to IF conversion only. This conversion implies an analog to analog translation, typically down-converting an RF signal to a new IF. Devices often have multiple RX devices corresponding to each of the independent analog channels provided. Single channels that have selectable RF input ports should be represented as a single RX tuner and utilize an RF Flow ID to select between the input options.

RX devices have an analog output port. RX devices that output digital-IF (SDDS, VITA-49, etc.) are considered RX_DIGITIZERS, which are a distinct tuner type and should be classified as such.

RX_DIGITIZER Tuner

An RX_DIGITIZER tuner is an RX device that also samples the analog data and provides it as a digitized stream. The stream can be either real samples (typically referred to as digital-IF) or complex baseband data. Multiple RX_DIGITIZER channels in a singular physical device should be treated like RX devices, including using the RF Flow ID to differentiate between which external RF source to use.

RX_DIGITIZER tuners can also optionally provide access to the analog-IF output. If the device in question provides access to the analog-IF output, an additional analog output port should be added to the device. Users can optionally connect to and use that port, although the existence of the port is not guaranteed for all RX_DIGITIZER tuners.

CHANNELIZER Tuner

A CHANNELIZER tuner takes a digital wideband input and provides tuned, filtered, and decimated narrowband output. A CHANNELIZER device acts as a token to allocate and control the wideband input, which then can have individual narrowband channels allocated as well. Each of these narrowband tuners is its own tuner of type Digital Down Converter (DDC).

Allocating a CHANNELIZER establishes control over the input to a CHANNELIZER and allows users to understand that they have the ability to attach a new stream to the wideband input. Typical operation is to allocate a CHANNELIZER to gain control over the input prior to connecting a data stream to the input, though the order is not mandatory.

Allocating a DDC provides the tuned, filtered, and decimated narrowband output. A DDC is allocated by calling allocateCapacity() with the tuner type set to DDC and also specifying the frequency, bandwidth, sample rate, and any other desired aspects of the resulting DDC. Optionally, the RF Flow ID is used during allocation to specify the wideband input connection and CHANNELIZER desired. Allocation of a DDC succeeds only if the information specified during allocation can be supported by an allocated CHANNELIZER with a successful matching input connection. Changing the CHANNELIZER input can cause attached DDC tuners to be dropped.

DDC Tuner

DDC tuners provide a narrowband output from an existing CHANNELIZER capability. These narrowband channels are typically selectable in terms of the center frequency and bandwidth/sample rate within the constraints of the wideband input to the CHANNELIZER.

Allocating a DDC tuner against a device with multiple CHANNELIZER (or RX_DIGITIZER_CHANNELIZER) tuners can specify which tuner to use in two different ways. One method is to specify an RF Flow ID of the specific CHANNELIZER to be allocated against. The other method is to allow the device to match by using the requested center frequency and/or bandwidth/sample rate. The device matches the DDC to the first channelizer capability that meets those criteria.

RX_DIGITIZER_CHANNELIZER Tuner

The RX_DIGITIZER_CHANNELIZER tuner is a combination of an RX_DIGITIZER and CHANNELIZER capability into a single tuner type. Input is through an analog-RF input port, and output is through DDC tuners.

RX_DIGITIZER_CHANNELIZER tuners have the optional ability to output both analog-IF as well as digital-IF data. The analog-IF ports are represented just like the output of an RX or RX_DIGITIZER tuner. The digital-IF data is accessed by allocating a listener to the RX_DIGITIZER_CHANNELIZER, which then starts flowing digital data just like an RX_DIGITIZER.

The primary RX_DIGITIZER_CHANNELIZER allocation does not put out wideband digital data by default. These are optional ports, and each may or may not be present on each device.

RX_SCANNER_DIGITIZER Tuner

The RX_SCANNER_DIGITIZER tuner is an RX_DIGITIZER that also has a scanning capability (usually a built-in hardware capability). RX_SCANNER_DIGITIZER tuners can follow a scan plan. This plan may be a list of discrete frequencies to dwell on or a regular pattern that is followed. The transition between frequencies is controlled by time or number of samples generated.

An RX_SCANNER_DIGITIZER allocation’s allocateCapacity() call does not stand on its own. The call requires both a FRONTEND::scanner_allocation and a FRONTEND::tuner_allocation allocation.

TX Tuner

Although the exact functionality of the TX tuner is not yet defined, it is reserved for transmitter devices.

Tuner Allocation

Allocation is the process where specific tuners are requested for use, and initial setup of the tuner is performed. Allocation of FrontEnd devices always occurs by calling allocateCapacity() on the device with the argument of the allocateCapacity() call being a FrontEnd allocation property.

ID

A number of different IDs are used in REDHAWK and FEI devices. The most important types of IDs are described in this section.

Allocation ID

The Allocation ID is a string used as an unique ID for each allocated FEI tuner. The Allocation ID is passed in as part of the allocateCapacity() call and is used as identification for all subsequent interaction. Allocation IDs are used to identify tuners in the FEI Status structure and in the TunerControl IDL.

Allocation IDs can be any unique string, but typically UUID values are used. If human readable Allocation IDs are required, the preferred approach is to append the UUID onto a base human-readable string. With this approach, allocations for non-coordinated devices are not likely to create identical allocations.

Stream ID

In all REDHAWK Bulk Input/Output (BulkIO) ports, Stream ID is used to separate unique data streams that are passed in a single BulkIO port. This methodology is also utilized in FEI devices to allow devices to pass the output of multiple tuners through a single BulkIO port. REDHAWK does not mandate any uniqueness requirements on Stream IDs, but it is recommended that developers attempt to make the Stream IDs unique by appending a UUID.

Stream IDs can only be changed after an End of Stream (EOS) is sent, and in FEI devices, an EOS is only sent when deallocating or disabling the tuner.

An EOS should only be sent on an externally commanded tuner disable and not one that is handled internally to the device. Therefore, if the device must temporarily disable output to tune, an EOS should not be sent.

Connection ID

In all REDHAWK BulkIO connections, there is a specific string ID for the connection. For FEI devices, the connection to the output port of the device must have a Connection ID, which can be assigned as described in Connect Wizard, that is equal to the Allocation ID of the tuner to be accessed. Because the Connection ID is equal to the Allocation ID, the output port can be constructed as a multi-out port.

RF Flow ID

RF Flow IDs are used to differentiate between RF input streams, similarly to how Stream IDs are used to differentiate between BulkIO streams. For FrontEnd devices, these RF Flow IDs are used to match allocation requests to specific RF sources.

Unlike Allocation IDs and Stream IDs, RF Flow IDs are often human readable. Typically, they describe specific inputs to a device or feed names. RF Flow IDs for a device can be set as a device property, which is set as part of the node configuration. System developers can create a node that sets the individual FrontEnd device with the RF Flow IDs that are appropriately set to the current state of the physical RF connections.

Device Group ID

Device Group ID is similar to RF Flow ID in that it is used as an additional ID to allow allocations against a specific pool of devices. In this case, each FEI device can have its Group ID set, and individual allocations can request specific Group IDs. Devices with the same Group ID are considered to be in the same group, and only devices that are part of that group allow those allocations. Group IDs are strings that are often human readable. A device typically has its Group IDs set as a property, so it can be configured as part of a node.

Tuner Allocation Overview

FrontEnd tuners are allocated by calling the device’s allocateCapacity() method with a particular FrontEnd Allocation structure. The call acts as a request to the device for allocation of a tuner that meets the specifications in that structure. If the request is able to be met by that device, then the tuner is allocated, and True is returned by the allocateCapacity() call. If the tuner cannot be allocated, then an appropriate exception is thrown. Returns and exceptions are shown in Allocation Return Types.

Two different FrontEnd Allocation structures can be used. The FRONTEND::tuner_allocation structure is primarily used for allocating new tuners of an FEI device. The FRONTEND::listener_allocation structure is used for allocating listener tuners that piggyback on existing control tuners. Listener tuners are logical tuners that simply mirror the output of existing control tuners. Therefore, FrontEnd devices can keep track of how many consumers are attached to each of the tuner outputs and handle requests appropriately. The FRONTEND::tuner_allocation structure is described in Tuner Allocation Properties, and the FRONTEND::listener_allocation structure is described in Listener Allocation Properties.

Allocation Return Types

The following table describes the values returned and exceptions thrown by the allocateCapacity() method.

Allocation Return Types
Return Type Description Notes
True Tuner was successfully allocated. Returned if the tuner was successfully allocated. Indicates that the tuner has been added to the status structure, the underlying hardware/software has been set up, and the tuner is now enabled.
CF::Device::InvalidCapacity Capacity request was malformed. Indicates that there was an error in parsing the capacity (FrontEnd Allocation Structure) that was passed in. The error is typically the result of a missing Allocation ID or other critical field but can also indicate a duplicate Allocation ID request.
CF::Device::InvalidState Device is in an invalid state for allocation. Returned when the device is in an Error or Disabled state.
False Tuner was not successfully allocated. Indicates the device is unable to meet the request in the allocation structure.

Tuner Allocation Properties

Each allocateCapacity() call passes in a single FRONTEND::tuner_allocation structure. If multiple tuners are allocated, each tuner needs an independent allocateCapacity() call. Each field in the allocation structure needs to be matched against the available tuners in the device. Each field must correctly match for the allocation to be successful. If any of the properties cannot be met, the allocation throws an exception.

The following table describes the tuner elements of the FRONTEND::tuner_allocation structure and how to handle requests.

Tuner Allocation Properties
Name Type Notes Description
tuner_type string Type of tuner requested. The tuner type must match exactly and cannot be a super set of the request (e.g., an RX_DIGITIZER is not a match for an RX request).
allocation_id string Used by the caller to reference the tuner uniquely. Reject any requests with an Allocation ID already in use with the InvalidCapacity exception.
center_frequency double Requested center frequency in Hz. It is up to the device developer to determine the error tolerance of the true tuned center frequency. For CHANNELIZER tuners only, this is the expected input frequency of the stream that is provided.
bandwidth double Requested Bandwidth in Hz. The minimum bandwidth that must be provided to allocate the channel. See tolerance for the upper bound of bandwidth. A value of zero indicates any bandwidth is acceptable.
bandwidth_tolerance double Allowable Percent above requested bandwidth. The acceptable amount of excess bandwidth used to allocate the channel. This amount is defined as a percentage of the requested bandwidth. For example, if a 1kHz bandwidth was required, and the tolerance was set to 50%, then any bandwidth between 1-1.5kHz is acceptable. For the CHANNELIZER only, this should be the expected bandwidth of the provided input stream.
sample_rate double Requested complex sample rate in Hz. The minimum sample rate that must be provided to allocate the channel expressed in terms of complex sample rate. Refer to the tolerance for the upper bound of sample rate. A value of zero indicates any sample rate is acceptable. The sample_rate value can be ignored for such devices as analog tuners, which do not provide digital (sampled) data. For the CHANNELIZER only, this is the expected sample rate of the provided input stream.
sample_rate_tolerance double Allowable percent above requested sample rate. The amount of excess sample rate that is acceptable to allocate the channel as a percentage of the requested sample rate.
device_control boolean Indicates if this tuner has modification control. Describes if the requested tuner has control over the tuner and can make changes to tuner parameters. Setting device_control to false indicates that the device should attempt to find an existing channel and add the allocated tuner as a listener. If no suitable tuners exist, the request fails. For CHANNELIZER tuners, device_control must always be set to true and, if not, an InvalidCapacity exception is thrown.
group_id string Unique ID that specifies a group of devices. Must match group_id on the device; otherwise, allocation fails. The matching must be explicit, but a blank string is typically used to indicate a default group.
rf_flow_id string Specifies a certain RF flow to allocate against. Must match rf_flow_id on the device input used; otherwise, allocation fails. A blank string indicates that no channel is requested.

After successfully matching the allocation properties, the FrontEnd device needs to perform a number of tasks prior to returning from the allocateCapacity() call. First, the actual hardware or software should then be allocated with the values requested. Then, the internal status properties need to be updated to show the new channel. Once the status is set, the allocateCapacity() call can return.

After a successful allocation, the tuner is enabled and data is flowing though the device and out the output port. It is not required that the allocateCapacity() call return prior to the first data packet being pushed through the device.

In the event that a device has an RFInfo input port, the center frequency for allocation should be the true RF frequency of the signal even if the RFInfo port indicates that some frequency translation has occurred before input to the device. In this case, the tuner allocation frequency and status frequency will be different than the actual tuned frequency to which the hardware device was tuned. The center frequency and bandwidth of the RFInfo packet should be used to validate the requested center frequency. The requested center frequency should fit within the bandwidth of the incoming analog signal as described by the RFInfo packet. However, the requested bandwidth from the FEI allocation should be interpreted as the requested bandwidth of the receiver or receiver digitizer and can include bandwidth that is outside the bandwidth specified by the RFInfo packet.

Scanner Allocation Properties

To allocate the scanning functionality in a tuner that supports automatic scanning, the FRONTEND::scanner_allocation property must be used. This property cannot be used on its own, it needs to be passed in the same allocateCapacity() call with the FRONTEND::tuner_allocation property described above.

The following table describes the scanning elements and how to handle requests.

Scanner Allocation Properties
Name Type Notes Description
min_freq double Requested lower edge of the scanning band. The center frequency of the scanning plan cannot go below this frequency.
max_freq double Requested upper edge of the scanning band. The center frequency of the scanning plan cannot go above this frequency.
mode enum string SPAN_SCAN or DISCRETE_SCAN. Use SPAN_SCAN for a regularly-spaced set of frequencies and DISCRETE_SCAN for a discrete list of frequencies
control_mode enum string TIME_BASED or SAMPLE_BASED. Use TIME_BASED when the re-tune decision is based on the dwell time in seconds and SAMPLE_BASED when the re-tuning decision is made based on the number of samples produced.
control_limit double Limits on the control of the scanning device. Use TIME_BASED to establish the fastest hop rate and SAMPLE_BASED for the fewest number of samples that the scanner is expected to output before re-tuning.

In the case of a scanning device, allocation is insufficient for defining the scan. The allocation data structure provides the bounds for the scanning strategy (e.g.: minimum and maximum frequency, fastest re-tuning rate). To define the scanning strategy such that the device will execute it, the strategy needs to be set through the setScanStrategy function in the ScanningTuner control port, as described in Scanning Tuner Control Functions.

Listener Allocation Properties

There are two methods used to perform listener allocations. The first method is to use a standard FrontEnd Allocation Structure as shown in Tuner Allocation Properties with the control property set to False. Setting the control property to False causes the device to look for existing tuners that meet the required properties in the rest of the FrontEnd Allocation Structure and assign a new listener tuner to that master tuner. If no tuners already exist, the request fails.

The second way of allocating a listener tuner is by using a FrontEnd::listener_allocation structure in the allocateCapacity() call. Passing in this FrontEnd::listener_allocation structure causes the device to create a new listener tuner that is attached to the tuner with the Allocation ID given in the structure. The following table describes the FrontEnd::listener_allocation structure.

FrontEnd Listener Allocation Structure
Name Type Description Notes
existing_allocation_id string Allocation ID for an existing allocation. The Allocation ID of the tuner to which the new listener should attach. The tuner can be either a control or listener.
listener_allocation_id string New Listener ID The Allocation ID of the new listener tuner. All typical Allocation ID requirements apply.

The requirements for tuner setup of a listener tuner are the same as those for a control tuner. The status structure must be updated, and the output must be enabled. These actions are expected to be performed prior to returning from allocateCapacity().

Tuner Deallocation

Tuners are deallocated using the deallocateCapacity() call. There is no return from the deallocateCapacity() function, but exceptions are thrown if deallocation is unsuccessful. The only exceptions that can be thrown are InvalidCapacity, which indicates that the Allocation ID provided is not valid, or InvalidState, indicating the device is in an error state.

The deallocateCapacity() call can accept either a FRONTEND::tuner_allocation structure or a FRONTEND::listener_allocation structure as only the Allocation ID field is utilized. All other fields are ignored and have no impact on the deallocation. The concept is that the same allocation structure provided to allocateCapacity() can be sent to deallocateCapacity() to remove the tuner.

Tuners that are deallocated need to have their status entries removed, the underlying hardware/software disabled, and all output stopped. A final BulkIO packet containing an EOS Signal Related Information (SRI) flag is sent prior to the return from the deallocateCapacity() call. More information on the BulkIO SRI information can be found in FrontEnd-specific Keywords. No more data from that tuner flows though the BulkIO port.

Automatic Listener Deallocation

When a control tuner is deallocated, its attached listeners are expected to also be deallocated. Therefore, both status cleanup and EOS information flows over the BulkIO port.

Command and Control

Command and Control of existing allocated tuners is performed through the DigitalTuner or AnalogTuner port on the FEI device. These commands allow external users to get and set specific settings for each of the tuners. Each FEI tuner device must have a DigitalTuner port named DigitalTuner_in (or AnalogTuner_in for an AnalogTuner port) that allows for command and control. All of the functions in the tuner control interface need to be implemented even if only to report that the capability is not supported. Each of these tuner control interface functions uses the Allocation ID to uniquely identify the tuners.

An output control port used to control an FEI device follows the same connectivity rules explained in Custom IDL Interfaces.

Tuner Control Interface

The tuner control interface describes two interfaces for control. The first is the AnalogTuner, which describes all of the functions common for Digital and Analog tuners. DigitalTuner inherits AnalogTuner and adds setOutputSampleRate() and getOutputSampleRate().

Tuner Control Functions

The following table describes the functions that can be accessed via the Tuner Control IDL.

Tuner Control Functions
Function Prototype Description
string getTunerType(in string id) Get the type of tuner (e.g., RX or DDC) associated with this Allocation ID.
boolean getTunerDeviceControl(in string id) Returns whether this Allocation ID has control (modification privileges) over the tuner.
string getTunerGroupId(in string id) Retrieves the Group ID (may be empty) for this Allocation ID.
string getTunerRfFlowId(in string id) Retrieves the RF Flow ID (may be empty) for this Allocation ID.
CF::Properties getTunerStatus(in string id) Key/Value pair of entire tuner status structure. Note: The return is a sequence of simple properties, not a single struct property.
void setTunerCenterFrequency(in string id, in double freq) Set the current center frequency in Hz.
double getTunerCenterFrequency(in string id) Get the current center frequency in Hz.
void setTunerBandwidth(in string id, in double bw) Set the current bandwidth in Hz.
double getTunerBandwidth(in string id) Get the current bandwidth in Hz.
void setTunerAgcEnable(in string id, in boolean enable) Enable or disable the Auto Gain Control (AGC). True indicates that the AGC should be enabled.
boolean getTunerAgcEnable(in string id) Get the current status of AGC. True indicates enabled.
void setTunerGain(in string id, in float gain) Set tuner gain in dB.
float getTunerGain(in string id) Get current tuner gain in dB.
void setTunerReferenceSource(in string id, in long source) Set the tuner reference source. Zero is defined as internal and one is defined as external.
long getTunerReferenceSource(in string id) Get the current tuner reference source.
void setTunerEnable(in string id, in boolean enable) Set the output enable state of the tuner. True indicates output is enabled.
boolean getTunerEnable(in string id) Get the current output enable state of the tuner. True indicates output is enabled.
void setTunerOutputSampleRate(in string id, in double sr) Set the output sample rate in samples/sec.
double getTunerOutputSampleRate(in string id) Get the output sample rate in samples/sec.

Scanner Tuner Control Functions

The following table describes additional tuner control functions, which are present when the device is of type RX_SCANNER_DIGITIZER.

Scanner Tuner Control Functions
Function Prototype Description
ScanStatus getScanStatus(in string id) Get the current scanner status. The return structure is of type FRONTEND::ScanningTuner::ScanStatus, which contains information on the scanning strategy, the scheduled start time, the list of center frequencies that the plan will execute, and whether or not the scan has started
void setScanStartTime(in string id, in BULKIO::PrecisionUTCTime start_time) Schedule when a scan plan should start (in epoch time). Setting the time to 0 or a previous time with the tcstatus flag set to true starts a scan immediately. To disable the scan, set the start_time’s tcstatus flag to false.
void setScanStrategy(in string id, in ScanStrategy scan_strategy) Provide a plan for what frequencies the scanner will cover and how it will cover them.

Tuner Control Exceptions

The following table describes exceptions that may occur during calls to tuner control functions.

Tuner Control Exceptions
Exception Description Notes
BadParameterException Parameter provided is invalid. Indicates the value provided is out of bounds for the capability of the device or that the value was invalid (e.g., a negative frequency).
NotSupportedException Capability is not supported. Indicates the tuner does not support the setting (or getting) of this capability.
FrontendException Generic FrontEnd exception. Indicates there is a FrontEnd issue preventing the command, often because the Allocation ID does not match any currently allocated tuners.

Scanning Interface

A scanning tuner requires a definition of how it should scan. This is provided with the ScanStrategy data structure.

ScanStrategy Description

The following table describes the members of the ScanStrategy data structure.

ScanStrategy Description
Member Type Description
scan_mode ScanMode ScanMode is an enumerated type that can be set to MANUAL_SCAN, SPAN_SCAN, or DISCRETE_SCAN
scan_definition ScanModeDefinition ScanModeDefinition is a union that provides the mode-specific information: double center_frequency for MANUAL_SCAN, ScanSpanRanges freq_scan_list for SPAN_SCAN, and Frequencies discrete_freq_list for DISCRETE_SCAN
control_mode OutputControlMode OutputControlMode is an enumerated type that can be set to TIME_BASED or SAMPLE_BASED
control_value double This is the value for control_mode. The unit is seconds for TIME_BASED and samples for SAMPLE_BASED

ScanSpanRange Description

The data structures Frequencies and ScanSpanRanges provide more detail for their respective modes. Frequencies is a sequence of doubles. ScanSpanRanges is a sequence of ScanSpanRange. The following table describes the members of ScanSpanRange.

ScanSpanRange Description
Member Type Description
begin_frequency double The beginning center frequency for the scan in Hz
end_frequency double The ending center frequency for the scan in Hz
step double The change in center frequency in Hz

GPS Interface

The GPS IDL provides an interface to retrieve GPS information from a device that is GPS-enabled. The GPS interface is composed of two attributes and no functions. However, the data structures returned by these attributes contain a large amount of detail.

This interface’s attributes are read/write, therefore, this interface can be used to read GPS information or to receive GPS information.

GPS Attributes

The GPS attributes are listed in the following table.

GPS Attributes
Attribute Prototype Description
GPSInfo gps_info Get a detailed description of the GPS information on the device.
GpsTimePos gps_time_pos Return the position generated by GPS as well as the timestamp for that position estimate.

GPSInfo

The GPSInfo descriptions are listed in the following table.

GPSInfo Description
Member Type Description
source_id string Device identifier for the device that generated the GPS location report (this device’s ID if accessing the hardware directly)
rf_flow_id string Identifier for the RF source (antenna)
mode string “Locked” if the GPS Receiver has locked onto the signal, and “Unlocked” if the GPS Receiver has not locked onto the signal. Use “Tracking” if the GPS Receiver has found but not locked onto the signal (if available).
fom long Position figure-of-merit (refer to the Figure of Merit table)
tfom long Time figure-of-merit (refer to the Time Figure of Merit table)
datumID long Identifier for the reference ellipsoid (datum). Use 47 for WGS 1984, the GPS datum
time_offset double Receiver oscillator’s most recent time offset (seconds). Usually 0
freq_offset double Receiver’s center frequency offset (Hz)
time_variance double Receiver oscillator’s time offset variance (seconds**2). Usually 0
freq_variance double Receiver’s center frequency offset variance (Hz**2)
satellite_count short Number of satellites visible to the receiver
snr float GPS receiver’s reported signal to noise ratio. The definition of this value is not standardized and varies by manufacturer.
status_message string Device-specific status message
timestamp BULKIO::PrecisionUTCTime Timestamp for the GPS information
additional_info CF::Properties Device-specific additional information

Figure of Merit

The figure of merit (fom) provides the expected position error (EPE). The following table describes the possible values of the fom.

Figure of Merit
Value Error (meters)
1 less than 25
2 less than 50
3 less than 75
4 less than 100
5 less than 200
6 less than 500
7 less than 1000
8 less than 5000
9 greater than or equal to 5000

Time Figure of Merit

The time figure of merit (tfom) provides the expected time error (ETE). The following table describes the possible values of the tfom.

Time Figure of Merit
Value Error (nanoseconds)
1 less than 1
2 less than 10
3 less than 100
4 less than 1e3
5 less than 1e4
6 less than 1e5
7 less than 1e6
8 less than 1e7
9 greater than or equal to 1e7

GPS Interface Helpers

The GPS Interface helpers identify whether the GPS receiver has locked in on a signal or only found the receiver. The helper details are listed in the table below.

Helper Definitions
Member Value Description
GPS_MODE_LOCKED Locked GPS Receiver has locked onto the signal
GPS_MODE_UNLOCKED Unlocked GPS Receiver has not locked onto the signal
GPS_MODE_TRACKING Tracking GPS Receiver has found, but not locked onto the signal (optional)

GpsTimePos

The GPSTimePos reports the location and the timestamp associated with the location report. The GPSTimePos details are listed in the table below.

GpsTimePos Description
Member Type Description
position PositionInfo Position report
timestamp BULKIO::PrecisionUTCTime Timestamp for the location report

GPS Support Types

The following table lists the type used by GpsTimePos for communicating position information.

PositionInfo
Member Type Description
valid boolean The report is valid
datum string Reference ellipsoid. Set to DATUM_WGS84
lat double Latitude (degrees)
lon double Longitude (degrees)
alt double Altitude (meters)

This interface provides basic navigational information such as position, velocity, and so forth. The NavData interface is composed of one attribute and no functions. While the interface returns a single attribute, that attribute contains multiple positional structures, some of which may not be supported by the navigation data source. Structures contain a “valid” flag, allowing the hardware to indicate whether or not the source provides that specific data set.

This interface’s attributes are read/write, therefore, this interface can be used to read navigation information or to receive navigation information.

The NavData attribute is used to retrieve additional detailed navigation information from devices.

Attribute Prototype Description
NavigationPacket nav_packet Get detailed navigational information from the device.

The NavigationPacket provides all of the detail required for communicating navigational information for a device.

Member Type Description
source_id string Device identifier for the device that generated the navigation report (this device’s ID if accessing the hardware directly)
rf_flow_id string Identifier for the RF source (antenna)
position PositionInfo Location information in lat/long/altitude
cposition CartesianPositionInfo Location information in x/y/z
velocity VelocityInfo Velocity vector
acceleration AccelerationInfo Acceleration vector
attitude AttitudeInfo Attitude info (pitch/yaw/roll)
timestamp BULKIO::PrecisionUTCTime Timestamp for the navigation data information
additional_info CF::Properties Device-specific additional information

The following tables list the types that are used by the NavigationPacket for communicating position, velocity, acceleration, and attitude information.

PositionInfo
Member Type Description
valid boolean The report is valid
datum string Reference ellipsoid. Set to DATUM_WGS84
lat double Latitude (degrees)
lon double Longitude (degrees)
alt double Altitude (meters)
CartesianPositionInfo
Member Type Description
valid boolean The report is valid
datum string Reference ellipsoid. Set to DATUM_WGS84
x double X-axis (meters)
y double Y-axis (meters)
z double Z-axis (meters)
VelocityInfo
Member Type Description
valid boolean The report is valid
datum string Reference ellipsoid. Set to DATUM_WGS84
coordinate_system string CS_ECF (Earth-Centered Earth-Fixed), CS_ENU (East, North, Up), CS_NED (North, East, Down)
x double X-axis (meters/second)
y double Y-axis (meters/second)
z double Z-axis (meters/second)
AccelerationInfo
Member Type Description
valid boolean The report is valid
datum string Reference ellipsoid. Set to DATUM_WGS84
coordinate_system string CS_ECF (Earth-Centered Earth-Fixed), CS_ENU (East, North, Up), CS_NED (North, East, Down)
x double X-axis (meters/second^2)
y double Y-axis (meters/second^2)
z double Z-axis (meters/second^2)
AttitudeInfo
Member Type Description
valid boolean The report is valid
pitch double Pitch (degrees)
yaw double Yaw (degrees)
roll double Roll (degrees)

RFInfo Interface

The RFInfo interface describes the contents of an RF feed (antenna/feed); the most direct analogy is that RFInfo describes a wire connecting an antenna to a tuner.

This interface’s attributes are read/write, therefore, this interface can be used to send RF feed information or to describe the RF feed information being received.

RFInfo Attributes

The RFInfo interface implements the attributes listed in the table below.

RFInfo Attributes
Attribute Prototype Description
string rf_flow_id A string that uniquely describes the feed
RFInfoPkt rfinfo_pkt A description of the RF feed

Support Types

The following tables list the types that are used by the RFInfo for communicating RF, sensor, antenna, feed, and frequency, path delay, and frequency range information.

RFInfoPkt
Member Type Description
rf_flow_id string The string that uniquely describes the feed
rf_center_freq double Center frequency for the RF Feed (the physical antenna)
rf_bandwidth double Bandwidth for the RF Feed (the physical antenna)
if_center_freq double Center frequency for the IF that is output by the feed (if the hardware performs a down-conversion)
spectrum_inverted boolean Set to true if the spectrum for the feed output is inverted
sensor SensorInfo A description of the antenna/feed combination
ext_path_delays sequence PathDelay Frequency-selective path delays
capabilities RFCapabilities Potential operating frequency range for the antenna/feed combination
additional_info CF::Properties Device-specific additional information
SensorInfo
Member Type Description
mission string Name for the mission
collector double Name for the collector
rx double Name for the rx element
antenna AntennaInfo Description of the antenna’s RF characteristics
feed FeedInfo Description of the feed’s RF characteristics
AntennaInfo
Member Type Description
name string Name for the antenna
type string Type of antenna
size string Size of the antenna
description string Description of the antenna installation
FeedInfo
Member Type Description
name string Name for the feed
polarization string Polarization (for example, “vertical”, “horizontal”)
freq_range FreqRange Operating range for the RF feed
FreqRange
Member Type Description
min_val double Minimum frequency
max_val double Maximum frequency
values sequence double List of specific center frequencies that are available (if not continuous)
PathDelay
Member Type Description
freq double Frequency where this delay applies
delay_ns double Delay at the given frequency (nanoseconds)
RFCapabilities
Member Type Description
freq_range FreqRange Minimum to Maximum center frequency
bw_range FreqRange Minimum to Maximum operating bandwidth

RFSource Interface

The RFSource interface describes a device that contains multiple RF feeds and any one can be selected at any one time. This is equivalent to an RF switch connected to multiple antenna subsystems.

This interface’s attributes are read/write, therefore, they are meant to be used to control the RF source (RF switch) to select the appropriate RF stream to feed to the tuner.

RFSource Attributes

The RFSource interface implements the attributes listed in the table below.

RFSource Attributes
Attribute Prototype Description
RFInfoPktSequence available_rf_inputs The list of RF feeds that can be selected. Each RF feed is described by an RFInfoPkt structure
RFInfoPkt current_rf_input The RF feed that is currently streaming out of the device

Data Flow

By default, FEI devices can provide BulkIO data. Data flow into FEI devices is typically constrained to digital-IF data for CHANNELIZER tuners. Digital-IF data is consumed regardless of Stream ID and it is the responsibility of the CHANNELIZER allocator to make the connection from the source into the FrontEnd device.

Output data flow is managed by the FEI device and multiple tuners can have output through a single BulkIO port. In general, there should only be one BulkIO port for each data type (int, float, etc.). All streams of any data type must pass through this BulkIO port. The allocator of each tuner is responsible for connecting to the device output port. The Connection ID of the BulkIO connection must match the Allocation ID of the tuner for data to flow through that connection. Thus, the output port must be a multi-out port, one that only passes data packets to specific connections rather than all connections.

Multi-Output

Multi-out ports are a specific implementation of a BulkIO output port. The defining characteristic is that multi-out ports are selective in which connection each piece of data is sent to rather than having each piece of data broadcast to every connection. This behavior is typically implemented by creating a custom BulkIO port implementation that handles data routing for each connection.

Constructing the custom port is easiest if the internal pushPacket() call does not need to be modified, which is why Stream ID is the easiest field on which to differentiate. As long as the Stream ID is equal to the Allocation ID, the Stream ID can simply be matched to the Connection ID to make a multi-out port. Hence, a REDHAWK best practice is to maintain a one-to-one relationship between Stream and Allocation IDs.

If the IDs are the same, there are only two required changes to the standard port implementation. The first change is that as the port iterates over the list of connections, a simple check needs to be performed to only do the remote pushPacket() or pushSRI() call on connections where the Connection ID matches the Allocation ID associated with the current packet. The second change is that the internal storage of previous SRI states needs to become a vector rather than a single element so that a new connection gets the correct previous SRI for its stream rather than just the most recent stream that has had data sent.

SRI and Keywords

FrontEnd devices use both the basic BulkIO SRI fields and the Keywords field for additional items. All standard SRI fields are filled out as appropriate in accordance with the existing BulkIO IDL descriptions. The following table describes the specific keywords for FrontEnd devices.

FrontEnd-Specific Keywords
Name Type Description Notes
COL_RF double Collector center frequency in Hz. Center frequency of the collector, which is typically thought of as the center frequency of the wideband receiver used to generate the IF data. In the case of a DDC tuner, the value of COL_RF is the center frequency of the input to the CHANNELIZER.
CHAN_RF double Channel center frequency in Hz. The center frequency of the stream. The value of CHAN_RF is equal to the COL_RF for RX and RX_DIGITIZER tuners but should still be included.
FRONTEND::BANDWIDTH double Effective bandwidth in Hz. The effective bandwidth of the stream.
FRONTEND::RF_FLOW_ID string RF Flow ID of data. Always include even if the RF Flow ID is blank.
FRONTEND::DEVICE_ID string The ID of the device. Component ref ID, which allows downstream users to gain a reference to the device that created the data.

Status

Recall that frontend_tuner_status is a sequence of structs. Each FEI tuner device reports its status in one of these structs. This includes both allocated and un-allocated tuners so users can see tuners available for allocation.

Status Elements

Each struct in the frontend_tuner_status sequence contains all of the required elements listed below, and may contain any number of the optional elements. Additional elements are permitted in the structures if a suitable element is not already defined.

Required Status Elements

The following table describes the required status elements for each tuner of an FEI tuner device. In some cases, null, zero, or blank values may be used to indicate that a value is not set for this device.

Required Status Elements of an FEI Tuner Device
Name Type Description Notes
tuner_type string Type description of tuner. Defined in Types of Tuners
allocation_id_csv string Comma separated list of current Allocation IDs. Contains a list of both control and listener Allocation IDs. In effect, the length of the allocation_id_csv list is the number of independent consumers of the tuner output. The control Allocation ID must be the first in the comma separated list.
center_frequency double Current center frequency in Hz. Actual tuned frequency rather than the desired frequency (if those values are not the same).
bandwidth double Current bandwidth in Hz Actual bandwidth rather than the desired bandwidth (if those values are not the same).
sample_rate double Current sample rate in Hz. Actual sample rate rather than the desired sample rate (if those values are not the same). Can be ignored for such devices as analog tuners
group_id string Unique ID that specifies a group of devices. Actual Group ID, regardless whether it was requested in the tuner allocation or not.
rf_flow_id string Specifies a certain RF flow to allocate against. Actual RF Flow ID, regardless whether it was requested in the tuner allocation or not.
enabled boolean Indicates if tuner is enabled. Enabled refers to the output state not any internal hardware/software state.

Additional Required Status Elements of an FEI Scanner Device

The following table describes additional fields required in the tuner status structure when a device is of type RX_SCANNER_DIGITIZER.

Additional Required Status Elements of an FEI Scanner Device
Name Type Description Notes
scan_mode_enabled boolean Describes whether or not a scan plan is running on this tuner.
supports_scan boolean Describes whether or not this tuner can support a scan plan. Scan plans may not necessarily be available to all tuners in a device.

Optional Status Elements

The following table describes the optional status elements for each tuner of an FEI tuner device. In some cases, null, zero, or blank values may be used to indicate that a value is not set for an individual tuner. Note that all tuners of the same device must have the same set of properties in their status structure.

Optional Status Elements of an FEI Tuner Device
Name Type Description Notes
bandwidth_tolerance double Allowable percentage over requested bandwidth. Tolerance provided by the requester.
sample_rate_tolerance double Allowable percentage over requested sample rate. Tolerance provided by the requester.
complex boolean Indicates if the output data is complex. True for complex; False for real.
gain double Current gain in dB. N/A
agc boolean Indicates if the tuner has AGC enabled. Even if AGC is enabled, the device still reports the current gain in the gain property.
valid boolean Indicates if the tuner is in a valid state. When the tuner is of type DDC, False indicates that the DDC channel is no longer able to tune to the appropriate frequency because the CHANNELIZER it is attached to has been moved.
available_frequency string Valid potential center frequencies for the tuner in Hz. In range(XX-YY) or csv (X,Y,Z) format.
available_bandwidth string Valid potential bandwidth for the tuner in Hz. In range(XX-YY) or csv (X,Y,Z) format.
available_gain string Valid potential gain for the tuner in dB. In range(XX-YY) or csv (X,Y,Z) format.
available_sample_rate string Valid potential sample rates for the tuner. In range(XX-YY) or csv (X,Y,Z) format.
reference_source long Indicates internal vs external reference source. 0 = internal reference; 1 = external reference.
output_format string Indicates current output data format. Uses the SDDS digraph format.
output_multicast string Multicast address for SDDS output. Multicast address in dotted quad notation (e.g., “192.168.0.1”).
output_vlan long vlan number for SDDS output. If there is no vlan used, indicate that with a zero.
output_port long port number for SDDS output. N/A
decimation long Current decimation of tuner. Decimation values for DDC tuners. Defined as the ratio of input sample rate to output sample rate regardless of data format.
tuner_number short Physical tuner ID. Tuner ID number within device. May represent physical tuner ordering or virtual ordering in software.

RFSource Interface

FrontEnd devices that have RFInfo output ports and that flow RF metadata to other FrontEnd devices also have an RFSource interface. Such devices include antennas and RF distribution/switches. The RFSource interface is used to determine the currently selected RF Flow and all possible RF flows that a device can provide. The interface has two attributes:

Typical consumers of the RFInfo can read these values to know if other RF flows are possible. A device with the RFSource interface may get the information about its RF flows in multiple ways. The device may get the information through a non-REDHAWK interface to the actual switch, it may be stored as a configuration item or a property, or it may be set through the RFSource interface by another entity in the system with knowledge of the current RF configuration. If an external entity has knowledge of the RF configuration and sets the two attributes on a device, the device should push out an updated RFInfoPacket to any connected users.

RFSource Allocation Property

The RFSource rf_flow_id property is used in the allocateCapacity() interface of a device to request a particular RF flow. Allocation is performed by setting the FRONTEND::RFSource::rf_flow_id allocation property equal to the value of the RF flow requested. The following table describes the RFSource allocation property.

RFSource Allocation Property
Name Type Description Notes
FRONTEND::RFSource::rf_flow_id string Requested rf_flow_id. Will return true if source can satisfy the request.

allocationCount Property

If the requested RF flow can be switched to the output, the RFSource device will make the switch and the allocateCapacity() call will return true. If the device cannot provide the RF flow or has already been allocated to another RF flow, the allocateCapacity() call will return false. If the device is already allocated to the requested RF flow, the allocateCapacity() call will return true and increment the count of the total number of allocations received for that rf_flow_id. Once allocated, the device will not switch RF flows until the number of deallocateCapacity() calls received is equal to the total number of allocations for that rf_flow_id. The total number of allocations for the selected RF flow is stored in a readonly property named allocationCount. The following table describes the allocationCount property.

allocationCount Property
Name Type Description Notes
allocationCount long Total number of successful allocations against the current output. Always >0 if the device is allocated.

Even when the allocationCount is zero and no switch allocations are allocated, the current_rf_input and the RFInfoPacket should reflect the current state of the RF Flow. For example, even without allocation, if real RF data is still being output, the status should reflect that. If no data is being output, then the current_rf_input attribute should be empty. Setting the current_rf_input attribute does not imply allocation or a request to switch an input. It assumes that this would only be set if the input had already switched to that new value from outside of the device. If the device allocationCount is not zero, it is not recommended to change the switch configuration and thus set the current_rf_input.