Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
329709e
Initial implementation of Tonex One Plus support. Needs more testing.
Jul 29, 2026
95e80f0
Added Tuner display for the One Plus.
Jul 30, 2026
39d6aaf
Added One Plus tuner screen for 3.5" display variants.
Jul 30, 2026
9ddc5fd
- Added note display to One Plus tuner screen
Jul 31, 2026
a9e7772
Fixed various One Plus issues with preset sync, param sync etc.
Aug 1, 2026
37f27fb
- updated Components to latest versions
Aug 2, 2026
c8dd8c4
Fixed use-after-free issue in the message box. Thanks to user "ft972"…
Aug 2, 2026
113638f
- updates for compatiblity with ESP-IDF V6.
Aug 2, 2026
2e2977e
- dropped USB host component version to be compatible with ESP-IDF 5.5.1
Aug 2, 2026
36bf57d
- Further updating of files for ESP-IDF6 compatibility (maintaining V…
Aug 2, 2026
fe6672f
Merge branch 'OnePlusDev' of https://github.com/Builty/TonexOneContro…
Aug 2, 2026
438dff3
- added AXS15231 data sheet
Aug 3, 2026
58de902
- updated Waveshare 3.5B platform doc to note issues with touch combi…
Aug 3, 2026
0e0ec54
- set WiFi to do a full channel scan, so it can find the best AP and …
Aug 5, 2026
4e2b928
Fixed a couple of minor bugs, reported by user "ft972" (who I suspect…
Aug 13, 2026
7e0949f
-Fixed issue where pressing green tick during user text edit would no…
Aug 15, 2026
0175f19
-new method of handling parameter sliders, that updates changes after…
Aug 15, 2026
6fb04ab
-Moved to new CmakePresets for project config
Aug 15, 2026
aa174f4
-Added Direct Monitor switch to LCD and Web UI. No longer forced in s…
Aug 15, 2026
39231e1
Experimental: Added USB product ID for Tonex Plug. Thanks to user byt…
Aug 19, 2026
f3673c0
Added experimental support for the Tonex Plug. Some info provided by …
Aug 22, 2026
685f412
- Created batch build tool
Aug 23, 2026
42bd790
Merge branch 'main' into OnePlusDev
Builty Aug 23, 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/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ jobs:
uses: espressif/esp-idf-ci-action@v1
with:
path: 'source'
esp_idf_version: v5.5.1 # optional, default is latest
esp_idf_version: v6.0.2 # optional, default is latest
target: esp32s3 # optional, default is esp32
extra_docker_args: "-v ./.ccache:/root/.ccache -e CCACHE_DIR=/root/.ccache -e SDKCONFIG_DEFAULTS"
command: "idf.py build"
Expand Down
4 changes: 4 additions & 0 deletions HardwarePlatform_Waveshare3.5B.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ For the Waveshare 3.5B, a maximum of 4 footswitches are supported.<br>
## Wired Footswitches (external) <a name="footswitches_ext"></a>
Starting from firmware version 1.0.8.2, with the use of an additional PCB, up to 16 footswitches can be connected.<br>
The footswitch must be a "momentary" type that is only has its contacts closed when it is pressed.
<br>**Caution:** the touch controller chip used on this board experiences issues when used in conjunction with the SX1509.
It can tend to report that a finger has been lifted when it hasn't, affecting long-pressing and dragging of sliders.
<br>
At the time of writing (August 2026) no solution has been found. If you want the SX1509, consider using a different platform. Sorry.
<br><br>
The additional PCB must use the "SX1509" chip. The recommeded one is the Sparkfun SX1509 breakout board:
https://www.sparkfun.com/sparkfun-16-output-i-o-expander-breakout-sx1509.html
Expand Down
143 changes: 143 additions & 0 deletions build_distrib/batch_build.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
#!/usr/bin/env python3
"""
batch_build.py – Batch build ESP-IDF variants with proper EIM activation (Windows)
"""

import argparse
import json
import os
import platform
import subprocess
import sys
from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path

def find_eim_profile() -> Path | None:
candidates = [
Path(r"C:\Espressif\tools\Microsoft.v6.0.2.PowerShell_profile.ps1"),
Path(r"C:\Espressif\tools\Microsoft.PowerShell_profile.ps1"),
Path.home() / "Espressif" / "tools" / "Microsoft.v6.0.2.PowerShell_profile.ps1",
]
for p in candidates:
if p.exists():
return p
return None

def run_command(cmd: list[str], project_dir: Path, eim_profile: Path | None, dry_run: bool) -> bool:
"""Run one idf.py command, optionally inside EIM-activated PowerShell."""

if eim_profile and platform.system() == "Windows":
# Build a single PowerShell script block
# This is the most reliable way
ps_script = f"""
$ErrorActionPreference = 'Stop'
. '{eim_profile}'
Set-Location -LiteralPath '{project_dir}'
Write-Host "=== PATH (first 300 chars) ==="
Write-Host ($env:PATH.Substring(0, [Math]::Min(300, $env:PATH.Length)))
Write-Host "=== Running: {' '.join(cmd)} ==="
& {' '.join(f'"{c}"' if ' ' in c else c for c in cmd)}
if ($LASTEXITCODE -ne 0) {{ exit $LASTEXITCODE }}
"""

full_cmd = [
"powershell.exe",
"-NoProfile",
"-ExecutionPolicy", "Bypass",
"-Command",
ps_script
]
print(f" → (EIM) {' '.join(cmd)}")
else:
full_cmd = cmd
print(f" → {' '.join(cmd)}")

if dry_run:
return True

# IMPORTANT: do NOT capture_output so you can see real errors
result = subprocess.run(full_cmd, cwd=None if eim_profile else project_dir)
return result.returncode == 0

def load_presets(presets_file: Path):
with open(presets_file, encoding="utf-8") as f:
return json.load(f).get("configurePresets", [])

def build_one(name: str, project_dir: Path, extra: list[str],
do_clean: bool, eim_profile: Path | None, dry_run: bool):
print(f"\n>>> Preset: {name}")

if do_clean:
print(" Cleaning...")
if not run_command(["idf.py", "--preset", name, "fullclean"],
project_dir, eim_profile, dry_run):
return name, False, "clean failed"

print(" Building...")
ok = run_command(["idf.py", "--preset", name, "build"] + extra,
project_dir, eim_profile, dry_run)
return name, ok, "OK" if ok else "FAILED"

def main():
parser = argparse.ArgumentParser()
parser.add_argument("-p", "--project", default=".")
parser.add_argument("--presets", default="CMakePresets.json")
parser.add_argument("--only", nargs="+")
parser.add_argument("--exclude", nargs="+")
parser.add_argument("-c", "--clean", action="store_true")
parser.add_argument("-j", "--jobs", type=int, default=1)
parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--eim-profile")
parser.add_argument("--no-eim", action="store_true")
parser.add_argument("extra", nargs=argparse.REMAINDER)
args = parser.parse_args()

project_dir = Path(args.project).resolve()
presets_file = project_dir / args.presets

if not presets_file.exists():
print(f"Error: {presets_file} not found")
sys.exit(1)

eim_profile = None
if not args.no_eim and platform.system() == "Windows":
eim_profile = Path(args.eim_profile) if args.eim_profile else find_eim_profile()
if eim_profile and eim_profile.exists():
print(f"Using EIM profile: {eim_profile}")
else:
print("No EIM profile found → using current environment")
eim_profile = None

if eim_profile is None and "IDF_PATH" not in os.environ:
print("Error: IDF_PATH not set and no EIM profile available.")
sys.exit(1)

presets = load_presets(presets_file)
names = [p["name"] for p in presets]
if args.only:
names = [n for n in names if n in args.only]
if args.exclude:
names = [n for n in names if n not in args.exclude]

print(f"\nWill process: {names}")
print(f"Clean first : {args.clean}")

results = []
for name in names: # sequential is safer while debugging
results.append(build_one(name, project_dir, args.extra,
args.clean, eim_profile, args.dry_run))

print("\n" + "="*50)
failed = 0
for name, ok, msg in results:
print(f" {'✓' if ok else '✗'} {name}: {msg}")
if not ok:
failed += 1

if failed:
print(f"\n{failed} failed.")
sys.exit(1)
print("\nAll done.")

if __name__ == "__main__":
main()
4 changes: 4 additions & 0 deletions build_distrib/build.bat
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
rem build all variants
python .\batch_build.py -p ../source

rem build installers and Polar artifacts
python .\build_distrib.py
pause
2 changes: 1 addition & 1 deletion build_distrib/build_distrib.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
dirname = Path.cwd()

# set version
version = '2.0.4.2'
version = '2.5.0.2_beta_1'

def generate_manifest(merged_path, merged_filename, chip_family, build_name, use_skins):
manifest = {
Expand Down
Binary file added datasheets/AXS15231B_Datasheet_V0.5_20230306.pdf
Binary file not shown.
Loading
Loading