Under the Hood
Advanced settings, protocol details. — updated May 06, 2026 for version VB008
Advanced Settings
id_method — Address Type
Declares the transmitted 6-hex-digit ID type:
| Value | Meaning |
|---|---|
| 0 | Random (changes every few minutes) |
| 1 | ICAO ID |
| 2 | Device ID (starts with "8") |
| 3 | Anonymous (random but fixed for flight) |
| 7 | Override (transmits entered ID, marked as device ID) |
ignore_id — Aircraft ID to Ignore
Enter a 6-hex-digit ID to exclude from traffic reports and collision warnings. E.g., your towplane. Leave as 000000 to disable.
follow_id — Aircraft ID to Follow
Prioritize a specific aircraft in traffic reports, e.g., your flying buddy. Leave as 000000 to disable.
tx_power — Transmit Power
| Value | Power | Use Case |
|---|---|---|
| 0 | Off (receive only) | Ground station, second device in same aircraft |
| 1 | 2 mW (low) | Short-range testing |
| 2 | Full (≤100 mW) | Normal operation (default) |
altprotocol — Alternate Protocol
Set to 1 (OGNTP), 6 (Legacy), 7 (Latest) or 8 (ADS-L) to transmit in an alternative protocol once every 4 seconds. Can mix Latest/ADS-L with FANET or P3I using time-slicing.
flr_adsl — Dual Protocol Reception
If set to 1, enables simultaneous Latest+ADS-L reception in compatible dual-protocol modes.
NMEA Output Settings
Output destinations (nmea_out, nmea_out2):
| Code | Destination |
|---|---|
| 0 | Off |
| 1 | Main serial |
| 2 | UDP (WiFi) |
| 3 | TCP (WiFi) |
| 4 | USB |
| 5 | Bluetooth |
| 6 | Aux serial |
Sentence type bitfields (nmea_g, nmea_s, nmea_t, nmea_e):
nmea_g: 1=basic(GGA+RMC), 2=GSA, 4=GST, 8=GSV, F=allnmea_s: 1=Basic (PGRMZ), 2=LK8EX1, 8=Wind ($PSWSD) — bits are independent and combinablenmea_t: 1=PFLAU+PFLAA, 8=PFLAJ, 9=bothnmea_e: 1=tunnel from connected devices, 2=generated (strobe, alarm)
Flight Logging Settings
| Setting | Description |
|---|---|
logflight | 0=off, 1=always, 2=airborne, 3=airborne+traffic |
loginterval | Seconds between fixes (1-155) |
compflash | 0=uncompressed, 1=compressed IGZ format |
alarmlog | 0=off, 1=log alarm events to alarmlog.txt |
Other Settings
| Setting | Description |
|---|---|
hrange | Horizontal reporting range (km) |
vrange | Vertical reporting range (hundreds of meters) |
relay | 0=off, 1=landed-out, 2=all traffic, 3=relay-only |
expire | Seconds to keep reporting lost traffic (1-30, default=5) |
baud_rate | 1=4800, 2=9600, 3=19200, 4=38400, 5=57600, 6=115200 |
debug_flags — Debug Bitmask
A 24-bit hex value. Each bit enables a specific category of serial console output. Bits can be combined; e.g. 000018 = DEEPER + LEGACY.
| Hex | Name | What it enables |
|---|---|---|
000001 | WIND | Wind calculation serial output |
000002 | PROJECTION | Wind projection / track extrapolation output |
000004 | ALARM | Alarm calculation detail (requires nmea_d=1) |
000008 | LEGACY | Raw FLARM/Latest packet hex dump on RX & TX |
000010 | DEEPER | RF slot timing, RX/TX sizes, LR1110 packet detail |
000020 | DEEPER2 | Traffic helper internals, GNS5892 ADS-B detail |
000040 | BLE_TX | Log every BLE NUS sentence sent (serial console) |
000800 | RELAY | Force relay of all traffic (ignores no_track flag, testing only) |
800000 | SIMULATE | Replay SIM file instead of live GNSS — see Flight Simulator |
Common combinations:
| Value | What you get |
|---|---|
000010 | RF slot timing only |
000017 | RF timing + Legacy packet dump + Alarm + Wind |
000040 | BLE TX log only |
000050 | BLE TX log + RF timing |
800000 | Flight simulator |
T-Echo Only Settings
| Setting | Description |
|---|---|
epd_units | 0=metric, 1=imperial, 2=mixed |
epd_zoom | Default zoom level |
epd_rotate | Display direction |
epd_orient | Track up or North up |
epd_vmode | Default view: 0=status, 1=radar, 2=text |
Protocol Choices
Single Protocols
- Latest — compatible with new FLARM (2024+), recommended
- Legacy — old FLARM, not recommended
- ADS-L — e-conspicuity
- OGNTP — OGN tracking
- FANET — paraglider network
- P3I — PilotAware
Mixed Protocols (examples)
| Combination | Behavior |
|---|---|
| Latest + ADS-L | TX/RX Latest, TX ADSL every 4s in slot 0 |
| Latest + OGNTP | TX/RX Latest, TX OGNTP every 4s |
| Latest + FANET | Time-sliced: slot 0 = Latest, slot 1 = FANET |
| Latest + P3I | Time-sliced: slot 0 = Latest, slot 1 = P3I |
| FANET + ADS-L | Time-sliced: slot 0 = ADS-L, slot 1 = FANET |
With flr_adsl=1, slot 0 uses simultaneous FLR+ADSL dual reception in most modes.
Settings via NMEA
Settings can be changed via NMEA commands through USB or Bluetooth terminal:
$PSRFS,?*57— list all settings$PSRFS,0,label,?— query one setting$PSRFS,0,label,value— change one setting$PSRFC,SAV*3C— save and reboot
Details of Operation
SoftRF is embedded software running in real time. The main loop order:
Baro_loop()— compute vertical speed if sensor availableGNSS_loop()— get new GPS fix- Compute timestamps, discretize fixes into ~2s intervals
Estimate_Wind()— wind estimation and path projectionRF_Transmit()— encode and transmit at preset intervalsRF_Receive()— check for received dataParseData()— decode received packets, update trafficTraffic_loop()— collision checking at 2s intervalsSound_loop()— process audioNMEA_Export()— output data
Major Changes in This Version
Key changes from mainline SoftRF:
- Wind estimation — new Wind.cpp module estimates wind from circling drift and speed variation
- "Latest" collision prediction — predicts curved paths for circling aircraft, accounting for wind
- ApproxMath — fast trig functions optimized for collision calculations
- Audio alarms — 3-level buzzer and voice warnings
- Improved FLARM compatibility — correct time slots, frequency hopping, path projections
- Vertical separation — taken into account in alarm calculations
- Hysteresis — prevents alarm oscillation at threshold boundaries
- Settings file — text-based settings.txt replaces binary EEPROM
- Dual-protocol — simultaneous FLARM + FANET operation
NMEA Sentence Reference
SoftRF outputs several proprietary NMEA sentences in addition to the standard FLARM set. This section documents them for app developers integrating with SoftRF over serial, USB, or Bluetooth.
$PSWSD — Wind Speed and Direction
Output when the wind estimator has a confident result. Enabled by setting bit 8 (0x08) of nmea_s or nmea2_s. Rate-limited to one sentence every 123 seconds to avoid flooding slow-baud connections.
Sentence format
$PSWSD,SPD,DIR*CS<CR><LF>
| Field | Type | Unit | Description |
|---|---|---|---|
SPD | float, 1 decimal | knots | Estimated wind speed |
DIR | integer (0–359) | degrees true | Wind direction the wind is coming from |
*CS | 2-digit hex | — | Standard NMEA XOR checksum |
Example
$PSWSD,12.3,270*3A
Wind of 12.3 kt coming from the west (270° true).
Notes for app developers
- The sentence is only emitted when the device is airborne and circling — wind estimation requires thermalling flight to converge.
- The 123-second interval means your app should not timeout or discard the data if it does not arrive every few seconds. Treat the last received value as valid until a new one arrives or the connection is lost.
- The wind direction follows the meteorological convention:
270means wind blowing from the west (i.e., a westerly wind). - Speed is in knots, not m/s. Convert with 1 kt = 0.5144 m/s if needed.
- Enable on the Bluetooth output channel by setting
nmea_sbit 8 (nmea_s,08for wind only, ornmea_s,0bfor Basic + LK8EX1 + Wind combined). - The sentence is gated: it is only output when at least one of
nmea_sornmea2_shas bit 8 set and the wind estimator has produced a new result within the last circle.
Related debug sentences
When debug output (nmea_d) is enabled, the wind estimator also outputs lower-level sentences ($PSWGS, $PSWNS, $PSWEW) containing raw circle fit data. These are for developer diagnostics only and their format may change between firmware versions.
Known Issues
- Dual mode FLARM/ADS-L not operational
Flight Simulator Mode
Simulator mode lets you replay a recorded flight on the device without needing GPS reception or real radio traffic. The device reads your own-ship position from a file, and optionally reads nearby traffic from a second file, then runs the full collision-alarm pipeline — buzzer, voice, NMEA output — exactly as it would in the air. This is useful for:
- Testing alarm thresholds and buzzer/voice response on the ground
- Verifying a new firmware build behaves correctly
- Demonstrating SoftRF to new users with realistic traffic scenarios
- Debugging alarm logic with a known, repeatable scenario
Enabling Simulator Mode
Simulator mode is activated by setting bit 0x00800000 in debug_flags in Advanced Tab of Configurator App. Or update in settings.txt:
debug_flags,00800000
The simulator starts replaying the file approximately 40 seconds after boot, giving the system time to initialise. It will then advance one simulated second at a time, paced by the device clock.
To return to normal operation, remove the flag (set debug_flags,00000000 or delete the line) and reboot.
Simulation Files
Two plain-text files drive the simulator. Both go in the logs/ folder of the storage medium:
| File | Location | Purpose |
|---|---|---|
simulate.txt |
logs/simulate.txt |
Own-ship position — standard NMEA GGA/RMC sentences for each second of the flight |
target.txt |
logs/target.txt |
Nearby traffic — one $PFSIM sentence per target per second (optional) |
On hardware with an SD card (T-Beam with SD adapter), the files are read from the SD card. On hardware with an internal flash filesystem (T-Echo / T1000E Card), they are read from the internal /logs/ folder, accessible over USB.
If simulate.txt is absent or empty, the simulator still runs but uses the live GNSS receiver or serial input for own-ship position. If target.txt is absent, no simulated traffic is injected.
simulate.txt — Own-Ship Position File
The file contains standard NMEA sentences, one per line, exactly as a GPS receiver would output them. At minimum, each simulated second needs a $GPGGA (or $GNGGA) and a $GPRMC (or $GNRMC) sentence with the same timestamp.
Timing control
The simulator advances one second each time it sees a separator between bursts of sentences. A separator is:
- A line starting with
.(dot) — causes a one-second pause. Use..for two seconds,...for three, etc. - A blank line — same effect as a single dot.
- Two consecutive blank lines — two-second pause (each extra blank adds another second).
Example simulate.txt
$GPGGA,102301.00,4712.34567,N,00823.45678,E,1,08,1.0,650.0,M,47.0,M,,*XX
$GPRMC,102301.00,A,4712.34567,N,00823.45678,E,45.0,270.0,130125,,,A*XX
.
$GPGGA,102302.00,4712.33000,N,00823.46000,E,1,08,1.0,651.0,M,47.0,M,,*XX
$GPRMC,102302.00,A,4712.33000,N,00823.46000,E,45.0,270.0,130125,,,A*XX
.
target.txt — Traffic File
Each line is a proprietary NMEA sentence in the format $PFSIM that describes one traffic aircraft at one moment in time. The simulator injects each sentence as traffic data at the matching UTC time.
$PFSIM sentence format
$PFSIM,HHMMSS,ADDR,ADDRTYPE,ACTYPE,LAT,LON,ALT,SPEED,COURSE,VS,TURNRATE*CS
| Field | Unit / Format | Description |
|---|---|---|
HHMMSS | UTC hhmmss | Time this target position should be injected (must match the own-ship time) |
ADDR | 6-digit hex | FLARM/ICAO address of the traffic aircraft (e.g. 3D1234) |
ADDRTYPE | integer | Address type: 0 = ICAO, 1 = FLARM, 2 = OGN, 3 = random |
ACTYPE | integer | Aircraft type: 1 = glider, 2 = towplane, 7 = paraglider, 8 = powered, etc. |
LAT | decimal degrees | Latitude (positive = North) |
LON | decimal degrees | Longitude (positive = East) |
ALT | metres (MSL) | Altitude above mean sea level |
SPEED | m/s | Ground speed |
COURSE | degrees true | Track over ground (0–360) |
VS | m/s | Vertical speed (positive = climbing) |
TURNRATE | deg/s | Turn rate (positive = right turn, negative = left turn, 0 = straight) |
The checksum *CS at the end is validated by the parser. You must compute a correct NMEA checksum (XOR of all bytes between $ and *). Many NMEA utilities and text editors with NMEA plugins can compute this for you.
Each $PFSIM sentence describes a single aircraft at a single point in time. To simulate continuous traffic, add one sentence per target per second, matching the timestamps in simulate.txt.
Example target.txt
# Glider approaching head-on, 200 m above, closing at ~80 km/h combined
$PFSIM,102301,3D1234,1,1,47.2200,8.3950,850,22.0,90.0,0.0,0.0*XX
$PFSIM,102302,3D1234,1,1,47.2200,8.3920,850,22.0,90.0,0.0,0.0*XX
$PFSIM,102303,3D1234,1,1,47.2200,8.3890,850,22.0,90.0,0.0,0.0*XX
$PFSIM sentence is only injected when the own-ship simulator clock (from simulate.txt) reaches the same UTC second. Sentences with timestamps in the past are discarded. Make sure own-ship and traffic timestamps are aligned.