diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index b14290be2..000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-#trunk-ignore-all(yamllint/quoted-strings): required by dependabot syntax check
-version: 2
-updates:
- - package-ecosystem: docker
- directory: /.devcontainer
- schedule:
- interval: daily
- time: "05:00"
- timezone: US/Pacific
- - package-ecosystem: docker
- directory: /
- schedule:
- interval: daily
- time: "05:00"
- timezone: US/Pacific
- - package-ecosystem: gitsubmodule
- directory: /
- schedule:
- interval: daily
- time: "05:00"
- timezone: US/Pacific
- ignore:
- - dependency-name: protobufs
- - package-ecosystem: github-actions
- directory: /.github/workflows
- schedule:
- interval: daily
- time: "05:00"
- timezone: US/Pacific
diff --git a/.github/workflows/sec_sast_semgrep_cron.yml b/.github/workflows/sec_sast_semgrep_cron.yml
index db308c9f5..d7eef29b4 100644
--- a/.github/workflows/sec_sast_semgrep_cron.yml
+++ b/.github/workflows/sec_sast_semgrep_cron.yml
@@ -13,7 +13,7 @@ permissions:
jobs:
semgrep-full:
- runs-on: ubuntu-22.04
+ runs-on: ubuntu-24.04
container:
image: semgrep/semgrep
diff --git a/.github/workflows/sec_sast_semgrep_pull.yml b/.github/workflows/sec_sast_semgrep_pull.yml
index 527a5c076..3707c91b8 100644
--- a/.github/workflows/sec_sast_semgrep_pull.yml
+++ b/.github/workflows/sec_sast_semgrep_pull.yml
@@ -6,7 +6,7 @@ permissions: read-all
jobs:
semgrep-diff:
- runs-on: ubuntu-22.04
+ runs-on: ubuntu-24.04
container:
image: semgrep/semgrep
diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
index 3aa9628fc..e74c1a362 100644
--- a/.trunk/trunk.yaml
+++ b/.trunk/trunk.yaml
@@ -8,11 +8,11 @@ plugins:
uri: https://github.com/trunk-io/plugins
lint:
enabled:
+ - renovate@39.235.2
- prettier@3.5.3
- trufflehog@3.88.23
- yamllint@1.37.0
- bandit@1.8.3
- - checkov@3.2.398
- terrascan@1.19.9
- trivy@0.61.0
- taplo@0.9.3
diff --git a/arch/esp32/esp32.ini b/arch/esp32/esp32.ini
index df3778002..5e15cb451 100644
--- a/arch/esp32/esp32.ini
+++ b/arch/esp32/esp32.ini
@@ -2,7 +2,9 @@
[esp32_base]
extends = arduino_base
custom_esp32_kind = esp32
-platform = platformio/espressif32@6.10.0
+platform =
+ # renovate: datasource=custom.pio depName=platformio/espressif32 packageName=platformio/platform/espressif32
+ platformio/espressif32@6.10.0
build_src_filter =
${arduino_base.build_src_filter} - - - - -
@@ -45,11 +47,17 @@ lib_deps =
${networking_base.lib_deps}
${environmental_base.lib_deps}
${radiolib_base.lib_deps}
- https://github.com/meshtastic/esp32_https_server/archive/23665b3adc080a311dcbb586ed5941b5f94d6ea2.zip
+ # renovate: datasource=git-refs depName=meshtastic-esp32_https_server packageName=https://github.com/meshtastic/esp32_https_server gitBranch=master
+ https://github.com/meshtastic/esp32_https_server/archive/896f1771ceb5979987a0b41028bf1b4e7aad419b.zip
+ # renovate: datasource=custom.pio depName=NimBLE-Arduino packageName=h2zero/library/NimBLE-Arduino
h2zero/NimBLE-Arduino@^1.4.3
+ # renovate: datasource=git-refs depName=libpax packageName=https://github.com/dbinfrago/libpax gitBranch=master
https://github.com/dbinfrago/libpax/archive/3cdc0371c375676a97967547f4065607d4c53fd1.zip
+ # renovate: datasource=custom.pio depName=XPowersLib packageName=lewisxhe/library/XPowersLib
lewisxhe/XPowersLib@^0.2.7
+ # renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master
https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip
+ # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto
rweather/Crypto@^0.4.0
lib_ignore =
diff --git a/arch/esp32/esp32c6.ini b/arch/esp32/esp32c6.ini
index dba3bac08..e1cf955e8 100644
--- a/arch/esp32/esp32c6.ini
+++ b/arch/esp32/esp32c6.ini
@@ -1,6 +1,8 @@
[esp32c6_base]
extends = esp32_base
-platform = https://github.com/Jason2866/platform-espressif32/archive/22faa566df8c789000f8136cd8d0aca49617af55.zip
+platform =
+ # renovate: datasource=git-refs depName=ESP32c6 platform-espressif32 packageName=https://github.com/Jason2866/platform-espressif32 gitBranch=Arduino/IDF5
+ https://github.com/Jason2866/platform-espressif32/archive/22faa566df8c789000f8136cd8d0aca49617af55.zip
build_flags =
${arduino_base.build_flags}
-Wall
@@ -24,8 +26,11 @@ lib_deps =
${networking_base.lib_deps}
${environmental_base.lib_deps}
${radiolib_base.lib_deps}
+ # renovate: datasource=custom.pio depName=XPowersLib packageName=lewisxhe/library/XPowersLib
lewisxhe/XPowersLib@^0.2.7
+ # renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master
https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip
+ # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto
rweather/Crypto@^0.4.0
build_src_filter =
diff --git a/arch/esp32/esp32s2.ini b/arch/esp32/esp32s2.ini
index 40fdc461a..0f97408b8 100644
--- a/arch/esp32/esp32s2.ini
+++ b/arch/esp32/esp32s2.ini
@@ -16,4 +16,4 @@ build_flags =
lib_ignore =
${esp32_base.lib_ignore}
NimBLE-Arduino
- libpax
\ No newline at end of file
+ libpax
diff --git a/arch/esp32/esp32s3.ini b/arch/esp32/esp32s3.ini
index 1cd0e2033..8d8b6899e 100644
--- a/arch/esp32/esp32s3.ini
+++ b/arch/esp32/esp32s3.ini
@@ -3,4 +3,3 @@ extends = esp32_base
custom_esp32_kind = esp32s3
monitor_speed = 115200
-
diff --git a/arch/nrf52/nrf52.ini b/arch/nrf52/nrf52.ini
index ca12be6b1..d49d8920c 100644
--- a/arch/nrf52/nrf52.ini
+++ b/arch/nrf52/nrf52.ini
@@ -1,10 +1,14 @@
[nrf52_base]
; Instead of the standard nordicnrf52 platform, we use our fork which has our added variant files
-platform = platformio/nordicnrf52@^10.8.0
+platform =
+ # renovate: datasource=custom.pio depName=platformio/nordicnrf52 packageName=platformio/platform/nordicnrf52
+ platformio/nordicnrf52@^10.8.0
extends = arduino_base
platform_packages =
; our custom Git version until they merge our PR
+ # TODO renovate
platformio/framework-arduinoadafruitnrf52 @ https://github.com/meshtastic/Adafruit_nRF52_Arduino#e13f5820002a4fb2a5e6754b42ace185277e5adf
+ ; Don't renovate toolchain-gccarmnoneeabi
platformio/toolchain-gccarmnoneeabi@~1.90301.0
build_type = debug
@@ -28,4 +32,4 @@ lib_deps=
lib_ignore =
BluetoothOTA
- lvgl
\ No newline at end of file
+ lvgl
diff --git a/arch/nrf52/nrf52840.ini b/arch/nrf52/nrf52840.ini
index 0dab5d9ba..fb5ba9960 100644
--- a/arch/nrf52/nrf52840.ini
+++ b/arch/nrf52/nrf52840.ini
@@ -6,6 +6,7 @@ build_flags = ${nrf52_base.build_flags}
lib_deps =
${nrf52_base.lib_deps}
${environmental_base.lib_deps}
+ # renovate: datasource=git-refs depName=Kongduino-Adafruit_nRFCrypto packageName=https://github.com/Kongduino/Adafruit_nRFCrypto gitBranch=master
https://github.com/Kongduino/Adafruit_nRFCrypto/archive/e31a8825ea3300b163a0a3c1ddd5de34e10e1371.zip
; Common NRF52 debugging settings follow. See the Meshtastic developer docs for how to connect SWD debugging probes to your board.
diff --git a/arch/portduino/portduino.ini b/arch/portduino/portduino.ini
index e0488aeff..6df3854f4 100644
--- a/arch/portduino/portduino.ini
+++ b/arch/portduino/portduino.ini
@@ -1,6 +1,8 @@
; The Portduino based 'native' environment. Currently supported on Linux targets with real LoRa hardware (or simulated).
[portduino_base]
-platform = https://github.com/meshtastic/platform-native/archive/c5bd469ab9b5a6966321e09557b27d906961da63.zip
+platform =
+ # renovate: datasource=git-refs depName=platform-native packageName=https://github.com/meshtastic/platform-native gitBranch=develop
+ https://github.com/meshtastic/platform-native/archive/46f509b96ddce22d1bf38efc93319dfb3e4f5acf.zip
framework = arduino
build_src_filter =
@@ -24,9 +26,12 @@ lib_deps =
${env.lib_deps}
${networking_base.lib_deps}
${radiolib_base.lib_deps}
+ # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto
rweather/Crypto@^0.4.0
+ # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX
lovyan03/LovyanGFX@^1.2.0
- https://github.com/pine64/libch341-spi-userspace/archive/a9b17e3452f7fb747000d9b4ad4409155b39f6ef.zip
+ # renovate: datasource=git-refs depName=libch341-spi-userspace packageName=https://github.com/pine64/libch341-spi-userspace gitBranch=main
+ https://github.com/pine64/libch341-spi-userspace/archive/af9bc27c9c30fa90772279925b7c5913dff789b4.zip
build_flags =
${arduino_base.build_flags}
diff --git a/arch/rp2xx0/rp2040.ini b/arch/rp2xx0/rp2040.ini
index 33fcfb211..cd7e684b4 100644
--- a/arch/rp2xx0/rp2040.ini
+++ b/arch/rp2xx0/rp2040.ini
@@ -1,8 +1,13 @@
; Common settings for rp2040 Processor based targets
[rp2040_base]
-platform = https://github.com/maxgerhardt/platform-raspberrypi#76ecf3c7e9dd4503af0331154c4ca1cddc4b03e5 ; For arduino-pico >= 4.4.3
+platform =
+ # TODO renovate
+ https://github.com/maxgerhardt/platform-raspberrypi#76ecf3c7e9dd4503af0331154c4ca1cddc4b03e5
+ ; For arduino-pico >= 4.4.3
extends = arduino_base
-platform_packages = framework-arduinopico@https://github.com/earlephilhower/arduino-pico#4.4.3
+platform_packages =
+ # TODO renovate
+ framework-arduinopico@https://github.com/earlephilhower/arduino-pico#4.4.3
board_build.core = earlephilhower
board_build.filesystem_size = 0.5m
@@ -24,4 +29,5 @@ lib_deps =
${arduino_base.lib_deps}
${environmental_base.lib_deps}
${radiolib_base.lib_deps}
- rweather/Crypto
\ No newline at end of file
+ # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto
+ rweather/Crypto@0.4.0
diff --git a/arch/rp2xx0/rp2350.ini b/arch/rp2xx0/rp2350.ini
index 841035c80..1c7af8be4 100644
--- a/arch/rp2xx0/rp2350.ini
+++ b/arch/rp2xx0/rp2350.ini
@@ -1,8 +1,13 @@
-; Common settings for rp2040 Processor based targets
+; Common settings for rp2350 Processor based targets
[rp2350_base]
-platform = https://github.com/maxgerhardt/platform-raspberrypi#76ecf3c7e9dd4503af0331154c4ca1cddc4b03e5 ; For arduino-pico >= 4.4.3
+platform =
+ # TODO renovate
+ https://github.com/maxgerhardt/platform-raspberrypi#76ecf3c7e9dd4503af0331154c4ca1cddc4b03e5
+ ; For arduino-pico >= 4.4.3
extends = arduino_base
-platform_packages = framework-arduinopico@https://github.com/earlephilhower/arduino-pico#4.4.3
+platform_packages =
+ # TODO renovate
+ framework-arduinopico@https://github.com/earlephilhower/arduino-pico#4.4.3
board_build.core = earlephilhower
board_build.filesystem_size = 0.5m
@@ -21,4 +26,5 @@ lib_deps =
${arduino_base.lib_deps}
${environmental_base.lib_deps}
${radiolib_base.lib_deps}
- rweather/Crypto
\ No newline at end of file
+ # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto
+ rweather/Crypto@0.4.0
diff --git a/arch/stm32/stm32.ini b/arch/stm32/stm32.ini
index c1b58bb82..dd190c9d4 100644
--- a/arch/stm32/stm32.ini
+++ b/arch/stm32/stm32.ini
@@ -1,7 +1,11 @@
[stm32_base]
extends = arduino_base
-platform = ststm32
-platform_packages = platformio/framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/2.10.1.zip
+platform =
+ # renovate: datasource=custom.pio depName=platformio/ststm32 packageName=platformio/platform/ststm32
+ platformio/ststm32@19.1.0
+platform_packages =
+ # TODO renovate
+ platformio/framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/2.10.1.zip
extra_scripts =
${env.extra_scripts}
post:extra_scripts/extra_stm32.py
@@ -35,6 +39,7 @@ debug_tool = stlink
lib_deps =
${env.lib_deps}
${radiolib_base.lib_deps}
+ # renovate: datasource=git-refs depName=caveman99-stm32-Crypto packageName=https://github.com/caveman99/Crypto gitBranch=main
https://github.com/caveman99/Crypto/archive/eae9c768054118a9399690f8af202853d1ae8516.zip
lib_ignore =
diff --git a/platformio.ini b/platformio.ini
index 749aa94c7..3c052e6ad 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -56,12 +56,19 @@ build_flags = -Wno-missing-field-initializers
monitor_speed = 115200
monitor_filters = direct
lib_deps =
+ # renovate: datasource=git-refs depName=meshtastic-esp8266-oled-ssd1306 packageName=https://github.com/meshtastic/esp8266-oled-ssd1306 gitBranch=master
https://github.com/meshtastic/esp8266-oled-ssd1306/archive/0119501e9983bd894830b02f545c377ee08d66fe.zip
+ # renovate: datasource=custom.pio depName=OneButton packageName=mathertel/library/OneButton
mathertel/OneButton@2.6.1
+ # renovate: datasource=git-refs depName=meshtastic-arduino-fsm packageName=https://github.com/meshtastic/arduino-fsm gitBranch=master
https://github.com/meshtastic/arduino-fsm/archive/7db3702bf0cfe97b783d6c72595e3f38e0b19159.zip
+ # renovate: datasource=git-refs depName=meshtastic-TinyGPSPlus packageName=https://github.com/meshtastic/TinyGPSPlus gitBranch=master
https://github.com/meshtastic/TinyGPSPlus/archive/71a82db35f3b973440044c476d4bcdc673b104f4.zip
+ # renovate: datasource=git-refs depName=meshtastic-ArduinoThread packageName=https://github.com/meshtastic/ArduinoThread gitBranch=master
https://github.com/meshtastic/ArduinoThread/archive/7c3ee9e1951551b949763b1f5280f8db1fa4068d.zip
+ # renovate: datasource=custom.pio depName=Nanopb packageName=nanopb/library/Nanopb
nanopb/Nanopb@0.4.91
+ # renovate: datasource=custom.pio depName=ErriezCRC32 packageName=erriez/library/ErriezCRC32
erriez/ErriezCRC32@1.0.1
; Used for the code analysis in PIO Home / Inspect
@@ -77,6 +84,7 @@ check_flags =
framework = arduino
lib_deps =
${env.lib_deps}
+ # renovate: datasource=custom.pio depName=NonBlockingRTTTL packageName=end2endzone/library/NonBlockingRTTTL
end2endzone/NonBlockingRTTTL@1.3.0
build_flags = ${env.build_flags} -Os
build_src_filter = ${env.build_src_filter} - -
@@ -84,57 +92,98 @@ build_src_filter = ${env.build_src_filter} - -.+)$"],
+ "datasourceTemplate": "github-releases",
+ "depNameTemplate": "meshtastic/web",
+ "versioningTemplate": "semver-coerced"
+ },
+ {
+ "customType": "regex",
+ "description": "Match normal PIO dependencies",
+ "fileMatch": [".*\\.ini$"],
+ "matchStrings": [
+ "# renovate: datasource=(?.*?)(?: depName=(?.+?))? packageName=(?.+?)(?: versioning=(?[a-z-]+?))?\\s+?.+?@(?.+?)\\s"
+ ],
+ "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver-coerced{{/if}}"
+ },
+ {
+ "customType": "regex",
+ "description": "Match PIO zipped dependencies with github tag ref",
+ "fileMatch": [".*\\.ini$"],
+ "matchStrings": [
+ "# renovate: datasource=github-tags(?: depName=(?.+?))? packageName=(?.+?)(?: versioning=(?[a-z-]+?))?\\s+?https:\/\/.+?archive\/(?.+?).zip\\s"
+ ],
+ "datasourceTemplate": "github-tags",
+ "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver-coerced{{/if}}"
+ },
+ {
+ "customType": "regex",
+ "description": "Match PIO zipped dependencies with git commit ref",
+ "fileMatch": [".*\\.ini$"],
+ "matchStrings": [
+ "# renovate: datasource=git-refs(?: depName=(?.+?))? packageName=(?.+?)(?: versioning=(?[a-z-]+?))?\\sgitBranch=(?.+?)\\s+?https:\/\/.+?archive\/(?.+?).zip\\s"
+ ],
+ "datasourceTemplate": "git-refs",
+ "currentValueTemplate": "{{{gitBranch}}}",
+ "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}git{{/if}}"
+ }
+ ],
+ "packageRules": []
+}
diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp
index 689f5e204..55f62d8ad 100644
--- a/src/gps/GPS.cpp
+++ b/src/gps/GPS.cpp
@@ -810,13 +810,6 @@ void GPS::setPowerState(GPSPowerState newState, uint32_t sleepTime)
powerState = newState;
LOG_INFO("GPS power state move from %s to %s", getGPSPowerStateString(oldState), getGPSPowerStateString(newState));
-#ifdef HELTEC_MESH_NODE_T114
- if ((oldState == GPS_OFF || oldState == GPS_HARDSLEEP) && (newState != GPS_OFF && newState != GPS_HARDSLEEP)) {
- _serial_gps->begin(serialSpeeds[speedSelect]);
- } else if ((newState == GPS_OFF || newState == GPS_HARDSLEEP) && (oldState != GPS_OFF && oldState != GPS_HARDSLEEP)) {
- _serial_gps->end();
- }
-#endif
switch (newState) {
case GPS_ACTIVE:
case GPS_IDLE:
diff --git a/src/graphics/niche/Drivers/EInk/DEPG0154BNS800.cpp b/src/graphics/niche/Drivers/EInk/DEPG0154BNS800.cpp
deleted file mode 100644
index b8715ed1d..000000000
--- a/src/graphics/niche/Drivers/EInk/DEPG0154BNS800.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "./DEPG0154BNS800.h"
\ No newline at end of file
diff --git a/src/graphics/niche/Drivers/EInk/DEPG0154BNS800.h b/src/graphics/niche/Drivers/EInk/DEPG0154BNS800.h
deleted file mode 100644
index 62d42ef57..000000000
--- a/src/graphics/niche/Drivers/EInk/DEPG0154BNS800.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-
-E-Ink display driver
- - DEPG0154BNS800
- - Manufacturer: DKE
- - Size: 1.54 inch
- - Resolution: 152px x 152px
- - Flex connector marking: FPC7525
-
-*/
-
-#pragma once
-
-#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
-#include "configuration.h"
-
-#include "./SSD16XX.h"
-
-namespace NicheGraphics::Drivers
-{
-class DEPG0154BNS800 : public SSD16XX
-{
- // Display properties
- private:
- static constexpr uint32_t width = 152;
- static constexpr uint32_t height = 152;
- static constexpr UpdateTypes supported = (UpdateTypes)(FULL);
-
- public:
- DEPG0154BNS800() : SSD16XX(width, height, supported, 1) {} // Note: left edge of this display is offset by 1 byte
-};
-
-} // namespace NicheGraphics::Drivers
-#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS
\ No newline at end of file
diff --git a/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.cpp b/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.cpp
new file mode 100644
index 000000000..2c8df96ed
--- /dev/null
+++ b/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.cpp
@@ -0,0 +1,132 @@
+#include "./DEPG0213BNS800.h"
+
+#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
+
+using namespace NicheGraphics::Drivers;
+
+// Describes the operation performed when a "fast refresh" is performed
+// Source: Modified from GxEPD2 (GxEPD2_213_BN)
+static const uint8_t LUT_FAST[] = {
+ // 1 2 3
+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // B2B (Existing black pixels)
+ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // B2W (New white pixels)
+ 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // W2B (New black pixels)
+ 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // W2W (Existing white pixels)
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // VCOM
+
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // 1. Any pixels changing W2B or B2W. Two medium taps.
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2. All pixels. One short tap.
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 3. Cooldown
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, //
+};
+
+// How strongly the pixels are pulled and pushed
+void DEPG0213BNS800::configVoltages()
+{
+ switch (updateType) {
+ case FAST:
+ // Reference: display datasheet, GxEPD1
+ sendCommand(0x03); // Gate voltage
+ sendData(0x17); // VGH: 20V
+
+ // Reference: display datasheet, GxEPD1
+ sendCommand(0x04); // Source voltage
+ sendData(0x41); // VSH1: 15V
+ sendData(0x00); // VSH2: NA
+ sendData(0x32); // VSL: -15V
+
+ // GxEPD1 sets this at -1.2V, but that seems to be drive the pixels very hard
+ sendCommand(0x2C); // VCOM voltage
+ sendData(0x08); // VCOM: -0.2V
+ break;
+
+ case FULL:
+ default:
+ // From OTP memory
+ break;
+ }
+}
+
+// Load settings about how the pixels are moved from old state to new state during a refresh
+// - manually specified,
+// - or with stored values from displays OTP memory
+void DEPG0213BNS800::configWaveform()
+{
+ switch (updateType) {
+ case FAST:
+ sendCommand(0x3C); // Border waveform:
+ sendData(0x80); // VSS
+
+ sendCommand(0x32); // Write LUT register from MCU:
+ sendData(LUT_FAST, sizeof(LUT_FAST)); // (describes operation for a FAST refresh)
+ break;
+
+ case FULL:
+ default:
+ // From OTP memory
+ break;
+ }
+}
+
+// Describes the sequence of events performed by the displays controller IC during a refresh
+// Includes "power up", "load settings from memory", "update the pixels", etc
+void DEPG0213BNS800::configUpdateSequence()
+{
+ switch (updateType) {
+ case FAST:
+ sendCommand(0x22); // Set "update sequence"
+ sendData(0xCF); // Differential, use manually loaded waveform
+ break;
+
+ case FULL:
+ default:
+ sendCommand(0x22); // Set "update sequence"
+ sendData(0xF7); // Non-differential, load waveform from OTP
+ 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 DEPG0213BNS800::detachFromUpdate()
+{
+ switch (updateType) {
+ case FAST:
+ return beginPolling(50, 500); // At least 500ms, then poll every 50ms
+ case FULL:
+ default:
+ return beginPolling(100, 3500); // At least 3500ms, then poll every 100ms
+ }
+}
+
+// For this display, we do not need to re-write the new image.
+// We're overriding SSD16XX::finalizeUpdate to make this small optimization.
+// The display does also work just fine with the generic SSD16XX method, though.
+void DEPG0213BNS800::finalizeUpdate()
+{
+ // Put a copy of the image into the "old memory".
+ // Used with differential refreshes (e.g. FAST update), to determine which px need to move, and which can remain in place
+ // We need to keep the "old memory" up to date, because don't know whether next refresh will be FULL or FAST etc.
+ if (updateType != FULL) {
+ // writeNewImage(); // Not required for this display
+ writeOldImage();
+ sendCommand(0x7F); // Terminate image write without update
+ wait();
+ }
+
+ // Enter deep-sleep to save a few µA
+ // Waking from this requires that display's reset pin is broken out
+ if (pin_rst != 0xFF)
+ deepSleep();
+}
+#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS
\ No newline at end of file
diff --git a/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.h b/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.h
new file mode 100644
index 000000000..e1bb96450
--- /dev/null
+++ b/src/graphics/niche/Drivers/EInk/DEPG0213BNS800.h
@@ -0,0 +1,44 @@
+/*
+
+E-Ink display driver
+ - DEPG0213BNS800
+ - Manufacturer: DKE
+ - Size: 2.13 inch
+ - Resolution: 122px x 250px
+ - Flex connector marking: 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.
+*/
+
+#pragma once
+
+#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
+
+#include "configuration.h"
+
+#include "./SSD16XX.h"
+
+namespace NicheGraphics::Drivers
+{
+class DEPG0213BNS800 : public SSD16XX
+{
+ // Display properties
+ private:
+ static constexpr uint32_t width = 122;
+ static constexpr uint32_t height = 250;
+ static constexpr UpdateTypes supported = (UpdateTypes)(FULL | FAST);
+
+ public:
+ DEPG0213BNS800() : SSD16XX(width, height, supported, 1) {} // Note: left edge of this display is offset by 1 byte
+
+ protected:
+ void configVoltages() override;
+ void configWaveform() override;
+ void configUpdateSequence() override;
+ void detachFromUpdate() override;
+ void finalizeUpdate() override; // Only overriden for a slight optimization
+};
+
+} // namespace NicheGraphics::Drivers
+#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS
\ No newline at end of file
diff --git a/src/graphics/niche/Drivers/EInk/DEPG0290BNS800.cpp b/src/graphics/niche/Drivers/EInk/DEPG0290BNS800.cpp
index 5f3a05670..15134d5ad 100644
--- a/src/graphics/niche/Drivers/EInk/DEPG0290BNS800.cpp
+++ b/src/graphics/niche/Drivers/EInk/DEPG0290BNS800.cpp
@@ -116,5 +116,10 @@ void DEPG0290BNS800::finalizeUpdate()
sendCommand(0x7F); // Terminate image write without update
wait();
}
+
+ // Enter deep-sleep to save a few µA
+ // Waking from this requires that display's reset pin is broken out
+ if (pin_rst != 0xFF)
+ deepSleep();
}
#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS
\ No newline at end of file
diff --git a/src/graphics/niche/Drivers/EInk/SSD16XX.cpp b/src/graphics/niche/Drivers/EInk/SSD16XX.cpp
index 5a5397dbd..a2357a80b 100644
--- a/src/graphics/niche/Drivers/EInk/SSD16XX.cpp
+++ b/src/graphics/niche/Drivers/EInk/SSD16XX.cpp
@@ -242,5 +242,18 @@ void SSD16XX::finalizeUpdate()
sendCommand(0x7F); // Terminate image write without update
wait();
}
+
+ // Enter deep-sleep to save a few µA
+ // Waking from this requires that display's reset pin is broken out
+ if (pin_rst != 0xFF)
+ deepSleep();
+}
+
+// Enter a lower-power state
+// May only save a few µA..
+void SSD16XX::deepSleep()
+{
+ sendCommand(0x10); // Enter deep sleep
+ sendData(0x01); // Mode 1: preserve image RAM
}
#endif // MESHTASTIC_INCLUDE_NICHE_GRAPHICS
\ No newline at end of file
diff --git a/src/graphics/niche/Drivers/EInk/SSD16XX.h b/src/graphics/niche/Drivers/EInk/SSD16XX.h
index 799a378c0..3f92818ce 100644
--- a/src/graphics/niche/Drivers/EInk/SSD16XX.h
+++ b/src/graphics/niche/Drivers/EInk/SSD16XX.h
@@ -44,6 +44,7 @@ class SSD16XX : public EInk
virtual void detachFromUpdate();
virtual bool isUpdateDone() override;
virtual void finalizeUpdate() override;
+ virtual void deepSleep();
protected:
uint8_t bufferOffsetX = 0; // In bytes. Panel x=0 does not always align with controller x=0. Quirky internal wiring?
diff --git a/src/graphics/niche/Inputs/TwoButton.cpp b/src/graphics/niche/Inputs/TwoButton.cpp
index b270d56cf..1e91d9080 100644
--- a/src/graphics/niche/Inputs/TwoButton.cpp
+++ b/src/graphics/niche/Inputs/TwoButton.cpp
@@ -98,9 +98,8 @@ void TwoButton::setWiring(uint8_t whichButton, uint8_t pin, bool internalPullup)
assert(whichButton < 2);
buttons[whichButton].pin = pin;
buttons[whichButton].activeLogic = LOW; // Unimplemented
- buttons[whichButton].mode = internalPullup ? INPUT_PULLUP : INPUT;
- pinMode(buttons[whichButton].pin, buttons[whichButton].mode);
+ pinMode(buttons[whichButton].pin, internalPullup ? INPUT_PULLUP : INPUT);
}
void TwoButton::setTiming(uint8_t whichButton, uint32_t debounceMs, uint32_t longpressMs)
@@ -299,7 +298,9 @@ int TwoButton::afterLightSleep(esp_sleep_wakeup_cause_t cause)
// Manually trigger the button-down ISR
// - during light sleep, our ISR is disabled
// - if light sleep ends by button press, pretend our own ISR caught it
- if (cause == ESP_SLEEP_WAKEUP_GPIO)
+ // - need to manually confirm by reading pin ourselves, to avoid occasional false positives
+ // (false positive only when using internal pullup resistors?)
+ if (cause == ESP_SLEEP_WAKEUP_GPIO && digitalRead(buttons[0].pin) == buttons[0].activeLogic)
isrPrimary();
return 0; // Indicates success
diff --git a/src/graphics/niche/Inputs/TwoButton.h b/src/graphics/niche/Inputs/TwoButton.h
index f1e18dd89..ae66adf96 100644
--- a/src/graphics/niche/Inputs/TwoButton.h
+++ b/src/graphics/niche/Inputs/TwoButton.h
@@ -35,7 +35,7 @@ class TwoButton : protected concurrency::OSThread
static TwoButton *getInstance(); // Create or get the singleton instance
void start(); // Start handling button input
void stop(); // Stop handling button input (disconnect ISRs for sleep)
- void setWiring(uint8_t whichButton, uint8_t pin, bool internalPulldown = false);
+ void setWiring(uint8_t whichButton, uint8_t pin, bool internalPullup = false);
void setTiming(uint8_t whichButton, uint32_t debounceMs, uint32_t longpressMs);
void setHandlerDown(uint8_t whichButton, Callback onDown);
void setHandlerUp(uint8_t whichButton, Callback onUp);
@@ -65,7 +65,6 @@ class TwoButton : protected concurrency::OSThread
// Per-button config
uint8_t pin = 0xFF; // 0xFF: unset
bool activeLogic = LOW; // Active LOW by default. Currently unimplemented.
- uint8_t mode = INPUT; // Whether to use internal pull up / pull down resistors
uint32_t debounceLength = 50; // Minimum length for shortpress, in ms
uint32_t longpressLength = 500; // How long after button down to fire longpress, in ms
volatile State state = State::REST; // Internal state
diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp
index b8b7ee610..2cc3007a2 100644
--- a/src/mesh/Router.cpp
+++ b/src/mesh/Router.cpp
@@ -283,11 +283,6 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
abortSendAndNak(encodeResult, p);
return encodeResult; // FIXME - this isn't a valid ErrorCode
}
-#if HAS_UDP_MULTICAST
- if (udpThread && config.network.enabled_protocols & meshtastic_Config_NetworkConfig_ProtocolFlags_UDP_BROADCAST) {
- udpThread->onSend(const_cast(p));
- }
-#endif
#if !MESHTASTIC_EXCLUDE_MQTT
// Only publish to MQTT if we're the original transmitter of the packet
if (moduleConfig.mqtt.enabled && isFromUs(p) && mqtt) {
@@ -297,6 +292,12 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
packetPool.release(p_decoded);
}
+#if HAS_UDP_MULTICAST
+ if (udpThread && config.network.enabled_protocols & meshtastic_Config_NetworkConfig_ProtocolFlags_UDP_BROADCAST) {
+ udpThread->onSend(const_cast(p));
+ }
+#endif
+
assert(iface); // This should have been detected already in sendLocal (or we just received a packet from outside)
return iface->send(p);
}
diff --git a/variants/ELECROW-ThinkNode-M2/variant.h b/variants/ELECROW-ThinkNode-M2/variant.h
index 55f35e498..a6bb40f1a 100644
--- a/variants/ELECROW-ThinkNode-M2/variant.h
+++ b/variants/ELECROW-ThinkNode-M2/variant.h
@@ -4,7 +4,7 @@
#define PIN_BUTTON1 47 // 功能键
#define PIN_BUTTON2 4 // 电源键
-#define LED_PIN_POWER 6
+#define LED_POWER 6
#define ADC_V 42
// USB_CHECK
#define EXT_PWR_DETECT 7
diff --git a/variants/diy/v1/variant.h b/variants/diy/v1/variant.h
index 4802dbe89..8a2df3f2b 100644
--- a/variants/diy/v1/variant.h
+++ b/variants/diy/v1/variant.h
@@ -53,4 +53,5 @@
// Internally the TTGO module hooks the SX126x-DIO2 in to control the TX/RX switch
// (which is the default for the sx1262interface code)
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
+#define TCXO_OPTIONAL // make it so that the firmware can try both TCXO and XTAL
#endif
diff --git a/variants/diy/v1_1/variant.h b/variants/diy/v1_1/variant.h
index 8a006d0d2..1c8110301 100644
--- a/variants/diy/v1_1/variant.h
+++ b/variants/diy/v1_1/variant.h
@@ -54,4 +54,5 @@
// Internally the TTGO module hooks the SX126x-DIO2 in to control the TX/RX switch
// (which is the default for the sx1262interface code)
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
+#define TCXO_OPTIONAL // make it so that the firmware can try both TCXO and XTAL
#endif
diff --git a/variants/t-echo/nicheGraphics.h b/variants/t-echo/nicheGraphics.h
index f5dde6b19..5862dcdfb 100644
--- a/variants/t-echo/nicheGraphics.h
+++ b/variants/t-echo/nicheGraphics.h
@@ -112,7 +112,7 @@ void setupNicheGraphics()
// Setup the capacitive touch button
// - short: momentary backlight
// - long: latch backlight on
- buttons->setWiring(TOUCH_BUTTON, PIN_BUTTON_TOUCH, LOW);
+ buttons->setWiring(TOUCH_BUTTON, PIN_BUTTON_TOUCH);
buttons->setTiming(TOUCH_BUTTON, 50, 5000); // 5 seconds before latch - limited by T-Echo's capacitive touch IC
buttons->setHandlerDown(TOUCH_BUTTON, [backlight]() {
backlight->peek();
diff --git a/variants/tlora_t3s3_epaper/nicheGraphics.h b/variants/tlora_t3s3_epaper/nicheGraphics.h
new file mode 100644
index 000000000..55bb9a203
--- /dev/null
+++ b/variants/tlora_t3s3_epaper/nicheGraphics.h
@@ -0,0 +1,102 @@
+#pragma once
+
+#include "configuration.h"
+
+#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
+
+// InkHUD-specific components
+// ---------------------------
+#include "graphics/niche/InkHUD/InkHUD.h"
+
+// Applets
+#include "graphics/niche/InkHUD/Applets/User/AllMessage/AllMessageApplet.h"
+#include "graphics/niche/InkHUD/Applets/User/DM/DMApplet.h"
+#include "graphics/niche/InkHUD/Applets/User/Heard/HeardApplet.h"
+#include "graphics/niche/InkHUD/Applets/User/Positions/PositionsApplet.h"
+#include "graphics/niche/InkHUD/Applets/User/RecentsList/RecentsListApplet.h"
+#include "graphics/niche/InkHUD/Applets/User/ThreadedMessage/ThreadedMessageApplet.h"
+
+// #include "graphics/niche/InkHUD/Applets/Examples/BasicExample/BasicExampleApplet.h"
+// #include "graphics/niche/InkHUD/Applets/Examples/NewMsgExample/NewMsgExampleApplet.h"
+
+// Shared NicheGraphics components
+// --------------------------------
+#include "graphics/niche/Drivers/EInk/DEPG0213BNS800.h"
+#include "graphics/niche/Inputs/TwoButton.h"
+
+#include "graphics/niche/Fonts/FreeSans6pt7b.h"
+#include "graphics/niche/Fonts/FreeSans6pt8bCyrillic.h"
+#include
+
+void setupNicheGraphics()
+{
+ using namespace NicheGraphics;
+
+ // SPI
+ // -----------------------------
+
+ // Display is connected to HSPI
+ SPIClass *hspi = new SPIClass(HSPI);
+ hspi->begin(PIN_EINK_SCLK, -1, PIN_EINK_MOSI, PIN_EINK_CS);
+
+ // E-Ink Driver
+ // -----------------------------
+
+ // Use E-Ink driver
+ Drivers::EInk *driver = new Drivers::DEPG0213BNS800;
+ driver->begin(hspi, PIN_EINK_DC, PIN_EINK_CS, PIN_EINK_BUSY, PIN_EINK_RES);
+
+ // InkHUD
+ // ----------------------------
+
+ InkHUD::InkHUD *inkhud = InkHUD::InkHUD::getInstance();
+
+ // Set the driver
+ inkhud->setDriver(driver);
+
+ // Set how many FAST updates per FULL update
+ // Set how unhealthy additional FAST updates beyond this number are
+ inkhud->setDisplayResilience(15, 1.5);
+
+ // Prepare fonts
+ InkHUD::Applet::fontLarge = InkHUD::AppletFont(FreeSans9pt7b);
+ InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt7b);
+ /*
+ // Font localization demo: Cyrillic
+ InkHUD::Applet::fontSmall = InkHUD::AppletFont(FreeSans6pt8bCyrillic);
+ InkHUD::Applet::fontSmall.addSubstitutionsWin1251();
+ */
+
+ // Customize default settings
+ inkhud->persistence->settings.userTiles.maxCount = 2; // How many tiles can the display handle?
+ inkhud->persistence->settings.rotation = 3; // 270 degrees clockwise
+ inkhud->persistence->settings.userTiles.count = 1; // One tile only by default, keep things simple for new users
+
+ // Pick applets
+ inkhud->addApplet("All Messages", new InkHUD::AllMessageApplet, true, true); // Activated, autoshown
+ inkhud->addApplet("DMs", new InkHUD::DMApplet); // Inactive
+ inkhud->addApplet("Channel 0", new InkHUD::ThreadedMessageApplet(0)); // Inactive
+ inkhud->addApplet("Channel 1", new InkHUD::ThreadedMessageApplet(1)); // Inactive
+ inkhud->addApplet("Positions", new InkHUD::PositionsApplet, true); // Activated
+ inkhud->addApplet("Recents List", new InkHUD::RecentsListApplet); // Inactive
+ inkhud->addApplet("Heard", new InkHUD::HeardApplet, true, false, 0); // Activated, not autoshown, default on tile 0
+ // inkhud->addApplet("Basic", new InkHUD::BasicExampleApplet);
+ // inkhud->addApplet("NewMsg", new InkHUD::NewMsgExampleApplet);
+
+ // Start running InkHUD
+ inkhud->begin();
+
+ // Buttons
+ // --------------------------
+
+ Inputs::TwoButton *buttons = Inputs::TwoButton::getInstance(); // Shared NicheGraphics component
+
+ // Setup the main user button
+ buttons->setWiring(0, Inputs::TwoButton::getUserButtonPin(), true);
+ buttons->setHandlerShortPress(0, []() { InkHUD::InkHUD::getInstance()->shortpress(); });
+ buttons->setHandlerLongPress(0, []() { InkHUD::InkHUD::getInstance()->longpress(); });
+
+ buttons->start();
+}
+
+#endif
\ No newline at end of file
diff --git a/variants/tlora_t3s3_epaper/platformio.ini b/variants/tlora_t3s3_epaper/platformio.ini
index 87351e586..957c37b95 100644
--- a/variants/tlora_t3s3_epaper/platformio.ini
+++ b/variants/tlora_t3s3_epaper/platformio.ini
@@ -7,6 +7,7 @@ upload_protocol = esptool
build_flags =
${esp32_base.build_flags} -D TLORA_T3S3_EPAPER -I variants/tlora_t3s3_epaper
-DGPS_POWER_TOGGLE
+ -DUSE_EINK
-DEINK_DISPLAY_MODEL=GxEPD2_213_BN
-DEINK_WIDTH=250
-DEINK_HEIGHT=122
@@ -16,3 +17,21 @@ build_flags =
lib_deps =
${esp32s3_base.lib_deps}
https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip
+
+[env:tlora-t3s3-epaper-inkhud]
+extends = esp32s3_base, inkhud
+board = tlora-t3s3-v1
+board_check = true
+upload_protocol = esptool
+build_src_filter =
+ ${esp32_base.build_src_filter}
+ ${inkhud.build_src_filter}
+build_flags =
+ ${esp32s3_base.build_flags}
+ ${inkhud.build_flags}
+ -I variants/tlora_t3s3_epaper
+ -D TLORA_T3S3_EPAPER
+ -D MAX_THREADS=40 ; Required if used with WiFi
+lib_deps =
+ ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
+ ${esp32s3_base.lib_deps}
\ No newline at end of file
diff --git a/variants/tlora_t3s3_epaper/variant.h b/variants/tlora_t3s3_epaper/variant.h
index 732869b20..1ed505420 100644
--- a/variants/tlora_t3s3_epaper/variant.h
+++ b/variants/tlora_t3s3_epaper/variant.h
@@ -2,7 +2,6 @@
#define SDCARD_USE_SPI1
// Display (E-Ink)
-#define USE_EINK
#define PIN_EINK_CS 15
#define PIN_EINK_BUSY 48
#define PIN_EINK_DC 16