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.
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.
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.
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.
The transmitter's own battery level, 0β100%. Updated via
statBattery.
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.
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.
Nonzero while a USB cable is plugged in. Updated via statUSB.
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.
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.
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.
This unit's hardware serial number, as shown on the built-in Info screen.
The radio's registered owner name, set from the Info screen β empty string if never set.
SSID of the Wi-Fi network the radio is currently connected to, or an empty string while disconnected.
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.
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.
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.
The currently selected model's internal numeric ID, as stored on the radio.
The currently selected model's type β exactly the values
signalModelAdd(name, type) accepts when creating one:
| Value | Type |
|---|---|
| 1 | Plane |
| 2 | Heli |
| 3 | Copter (multirotor) |
| 4 | Car |
| 5 | Plane with Spirit Controller ("Aero") |
| 6 | Heli with Spirit Controller |
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.
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.
True while a stick/control calibration is actively in progress.
Toggled by the firmware's statCalib signal.
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.
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.
| Index | Value |
|---|---|
| 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%. |
| Index | Value |
|---|---|
| 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). |
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.
| Index | Value |
|---|---|
| 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]
}
}
| Index | Value |
|---|---|
| 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.
Wave