Wave Wave Developer Docs

Status & Telemetry

Two different ways your app reads live radio state without calling anything. The 21 root properties below are always there and always current β€” read them directly, or watch one with a plain onXxxChanged: handler. Live flight telemetry (radio link, ESC, GPS, Spirit Controller) works differently β€” it arrives as arrays behind a connect/disconnect signal β€” and is covered in Reading telemetry arrays below, the same way the built-in qml/Item/Widget/ components read it. Battery Manager profiles work differently again β€” pulled on request rather than pushed at all β€” covered on their own Battery Manager page.

No properties match your search.

Status bar & radio link

Read-only β€” all nine are kept current by the firmware behind the scenes; there's no signal to call, just read the property.

pageTitle string

The title shown centered in the top status bar for whatever screen is currently on top of the shared StackView. It's set automatically to stack.currentItem.name whenever the top item changes β€” which means it mirrors your own app.qml's or screen.qml's root property string name: "...", exactly the one the project template declares. You don't need to (and shouldn't) set this directly β€” give your app a name and the status bar takes care of itself.

stat_chg int

Nonzero while the radio is connected to external power and charging β€” swaps the status-bar battery icon to the charging glyph. Updated by the firmware's statCharger signal.

stat_battery int

The transmitter's own battery level, 0–100%. Updated via statBattery.

stat_signal int

RF link quality to the currently bound receiver, 0–100%. Only meaningful while stat_rfbound is true β€” the built-in "Radio" telemetry widget guards it with stat_rfbound && stat_signal > 0 and shows 0% otherwise. Updated via statSignal.

stat_power int Note

Current RF transmit power, as a raw level 0–16 rather than a percentage β€” 0 is maximum power. To show it the way the built-in Radio widget does, convert with 100 * (16 - stat_power) / 16.

stat_usb int

Nonzero while a USB cable is plugged in. Updated via statUSB.

stat_rf int

Nonzero while the RF module itself is active/present β€” independent of whether it's bound to a receiver yet. Gates whether the status-bar link icon shows at all.

stat_rfbound int

Nonzero once the transmitter is bound to a receiver β€” the main "connected to a model" flag. Most of the built-in Model menus gate editing on this being true.

stat_remote int

Nonzero while a trainer/buddy-box "remote" radio link is connected β€” separate from, and independent of, the main model RF link (stat_rfbound).

Wi-Fi, Bluetooth & identity

Read-only, set directly by the radio's system/network layer rather than through a root signal.

radio_serial string

This unit's hardware serial number, as shown on the built-in Info screen.

owner_name string

The radio's registered owner name, set from the Info screen β€” empty string if never set.

wifi_current string

SSID of the Wi-Fi network the radio is currently connected to, or an empty string while disconnected.

wifi_ip string

The radio's own IP address on its current Wi-Fi network β€” the same address Wave Studio discovers to talk to the radio. The built-in Local Share screen uses it directly to build a browsable "http://" + wifi_ip link.

wifi_signal int Note

Wi-Fi RSSI in dBm (negative, not a percentage). The built-in status-bar icon buckets it: β‰₯ -65 full signal, β‰₯ -70, β‰₯ -75, β‰₯ -80, otherwise no-signal.

bt_en int Note

Bluetooth subsystem state: 0 = off, 1 = on/ready, 2 = downloading the Bluetooth stack, 3 = stack download failed (the built-in UI tells the pilot to check their Wi-Fi connection in this case).

Current model

Read-only, all four updated together whenever the firmware's modelCur signal fires β€” at boot, and on every later model switch.

mdl_cur_id int

The currently selected model's internal numeric ID, as stored on the radio.

mdl_cur_type int Note

The currently selected model's type β€” exactly the values signalModelAdd(name, type) accepts when creating one:

ValueType
1Plane
2Heli
3Copter (multirotor)
4Car
5Plane with Spirit Controller ("Aero")
6Heli with Spirit Controller
mdl_cur_image int

Numeric ID of the currently selected model's picture. 0 means no custom image is set (the UI falls back to a generic silhouette); a nonzero value maps to file:media/image/<id>.png on the radio's own storage.

mdl_cur_name string

The currently selected model's display name.

Calibration & binding

Read-only progress flags β€” both are also documented as part of the Calibration & Binding signal group, since that's what starts the operation these flags report on.

calib_running bool

True while a stick/control calibration is actively in progress. Toggled by the firmware's statCalib signal.

bind_running bool

True while an RF bind sequence is actively in progress. Toggled by statBind.

Reading telemetry arrays

Live flight telemetry β€” the receiver link, ESC/turbine, GPS, and Spirit Controller β€” doesn't live in individually-named properties like the status properties above. Each source is one var array property that gets replaced wholesale every time new data arrives, plus a matching parameterless signal that just means "this array changed, go re-read it." This is exactly the pattern every built-in telemetry Widget uses, and it's directly available to your own app.

The pattern

Connect a handler to the signal when your component is created, read whichever array indices you need inside that handler, and β€” this part matters β€” disconnect in Component.onDestruction. Your app.qml is a page on the radio's shared, long-lived StackView; if you don't disconnect, your handler keeps running (and referencing an item that no longer has a screen) long after the pilot has navigated away from your app.

This is the whole pattern β€” reading Spirit Controller RPM, exactly as WidgetSpiritRPM.qml does:

Item {
	property int rpm: 0

	Component.onCompleted: signalTelemSpirit.connect (telemSpiritUpdate)
	Component.onDestruction: signalTelemSpirit.disconnect (telemSpiritUpdate)

	function telemSpiritUpdate () {
		rpm = telem_spirit[3]
	}
}

Same three moves every time: connect the right signalTelemXxx to a function, index into the matching telem_xxx array inside it, disconnect on destruction. Only the signal name, array name, and index differ per telemetry source β€” covered below for all four.

Receiver β€” signalTelemRx / telem_rx
IndexValue
telem_rx[1]Receiver BEC voltage (raw units β€” the built-in "Receiver" widget divides by 1000 and formats as volts).
telem_rx[3]Receiver link signal, 0–100%.
telem_rx[4]Receiver TX power readback, 0–100%.
ESC / Turbine β€” signalTelemESC / telem_esc
IndexValue
telem_esc[1]Battery voltage (electric ESC).
telem_esc[2]Battery current (electric ESC) β€” or a turbine status code 0–36 (turbine ESC). See the note below.
telem_esc[3]BEC voltage.
telem_esc[4]BEC current / pump voltage.
telem_esc[5]Temperature / EGT.
telem_esc[6]Capacity used (electric ESC) β€” or turbine status code in some views. See the note below.
telem_esc[7]RPM.
telem_esc[8]Throttle, %.
telem_esc[9]Fuel remaining (turbine).
One array, two ESC kinds

Electric ESCs and turbine ESCs report through the same telem_esc array, and the built-in Widgets don't agree on what every index means β€” WidgetESCBat.qml reads index 2 as battery current, while WidgetTurbineMain.qml reads the same index as a turbine status code. Design your app around whichever ESC type your target models actually use, and treat indices beyond the table above (not consumed by any built-in Widget) as unspecified.

GPS / GeoLink β€” signalTelemGPS / telem_gps
IndexValue
telem_gps[1]Longitude.
telem_gps[2]Latitude.
telem_gps[3]Ground speed.
telem_gps[4]Altitude.
telem_gps[5]Heading.
telem_gps[6]Satellite count.

A worked example β€” GPS coordinates, connecting/disconnecting the same way as the RPM example above:

Item {
	property double lat: 0
	property double lon: 0

	Component.onCompleted: signalTelemGPS.connect (telemGPSUpdate)
	Component.onDestruction: signalTelemGPS.disconnect (telemGPSUpdate)

	function telemGPSUpdate () {
		lon = telem_gps[1]
		lat = telem_gps[2]
	}
}
Spirit Controller β€” signalTelemSpirit / telem_spirit
IndexValue
telem_spirit[0]Active flight-mode bank β€” also mirrored straight into the root mdl_cur_bank property, so you don't need to read the array for this one specifically.
telem_spirit[1]Vibration level.
telem_spirit[3]RPM.
telem_spirit[4]Altitude.
telem_spirit[5]Pitch.
telem_spirit[6]Roll.
telem_spirit[7]Yaw.

The RPM example at the top of this section reads telem_spirit[3] this same way.