Compare commits

..

12 Commits

Author SHA1 Message Date
Mike
31c0e8fa2c Support WiFi OTA (#6352)
* Support WiFi OTA

* Fix trunk warnings

* Make getVersion() check for project name too

---------

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2025-03-20 13:39:33 -05:00
raulperdomo
0d95b1afcc Added bounds checking to memcpy and use memory-safe strlcpy (#6351)
* Added bounds checking to memcpy and use memory-safe strlcpy for reading serial data in processWXSerial() function.

* Fixed linting with trunk
2025-03-20 10:40:13 -05:00
Austin
46235f6f8b RP2xx0: Add UDP Multicast support (#6327) 2025-03-20 08:49:28 -05:00
Jorropo
d1068fd1e4 Add UDP multicast support on linux. (#6342)
* Add UDP multicast support on linux.

Closes #6326

We tested it an it works.

This is really hacky to say the least.

* Add libuv to Linux packaging

* Trunkadunk

* Correct ref

* Add libuv1-dev to setup-native

---------

Co-authored-by: vidplace7 <vidplace7@gmail.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2025-03-20 08:47:39 -05:00
Jorropo
f41afb14b1 raise the multicast UDP TTL limit (#6343)
Since 96ba94843b we don't spray packets to all machines on the network.

So we can allow ourself to raise the TTL limit, this allows users who run L3 IGMP Routing infrastructure to pass meshtastic frames over UDP.

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2025-03-20 05:41:29 -05:00
Ben Meadors
f8ad02aab3 Update version.properties 2025-03-19 06:20:50 -05:00
github-actions[bot]
077759e15d Upgrade trunk (#6347)
Co-authored-by: sachaw <11172820+sachaw@users.noreply.github.com>
2025-03-19 05:11:42 -05:00
Bob Reese
22aa2d7582 Fixed UF2 generation problem with sys.executable path has spaces in it (#6346) 2025-03-18 20:20:15 -05:00
Austin
6673cb9292 Increase MAX_NUM_NODES on high-flash ESP32_S3 (#6311) 2025-03-18 20:19:51 -05:00
Kalle Lilja
8efc9702d3 device-install/update: fix esptool --port (#6341)
* fix errorlevel check

* add esptool --port if supplied

* match device-install

* add --port if supplied

* update logmessage

* bump version

---------

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2025-03-17 20:16:16 -05:00
Austin
2876eec7ed MeshToad - USB 1W 'MeshStick' (#6339) 2025-03-17 20:14:01 -05:00
Ben Meadors
9cc13e628a Stubbed out backup / restore methods for now and fixed bug 2025-03-17 19:24:47 -05:00
54 changed files with 560 additions and 194 deletions

View File

@@ -20,7 +20,7 @@ runs:
shell: bash shell: bash
run: | run: |
sudo apt-get -y update --fix-missing sudo apt-get -y update --fix-missing
sudo apt-get install -y cppcheck libbluetooth-dev libgpiod-dev libyaml-cpp-dev libuv1-dev lsb-release sudo apt-get install -y cppcheck libbluetooth-dev libgpiod-dev libyaml-cpp-dev lsb-release
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v5 uses: actions/setup-python@v5

View File

@@ -10,13 +10,13 @@ lint:
enabled: enabled:
- prettier@3.5.3 - prettier@3.5.3
- trufflehog@3.88.17 - trufflehog@3.88.17
- yamllint@1.36.0 - yamllint@1.36.2
- bandit@1.8.3 - bandit@1.8.3
- checkov@3.2.386 - checkov@3.2.386
- terrascan@1.19.9 - terrascan@1.19.9
- trivy@0.60.0 - trivy@0.60.0
- taplo@0.9.3 - taplo@0.9.3
- ruff@0.10.0 - ruff@0.11.0
- isort@6.0.1 - isort@6.0.1
- markdownlint@0.44.0 - markdownlint@0.44.0
- oxipng@9.1.4 - oxipng@9.1.4

View File

@@ -17,7 +17,6 @@ build_flags =
-DLFS_NO_ASSERT ; Disable LFS assertions , see https://github.com/meshtastic/firmware/pull/3818 -DLFS_NO_ASSERT ; Disable LFS assertions , see https://github.com/meshtastic/firmware/pull/3818
-DMESHTASTIC_EXCLUDE_AUDIO=1 -DMESHTASTIC_EXCLUDE_AUDIO=1
-DMESHTASTIC_EXCLUDE_PAXCOUNTER=1 -DMESHTASTIC_EXCLUDE_PAXCOUNTER=1
-DMAX_NUM_NODES=80
build_src_filter = build_src_filter =
${arduino_base.build_src_filter} -<platform/esp32/> -<platform/stm32wl> -<nimble/> -<mesh/wifi/> -<mesh/api/> -<mesh/http/> -<modules/esp32> -<platform/rp2xx0> -<mesh/eth/> -<mesh/raspihttp> ${arduino_base.build_src_filter} -<platform/esp32/> -<platform/stm32wl> -<nimble/> -<mesh/wifi/> -<mesh/api/> -<mesh/http/> -<modules/esp32> -<platform/rp2xx0> -<mesh/eth/> -<mesh/raspihttp>

View File

@@ -1,6 +1,6 @@
; The Portduino based 'native' environment. Currently supported on Linux targets with real LoRa hardware (or simulated). ; The Portduino based 'native' environment. Currently supported on Linux targets with real LoRa hardware (or simulated).
[portduino_base] [portduino_base]
platform = https://github.com/Jorropo/platform-native.git#17fa89daec4402af491512f75278a7fec8a5818c platform = https://github.com/meshtastic/platform-native.git#df71ed0040e9aad767a002829330965b78fc452a
framework = arduino framework = arduino
build_src_filter = build_src_filter =

View File

@@ -0,0 +1,17 @@
Lora:
Module: sx1262
CS: 0
IRQ: 6
Reset: 2
Busy: 4
RXen: 1
DIO2_AS_RF_SWITCH: true
DIO3_TCXO_VOLTAGE: true
spidev: ch341
USB_PID: 0x5512
USB_VID: 0x1A86
# Optional: Reduce power to 10 dBm to
# avoid over-drawing the USB port
# SX126X_MAX_POWER: 10
# Optional: Set the serial number for multi-radio support
# USB_Serialnum: 13374201

View File

@@ -7,12 +7,19 @@ SET "DEBUG=0"
SET "PYTHON=" SET "PYTHON="
SET "WEB_APP=0" SET "WEB_APP=0"
SET "TFT_BUILD=0" SET "TFT_BUILD=0"
SET "TFT8=0" SET "BIGDB8=0"
SET "TFT16=0" SET "BIGDB16=0"
SET "ESPTOOL_BAUD=115200" SET "ESPTOOL_BAUD=115200"
SET "ESPTOOL_CMD=" SET "ESPTOOL_CMD="
SET "LOGCOUNTER=0" SET "LOGCOUNTER=0"
@REM FIXME: Determine mcu from PlatformIO variant, this is unmaintainable.
SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone"
SET "C3=esp32c3"
@REM FIXME: Determine flash size from PlatformIO variant, this is unmaintainable.
SET "BIGDB_8MB=picomputer-s3 unphone seeed-sensecap-indicator 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 "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite t-watch-s3"
GOTO getopts GOTO getopts
:help :help
ECHO Flash image file to device, but first erasing and writing system information. ECHO Flash image file to device, but first erasing and writing system information.
@@ -34,7 +41,7 @@ ECHO Example: %SCRIPT_NAME% -f firmware-unphone-2.6.0.0b106d4.bin -p COM11 --web
GOTO eof GOTO eof
:version :version
ECHO %SCRIPT_NAME% [Version 2.6.0] ECHO %SCRIPT_NAME% [Version 2.6.1]
ECHO Meshtastic ECHO Meshtastic
GOTO eof GOTO eof
@@ -106,7 +113,7 @@ IF NOT "__%PYTHON%__"=="____" (
CALL :LOG_MESSAGE DEBUG "Checking esptool command !ESPTOOL_CMD!..." CALL :LOG_MESSAGE DEBUG "Checking esptool command !ESPTOOL_CMD!..."
!ESPTOOL_CMD! >nul 2>&1 !ESPTOOL_CMD! >nul 2>&1
IF %ERRORLEVEL% GTR 2 ( IF %ERRORLEVEL% GEQ 2 (
@REM esptool exits with code 1 if help is displayed. @REM esptool exits with code 1 if help is displayed.
CALL :LOG_MESSAGE ERROR "esptool not found: !ESPTOOL_CMD!" CALL :LOG_MESSAGE ERROR "esptool not found: !ESPTOOL_CMD!"
EXIT /B 1 EXIT /B 1
@@ -121,6 +128,7 @@ CALL :LOG_MESSAGE DEBUG "Using esptool command: !ESPTOOL_CMD!"
IF "__!ESPTOOL_PORT!__" == "____" ( IF "__!ESPTOOL_PORT!__" == "____" (
CALL :LOG_MESSAGE WARN "Using esptool port: UNSET." CALL :LOG_MESSAGE WARN "Using esptool port: UNSET."
) ELSE ( ) ELSE (
SET "ESPTOOL_CMD=!ESPTOOL_CMD! --port !ESPTOOL_PORT!"
CALL :LOG_MESSAGE INFO "Using esptool port: !ESPTOOL_PORT!." CALL :LOG_MESSAGE INFO "Using esptool port: !ESPTOOL_PORT!."
) )
CALL :LOG_MESSAGE INFO "Using esptool baud: !ESPTOOL_BAUD!." CALL :LOG_MESSAGE INFO "Using esptool baud: !ESPTOOL_BAUD!."
@@ -133,44 +141,36 @@ IF NOT "!FILENAME:-tft-=!"=="!FILENAME!" (
CALL :LOG_MESSAGE ERROR "Cannot enable WebUI (--web) and MUI." & GOTO eof CALL :LOG_MESSAGE ERROR "Cannot enable WebUI (--web) and MUI." & GOTO eof
) )
SET "TFT_BUILD=1" SET "TFT_BUILD=1"
GOTO tft
) ELSE ( ) ELSE (
CALL :LOG_MESSAGE DEBUG "We are NOT working with a *-tft-* file. !FILENAME!" CALL :LOG_MESSAGE DEBUG "We are NOT working with a *-tft-* file. !FILENAME!"
GOTO no_tft
) )
:tft FOR %%a IN (%BIGDB_8MB%) DO (
SET "TFT8MB=picomputer-s3 unphone seeed-sensecap-indicator"
FOR %%a IN (%TFT8MB%) DO (
IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
@REM We are working with any of %TFT8MB%. @REM We are working with any of %BIGDB_8MB%.
SET "TFT8=1" SET "BIGDB8=1"
GOTO end_loop_tft8mb GOTO end_loop_bigdb_8mb
) )
) )
:end_loop_tft8mb :end_loop_bigdb_8mb
SET "TFT16MB=t-deck" FOR %%a IN (%BIGDB_16MB%) DO (
FOR %%a IN (%TFT16MB%) DO (
IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
@REM We are working with any of %TFT16MB%. @REM We are working with any of %BIGDB_16MB%.
SET "TFT16=1" SET "BIGDB16=1"
GOTO end_loop_tft16mb GOTO end_loop_bigdb_16mb
) )
) )
:end_loop_tft16mb :end_loop_bigdb_16mb
IF %TFT8% EQU 1 CALL :LOG_MESSAGE INFO "tft and MUI 8mb selected." IF %BIGDB8% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 8mb partition selected."
IF %TFT16% EQU 1 CALL :LOG_MESSAGE INFO "tft and MUI 16mb selected." IF %BIGDB16% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 16mb partition selected."
:no_tft
@REM Extract BASENAME from %FILENAME% for later use. @REM Extract BASENAME from %FILENAME% for later use.
SET "BASENAME=!FILENAME:firmware-=!" SET "BASENAME=!FILENAME:firmware-=!"
CALL :LOG_MESSAGE DEBUG "Computed firmware basename: !BASENAME!" CALL :LOG_MESSAGE DEBUG "Computed firmware basename: !BASENAME!"
@REM Account for S3 and C3 board's different OTA partition. @REM Account for S3 and C3 board's different OTA partition.
SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone"
FOR %%a IN (%S3%) DO ( FOR %%a IN (%S3%) DO (
IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
@REM We are working with any of %S3%. @REM We are working with any of %S3%.
@@ -179,7 +179,6 @@ FOR %%a IN (%S3%) DO (
) )
) )
SET "C3=esp32c3"
FOR %%a IN (%C3%) DO ( FOR %%a IN (%C3%) DO (
IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
@REM We are working with any of %C3%. @REM We are working with any of %C3%.
@@ -208,14 +207,14 @@ CALL :LOG_MESSAGE DEBUG "Set SPIFFS_FILENAME to: !SPIFFS_FILENAME!"
SET "OTA_OFFSET=0x260000" SET "OTA_OFFSET=0x260000"
SET "SPIFFS_OFFSET=0x300000" SET "SPIFFS_OFFSET=0x300000"
@REM Offsets for MUI 8mb. @REM Offsets for BigDB 8mb.
IF %TFT8% EQU 1 IF %TFT_BUILD% EQU 1 ( IF %BIGDB8% EQU 1 (
SET "OTA_OFFSET=0x340000" SET "OTA_OFFSET=0x340000"
SET "SPIFFS_OFFSET=0x670000" SET "SPIFFS_OFFSET=0x670000"
) )
@REM Offsets for MUI 16mb. @REM Offsets for BigDB 16mb.
IF %TFT16% EQU 1 IF %TFT_BUILD% EQU 1 ( IF %BIGDB16% EQU 1 (
SET "OTA_OFFSET=0x650000" SET "OTA_OFFSET=0x650000"
SET "SPIFFS_OFFSET=0xc90000" SET "SPIFFS_OFFSET=0xc90000"
) )

View File

@@ -2,9 +2,48 @@
PYTHON=${PYTHON:-$(which python3 python | head -n 1)} PYTHON=${PYTHON:-$(which python3 python | head -n 1)}
WEB_APP=false WEB_APP=false
TFT8=false
TFT16=false
TFT_BUILD=false TFT_BUILD=false
MCU=""
# Variant groups
BIGDB_8MB=(
"picomputer-s3"
"unphone"
"seeed-sensecap-indicator"
"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"
)
BIGDB_16MB=(
"t-deck"
"mesh-tab"
"t-energy-s3"
"dreamcatcher"
"ESP32-S3-Pico"
"m5stack-cores3"
"station-g2"
"t-eth-elite"
"t-watch-s3"
)
S3_VARIANTS=(
"s3"
"-v3"
"t-deck"
"wireless-paper"
"wireless-tracker"
"station-g2"
"unphone"
)
# Determine the correct esptool command to use # Determine the correct esptool command to use
if "$PYTHON" -m esptool version >/dev/null 2>&1; then if "$PYTHON" -m esptool version >/dev/null 2>&1; then
@@ -42,8 +81,8 @@ while [ $# -gt 0 ]; do
exit 0 exit 0
;; ;;
-p) -p)
ESPTOOL_PORT="$2" ESPTOOL_CMD="$ESPTOOL_CMD --port $2"
shift # Shift past the option argument shift
;; ;;
-P) -P)
PYTHON="$2" PYTHON="$2"
@@ -78,21 +117,13 @@ if [[ $FILENAME != firmware-* ]]; then
exit 1 exit 1
fi fi
# Check if FILENAME contains "-tft-" and set target partitionScheme accordingly. # Check if FILENAME contains "-tft-" and prevent web/mui comingling.
if [[ ${FILENAME//-tft-/} != "$FILENAME" ]]; then if [[ ${FILENAME//-tft-/} != "$FILENAME" ]]; then
TFT_BUILD=true TFT_BUILD=true
if [[ $WEB_APP == true ]] && [[ $TFT_BUILD == true ]]; then if [[ $WEB_APP == true ]] && [[ $TFT_BUILD == true ]]; then
echo "Cannot enable WebUI (--web) and MUI." echo "Cannot enable WebUI (--web) and MUI."
exit 1 exit 1
fi fi
if [[ $FILENAME == *"picomputer-s3"* || $FILENAME == *"unphone"* || $FILENAME == *"seeed-sensecap-indicator"* ]]; then
TFT8=true
fi
if [[ $FILENAME == *"t-deck"* ]]; then
TFT16=true
fi
fi fi
# Extract BASENAME from %FILENAME% for later use. # Extract BASENAME from %FILENAME% for later use.
@@ -105,20 +136,31 @@ if [ -f "${FILENAME}" ] && [ -n "${FILENAME##*"update"*}" ]; then
# Default OTA Offset # Default OTA Offset
OTA_OFFSET=0x260000 OTA_OFFSET=0x260000
# littlefs* offset for MUI 8mb and OTA OFFSET. # littlefs* offset for BigDB 8mb and OTA OFFSET.
if [ "$TFT8" = true ] && [ "$TFT_BUILD" = true ]; then for variant in "${BIGDB_8MB[@]}"; do
OFFSET=0x670000 if [ -n "${FILENAME##*"$variant"*}" ]; then
OTA_OFFSET=0x340000 OFFSET=0x670000
fi OTA_OFFSET=0x340000
fi
done
# littlefs* offset for MUI 16mb and OTA OFFSET. # littlefs* offset for BigDB 16mb and OTA OFFSET.
if [ "$TFT16" = true ] && [ "$TFT_BUILD" = true ]; then for variant in "${BIGDB_16MB[@]}"; do
OFFSET=0xc90000 if [ -n "${FILENAME##*"$variant"*}" ]; then
OTA_OFFSET=0x650000 OFFSET=0xc90000
fi OTA_OFFSET=0x650000
fi
done
# Account for S3 board's different OTA partition # Account for S3 board's different OTA partition
if [ -n "${FILENAME##*"s3"*}" ] && [ -n "${FILENAME##*"-v3"*}" ] && [ -n "${FILENAME##*"t-deck"*}" ] && [ -n "${FILENAME##*"wireless-paper"*}" ] && [ -n "${FILENAME##*"wireless-tracker"*}" ] && [ -n "${FILENAME##*"station-g2"*}" ] && [ -n "${FILENAME##*"unphone"*}" ]; then # FIXME: Use PlatformIO info to determine MCU type, this is unmaintainable
for variant in "${S3_VARIANTS[@]}"; do
if [ -n "${FILENAME##*"$variant"*}" ]; then
MCU="esp32s3"
fi
done
if [ "$MCU" != "esp32s3" ]; then
if [ -n "${FILENAME##*"esp32c3"*}" ]; then if [ -n "${FILENAME##*"esp32c3"*}" ]; then
OTAFILE=bleota.bin OTAFILE=bleota.bin
else else

View File

@@ -16,7 +16,7 @@ ECHO.
ECHO Usage: %SCRIPT_NAME% -f filename [-p PORT] [-P python] ECHO Usage: %SCRIPT_NAME% -f filename [-p PORT] [-P python]
ECHO. ECHO.
ECHO Options: ECHO Options:
ECHO -f filename The .bin file to flash. Custom to your device type and region. (required) ECHO -f filename The update .bin file to flash. Custom to your device type and region. (required)
ECHO The file must be located in this current directory. ECHO The file must be located in this current directory.
ECHO -p PORT Set the environment variable for ESPTOOL_PORT. ECHO -p PORT Set the environment variable for ESPTOOL_PORT.
ECHO If not set, ESPTOOL iterates all ports (Dangerous). ECHO If not set, ESPTOOL iterates all ports (Dangerous).
@@ -28,7 +28,7 @@ ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4-update.bin -p C
GOTO eof GOTO eof
:version :version
ECHO %SCRIPT_NAME% [Version 2.6.0] ECHO %SCRIPT_NAME% [Version 2.6.1]
ECHO Meshtastic ECHO Meshtastic
GOTO eof GOTO eof
@@ -53,6 +53,7 @@ IF "__!FILENAME!__"=="____" (
CALL :LOG_MESSAGE DEBUG "Missing -f filename input." CALL :LOG_MESSAGE DEBUG "Missing -f filename input."
GOTO help GOTO help
) ELSE ( ) ELSE (
CALL :LOG_MESSAGE DEBUG "Filename: !FILENAME!"
IF NOT "__!FILENAME: =!__"=="__!FILENAME!__" ( IF NOT "__!FILENAME: =!__"=="__!FILENAME!__" (
CALL :LOG_MESSAGE ERROR "Filename containing spaces are not supported." CALL :LOG_MESSAGE ERROR "Filename containing spaces are not supported."
GOTO help GOTO help
@@ -62,7 +63,6 @@ IF "__!FILENAME!__"=="____" (
SET "FILENAME=!FILENAME:./=!" SET "FILENAME=!FILENAME:./=!"
) )
CALL :LOG_MESSAGE DEBUG "Filename: !FILENAME!"
CALL :LOG_MESSAGE DEBUG "Checking if !FILENAME! exists..." CALL :LOG_MESSAGE DEBUG "Checking if !FILENAME! exists..."
IF NOT EXIST !FILENAME! ( IF NOT EXIST !FILENAME! (
CALL :LOG_MESSAGE ERROR "File does not exist: !FILENAME!. Terminating." CALL :LOG_MESSAGE ERROR "File does not exist: !FILENAME!. Terminating."
@@ -71,7 +71,7 @@ IF NOT EXIST !FILENAME! (
IF "!FILENAME:update=!"=="!FILENAME!" ( IF "!FILENAME:update=!"=="!FILENAME!" (
CALL :LOG_MESSAGE DEBUG "We are NOT working with a *update* file. !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 update !FILENAME!." CALL :LOG_MESSAGE INFO "Use script device-install.bat to flash !FILENAME!."
GOTO eof GOTO eof
) ELSE ( ) ELSE (
CALL :LOG_MESSAGE DEBUG "We are working with a *update* file. !FILENAME!" CALL :LOG_MESSAGE DEBUG "We are working with a *update* file. !FILENAME!"
@@ -95,7 +95,7 @@ IF NOT "__%PYTHON%__"=="____" (
CALL :LOG_MESSAGE DEBUG "Checking esptool command !ESPTOOL_CMD!..." CALL :LOG_MESSAGE DEBUG "Checking esptool command !ESPTOOL_CMD!..."
!ESPTOOL_CMD! >nul 2>&1 !ESPTOOL_CMD! >nul 2>&1
IF %ERRORLEVEL% GTR 2 ( IF %ERRORLEVEL% GEQ 2 (
@REM esptool exits with code 1 if help is displayed. @REM esptool exits with code 1 if help is displayed.
CALL :LOG_MESSAGE ERROR "esptool not found: !ESPTOOL_CMD!" CALL :LOG_MESSAGE ERROR "esptool not found: !ESPTOOL_CMD!"
EXIT /B 1 EXIT /B 1
@@ -110,6 +110,7 @@ CALL :LOG_MESSAGE DEBUG "Using esptool command: !ESPTOOL_CMD!"
IF "__!ESPTOOL_PORT!__" == "____" ( IF "__!ESPTOOL_PORT!__" == "____" (
CALL :LOG_MESSAGE WARN "Using esptool port: UNSET." CALL :LOG_MESSAGE WARN "Using esptool port: UNSET."
) ELSE ( ) ELSE (
SET "ESPTOOL_CMD=!ESPTOOL_CMD! --port !ESPTOOL_PORT!"
CALL :LOG_MESSAGE INFO "Using esptool port: !ESPTOOL_PORT!." CALL :LOG_MESSAGE INFO "Using esptool port: !ESPTOOL_PORT!."
) )
CALL :LOG_MESSAGE INFO "Using esptool baud: !ESPTOOL_BAUD!." CALL :LOG_MESSAGE INFO "Using esptool baud: !ESPTOOL_BAUD!."

View File

@@ -35,8 +35,8 @@ while getopts ":hp:P:f:" opt; do
show_help show_help
exit 0 exit 0
;; ;;
p) export ESPTOOL_PORT=${OPTARG} p) ESPTOOL_CMD="$ESPTOOL_CMD --port ${OPTARG}"
;; ;;
P) PYTHON=${OPTARG} P) PYTHON=${OPTARG}
;; ;;
f) FILENAME=${OPTARG} f) FILENAME=${OPTARG}

View File

@@ -83,7 +83,7 @@ if platform.name == "espressif32":
if platform.name == "nordicnrf52": if platform.name == "nordicnrf52":
env.AddPostAction("$BUILD_DIR/${PROGNAME}.hex", 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", env.VerboseAction(f"\"{sys.executable}\" ./bin/uf2conv.py $BUILD_DIR/firmware.hex -c -f 0xADA52840 -o $BUILD_DIR/firmware.uf2",
"Generating UF2 file")) "Generating UF2 file"))
Import("projenv") Import("projenv")

View File

@@ -823,7 +823,8 @@ void setup()
LOG_DEBUG("Start multicast thread"); LOG_DEBUG("Start multicast thread");
udpThread = new UdpMulticastThread(); udpThread = new UdpMulticastThread();
#ifdef ARCH_PORTDUINO #ifdef ARCH_PORTDUINO
// FIXME: portduino does not ever call onNetworkConnected so call it here because I don't know what happen if I call onNetworkConnected there // FIXME: portduino does not ever call onNetworkConnected so call it here because I don't know what happen if I call
// onNetworkConnected there
udpThread->start(); udpThread->start();
#endif #endif
#endif #endif

View File

@@ -51,6 +51,10 @@
#include <utility/bonding.h> #include <utility/bonding.h>
#endif #endif
#if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_WIFI
#include <WiFiOTA.h>
#endif
NodeDB *nodeDB = nullptr; NodeDB *nodeDB = nullptr;
// we have plenty of ram so statically alloc this tempbuf (for now) // we have plenty of ram so statically alloc this tempbuf (for now)
@@ -635,6 +639,12 @@ void NodeDB::installDefaultConfig(bool preserveKey = false)
config.display.wake_on_tap_or_motion = true; config.display.wake_on_tap_or_motion = true;
#endif #endif
#if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_WIFI
if (WiFiOTA::isUpdated()) {
WiFiOTA::recoverConfig(&config.network);
}
#endif
initConfigIntervals(); initConfigIntervals();
} }
@@ -1598,6 +1608,94 @@ UserLicenseStatus NodeDB::getLicenseStatus(uint32_t nodeNum)
return info->user.is_licensed ? UserLicenseStatus::Licensed : UserLicenseStatus::NotLicensed; return info->user.is_licensed ? UserLicenseStatus::Licensed : UserLicenseStatus::NotLicensed;
} }
bool NodeDB::backupPreferences(meshtastic_AdminMessage_BackupLocation location)
{
bool success = false;
lastBackupAttempt = millis();
#ifdef FSCom
if (location == meshtastic_AdminMessage_BackupLocation_FLASH) {
meshtastic_BackupPreferences backup = meshtastic_BackupPreferences_init_zero;
backup.version = DEVICESTATE_CUR_VER;
backup.timestamp = getValidTime(RTCQuality::RTCQualityDevice, false);
backup.has_config = true;
backup.config = config;
backup.has_module_config = true;
backup.module_config = moduleConfig;
backup.has_channels = true;
backup.channels = channelFile;
backup.has_owner = true;
backup.owner = owner;
size_t backupSize;
pb_get_encoded_size(&backupSize, meshtastic_BackupPreferences_fields, &backup);
spiLock->lock();
FSCom.mkdir("/backups");
spiLock->unlock();
success = saveProto(backupFileName, backupSize, &meshtastic_BackupPreferences_msg, &backup);
if (success) {
LOG_INFO("Saved backup preferences");
} else {
LOG_ERROR("Failed to save backup preferences to file");
}
} else if (location == meshtastic_AdminMessage_BackupLocation_SD) {
// TODO: After more mainline SD card support
}
#endif
return success;
}
bool NodeDB::restorePreferences(meshtastic_AdminMessage_BackupLocation location, int restoreWhat)
{
bool success = false;
#ifdef FSCom
if (location == meshtastic_AdminMessage_BackupLocation_FLASH) {
spiLock->lock();
if (!FSCom.exists(backupFileName)) {
spiLock->unlock();
LOG_WARN("Could not restore. No backup file found");
return false;
} else {
spiLock->unlock();
}
meshtastic_BackupPreferences backup = meshtastic_BackupPreferences_init_zero;
success = loadProto(backupFileName, meshtastic_BackupPreferences_size, sizeof(meshtastic_BackupPreferences),
&meshtastic_BackupPreferences_msg, &backup);
if (success) {
if (restoreWhat & SEGMENT_CONFIG) {
config = backup.config;
LOG_DEBUG("Restored config");
}
if (restoreWhat & SEGMENT_MODULECONFIG) {
moduleConfig = backup.module_config;
LOG_DEBUG("Restored module config");
}
if (restoreWhat & SEGMENT_DEVICESTATE) {
devicestate.owner = backup.owner;
LOG_DEBUG("Restored device state");
}
if (restoreWhat & SEGMENT_CHANNELS) {
channelFile = backup.channels;
LOG_DEBUG("Restored channels");
}
success = saveToDisk(restoreWhat);
if (success) {
LOG_INFO("Restored preferences from backup");
} else {
LOG_ERROR("Failed to save restored preferences to flash");
}
} else {
LOG_ERROR("Failed to restore preferences from backup file");
}
} else if (location == meshtastic_AdminMessage_BackupLocation_SD) {
// TODO: After more mainline SD card support
}
return success;
#endif
}
/// Record an error that should be reported via analytics /// Record an error that should be reported via analytics
void recordCriticalError(meshtastic_CriticalErrorCode code, uint32_t address, const char *filename) void recordCriticalError(meshtastic_CriticalErrorCode code, uint32_t address, const char *filename)
{ {

View File

@@ -48,6 +48,7 @@ static constexpr const char *configFileName = "/prefs/config.proto";
static constexpr const char *uiconfigFileName = "/prefs/uiconfig.proto"; static constexpr const char *uiconfigFileName = "/prefs/uiconfig.proto";
static constexpr const char *moduleConfigFileName = "/prefs/module.proto"; static constexpr const char *moduleConfigFileName = "/prefs/module.proto";
static constexpr const char *channelFileName = "/prefs/channels.proto"; static constexpr const char *channelFileName = "/prefs/channels.proto";
static constexpr const char *backupFileName = "/backups/backup.proto";
/// Given a node, return how many seconds in the past (vs now) that we last heard from it /// Given a node, return how many seconds in the past (vs now) that we last heard from it
uint32_t sinceLastSeen(const meshtastic_NodeInfoLite *n); uint32_t sinceLastSeen(const meshtastic_NodeInfoLite *n);
@@ -202,8 +203,13 @@ class NodeDB
bool hasValidPosition(const meshtastic_NodeInfoLite *n); bool hasValidPosition(const meshtastic_NodeInfoLite *n);
bool backupPreferences(meshtastic_AdminMessage_BackupLocation location);
bool restorePreferences(meshtastic_AdminMessage_BackupLocation location,
int restoreWhat = SEGMENT_CONFIG | SEGMENT_MODULECONFIG | SEGMENT_DEVICESTATE | SEGMENT_CHANNELS);
private: private:
uint32_t lastNodeDbSave = 0; // when we last saved our db to flash uint32_t lastNodeDbSave = 0; // when we last saved our db to flash
uint32_t lastBackupAttempt = 0; // when we last tried a backup automatically or manually
/// Find a node in our DB, create an empty NodeInfoLite if missing /// Find a node in our DB, create an empty NodeInfoLite if missing
meshtastic_NodeInfoLite *getOrCreateMeshNode(NodeNum n); meshtastic_NodeInfoLite *getOrCreateMeshNode(NodeNum n);

View File

@@ -372,7 +372,7 @@ DecodeState perhapsDecode(meshtastic_MeshPacket *p)
p->pki_encrypted = true; p->pki_encrypted = true;
memcpy(&p->public_key.bytes, nodeDB->getMeshNode(p->from)->user.public_key.bytes, 32); memcpy(&p->public_key.bytes, nodeDB->getMeshNode(p->from)->user.public_key.bytes, 32);
p->public_key.size = 32; p->public_key.size = 32;
memcpy(&p->decoded, &decodedtmp, sizeof(meshtastic_Data_msg)); p->decoded = decodedtmp;
p->which_payload_variant = meshtastic_MeshPacket_decoded_tag; // change type to decoded p->which_payload_variant = meshtastic_MeshPacket_decoded_tag; // change type to decoded
} else { } else {
LOG_ERROR("PKC Decrypted, but pb_decode failed!"); LOG_ERROR("PKC Decrypted, but pb_decode failed!");

View File

@@ -18,10 +18,30 @@
#define MAX_RX_TOPHONE 32 #define MAX_RX_TOPHONE 32
#endif #endif
/// max number of nodes allowed in the mesh /// max number of nodes allowed in the nodeDB
#ifndef MAX_NUM_NODES #ifndef MAX_NUM_NODES
#if defined(ARCH_STM32WL)
#define MAX_NUM_NODES 10
#elif defined(ARCH_NRF52)
#define MAX_NUM_NODES 80
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
#include "Esp.h"
static inline int get_max_num_nodes()
{
uint32_t flash_size = ESP.getFlashChipSize() / (1024 * 1024); // Convert Bytes to MB
if (flash_size >= 15) {
return 250;
} else if (flash_size >= 7) {
return 200;
} else {
return 100;
}
}
#define MAX_NUM_NODES get_max_num_nodes()
#else
#define MAX_NUM_NODES 100 #define MAX_NUM_NODES 100
#endif #endif
#endif
/// Max number of channels allowed /// Max number of channels allowed
#define MAX_NUM_CHANNELS (member_size(meshtastic_ChannelFile, channels) / member_size(meshtastic_ChannelFile, channels[0])) #define MAX_NUM_CHANNELS (member_size(meshtastic_ChannelFile, channels) / member_size(meshtastic_ChannelFile, channels[0]))

View File

@@ -22,13 +22,13 @@ class UdpMulticastThread : public concurrency::OSThread
void start() void start()
{ {
if (udp.listenMulticast(udpIpAddress, UDP_MULTICAST_DEFAUL_PORT)) { if (udp.listenMulticast(udpIpAddress, UDP_MULTICAST_DEFAUL_PORT, 64)) {
#if !defined(ARCH_PORTDUINO) #if !defined(ARCH_PORTDUINO)
// FIXME(PORTDUINO): arduino lacks IPAddress::toString() // FIXME(PORTDUINO): arduino lacks IPAddress::toString()
LOG_DEBUG("UDP Listening on IP: %s", WiFi.localIP().toString().c_str()); LOG_DEBUG("UDP Listening on IP: %s", WiFi.localIP().toString().c_str());
#else #else
LOG_DEBUG("UDP Listening"); LOG_DEBUG("UDP Listening");
#endif #endif
udp.onPacket([this](AsyncUDPPacket packet) { onReceive(packet); }); udp.onPacket([this](AsyncUDPPacket packet) { onReceive(packet); });
} else { } else {
LOG_DEBUG("Failed to listen on UDP"); LOG_DEBUG("Failed to listen on UDP");
@@ -38,10 +38,10 @@ class UdpMulticastThread : public concurrency::OSThread
void onReceive(AsyncUDPPacket packet) void onReceive(AsyncUDPPacket packet)
{ {
size_t packetLength = packet.length(); size_t packetLength = packet.length();
#ifndef ARCH_PORTDUINO #ifndef ARCH_PORTDUINO
// FIXME(PORTDUINO): arduino lacks IPAddress::toString() // FIXME(PORTDUINO): arduino lacks IPAddress::toString()
LOG_DEBUG("UDP broadcast from: %s, len=%u", packet.remoteIP().toString().c_str(), packetLength); LOG_DEBUG("UDP broadcast from: %s, len=%u", packet.remoteIP().toString().c_str(), packetLength);
#endif #endif
meshtastic_MeshPacket mp; meshtastic_MeshPacket mp;
LOG_DEBUG("Decoding MeshPacket from UDP len=%u", packetLength); LOG_DEBUG("Decoding MeshPacket from UDP len=%u", packetLength);
bool isPacketDecoded = pb_decode_from_bytes(packet.data(), packetLength, &meshtastic_MeshPacket_msg, &mp); bool isPacketDecoded = pb_decode_from_bytes(packet.data(), packetLength, &meshtastic_MeshPacket_msg, &mp);
@@ -59,11 +59,11 @@ class UdpMulticastThread : public concurrency::OSThread
if (!mp || !udp) { if (!mp || !udp) {
return false; return false;
} }
#if !defined(ARCH_PORTDUINO) #if !defined(ARCH_PORTDUINO)
if (WiFi.status() != WL_CONNECTED) { if (WiFi.status() != WL_CONNECTED) {
return false; return false;
} }
#endif #endif
LOG_DEBUG("Broadcasting packet over UDP (id=%u)", mp->id); LOG_DEBUG("Broadcasting packet over UDP (id=%u)", mp->id);
uint8_t buffer[meshtastic_MeshPacket_size]; uint8_t buffer[meshtastic_MeshPacket_size];
size_t encodedLength = pb_encode_to_bytes(buffer, sizeof(buffer), &meshtastic_MeshPacket_msg, mp); size_t encodedLength = pb_encode_to_bytes(buffer, sizeof(buffer), &meshtastic_MeshPacket_msg, mp);
@@ -83,4 +83,4 @@ class UdpMulticastThread : public concurrency::OSThread
IPAddress udpIpAddress; IPAddress udpIpAddress;
AsyncUDP udp; AsyncUDP udp;
}; };
#endif // ARCH_ESP32 #endif // HAS_UDP_MULTICAST

View File

@@ -10,6 +10,9 @@
#if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_BLUETOOTH #if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_BLUETOOTH
#include "BleOta.h" #include "BleOta.h"
#endif #endif
#if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_WIFI
#include "WiFiOTA.h"
#endif
#include "Router.h" #include "Router.h"
#include "configuration.h" #include "configuration.h"
#include "main.h" #include "main.h"
@@ -194,19 +197,23 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
} }
case meshtastic_AdminMessage_reboot_ota_seconds_tag: { case meshtastic_AdminMessage_reboot_ota_seconds_tag: {
int32_t s = r->reboot_ota_seconds; int32_t s = r->reboot_ota_seconds;
#if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_BLUETOOTH #if defined(ARCH_ESP32)
if (BleOta::getOtaAppVersion().isEmpty()) { #if !MESHTASTIC_EXCLUDE_BLUETOOTH
LOG_INFO("No OTA firmware available, scheduling regular reboot in %d seconds", s); if (!BleOta::getOtaAppVersion().isEmpty()) {
screen->startAlert("Rebooting...");
} else {
screen->startFirmwareUpdateScreen(); screen->startFirmwareUpdateScreen();
BleOta::switchToOtaApp(); BleOta::switchToOtaApp();
LOG_INFO("Reboot to OTA in %d seconds", s); LOG_INFO("Rebooting to BLE OTA");
} }
#else
LOG_INFO("Not on ESP32, scheduling regular reboot in %d seconds", s);
screen->startAlert("Rebooting...");
#endif #endif
#if !MESHTASTIC_EXCLUDE_WIFI
if (WiFiOTA::trySwitchToOTA()) {
screen->startFirmwareUpdateScreen();
WiFiOTA::saveConfig(&config.network);
LOG_INFO("Rebooting to WiFi OTA");
}
#endif
#endif
LOG_INFO("Reboot in %d seconds", s);
rebootAtMsec = (s < 0) ? 0 : (millis() + s * 1000); rebootAtMsec = (s < 0) ? 0 : (millis() + s * 1000);
break; break;
} }
@@ -370,6 +377,42 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
LOG_DEBUG("Failed to delete file"); LOG_DEBUG("Failed to delete file");
} }
spiLock->unlock(); spiLock->unlock();
#endif
break;
}
case meshtastic_AdminMessage_backup_preferences_tag: {
LOG_INFO("Client requesting to backup preferences");
if (nodeDB->backupPreferences(r->backup_preferences)) {
myReply = allocErrorResponse(meshtastic_Routing_Error_NONE, &mp);
} else {
myReply = allocErrorResponse(meshtastic_Routing_Error_BAD_REQUEST, &mp);
}
break;
}
case meshtastic_AdminMessage_restore_preferences_tag: {
LOG_INFO("Client requesting to restore preferences");
if (nodeDB->restorePreferences(r->backup_preferences,
SEGMENT_DEVICESTATE | SEGMENT_CONFIG | SEGMENT_MODULECONFIG | SEGMENT_CHANNELS)) {
myReply = allocErrorResponse(meshtastic_Routing_Error_NONE, &mp);
LOG_DEBUG("Rebooting after successful restore of preferences");
reboot(1000);
disableBluetooth();
} else {
myReply = allocErrorResponse(meshtastic_Routing_Error_BAD_REQUEST, &mp);
}
break;
}
case meshtastic_AdminMessage_remove_backup_preferences_tag: {
LOG_INFO("Client requesting to remove backup preferences");
#ifdef FSCom
if (r->remove_backup_preferences == meshtastic_AdminMessage_BackupLocation_FLASH) {
spiLock->lock();
FSCom.remove(backupFileName);
spiLock->unlock();
} else if (r->remove_backup_preferences == meshtastic_AdminMessage_BackupLocation_SD) {
// TODO: After more mainline SD card support
LOG_ERROR("SD backup removal not implemented yet");
}
#endif #endif
break; break;
} }

View File

@@ -468,81 +468,83 @@ void SerialModule::processWXSerial()
// Extract the current line // Extract the current line
char line[meshtastic_Constants_DATA_PAYLOAD_LEN]; char line[meshtastic_Constants_DATA_PAYLOAD_LEN];
memset(line, '\0', sizeof(line)); memset(line, '\0', sizeof(line));
memcpy(line, &serialBytes[lineStart], lineEnd - lineStart); if (lineEnd - lineStart < sizeof(line) - 1) {
if (strstr(line, "Wind") != NULL) // we have a wind line memcpy(line, &serialBytes[lineStart], lineEnd - lineStart);
{ if (strstr(line, "Wind") != NULL) // we have a wind line
gotwind = true; {
// Find the positions of "=" signs in the line gotwind = true;
char *windDirPos = strstr(line, "WindDir = "); // Find the positions of "=" signs in the line
char *windSpeedPos = strstr(line, "WindSpeed = "); char *windDirPos = strstr(line, "WindDir = ");
char *windGustPos = strstr(line, "WindGust = "); char *windSpeedPos = strstr(line, "WindSpeed = ");
char *windGustPos = strstr(line, "WindGust = ");
if (windDirPos != NULL) { if (windDirPos != NULL) {
// Extract data after "=" for WindDir // Extract data after "=" for WindDir
strcpy(windDir, windDirPos + 15); // Add 15 to skip "WindDir = " strlcpy(windDir, windDirPos + 15, sizeof(windDir)); // Add 15 to skip "WindDir = "
double radians = GeoCoord::toRadians(strtof(windDir, nullptr)); double radians = GeoCoord::toRadians(strtof(windDir, nullptr));
dir_sum_sin += sin(radians); dir_sum_sin += sin(radians);
dir_sum_cos += cos(radians); dir_sum_cos += cos(radians);
dirCount++; dirCount++;
} else if (windSpeedPos != NULL) { } else if (windSpeedPos != NULL) {
// Extract data after "=" for WindSpeed // Extract data after "=" for WindSpeed
strcpy(windVel, windSpeedPos + 15); // Add 15 to skip "WindSpeed = " strlcpy(windVel, windSpeedPos + 15, sizeof(windVel)); // Add 15 to skip "WindSpeed = "
float newv = strtof(windVel, nullptr); float newv = strtof(windVel, nullptr);
velSum += newv; velSum += newv;
velCount++; velCount++;
if (newv < lull || lull == -1) if (newv < lull || lull == -1)
lull = newv; lull = newv;
} else if (windGustPos != NULL) { } else if (windGustPos != NULL) {
strcpy(windGust, windGustPos + 15); // Add 15 to skip "WindSpeed = " strlcpy(windGust, windGustPos + 15, sizeof(windGust)); // Add 15 to skip "WindSpeed = "
float newg = strtof(windGust, nullptr); float newg = strtof(windGust, nullptr);
if (newg > gust) if (newg > gust)
gust = newg; gust = newg;
} }
// these are also voltage data we care about possibly // these are also voltage data we care about possibly
} else if (strstr(line, "BatVoltage") != NULL) { // we have a battVoltage line } else if (strstr(line, "BatVoltage") != NULL) { // we have a battVoltage line
char *batVoltagePos = strstr(line, "BatVoltage = "); char *batVoltagePos = strstr(line, "BatVoltage = ");
if (batVoltagePos != NULL) { if (batVoltagePos != NULL) {
strcpy(batVoltage, batVoltagePos + 17); // 18 for ws 80, 17 for ws85 strlcpy(batVoltage, batVoltagePos + 17, sizeof(batVoltage)); // 18 for ws 80, 17 for ws85
batVoltageF = strtof(batVoltage, nullptr); batVoltageF = strtof(batVoltage, nullptr);
break; // last possible data we want so break break; // last possible data we want so break
} }
} else if (strstr(line, "CapVoltage") != NULL) { // we have a cappVoltage line } else if (strstr(line, "CapVoltage") != NULL) { // we have a cappVoltage line
char *capVoltagePos = strstr(line, "CapVoltage = "); char *capVoltagePos = strstr(line, "CapVoltage = ");
if (capVoltagePos != NULL) { if (capVoltagePos != NULL) {
strcpy(capVoltage, capVoltagePos + 17); // 18 for ws 80, 17 for ws85 strlcpy(capVoltage, capVoltagePos + 17, sizeof(capVoltage)); // 18 for ws 80, 17 for ws85
capVoltageF = strtof(capVoltage, nullptr); capVoltageF = strtof(capVoltage, nullptr);
} }
// GXTS04Temp = 24.4 // GXTS04Temp = 24.4
} else if (strstr(line, "GXTS04Temp") != NULL) { // we have a temperature line } else if (strstr(line, "GXTS04Temp") != NULL) { // we have a temperature line
char *tempPos = strstr(line, "GXTS04Temp = "); char *tempPos = strstr(line, "GXTS04Temp = ");
if (tempPos != NULL) { if (tempPos != NULL) {
strcpy(temperature, tempPos + 15); // 15 spaces for ws85 strlcpy(temperature, tempPos + 15, sizeof(temperature)); // 15 spaces for ws85
temperatureF = strtof(temperature, nullptr); temperatureF = strtof(temperature, nullptr);
} }
} else if (strstr(line, "RainIntSum") != NULL) { // we have a rainsum line } else if (strstr(line, "RainIntSum") != NULL) { // we have a rainsum line
// LOG_INFO(line);
char *pos = strstr(line, "RainIntSum = ");
if (pos != NULL) {
strcpy(rainStr, pos + 17); // 17 spaces for ws85
rainSum = int(strtof(rainStr, nullptr));
}
} else if (strstr(line, "Rain") != NULL) { // we have a rain line
if (strstr(line, "WaveRain") == NULL) { // skip WaveRain lines though.
// LOG_INFO(line); // LOG_INFO(line);
char *pos = strstr(line, "Rain = "); char *pos = strstr(line, "RainIntSum = ");
if (pos != NULL) { if (pos != NULL) {
strcpy(rainStr, pos + 17); // 17 spaces for ws85 strlcpy(rainStr, pos + 17, sizeof(rainStr)); // 17 spaces for ws85
rain = strtof(rainStr, nullptr); rainSum = int(strtof(rainStr, nullptr));
}
} else if (strstr(line, "Rain") != NULL) { // we have a rain line
if (strstr(line, "WaveRain") == NULL) { // skip WaveRain lines though.
// LOG_INFO(line);
char *pos = strstr(line, "Rain = ");
if (pos != NULL) {
strlcpy(rainStr, pos + 17, sizeof(rainStr)); // 17 spaces for ws85
rain = strtof(rainStr, nullptr);
}
} }
} }
}
// Update lineStart for the next line // Update lineStart for the next line
lineStart = lineEnd + 1; lineStart = lineEnd + 1;
}
} }
} }
break; break;

View File

@@ -0,0 +1,92 @@
#include "WiFiOTA.h"
#include "configuration.h"
#include <Preferences.h>
#include <esp_ota_ops.h>
namespace WiFiOTA
{
static const char *nvsNamespace = "ota-wifi";
static const char *appProjectName = "OTA-WiFi";
static bool updated = false;
bool isUpdated()
{
return updated;
}
void initialize()
{
Preferences prefs;
prefs.begin(nvsNamespace);
if (prefs.getBool("updated")) {
LOG_INFO("First boot after OTA update");
updated = true;
prefs.putBool("updated", false);
}
prefs.end();
}
void recoverConfig(meshtastic_Config_NetworkConfig *network)
{
LOG_INFO("Recovering WiFi settings after OTA update");
Preferences prefs;
prefs.begin(nvsNamespace, true);
String ssid = prefs.getString("ssid");
String psk = prefs.getString("psk");
prefs.end();
network->wifi_enabled = true;
strncpy(network->wifi_ssid, ssid.c_str(), sizeof(network->wifi_ssid));
strncpy(network->wifi_psk, psk.c_str(), sizeof(network->wifi_psk));
}
void saveConfig(meshtastic_Config_NetworkConfig *network)
{
LOG_INFO("Saving WiFi settings for upcoming OTA update");
Preferences prefs;
prefs.begin(nvsNamespace);
prefs.putString("ssid", network->wifi_ssid);
prefs.putString("psk", network->wifi_psk);
prefs.putBool("updated", false);
prefs.end();
}
const esp_partition_t *getAppPartition()
{
return esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_1, NULL);
}
bool getAppDesc(const esp_partition_t *part, esp_app_desc_t *app_desc)
{
if (esp_ota_get_partition_description(part, app_desc) != ESP_OK)
return false;
if (strcmp(app_desc->project_name, appProjectName) != 0)
return false;
return true;
}
bool trySwitchToOTA()
{
const esp_partition_t *part = getAppPartition();
esp_app_desc_t app_desc;
if (!getAppDesc(part, &app_desc))
return false;
if (esp_ota_set_boot_partition(part) != ESP_OK)
return false;
return true;
}
String getVersion()
{
const esp_partition_t *part = getAppPartition();
esp_app_desc_t app_desc;
if (!getAppDesc(part, &app_desc))
return String();
return String(app_desc.version);
}
} // namespace WiFiOTA

View File

@@ -0,0 +1,18 @@
#ifndef WIFIOTA_H
#define WIFIOTA_H
#include "mesh-pb-constants.h"
#include <Arduino.h>
namespace WiFiOTA
{
void initialize();
bool isUpdated();
void recoverConfig(meshtastic_Config_NetworkConfig *network);
void saveConfig(meshtastic_Config_NetworkConfig *network);
bool trySwitchToOTA();
String getVersion();
} // namespace WiFiOTA
#endif // WIFIOTA_H

View File

@@ -9,6 +9,8 @@
#include "nimble/NimbleBluetooth.h" #include "nimble/NimbleBluetooth.h"
#endif #endif
#include <WiFiOTA.h>
#if HAS_WIFI #if HAS_WIFI
#include "mesh/wifi/WiFiAPClient.h" #include "mesh/wifi/WiFiAPClient.h"
#endif #endif
@@ -139,12 +141,19 @@ void esp32Setup()
#if !MESHTASTIC_EXCLUDE_BLUETOOTH #if !MESHTASTIC_EXCLUDE_BLUETOOTH
String BLEOTA = BleOta::getOtaAppVersion(); String BLEOTA = BleOta::getOtaAppVersion();
if (BLEOTA.isEmpty()) { if (BLEOTA.isEmpty()) {
LOG_INFO("No OTA firmware available"); LOG_INFO("No BLE OTA firmware available");
} else { } else {
LOG_INFO("OTA firmware version %s", BLEOTA.c_str()); LOG_INFO("BLE OTA firmware version %s", BLEOTA.c_str());
} }
#else #endif
LOG_INFO("No OTA firmware available"); #if !MESHTASTIC_EXCLUDE_WIFI
String version = WiFiOTA::getVersion();
if (version.isEmpty()) {
LOG_INFO("No WiFi OTA firmware available");
} else {
LOG_INFO("WiFi OTA firmware version %s", version.c_str());
}
WiFiOTA::initialize();
#endif #endif
// enableModemSleep(); // enableModemSleep();

View File

@@ -14,7 +14,6 @@ Do not expect a working Meshtastic device with this target.
#define _VARIANT_EBYTE_E77_ #define _VARIANT_EBYTE_E77_
#define USE_STM32WLx #define USE_STM32WLx
#define MAX_NUM_NODES 10
#define LED_PIN PB4 // LED1 #define LED_PIN PB4 // LED1
// #define LED_PIN PB3 // LED2 // #define LED_PIN PB3 // LED2

View File

@@ -5,6 +5,7 @@ board_build.flash_mode = qio
board_build.psram_type = opi board_build.psram_type = opi
board_upload.flash_size = 8MB board_upload.flash_size = 8MB
board_upload.maximum_size = 8388608 board_upload.maximum_size = 8388608
board_build.partitions = default_8MB.csv
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1
;upload_port = /dev/ttyUSB0 ;upload_port = /dev/ttyUSB0
board_level = extra board_level = extra
@@ -32,6 +33,7 @@ board_build.flash_mode = qio
board_build.psram_type = opi board_build.psram_type = opi
board_upload.flash_size = 8MB board_upload.flash_size = 8MB
board_upload.maximum_size = 8388608 board_upload.maximum_size = 8388608
board_build.partitions = default_8MB.csv
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1
;upload_port = /dev/ttyUSB0 ;upload_port = /dev/ttyUSB0
board_level = extra board_level = extra
@@ -59,6 +61,7 @@ board_build.flash_mode = qio
board_build.psram_type = opi board_build.psram_type = opi
board_upload.flash_size = 8MB board_upload.flash_size = 8MB
board_upload.maximum_size = 8388608 board_upload.maximum_size = 8388608
board_build.partitions = default_8MB.csv
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1
;upload_port = /dev/ttyUSB0 ;upload_port = /dev/ttyUSB0
board_level = extra board_level = extra

View File

@@ -88,6 +88,7 @@ debug_tool = jlink
[env:t-energy-s3_e22] [env:t-energy-s3_e22]
extends = esp32s3_base extends = esp32s3_base
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1
board_build.partitions = default_16MB.csv
board_level = extra board_level = extra
board_upload.flash_size = 16MB ;Specify the FLASH capacity as 16MB board_upload.flash_size = 16MB ;Specify the FLASH capacity as 16MB
board_build.arduino.memory_type = qio_opi ;Enable internal PSRAM board_build.arduino.memory_type = qio_opi ;Enable internal PSRAM
@@ -100,4 +101,4 @@ build_flags =
-D BOARD_HAS_PSRAM -D BOARD_HAS_PSRAM
-D ARDUINO_USB_MODE=0 -D ARDUINO_USB_MODE=0
-D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_CDC_ON_BOOT=1
-I variants/diy/t-energy-s3_e22 -I variants/diy/t-energy-s3_e22

View File

@@ -1,6 +1,7 @@
[env:dreamcatcher] ; 2301, latest revision [env:dreamcatcher] ; 2301, latest revision
extends = esp32s3_base extends = esp32s3_base
board = esp32s3box board = esp32s3box
board_build.partitions = default_16MB.csv
board_level = extra board_level = extra
build_flags = build_flags =
@@ -8,7 +9,7 @@ build_flags =
-D PRIVATE_HW -D PRIVATE_HW
-D OTHERNET_DC_REV=2301 -D OTHERNET_DC_REV=2301
-I variants/dreamcatcher -I variants/dreamcatcher
-DARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_CDC_ON_BOOT=1
lib_deps = ${esp32s3_base.lib_deps} lib_deps = ${esp32s3_base.lib_deps}
earlephilhower/ESP8266Audio@^1.9.9 earlephilhower/ESP8266Audio@^1.9.9
@@ -17,6 +18,7 @@ lib_deps = ${esp32s3_base.lib_deps}
[env:dreamcatcher-2206] [env:dreamcatcher-2206]
extends = esp32s3_base extends = esp32s3_base
board = esp32s3box board = esp32s3box
board_build.partitions = default_16MB.csv
board_level = extra board_level = extra
build_flags = build_flags =
@@ -24,4 +26,4 @@ build_flags =
-D PRIVATE_HW -D PRIVATE_HW
-D OTHERNET_DC_REV=2206 -D OTHERNET_DC_REV=2206
-I variants/dreamcatcher -I variants/dreamcatcher
-DARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_CDC_ON_BOOT=1

View File

@@ -4,6 +4,7 @@ board_level = extra
extends = esp32s3_base extends = esp32s3_base
upload_protocol = esptool upload_protocol = esptool
board = esp32-s3-pico board = esp32-s3-pico
board_build.partitions = default_16MB.csv
board_upload.use_1200bps_touch = yes board_upload.use_1200bps_touch = yes
board_upload.wait_for_upload_port = yes board_upload.wait_for_upload_port = yes

View File

@@ -2,7 +2,7 @@
extends = esp32s3_base extends = esp32s3_base
board = heltec_wifi_lora_32_V3 board = heltec_wifi_lora_32_V3
board_check = true board_check = true
board_build.partitions = default_8MB.csv
build_flags = build_flags =
${esp32s3_base.build_flags} -I variants/heltec_capsule_sensor_v3 ${esp32s3_base.build_flags} -I variants/heltec_capsule_sensor_v3
-D HELTEC_CAPSULE_SENSOR_V3 -D HELTEC_CAPSULE_SENSOR_V3

View File

@@ -2,7 +2,7 @@
extends = esp32s3_base extends = esp32s3_base
board = heltec_wifi_lora_32_V3 board = heltec_wifi_lora_32_V3
board_check = true board_check = true
# Temporary until espressif creates a release with this new target board_build.partitions = default_8MB.csv
build_flags = build_flags =
${esp32s3_base.build_flags} -D HELTEC_V3 -I variants/heltec_v3 ${esp32s3_base.build_flags} -D HELTEC_V3 -I variants/heltec_v3
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely. -D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.

View File

@@ -1,8 +1,9 @@
[env:heltec-vision-master-e213] [env:heltec-vision-master-e213]
extends = esp32s3_base extends = esp32s3_base
board = heltec_vision_master_e213 board = heltec_vision_master_e213
board_build.partitions = default_8MB.csv
build_flags = build_flags =
${esp32s3_base.build_flags} ${esp32s3_base.build_flags}
-Ivariants/heltec_vision_master_e213 -Ivariants/heltec_vision_master_e213
-DHELTEC_VISION_MASTER_E213 -DHELTEC_VISION_MASTER_E213
-DUSE_EINK -DUSE_EINK
@@ -22,6 +23,7 @@ upload_speed = 115200
[env:heltec-vision-master-e213-inkhud] [env:heltec-vision-master-e213-inkhud]
extends = esp32s3_base, inkhud extends = esp32s3_base, inkhud
board = heltec_vision_master_e213 board = heltec_vision_master_e213
board_build.partitions = default_8MB.csv
build_src_filter = build_src_filter =
${esp32_base.build_src_filter} ${esp32_base.build_src_filter}
${inkhud.build_src_filter} ${inkhud.build_src_filter}

View File

@@ -2,6 +2,7 @@
[env:heltec-vision-master-e290] [env:heltec-vision-master-e290]
extends = esp32s3_base extends = esp32s3_base
board = heltec_vision_master_e290 board = heltec_vision_master_e290
board_build.partitions = default_8MB.csv
build_flags = build_flags =
${esp32s3_base.build_flags} ${esp32s3_base.build_flags}
-I variants/heltec_vision_master_e290 -I variants/heltec_vision_master_e290
@@ -26,6 +27,7 @@ upload_speed = 115200
[env:heltec-vision-master-e290-inkhud] [env:heltec-vision-master-e290-inkhud]
extends = esp32s3_base, inkhud extends = esp32s3_base, inkhud
board = heltec_vision_master_e290 board = heltec_vision_master_e290
board_build.partitions = default_8MB.csv
build_src_filter = build_src_filter =
${esp32_base.build_src_filter} ${esp32_base.build_src_filter}
${inkhud.build_src_filter} ${inkhud.build_src_filter}

View File

@@ -1,11 +1,11 @@
[env:heltec-vision-master-t190] [env:heltec-vision-master-t190]
extends = esp32s3_base extends = esp32s3_base
board = heltec_vision_master_t190 board = heltec_vision_master_t190
board_build.partitions = default_8MB.csv
build_flags = build_flags =
${esp32s3_base.build_flags} ${esp32s3_base.build_flags}
-Ivariants/heltec_vision_master_t190 -Ivariants/heltec_vision_master_t190
-DHELTEC_VISION_MASTER_T190 -DHELTEC_VISION_MASTER_T190
; -D PRIVATE_HW
lib_deps = lib_deps =
${esp32s3_base.lib_deps} ${esp32s3_base.lib_deps}
lewisxhe/PCF8563_Library@^1.0.1 lewisxhe/PCF8563_Library@^1.0.1

View File

@@ -2,6 +2,7 @@
[env:heltec-wireless-paper] [env:heltec-wireless-paper]
extends = esp32s3_base extends = esp32s3_base
board = heltec_wifi_lora_32_V3 board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv
build_flags = build_flags =
${esp32s3_base.build_flags} ${esp32s3_base.build_flags}
-I variants/heltec_wireless_paper -I variants/heltec_wireless_paper
@@ -23,6 +24,7 @@ upload_speed = 115200
[env:heltec-wireless-paper-inkhud] [env:heltec-wireless-paper-inkhud]
extends = esp32s3_base, inkhud extends = esp32s3_base, inkhud
board = heltec_wifi_lora_32_V3 board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv
build_src_filter = build_src_filter =
${esp32_base.build_src_filter} ${esp32_base.build_src_filter}
${inkhud.build_src_filter} ${inkhud.build_src_filter}

View File

@@ -2,6 +2,7 @@
extends = esp32s3_base extends = esp32s3_base
board_level = extra board_level = extra
board = heltec_wifi_lora_32_V3 board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv
build_flags = build_flags =
${esp32s3_base.build_flags} ${esp32s3_base.build_flags}
-I variants/heltec_wireless_paper_v1 -I variants/heltec_wireless_paper_v1

View File

@@ -1,6 +1,7 @@
[env:heltec-wireless-tracker] [env:heltec-wireless-tracker]
extends = esp32s3_base extends = esp32s3_base
board = heltec_wireless_tracker board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv
upload_protocol = esptool upload_protocol = esptool
build_flags = build_flags =

View File

@@ -2,6 +2,7 @@
extends = esp32s3_base extends = esp32s3_base
board_level = extra board_level = extra
board = heltec_wireless_tracker board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv
upload_protocol = esptool upload_protocol = esptool
build_flags = build_flags =
${esp32s3_base.build_flags} -I variants/heltec_wireless_tracker_V1_0 ${esp32s3_base.build_flags} -I variants/heltec_wireless_tracker_V1_0

View File

@@ -1,7 +1,8 @@
[env:heltec-wsl-v3] [env:heltec-wsl-v3]
extends = esp32s3_base extends = esp32s3_base
board = heltec_wifi_lora_32_V3 board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv
# Temporary until espressif creates a release with this new target # Temporary until espressif creates a release with this new target
build_flags = build_flags =
${esp32s3_base.build_flags} -D HELTEC_WSL_V3 -I variants/heltec_wsl_v3 ${esp32s3_base.build_flags} -D HELTEC_WSL_V3 -I variants/heltec_wsl_v3
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely. -D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.

View File

@@ -4,6 +4,7 @@ board = icarus
board_level = extra board_level = extra
board_check = true board_check = true
board_build.mcu = esp32s3 board_build.mcu = esp32s3
board_build.partitions = default_8MB.csv
upload_protocol = esptool upload_protocol = esptool
upload_speed = 921600 upload_speed = 921600
platform_packages = platformio/framework-arduinoespressif32@https://github.com/PowerFeather/powerfeather-meshtastic-arduino-lib/releases/download/2.0.16a/esp32-2.0.16.zip platform_packages = platformio/framework-arduinoespressif32@https://github.com/PowerFeather/powerfeather-meshtastic-arduino-lib/releases/download/2.0.16a/esp32-2.0.16.zip
@@ -15,5 +16,4 @@ build_unflags =
build_flags = build_flags =
${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/icarus ${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/icarus
-DBOARD_HAS_PSRAM -DBOARD_HAS_PSRAM
-DARDUINO_USB_MODE=0
-DARDUINO_USB_MODE=0

View File

@@ -3,6 +3,7 @@
extends = esp32s3_base extends = esp32s3_base
board = m5stack-cores3 board = m5stack-cores3
board_check = true board_check = true
board_build.partitions = default_16MB.csv
upload_protocol = esptool upload_protocol = esptool
build_flags = ${esp32_base.build_flags} build_flags = ${esp32_base.build_flags}

View File

@@ -28,7 +28,6 @@ build_flags = ${esp32s3_base.build_flags}
-D USE_LOG_DEBUG -D USE_LOG_DEBUG
-D LOG_DEBUG_INC=\"DebugConfiguration.h\" -D LOG_DEBUG_INC=\"DebugConfiguration.h\"
-D RADIOLIB_SPI_PARANOID=0 -D RADIOLIB_SPI_PARANOID=0
-D MAX_NUM_NODES=250
-D MAX_THREADS=40 -D MAX_THREADS=40
-D HAS_SCREEN=0 -D HAS_SCREEN=0
-D HAS_TFT=1 -D HAS_TFT=1

View File

@@ -2,6 +2,7 @@
extends = esp32s3_base extends = esp32s3_base
board = bpi_picow_esp32_s3 board = bpi_picow_esp32_s3
board_check = true board_check = true
board_build.partitions = default_8MB.csv
;OpenOCD flash method ;OpenOCD flash method
;upload_protocol = esp-builtin ;upload_protocol = esp-builtin
;Normal method ;Normal method
@@ -22,7 +23,6 @@ build_src_filter =
[env:picomputer-s3-tft] [env:picomputer-s3-tft]
extends = env:picomputer-s3 extends = env:picomputer-s3
board_build.partitions = default_8MB.csv ; just for test
build_flags = build_flags =
${env:picomputer-s3.build_flags} ${env:picomputer-s3.build_flags}
@@ -35,7 +35,6 @@ build_flags =
-D INPUTDRIVER_MATRIX_TYPE=1 -D INPUTDRIVER_MATRIX_TYPE=1
-D USE_PIN_BUZZER=PIN_BUZZER -D USE_PIN_BUZZER=PIN_BUZZER
-D USE_SX127x -D USE_SX127x
-D MAX_NUM_NODES=200
-D HAS_SCREEN=0 -D HAS_SCREEN=0
-D HAS_TFT=1 -D HAS_TFT=1
-D RAM_SIZE=1024 -D RAM_SIZE=1024

View File

@@ -7,6 +7,5 @@ Do not expect a working Meshtastic device with this target.
#define _VARIANT_RAK3172_ #define _VARIANT_RAK3172_
#define USE_STM32WLx #define USE_STM32WLx
#define MAX_NUM_NODES 10
#endif #endif

View File

@@ -23,8 +23,9 @@ build_flags = ${rp2350_base.build_flags}
-DHAS_WIFI=1 -DHAS_WIFI=1
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m33" -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m33"
-fexceptions # for exception handling in MQTT -fexceptions # for exception handling in MQTT
-DHAS_UDP_MULTICAST=1
build_src_filter = ${rp2350_base.build_src_filter} +<mesh/wifi/> build_src_filter = ${rp2350_base.build_src_filter} +<mesh/wifi/>
lib_deps = lib_deps =
${rp2350_base.lib_deps} ${rp2350_base.lib_deps}
${networking_base.lib_deps} ${networking_base.lib_deps}
debug_build_flags = ${rp2350_base.build_flags}, -g debug_build_flags = ${rp2350_base.build_flags}, -g

View File

@@ -10,9 +10,10 @@ build_flags = ${rp2040_base.build_flags}
-DHW_SPI1_DEVICE -DHW_SPI1_DEVICE
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m0plus" -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m0plus"
-fexceptions # for exception handling in MQTT -fexceptions # for exception handling in MQTT
-DHAS_UDP_MULTICAST=1
build_src_filter = ${rp2040_base.build_src_filter} +<mesh/wifi/> build_src_filter = ${rp2040_base.build_src_filter} +<mesh/wifi/>
lib_deps = lib_deps =
${rp2040_base.lib_deps} ${rp2040_base.lib_deps}
${networking_base.lib_deps} ${networking_base.lib_deps}
debug_build_flags = ${rp2040_base.build_flags}, -g debug_build_flags = ${rp2040_base.build_flags}, -g
debug_tool = cmsis-dap ; for e.g. Picotool debug_tool = cmsis-dap ; for e.g. Picotool

View File

@@ -6,6 +6,7 @@ platform_packages =
board = seeed-sensecap-indicator board = seeed-sensecap-indicator
board_check = true board_check = true
board_build.partitions = default_8MB.csv
upload_protocol = esptool upload_protocol = esptool
build_flags = ${esp32_base.build_flags} build_flags = ${esp32_base.build_flags}
@@ -32,7 +33,6 @@ lib_deps = ${esp32s3_base.lib_deps}
extends = env:seeed-sensecap-indicator extends = env:seeed-sensecap-indicator
board_level = main board_level = main
upload_speed = 460800 upload_speed = 460800
board_build.partitions = default_8MB.csv ; must be here for some reason, board.json is not enough !?
build_flags = build_flags =
${env:seeed-sensecap-indicator.build_flags} ${env:seeed-sensecap-indicator.build_flags}
@@ -46,7 +46,6 @@ build_flags =
-D INPUTDRIVER_BUTTON_TYPE=38 -D INPUTDRIVER_BUTTON_TYPE=38
-D HAS_TELEMETRY=0 -D HAS_TELEMETRY=0
-D CONFIG_DISABLE_HAL_LOCKS=1 -D CONFIG_DISABLE_HAL_LOCKS=1
-D MAX_NUM_NODES=250
-D HAS_SCREEN=0 -D HAS_SCREEN=0
-D HAS_TFT=1 -D HAS_TFT=1
-D DISPLAY_SET_RESOLUTION -D DISPLAY_SET_RESOLUTION

View File

@@ -2,7 +2,7 @@
extends = esp32s3_base extends = esp32s3_base
board = seeed-xiao-s3 board = seeed-xiao-s3
board_check = true board_check = true
board_build.mcu = esp32s3 board_build.partitions = default_8MB.csv
upload_protocol = esptool upload_protocol = esptool
upload_speed = 921600 upload_speed = 921600
lib_deps = lib_deps =

View File

@@ -2,6 +2,7 @@
extends = esp32s3_base extends = esp32s3_base
board = station-g2 board = station-g2
board_check = true board_check = true
board_build.partitions = default_16MB.csv
board_build.mcu = esp32s3 board_build.mcu = esp32s3
upload_protocol = esptool upload_protocol = esptool
;upload_port = /dev/ttyACM0 ;upload_port = /dev/ttyACM0
@@ -13,6 +14,6 @@ build_unflags =
-DARDUINO_USB_MODE=1 -DARDUINO_USB_MODE=1
build_flags = build_flags =
${esp32s3_base.build_flags} -D STATION_G2 -I variants/station-g2 ${esp32s3_base.build_flags} -D STATION_G2 -I variants/station-g2
-DBOARD_HAS_PSRAM -DBOARD_HAS_PSRAM
-DSTATION_G2 -DSTATION_G2
-DARDUINO_USB_MODE=0 -DARDUINO_USB_MODE=0

View File

@@ -3,6 +3,7 @@
extends = esp32s3_base extends = esp32s3_base
board = t-deck board = t-deck
board_check = true board_check = true
board_build.partitions = default_16MB.csv
upload_protocol = esptool upload_protocol = esptool
build_flags = ${esp32s3_base.build_flags} build_flags = ${esp32s3_base.build_flags}
@@ -20,7 +21,6 @@ lib_deps = ${esp32s3_base.lib_deps}
[env:t-deck-tft] [env:t-deck-tft]
extends = env:t-deck extends = env:t-deck
board_build.partitions = default_16MB.csv
build_flags = build_flags =
${env:t-deck.build_flags} ${env:t-deck.build_flags}
@@ -38,7 +38,6 @@ build_flags =
-D INPUTDRIVER_ENCODER_DOWN=15 -D INPUTDRIVER_ENCODER_DOWN=15
-D INPUTDRIVER_ENCODER_BTN=0 -D INPUTDRIVER_ENCODER_BTN=0
-D INPUTDRIVER_BUTTON_TYPE=0 -D INPUTDRIVER_BUTTON_TYPE=0
-D MAX_NUM_NODES=250
-D HAS_SDCARD -D HAS_SDCARD
-D HAS_SCREEN=0 -D HAS_SCREEN=0
-D HAS_TFT=1 -D HAS_TFT=1

View File

@@ -2,11 +2,12 @@
extends = esp32s3_base extends = esp32s3_base
board = esp32s3box board = esp32s3box
board_check = true board_check = true
board_build.partitions = default_16MB.csv
build_flags = build_flags =
${esp32s3_base.build_flags} ${esp32s3_base.build_flags}
-D T_ETH_ELITE -D T_ETH_ELITE
-I variants/t-eth-elite -I variants/t-eth-elite
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely. -D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
lib_ignore = lib_ignore =
Ethernet Ethernet

View File

@@ -3,6 +3,7 @@
extends = esp32s3_base extends = esp32s3_base
board = t-watch-s3 board = t-watch-s3
board_check = true board_check = true
board_build.partitions = default_16MB.csv
upload_protocol = esptool upload_protocol = esptool
build_flags = ${esp32_base.build_flags} build_flags = ${esp32_base.build_flags}

View File

@@ -2,6 +2,7 @@
[env:tbeam-s3-core] [env:tbeam-s3-core]
extends = esp32s3_base extends = esp32s3_base
board = tbeam-s3-core board = tbeam-s3-core
board_build.partitions = default_8MB.csv
board_check = true board_check = true
lib_deps = lib_deps =

View File

@@ -1,6 +1,7 @@
[env:tracksenger] [env:tracksenger]
extends = esp32s3_base extends = esp32s3_base
board = heltec_wireless_tracker board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv
upload_protocol = esp-builtin upload_protocol = esp-builtin
build_flags = build_flags =
@@ -16,6 +17,7 @@ lib_deps =
[env:tracksenger-lcd] [env:tracksenger-lcd]
extends = esp32s3_base extends = esp32s3_base
board = heltec_wireless_tracker board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv
upload_protocol = esp-builtin upload_protocol = esp-builtin
build_flags = build_flags =
@@ -31,6 +33,7 @@ lib_deps =
[env:tracksenger-oled] [env:tracksenger-oled]
extends = esp32s3_base extends = esp32s3_base
board = heltec_wireless_tracker board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv
upload_protocol = esp-builtin upload_protocol = esp-builtin
build_flags = build_flags =

View File

@@ -3,6 +3,7 @@
[env:unphone] [env:unphone]
extends = esp32s3_base extends = esp32s3_base
board = unphone board = unphone
board_build.partitions = default_8MB.csv
upload_speed = 921600 upload_speed = 921600
monitor_speed = 115200 monitor_speed = 115200
monitor_filters = esp32_exception_decoder monitor_filters = esp32_exception_decoder
@@ -32,7 +33,6 @@ lib_deps = ${esp32s3_base.lib_deps}
[env:unphone-tft] [env:unphone-tft]
extends = env:unphone extends = env:unphone
board_build.partitions = default_8MB.csv
build_flags = build_flags =
${env:unphone.build_flags} ${env:unphone.build_flags}
-D MESHTASTIC_EXCLUDE_CANNEDMESSAGES=1 -D MESHTASTIC_EXCLUDE_CANNEDMESSAGES=1
@@ -42,7 +42,6 @@ build_flags =
-D MESHTASTIC_EXCLUDE_SERIAL=1 -D MESHTASTIC_EXCLUDE_SERIAL=1
-D MESHTASTIC_EXCLUDE_SOCKETAPI=1 -D MESHTASTIC_EXCLUDE_SOCKETAPI=1
-D INPUTDRIVER_BUTTON_TYPE=21 -D INPUTDRIVER_BUTTON_TYPE=21
-D MAX_NUM_NODES=200
-D MAX_THREADS=40 -D MAX_THREADS=40
-D HAS_SCREEN=0 -D HAS_SCREEN=0
-D HAS_TFT=1 -D HAS_TFT=1

View File

@@ -13,7 +13,6 @@ Do not expect a working Meshtastic device with this target.
#define _VARIANT_WIOE5_ #define _VARIANT_WIOE5_
#define USE_STM32WLx #define USE_STM32WLx
#define MAX_NUM_NODES 10
#define LED_PIN PB5 #define LED_PIN PB5
#define LED_STATE_ON 1 #define LED_STATE_ON 1

View File

@@ -1,4 +1,4 @@
[VERSION] [VERSION]
major = 2 major = 2
minor = 6 minor = 6
build = 1 build = 2