Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
1e83a37
feat(afhds3): iBUS2 support (#6914)
richardclli Aug 5, 2026
afce1ef
chore(v16): add support for more IMU hardware (#7482)
helloradiosky Jul 21, 2026
b130e37
chore(color): reduce busy wait time on LCD refresh (#7483)
philmoz Jul 21, 2026
8100bfd
fix(color): memory leak when creating a blank model (#7541)
philmoz Jul 23, 2026
da6ed73
chore(cpn): improve SDL2 bundling and add SDL3 support for macOS buil…
Tozapid Aug 12, 2026
2500062
fix(cpn): use JSON lookup for CFS (#7579)
pfeerick Jul 21, 2026
c5098db
chore(spiflash): improve the efficiency of "is block erased" detectio…
richardclli Aug 10, 2026
3b446a6
fix(bw128): startup animation for 'regular' leds (#7591)
3djc Aug 10, 2026
c9d16b2
fix(color): can not exit Ghost module config page with no module atta…
juricabi Aug 12, 2026
008026d
fix(tools): install locales and fix re-run issues in Ubuntu setup scr…
pfeerick Aug 10, 2026
c54aafb
fix(ghost): do not memcpy MSP frames into the module buffer (#7608)
juricabi Aug 12, 2026
1808503
fix(ghost): use a usable baudrate for the telemetry mirror (#7610)
juricabi Aug 16, 2026
fdb986c
fix(radio): addressable RGB LED signal left floating between frames (…
3djc Aug 16, 2026
1f0d6f6
fix(v14): restore correct RTC battery voltage reading (#7621)
helloradiosky Aug 10, 2026
8ef5f31
fix(telem): CRSF RSSI uses incorrect default units (#7622)
CapnBry Aug 20, 2026
f02b649
fix(color): theme preview showing error icon when there are no theme …
philmoz Aug 10, 2026
850002a
fix(v14): OLED brightness wraps above 235 (#7633)
pfeerick Aug 11, 2026
cd90ab4
feat(flysky): add build option to choose use SDIO or SPI flash if ava…
richardclli Aug 19, 2026
e71cb63
fix(tools): update check_translations to i18n structure, utf-8 termin…
ABHISHEK22415 Aug 11, 2026
f7a50d7
fix(tools): YAML generation leaking build options between targets (#7…
philmoz Aug 12, 2026
62debac
fix(color): spectrum analyser UI elements clipped (#7650)
philmoz Aug 16, 2026
a59d0a8
fix(cpn): tie macOS bundle to its own SDL copies, and verify it (#7653)
pfeerick Aug 16, 2026
d148051
fix(ci): restore build log artifact upload for Companion CI (#7654)
pfeerick Aug 16, 2026
640d356
fix(color): USB SD card mode may crash to emergency mode (#7657)
philmoz Aug 18, 2026
18152f3
fix(cpn): changing default model flags modified (#7659)
elecpower Aug 16, 2026
e031bcc
fix(simu): gracefully handle non-existent radio profile SD path (#7661)
elecpower Aug 18, 2026
fc7bd2e
fix(color): Outputs widget does not update after changing 'Extended L…
philmoz Aug 16, 2026
f74b644
chore(telem): unify antenna number with RSSI number for ELRS (#7667)
mha1 Aug 19, 2026
b37f779
fix(build): use the renamed STICK_DEAD_ZONE option on gx15 and t15pro
pfeerick Aug 20, 2026
f29c56d
fix(cpn): V12 missing from the STM32H7 board list
pfeerick Aug 21, 2026
331576c
chore(ci): update actions to their current major versions
pfeerick Aug 21, 2026
b8e72db
feat(radio): allow disabling USB charge while the radio is running (o…
pfeerick Aug 21, 2026
ab30180
fix(color): sign-compare warning
pfeerick Aug 23, 2026
cfb250e
fix(cli): drop dead spModuleInit/DeInit compiled on EXTERNAL_MODULE-o…
pfeerick Aug 23, 2026
9ebb9df
fix(keys): guard key-lock combo state behind KEYS_LOCK_KEY1/2
pfeerick Aug 23, 2026
ad05ce8
fix(lua): avoid always-true BLING_LED_STRIP_LENGTH comparison on blin…
pfeerick Aug 23, 2026
fd5b18e
fix(pa01): avoid always-true LED_CHARGING_START comparison in ledChar…
pfeerick Aug 23, 2026
50f8e3d
fix(dsmp): use MODULE_TYPE_LEMON_DSMP, not nonexistent MODULE_TYPE_DSMP
pfeerick Aug 23, 2026
a927b1d
fix(gx15): enable built in mic (#7703)
3djc Aug 24, 2026
0c70b8b
feat(radio): improve built in mic recording clarity and UI (#7704)
3djc Aug 24, 2026
8b21616
fix(color): HSV & RGB color edit bars do not scale correctly to 800x4…
philmoz Aug 25, 2026
fdd5b69
fix(color): manage models buttons incorrect after renaming or removin…
philmoz Aug 25, 2026
4e9a514
fix(color): number edit keyboard is not sized to suit display, cursor…
philmoz Aug 25, 2026
0845a44
fix(trainer): SBUS trainer context ownership (#7699)
raphaelcoeffic Aug 26, 2026
71f7dd5
feat(mic): add start/end trim, auto trim and clip last bit of noise w…
3djc Aug 26, 2026
42e546c
fix(color): in manage models, long press on selected model button cle…
philmoz Aug 25, 2026
564535f
chore: remove a build warning (#7710)
3djc Aug 26, 2026
2eb13b8
fix(color): modifying model labels may corrupt model yaml files (#7709)
philmoz Aug 26, 2026
56dba48
chore: bump version
pfeerick Aug 20, 2026
fbd4b7d
test: guard active model's screen/widget data against cross-model lab…
pfeerick Aug 26, 2026
fdbb2cd
fix(storage): correctness bugs in ModelMap::writeModelLabels (#7713)
pfeerick Aug 26, 2026
348433c
chore(color): use standard window lifecycle logic for the audio recor…
philmoz Aug 26, 2026
b9d1690
chore: bump version
pfeerick Aug 20, 2026
5ce49ec
fix(color): UI issues adding and removing labels (#7715)
philmoz Aug 27, 2026
505e75c
chore: bump version
pfeerick Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions .github/actions/build_companion/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
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: 'Upstream SDL2 version (Windows only)'
default: '2.32.8'
sdl3-version:
description: 'SDL3 version built from source for macOS'
default: '3.4.14'
sdl2-compat-version:
description: 'sdl2-compat version built from source for macOS'
default: '2.32.70'
macos-deployment-target:
description: 'Minimum macOS version the SDL libraries are built for'
default: '11.0'
setup-python:
description: >-
Let install-qt-action provision Python. Set false when the workflow has already
installed its own interpreter plus the build's Python packages, otherwise the
one install-qt-action selects shadows it and the codegen imports fail.
default: 'true'

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 }}
setup-python: ${{ inputs.setup-python }}
cache: true
cache-key-prefix: 'install-qt-action-${{ inputs.qt-arch }}'

# macOS builds SDL from source (see setup-sdl.sh) - cache it so only the first
# run per version pays for it
- name: Cache SDL build
if: runner.os == 'macOS'
uses: actions/cache@v6
with:
path: ${{ runner.temp }}/sdl
key: sdl-${{ runner.os }}-${{ inputs.sdl3-version }}-${{ inputs.sdl2-compat-version }}-${{ inputs.macos-deployment-target }}

- name: Setup SDL
if: runner.os != 'Linux'
shell: bash
env:
ACTION_PATH: ${{ github.action_path }}
SDL2_VERSION: ${{ inputs.sdl2-version }}
SDL3_VERSION: ${{ inputs.sdl3-version }}
SDL2_COMPAT_VERSION: ${{ inputs.sdl2-compat-version }}
MACOS_DEPLOYMENT_TARGET: ${{ inputs.macos-deployment-target }}
run: |
"${ACTION_PATH}/setup-sdl.sh"

- name: Setup MSVC
if: runner.os == 'Windows'
shell: pwsh
run: ${{ github.action_path }}/setup-msvc.ps1

- name: Install NSIS
if: runner.os == 'Windows'
uses: repolevedavaj/install-nsis@v1
with:
nsis-version: '3.11'

- 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
if: always()
run: echo "artifact_name=edgetx-cpn-${{ inputs.os }}-${GITHUB_REF##*/}" >> $GITHUB_ENV
shell: bash

- name: Collect build logs
if: always()
shell: bash
run: |
mkdir -p logs

if [ -d "build" ]; then
find build -name "*.log" -type f -exec cp {} logs/ \; 2>/dev/null || true
find build -name "CMakeOutput.log" -type f -exec cp {} logs/ \; 2>/dev/null || true
find build -name "CMakeError.log" -type f -exec cp {} logs/ \; 2>/dev/null || true
fi

- name: Archive production artifacts
uses: actions/upload-artifact@v7
with:
name: "${{ env.artifact_name }}"
path: ${{github.workspace}}/output
retention-days: 15

- name: Archive build logs
if: always()
uses: actions/upload-artifact@v7
with:
name: "${{ env.artifact_name }}-logs"
path: ${{github.workspace}}/logs
retention-days: 30
if-no-files-found: ignore
39 changes: 39 additions & 0 deletions .github/actions/build_companion/setup-msvc.ps1
Original file line number Diff line number Diff line change
@@ -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"
108 changes: 108 additions & 0 deletions .github/actions/build_companion/setup-sdl.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#!/usr/bin/env bash
# setup-sdl.sh
# Provisions SDL for Companion builds.
#
# Windows: upstream SDL2 MSVC development binaries.
# macOS: sdl2-compat + SDL3 built from source.
# Linux: provided by the Docker container.
#
# macOS builds against sdl2-compat rather than classic SDL2 because that is what users get
# from Homebrew, and it is the configuration that exposed the SDL3 bundling bug - CI needs to
# exercise the same code path Companion ships through.
#
# Homebrew itself cannot be used here: its bottles are single-architecture and target the
# runner's macOS version, while Companion ships a universal binary for macOS 11.0+. Building
# from source is what keeps both properties.

set -euo pipefail

SDL2_VERSION="${SDL2_VERSION:?SDL2_VERSION must be set}"

build_cmake_project() {
local name="$1" url="$2" srcdir="$3"
shift 3

echo "Building ${name} (universal, macOS ${MACOS_DEPLOYMENT_TARGET}+)..."
curl -fsSL -o "${RUNNER_TEMP}/${name}.tar.gz" "${url}"
mkdir -p "${RUNNER_TEMP}/src"
tar -xzf "${RUNNER_TEMP}/${name}.tar.gz" -C "${RUNNER_TEMP}/src"

cmake -S "${RUNNER_TEMP}/src/${srcdir}" -B "${RUNNER_TEMP}/build-${name}" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" \
-DCMAKE_OSX_DEPLOYMENT_TARGET="${MACOS_DEPLOYMENT_TARGET}" \
-DCMAKE_INSTALL_PREFIX="${SDL_ROOT}" \
-DCMAKE_PREFIX_PATH="${SDL_ROOT}" \
"$@"
cmake --build "${RUNNER_TEMP}/build-${name}" --parallel
cmake --install "${RUNNER_TEMP}/build-${name}"
}

case "$RUNNER_OS" in
Windows)
ARCHIVE="SDL2-devel-${SDL2_VERSION}-VC.zip"
URL="https://github.com/libsdl-org/SDL/releases/download/release-${SDL2_VERSION}/${ARCHIVE}"
DEST="${RUNNER_TEMP}/SDL2"

echo "Downloading SDL2 ${SDL2_VERSION} (Windows/MSVC)..."
curl -fsSL -o "${RUNNER_TEMP}/${ARCHIVE}" "${URL}"
unzip -q "${RUNNER_TEMP}/${ARCHIVE}" -d "${DEST}"

SDL2_ROOT="${DEST}/SDL2-${SDL2_VERSION}"
echo "SDL2_ROOT=${SDL2_ROOT}" >> "${GITHUB_ENV}"
;;

macOS)
SDL3_VERSION="${SDL3_VERSION:?SDL3_VERSION must be set}"
SDL2_COMPAT_VERSION="${SDL2_COMPAT_VERSION:?SDL2_COMPAT_VERSION must be set}"
MACOS_DEPLOYMENT_TARGET="${MACOS_DEPLOYMENT_TARGET:-11.0}"
SDL_ROOT="${RUNNER_TEMP}/sdl"
STAMP="${SDL_ROOT}/.stamp-${SDL3_VERSION}-${SDL2_COMPAT_VERSION}-${MACOS_DEPLOYMENT_TARGET}"

if [[ -f "${STAMP}" ]]; then
echo "Reusing cached SDL build in ${SDL_ROOT}"
else
rm -rf "${SDL_ROOT}"

# SDL3 first - sdl2-compat needs its headers and CMake package to configure
build_cmake_project "SDL3" \
"https://github.com/libsdl-org/SDL/releases/download/release-${SDL3_VERSION}/SDL3-${SDL3_VERSION}.tar.gz" \
"SDL3-${SDL3_VERSION}" \
-DSDL_SHARED=ON -DSDL_STATIC=OFF -DSDL_TESTS=OFF -DSDL_EXAMPLES=OFF

build_cmake_project "sdl2-compat" \
"https://github.com/libsdl-org/sdl2-compat/releases/download/release-${SDL2_COMPAT_VERSION}/sdl2-compat-${SDL2_COMPAT_VERSION}.tar.gz" \
"sdl2-compat-${SDL2_COMPAT_VERSION}" \
-DSDL2COMPAT_STATIC=OFF -DSDL2COMPAT_TESTS=OFF

touch "${STAMP}"
fi

# Both live under one prefix, so a single entry on CMAKE_PREFIX_PATH finds
# SDL2 (sdl2-compat) and SDL3 alike.
echo "SDL2_ROOT=${SDL_ROOT}" >> "${GITHUB_ENV}"

echo "Verifying universal slices and deployment target..."
for lib in "${SDL_ROOT}"/lib/libSDL2-2.0.0.dylib "${SDL_ROOT}"/lib/libSDL3.0.dylib; do
[[ -f "${lib}" ]] || { echo "::error::Expected ${lib} to exist"; exit 1; }
archs="$(lipo -archs "${lib}")"
case "${archs}" in
*x86_64*arm64*|*arm64*x86_64*) ;;
*) echo "::error::${lib} is not universal (got: ${archs})"; exit 1 ;;
esac
echo " $(basename "${lib}"): ${archs}"
vtool -show-build "${lib}" | grep -E 'minos|platform' || true
done
;;

Linux)
echo "Skipping — SDL is provided by the Docker container"
;;

*)
echo "::error::Unsupported RUNNER_OS: ${RUNNER_OS}"
exit 1
;;
esac

echo "SDL setup complete for ${RUNNER_OS}"
2 changes: 1 addition & 1 deletion .github/workflows/auto_close.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
- uses: actions/stale@v11
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.'
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/build_fw.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,12 @@ jobs:
- pa01
- t22
container:
image: ghcr.io/edgetx/edgetx-dev:latest
image: ghcr.io/edgetx/edgetx-dev:2.12
volumes:
- ${{ github.workspace }}:/src
steps:
- name: Check out the repo
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
submodules: recursive
# fetch-depth: 0 # https://github.com/actions/checkout#Fetch-all-history-for-all-tags-and-branches
Expand Down Expand Up @@ -114,12 +114,12 @@ jobs:
- t22
- c14
container:
image: ghcr.io/edgetx/edgetx-dev:latest
image: ghcr.io/edgetx/edgetx-dev:2.12
volumes:
- ${{ github.workspace }}:/src
steps:
- name: Check out the repo
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
submodules: recursive

Expand Down Expand Up @@ -153,7 +153,7 @@ jobs:
run: echo "artifact_name=edgetx-firmware-${GITHUB_REF##*/}" >> $GITHUB_ENV

- name: Merge firmware artifact packages
uses: actions/upload-artifact/merge@v4
uses: actions/upload-artifact/merge@v7
with:
name: "${{ env.artifact_name }}"
pattern: firmware-*
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/companion.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ on:
- '.github/workflows/linux_cpn.yml'
- '.github/workflows/macosx_cpn.yml'
- '.github/workflows/win_cpn-64.yml'
- '.github/actions/build_companion/**'
- 'companion/**'
- 'tools/build-companion.sh'

Expand Down
Loading
Loading