Skip to Content
This documentation is provided with the HEAT environment and describes this HEAT instance.

Comms (Next)

Comms shows one lane per radio channel and marks which speakers are talking on it over time. The layout names the lanes and the speakers. The data service supplies, for each lane, a series channel whose value at each instant is the list of speakers active on that lane.

Use it for radio or intercom occupancy in crew training, where the question is who was on which net and when. It supports playback, so the lanes follow the realm clock when the page or the widget shows playback controls.

Summary

Value
Layout idComms
Widget configcommsItem
Channel shapeseries (value is a string array of speaker names)
PlaybackYes, optional
Realm filterNo
Dual columnNo

Migration status

migrated, full layout and dataservice reference: tools/arbex/reference/next/Comms.json. See Dataservice migration status.

Layout

FieldRequiredDescription
name, titleContentYesWidget instance name and panel title
channelsYesOne data service channel id per lane, in display order
commsItem.channelsYesThe display label for each lane. Same length and order as channels.
commsItem.nodes[]YesThe speakers: { text, color, strokeColor }. text must match the strings that appear in the series samples. Doubles as the legend.
enablePlaybackControlsNoShow a playback bar on this widget
shouldRenderTitle, tooltipContent, shouldRenderTooltipNoPanel chrome

Schema: #/$defs/CommsItemSchema in heat-layout-schema.json.

Layout column example

{ "component": "Comms", "colspan": 12, "configuration": { "name": "crew-comms", "titleContent": "Comms", "shouldRenderTitle": true, "enablePlaybackControls": true, "channels": ["comms-primary", "comms-secondary"], "commsItem": { "channels": ["Primary", "Secondary"], "nodes": [ { "text": "Commander", "color": "#EE7127", "strokeColor": "#642F10" }, { "text": "Gunner", "color": "#0B5370", "strokeColor": "#05232F" }, { "text": "Driver", "color": "#8D2260", "strokeColor": "#3B0E28" } ] } } }

Data contract

ShapePayload
seriesdata[] of { "timeMs": number, "value": string[] }. Each value lists the nodes[].text entries active on that lane at that instant. An empty array means the lane is silent.

Each lane is its own channel. The widget reads the sample current at the playback time for every channel in channels and pairs it with the label at the same index in commsItem.channels.

Channel example

{ "id": "comms-primary", "name": "comms-primary", "groupId": "comms", "shape": "series", "data": [ { "timeMs": 0, "value": ["Commander", "Gunner"] }, { "timeMs": 1000, "value": ["Gunner"] }, { "timeMs": 2000, "value": [] } ] }

Behaviour notes

  • Clicking a speaker in the legend hides that speaker on every lane. Clicking again shows them.
  • A speaker name in a sample that has no matching nodes[].text is not drawn.
  • When every lane has no sample at the current time, the widget shows its empty state.
  • Comms is often nested inside a Modal so that several vignettes can be compared through the modal’s own realm picker.
Opens your browser's print dialog. Choose "Save as PDF" as the destination.