diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
index fd827e229..1f13c1ee7 100644
--- a/.trunk/trunk.yaml
+++ b/.trunk/trunk.yaml
@@ -8,8 +8,8 @@ plugins:
uri: https://github.com/trunk-io/plugins
lint:
enabled:
- - checkov@3.2.435
- - renovate@40.36.2
+ - checkov@3.2.436
+ - renovate@40.42.2
- prettier@3.5.3
- trufflehog@3.88.35
- yamllint@1.37.1
@@ -28,7 +28,7 @@ lint:
- shellcheck@0.10.0
- black@25.1.0
- git-diff-check
- - gitleaks@8.26.0
+ - gitleaks@8.27.0
- clang-format@16.0.3
ignore:
- linters: [ALL]
diff --git a/alpine.Dockerfile b/alpine.Dockerfile
index bf7cad6d4..670736241 100644
--- a/alpine.Dockerfile
+++ b/alpine.Dockerfile
@@ -3,7 +3,7 @@
# trunk-ignore-all(hadolint/DL3018): Do not pin apk package versions
# trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions
-FROM python:3.13-alpine3.21 AS builder
+FROM python:3.13-alpine3.22 AS builder
ARG PIO_ENV=native
ENV PIP_ROOT_USER_ACTION=ignore
@@ -27,7 +27,7 @@ RUN bash ./bin/build-native.sh "$PIO_ENV" && \
# ##### PRODUCTION BUILD #############
-FROM alpine:3.21
+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/arch/esp32/esp32.ini b/arch/esp32/esp32.ini
index a6eff7bf9..cba84181b 100644
--- a/arch/esp32/esp32.ini
+++ b/arch/esp32/esp32.ini
@@ -4,7 +4,7 @@ extends = arduino_base
custom_esp32_kind = esp32
platform =
# renovate: datasource=custom.pio depName=platformio/espressif32 packageName=platformio/platform/espressif32
- platformio/espressif32@6.10.0
+ platformio/espressif32@6.11.0
build_src_filter =
${arduino_base.build_src_filter} - - - - -
diff --git a/arch/stm32/stm32.ini b/arch/stm32/stm32.ini
index dd190c9d4..e7a340f92 100644
--- a/arch/stm32/stm32.ini
+++ b/arch/stm32/stm32.ini
@@ -2,7 +2,7 @@
extends = arduino_base
platform =
# renovate: datasource=custom.pio depName=platformio/ststm32 packageName=platformio/platform/ststm32
- platformio/ststm32@19.1.0
+ platformio/ststm32@19.2.0
platform_packages =
# TODO renovate
platformio/framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/2.10.1.zip
diff --git a/bin/device-install.sh b/bin/device-install.sh
index 76765bb5f..2250db4fc 100755
--- a/bin/device-install.sh
+++ b/bin/device-install.sh
@@ -33,47 +33,47 @@ BIGDB_16MB=(
"ESP32-S3-Pico"
"m5stack-cores3"
"station-g2"
- "t-eth-elite"
- "t-watch-s3"
+ "t-eth-elite"
+ "t-watch-s3"
)
S3_VARIANTS=(
- "s3"
- "-v3"
- "t-deck"
- "wireless-paper"
- "wireless-tracker"
- "station-g2"
- "unphone"
- "t-eth-elite"
- "mesh-tab"
- "dreamcatcher"
- "ESP32-S3-Pico"
- "seeed-sensecap-indicator"
- "heltec_capsule_sensor_v3"
- "vision-master"
- "icarus"
- "tracksenger"
- "elecrow-adv"
+ "s3"
+ "-v3"
+ "t-deck"
+ "wireless-paper"
+ "wireless-tracker"
+ "station-g2"
+ "unphone"
+ "t-eth-elite"
+ "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
- ESPTOOL_CMD="$PYTHON -m esptool"
+ ESPTOOL_CMD="$PYTHON -m esptool"
elif command -v esptool >/dev/null 2>&1; then
- ESPTOOL_CMD="esptool"
+ ESPTOOL_CMD="esptool"
elif command -v esptool.py >/dev/null 2>&1; then
- ESPTOOL_CMD="esptool.py"
+ ESPTOOL_CMD="esptool.py"
else
- echo "Error: esptool not found"
- exit 1
+ echo "Error: esptool not found"
+ exit 1
fi
set -e
# Usage info
show_help() {
- cat <&2
- exit 1
- ;;
- esac
- shift # Move to the next argument
+ case "$1" in
+ -h | --help)
+ show_help
+ exit 0
+ ;;
+ -p)
+ ESPTOOL_CMD="$ESPTOOL_CMD --port $2"
+ shift
+ ;;
+ -P)
+ PYTHON="$2"
+ shift
+ ;;
+ -f)
+ FILENAME="$2"
+ shift
+ ;;
+ --web)
+ WEB_APP=true
+ ;;
+ --1200bps-reset)
+ BPS_RESET=true
+ ;;
+ --) # Stop parsing options
+ shift
+ break
+ ;;
+ *)
+ echo "Unknown argument: $1" >&2
+ exit 1
+ ;;
+ esac
+ shift # Move to the next argument
done
if [[ $BPS_RESET == true ]]; then
@@ -127,100 +127,100 @@ if [[ $BPS_RESET == true ]]; then
exit 0
fi
-[ -z "$FILENAME" -a -n "$1" ] && {
- FILENAME=$1
- shift
+[ -z "$FILENAME" ] && [ -n "$1" ] && {
+ FILENAME="$1"
+ shift
}
-if [[ $FILENAME != firmware-* ]]; then
+if [[ "$FILENAME" != firmware-* ]]; then
echo "Filename must be a firmware-* file."
exit 1
fi
# Check if FILENAME contains "-tft-" and prevent web/mui comingling.
-if [[ ${FILENAME//-tft-/} != "$FILENAME" ]]; then
- TFT_BUILD=true
- if [[ $WEB_APP == true ]] && [[ $TFT_BUILD == true ]]; then
- echo "Cannot enable WebUI (--web) and MUI."
- exit 1
- fi
+if [[ "${FILENAME//-tft-/}" != "$FILENAME" ]]; then
+ TFT_BUILD=true
+ if [[ $WEB_APP == true ]] && [[ $TFT_BUILD == true ]]; then
+ echo "Cannot enable WebUI (--web) and MUI."
+ exit 1
+ fi
fi
# Extract BASENAME from %FILENAME% for later use.
BASENAME="${FILENAME/firmware-/}"
if [ -f "${FILENAME}" ] && [ -n "${FILENAME##*"update"*}" ]; then
- # Default littlefs* offset (--web).
- OFFSET=0x300000
+ # Default littlefs* offset (--web).
+ OFFSET=0x300000
- # Default OTA Offset
- OTA_OFFSET=0x260000
+ # 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
- done
+ # 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
+ 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
+ # 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
+ # 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-s3.bin
- fi
+ if [ "$MCU" != "esp32s3" ]; then
+ if [ -n "${FILENAME##*"esp32c3"*}" ]; then
+ OTAFILE=bleota.bin
+ else
+ OTAFILE=bleota-c3.bin
+ fi
+ else
+ OTAFILE=bleota-s3.bin
+ fi
- # Check if WEB_APP (--web) is enabled and add "littlefswebui-" to BASENAME else "littlefs-".
- if [ "$WEB_APP" = true ]; then
- SPIFFSFILE=littlefswebui-${BASENAME}
- else
- SPIFFSFILE=littlefs-${BASENAME}
- fi
+ # Check if WEB_APP (--web) is enabled and add "littlefswebui-" to BASENAME else "littlefs-".
+ if [ "$WEB_APP" = true ]; then
+ SPIFFSFILE=littlefswebui-${BASENAME}
+ else
+ SPIFFSFILE=littlefs-${BASENAME}
+ fi
- if [[ ! -f $FILENAME ]]; then
- echo "Error: file ${FILENAME} wasn't found. Terminating."
- exit 1
- fi
- if [[ ! -f $OTAFILE ]]; then
- echo "Error: file ${OTAFILE} wasn't found. Terminating."
- exit 1
- fi
- if [[ ! -f $SPIFFSFILE ]]; then
- echo "Error: file ${SPIFFSFILE} wasn't found. Terminating."
- exit 1
- fi
+ if [[ ! -f "$FILENAME" ]]; then
+ echo "Error: file ${FILENAME} wasn't found. Terminating."
+ exit 1
+ fi
+ if [[ ! -f "$OTAFILE" ]]; then
+ echo "Error: file ${OTAFILE} wasn't found. Terminating."
+ exit 1
+ fi
+ if [[ ! -f "$SPIFFSFILE" ]]; then
+ echo "Error: file ${SPIFFSFILE} wasn't found. Terminating."
+ exit 1
+ fi
- echo "Trying to flash ${FILENAME}, but first erasing and writing system information"
- $ESPTOOL_CMD erase_flash
- $ESPTOOL_CMD write_flash 0x00 "${FILENAME}"
- echo "Trying to flash ${OTAFILE} at offset ${OTA_OFFSET}"
- $ESPTOOL_CMD write_flash $OTA_OFFSET "${OTAFILE}"
- echo "Trying to flash ${SPIFFSFILE}, at offset ${OFFSET}"
- $ESPTOOL_CMD write_flash $OFFSET "${SPIFFSFILE}"
+ echo "Trying to flash ${FILENAME}, but first erasing and writing system information"
+ $ESPTOOL_CMD erase_flash
+ $ESPTOOL_CMD write_flash 0x00 "${FILENAME}"
+ echo "Trying to flash ${OTAFILE} at offset ${OTA_OFFSET}"
+ $ESPTOOL_CMD write_flash $OTA_OFFSET "${OTAFILE}"
+ echo "Trying to flash ${SPIFFSFILE}, at offset ${OFFSET}"
+ $ESPTOOL_CMD write_flash $OFFSET "${SPIFFSFILE}"
else
- show_help
- echo "Invalid file: ${FILENAME}"
+ show_help
+ echo "Invalid file: ${FILENAME}"
fi
exit 0
diff --git a/bin/device-update.sh b/bin/device-update.sh
index c32b953e6..6adfe4e0e 100755
--- a/bin/device-update.sh
+++ b/bin/device-update.sh
@@ -18,8 +18,8 @@ fi
# Usage info
show_help() {
cat << EOF
-Usage: $(basename $0) [-h] [-p ESPTOOL_PORT] [-P PYTHON] [-f FILENAME|FILENAME] [--change-mode]
-Flash image file to device, leave existing system intact.
+Usage: $(basename "$0") [-h] [-p ESPTOOL_PORT] [-P PYTHON] [-f FILENAME|FILENAME] [--change-mode]
+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).
@@ -38,7 +38,7 @@ while getopts ":hp:P:f:" opt; do
exit 0
;;
p) ESPTOOL_CMD="$ESPTOOL_CMD --port ${OPTARG}"
- ;;
+ ;;
P) PYTHON=${OPTARG}
;;
f) FILENAME=${OPTARG}
@@ -47,7 +47,7 @@ while getopts ":hp:P:f:" opt; do
CHANGE_MODE=true
;;
*)
- echo "Invalid flag."
+ echo "Invalid flag."
show_help >&2
exit 1
;;
@@ -60,17 +60,17 @@ if [[ $CHANGE_MODE == true ]]; then
exit 0
fi
-[ -z "$FILENAME" -a -n "$1" ] && {
- FILENAME=$1
+[ -z "$FILENAME" ] && [ -n "$1" ] && {
+ FILENAME="$1"
shift
}
if [ -f "${FILENAME}" ] && [ -z "${FILENAME##*"update"*}" ]; then
- printf "Trying to flash update ${FILENAME}"
- $ESPTOOL_CMD --baud 115200 write_flash 0x10000 ${FILENAME}
+ echo "Trying to flash update ${FILENAME}"
+ $ESPTOOL_CMD --baud 115200 write_flash 0x10000 "${FILENAME}"
else
- show_help
- echo "Invalid file: ${FILENAME}"
+ show_help
+ echo "Invalid file: ${FILENAME}"
fi
exit 0
diff --git a/platformio.ini b/platformio.ini
index ecde59de2..42c27d226 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -108,7 +108,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/649e0953508ee4aabf1171519ee2eb69fb125647.zip
+ https://github.com/meshtastic/device-ui/archive/2fd19f813dc7364fe6b899accdc9f48bf5640120.zip
; Common libs for environmental measurements in telemetry module
[environmental_base]
diff --git a/protobufs b/protobufs
index 24c7a3d28..db60f07ac 160000
--- a/protobufs
+++ b/protobufs
@@ -1 +1 @@
-Subproject commit 24c7a3d287a4bd269ce191827e5dabd8ce8f57a7
+Subproject commit db60f07ac298b6161ca553b3868b542cceadcac4
diff --git a/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.h b/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.h
index e1bb96450..3ce16e473 100644
--- a/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.h
+++ b/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.h
@@ -5,7 +5,7 @@ E-Ink display driver
- Manufacturer: DKE
- Size: 2.13 inch
- Resolution: 122px x 250px
- - Flex connector marking: FPC-7528B
+ - Flex connector marking (not a unique identifier): FPC-7528B
Note: this is from an older generation of DKE panels, which still used Solomon Systech controller ICs.
DKE's website suggests that the latest DEPG0213BN displays may use Fitipower controllers instead.
diff --git a/src/graphics/niche/Drivers/EInk/DEPG0290BNS800.h b/src/graphics/niche/Drivers/EInk/DEPG0290BNS800.h
index 72062e0d6..257fed1a6 100644
--- a/src/graphics/niche/Drivers/EInk/DEPG0290BNS800.h
+++ b/src/graphics/niche/Drivers/EInk/DEPG0290BNS800.h
@@ -5,7 +5,7 @@ E-Ink display driver
- Manufacturer: DKE
- Size: 2.9 inch
- Resolution: 128px x 296px
- - Flex connector marking: FPC-7519 rev.b
+ - Flex connector marking (not a unique identifier): FPC-7519 rev.b
*/
diff --git a/src/graphics/niche/Drivers/EInk/GDEY0154D67.h b/src/graphics/niche/Drivers/EInk/GDEY0154D67.h
index fc4d93d12..93c641e44 100644
--- a/src/graphics/niche/Drivers/EInk/GDEY0154D67.h
+++ b/src/graphics/niche/Drivers/EInk/GDEY0154D67.h
@@ -5,7 +5,7 @@ E-Ink display driver
- Manufacturer: Goodisplay
- Size: 1.54 inch
- Resolution: 200px x 200px
- - Flex connector marking: FPC-B001
+ - Flex connector marking (not a unique identifier): FPC-B001
*/
diff --git a/src/graphics/niche/Drivers/EInk/GDEY0213B74.h b/src/graphics/niche/Drivers/EInk/GDEY0213B74.h
index 2212fe92a..1c36f295d 100644
--- a/src/graphics/niche/Drivers/EInk/GDEY0213B74.h
+++ b/src/graphics/niche/Drivers/EInk/GDEY0213B74.h
@@ -5,7 +5,9 @@ E-Ink display driver
- Manufacturer: Goodisplay
- Size: 2.13 inch
- Resolution: 250px x 122px
- - Flex connector marking: FPC-A002
+ - Flex connector marking (not a unique identifier):
+ - FPC-A002
+ - FPC-A005 20.06.15 TRX
*/
diff --git a/src/graphics/niche/Drivers/EInk/HINK_E042A87.h b/src/graphics/niche/Drivers/EInk/HINK_E042A87.h
index ac03b65ef..612072b50 100644
--- a/src/graphics/niche/Drivers/EInk/HINK_E042A87.h
+++ b/src/graphics/niche/Drivers/EInk/HINK_E042A87.h
@@ -5,7 +5,7 @@ E-Ink display driver
- Manufacturer: Holitech
- Size: 4.2 inch
- Resolution: 400px x 300px
- - Flex connector marking: HINK-E042A07-FPC-A1
+ - Flex connector marking (not a unique identifier): HINK-E042A07-FPC-A1
- Silver sticker with QR code, marked: HE042A87
Note: as of Feb. 2025, these panels are used for "WeActStudio 4.2in B&W" display modules
diff --git a/src/graphics/niche/Drivers/EInk/LCMEN2R13ECC1.h b/src/graphics/niche/Drivers/EInk/LCMEN2R13ECC1.h
index b78e3bcca..9fa6eaac9 100644
--- a/src/graphics/niche/Drivers/EInk/LCMEN2R13ECC1.h
+++ b/src/graphics/niche/Drivers/EInk/LCMEN2R13ECC1.h
@@ -5,7 +5,6 @@ E-Ink display driver
- Manufacturer: WISEVAST
- Size: 2.13 inch
- Resolution: 122px x 255px
- - Flex connector marking: Soldering connector, no connector is needed
*/
diff --git a/src/graphics/niche/Drivers/EInk/LCMEN2R13EFC1.h b/src/graphics/niche/Drivers/EInk/LCMEN2R13EFC1.h
index f9da202aa..499daef05 100644
--- a/src/graphics/niche/Drivers/EInk/LCMEN2R13EFC1.h
+++ b/src/graphics/niche/Drivers/EInk/LCMEN2R13EFC1.h
@@ -5,7 +5,7 @@ E-Ink display driver
- Manufacturer: Wisevast
- Size: 2.13 inch
- Resolution: 122px x 250px
- - Flex connector marking: HINK-E0213A162-FPC-A0 (Hidden, printed on back-side)
+ - Flex connector marking (not a unique identifier): HINK-E0213A162-FPC-A0 (Hidden, printed on back-side)
Note: this display uses an uncommon controller IC, Fitipower JD79656.
It is implemented as a "one-off", directly inheriting the EInk base class, unlike SSD16XX displays.
diff --git a/src/graphics/niche/Drivers/EInk/ZJY128296_029EAAMFGN.cpp b/src/graphics/niche/Drivers/EInk/ZJY128296_029EAAMFGN.cpp
new file mode 100644
index 000000000..a8f43420f
--- /dev/null
+++ b/src/graphics/niche/Drivers/EInk/ZJY128296_029EAAMFGN.cpp
@@ -0,0 +1,59 @@
+#include "./ZJY128296_029EAAMFGN.h"
+
+#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
+
+using namespace NicheGraphics::Drivers;
+
+// Map the display controller IC's output to the connected panel
+void ZJY128296_029EAAMFGN::configScanning()
+{
+ // "Driver output control"
+ // Scan gates from 0 to 295 (vertical resolution 296px)
+ sendCommand(0x01);
+ sendData(0x27); // Number of gates (295, bits 0-7)
+ sendData(0x01); // Number of gates (295, bit 8)
+ sendData(0x00); // (Do not invert scanning order)
+}
+
+// Specify which information is used to control the sequence of voltages applied to move the pixels
+// - For this display, configUpdateSequence() specifies that a suitable LUT will be loaded from
+// the controller IC's OTP memory, when the update procedure begins.
+void ZJY128296_029EAAMFGN::configWaveform()
+{
+ sendCommand(0x3C); // Border waveform:
+ sendData(0x05); // Screen border should follow LUT1 waveform (actively drive pixels white)
+
+ sendCommand(0x18); // Temperature sensor:
+ sendData(0x80); // Use internal temperature sensor to select an appropriate refresh waveform
+}
+
+void ZJY128296_029EAAMFGN::configUpdateSequence()
+{
+ switch (updateType) {
+ case FAST:
+ sendCommand(0x22); // Set "update sequence"
+ sendData(0xFF); // Will load LUT from OTP memory, Display mode 2 "differential refresh"
+ break;
+
+ case FULL:
+ default:
+ sendCommand(0x22); // Set "update sequence"
+ sendData(0xF7); // Will load LUT from OTP memory
+ break;
+ }
+}
+
+// Once the refresh operation has been started,
+// begin periodically polling the display to check for completion, using the normal Meshtastic threading code
+// Only used when refresh is "async"
+void ZJY128296_029EAAMFGN::detachFromUpdate()
+{
+ switch (updateType) {
+ case FAST:
+ return beginPolling(50, 300); // At least 300ms for fast refresh
+ case FULL:
+ default:
+ return beginPolling(100, 2000); // At least 2 seconds for full refresh
+ }
+}
+#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS
\ No newline at end of file
diff --git a/src/graphics/niche/Drivers/EInk/ZJY128296_029EAAMFGN.h b/src/graphics/niche/Drivers/EInk/ZJY128296_029EAAMFGN.h
new file mode 100644
index 000000000..27644e709
--- /dev/null
+++ b/src/graphics/niche/Drivers/EInk/ZJY128296_029EAAMFGN.h
@@ -0,0 +1,44 @@
+/*
+
+E-Ink display driver
+ - ZJY128296-029EAAMFGN
+ - Manufacturer: Zhongjingyuan
+ - Size: 2.9 inch
+ - Resolution: 128px x 296px
+ - Flex connector label (not a unique identifier): FPC-A005 20.06.15 TRX
+
+ Note: as of Feb. 2025, these panels are used for "WeActStudio 2.9in B&W" display modules
+
+*/
+
+#pragma once
+
+#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
+
+#include "configuration.h"
+
+#include "./SSD16XX.h"
+
+namespace NicheGraphics::Drivers
+{
+class ZJY128296_029EAAMFGN : public SSD16XX
+{
+ // Display properties
+ private:
+ static constexpr uint32_t width = 128;
+ static constexpr uint32_t height = 296;
+ static constexpr UpdateTypes supported = (UpdateTypes)(FULL | FAST);
+
+ public:
+ ZJY128296_029EAAMFGN() : SSD16XX(width, height, supported) {}
+
+ protected:
+ void configScanning() override;
+ void configWaveform() override;
+ void configUpdateSequence() override;
+ void detachFromUpdate() override;
+};
+
+} // namespace NicheGraphics::Drivers
+
+#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS
\ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index fa8f18d3a..627d67e54 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -337,12 +337,12 @@ void setup()
#ifdef LED_POWER
pinMode(LED_POWER, OUTPUT);
- digitalWrite(LED_POWER, HIGH);
+ digitalWrite(LED_POWER, LED_STATE_ON);
#endif
#ifdef USER_LED
pinMode(USER_LED, OUTPUT);
- digitalWrite(USER_LED, LOW);
+ digitalWrite(USER_LED, HIGH ^ LED_STATE_ON);
#endif
#if defined(T_DECK)
diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp
index f5b1b8c6a..f5bba1269 100644
--- a/src/mesh/NodeDB.cpp
+++ b/src/mesh/NodeDB.cpp
@@ -499,6 +499,21 @@ void NodeDB::installDefaultConfig(bool preserveKey = false)
true; // FIXME: maybe false in the future, and setting region to enable it. (unset region forces it off)
config.lora.override_duty_cycle = false;
config.lora.config_ok_to_mqtt = false;
+
+#ifdef USERPREFS_CONFIG_DEVICE_ROLE
+ // Restrict ROUTER*, LOST AND FOUND, and REPEATER roles for security reasons
+ if (IS_ONE_OF(USERPREFS_CONFIG_DEVICE_ROLE, meshtastic_Config_DeviceConfig_Role_ROUTER,
+ meshtastic_Config_DeviceConfig_Role_ROUTER_LATE, meshtastic_Config_DeviceConfig_Role_REPEATER,
+ meshtastic_Config_DeviceConfig_Role_LOST_AND_FOUND)) {
+ LOG_WARN("ROUTER roles are restricted, falling back to CLIENT role");
+ config.device.role = meshtastic_Config_DeviceConfig_Role_CLIENT;
+ } else {
+ config.device.role = USERPREFS_CONFIG_DEVICE_ROLE;
+ }
+#else
+ config.device.role = meshtastic_Config_DeviceConfig_Role_CLIENT; // Default to client.
+#endif
+
#ifdef USERPREFS_CONFIG_LORA_REGION
config.lora.region = USERPREFS_CONFIG_LORA_REGION;
#else
@@ -670,6 +685,11 @@ void NodeDB::installDefaultConfig(bool preserveKey = false)
}
#endif
+#ifdef USERPREFS_CONFIG_DEVICE_ROLE
+ // Apply role-specific defaults when role is set via user preferences
+ installRoleDefaults(config.device.role);
+#endif
+
initConfigIntervals();
}
@@ -1828,4 +1848,4 @@ void recordCriticalError(meshtastic_CriticalErrorCode code, uint32_t address, co
LOG_ERROR("A critical failure occurred, portduino is exiting");
exit(2);
#endif
-}
\ No newline at end of file
+}
diff --git a/src/mesh/generated/meshtastic/config.pb.cpp b/src/mesh/generated/meshtastic/config.pb.cpp
index 5512584a7..52a591f33 100644
--- a/src/mesh/generated/meshtastic/config.pb.cpp
+++ b/src/mesh/generated/meshtastic/config.pb.cpp
@@ -65,6 +65,8 @@ PB_BIND(meshtastic_Config_SessionkeyConfig, meshtastic_Config_SessionkeyConfig,
+
+
diff --git a/src/mesh/generated/meshtastic/config.pb.h b/src/mesh/generated/meshtastic/config.pb.h
index 9d7a96dc8..6851d42b1 100644
--- a/src/mesh/generated/meshtastic/config.pb.h
+++ b/src/mesh/generated/meshtastic/config.pb.h
@@ -88,6 +88,23 @@ typedef enum _meshtastic_Config_DeviceConfig_RebroadcastMode {
meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY = 5
} meshtastic_Config_DeviceConfig_RebroadcastMode;
+/* Defines buzzer behavior for audio feedback */
+typedef enum _meshtastic_Config_DeviceConfig_BuzzerMode {
+ /* Default behavior.
+ Buzzer is enabled for all audio feedback including button presses and alerts. */
+ meshtastic_Config_DeviceConfig_BuzzerMode_ALL_ENABLED = 0,
+ /* Disabled.
+ All buzzer audio feedback is disabled. */
+ meshtastic_Config_DeviceConfig_BuzzerMode_DISABLED = 1,
+ /* Notifications Only.
+ Buzzer is enabled only for notifications and alerts, but not for button presses.
+ External notification config determines the specifics of the notification behavior. */
+ meshtastic_Config_DeviceConfig_BuzzerMode_NOTIFICATIONS_ONLY = 2,
+ /* Non-notification system buzzer tones only.
+ Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts. */
+ meshtastic_Config_DeviceConfig_BuzzerMode_SYSTEM_ONLY = 3
+} meshtastic_Config_DeviceConfig_BuzzerMode;
+
/* Bit field of boolean configuration options, indicating which optional
fields to include when assembling POSITION messages.
Longitude, latitude, altitude, speed, heading, and DOP
@@ -335,6 +352,9 @@ typedef struct _meshtastic_Config_DeviceConfig {
char tzdef[65];
/* If true, disable the default blinking LED (LED_PIN) behavior on the device */
bool led_heartbeat_disabled;
+ /* Controls buzzer behavior for audio feedback
+ Defaults to ENABLED */
+ meshtastic_Config_DeviceConfig_BuzzerMode buzzer_mode;
} meshtastic_Config_DeviceConfig;
/* Position Config */
@@ -618,6 +638,10 @@ extern "C" {
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MAX meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_ARRAYSIZE ((meshtastic_Config_DeviceConfig_RebroadcastMode)(meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY+1))
+#define _meshtastic_Config_DeviceConfig_BuzzerMode_MIN meshtastic_Config_DeviceConfig_BuzzerMode_ALL_ENABLED
+#define _meshtastic_Config_DeviceConfig_BuzzerMode_MAX meshtastic_Config_DeviceConfig_BuzzerMode_SYSTEM_ONLY
+#define _meshtastic_Config_DeviceConfig_BuzzerMode_ARRAYSIZE ((meshtastic_Config_DeviceConfig_BuzzerMode)(meshtastic_Config_DeviceConfig_BuzzerMode_SYSTEM_ONLY+1))
+
#define _meshtastic_Config_PositionConfig_PositionFlags_MIN meshtastic_Config_PositionConfig_PositionFlags_UNSET
#define _meshtastic_Config_PositionConfig_PositionFlags_MAX meshtastic_Config_PositionConfig_PositionFlags_SPEED
#define _meshtastic_Config_PositionConfig_PositionFlags_ARRAYSIZE ((meshtastic_Config_PositionConfig_PositionFlags)(meshtastic_Config_PositionConfig_PositionFlags_SPEED+1))
@@ -669,6 +693,7 @@ extern "C" {
#define meshtastic_Config_DeviceConfig_role_ENUMTYPE meshtastic_Config_DeviceConfig_Role
#define meshtastic_Config_DeviceConfig_rebroadcast_mode_ENUMTYPE meshtastic_Config_DeviceConfig_RebroadcastMode
+#define meshtastic_Config_DeviceConfig_buzzer_mode_ENUMTYPE meshtastic_Config_DeviceConfig_BuzzerMode
#define meshtastic_Config_PositionConfig_gps_mode_ENUMTYPE meshtastic_Config_PositionConfig_GpsMode
@@ -692,7 +717,7 @@ extern "C" {
/* Initializer values for message structs */
#define meshtastic_Config_init_default {0, {meshtastic_Config_DeviceConfig_init_default}}
-#define meshtastic_Config_DeviceConfig_init_default {_meshtastic_Config_DeviceConfig_Role_MIN, 0, 0, 0, _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN, 0, 0, 0, 0, "", 0}
+#define meshtastic_Config_DeviceConfig_init_default {_meshtastic_Config_DeviceConfig_Role_MIN, 0, 0, 0, _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN, 0, 0, 0, 0, "", 0, _meshtastic_Config_DeviceConfig_BuzzerMode_MIN}
#define meshtastic_Config_PositionConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _meshtastic_Config_PositionConfig_GpsMode_MIN}
#define meshtastic_Config_PowerConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define meshtastic_Config_NetworkConfig_init_default {0, "", "", "", 0, _meshtastic_Config_NetworkConfig_AddressMode_MIN, false, meshtastic_Config_NetworkConfig_IpV4Config_init_default, "", 0, 0}
@@ -703,7 +728,7 @@ extern "C" {
#define meshtastic_Config_SecurityConfig_init_default {{0, {0}}, {0, {0}}, 0, {{0, {0}}, {0, {0}}, {0, {0}}}, 0, 0, 0, 0}
#define meshtastic_Config_SessionkeyConfig_init_default {0}
#define meshtastic_Config_init_zero {0, {meshtastic_Config_DeviceConfig_init_zero}}
-#define meshtastic_Config_DeviceConfig_init_zero {_meshtastic_Config_DeviceConfig_Role_MIN, 0, 0, 0, _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN, 0, 0, 0, 0, "", 0}
+#define meshtastic_Config_DeviceConfig_init_zero {_meshtastic_Config_DeviceConfig_Role_MIN, 0, 0, 0, _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN, 0, 0, 0, 0, "", 0, _meshtastic_Config_DeviceConfig_BuzzerMode_MIN}
#define meshtastic_Config_PositionConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _meshtastic_Config_PositionConfig_GpsMode_MIN}
#define meshtastic_Config_PowerConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0}
#define meshtastic_Config_NetworkConfig_init_zero {0, "", "", "", 0, _meshtastic_Config_NetworkConfig_AddressMode_MIN, false, meshtastic_Config_NetworkConfig_IpV4Config_init_zero, "", 0, 0}
@@ -726,6 +751,7 @@ extern "C" {
#define meshtastic_Config_DeviceConfig_disable_triple_click_tag 10
#define meshtastic_Config_DeviceConfig_tzdef_tag 11
#define meshtastic_Config_DeviceConfig_led_heartbeat_disabled_tag 12
+#define meshtastic_Config_DeviceConfig_buzzer_mode_tag 13
#define meshtastic_Config_PositionConfig_position_broadcast_secs_tag 1
#define meshtastic_Config_PositionConfig_position_broadcast_smart_enabled_tag 2
#define meshtastic_Config_PositionConfig_fixed_position_tag 3
@@ -849,7 +875,8 @@ X(a, STATIC, SINGULAR, BOOL, double_tap_as_button_press, 8) \
X(a, STATIC, SINGULAR, BOOL, is_managed, 9) \
X(a, STATIC, SINGULAR, BOOL, disable_triple_click, 10) \
X(a, STATIC, SINGULAR, STRING, tzdef, 11) \
-X(a, STATIC, SINGULAR, BOOL, led_heartbeat_disabled, 12)
+X(a, STATIC, SINGULAR, BOOL, led_heartbeat_disabled, 12) \
+X(a, STATIC, SINGULAR, UENUM, buzzer_mode, 13)
#define meshtastic_Config_DeviceConfig_CALLBACK NULL
#define meshtastic_Config_DeviceConfig_DEFAULT NULL
@@ -995,7 +1022,7 @@ extern const pb_msgdesc_t meshtastic_Config_SessionkeyConfig_msg;
/* Maximum encoded size of messages (where known) */
#define MESHTASTIC_MESHTASTIC_CONFIG_PB_H_MAX_SIZE meshtastic_Config_size
#define meshtastic_Config_BluetoothConfig_size 10
-#define meshtastic_Config_DeviceConfig_size 98
+#define meshtastic_Config_DeviceConfig_size 100
#define meshtastic_Config_DisplayConfig_size 32
#define meshtastic_Config_LoRaConfig_size 85
#define meshtastic_Config_NetworkConfig_IpV4Config_size 20
diff --git a/src/mesh/generated/meshtastic/device_ui.pb.h b/src/mesh/generated/meshtastic/device_ui.pb.h
index 5692a2749..3a8ddd3a4 100644
--- a/src/mesh/generated/meshtastic/device_ui.pb.h
+++ b/src/mesh/generated/meshtastic/device_ui.pb.h
@@ -55,6 +55,8 @@ typedef enum _meshtastic_Language {
meshtastic_Language_SLOVENIAN = 15,
/* Ukrainian */
meshtastic_Language_UKRAINIAN = 16,
+ /* Bulgarian */
+ meshtastic_Language_BULGARIAN = 17,
/* Simplified Chinese (experimental) */
meshtastic_Language_SIMPLIFIED_CHINESE = 30,
/* Traditional Chinese (experimental) */
diff --git a/src/mesh/generated/meshtastic/deviceonly.pb.h b/src/mesh/generated/meshtastic/deviceonly.pb.h
index 37f99d8b5..f78689cb2 100644
--- a/src/mesh/generated/meshtastic/deviceonly.pb.h
+++ b/src/mesh/generated/meshtastic/deviceonly.pb.h
@@ -360,7 +360,7 @@ extern const pb_msgdesc_t meshtastic_BackupPreferences_msg;
/* Maximum encoded size of messages (where known) */
/* meshtastic_NodeDatabase_size depends on runtime parameters */
#define MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_MAX_SIZE meshtastic_BackupPreferences_size
-#define meshtastic_BackupPreferences_size 2269
+#define meshtastic_BackupPreferences_size 2271
#define meshtastic_ChannelFile_size 718
#define meshtastic_DeviceState_size 1722
#define meshtastic_NodeInfoLite_size 196
diff --git a/src/mesh/generated/meshtastic/localonly.pb.h b/src/mesh/generated/meshtastic/localonly.pb.h
index bb2eefc04..ca8dcd5fb 100644
--- a/src/mesh/generated/meshtastic/localonly.pb.h
+++ b/src/mesh/generated/meshtastic/localonly.pb.h
@@ -187,7 +187,7 @@ extern const pb_msgdesc_t meshtastic_LocalModuleConfig_msg;
/* Maximum encoded size of messages (where known) */
#define MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_MAX_SIZE meshtastic_LocalConfig_size
-#define meshtastic_LocalConfig_size 745
+#define meshtastic_LocalConfig_size 747
#define meshtastic_LocalModuleConfig_size 669
#ifdef __cplusplus
diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h
index 5fc1cc4f5..06bc706aa 100644
--- a/src/mesh/generated/meshtastic/mesh.pb.h
+++ b/src/mesh/generated/meshtastic/mesh.pb.h
@@ -258,6 +258,12 @@ typedef enum _meshtastic_HardwareModel {
meshtastic_HardwareModel_SEEED_WIO_TRACKER_L1_EINK = 100,
/* Reserved ID for future and past use */
meshtastic_HardwareModel_QWANTZ_TINY_ARMS = 101,
+ /* *
+ Lilygo T-Deck Pro */
+ meshtastic_HardwareModel_T_DECK_PRO = 102,
+ /* *
+ Lilygo TLora Pager */
+ meshtastic_HardwareModel_T_LORA_PAGER = 103,
/* ------------------------------------------------------------------------------------------------------------------------------------------
Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
------------------------------------------------------------------------------------------------------------------------------------------ */
diff --git a/variants/diy/hydra/variant.h b/variants/diy/hydra/variant.h
index 60bb60beb..08e8cec05 100644
--- a/variants/diy/hydra/variant.h
+++ b/variants/diy/hydra/variant.h
@@ -9,6 +9,8 @@
#define GPS_POWER_TOGGLE // Moved definition from platformio.ini to here
#define BUTTON_PIN 39 // The middle button GPIO on the T-Beam
+// Note: On the ESP32 base version, gpio34-39 are input-only, and do not have internal pull-ups.
+// If 39 is not being used for a button, it is suggested to remove the #define.
#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
#define ADC_CHANNEL ADC1_GPIO35_CHANNEL
#define ADC_MULTIPLIER 1.85 // (R1 = 470k, R2 = 680k)