Sync edgetx to Gitea

This commit is contained in:
2026-08-03 16:37:20 +08:00
commit 14eb5a3fb9
5364 changed files with 2835009 additions and 0 deletions
+168
View File
@@ -0,0 +1,168 @@
name: 🐞 Bug
description: File a bug report
labels: ["bug 🪲", "triage"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
Please note that this is not the place to make feature requests or ask for
help. For this, please use the [Discord server](https://discord.gg/wF9wUKnZ6H) or [Discussion forum](https://github.com/EdgeTX/edgetx/discussions).
- type: checkboxes
attributes:
label: Is there an existing issue for this problem?
description: Please search to see if an issue already exists for the bug you encountered.
options:
- label: I have searched the existing issues
required: true
- type: dropdown
id: component-affected
attributes:
label: What part of EdgeTX is the focus of this bug?
description: Is it the radio firmware, companion software or something else?
options:
- Transmitter firmware
- Companion
- Simulator
- Build system
- Other (Please specify below)
validations:
required: true
- type: textarea
attributes:
label: Current Behavior
description: A clean and concise description of what you're experiencing.
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: What is it that you expected to happen?
validations:
required: true
- type: textarea
attributes:
label: Steps To Reproduce
description: Steps to reproduce the behavior.
placeholder: |
1. Push throttle up.
2. Push throttle down.
3. Flick SWC on and off three times.
4. See error.
validations:
required: true
- type: dropdown
id: version
attributes:
label: Version
description: What version of EdgeTX software are you running?
options:
- 2.12.1
- 2.12.0
- 2.11.5
- 2.11.4
- 2.11.3
- 2.11.2
- 2.11.1
- 2.11.0
- 2.10.6
- 2.10.5
- 2.10.4
- 2.10.3
- 2.10.2
- 2.10.1
- 2.10.0
- 2.9.4
- 2.8.5
- Nightly (Please give date/commit below)
- Other (Please specify below)
validations:
required: true
- type: dropdown
id: transmitter
attributes:
label: Transmitter
description: |
What transmitter are you using? You can pick more than one if this is
affecting more than one transmitter.
multiple: true
options:
- BetaFPV LiteRadio3 Pro
- iFlight Commando8
- Fatfish F16
- Flysky EL18
- Flysky NB4+
- Flysky NV14
- Flysky PA01
- Flysky PL18/PL18EV
- Flysky ST16
- FrSky Q X7 / Q X7S (ACCST)
- FrSky Q X7 / Q X7S (ACCESS)
- FrSky X9D
- FrSky X9D+
- FrSky X9D+2019
- FrSky X9E / X9E Hall
- FrSky X9 Lite / Lite S
- FrSky X10 / X10S (ACCST)
- FrSky X10 Express / X10S Express (ACCESS)
- FrSky X12
- FrSky X-Lite / S / Pro
- HelloRadioSky V12
- HelloRadioSky V14
- HelloRadioSky V16
- Jumper T12
- Jumper T14
- Jumper T15
- Jumper T15 Pro
- Jumper T16
- Jumper T18
- Jumper T20/T20S
- Jumper T20 V2
- Jumper T-Lite
- Jumper T-Pro
- Jumper T-Pro V2
- RadioMaster Boxer
- RadioMaster GX12
- RadioMaster MT12
- RadioMaster Pocket
- RadioMaster T8
- RadioMaster TX12 / TX12MK2
- RadioMaster TX15
- RadioMaster TX16S / TX16SMK2
- RadioMaster TX16S MK3
- RadioMaster Zorro
- Other (Please specify below)
validations:
required: true
- type: dropdown
id: os-type
attributes:
label: "Operating System (OS)"
description: "If this relates to Companion or Simulator, what OSes are you are experiencing issues on?"
multiple: true
options:
- Linux
- macOS
- Windows
validations:
required: false
- type: input
id: os-version
attributes:
label: "OS Version"
description: "If this relates to Companion or Simulator, what OS version does this relate to?"
placeholder: "i.e. 10, Ubuntu 20.04, Big Sur"
validations:
required: false
- type: textarea
attributes:
label: Anything else?
description: |
Screenshots? References? Anything that will give us more context about the issue you are encountering!
This includes if you are running customised firmware or have made hardware modifications to the transmitter
which could have some bearing on the issue.
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations:
required: false
+14
View File
@@ -0,0 +1,14 @@
blank_issues_enabled: false
contact_links:
- name: SD Card Pack - e.g. included Templates, Lua Widgets, Themes
url: https://github.com/EdgeTX/edgetx-sdcard/issues/new
about: If you have a request or issue with a Lua widget or something else that is part of the SD Card pack, please head over there to open an issue.
- name: SD Card Voice Pack
url: https://github.com/EdgeTX/edgetx-sdcard-sounds/issues/new/choose
about: If you have a request or issue with the sound card packs, please head over there to open an issue.
- name: Community Support
url: https://discord.gg/wF9wUKnZ6H
about: Please ask and answer support "how do I?" questions here.
- name: Discussion Forum
url: https://github.com/EdgeTX/edgetx/discussions
about: Please raise ideas, ask questions, discuss feature suggestions and showcase stuff here.
@@ -0,0 +1,54 @@
name: 🚀 Feature Request / Enhancement
description: Suggest an improvemnt to make EdgeTX even better!
labels: ["enhancement ✨"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this feature request!
If your idea is still at the formulation stage, or you're not sure it would
be useful to many users, you can raise it as a discussion topic under [Ideas](https://github.com/EdgeTX/edgetx/discussions/categories/ideas)
or you can raise it on the [Discord server](https://discord.gg/wF9wUKnZ6H).
- type: checkboxes
attributes:
label: Is there an existing issue for this feature request?
description: |
Please search to see if an issue already exists for a feature, or perhaps one similar.
You can then comment and react so that we know know much interest there is in the feature request
options:
- label: I have searched the existing issues
required: true
- type: textarea
attributes:
label: Is your feature request related to a problem?
description: A clear and concise description of what the problem is.
placeholder: I'm always frustrated when [...]
validations:
required: true
- type: textarea
attributes:
label: Describe the solution you'd like
description: A clear and concise description of what you want to happen.
placeholder: It should do [...]
validations:
required: true
- type: textarea
attributes:
label: Describe alternatives you've considered
description: A clear and concise description of any alternative solutions or features you've considered.
placeholder: |
1. [...]
2. [...]
3. [...]
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: |
Add any other context, diagrams, illustations or screenshots about the feature request here.
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations:
required: false
@@ -0,0 +1,64 @@
name: 'Build Companion'
inputs:
os:
description: 'OS / Architecture'
required: true
qt-version:
description: 'Qt version'
default: '6.9.3'
qt-arch:
description: 'Qt architecture'
required: runner.os != 'Linux'
sdl2-version:
description: 'SDL2 version'
default: '2.32.8'
runs:
using: "composite"
steps:
- name: Install Qt
if: runner.os != 'Linux'
uses: jdpurcell/install-qt-action@v5
env:
AQT_CONFIG: ${{ github.workspace }}/tools/aqt-settings.ini
with:
version: ${{ inputs.qt-version }}
modules: 'qtmultimedia qtserialport'
arch: ${{ inputs.qt-arch }}
cache: true
cache-key-prefix: 'install-qt-action-${{ inputs.qt-arch }}'
- name: Setup SDL2
if: runner.os != 'Linux'
shell: bash
env:
ACTION_PATH: ${{ github.action_path }}
SDL2_VERSION: ${{ inputs.sdl2-version }}
run: |
"${ACTION_PATH}/setup-sdl2.sh" ${SDL2_VERSION}
- name: Setup MSVC
if: runner.os == 'Windows'
shell: pwsh
run: ${{ github.action_path }}/setup-msvc.ps1
- name: Build
shell: bash
env:
CMAKE_BUILD_TYPE: 'Release'
run: |
mkdir output && \
CMAKE_PREFIX_PATH="$QT_ROOT_DIR;$SDL2_ROOT" \
tools/build-companion.sh "$(pwd)" "$(pwd)/output/"
- name: Compose release filename
run: echo "artifact_name=edgetx-cpn-${{ inputs.os }}-${GITHUB_REF##*/}" >> $GITHUB_ENV
shell: bash
- name: Archive production artifacts
uses: actions/upload-artifact@v7
with:
name: "${{ env.artifact_name }}"
path: ${{github.workspace}}/output
retention-days: 15
@@ -0,0 +1,39 @@
# setup-msvc.ps1
# Runs vcvarsall.bat and exports only the new/changed environment
# variables to GitHub Actions, avoiding clobbering existing ones.
param(
[string]$Arch = "x64"
)
# Find VS installation
$vsWhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
$vsPath = & $vsWhere -latest -property installationPath
$vcvars = Join-Path $vsPath "VC\Auxiliary\Build\vcvarsall.bat"
if (-not (Test-Path $vcvars)) {
Write-Error "vcvarsall.bat not found at: $vcvars"
exit 1
}
# Snapshot environment before
$before = @{}
Get-ChildItem env: | ForEach-Object { $before[$_.Name] = $_.Value }
# Run vcvarsall.bat and import its environment into this process
cmd /c "`"$vcvars`" $Arch && set" | ForEach-Object {
if ($_ -match '^([^=]+)=(.*)$') {
[System.Environment]::SetEnvironmentVariable($Matches[1], $Matches[2])
}
}
# Export only changed/new variables to GitHub Actions
$count = 0
Get-ChildItem env: | ForEach-Object {
if ($before[$_.Name] -ne $_.Value) {
"$($_.Name)=$($_.Value)" | Out-File -Append -Encoding utf8 $env:GITHUB_ENV
$count++
}
}
Write-Host "Exported $count environment variables to GITHUB_ENV"
+46
View File
@@ -0,0 +1,46 @@
#!/usr/bin/env bash
# setup-sdl2.sh
# Downloads/installs SDL2 for Windows and macOS.
# Linux is handled separately via a Docker container.
set -euo pipefail
VERSION="${1:?Usage: setup-sdl2.sh <version>}"
case "$RUNNER_OS" in
Windows)
ARCHIVE="SDL2-devel-${VERSION}-VC.zip"
URL="https://github.com/libsdl-org/SDL/releases/download/release-${VERSION}/${ARCHIVE}"
DEST="${RUNNER_TEMP}/SDL2"
echo "Downloading SDL2 ${VERSION} (Windows/MSVC)..."
curl -fsSL -o "${RUNNER_TEMP}/${ARCHIVE}" "${URL}"
unzip -q "${RUNNER_TEMP}/${ARCHIVE}" -d "${DEST}"
SDL2_ROOT="${DEST}/SDL2-${VERSION}"
echo "SDL2_ROOT=${SDL2_ROOT}" >> "${GITHUB_ENV}"
;;
macOS)
ARCHIVE="SDL2-${VERSION}.dmg"
URL="https://github.com/libsdl-org/SDL/releases/download/release-${VERSION}/${ARCHIVE}"
echo "Downloading SDL2 ${VERSION} (macOS framework)..."
curl -fsSL -o "${RUNNER_TEMP}/${ARCHIVE}" "${URL}"
hdiutil attach "${RUNNER_TEMP}/${ARCHIVE}" -quiet -mountpoint "${RUNNER_TEMP}/sdl2-mnt"
sudo cp -R "${RUNNER_TEMP}/sdl2-mnt/SDL2.framework" /Library/Frameworks/
hdiutil detach "${RUNNER_TEMP}/sdl2-mnt" -quiet
;;
Linux)
echo "Skipping — SDL2 is provided by the Docker container"
;;
*)
echo "::error::Unsupported RUNNER_OS: ${RUNNER_OS}"
exit 1
;;
esac
echo "SDL2 ${VERSION} setup complete for ${RUNNER_OS}"
@@ -0,0 +1,17 @@
name: 'Setup WASI SDK'
inputs:
python-version:
description: 'Python version'
default: '3.13'
runs:
using: "composite"
steps:
- uses: actions/setup-python@v6
with:
python-version: ${{ inputs.python-version }}
cache: 'pip' # caching pip dependencies
- run: python3 -m pip install -r requirements.txt
shell: bash
+20
View File
@@ -0,0 +1,20 @@
name: 'Setup WASI SDK'
inputs:
arch:
description: 'OS / Architecture (ex: arm64-macos)'
default: 'arm64-macos'
version:
description: 'SDK version'
default: '25'
runs:
using: "composite"
steps:
- name: Install WASI SDK
if: steps.cache-wasi-sdk.outputs.cache-hit != 'true'
shell: bash
run: |
mkdir /tmp/wasi-sdk
curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${{ inputs.version }}/wasi-sdk-${{ inputs.version }}.0-${{ inputs.arch }}.tar.gz | tar xz --strip-components 1 -C /tmp/wasi-sdk
sudo mv /tmp/wasi-sdk /opt/wasi-sdk
+13
View File
@@ -0,0 +1,13 @@
<!--
Please note that pull requests are NOT an appropriate way to
ask questions or for support, and will be closed.
For feature requests or bug reports, please use the Issues tab.
For support, please use the Discussion tab or join us on Discord.
Feel free to delete any of the below which does not apply.
-->
Fixes #
Summary of changes:
+25
View File
@@ -0,0 +1,25 @@
name: 'Auto-close marked issues'
on:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v10
with:
# Issue closure message
close-issue-message: 'This issue has been closed due to no activity in over four weeks after having been marked as closure pending.'
# Issue close reason
close-issue-reason: not_planned
# Do not mark issues or PRs as stale automaticaly
days-before-stale: -1
# Close issue/PR if no activity for four weeks after closure pending warning
days-before-close: 28
# Do not auto close PRs
days-before-pr-close: -1
# Do not auto-close an issue if it is assigned to a milestone
exempt-all-issue-milestones: true
# Stale issue label
stale-issue-label: 'closing 🚪'
+138
View File
@@ -0,0 +1,138 @@
---
name: Run tests and package firmware
on:
push:
branches:
- 'main'
- '[0-9]+.[0-9]+'
tags:
- v*
paths: &trigger-paths
- '.github/workflows/build_fw.yml'
- 'cmake/**'
- 'radio/**'
- 'tools/build-gh.sh'
- '.gitmodules'
- 'CMakeLists.txt'
pull_request:
paths: *trigger-paths
jobs:
test:
name: Run tests
runs-on: ubuntu-latest
if: |
github.event_name != 'pull_request' ||
!contains(github.event.pull_request.labels.*.name, 'ci: skip-fw')
strategy:
matrix:
target:
- x9dp2019;x9e
- tx15
- tx16s
- tx16smk3
- nv14
- el18
- pl18
- pl18ev
- t12max;t14
- t15
- t16
- t18
- t20;t20v2
- x10
- x12s
- mt12;gx12
- nb4p
- st16
- t15pro
- pa01
container:
image: ghcr.io/edgetx/edgetx-dev:latest
volumes:
- ${{ github.workspace }}:/src
steps:
- name: Check out the repo
uses: actions/checkout@v6
with:
submodules: recursive
- name: Test ${{ matrix.target }}
env:
FLAVOR: ${{ matrix.target }}
CMAKE_BUILD_PARALLEL_LEVEL: 4
run: |
echo "Running commit tests"
./tools/commit-tests.sh
build:
name: Run builds
needs: test
runs-on: ubuntu-latest
if: |
github.event_name != 'pull_request' ||
!contains(github.event.pull_request.labels.*.name, 'ci: skip-fw')
strategy:
matrix:
target:
- nv14;el18
- pl18;pl18ev
- pl18u;pa01
- t15;t16
- t14;t18;mt12
- zorro;pocket;commando8
- tprov2;tpros;bumblebee
- mt12;gx12;t20;t20v2
- t12max;tx12mk2;boxer
- tx15;tx16s
- x12s;f16
- v12;v14;v16
- x10;x10express
- x7access;x9dp2019;x9e;x9e-hall
- nb4p;st16
- tx16smk3;t14;t15pro
container:
image: ghcr.io/edgetx/edgetx-dev:latest
volumes:
- ${{ github.workspace }}:/src
steps:
- name: Check out the repo
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build ${{ matrix.target }}
env:
FLAVOR: ${{ matrix.target }}
CMAKE_BUILD_PARALLEL_LEVEL: 4
run: |
echo "Running firmware build"
./tools/build-gh.sh
- name: Upload ${{ matrix.target }}
uses: actions/upload-artifact@v7
with:
name: firmware-${{ matrix.target }}
path: |
fw.json
LICENSE
*.bin
*.uf2
retention-days: 15
if-no-files-found: error
package:
name: Package firmwares
needs: build
runs-on: ubuntu-latest
steps:
- name: Compose release filename
run: echo "artifact_name=edgetx-firmware-${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Merge firmware artifact packages
uses: actions/upload-artifact/merge@v7
with:
name: "${{ env.artifact_name }}"
pattern: firmware-*
delete-merged: true
retention-days: 15
+183
View File
@@ -0,0 +1,183 @@
name: Companion
on:
push:
branches:
- 'main'
tags:
- v*
paths:
- '.github/workflows/companion.yml'
- 'companion/**'
- 'tools/build-companion.sh'
- 'tools/build-wasm-modules.sh'
- 'cmake/wasm/CMakeLists.txt'
pull_request:
paths:
- '.github/workflows/companion.yml'
- 'companion/**'
- 'tools/build-companion.sh'
- 'tools/build-wasm-modules.sh'
- 'cmake/wasm/CMakeLists.txt'
workflow_dispatch:
inputs:
target:
description: 'Build target'
required: true
default: 'all'
type: choice
options:
- all
- linux
- macos
- windows
- wasm
jobs:
modules:
name: WASM Modules (${{ matrix.group.id }})
runs-on: macos-15
strategy:
matrix:
group:
- id: color-1
target: [nv14, el18, pl18, pl18ev]
- id: color-2
target: [pl18u, t15, t16, t18]
- id: bw-1
target: [zorro, pocket, mt12, commando8, tprov2, tpros, bumblebee, t14]
- id: bw-2
target: [mt12, gx12, t20, t20v2, t12max, tx12mk2, boxer]
- id: color-3
target: [tx15, tx16s, x12s, f16]
- id: mixed-1
target: [v12, v14, v16, x10, x10express]
- id: bw-3
target: [x7access, x9dp2019, x9e, x9e-hall]
- id: color-4
target: [nb4p, st16, pa01]
- id: color-5
target: [t15pro, tx16smk3]
steps:
- name: Check out the repo
uses: actions/checkout@v5
with:
submodules: true
- name: Setup Python Dependencies
uses: ./.github/actions/python_dependencies
- name: Setup WASI SDK
uses: ./.github/actions/wasi_sdk
- name: Build modules
shell: bash
env:
FLAVOR: ${{ join(matrix.group.target, ';') }}
CMAKE_BUILD_TYPE: 'Release'
run: |
mkdir output && \
tools/build-wasm-modules.sh "$(pwd)" "$(pwd)/output/"
- name: Archive production artifacts
uses: actions/upload-artifact@v7
with:
name: wasm-modules-${{ matrix.group.id }}
path: ${{github.workspace}}/output
if-no-files-found: error
retention-days: 15
build-linux:
name: Linux Companion
runs-on: ubuntu-latest
needs: modules
if: inputs.target == 'all' || inputs.target == 'linux' || inputs.target == ''
container:
image: ghcr.io/edgetx/edgetx-dev:latest
volumes:
- ${{ github.workspace }}:/src
steps:
- name: Check out the repo
uses: actions/checkout@v5
with:
submodules: recursive
- name: Download WASM modules
uses: actions/download-artifact@v7
with:
pattern: wasm-modules-*
path: wasm-modules
merge-multiple: true
- name: Setup and Build
uses: ./.github/actions/build_companion
with:
os: 'linux'
build-macos:
name: macOS Companion
runs-on: macos-15
needs: modules
if: inputs.target == 'all' || inputs.target == 'macos' || inputs.target == ''
env:
CMAKE_OSX_ARCHITECTURES: 'x86_64;arm64'
CMAKE_OSX_DEPLOYMENT_TARGET: '11.0'
steps:
- name: Check out the repo
uses: actions/checkout@v5
with:
submodules: recursive
- name: Download WASM modules
uses: actions/download-artifact@v7
with:
pattern: wasm-modules-*
path: wasm-modules
merge-multiple: true
- name: Setup and Build
uses: ./.github/actions/build_companion
with:
os: 'macos'
qt-arch: 'clang_64'
build-win64:
name: Windows Companion
runs-on: windows-2022
needs: modules
if: inputs.target == 'all' || inputs.target == 'windows' || inputs.target == ''
env:
CMAKE_GENERATOR: 'Ninja'
CXX: 'clang++'
CC: 'clang'
defaults:
run:
shell: bash
steps:
- name: Check out the repo
uses: actions/checkout@v5
with:
submodules: recursive
- name: Download WASM modules
uses: actions/download-artifact@v7
with:
pattern: wasm-modules-*
path: wasm-modules
merge-multiple: true
- name: Setup and Build
uses: ./.github/actions/build_companion
with:
os: 'win64'
qt-arch: 'win64_msvc2022_64'
+55
View File
@@ -0,0 +1,55 @@
name: Deploy Documentation
on:
push:
branches:
- main
paths:
- 'docs/**'
- 'mkdocs.yml'
- 'docs-requirements.txt'
- '.github/workflows/docs.yml'
tags:
- 'v[0-9]+.[0-9]+.[0-9]+' # release tags only, not -rc
pull_request:
paths:
- 'docs/**'
- 'mkdocs.yml'
- 'docs-requirements.txt'
- '.github/workflows/docs.yml'
workflow_dispatch:
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Configure git for mike
if: github.event_name != 'pull_request'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Build docs (PR check)
if: github.event_name == 'pull_request'
run: uv run --with-requirements docs-requirements.txt mkdocs build --strict
- name: Deploy as latest (main branch)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: uv run --with-requirements docs-requirements.txt mike deploy --push --update-aliases latest
- name: Deploy release version
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
run: |
# Extract minor version from tag, e.g. v2.11.2 -> v2.11
VERSION=$(echo "${GITHUB_REF_NAME}" | sed 's/\.[0-9]*$//')
uv run --with-requirements docs-requirements.txt mike deploy --push --update-aliases "${VERSION}" stable
+148
View File
@@ -0,0 +1,148 @@
---
name: Build and deploy nightly release
on:
schedule:
- cron: '0 2 * * *' # run at 2 AM UTC
workflow_dispatch:
concurrency:
group: 'nightly'
cancel-in-progress: true
jobs:
build:
name: Build firmware
runs-on: ubuntu-latest
strategy:
matrix:
target:
- nv14;el18
- pl18;pl18ev;pl18u
- pa01
- t12max
- t15;t16;t18
- zorro;pocket;mt12;commando8
- tprov2;tpros;bumblebee
- t20;t20v2;t14
- tx12mk2;boxer;gx12
- tx16s
- tx16smk3
- f16
- v16
- x10;x10express
- x12s
- x7access
- x9dp2019
- x9e;x9e-hall
- mt12
- nb4p
- st16
- tx15
- t15pro
container:
image: ghcr.io/edgetx/edgetx-dev:latest
volumes:
- ${{ github.workspace }}:/src
steps:
- name: Check out the repo
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build firmware ${{ matrix.target }}
env:
FLAVOR: ${{ matrix.target }}
EDGETX_VERSION_SUFFIX: nightly
CMAKE_BUILD_PARALLEL_LEVEL: 4
run: ./tools/build-gh.sh
- name: Package firmware ${{ matrix.target }}
uses: actions/upload-artifact@v7
with:
name: edgetx-firmware-nightly-${{ matrix.target }}
path: |
fw.json
LICENSE
*.bin
*.uf2
retention-days: 15
if-no-files-found: error
deploy:
name: Deploy release
runs-on: ubuntu-latest
needs: build
permissions:
contents: write
steps:
- name: Check out the repo
uses: actions/checkout@v6
with:
fetch-depth: 0 # Need full history for changelog
- name: Download artifacts
uses: actions/download-artifact@v8
with:
pattern: edgetx-firmware-nightly-*
path: edgetx-firmware-nightly
merge-multiple: true
- name: Compose release filename
run: |
echo "release_filename=edgetx-firmware-nightly-${GITHUB_SHA::8}.zip" >> $GITHUB_ENV
echo "build_date=$(date -u +'%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_ENV
echo "old_nightly_sha=$(git rev-parse nightly)" >> $GITHUB_ENV
- name: Zip release file
uses: montudor/action-zip@v1
with:
args: zip -qq -j -r ${{ env.release_filename }} ./edgetx-firmware-nightly
- name: Generate changelog
id: changelog
uses: orhun/git-cliff-action@v4
with:
config: cliff.toml
args: --verbose --strip all nightly..HEAD
env:
OUTPUT: CHANGELOG.md
- name: Update nightly tag
run: |
git config user.name github-actions
git config user.email github-actions@github.com
git tag -f nightly
git push -f origin nightly
- name: Delete previous nightly release
run: |
# Delete the existing nightly release to avoid accumulating assets
gh release delete nightly --yes || true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Deploy nightly release
uses: softprops/action-gh-release@v2 #softprops/action-gh-release/pull/670 or v3 to clear nodejs log warning
with:
tag_name: nightly
prerelease: true
name: "Nightly Build"
body: |
## Automated Nightly Build
**Commit:** ${{ github.sha }}
**Built:** ${{ env.build_date }}
This is an automated nightly build of EdgeTX firmware. These builds are for testing purposes and may contain bugs. Please be sure to report any issues you encounter!
### Installation
Download `${{ env.release_filename }}` and extract the firmware file for your radio model, or use [EdgeTX Buddy](https://buddy.edgetx.org/#/flash?version=nightly&source=releases&filters=includePrereleases) with the "Include pre-releases" Filter option enabled so you can select the "Nightly" version.
## Changes since last nightly build
${{ steps.changelog.outputs.content }}
---
**Full Diff:** https://github.com/${{ github.repository }}/compare/${{ env.old_nightly_sha }}...${{ github.sha }}
files: |
${{ env.release_filename }}
+214
View File
@@ -0,0 +1,214 @@
name: Create Release Draft
on:
workflow_dispatch:
inputs:
tag:
description: 'Tag to create release for'
required: true
type: string
permissions:
contents: write
jobs:
release:
name: Create draft release
runs-on: ubuntu-latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: Check out the repo
uses: actions/checkout@v6
with:
ref: ${{ inputs.tag }}
fetch-depth: 0
- name: Clean up any previous drafts for this version
run: |
TAG="${{ inputs.tag }}"
if gh release view "$TAG" --json isDraft --jq '.isDraft' 2>/dev/null | grep -q true; then
echo "Deleting existing draft release for tag: $TAG"
gh release delete "$TAG" --yes
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Extract version info
id: version
continue-on-error: false
run: |
VERSION="${{ inputs.tag }}"
echo "version=$VERSION" >> $GITHUB_OUTPUT
# Extract codename from CMakeLists.txt
if [ -f "CMakeLists.txt" ]; then
CODENAME=$(grep -oP 'set\(CODENAME\s+"\K[^"]+' CMakeLists.txt || echo "")
if [ -n "$CODENAME" ]; then
if [ "$CODENAME" = "dev" ]; then
echo "::error::CODENAME is set to 'dev' for a tagged release! Please update the CODENAME in CMakeLists.txt before creating a release."
exit 1
fi
echo "codename=$CODENAME" >> $GITHUB_OUTPUT
echo "has_codename=true" >> $GITHUB_OUTPUT
echo "Found codename: $CODENAME"
else
echo "has_codename=false" >> $GITHUB_OUTPUT
echo "No codename found"
fi
else
echo "has_codename=false" >> $GITHUB_OUTPUT
echo "CMakeLists.txt not found"
fi
- name: Install git-cliff
run: |
VERSION=$(wget -qO- https://api.github.com/repos/orhun/git-cliff/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | sed 's/^v//')
FILENAME="git-cliff-${VERSION}-x86_64-unknown-linux-gnu.tar.gz"
wget -O git-cliff.tar.gz "https://github.com/orhun/git-cliff/releases/download/v${VERSION}/${FILENAME}"
tar -xzvf git-cliff.tar.gz
mv git-cliff-${VERSION}/git-cliff /usr/local/bin/
- name: Generate Changelog and Contributors List
id: changelog
run: |
# Find the previous tag relative to the input tag
PREV_TAG=$(git describe --tags --abbrev=0 "${{ inputs.tag }}^" 2>/dev/null || echo "")
if [ -z "$PREV_TAG" ]; then
echo "No previous tag found. Generating full history for ${{ inputs.tag }}"
RANGE="${{ inputs.tag }}"
CONTRIB_RANGE="${{ inputs.tag }}"
else
echo "Found previous tag: $PREV_TAG"
RANGE="$PREV_TAG..${{ inputs.tag }}"
CONTRIB_RANGE="$RANGE"
fi
# Generate the changelog using the explicit range
git-cliff $RANGE --strip all --output CHANGELOG.md
# Get unique contributors from the same commit range
CONTRIBUTORS=$(git log --format='%aN' $CONTRIB_RANGE 2>/dev/null | sort -u | sed 's/^/- /' || echo "")
# Combine
CHANGELOG_CONTENT=$(cat CHANGELOG.md)
{
echo "changelog<<EOF"
echo "$CHANGELOG_CONTENT"
if [ -n "$CONTRIBUTORS" ]; then
echo ""
echo "## Thank you to the following contributors who made this release possible!"
echo "$CONTRIBUTORS"
fi
echo "EOF"
} >> $GITHUB_OUTPUT
- name: Download all release artifacts
run: |
TAG="${{ inputs.tag }}"
COMMIT_SHA=$(git rev-parse "${TAG}^{commit}")
echo "Tag $TAG points to commit: $COMMIT_SHA"
# Get the latest successful run ID for each unique workflow
WORKFLOW_RUNS=$(gh run list --commit "$COMMIT_SHA" --status success --json workflowName,databaseId,createdAt --jq 'group_by(.workflowName) | map(sort_by(.createdAt) | last) | .[].databaseId')
mkdir -p release-assets
for run_id in $WORKFLOW_RUNS; do
echo "Processing Run ID: $run_id"
gh run download "$run_id" --dir release-assets 2>/dev/null || true
done
cd release-assets
# Clean up: Delete any folders ending in "-logs" BEFORE we start zipping
echo "Cleaning up log artifacts..."
rm -rf *-logs/
# Package remaining folders into zips
for dir in */; do
# Ensure we are actually looking at a directory
[ -d "$dir" ] || continue
dir_name="${dir%/}"
echo "Processing folder: $dir_name"
# Check for existing zip inside (e.g. if firmware was already zipped)
INNER_ZIP=$(find "$dir" -maxdepth 1 -name "*.zip" | head -n 1)
if [ -n "$INNER_ZIP" ]; then
echo " Found existing zip, pulling it out..."
mv "$INNER_ZIP" "${dir_name}.zip"
else
echo " No zip found, creating ${dir_name}.zip..."
(cd "$dir" && zip -r "../${dir_name}.zip" .)
fi
# Remove the folder after zipping/moving
rm -rf "$dir"
done
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: List release assets
run: |
echo "Release assets to upload:"
ls -lh release-assets/*.zip
- name: Create draft release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ inputs.tag }}
draft: true
prerelease: ${{ contains(inputs.tag, '-rc') || contains(inputs.tag, '-beta') || contains(inputs.tag, '-alpha') }}
name: EdgeTX "${{ steps.version.outputs.codename }}" ${{ steps.version.outputs.version }}
body: |
We are pleased to offer EdgeTX "${{ steps.version.outputs.codename }}" ${{ steps.version.outputs.version }}.
${{ (contains(inputs.tag, '-rc') || contains(inputs.tag, '-beta') || contains(inputs.tag, '-alpha')) && '> [!WARNING]
> As this is a pre-release, it is virtually guaranteed there will still be some minor issues that need resolving before final release - some may be documented already under "known issues" section of these release notes or the associated tracking issue. During pre-releases, the matching SD card pack and voice pack versions to use are those marked/tagged ''Latest''.
>
> We **need** _your_ help in testing this release to ensure there are no major bugs or faults that will cause problems during flight. Please ensure you back up your model and radio settings before updating, fully bench-test your models after updating, and report any issues you encounter. It is only with your feedback and testing by you, our community (and the assistance provided by partner manufacturers) which will allow us to identify and squash both new and old bugs, and progress onto a stable release version!! We simply cannot do this without you! :hugs: :beers:' || '' }}
> [!WARNING]
> If you are using a STM32 F2 based radio, *stop right now*, this release is not for you! EdgeTX v2.11 is the last release series to support these radios. Check [this list](https://hackmd.io/@edgetx/B12oQyQKye) if you are unsure if this affects you. Because of this, EdgeTX v2.11 will continue to be supported alongside 2.12, 3.0, etc., with a focus on bug fixes.
> [!WARNING]
> Radios based on STM32H7 MCUs update differently to older radios. Do **not** use the "Flash via USB" option in EdgeTX Buddy with them (yet). To update radios such as the Flysky PA01 & ST16, Jumper T15 Pro, RM TX15 and RM TX16S MK3, please follow the instructions in the [EdgeTX Manual](https://manual.edgetx.org/installing-and-updating-edgetx/updating-your-stm32h7-radio).
> [!NOTE]
> For MacOS users, Companion is now only compiled for MacOS 12 and above. Stay with v2.10.5 or earlier if you need support for an older version of MacOS.
> [!NOTE]
> **Migration Information**
> - If you have an old OpenTX Companion (`.otx`) file you need to convert or open, you will need to use EdgeTX Companion v2.10 or earlier.
> - If you wish to upgrade from OpenTX 2.3 or EdgeTX 2.4/2.5, you must use either EdgeTX v2.8.x firmware or EdgeTX Companion v2.10.x.
>
> See the [EdgeTX Manual](https://manual.edgetx.org/installing-and-updating-edgetx) for more information.
## Changes
${{ steps.changelog.outputs.changelog }}
## Supported radios
The full list of supported radios and their support status can be viewed [here on the EdgeTX website](https://edgetx.org/supportedradios).
## Installation Guide
https://manual.edgetx.org/installing-and-updating-edgetx
## Flash firmware via Chrome based browser
https://buddy.edgetx.org/#/flash?version=${{ steps.version.outputs.version }}
## Language and Custom builds
[CloudBuild option in EdgeTX Buddy](https://buddy.edgetx.org/) will allow you build your own (supported) language firmware, with just a few clicks. Additionally, EdgeTX Companion also has some support for CloudBuild, and will automatically fetch firmware for a supported language when you use the "Update components" option. But you can also build your own firmware online [following this guide](https://github.com/EdgeTX/edgetx/wiki/Building-radio-firmware-in-a-web-browser-with-GitHub-CodeSpaces), request a specific build at TODO or ask on Discord for someone to build one for you.
## Known Limitations and Issues
${{ (contains(inputs.tag, '-rc') || contains(inputs.tag, '-beta') || contains(inputs.tag, '-alpha')) && '> [!WARNING]
- Please check TODO during the release candidate phase for any other release candidate-specific issues and status of fixes.' || '' }}
## UI/UX behavioral changes and/or new capabilities:
files: release-assets/*.zip
fail_on_unmatched_files: true
+50
View File
@@ -0,0 +1,50 @@
name: Sync from EdgeTX upstream
on:
schedule:
- cron: '0 2 * * 1' # Weekly on Monday at 2 AM UTC
workflow_dispatch: # Manual trigger option
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
token: ${{ secrets.SYNC_PAT }}
- name: Configure git
run: |
git config user.name "EdgeTX Sync Bot"
git config user.email "sync-bot@edgetx.org"
- name: Sync branches from upstream (hard reset)
env:
BRANCHES: "main 2.11" # Add/modify branches here as needed
run: |
git remote add upstream https://github.com/EdgeTX/edgetx.git
git fetch upstream
for branch in $BRANCHES; do
echo "=== Syncing branch: $branch ==="
# Check if upstream has this branch
if ! git ls-remote --heads upstream | grep -q "refs/heads/$branch"; then
echo "⚠️ Branch $branch does not exist in upstream, skipping..."
continue
fi
# Hard reset to upstream (creates exact copy with same SHA)
git checkout -B $branch upstream/$branch
# Force push to origin
git push origin $branch --force
echo "✓ Branch $branch synced (SHA: $(git rev-parse HEAD))"
done
echo ""
echo "=== Sync Complete ==="
echo "All specified branches are now exact copies of upstream"
+31
View File
@@ -0,0 +1,31 @@
---
name: Validate fw.json
on:
push:
branches:
- 'main'
- '[0-9]+.[0-9]+'
tags:
- v*
paths:
- 'fw.json'
pull_request:
branches:
- 'main'
- '[0-9]+.[0-9]+'
paths:
- 'fw.json'
workflow_dispatch:
jobs:
json-validate:
name: Validate fw.json file
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Validate fw.json syntax and schema
run: python3 tools/validate-json.py --syntax-only
- name: Validate fw.json alphabetical order
run: python3 tools/validate-json.py --order-only
+41
View File
@@ -0,0 +1,41 @@
name: Validate hw_defs
on:
push:
branches:
- 'main'
- '[0-9]+.[0-9]+'
paths:
- 'radio/util/hw_defs/**'
- 'radio/src/boards/hw_defs/**'
pull_request:
paths:
- 'radio/util/hw_defs/**'
- 'radio/src/boards/hw_defs/**'
workflow_dispatch:
jobs:
validate:
name: Validate hw_defs
runs-on: ubuntu-latest
defaults:
run:
working-directory: radio/util/hw_defs
steps:
- name: Check out the repo
uses: actions/checkout@v6
- name: Set up uv
uses: astral-sh/setup-uv@v7
- name: Install Python dependencies
working-directory: .
run: uv venv && uv pip install -r requirements.txt
- name: Check Python script syntax
run: uv run python3 -m py_compile *.py
- name: Validate JSON schemas
run: uv run python3 json_validator.py ../../src/boards/hw_defs
- name: Test template generation (all boards x all templates)
run: uv run python3 test_templates.py ../../src/boards/hw_defs