diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e923ad7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,167 @@
+
+questions/*
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+# in version control.
+# https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+venv_lin/*
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+config.ini
+logs/*
+..env.swp
diff --git a/alpine.Dockerfile b/alpine.Dockerfile
index b3b3841..bdee57d 100644
--- a/alpine.Dockerfile
+++ b/alpine.Dockerfile
@@ -28,7 +28,7 @@ RUN bash ./bin/build-native.sh "$PIO_ENV" && \
# ##### PRODUCTION BUILD #############
-FROM alpine:3.23
+FROM alpine:3.22
LABEL org.opencontainers.image.title="Meshtastic" \
org.opencontainers.image.description="Alpine Meshtastic daemon" \
org.opencontainers.image.url="https://meshtastic.org" \
diff --git a/bin/build-esp32.sh b/bin/build-esp32.sh
index 8c684aa..92836db 100755
--- a/bin/build-esp32.sh
+++ b/bin/build-esp32.sh
@@ -5,8 +5,7 @@ set -e
VERSION=`bin/buildinfo.py long`
SHORT_VERSION=`bin/buildinfo.py short`
-BUILDDIR=.pio/build/$1
-OUTDIR=release
+OUTDIR=release/
rm -f $OUTDIR/firmware*
rm -r $OUTDIR/* || true
@@ -15,7 +14,7 @@ rm -r $OUTDIR/* || true
platformio pkg install -e $1
echo "Building for $1 with $PLATFORMIO_BUILD_FLAGS"
-rm -f $BUILDDIR/firmware*
+rm -f .pio/build/$1/firmware.*
# The shell vars the build tool expects to find
export APP_VERSION=$VERSION
@@ -23,14 +22,16 @@ export APP_VERSION=$VERSION
basename=firmware-$1-$VERSION
pio run --environment $1 # -v
-
-cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf
+SRCELF=.pio/build/$1/firmware.elf
+cp $SRCELF $OUTDIR/$basename.elf
echo "Copying ESP32 bin file"
-cp $BUILDDIR/$basename.factory.bin $OUTDIR/$basename.factory.bin
+SRCBIN=.pio/build/$1/firmware.factory.bin
+cp $SRCBIN $OUTDIR/$basename.bin
echo "Copying ESP32 update bin file"
-cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin
+SRCBIN=.pio/build/$1/firmware.bin
+cp $SRCBIN $OUTDIR/$basename-update.bin
echo "Building Filesystem for ESP32 targets"
# If you want to build the webui, uncomment the following lines
@@ -39,13 +40,7 @@ echo "Building Filesystem for ESP32 targets"
# # Remove webserver files from the filesystem and rebuild
# ls -l data/static # Diagnostic list of files
# rm -rf data/static
-pio run --environment $1 -t buildfs --disable-auto-clean
-cp $BUILDDIR/littlefs-$1-$VERSION.bin $OUTDIR/littlefs-$1-$VERSION.bin
-cp bin/device-install.* $OUTDIR/
-cp bin/device-update.* $OUTDIR/
-
-# Generate the manifest file
-echo "Generating Meshtastic manifest"
-TIMEFORMAT="Generated manifest in %E seconds"
-time pio run --environment $1 -t mtjson --silent --disable-auto-clean
-cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
+pio run --environment $1 -t buildfs
+cp .pio/build/$1/littlefs.bin $OUTDIR/littlefs-$1-$VERSION.bin
+cp bin/device-install.* $OUTDIR
+cp bin/device-update.* $OUTDIR
\ No newline at end of file
diff --git a/bin/build-native.sh b/bin/build-native.sh
index f35e46a..fff86e8 100755
--- a/bin/build-native.sh
+++ b/bin/build-native.sh
@@ -17,19 +17,15 @@ VERSION=$(bin/buildinfo.py long)
SHORT_VERSION=$(bin/buildinfo.py short)
PIO_ENV=${1:-native}
-BUILDDIR=.pio/build/$PIO_ENV
-OUTDIR=release
+OUTDIR=release/
-rm -f $OUTDIR/meshtasticd*
+rm -f $OUTDIR/firmware*
mkdir -p $OUTDIR/
rm -r $OUTDIR/* || true
-basename=meshtasticd-$1-$VERSION
-
# Important to pull latest version of libs into all device flavors, otherwise some devices might be stale
pio pkg install --environment "$PIO_ENV" || platformioFailed
pio run --environment "$PIO_ENV" || platformioFailed
-
-cp "$BUILDDIR/meshtasticd" "$OUTDIR/meshtasticd_linux_$(uname -m)"
-cp bin/native-install.* $OUTDIR/
+cp ".pio/build/$PIO_ENV/program" "$OUTDIR/meshtasticd_linux_$(uname -m)"
+cp bin/native-install.* $OUTDIR
diff --git a/bin/build-nrf52.sh b/bin/build-nrf52.sh
index c605fb1..deca209 100755
--- a/bin/build-nrf52.sh
+++ b/bin/build-nrf52.sh
@@ -5,8 +5,7 @@ set -e
VERSION=$(bin/buildinfo.py long)
SHORT_VERSION=$(bin/buildinfo.py short)
-BUILDDIR=.pio/build/$1
-OUTDIR=release
+OUTDIR=release/
rm -f $OUTDIR/firmware*
rm -r $OUTDIR/* || true
@@ -15,7 +14,7 @@ rm -r $OUTDIR/* || true
platformio pkg install -e $1
echo "Building for $1 with $PLATFORMIO_BUILD_FLAGS"
-rm -f $BUILDDIR/firmware*
+rm -f .pio/build/$1/firmware.*
# The shell vars the build tool expects to find
export APP_VERSION=$VERSION
@@ -23,32 +22,32 @@ export APP_VERSION=$VERSION
basename=firmware-$1-$VERSION
pio run --environment $1 # -v
+SRCELF=.pio/build/$1/firmware.elf
+cp $SRCELF $OUTDIR/$basename.elf
-cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf
+echo "Generating NRF52 dfu file"
+DFUPKG=.pio/build/$1/firmware.zip
+cp $DFUPKG $OUTDIR/$basename-ota.zip
-echo "Copying NRF52 dfu (OTA) file"
-cp $BUILDDIR/$basename.zip $OUTDIR/$basename.zip
+echo "Generating NRF52 uf2 file"
+SRCHEX=.pio/build/$1/firmware.hex
-echo "Copying NRF52 UF2 file"
-cp $BUILDDIR/$basename.uf2 $OUTDIR/$basename.uf2
-cp bin/*.uf2 $OUTDIR/
-
-SRCHEX=$BUILDDIR/$basename.hex
-
-# if WM1110 target, copy the merged.hex
+# if WM1110 target, merge hex with softdevice 7.3.0
if (echo $1 | grep -q "wio-sdk-wm1110"); then
- echo "Copying .merged.hex file"
- SRCHEX=$BUILDDIR/$basename.merged.hex
- cp $SRCHEX $OUTDIR/
+ echo "Merging with softdevice"
+ bin/mergehex -m bin/s140_nrf52_7.3.0_softdevice.hex $SRCHEX -o .pio/build/$1/$basename.hex
+ SRCHEX=.pio/build/$1/$basename.hex
+ bin/uf2conv.py $SRCHEX -c -o $OUTDIR/$basename.uf2 -f 0xADA52840
+ cp $SRCHEX $OUTDIR
+ cp bin/*.uf2 $OUTDIR
+else
+ bin/uf2conv.py $SRCHEX -c -o $OUTDIR/$basename.uf2 -f 0xADA52840
+ cp bin/device-install.* $OUTDIR
+ cp bin/device-update.* $OUTDIR
+ cp bin/*.uf2 $OUTDIR
fi
if (echo $1 | grep -q "rak4631"); then
- echo "Copying .hex file"
- cp $SRCHEX $OUTDIR/
-fi
-
-# Generate the manifest file
-echo "Generating Meshtastic manifest"
-TIMEFORMAT="Generated manifest in %E seconds"
-time pio run --environment $1 -t mtjson --silent --disable-auto-clean
-cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
+ echo "Copying hex file"
+ cp .pio/build/$1/firmware.hex $OUTDIR/$basename.hex
+fi
\ No newline at end of file
diff --git a/bin/build-rp2xx0.sh b/bin/build-rp2xx0.sh
index ae26fdf..cb48659 100755
--- a/bin/build-rp2xx0.sh
+++ b/bin/build-rp2xx0.sh
@@ -5,8 +5,7 @@ set -e
VERSION=`bin/buildinfo.py long`
SHORT_VERSION=`bin/buildinfo.py short`
-BUILDDIR=.pio/build/$1
-OUTDIR=release
+OUTDIR=release/
rm -f $OUTDIR/firmware*
rm -r $OUTDIR/* || true
@@ -15,7 +14,7 @@ rm -r $OUTDIR/* || true
platformio pkg install -e $1
echo "Building for $1 with $PLATFORMIO_BUILD_FLAGS"
-rm -f $BUILDDIR/firmware*
+rm -f .pio/build/$1/firmware.*
# The shell vars the build tool expects to find
export APP_VERSION=$VERSION
@@ -23,14 +22,12 @@ export APP_VERSION=$VERSION
basename=firmware-$1-$VERSION
pio run --environment $1 # -v
-
-cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf
+SRCELF=.pio/build/$1/firmware.elf
+cp $SRCELF $OUTDIR/$basename.elf
echo "Copying uf2 file"
-cp $BUILDDIR/$basename.uf2 $OUTDIR/$basename.uf2
+SRCBIN=.pio/build/$1/firmware.uf2
+cp $SRCBIN $OUTDIR/$basename.uf2
-# Generate the manifest file
-echo "Generating Meshtastic manifest"
-TIMEFORMAT="Generated manifest in %E seconds"
-time pio run --environment $1 -t mtjson --silent --disable-auto-clean
-cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
+cp bin/device-install.* $OUTDIR
+cp bin/device-update.* $OUTDIR
diff --git a/bin/build-stm32wl.sh b/bin/build-stm32wl.sh
index b85da04..f62df48 100755
--- a/bin/build-stm32wl.sh
+++ b/bin/build-stm32wl.sh
@@ -5,8 +5,7 @@ set -e
VERSION=$(bin/buildinfo.py long)
SHORT_VERSION=$(bin/buildinfo.py short)
-BUILDDIR=.pio/build/$1
-OUTDIR=release
+OUTDIR=release/
rm -f $OUTDIR/firmware*
rm -r $OUTDIR/* || true
@@ -15,7 +14,7 @@ rm -r $OUTDIR/* || true
platformio pkg install -e $1
echo "Building for $1 with $PLATFORMIO_BUILD_FLAGS"
-rm -f $BUILDDIR/firmware*
+rm -f .pio/build/$1/firmware.*
# The shell vars the build tool expects to find
export APP_VERSION=$VERSION
@@ -23,14 +22,8 @@ export APP_VERSION=$VERSION
basename=firmware-$1-$VERSION
pio run --environment $1 # -v
+SRCELF=.pio/build/$1/firmware.elf
+cp $SRCELF $OUTDIR/$basename.elf
-cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf
-
-echo "Copying STM32 bin file"
-cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin
-
-# Generate the manifest file
-echo "Generating Meshtastic manifest"
-TIMEFORMAT="Generated manifest in %E seconds"
-time pio run --environment $1 -t mtjson --silent --disable-auto-clean
-cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
+SRCBIN=.pio/build/$1/firmware.bin
+cp $SRCBIN $OUTDIR/$basename.bin
diff --git a/bin/device-install.bat b/bin/device-install.bat
index 68ded36..9e3634a 100755
--- a/bin/device-install.bat
+++ b/bin/device-install.bat
@@ -5,14 +5,22 @@ TITLE Meshtastic device-install
SET "SCRIPT_NAME=%~nx0"
SET "DEBUG=0"
SET "PYTHON="
+SET "TFT_BUILD=0"
+SET "BIGDB8=0"
+SET "MUIDB8=0"
+SET "BIGDB16=0"
SET "ESPTOOL_BAUD=115200"
SET "ESPTOOL_CMD="
SET "LOGCOUNTER=0"
SET "BPS_RESET=0"
-@REM Default offsets.
-@REM https://github.com/meshtastic/web-flasher/blob/main/stores/firmwareStore.ts#L202
-SET "OTA_OFFSET=0x260000"
-SET "SPIFFS_OFFSET=0x300000"
+
+@REM FIXME: Determine mcu from PlatformIO variant, this is unmaintainable.
+SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv heltec-v4"
+SET "C3=esp32c3"
+@REM FIXME: Determine flash size from PlatformIO variant, this is unmaintainable.
+SET "BIGDB_8MB=crowpanel-esp32s3 heltec_capsule_sensor_v3 heltec-v3 heltec-vision-master-e213 heltec-vision-master-e290 heltec-vision-master-t190 heltec-wireless-paper heltec-wireless-tracker heltec-wsl-v3 icarus seeed-xiao-s3 tbeam-s3-core tracksenger"
+SET "MUIDB_8MB=picomputer-s3 unphone seeed-sensecap-indicator"
+SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv heltec-v4"
GOTO getopts
:help
@@ -21,7 +29,7 @@ ECHO.
ECHO Usage: %SCRIPT_NAME% -f filename [-p PORT] [-P python] [--1200bps-reset]
ECHO.
ECHO Options:
-ECHO -f filename The firmware .factory.bin file to flash. Custom to your device type and region. (required)
+ECHO -f filename The firmware .bin file to flash. Custom to your device type and region. (required)
ECHO The file must be located in this current directory.
ECHO -p PORT Set the environment variable for ESPTOOL_PORT.
ECHO If not set, ESPTOOL iterates all ports (Dangerous).
@@ -32,12 +40,12 @@ ECHO --1200bps-reset Attempt to place the device in correct mode. (1200bps
ECHO Some hardware requires this twice.
ECHO.
ECHO Example: %SCRIPT_NAME% -p COM17 --1200bps-reset
-ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4.factory.bin -p COM11
-ECHO Example: %SCRIPT_NAME% -f firmware-unphone-2.6.0.0b106d4.factory.bin -p COM11
+ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4.bin -p COM11
+ECHO Example: %SCRIPT_NAME% -f firmware-unphone-2.6.0.0b106d4.bin -p COM11
GOTO eof
:version
-ECHO %SCRIPT_NAME% [Version 2.7.0]
+ECHO %SCRIPT_NAME% [Version 2.6.2]
ECHO Meshtastic
GOTO eof
@@ -70,8 +78,8 @@ IF "__!FILENAME!__"=="____" (
CALL :LOG_MESSAGE ERROR "Filename containing spaces are not supported."
GOTO help
)
- IF NOT "__!FILENAME:.factory.bin=!__"=="__!FILENAME!__" (
- CALL :LOG_MESSAGE ERROR "Filename must be a firmware-*.factory.bin file."
+ IF "__!FILENAME:firmware-=!__"=="__!FILENAME!__" (
+ CALL :LOG_MESSAGE ERROR "Filename must be a firmware-* file."
GOTO help
)
@REM Remove ".\" or "./" file prefix if present.
@@ -85,26 +93,12 @@ IF NOT EXIST !FILENAME! (
GOTO eof
)
-CALL :LOG_MESSAGE DEBUG "Checking for metadata..."
-@REM Derive metadata filename from firmware filename.
-SET "METAFILE=!FILENAME:.factory.bin=!.mt.json"
-IF EXIST !METAFILE! (
- @REM Print parsed json with powershell
- CALL :LOG_MESSAGE INFO "Firmware metadata: !METAFILE!"
- powershell -NoProfile -Command "(Get-Content '!METAFILE!' | ConvertFrom-Json | Out-String).Trim()"
-
- @REM Save metadata values to variables for later use.
- FOR /f "usebackq" %%A IN (`powershell -NoProfile -Command ^
- "(Get-Content '!METAFILE!' | ConvertFrom-Json).mcu"`) DO SET "MCU=%%A"
- FOR /f "usebackq" %%A IN (`powershell -NoProfile -Command ^
- "(Get-Content '!METAFILE!' | ConvertFrom-Json).part | Where-Object { $_.subtype -eq 'ota_1' } | Select-Object -ExpandProperty offset"`
- ) DO SET "OTA_OFFSET=%%A"
- FOR /f "usebackq" %%A IN (`powershell -NoProfile -Command ^
- "(Get-Content '!METAFILE!' | ConvertFrom-Json).part | Where-Object { $_.subtype -eq 'spiffs' } | Select-Object -ExpandProperty offset"`
- ) DO SET "SPIFFS_OFFSET=%%A"
-) ELSE (
- CALL :LOG_MESSAGE ERROR "No metadata file found: !METAFILE!"
+IF NOT "!FILENAME:update=!"=="!FILENAME!" (
+ CALL :LOG_MESSAGE DEBUG "We are working with a *update* file. !FILENAME!"
+ CALL :LOG_MESSAGE INFO "Use script device-update.bat to flash update !FILENAME!."
GOTO eof
+) ELSE (
+ CALL :LOG_MESSAGE DEBUG "We are NOT working with a *update* file. !FILENAME!"
)
:skip-filename
@@ -114,7 +108,7 @@ IF NOT "__%PYTHON%__"=="____" (
SET "ESPTOOL_CMD=!PYTHON! -m esptool"
CALL :LOG_MESSAGE DEBUG "Python interpreter supplied."
) ELSE (
- CALL :LOG_MESSAGE DEBUG "Python interpreter NOT supplied. Looking for esptool..."
+ CALL :LOG_MESSAGE DEBUG "Python interpreter NOT supplied. Looking for esptool...
WHERE esptool >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
@REM WHERE exits with code 0 if esptool is found.
@@ -152,26 +146,100 @@ IF %BPS_RESET% EQU 1 (
GOTO eof
)
-@REM Extract PROGNAME from %FILENAME% for later use.
-SET "PROGNAME=!FILENAME:.factory.bin=!"
-CALL :LOG_MESSAGE DEBUG "Computed PROGNAME: !PROGNAME!"
-
-IF "__!MCU!__" == "__esp32s3__" (
- @REM We are working with ESP32-S3
- SET "OTA_FILENAME=bleota-s3.bin"
-) ELSE IF "__!MCU!__" == "__esp32c3__" (
- @REM We are working with ESP32-C3
- SET "OTA_FILENAME=bleota-c3.bin"
+@REM Check if FILENAME contains "-tft-" and set target partitionScheme accordingly.
+@REM https://github.com/meshtastic/web-flasher/blob/main/types/resources.ts#L3
+IF NOT "!FILENAME:-tft-=!"=="!FILENAME!" (
+ CALL :LOG_MESSAGE DEBUG "We are working with a *-tft-* file. !FILENAME!"
+ SET "TFT_BUILD=1"
) ELSE (
- @REM Everything else
- SET "OTA_FILENAME=bleota.bin"
+ CALL :LOG_MESSAGE DEBUG "We are NOT working with a *-tft-* file. !FILENAME!"
)
+
+FOR %%a IN (%BIGDB_8MB%) DO (
+ IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
+ @REM We are working with any of %BIGDB_8MB%.
+ SET "BIGDB8=1"
+ GOTO end_loop_bigdb_8mb
+ )
+)
+:end_loop_bigdb_8mb
+
+FOR %%a IN (%MUIDB_8MB%) DO (
+ IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
+ @REM We are working with any of %MUIDB_8MB%.
+ SET "MUIDB8=1"
+ GOTO end_loop_muidb_8mb
+ )
+)
+:end_loop_muidb_8mb
+
+FOR %%a IN (%BIGDB_16MB%) DO (
+ IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
+ @REM We are working with any of %BIGDB_16MB%.
+ SET "BIGDB16=1"
+ GOTO end_loop_bigdb_16mb
+ )
+)
+:end_loop_bigdb_16mb
+
+IF %BIGDB8% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 8mb partition selected."
+IF %MUIDB8% EQU 1 CALL :LOG_MESSAGE INFO "MUIDB 8mb partition selected."
+IF %BIGDB16% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 16mb partition selected."
+
+@REM Extract BASENAME from %FILENAME% for later use.
+SET "BASENAME=!FILENAME:firmware-=!"
+CALL :LOG_MESSAGE DEBUG "Computed firmware basename: !BASENAME!"
+
+@REM Account for S3 and C3 board's different OTA partition.
+FOR %%a IN (%S3%) DO (
+ IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
+ @REM We are working with any of %S3%.
+ SET "OTA_FILENAME=bleota-s3.bin"
+ GOTO :end_loop_s3
+ )
+)
+
+FOR %%a IN (%C3%) DO (
+ IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
+ @REM We are working with any of %C3%.
+ SET "OTA_FILENAME=bleota-c3.bin"
+ GOTO :end_loop_c3
+ )
+)
+
+@REM Everything else
+SET "OTA_FILENAME=bleota.bin"
+:end_loop_s3
+:end_loop_c3
CALL :LOG_MESSAGE DEBUG "Set OTA_FILENAME to: !OTA_FILENAME!"
@REM Set SPIFFS filename with "littlefs-" prefix.
-SET "SPIFFS_FILENAME=littlefs-!PROGNAME:firmware-=!.bin"
+SET "SPIFFS_FILENAME=littlefs-%BASENAME%"
CALL :LOG_MESSAGE DEBUG "Set SPIFFS_FILENAME to: !SPIFFS_FILENAME!"
+@REM Default offsets.
+@REM https://github.com/meshtastic/web-flasher/blob/main/stores/firmwareStore.ts#L202
+SET "OTA_OFFSET=0x260000"
+SET "SPIFFS_OFFSET=0x300000"
+
+@REM Offsets for BigDB 8mb.
+IF %BIGDB8% EQU 1 (
+ SET "OTA_OFFSET=0x340000"
+ SET "SPIFFS_OFFSET=0x670000"
+)
+
+@REM Offsets for MUIDB 8mb.
+IF %MUIDB8% EQU 1 (
+ SET "OTA_OFFSET=0x5D0000"
+ SET "SPIFFS_OFFSET=0x670000"
+)
+
+@REM Offsets for BigDB 16mb.
+IF %BIGDB16% EQU 1 (
+ SET "OTA_OFFSET=0x650000"
+ SET "SPIFFS_OFFSET=0xc90000"
+)
+
CALL :LOG_MESSAGE DEBUG "Set OTA_OFFSET to: !OTA_OFFSET!"
CALL :LOG_MESSAGE DEBUG "Set SPIFFS_OFFSET to: !SPIFFS_OFFSET!"
diff --git a/bin/device-install.sh b/bin/device-install.sh
index 1778a95..69e4794 100755
--- a/bin/device-install.sh
+++ b/bin/device-install.sh
@@ -2,15 +2,69 @@
PYTHON=${PYTHON:-$(which python3 python | head -n 1)}
BPS_RESET=false
+TFT_BUILD=false
MCU=""
# Constants
RESET_BAUD=1200
FIRMWARE_OFFSET=0x00
-# Default littlefs* offset.
-OFFSET=0x300000
-# Default OTA Offset
-OTA_OFFSET=0x260000
+
+# Variant groups
+BIGDB_8MB=(
+ "crowpanel-esp32s3"
+ "heltec_capsule_sensor_v3"
+ "heltec-v3"
+ "heltec-vision-master-e213"
+ "heltec-vision-master-e290"
+ "heltec-vision-master-t190"
+ "heltec-wireless-paper"
+ "heltec-wireless-tracker"
+ "heltec-wsl-v3"
+ "icarus"
+ "seeed-xiao-s3"
+ "tbeam-s3-core"
+ "tracksenger"
+)
+MUIDB_8MB=(
+ "picomputer-s3"
+ "unphone"
+ "seeed-sensecap-indicator"
+)
+BIGDB_16MB=(
+ "dreamcatcher"
+ "elecrow-adv"
+ "ESP32-S3-Pico"
+ "heltec-v4"
+ "m5stack-cores3"
+ "mesh-tab"
+ "station-g2"
+ "t-deck"
+ "t-energy-s3"
+ "t-eth-elite"
+ "t-watch-s3"
+ "tlora-pager"
+)
+S3_VARIANTS=(
+ "s3"
+ "-v3"
+ "-v4"
+ "t-deck"
+ "wireless-paper"
+ "wireless-tracker"
+ "station-g2"
+ "unphone"
+ "t-eth-elite"
+ "tlora-pager"
+ "mesh-tab"
+ "dreamcatcher"
+ "ESP32-S3-Pico"
+ "seeed-sensecap-indicator"
+ "heltec_capsule_sensor_v3"
+ "vision-master"
+ "icarus"
+ "tracksenger"
+ "elecrow-adv"
+)
# Determine the correct esptool command to use
if "$PYTHON" -m esptool version >/dev/null 2>&1; then
@@ -24,14 +78,6 @@ else
exit 1
fi
-# Check for jq
-if ! command -v jq >/dev/null 2>&1; then
- echo "Error: jq not found" >&2
- echo "Install jq with your package manager." >&2
- echo "e.g. 'apt install jq', 'dnf install jq', 'brew install jq', etc." >&2
- exit 1
-fi
-
set -e
# Usage info
@@ -43,7 +89,7 @@ Flash image file to device, but first erasing and writing system information.
-h Display this help and exit.
-p ESPTOOL_PORT Set the environment variable for ESPTOOL_PORT. If not set, ESPTOOL iterates all ports (Dangerous).
-P PYTHON Specify alternate python interpreter to use to invoke esptool. (Default: "$PYTHON")
- -f FILENAME The firmware *.factory.bin file to flash. Custom to your device type and region.
+ -f FILENAME The firmware .bin file to flash. Custom to your device type and region.
--1200bps-reset Attempt to place the device in correct mode. Some hardware requires this twice. (1200bps Reset)
EOF
@@ -92,43 +138,69 @@ fi
shift
}
-if [[ $(basename "$FILENAME") != firmware-*.factory.bin ]]; then
- echo "Filename must be a firmware-*.factory.bin file."
+if [[ "$FILENAME" != firmware-* ]]; then
+ echo "Filename must be a firmware-* file."
exit 1
fi
-# Extract PROGNAME from %FILENAME% for later use.
-PROGNAME="${FILENAME/.factory.bin/}"
-# Derive metadata filename from %PROGNAME%.
-METAFILE="${PROGNAME}.mt.json"
+# Check if FILENAME contains "-tft-" and set target partitionScheme accordingly.
+if [[ "${FILENAME//-tft-/}" != "$FILENAME" ]]; then
+ TFT_BUILD=true
+fi
-if [[ -f "$FILENAME" && "$FILENAME" == *.factory.bin ]]; then
- # Display metadata if it exists
- if [[ -f "$METAFILE" ]]; then
- echo "Firmware metadata: ${METAFILE}"
- jq . "$METAFILE"
- # Extract relevant fields from metadata
- if [[ $(jq -r '.part' "$METAFILE") != "null" ]]; then
- OTA_OFFSET=$(jq -r '.part[] | select(.subtype == "ota_1") | .offset' "$METAFILE")
- SPIFFS_OFFSET=$(jq -r '.part[] | select(.subtype == "spiffs") | .offset' "$METAFILE")
+# Extract BASENAME from %FILENAME% for later use.
+BASENAME="${FILENAME/firmware-/}"
+
+if [ -f "${FILENAME}" ] && [ -n "${FILENAME##*"update"*}" ]; then
+ # Default littlefs* offset.
+ OFFSET=0x300000
+
+ # Default OTA Offset
+ OTA_OFFSET=0x260000
+
+ # littlefs* offset for BigDB 8mb and OTA OFFSET.
+ for variant in "${BIGDB_8MB[@]}"; do
+ if [ -z "${FILENAME##*"$variant"*}" ]; then
+ OFFSET=0x670000
+ OTA_OFFSET=0x340000
fi
- MCU=$(jq -r '.mcu' "$METAFILE")
- else
- echo "ERROR: No metadata file found at ${METAFILE}"
- exit 1
- fi
+ done
- # Determine OTA filename based on MCU type
- if [ "$MCU" == "esp32s3" ]; then
- OTAFILE=bleota-s3.bin
- elif [ "$MCU" == "esp32c3" ]; then
- OTAFILE=bleota-c3.bin
+ for variant in "${MUIDB_8MB[@]}"; do
+ if [ -z "${FILENAME##*"$variant"*}" ]; then
+ OFFSET=0x670000
+ OTA_OFFSET=0x5D0000
+ fi
+ done
+
+ # littlefs* offset for BigDB 16mb and OTA OFFSET.
+ for variant in "${BIGDB_16MB[@]}"; do
+ if [ -z "${FILENAME##*"$variant"*}" ]; then
+ OFFSET=0xc90000
+ OTA_OFFSET=0x650000
+ fi
+ done
+
+ # Account for S3 board's different OTA partition
+ # FIXME: Use PlatformIO info to determine MCU type, this is unmaintainable
+ for variant in "${S3_VARIANTS[@]}"; do
+ if [ -z "${FILENAME##*"$variant"*}" ]; then
+ MCU="esp32s3"
+ fi
+ done
+
+ if [ "$MCU" != "esp32s3" ]; then
+ if [ -n "${FILENAME##*"esp32c3"*}" ]; then
+ OTAFILE=bleota.bin
+ else
+ OTAFILE=bleota-c3.bin
+ fi
else
- OTAFILE=bleota.bin
+ OTAFILE=bleota-s3.bin
fi
# Set SPIFFS filename with "littlefs-" prefix.
- SPIFFSFILE="littlefs-${PROGNAME/firmware-/}.bin"
+ SPIFFSFILE=littlefs-${BASENAME}
if [[ ! -f "$FILENAME" ]]; then
echo "Error: file ${FILENAME} wasn't found. Terminating."
diff --git a/bin/device-update.bat b/bin/device-update.bat
index 5512ea2..fa8c083 100755
--- a/bin/device-update.bat
+++ b/bin/device-update.bat
@@ -30,11 +30,11 @@ ECHO --change-mode Attempt to place the device in correct mode. (1200bps
ECHO Some hardware requires this twice.
ECHO.
ECHO Example: %SCRIPT_NAME% -p COM17 --change-mode
-ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4.bin -p COM11
+ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4-update.bin -p COM11
GOTO eof
:version
-ECHO %SCRIPT_NAME% [Version 2.7.0]
+ECHO %SCRIPT_NAME% [Version 2.6.2]
ECHO Meshtastic
GOTO eof
@@ -78,12 +78,12 @@ IF NOT EXIST !FILENAME! (
GOTO eof
)
-IF NOT "__!FILENAME:.factory.bin=!__"=="__!FILENAME!__" (
- CALL :LOG_MESSAGE DEBUG "We are working with a *.factory.bin* file. !FILENAME!"
+IF "!FILENAME:update=!"=="!FILENAME!" (
+ CALL :LOG_MESSAGE DEBUG "We are NOT working with a *update* file. !FILENAME!"
CALL :LOG_MESSAGE INFO "Use script device-install.bat to flash !FILENAME!."
GOTO eof
) ELSE (
- CALL :LOG_MESSAGE DEBUG "We are not working with a *.factory.bin* file. !FILENAME!"
+ CALL :LOG_MESSAGE DEBUG "We are working with a *update* file. !FILENAME!"
)
:skip-filename
diff --git a/bin/device-update.sh b/bin/device-update.sh
index 1c3d6be..f64280a 100755
--- a/bin/device-update.sh
+++ b/bin/device-update.sh
@@ -29,7 +29,7 @@ Flash image file to device, leave existing system intact."
-h Display this help and exit
-p ESPTOOL_PORT Set the environment variable for ESPTOOL_PORT. If not set, ESPTOOL iterates all ports (Dangerous).
-P PYTHON Specify alternate python interpreter to use to invoke esptool. (Default: "$PYTHON")
- -f FILENAME The *.bin file to flash. Custom to your device type.
+ -f FILENAME The *update.bin file to flash. Custom to your device type.
--change-mode Attempt to place the device in correct mode. Some hardware requires this twice. (1200bps Reset)
EOF
@@ -78,7 +78,7 @@ fi
shift
}
-if [[ -f "$FILENAME" && "$FILENAME" != *.factory.bin ]]; then
+if [ -f "${FILENAME}" ] && [ -z "${FILENAME##*"update"*}" ]; then
echo "Trying to flash update ${FILENAME}"
$ESPTOOL_CMD --baud $FLASH_BAUD write-flash $UPDATE_OFFSET "${FILENAME}"
else
diff --git a/bin/native-gdbserver.sh b/bin/native-gdbserver.sh
index a45a2dc..f779d66 100755
--- a/bin/native-gdbserver.sh
+++ b/bin/native-gdbserver.sh
@@ -2,4 +2,4 @@
set -e
pio run --environment native
-gdbserver --once localhost:2345 .pio/build/native/meshtasticd "$@"
+gdbserver --once localhost:2345 .pio/build/native/program "$@"
diff --git a/bin/native-run.sh b/bin/native-run.sh
index a8309c2..6566fc5 100755
--- a/bin/native-run.sh
+++ b/bin/native-run.sh
@@ -2,4 +2,4 @@
set -e
pio run --environment native
-.pio/build/native/meshtasticd "$@"
+.pio/build/native/program "$@"
diff --git a/bin/platformio-custom.py b/bin/platformio-custom.py
index 151cf0a..4a1887d 100644
--- a/bin/platformio-custom.py
+++ b/bin/platformio-custom.py
@@ -2,77 +2,98 @@
# trunk-ignore-all(ruff/F821)
# trunk-ignore-all(flake8/F821): For SConstruct imports
import sys
-from os.path import join, basename, isfile
+from os.path import join
import subprocess
import json
import re
+import time
from datetime import datetime
from readprops import readProps
Import("env")
platform = env.PioPlatform()
-progname = env.get("PROGNAME")
-lfsbin = f"{progname.replace('firmware-', 'littlefs-')}.bin"
-def manifest_gather(source, target, env):
- out = []
- check_paths = [
- progname,
- f"{progname}.elf",
- f"{progname}.bin",
- f"{progname}.factory.bin",
- f"{progname}.hex",
- f"{progname}.merged.hex",
- f"{progname}.uf2",
- f"{progname}.factory.uf2",
- f"{progname}.zip",
- lfsbin
+
+def esp32_create_combined_bin(source, target, env):
+ # this sub is borrowed from ESPEasy build toolchain. It's licensed under GPL V3
+ # https://github.com/letscontrolit/ESPEasy/blob/mega/tools/pio/post_esp32.py
+ print("Generating combined binary for serial flashing")
+
+ app_offset = 0x10000
+
+ new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin")
+ sections = env.subst(env.get("FLASH_EXTRA_IMAGES"))
+ firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin")
+ chip = env.get("BOARD_MCU")
+ flash_size = env.BoardConfig().get("upload.flash_size")
+ flash_freq = env.BoardConfig().get("build.f_flash", "40m")
+ flash_freq = flash_freq.replace("000000L", "m")
+ flash_mode = env.BoardConfig().get("build.flash_mode", "dio")
+ memory_type = env.BoardConfig().get("build.arduino.memory_type", "qio_qspi")
+ if flash_mode == "qio" or flash_mode == "qout":
+ flash_mode = "dio"
+ if memory_type == "opi_opi" or memory_type == "opi_qspi":
+ flash_mode = "dout"
+ cmd = [
+ "--chip",
+ chip,
+ "merge_bin",
+ "-o",
+ new_file_name,
+ "--flash_mode",
+ flash_mode,
+ "--flash_freq",
+ flash_freq,
+ "--flash_size",
+ flash_size,
]
- for p in check_paths:
- f = env.File(env.subst(f"$BUILD_DIR/{p}"))
- if f.exists():
- d = {
- "name": p,
- "md5": f.get_content_hash(), # Returns MD5 hash
- "bytes": f.get_size() # Returns file size in bytes
- }
- out.append(d)
- print(d)
- manifest_write(out, env)
-def manifest_write(files, env):
- manifest = {
- "version": verObj["long"],
- "build_epoch": build_epoch,
- "board": env.get("PIOENV"),
- "mcu": env.get("BOARD_MCU"),
- "repo": repo_owner,
- "files": files,
- "part": None,
- "has_mui": False,
- "has_inkhud": False,
- }
- # Get partition table (generated in esp32_pre.py) if it exists
- if env.get("custom_mtjson_part"):
- # custom_mtjson_part is a JSON string, convert it back to a dict
- pj = json.loads(env.get("custom_mtjson_part"))
- manifest["part"] = pj
- # Enable has_mui for TFT builds
- if ("HAS_TFT", 1) in env.get("CPPDEFINES", []):
- manifest["has_mui"] = True
- if "MESHTASTIC_INCLUDE_INKHUD" in env.get("CPPDEFINES", []):
- manifest["has_inkhud"] = True
+ print(" Offset | File")
+ for section in sections:
+ sect_adr, sect_file = section.split(" ", 1)
+ print(f" - {sect_adr} | {sect_file}")
+ cmd += [sect_adr, sect_file]
- # Write the manifest to the build directory
- with open(env.subst("$BUILD_DIR/${PROGNAME}.mt.json"), "w") as f:
- json.dump(manifest, f, indent=2)
+ print(f" - {hex(app_offset)} | {firmware_name}")
+ cmd += [hex(app_offset), firmware_name]
+
+ print("Using esptool.py arguments: %s" % " ".join(cmd))
+
+ esptool.main(cmd)
+
+
+if platform.name == "espressif32":
+ sys.path.append(join(platform.get_package_dir("tool-esptoolpy")))
+ import esptool
+
+ env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin)
+
+ esp32_kind = env.GetProjectOption("custom_esp32_kind")
+ if esp32_kind == "esp32":
+ # Free up some IRAM by removing auxiliary SPI flash chip drivers.
+ # Wrapped stub symbols are defined in src/platform/esp32/iram-quirk.c.
+ env.Append(
+ LINKFLAGS=[
+ "-Wl,--wrap=esp_flash_chip_gd",
+ "-Wl,--wrap=esp_flash_chip_issi",
+ "-Wl,--wrap=esp_flash_chip_winbond",
+ ]
+ )
+ else:
+ # For newer ESP32 targets, using newlib nano works better.
+ env.Append(LINKFLAGS=["--specs=nano.specs", "-u", "_printf_float"])
+
+if platform.name == "nordicnrf52":
+ env.AddPostAction("$BUILD_DIR/${PROGNAME}.hex",
+ env.VerboseAction(f"\"{sys.executable}\" ./bin/uf2conv.py \"$BUILD_DIR/firmware.hex\" -c -f 0xADA52840 -o \"$BUILD_DIR/firmware.uf2\"",
+ "Generating UF2 file"))
Import("projenv")
prefsLoc = projenv["PROJECT_DIR"] + "/version.properties"
verObj = readProps(prefsLoc)
-print(f"Using meshtastic platformio-custom.py, firmware version {verObj['long']} on {env.get('PIOENV')}")
+print("Using meshtastic platformio-custom.py, firmware version " + verObj["long"] + " on " + env.get("PIOENV"))
# get repository owner if git is installed
try:
@@ -118,10 +139,10 @@ flags = [
"-DBUILD_EPOCH=" + str(build_epoch),
] + pref_flags
-print("Using flags:")
+print ("Using flags:")
for flag in flags:
print(flag)
-
+
projenv.Append(
CCFLAGS=flags,
)
@@ -160,19 +181,3 @@ def load_boot_logo(source, target, env):
# Load the boot logo on TFT builds
if ("HAS_TFT", 1) in env.get("CPPDEFINES", []):
env.AddPreAction('$BUILD_DIR/littlefs.bin', load_boot_logo)
-
-# Rename (mv) littlefs.bin to include the PROGNAME
-# This ensures the littlefs.bin is named consistently with the firmware
-env.AddPostAction('$BUILD_DIR/littlefs.bin', env.VerboseAction(
- f'mv $BUILD_DIR/littlefs.bin $BUILD_DIR/{lfsbin}',
- f'Renaming littlefs.bin to {lfsbin}'
-))
-
-env.AddCustomTarget(
- name="mtjson",
- dependencies=None,
- actions=[manifest_gather],
- title="Meshtastic Manifest",
- description="Generating Meshtastic manifest JSON + Checksums",
- always_build=True,
-)
diff --git a/bin/test-simulator.sh b/bin/test-simulator.sh
index 92ed21a..3c5f8f8 100755
--- a/bin/test-simulator.sh
+++ b/bin/test-simulator.sh
@@ -3,7 +3,7 @@
set -e
echo "Starting simulator"
-.pio/build/native/meshtasticd -s &
+.pio/build/native/program &
sleep 20 # 5 seconds was not enough
echo "Simulator started, launching python test..."
diff --git a/debian/rules b/debian/rules
index ebb5721..0b5d1ac 100755
--- a/debian/rules
+++ b/debian/rules
@@ -28,4 +28,5 @@ override_dh_auto_build:
# Build with platformio
$(PIO_ENV) platformio run -e native-tft
# Move the binary and default config to the correct name
+ mv .pio/build/native-tft/program .pio/build/native-tft/meshtasticd
cp bin/config-dist.yaml bin/config.yaml
diff --git a/extra_scripts/disable_adafruit_usb.py b/extra_scripts/disable_adafruit_usb.py
index 3b901e2..5962421 100644
--- a/extra_scripts/disable_adafruit_usb.py
+++ b/extra_scripts/disable_adafruit_usb.py
@@ -1,9 +1,10 @@
-#!/usr/bin/env python3
# trunk-ignore-all(flake8/F821)
# trunk-ignore-all(ruff/F821)
Import("env")
+# NOTE: This is not currently used, but can serve as an example on how to write extra_scripts
+
# print("Current CLI targets", COMMAND_LINE_TARGETS)
# print("Current Build targets", BUILD_TARGETS)
# print("CPP defs", env.get("CPPDEFINES"))
diff --git a/extra_scripts/extra_stm32.py b/extra_scripts/extra_stm32.py
new file mode 100755
index 0000000..f3bd8c5
--- /dev/null
+++ b/extra_scripts/extra_stm32.py
@@ -0,0 +1,22 @@
+# trunk-ignore-all(ruff/F821)
+# trunk-ignore-all(flake8/F821): For SConstruct imports
+
+Import("env")
+# Custom HEX from ELF
+env.AddPostAction(
+ "$BUILD_DIR/${PROGNAME}.elf",
+ env.VerboseAction(
+ " ".join(
+ [
+ "$OBJCOPY",
+ "-O",
+ "ihex",
+ "-R",
+ ".eeprom",
+ "$BUILD_DIR/${PROGNAME}.elf",
+ "$BUILD_DIR/${PROGNAME}.hex",
+ ]
+ ),
+ "Building $BUILD_DIR/${PROGNAME}.hex",
+ ),
+)
diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg
index 3456001..e2da172 100644
--- a/meshtasticd.spec.rpkg
+++ b/meshtasticd.spec.rpkg
@@ -76,7 +76,7 @@ platformio run -e native-tft
%install
# Install meshtasticd binary
mkdir -p %{buildroot}%{_bindir}
-install -m 0755 .pio/build/native-tft/meshtasticd %{buildroot}%{_bindir}/meshtasticd
+install -m 0755 .pio/build/native-tft/program %{buildroot}%{_bindir}/meshtasticd
# Install portduino VFS dir
install -p -d -m 0770 %{buildroot}%{_localstatedir}/lib/meshtasticd
diff --git a/platformio.ini b/platformio.ini
index 218b754..9b8d0a1 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -14,9 +14,7 @@ description = Meshtastic
[env]
test_build_src = true
-extra_scripts =
- pre:bin/platformio-pre.py
- bin/platformio-custom.py
+extra_scripts = bin/platformio-custom.py
; note: we add src to our include search path so that lmic_project_config can override
; note: TINYGPS_OPTION_NO_CUSTOM_FIELDS is VERY important. We don't use custom fields and somewhere in that pile
; of code is a heap corruption bug!
@@ -123,7 +121,7 @@ lib_deps =
[device-ui_base]
lib_deps =
# renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master
- https://github.com/meshtastic/device-ui/archive/4fb5f24787caa841b58dbf623a52c4c5861d6722.zip
+ https://github.com/meshtastic/device-ui/archive/3bf332240416c5cb8c919fac2a0ec7260eb3be75.zip
; Common libs for environmental measurements in telemetry module
[environmental_base]
@@ -184,8 +182,8 @@ lib_deps =
dfrobot/DFRobot_BMM150@1.0.0
# renovate: datasource=custom.pio depName=Adafruit_TSL2561 packageName=adafruit/library/Adafruit TSL2561
adafruit/Adafruit TSL2561@1.1.2
- # renovate: datasource=custom.pio depName=BH1750_WE packageName=wollewald/library/BH1750_WE
- wollewald/BH1750_WE@1.1.10
+ # renovate: datasource=custom.pio depName=BH1750_WE packageName=wollewald/BH1750_WE@^1.1.10
+ wollewald/BH1750_WE@^1.1.10
; (not included in native / portduino)
[environmental_extra]
diff --git a/protobufs/meshtastic/config.proto b/protobufs/meshtastic/config.proto
index 4d352c1..e9d04d0 100644
--- a/protobufs/meshtastic/config.proto
+++ b/protobufs/meshtastic/config.proto
@@ -924,6 +924,11 @@ message Config {
* Brazil 902MHz
*/
BR_902 = 26;
+
+ /*
+ * Custom unrestricted region
+ */
+ NO_LIMITS = 27;
}
/*
diff --git a/protobufs/meshtastic/mesh.proto b/protobufs/meshtastic/mesh.proto
index 468231f..232d34f 100644
--- a/protobufs/meshtastic/mesh.proto
+++ b/protobufs/meshtastic/mesh.proto
@@ -700,9 +700,9 @@ enum HardwareModel {
HELTEC_SENSOR_HUB = 92;
/*
- * Muzi Works Muzi-Base device
+ * Reserved Fried Chicken ID for future use
*/
- MUZI_BASE = 93;
+ RESERVED_FRIED_CHICKEN = 93;
/*
* Heltec Magnetic Power Bank with Meshtastic compatible
diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp
index f782dab..35675ec 100644
--- a/src/graphics/draw/MenuHandler.cpp
+++ b/src/graphics/draw/MenuHandler.cpp
@@ -103,7 +103,8 @@ void menuHandler::LoraRegionPicker(uint32_t duration)
"KZ_433",
"KZ_863",
"NP_865",
- "BR_902"};
+ "BR_902",
+ "NO_LIMITS"};
BannerOverlayOptions bannerOptions;
#if defined(M5STACK_UNITC6L)
bannerOptions.message = "LoRa Region";
@@ -112,7 +113,7 @@ void menuHandler::LoraRegionPicker(uint32_t duration)
#endif
bannerOptions.durationMs = duration;
bannerOptions.optionsArrayPtr = optionsArray;
- bannerOptions.optionsCount = 27;
+ bannerOptions.optionsCount = 28;
bannerOptions.InitialSelected = 0;
bannerOptions.bannerCallback = [](int selected) -> void {
if (selected != 0 && config.lora.region != _meshtastic_Config_LoRaConfig_RegionCode(selected)) {
diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp
index 1f01640..f5b6ca0 100644
--- a/src/graphics/draw/UIRenderer.cpp
+++ b/src/graphics/draw/UIRenderer.cpp
@@ -940,7 +940,7 @@ void UIRenderer::drawIconScreen(const char *upperMsg, OLEDDisplay *display, OLED
display->setFont(FONT_MEDIUM);
display->setTextAlignment(TEXT_ALIGN_LEFT);
- const char *title = "meshtastic.org";
+ const char *title = "meshtastic MOD";
display->drawString(x + getStringCenteredX(title), y + SCREEN_HEIGHT - FONT_HEIGHT_MEDIUM, title);
display->setFont(FONT_SMALL);
// Draw region in upper left
diff --git a/src/graphics/img/icon_small.xbm b/src/graphics/img/icon_small.xbm
index e320a1f..2a5c40a 100644
--- a/src/graphics/img/icon_small.xbm
+++ b/src/graphics/img/icon_small.xbm
@@ -1,30 +1,30 @@
-#ifndef USERPREFS_HAS_SPLASH
-#define icon_width 50
-#define icon_height 20
-static uint8_t icon_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x80,
- 0x07, 0xc0, 0x07, 0x00, 0x00, 0x00, 0xc0, 0x0f,
- 0xc0, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x07, 0xe0,
- 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x07, 0xf0, 0x1f,
- 0x00, 0x00, 0x00, 0xf0, 0x03, 0xf0, 0x3f, 0x00,
- 0x00, 0x00, 0xf8, 0x03, 0xf8, 0x7f, 0x00, 0x00,
- 0x00, 0xf8, 0x01, 0xfc, 0x7e, 0x00, 0x00, 0x00,
- 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0xfe,
- 0x00, 0x7e, 0xf8, 0x00, 0x00, 0x00, 0x7e, 0x00,
- 0x3f, 0xf8, 0x01, 0x00, 0x00, 0x3f, 0x00, 0x1f,
- 0xf0, 0x01, 0x00, 0x00, 0x1f, 0x80, 0x1f, 0xe0,
- 0x03, 0x00, 0x80, 0x1f, 0xc0, 0x0f, 0xe0, 0x03,
- 0x00, 0x80, 0x0f, 0xc0, 0x07, 0xc0, 0x07, 0x00,
- 0xc0, 0x0f, 0xe0, 0x07, 0x80, 0x0f, 0x00, 0xe0,
- 0x07, 0xf0, 0x03, 0x80, 0x1f, 0x00, 0xe0, 0x03,
- 0xf8, 0x03, 0x00, 0x1f, 0x00, 0xf0, 0x03, 0xf8,
- 0x01, 0x00, 0x3f, 0x00, 0xf8, 0x01, 0xfc, 0x00,
- 0x00, 0x7e, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0x00,
- 0x7e, 0x00, 0xfc, 0x00, 0x7e, 0x00, 0x00, 0xfc,
- 0x00, 0x7e, 0x00, 0x3f, 0x00, 0x00, 0xf8, 0x00,
- 0x7e, 0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x38,
- 0x00, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x10, 0x00,
- 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00 };
-#endif
\ No newline at end of file
+#ifndef USERPREFS_HAS_SPLASH
+#define icon_width 50
+#define icon_height 20
+static uint8_t icon_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x80,
+ 0x07, 0xc0, 0x07, 0x00, 0x00, 0x00, 0xc0, 0x0f,
+ 0xc0, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x07, 0xe0,
+ 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x07, 0xf0, 0x1f,
+ 0x00, 0x00, 0x00, 0xf0, 0x03, 0xf0, 0x3f, 0x00,
+ 0x00, 0x00, 0xf8, 0x03, 0xf8, 0x7f, 0x00, 0x00,
+ 0x00, 0xf8, 0x01, 0xfc, 0x7e, 0x00, 0x00, 0x00,
+ 0xfc, 0x00, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0xfe,
+ 0x00, 0x7e, 0xf8, 0x00, 0x00, 0x00, 0x7e, 0x00,
+ 0x3f, 0xf8, 0x01, 0x00, 0x00, 0x3f, 0x00, 0x1f,
+ 0xf0, 0x01, 0x00, 0x00, 0x1f, 0x80, 0x1f, 0xe0,
+ 0x03, 0x00, 0x80, 0x1f, 0xc0, 0x0f, 0xe0, 0x03,
+ 0x00, 0x80, 0x0f, 0xc0, 0x07, 0xc0, 0x07, 0x00,
+ 0xc0, 0x0f, 0xe0, 0x07, 0x80, 0x0f, 0x00, 0xe0,
+ 0x07, 0xf0, 0x03, 0x80, 0x1f, 0x00, 0xe0, 0x03,
+ 0xf8, 0x03, 0x00, 0x1f, 0x00, 0xf0, 0x03, 0xf8,
+ 0x01, 0x00, 0x3f, 0x00, 0xf8, 0x01, 0xfc, 0x00,
+ 0x00, 0x7e, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0x00,
+ 0x7e, 0x00, 0xfc, 0x00, 0x7e, 0x00, 0x00, 0xfc,
+ 0x00, 0x7e, 0x00, 0x3f, 0x00, 0x00, 0xf8, 0x00,
+ 0x7e, 0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x38,
+ 0x00, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 };
+#endif
diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp
index 3c0da44..aec0dc5 100644
--- a/src/mesh/RadioInterface.cpp
+++ b/src/mesh/RadioInterface.cpp
@@ -192,11 +192,15 @@ const RegionInfo regions[] = {
*/
RDEF(LORA_24, 2400.0f, 2483.5f, 100, 0, 10, true, false, true),
+ /*
+ Custom region
+ */
+ RDEF(NO_LIMITS, 863.0f, 870.0f, 100, 0, 30, true, false, false),
+
/*
This needs to be last. Same as US.
*/
RDEF(UNSET, 902.0f, 928.0f, 100, 0, 30, true, false, false)
-
};
const RegionInfo *myRegion;
diff --git a/src/mesh/generated/meshtastic/config.pb.h b/src/mesh/generated/meshtastic/config.pb.h
index 3275683..32ef8c1 100644
--- a/src/mesh/generated/meshtastic/config.pb.h
+++ b/src/mesh/generated/meshtastic/config.pb.h
@@ -285,7 +285,9 @@ typedef enum _meshtastic_Config_LoRaConfig_RegionCode {
/* Nepal 865MHz */
meshtastic_Config_LoRaConfig_RegionCode_NP_865 = 25,
/* Brazil 902MHz */
- meshtastic_Config_LoRaConfig_RegionCode_BR_902 = 26
+ meshtastic_Config_LoRaConfig_RegionCode_BR_902 = 26,
+ /* NO_LIMITS */
+ meshtastic_Config_LoRaConfig_RegionCode_NO_LIMITS = 27
} meshtastic_Config_LoRaConfig_RegionCode;
/* Standard predefined channel settings
diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h
index 0c48a78..46de1de 100644
--- a/src/mesh/generated/meshtastic/mesh.pb.h
+++ b/src/mesh/generated/meshtastic/mesh.pb.h
@@ -237,8 +237,8 @@ typedef enum _meshtastic_HardwareModel {
meshtastic_HardwareModel_T_ETH_ELITE = 91,
/* Heltec HRI-3621 industrial probe */
meshtastic_HardwareModel_HELTEC_SENSOR_HUB = 92,
- /* Muzi Works Muzi-Base device */
- meshtastic_HardwareModel_MUZI_BASE = 93,
+ /* Reserved Fried Chicken ID for future use */
+ meshtastic_HardwareModel_RESERVED_FRIED_CHICKEN = 93,
/* Heltec Magnetic Power Bank with Meshtastic compatible */
meshtastic_HardwareModel_HELTEC_MESH_POCKET = 94,
/* Seeed Solar Node */
diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp
index 3b98eca..69da258 100644
--- a/src/nimble/NimbleBluetooth.cpp
+++ b/src/nimble/NimbleBluetooth.cpp
@@ -651,8 +651,8 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks
{
LOG_INFO("BLE incoming connection %s", connInfo.getAddress().toString().c_str());
+#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6)
const uint16_t connHandle = connInfo.getConnHandle();
-#if NIMBLE_ENABLE_2M_PHY && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6))
int phyResult =
ble_gap_set_prefered_le_phy(connHandle, BLE_GAP_LE_PHY_2M_MASK, BLE_GAP_LE_PHY_2M_MASK, BLE_GAP_LE_PHY_CODED_ANY);
if (phyResult == 0) {
@@ -660,7 +660,6 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks
} else {
LOG_WARN("Failed to prefer 2M PHY for conn %u, rc=%d", connHandle, phyResult);
}
-#endif
int dataLenResult = ble_gap_set_data_len(connHandle, kPreferredBleTxOctets, kPreferredBleTxTimeUs);
if (dataLenResult == 0) {
@@ -671,10 +670,9 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks
LOG_INFO("BLE conn %u initial MTU %u (target %u)", connHandle, connInfo.getMTU(), kPreferredBleMtu);
pServer->updateConnParams(connHandle, 6, 12, 0, 200);
- }
#endif
+ }
-#ifdef NIMBLE_TWO
virtual void onDisconnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo, int reason)
{
LOG_INFO("BLE disconnect reason: %d", reason);
@@ -820,7 +818,7 @@ void NimbleBluetooth::setup()
NimBLEDevice::init(getDeviceName());
NimBLEDevice::setPower(ESP_PWR_LVL_P9);
-#if NIMBLE_ENABLE_2M_PHY && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6))
+#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6)
int mtuResult = NimBLEDevice::setMTU(kPreferredBleMtu);
if (mtuResult == 0) {
LOG_INFO("BLE MTU request set to %u", kPreferredBleMtu);
diff --git a/src/platform/nrf52/NRF52Bluetooth.cpp b/src/platform/nrf52/NRF52Bluetooth.cpp
index f1bc433..4f7fb47 100644
--- a/src/platform/nrf52/NRF52Bluetooth.cpp
+++ b/src/platform/nrf52/NRF52Bluetooth.cpp
@@ -64,16 +64,6 @@ void onConnect(uint16_t conn_handle)
connection->getPeerName(central_name, sizeof(central_name));
LOG_INFO("BLE Connected to %s", central_name);
- // negotiate connections params as soon as possible
-
- ble_gap_conn_params_t newParams;
- newParams.min_conn_interval = 24;
- newParams.max_conn_interval = 40;
- newParams.slave_latency = 5;
- newParams.conn_sup_timeout = 400;
-
- sd_ble_gap_conn_param_update(conn_handle, &newParams);
-
// Notify UI (or any other interested firmware components)
meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::CONNECTED);
bluetoothStatus->updateStatus(&newStatus);
@@ -129,7 +119,7 @@ void startAdv(void)
Bluefruit.Advertising.addService(meshBleService);
/* Start Advertising
* - Enable auto advertising if disconnected
- * - Interval: fast mode = 20 ms, slow mode = 417,5 ms
+ * - Interval: fast mode = 20 ms, slow mode = 152.5 ms
* - Timeout for fast mode is 30 seconds
* - Start(timeout) with timeout = 0 will advertise forever (until connected)
*
@@ -137,7 +127,7 @@ void startAdv(void)
* https://developer.apple.com/library/content/qa/qa1931/_index.html
*/
Bluefruit.Advertising.restartOnDisconnect(true);
- Bluefruit.Advertising.setInterval(32, 668); // in unit of 0.625 ms
+ Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds. FIXME, we should stop advertising after X
}
@@ -282,24 +272,6 @@ void NRF52Bluetooth::setup()
// Set the connect/disconnect callback handlers
Bluefruit.Periph.setConnectCallback(onConnect);
Bluefruit.Periph.setDisconnectCallback(onDisconnect);
-
- // Set slave latency to 5 to conserve power
- // Despite name this does not impact data transfer
- // https://docs.silabs.com/bluetooth/2.13/bluetooth-general-system-and-performance/optimizing-current-consumption-in-bluetooth-low-energy-devices
-
- Bluefruit.Periph.setConnSlaveLatency(5);
-
- // TODO: Adafruit defaul min, max interval seems to be (20,30) [in 1.25 ms units] -> (25.00, 31.25) milliseconds
- // so using formula Interval Max * (Slave Latency + 1) ≤ 2 seconds
- // max slave latency we can use is 30 (max available in BLE)
- // and even double max inteval (see apple doc linked above for formulas)
- // See Periph.SetConnInterval method
-
- // Tweak this later for even more power savings once those changes are confirmed to work well.
- // Changing min, max interval may slow BLE transfer a bit - bumping slave latency will most likely not.
-
-
-
#ifndef BLE_DFU_SECURE
bledfu.setPermission(SECMODE_ENC_WITH_MITM, SECMODE_ENC_WITH_MITM);
bledfu.begin(); // Install the DFU helper
@@ -328,7 +300,7 @@ void NRF52Bluetooth::setup()
void NRF52Bluetooth::resumeAdvertising()
{
Bluefruit.Advertising.restartOnDisconnect(true);
- Bluefruit.Advertising.setInterval(32, 668); // in unit of 0.625 ms
+ Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
Bluefruit.Advertising.start(0);
}
diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h
index d4699cd..1568e17 100644
--- a/src/platform/nrf52/architecture.h
+++ b/src/platform/nrf52/architecture.h
@@ -109,7 +109,7 @@
#elif defined(HELTEC_MESH_SOLAR)
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_MESH_SOLAR
#elif defined(MUZI_BASE)
-#define HW_VENDOR meshtastic_HardwareModel_MUZI_BASE
+#define HW_VENDOR meshtastic_HardwareModel_RESERVED_FRIED_CHICKEN
#else
#define HW_VENDOR meshtastic_HardwareModel_NRF52_UNKNOWN
#endif
diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp
index 5d1ba20..c03cc44 100644
--- a/src/platform/nrf52/main-nrf52.cpp
+++ b/src/platform/nrf52/main-nrf52.cpp
@@ -335,16 +335,6 @@ void cpuDeepSleep(uint32_t msecToWake)
if (Serial1) // A straightforward solution to the wake from deepsleep problem
Serial1.end();
#endif
-
-#ifdef TTGO_T_ECHO
- // To power off the T-Echo, the display must be set
- // as an input pin; otherwise, there will be leakage current.
- pinMode(PIN_EINK_CS, INPUT);
- pinMode(PIN_EINK_DC, INPUT);
- pinMode(PIN_EINK_RES, INPUT);
- pinMode(PIN_EINK_BUSY, INPUT);
-#endif
-
setBluetoothEnable(false);
#ifdef RAK4630
diff --git a/variants/esp32/esp32.ini b/variants/esp32/esp32.ini
index 5171bc4..08a547c 100644
--- a/variants/esp32/esp32.ini
+++ b/variants/esp32/esp32.ini
@@ -2,16 +2,10 @@
[esp32_base]
extends = arduino_base
custom_esp32_kind = esp32
-custom_mtjson_part =
platform =
# renovate: datasource=custom.pio depName=platformio/espressif32 packageName=platformio/platform/espressif32
platformio/espressif32@6.11.0
-extra_scripts =
- ${env.extra_scripts}
- pre:extra_scripts/esp32_pre.py
- extra_scripts/esp32_extra.py
-
build_src_filter =
${arduino_base.build_src_filter} - - - - -
diff --git a/variants/esp32s3/heltec_v3/platformio.ini b/variants/esp32s3/heltec_v3/platformio.ini
index af0854e..81a96e5 100644
--- a/variants/esp32s3/heltec_v3/platformio.ini
+++ b/variants/esp32s3/heltec_v3/platformio.ini
@@ -1,10 +1,11 @@
-[env:heltec-v3]
+[env:heltec-v3]
extends = esp32s3_base
board = heltec_wifi_lora_32_V3
board_level = pr
board_check = true
board_build.partitions = default_8MB.csv
-build_flags =
+build_flags =
${esp32s3_base.build_flags}
-D HELTEC_V3
+ -D OLED_RU
-I variants/esp32s3/heltec_v3
diff --git a/variants/esp32s3/tlora_t3s3_epaper/platformio.ini b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini
index 82bab45..eca052f 100644
--- a/variants/esp32s3/tlora_t3s3_epaper/platformio.ini
+++ b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini
@@ -13,10 +13,7 @@ build_flags =
-DEINK_WIDTH=250
-DEINK_HEIGHT=122
-DUSE_EINK_DYNAMICDISPLAY ; Enable Dynamic EInk
- -DEINK_LIMIT_FASTREFRESH=20 ; How many consecutive fast-refreshes are permitted //20
- -DEINK_LIMIT_RATE_BACKGROUND_SEC=30 ; Minimum interval between BACKGROUND updates //30
- -DEINK_LIMIT_RATE_RESPONSIVE_SEC=1 ; Minimum interval between RESPONSIVE updates
- -DEINK_BACKGROUND_USES_FAST ; (Optional) Use FAST refresh for both BACKGROUND and RESPONSIVE, until a limit is reached.
+ -DEINK_LIMIT_FASTREFRESH=10 ; How many consecutive fast-refreshes are permitted
lib_deps =
${esp32s3_base.lib_deps}
diff --git a/variants/native/portduino/platformio.ini b/variants/native/portduino/platformio.ini
index 9cedfcc..474d454 100644
--- a/variants/native/portduino/platformio.ini
+++ b/variants/native/portduino/platformio.ini
@@ -114,5 +114,5 @@ extends = env:native
build_flags = -lgcov --coverage -fprofile-abs-path -fsanitize=address ${env:native.build_flags}
; https://docs.platformio.org/en/latest/projectconf/sections/env/options/test/test_testing_command.html
test_testing_command =
- ${platformio.build_dir}/${this.__env__}/meshtasticd
+ ${platformio.build_dir}/${this.__env__}/program
-s
diff --git a/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h
index e4a6c03..b8cd8da 100644
--- a/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h
+++ b/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h
@@ -62,11 +62,17 @@ extern "C" {
/*
* Buttons
*/
-#define PIN_BUTTON1 (32 + 10)
-#define PIN_BUTTON2 (32 + 7)
+#define PIN_BUTTON2 (32 + 10)
#define ALT_BUTTON_PIN PIN_BUTTON2
#define ALT_BUTTON_ACTIVE_LOW true
#define ALT_BUTTON_ACTIVE_PULLUP true
+#define PIN_BUTTON1 (32 + 7)
+
+// #define PIN_BUTTON1 (0 + 11)
+// #define PIN_BUTTON1 (32 + 7)
+
+// #define BUTTON_CLICK_MS 400
+// #define BUTTON_TOUCH_MS 200
/*
* Analog pins
@@ -197,4 +203,4 @@ External serial flash WP25R1635FZUIL0
}
#endif
-#endif
+#endif
\ No newline at end of file
diff --git a/variants/nrf52840/heltec_mesh_node_t114/variant.h b/variants/nrf52840/heltec_mesh_node_t114/variant.h
index 03c5aaf..28404fc 100644
--- a/variants/nrf52840/heltec_mesh_node_t114/variant.h
+++ b/variants/nrf52840/heltec_mesh_node_t114/variant.h
@@ -21,8 +21,8 @@
/** Master clock frequency */
#define VARIANT_MCK (64000000ul)
-//#define USE_LFXO // Board uses 32khz crystal for LF
-#define USE_LFRC // Board uses RC for LF
+#define USE_LFXO // Board uses 32khz crystal for LF
+
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
diff --git a/variants/nrf52840/nrf52.ini b/variants/nrf52840/nrf52.ini
index 5da1aeb..87e2398 100644
--- a/variants/nrf52840/nrf52.ini
+++ b/variants/nrf52840/nrf52.ini
@@ -11,10 +11,6 @@ platform_packages =
; Don't renovate toolchain-gccarmnoneeabi
platformio/toolchain-gccarmnoneeabi@~1.90301.0
-extra_scripts =
- ${env.extra_scripts}
- extra_scripts/nrf52_extra.py
-
build_type = release
build_flags =
-include variants/nrf52840/cpp_overrides/lfs_util.h
diff --git a/variants/nrf52840/t-echo/variant.h b/variants/nrf52840/t-echo/variant.h
index 9a0cd05..b2692e4 100644
--- a/variants/nrf52840/t-echo/variant.h
+++ b/variants/nrf52840/t-echo/variant.h
@@ -181,9 +181,9 @@ External serial flash WP25R1635FZUIL0
#define PIN_GPS_STANDBY (32 + 2) // An output to wake GPS, low means allow sleep, high means force wake
// Seems to be missing on this new board
-#define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS
-#define GPS_TX_PIN (32 + 8) // This is for bits going TOWARDS the CPU
-#define GPS_RX_PIN (32 + 9) // This is for bits going TOWARDS the GPS
+// #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS
+#define GPS_TX_PIN (32 + 8) // This is for bits going TOWARDS the CPU
+#define GPS_RX_PIN (32 + 9) // This is for bits going TOWARDS the GPS
#define GPS_THREAD_INTERVAL 50
@@ -203,6 +203,8 @@ External serial flash WP25R1635FZUIL0
#define PIN_SPI_MOSI (0 + 22)
#define PIN_SPI_SCK (0 + 19)
+#define PIN_PWR_EN (0 + 6)
+
// To debug via the segger JLINK console rather than the CDC-ACM serial device
// #define USE_SEGGER
diff --git a/variants/nrf52840/tracker-t1000-e/variant.h b/variants/nrf52840/tracker-t1000-e/variant.h
index ff63a41..5b6719e 100644
--- a/variants/nrf52840/tracker-t1000-e/variant.h
+++ b/variants/nrf52840/tracker-t1000-e/variant.h
@@ -22,9 +22,7 @@
/** Master clock frequency */
#define VARIANT_MCK (64000000ul)
-//#define USE_LFXO // Board uses 32khz crystal for LF
-
-#define USE_LFRC
+#define USE_LFXO // Board uses 32khz crystal for LF
/*----------------------------------------------------------------------------
* Headers
diff --git a/variants/nrf52840/wio-sdk-wm1110/platformio.ini b/variants/nrf52840/wio-sdk-wm1110/platformio.ini
index 7c11ef6..0281297 100644
--- a/variants/nrf52840/wio-sdk-wm1110/platformio.ini
+++ b/variants/nrf52840/wio-sdk-wm1110/platformio.ini
@@ -4,22 +4,11 @@ extends = nrf52840_base
board = wio-sdk-wm1110
extra_scripts =
- ${nrf52840_base.extra_scripts}
+ ${env.extra_scripts}
extra_scripts/disable_adafruit_usb.py
# Remove adafruit USB serial from the build (it is incompatible with using the ch340 serial chip on this board)
-build_unflags =
- -Ofast
- -Og
- -ggdb3
- -ggdb2
- -g3
- -g2
- -g
- -g1
- -g0
- -DUSBCON
- -DUSE_TINYUSB
+build_unflags = ${nrf52840_base:build_unflags} -DUSBCON -DUSE_TINYUSB
build_flags = ${nrf52840_base.build_flags}
-Ivariants/nrf52840/wio-sdk-wm1110
-Isrc/platform/nrf52/softdevice
diff --git a/variants/stm32/stm32.ini b/variants/stm32/stm32.ini
index 547b050..1a9fd10 100644
--- a/variants/stm32/stm32.ini
+++ b/variants/stm32/stm32.ini
@@ -8,7 +8,7 @@ platform_packages =
platformio/framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/2.10.1.zip
extra_scripts =
${env.extra_scripts}
- extra_scripts/stm32_extra.py
+ post:extra_scripts/extra_stm32.py
build_type = release