Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
6ef74c4
Fix C5 UART routing and RX5808 isolation
LouisHitchcock Oct 4, 2026
260fa37
Rework the ESP32-C5 calibration into a live multi-pilot panel
LouisHitchcock Oct 4, 2026
034180f
Stop the C5 link flicking between online and no reply
LouisHitchcock Oct 4, 2026
08e4632
Enable Raceband R8 for C5 receiver
LouisHitchcock Oct 4, 2026
72b332b
Increase C5 RSSI resolution
LouisHitchcock Oct 4, 2026
17fd4d7
Preserve C5 pilot band labels
LouisHitchcock Oct 4, 2026
fd5ee6d
Improve C5 sample timing
LouisHitchcock Oct 4, 2026
b0fadc8
Add C5 timing validation telemetry
LouisHitchcock Oct 4, 2026
bf31773
Increase C5 sample queue depth
LouisHitchcock Oct 4, 2026
cdec522
Add synthetic C5 timing replay
LouisHitchcock Oct 4, 2026
6f4e09a
Reduce C5 pilot slot to 16ms
LouisHitchcock Oct 4, 2026
e357db6
Avoid redundant C5 gain retunes
LouisHitchcock Oct 4, 2026
b173c9c
Add C5 handshake timing telemetry
LouisHitchcock Oct 4, 2026
d8017f0
Add C5 multi-pilot handoff
LouisHitchcock Oct 4, 2026
c4ee347
Record C5 1 kHz-per-pilot research
LouisHitchcock Oct 5, 2026
e371aea
Run the C5 receiver in scan mode and race on its laps
LouisHitchcock Oct 5, 2026
2ac4f97
Race up to eight pilots on one C5 receiver
LouisHitchcock Oct 5, 2026
c2d2741
Rewrite the C5 multi-pilot guide for users
LouisHitchcock Oct 5, 2026
df290c9
Point the C5 docs at the public C5MK repo
LouisHitchcock Oct 6, 2026
ccbd352
Power the C5 from 5V in the C5 user guide
LouisHitchcock Oct 6, 2026
4869f5e
Record 8-pilot race traces and rework the multi-pilot UI
LouisHitchcock Oct 7, 2026
32bda54
Release v1.9.0-Multi-Alpha-1
LouisHitchcock Oct 7, 2026
e7728e8
Draw the RGB LEDs from one task at a time
LouisHitchcock Oct 9, 2026
d301df4
Fix the USB controller driver bugs that killed USB networking
LouisHitchcock Oct 9, 2026
673d0f2
Report every pilot's passes to the RotorHazard plugin
LouisHitchcock Oct 9, 2026
542c633
Add the Waveshare ESP32-S3-ETH with wired Ethernet
LouisHitchcock Oct 9, 2026
cf42bfc
Release v1.9.0-Multi-Alpha-2
LouisHitchcock Oct 9, 2026
8a94138
Remove the version 1 RotorHazard mode and send full-resolution RSSI
LouisHitchcock Oct 9, 2026
7285194
Pin library versions to the ones the Alpha-2 build used
LouisHitchcock Oct 9, 2026
2ee006e
Merge split passes, keep RSSI peaks for Marshal, retry Ethernet DHCP
LouisHitchcock Oct 10, 2026
d21b1e1
Race director, C5 updates over the link, and Ethernet uploads at full…
LouisHitchcock Oct 10, 2026
ecda229
Merge feature/race-director into V1.9.0-alpha
LouisHitchcock Oct 10, 2026
b3151ff
Report a resettable heap low-water mark in /api/system/info
LouisHitchcock Oct 11, 2026
96d443b
Keep the web server from running the heap out
LouisHitchcock Oct 11, 2026
7972586
Record what's in flight when the heap runs low
LouisHitchcock Oct 11, 2026
ce9730e
Only refuse file downloads when the heap is low
LouisHitchcock Oct 12, 2026
dddc88c
Package v1.9.0-Multi-Alpha-3 for the XIAO ESP32S3 and Waveshare ESP32…
LouisHitchcock Oct 12, 2026
eb05685
Send RotorHazard a test pass on request
LouisHitchcock Oct 12, 2026
7abc685
Fix an event-stream disconnect race that rebooted gates
LouisHitchcock Oct 13, 2026
0d0dc3e
Show race analysis for C5 multi-pilot races
LouisHitchcock Oct 18, 2026
68ab052
Prepare v1.9.0-Multi-Alpha-4: version, changelog and release notes
LouisHitchcock Oct 18, 2026
41dd2b8
Put fastest lap and fastest 3 consecutive beside best 3 and median
LouisHitchcock Oct 18, 2026
25af499
Package v1.9.0-Alpha-4 for the XIAO ESP32S3 and Waveshare ESP32-S3-ETH
LouisHitchcock Oct 18, 2026
3586723
Ship boot_app0.bin so a USB flash starts the new firmware
LouisHitchcock Oct 18, 2026
2344eab
Revise the Alpha-4 release notes: C5MK 1.2.1 or later, both boards te…
LouisHitchcock Oct 18, 2026
6d98f1b
Time C5 passes and RotorHazard's history at the same peak samples
LouisHitchcock Oct 22, 2026
d73a7d6
Read the RH reference clock after collecting peak snapshots
LouisHitchcock Oct 23, 2026
d4098db
Add opt-in full-rate C5 timing traces in PSRAM
LouisHitchcock Oct 23, 2026
f287c80
Run C5 race completion and history saving on the gate
LouisHitchcock Oct 24, 2026
0f145a0
Prepare Alpha-4 RH timing test prerelease
LouisHitchcock Oct 24, 2026
b871c1a
Package RH timing test images for XIAO S3 and S3-ETH
LouisHitchcock Oct 24, 2026
3b5b035
Publish RH timing fixes through the normal Alpha 5 release
LouisHitchcock Oct 24, 2026
0ed9a5b
Add the dedicated C5MK AIO target and C5-only receiver configuration
LouisHitchcock Oct 24, 2026
5e92011
Add the C5MK AIO board package to the existing Alpha 5 release
LouisHitchcock Oct 24, 2026
0bd16b0
Fix consecutive-lap announcements and keep max-laps stopping working
LouisHitchcock Oct 24, 2026
48b4ec5
Merge gate-side C5 race completion into Alpha 5
LouisHitchcock Oct 24, 2026
66d2406
Merge consecutive-lap announcer fixes into Alpha 5
LouisHitchcock Oct 24, 2026
4ce0dcf
Verify the combined announcer and gate-managed race behavior
LouisHitchcock Oct 24, 2026
7bfc58f
Document the six-board Alpha 5 refresh and verify every board pin map
LouisHitchcock Oct 24, 2026
fe0f31d
Keep RotorHazard passes streaming after local gate race completion
LouisHitchcock Oct 24, 2026
90b3b40
Verify every Alpha 5 image and extract filesystems to catch stale pag…
LouisHitchcock Oct 24, 2026
9b7663b
Align the release packager and build matrix with the six-board 1.9.0 …
LouisHitchcock Oct 24, 2026
c6e4426
Document integrated native tests and same-version release verification
LouisHitchcock Oct 24, 2026
9f030b1
Support the Windows LittleFS extractor in release verification
LouisHitchcock Oct 24, 2026
462a9aa
Refresh Alpha 5 with merged race fixes and all six board images
LouisHitchcock Oct 24, 2026
08d946b
Rewrite the README for 1.9.0
LouisHitchcock Oct 25, 2026
72bc56e
Show the multi-pilot calibration screen in the README
LouisHitchcock Oct 25, 2026
b0409a5
Lead the README with a banner and mention low cost
LouisHitchcock Oct 25, 2026
99dcd71
Say affordable ESP32-S3 hardware instead of low cost
LouisHitchcock Oct 25, 2026
2be53c8
Leave the C5's memory free on gates that don't use one
LouisHitchcock Oct 25, 2026
1dff49a
Give each file served a 512-byte buffer instead of 4 KB
LouisHitchcock Oct 25, 2026
785da77
Record the RotorHazard post-soak timing investigation
LouisHitchcock Oct 25, 2026
dcc4fb4
Merge the 1.9.0 README rewrite (#23)
LouisHitchcock Oct 25, 2026
7a09498
Merge the RotorHazard post-soak timing investigation
LouisHitchcock Oct 25, 2026
a2d00d3
Merge main (v1.8.3 and v1.8.4) into V1.9.0-alpha
LouisHitchcock Oct 25, 2026
d5f16b9
Clean up repository layout and remove legacy Electron app
LouisHitchcock Oct 25, 2026
a875bd4
Record Event results and prepare the next heat on the gate
LouisHitchcock Oct 29, 2026
7452f46
Make the manual release build fail closed and package real offsets
LouisHitchcock Oct 29, 2026
049a99a
Rewrite the documentation for 1.9.0
LouisHitchcock Oct 29, 2026
b96bfa8
Flash the gate LEDs on C5 crossings
LouisHitchcock Oct 29, 2026
3bc3a36
Parse ELRS backpack switch messages
LouisHitchcock Oct 29, 2026
1511729
Start and stop races from an ELRS radio switch
LouisHitchcock Oct 29, 2026
720ec90
Add the ELRS Backpack settings tab
LouisHitchcock Oct 29, 2026
f5187be
Document ELRS race control
LouisHitchcock Oct 29, 2026
ebc3c96
Set version to 1.9.0-Alpha-6
LouisHitchcock Oct 29, 2026
f210e7c
Add ELRS race start countdown
LouisHitchcock Oct 30, 2026
4040785
Restore browser race announcements
LouisHitchcock Oct 30, 2026
f7e3a6b
Retry SD initialization at low SPI speed
LouisHitchcock Oct 30, 2026
343b391
Update version number to 1.9.0-alpha-6 in README
LouisHitchcock Oct 30, 2026
591ea75
Prepare 1.9.0-rc.1 and restore native qualification harnesses
LouisHitchcock Nov 4, 2026
83a6751
Keep history HTTP responsive during SD reload and validate binary RSS…
LouisHitchcock Nov 4, 2026
ccbec09
Prepare rc.2 with complete, safe status configuration output
LouisHitchcock Nov 4, 2026
ff2379d
Observe C5 OTA trial before reporting success
LouisHitchcock Nov 4, 2026
e0e57b9
Serialize buzzer playback across gate tasks
LouisHitchcock Nov 5, 2026
3dd4178
Keep race history list route from shadowing downloads
LouisHitchcock Nov 5, 2026
2724ae2
Guard AsyncTCP receive callbacks after client detachment
LouisHitchcock Nov 5, 2026
4f5a2ea
Prepare rc.3 with maintained network libraries and serialized SSE dis…
LouisHitchcock Nov 5, 2026
e6248ee
Preserve queued HTTP bytes and retained history records
LouisHitchcock Nov 5, 2026
efd71e6
Make race-day validation wait for complete saves and journal owned races
LouisHitchcock Nov 5, 2026
3b52e23
Keep RotorHazard passes when the link is refreshed mid-tick
LouisHitchcock Nov 5, 2026
69a6cb0
Count RotorHazard passes the gate sends and loses
LouisHitchcock Nov 5, 2026
795456e
Retry refused evidence renames in the acceptance harness
LouisHitchcock Nov 5, 2026
aedb5fd
Restore every gate before the acceptance harness exits
LouisHitchcock Nov 6, 2026
17892bc
Add a probe that separates gate accept failures from outages
LouisHitchcock Nov 6, 2026
21476f9
Announce every lap with a beep or lap time, and merge laps in the editor
LouisHitchcock Nov 6, 2026
351f15c
Keep the log through crashes and optionally save it to the SD card
LouisHitchcock Nov 6, 2026
8f60752
Add C5 receiver checks and a log download to Diagnostics
LouisHitchcock Nov 6, 2026
c653880
Prepare rc.5
LouisHitchcock Nov 6, 2026
9f34fcd
Hold more than one boot in the log ring
LouisHitchcock Nov 6, 2026
afedfdf
Download the whole log ring, not just the monitor's window
LouisHitchcock Nov 6, 2026
e61891a
Prevent premature Ethernet DHCP fallback when the link timestamp is n…
LouisHitchcock Nov 6, 2026
6d858cf
Merge remote-tracking branch 'origin/V1.9.0-alpha' into release/v1.9.…
LouisHitchcock Nov 6, 2026
52aacbb
Record Ethernet restart diagnosis and remaining SD qualification failure
LouisHitchcock Nov 6, 2026
0877102
Backport the SD SPI reset handshake for Ethernet warm restarts
LouisHitchcock Nov 6, 2026
3f233ae
Stop qualification immediately on failures or external monitor signals
LouisHitchcock Nov 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ web-ui:
- 'data/**/*.html'
- 'data/**/*.css'
- 'data/**/*.js'
- 'electron/**'

documentation:
- changed-files:
- any-glob-to-any-file:
- '*.md'
- 'docs/**'
- 'images/**'

hardware:
- changed-files:
Expand Down
134 changes: 37 additions & 97 deletions .github/workflows/manual-release-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,131 +4,71 @@ on:
workflow_dispatch:
inputs:
version:
description: 'Version tag (e.g., v1.5.1)'
description: 'Version tag (e.g., v1.9.0-alpha-6); builds artifacts only'
required: true
type: string

permissions:
contents: read

env:
FPVGATE_RELEASE_VERSION: ${{ inputs.version }}

jobs:
build-firmware:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# The boards a release ships binaries for. Keep this in step with
# docs/RELEASE_PROCESS.md and the Supported_Boards.txt written into each
# release directory; a board missing here silently ships nothing.
environment:
- ESP32S3 # ESP32-S3 DevKitC-1, 8MB
- FPVGateAIO # XIAO ESP32S3, 8MB
- FPVGateSolo # XIAO ESP32S3, 8MB
- SeeedXIAOESP32S3 # 8MB
- XIAOS3Plus # 16MB

# Keep aligned with tools/package_release.py and RELEASE_PROCESS.md.
environment: [ESP32S3, FPVGateAIO, FPVGateC5MKAIO, FPVGateSolo, SeeedXIAOESP32S3, WaveshareS3ETH]
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Cache PlatformIO
- name: Validate release tag
shell: bash
run: |
[[ "$FPVGATE_RELEASE_VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z]+([.-][0-9A-Za-z]+)*)?$ ]] || { echo 'Invalid version tag'; exit 1; }
- name: Cache PlatformIO packages
uses: actions/cache@v4
with:
path: |
~/.platformio
.pio
key: ${{ runner.os }}-pio-${{ hashFiles('**/platformio.ini') }}
restore-keys: |
${{ runner.os }}-pio-

path: ~/.platformio
key: ${{ runner.os }}-pio-${{ hashFiles('platformio.ini', 'targets/*.ini') }}
restore-keys: ${{ runner.os }}-pio-
- name: Install PlatformIO
run: |
pip install platformio
pio upgrade

- name: Build firmware (${{ matrix.environment }})
run: pip install platformio==6.1.18
- name: Build firmware
run: pio run -e ${{ matrix.environment }}

- name: Build filesystem (${{ matrix.environment }})
- name: Build matching filesystem
run: pio run -e ${{ matrix.environment }} -t buildfs
continue-on-error: true

- name: Prepare release artifacts
run: |
mkdir -p release-artifacts/${{ matrix.environment }}

# Copy firmware binary
if [ -f .pio/build/${{ matrix.environment }}/firmware.bin ]; then
cp .pio/build/${{ matrix.environment }}/firmware.bin \
release-artifacts/${{ matrix.environment }}/firmware.bin
fi

# Copy filesystem binary
if [ -f .pio/build/${{ matrix.environment }}/littlefs.bin ]; then
cp .pio/build/${{ matrix.environment }}/littlefs.bin \
release-artifacts/${{ matrix.environment }}/littlefs.bin
fi

# Copy bootloader
if [ -f ~/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32s3/bin/bootloader_dio_80m.bin ]; then
cp ~/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32s3/bin/bootloader_dio_80m.bin \
release-artifacts/${{ matrix.environment }}/bootloader.bin
elif [ -f ~/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/bin/bootloader_dio_40m.bin ]; then
cp ~/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/bin/bootloader_dio_40m.bin \
release-artifacts/${{ matrix.environment }}/bootloader.bin
elif [ -f ~/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/bin/bootloader_dio_40m.bin ]; then
cp ~/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/bin/bootloader_dio_40m.bin \
release-artifacts/${{ matrix.environment }}/bootloader.bin
fi

# Copy partition table
if [ -f .pio/build/${{ matrix.environment }}/partitions.bin ]; then
cp .pio/build/${{ matrix.environment }}/partitions.bin \
release-artifacts/${{ matrix.environment }}/partitions.bin
fi

# Create flash command reference
cat > release-artifacts/${{ matrix.environment }}/FLASH_INSTRUCTIONS.txt << 'EOF'
Flash using esptool:

esptool.py --chip auto --port COM3 write_flash -z \
0x0 bootloader.bin \
0x8000 partitions.bin \
0x10000 firmware.bin \
0x410000 littlefs.bin

Or use PlatformIO:
pio run -e ${{ matrix.environment }} -t upload
pio run -e ${{ matrix.environment }} -t uploadfs
EOF

- name: Upload artifacts
uses: actions/upload-artifact@v4
- name: Package using the canonical board/partition definitions
run: python tools/package_release.py --version "$FPVGATE_RELEASE_VERSION" --only ${{ matrix.environment }} --skip-build
- name: Verify every packaged checksum before upload
working-directory: release/${{ inputs.version }}
run: sha256sum --check SHA256SUMS
- uses: actions/upload-artifact@v4
with:
name: FPVGate-${{ inputs.version }}-${{ matrix.environment }}
path: release-artifacts/${{ matrix.environment }}/*
path: release/${{ inputs.version }}/
if-no-files-found: error
retention-days: 90

create-release-bundle:
needs: build-firmware
runs-on: ubuntu-latest

steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
- uses: actions/download-artifact@v4
with:
pattern: FPVGate-${{ inputs.version }}-*
path: release-bundle

- name: Create unified release package
run: |
cd release-bundle
zip -r ../FPVGate-${{ inputs.version }}-AllBoards.zip .

- name: Upload complete bundle
uses: actions/upload-artifact@v4
working-directory: release-bundle
run: zip -r "../FPVGate-${FPVGATE_RELEASE_VERSION}-AllBoards.zip" .
- uses: actions/upload-artifact@v4
with:
name: FPVGate-${{ inputs.version }}-Complete
path: FPVGate-${{ inputs.version }}-AllBoards.zip
if-no-files-found: error
retention-days: 90
10 changes: 2 additions & 8 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,9 @@ __pycache__/
*.pyc
tools/__pycache__/

# Node.js / Electron
# Node.js
node_modules/
electron/dist/
electron/node_modules/
package-lock.json
*_Electron_App.zip

# WARP temporary files and documentation
.warp/
Expand Down Expand Up @@ -76,7 +73,7 @@ flashing_defaults.json
laptimer_v*.cpp
tools/apply_frontend_defaults.html

# Desktop app builds (too large for git, use GitHub releases)
# Generated archives (use GitHub releases for distribution)
*.zip

# PCB design files
Expand All @@ -98,6 +95,3 @@ PCB/
/overnight.json
/step*.json
/gate.json

# The discord bot for the FPVGate Discord Server
discord-bot/
155 changes: 154 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,160 @@
# Changelog

All notable changes to FPVGate will be documented in this file.
## [Unreleased]
## [1.9.0-alpha-5] - 2026-10-24

Fifth Multi-Pilot alpha, with RotorHazard timing fixes paired with FPVGate RH plugin v2.3.2-rc.1.
Refreshed in place with the announcer and gate-race-completion branches, for all six boards:
Seeed XIAO ESP32S3, Waveshare ESP32-S3-ETH, ESP32-S3 DevKitC-1 (8MB), FPVGate AIO, Solo and C5MK AIO.

### Added
- Dedicated C5MK AIO board identity, AIO outputs/SD pin map and forced C5 receiver
on defaults, saved-config load and receiver changes.
- C5 gate-managed max-lap/heat-time stopping and one saved multi-pilot history
record, without an open browser. Failed saves can be retried without duplication.

### Fixed
- Restored 2-/3-consecutive-lap totals and max-lap stopping after the announcer.
- C5 announcements use the selected consecutive mode independently per pilot.
- C5 passes and RotorHazard RSSI history now use the timestamps of the peak
samples, including separate peak midpoints for the two RSSI resolutions.
- The reference clock is read after peak snapshots so a newer sample cannot
produce a wrapped age and fall back to message-arrival timing.

### Testing
- Events results/next heat and non-C5 completion still need a browser.
- Six-board physical qualification, real storage recovery and soak remain pending.
- Use the matching plugin for live-versus-Marshal timestamp comparisons.
- Full-rate timing traces remain opt-in development instrumentation and are
not enabled in the distributed binaries.
- Camera validation and physical multi-transmitter race testing remain pending.

## [1.9.0-Alpha-4] - 2026-10-18

Fourth Multi-Pilot alpha, now named 1.9.0-Alpha-N: race analysis for C5
races and a reworked race screen, and a fix for a crash when a browser
disconnected.

### Fixed
- Race analysis in a C5 race: Fastest Lap and Fastest 3 Consecutive said to
complete a lap, and Best 3 Laps and Median Lap showed "--", however many laps
were flown. They read the single-pilot lap list, which a C5 race leaves
empty.
- A USB flash of a gate last updated over the air left it starting its old
firmware: the flash wrote the new one to the first app slot, but the gate
still chose the second. Releases now include `boot_app0.bin`, written at
0xe000 in the flash instructions, which chooses the first slot.
- A gate could reboot when a browser closed or lost its connection while a
message was being sent to it (seen on a XIAO on Multi-Alpha-3). The event
stream's connection is now cleared under its message lock and checked
before each send.

### Added
- RotorHazard: `POST /api/rh/testPass?node=n` sends RotorHazard a pass on a
node as if a quad had flown through, to check a setup such as split gates
without flying.

### Changed
- Race screen: Fastest Lap, Fastest 3 Consecutive, Best 3 Laps and Median Lap
are four boxes in a row, always shown. In a C5 race the first two are the
best of any pilot, with their name, and Best 3 and Median are the race
leader's, as in race history. The charts below are tabs for Consistency and
Lap Times, opening on Consistency, and Settings > User Interface > Race
Analytics Display turns those two on or off.

## [1.9.0-Multi-Alpha-3] - 2026-10-12

Third Multi-Pilot alpha: the Waveshare ESP32-S3-ETH is tested and fixed, the
C5 receiver can be updated through the gate, the race director, and a set of
stability fixes from overnight testing.

### Fixed
- Ethernet (Waveshare S3-ETH): uploads, OTA updates included, ran at about
10 KB/s and timed out. The Ethernet chip's receive buffer was being reset to
2 KB, one frame, by the order the drivers started in. It now gets its full
16 KB: uploads run at over 1 MB/s and a full OTA update takes about 10 s.
- One fly-through counted as several passes: a dip in signal during a pass
ended it. A pass now ends only after 300 ms below Exit.
- The C5 link lost data while the gate saved a race: the web server could hold
off the C5 reader for about a second. The web server now runs on the other
core, the C5 backlog is read in pieces, and the receive buffer is 16 KB.
- A gate on Wi-Fi could run out of memory and freeze when several pages and
event streams loaded at once. Each connection now holds less, live RSSI
messages are skipped while a stream is backed up (passes and laps never
are), and file downloads are refused with "busy" before memory runs out.
- Ethernet asks for an address again when the cable is replugged, and waits
45 s for DHCP before falling back to 192.168.8.1.

### Added
- Waveshare ESP32-S3-ETH: tested on hardware, and in the web flasher without
expert mode. USB networking switches off while Ethernet is connected, and
the header shows the Ethernet address.
- C5 receiver firmware updates through the gate (Settings > System), from
FPVGateC5MK releases or a file, for C5s on C5MK 1.1.0 or later. The gate
checks the image is for that C5's board, and a C5 that can't reach the gate
after an update goes back to its old firmware.
- Race director (Settings > User Interface > Event Mode, off by default):
pilots, groups, formats and a heat schedule, channel assignment within a
band, Elo and best-lap seeding, a Next Heat button, and import and export.
- Manual +Lap for each C5 pilot on the race screen.
- RotorHazard: RSSI 20 times a second with each pass's peak kept, so
RotorHazard's Marshal page works; full-resolution RSSI (0-1023) for the
plugin's **Full-resolution RSSI** option.
- Diagnostics in `/api/system/info`: memory low-water mark and what was in
flight at the low, Ethernet link speed, duplex and counters.

### Changed
- Library versions are pinned, so a fresh build uses the same libraries as
the release.

### Removed
- The version 1 **RotorHazard** role in Settings > Sync, where the gate posted
laps to a RotorHazard server (RH Host IP, node seat, connection status and
clock sync), and its `/api/rh/status` and `/api/rh/syncClock` endpoints. The
RotorHazard plugin 2 connects to the gate instead and needs no setting on the
gate; plugin 2 also accepts laps from gates on older firmware. See
[RotorHazard Integration](docs/ROTORHAZARD_INTEGRATION.md).

## [1.9.0-Multi-Alpha-2] - 2026-10-09

Second Multi-Pilot alpha: USB networking stability, RotorHazard plugin 2
support and the Waveshare ESP32-S3-ETH.

### Fixed
- USB networking no longer stops under sustained load. Two bugs in the USB
controller driver Arduino ships were to blame: a race that stalled the
network send pipe, and a local reset on an undocumented status bit that made
the gate drop its USB address. The driver is now built from a fixed copy.
Tested for 30 minutes at full load with no failure.
- The web server could hang and the gate reboot when a page load and the LED
animation drew the RGB LEDs at the same moment.

### Added
- RotorHazard plugin 2 support: every pilot's passes, live RSSI, and
frequencies and Enter/Exit levels set from RotorHazard (`/api/rh/*`).
- Waveshare ESP32-S3-ETH board with wired Ethernet (DHCP, or 192.168.8.1
without a DHCP server). Not yet tested on hardware.
- Crash core dumps readable over Wi-Fi (`/api/coredump/summary`), and USB
link diagnostics (`/api/usbnet/status`).

## [1.9.0-Multi-Alpha-1] - 2026-10-07

First public alpha of the ESP32-C5 multi-pilot receiver support.

### Added
- Up to eight pilots, with individual channels, names, colours and calibration.
- Multi-pilot standings, lap tables, browser announcements and race history.
- Eight-channel RSSI recording on SD and per-pilot editing in the Visual Marshal.
- Live receiver diagnostics and an RSSI debug window for all pilots.

### Alpha limits
- Requires a separate ESP32-C5 with FPVGate C5MK receiver firmware. Keep the
browser open for race completion, heat timeout and browser announcements.
- Each pilot is limited to 64 crossings. Physical eight-pilot testing remains
outstanding; this release is for testing.
- C5 mode does not support Master/Slave, daisy-chaining or RotorHazard roles.
- See the [release notes](release/v1.9.0-Multi-Alpha-1/RELEASE_NOTES.md) and
[C5 setup guide](docs/C5_MULTI_PILOT.md) for wiring and other limitations.

## [1.8.4] - 2026-10-20

Expand Down
Loading
Loading