From 685f75234b3669c6d07ae6ff5f659e36b11edc14 Mon Sep 17 00:00:00 2001 From: Florent Date: Sun, 24 Aug 2025 13:06:19 +0200 Subject: [PATCH 01/10] let users compile their projects against meshcore as a lib --- build_as_lib.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ library.json | 16 +++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 build_as_lib.py create mode 100644 library.json diff --git a/build_as_lib.py b/build_as_lib.py new file mode 100644 index 00000000..93593cdb --- /dev/null +++ b/build_as_lib.py @@ -0,0 +1,53 @@ +from os.path import join, realpath, exists +import shutil, os + +Import("env") + +platform_stm32=False +platform_esp32=False +platform_nrf52=False +platform_rp2040=False + +src_filter = [] +src_filter.append("+<*>") +src_filter.append("-") # don't build with ui for now ... + +for item in env.get("CPPDEFINES", []): + if isinstance(item, str) and item == "STM32_PLATFORM": + # add STM32 specific sources + env.Append(CPPPATH=[realpath("src/helpers/stm32")]) + platform_stm32=True + env.Append(BUILD_FLAGS=["-I src/helpers/stm32"]) + elif isinstance(item, str) and item == "ESP32": + platform_esp32=True + env.Append(CPPPATH=[realpath("src/helpers/esp32")]) + env.Append(BUILD_FLAGS=["-I src/helpers/esp32"]) + elif isinstance(item, str) and item == "WIO_E5_DEV_VARIANT": + env.Append(BUILD_FLAGS=["-I variants/wio-e5-dev"]) + src_filter.append("+<../variants/wio-e5-dev>") + elif isinstance(item, str) and item == "RAK_3X72_VARIANT": + env.Append(BUILD_FLAGS=["-I variants/rak3x72"]) + src_filter.append("+<../variants/rak3x72>") + elif isinstance(item, str) and item == "XIAO_S3_WIO_VARIANT": + env.Append(BUILD_FLAGS=["-I variants/xiao_s3_wio"]) + src_filter.append("+<../variants/xiao_s3_wio>") + elif isinstance(item, str) and item == "XIAO_C6_VARIANT": + env.Append(BUILD_FLAGS=["-I variants/xiao_c6"]) + src_filter.append("+<../variants/xiao_c6>") + elif isinstance(item, str) and item == "GENERIC_ESPNOW_VARIANT": + env.Append(BUILD_FLAGS=["-I variants/generic_espnow"]) + src_filter.append("+<../variants/generic_espnow>") + src_filter.append("+") + +if not platform_stm32: + src_filter.append("-") +if not platform_esp32: + src_filter.append("-") +if not platform_nrf52: + src_filter.append("-") +if not platform_rp2040: + src_filter.append("-") + +env.Replace(SRC_FILTER=src_filter) + +print (env.Dump()) diff --git a/library.json b/library.json new file mode 100644 index 00000000..982983a3 --- /dev/null +++ b/library.json @@ -0,0 +1,16 @@ +{ + "name": "MeshCore", + "version" : "1.7.4", + "dependencies": { + "SPI": "*", + "Wire": "*", + "jgromes/RadioLib": "^7.1.2", + "rweather/Crypto": "^0.4.0", + "adafruit/RTClib": "^2.1.3", + "melopero/Melopero RV3028": "^1.1.0", + "electroniccats/CayenneLPP": "1.4.0" + }, + "build": { + "extraScript": "build_as_lib.py" + } +} \ No newline at end of file From 228bac0add4f3cf175fee950a7e9b76ff006a7b6 Mon Sep 17 00:00:00 2001 From: Florent Date: Sun, 24 Aug 2025 13:09:55 +0200 Subject: [PATCH 02/10] simplify src_filter creation --- build_as_lib.py | 67 ++++++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 45 deletions(-) diff --git a/build_as_lib.py b/build_as_lib.py index 93593cdb..f3410625 100644 --- a/build_as_lib.py +++ b/build_as_lib.py @@ -1,53 +1,30 @@ -from os.path import join, realpath, exists -import shutil, os +from os.path import realpath -Import("env") +Import("env") # type: ignore +menv=env # type: ignore -platform_stm32=False -platform_esp32=False -platform_nrf52=False -platform_rp2040=False +src_filter = [ + '+<*.cpp>', + '+', + '+', + '+', +] -src_filter = [] -src_filter.append("+<*>") -src_filter.append("-") # don't build with ui for now ... - -for item in env.get("CPPDEFINES", []): +for item in menv.get("CPPDEFINES", []): if isinstance(item, str) and item == "STM32_PLATFORM": # add STM32 specific sources - env.Append(CPPPATH=[realpath("src/helpers/stm32")]) - platform_stm32=True - env.Append(BUILD_FLAGS=["-I src/helpers/stm32"]) + menv.Append(CPPPATH=[realpath("src/helpers/stm32")]) + menv.Append(BUILD_FLAGS=["-I src/helpers/stm32"]) + src_filter.append("+") elif isinstance(item, str) and item == "ESP32": - platform_esp32=True - env.Append(CPPPATH=[realpath("src/helpers/esp32")]) - env.Append(BUILD_FLAGS=["-I src/helpers/esp32"]) - elif isinstance(item, str) and item == "WIO_E5_DEV_VARIANT": - env.Append(BUILD_FLAGS=["-I variants/wio-e5-dev"]) - src_filter.append("+<../variants/wio-e5-dev>") - elif isinstance(item, str) and item == "RAK_3X72_VARIANT": - env.Append(BUILD_FLAGS=["-I variants/rak3x72"]) - src_filter.append("+<../variants/rak3x72>") - elif isinstance(item, str) and item == "XIAO_S3_WIO_VARIANT": - env.Append(BUILD_FLAGS=["-I variants/xiao_s3_wio"]) - src_filter.append("+<../variants/xiao_s3_wio>") - elif isinstance(item, str) and item == "XIAO_C6_VARIANT": - env.Append(BUILD_FLAGS=["-I variants/xiao_c6"]) - src_filter.append("+<../variants/xiao_c6>") - elif isinstance(item, str) and item == "GENERIC_ESPNOW_VARIANT": - env.Append(BUILD_FLAGS=["-I variants/generic_espnow"]) - src_filter.append("+<../variants/generic_espnow>") - src_filter.append("+") + menv.Append(CPPPATH=[realpath("src/helpers/esp32")]) + menv.Append(BUILD_FLAGS=["-I src/helpers/esp32"]) + src_filter.append("+") + elif isinstance(item, tuple) and item[0] == "MC_VARIANT": + variant_name = item[1] + menv.Append(BUILD_FLAGS=[f"-I variants/{variant_name}"]) + src_filter.append(f"+<../variants/{variant_name}>") -if not platform_stm32: - src_filter.append("-") -if not platform_esp32: - src_filter.append("-") -if not platform_nrf52: - src_filter.append("-") -if not platform_rp2040: - src_filter.append("-") +menv.Replace(SRC_FILTER=src_filter) -env.Replace(SRC_FILTER=src_filter) - -print (env.Dump()) +#print (menv.Dump()) From b88a360adab85851cfab4bdcc732ee82f7b521be Mon Sep 17 00:00:00 2001 From: Florent Date: Sun, 24 Aug 2025 14:47:03 +0200 Subject: [PATCH 03/10] lib_build: add nrf52 and RP2040 --- build_as_lib.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/build_as_lib.py b/build_as_lib.py index f3410625..da4337c0 100644 --- a/build_as_lib.py +++ b/build_as_lib.py @@ -6,20 +6,39 @@ menv=env # type: ignore src_filter = [ '+<*.cpp>', '+', + '+' '+', '+', ] +# add build and include dirs according to CPPDEFINES for item in menv.get("CPPDEFINES", []): + + # STM32 if isinstance(item, str) and item == "STM32_PLATFORM": - # add STM32 specific sources menv.Append(CPPPATH=[realpath("src/helpers/stm32")]) menv.Append(BUILD_FLAGS=["-I src/helpers/stm32"]) src_filter.append("+") + + # ESP32 elif isinstance(item, str) and item == "ESP32": menv.Append(CPPPATH=[realpath("src/helpers/esp32")]) menv.Append(BUILD_FLAGS=["-I src/helpers/esp32"]) src_filter.append("+") + + # NRF52 + elif isinstance(item, str) and item == "NRF52_PLATFORM": + menv.Append(CPPPATH=[realpath("src/helpers/nrf52")]) + menv.Append(BUILD_FLAGS=["-I src/helpers/nrf52"]) + src_filter.append("+") + + # RP2040 + elif isinstance(item, str) and item == "RP2040_PLATFORM": + menv.Append(CPPPATH=[realpath("src/helpers/rp2040")]) + menv.Append(BUILD_FLAGS=["-I src/helpers/rp2040"]) + src_filter.append("+") + + # VARIANTS HANDLING elif isinstance(item, tuple) and item[0] == "MC_VARIANT": variant_name = item[1] menv.Append(BUILD_FLAGS=[f"-I variants/{variant_name}"]) From bbee057b03ac74dfbbd8f77a6c7f98504efd4a77 Mon Sep 17 00:00:00 2001 From: kelsey hudson Date: Sun, 24 Aug 2025 15:54:05 -0700 Subject: [PATCH 04/10] Station G2: Adds repeater variant with packet logging on Adds a variant to Station G2 which turns on mesh packet logging to serial. Useful for telemetry logging. Sites such as map.w0z.is depend on this functionality. --- variants/station_g2/platformio.ini | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/variants/station_g2/platformio.ini b/variants/station_g2/platformio.ini index 3ed73f43..756ff5f3 100644 --- a/variants/station_g2/platformio.ini +++ b/variants/station_g2/platformio.ini @@ -45,6 +45,25 @@ lib_deps = ${Station_G2.lib_deps} ${esp32_ota.lib_deps} +[env:Station_G2_logging_repeater] +extends = Station_G2 +build_flags = + ${Station_G2.build_flags} + -D ADVERT_NAME='"Station G2 Logging Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=8 + -D MESH_PACKET_LOGGING=1 + -D SX126X_RX_BOOSTED_GAIN=1 +; https://wiki.uniteng.com/en/meshtastic/station-g2#impact-of-lora-node-dense-areashigh-noise-environments-on-rf-performance +; -D MESH_DEBUG=1 +build_src_filter = ${Station_G2.build_src_filter} + +<../examples/simple_repeater> +lib_deps = + ${Station_G2.lib_deps} + ${esp32_ota.lib_deps} + [env:Station_G2_room_server] extends = Station_G2 build_src_filter = ${Station_G2.build_src_filter} From d0fb8d2f30c43ce415c68094d454a5d3f0ef0201 Mon Sep 17 00:00:00 2001 From: Florent Date: Mon, 25 Aug 2025 12:11:39 +0200 Subject: [PATCH 05/10] lib_build: support display --- build_as_lib.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/build_as_lib.py b/build_as_lib.py index da4337c0..43e06fdd 100644 --- a/build_as_lib.py +++ b/build_as_lib.py @@ -6,11 +6,13 @@ menv=env # type: ignore src_filter = [ '+<*.cpp>', '+', - '+' + '+', '+', '+', ] +use_display = False + # add build and include dirs according to CPPDEFINES for item in menv.get("CPPDEFINES", []): @@ -38,12 +40,25 @@ for item in menv.get("CPPDEFINES", []): menv.Append(BUILD_FLAGS=["-I src/helpers/rp2040"]) src_filter.append("+") + # DISPLAY HANDLING + elif isinstance(item, tuple) and item[0] == "DISPLAY_CLASS": + display_class = item[1] + use_display = True + src_filter.append(f"+") + if (display_class == "ST7789Display") : + src_filter.append(f"+") + src_filter.append(f"+") + # VARIANTS HANDLING elif isinstance(item, tuple) and item[0] == "MC_VARIANT": variant_name = item[1] menv.Append(BUILD_FLAGS=[f"-I variants/{variant_name}"]) src_filter.append(f"+<../variants/{variant_name}>") +if use_display : + menv.Append(CPPPATH=[realpath("src/helpers/ui")]) + menv.Append(BUILD_FLAGS=["-I src/helpers/ui"]) + menv.Replace(SRC_FILTER=src_filter) #print (menv.Dump()) From 033706adcfbb89e138d35e1fb9fbdb4011eecdcd Mon Sep 17 00:00:00 2001 From: Florent Date: Mon, 25 Aug 2025 16:21:23 +0200 Subject: [PATCH 06/10] lib_build: fix ST7789 so we don't have to add helpers/ui in INC_DIRS --- build_as_lib.py | 8 +------- src/helpers/ui/ST7789Display.h | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/build_as_lib.py b/build_as_lib.py index 43e06fdd..59091556 100644 --- a/build_as_lib.py +++ b/build_as_lib.py @@ -9,10 +9,9 @@ src_filter = [ '+', '+', '+', + '+', ] -use_display = False - # add build and include dirs according to CPPDEFINES for item in menv.get("CPPDEFINES", []): @@ -43,7 +42,6 @@ for item in menv.get("CPPDEFINES", []): # DISPLAY HANDLING elif isinstance(item, tuple) and item[0] == "DISPLAY_CLASS": display_class = item[1] - use_display = True src_filter.append(f"+") if (display_class == "ST7789Display") : src_filter.append(f"+") @@ -55,10 +53,6 @@ for item in menv.get("CPPDEFINES", []): menv.Append(BUILD_FLAGS=[f"-I variants/{variant_name}"]) src_filter.append(f"+<../variants/{variant_name}>") -if use_display : - menv.Append(CPPPATH=[realpath("src/helpers/ui")]) - menv.Append(BUILD_FLAGS=["-I src/helpers/ui"]) - menv.Replace(SRC_FILTER=src_filter) #print (menv.Dump()) diff --git a/src/helpers/ui/ST7789Display.h b/src/helpers/ui/ST7789Display.h index 8056de81..0f06da4c 100644 --- a/src/helpers/ui/ST7789Display.h +++ b/src/helpers/ui/ST7789Display.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include "ST7789Spi.h" class ST7789Display : public DisplayDriver { ST7789Spi display; From 15249bb8d5edde15ada5710cb4b6bd34711e3cc6 Mon Sep 17 00:00:00 2001 From: Florent Date: Mon, 25 Aug 2025 17:50:48 +0200 Subject: [PATCH 07/10] lib_build: include example code in build --- build_as_lib.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build_as_lib.py b/build_as_lib.py index 59091556..910c58fe 100644 --- a/build_as_lib.py +++ b/build_as_lib.py @@ -52,6 +52,11 @@ for item in menv.get("CPPDEFINES", []): variant_name = item[1] menv.Append(BUILD_FLAGS=[f"-I variants/{variant_name}"]) src_filter.append(f"+<../variants/{variant_name}>") + + # INCLUDE EXAMPLE CODE IN BUILD (to provide your own support files without touching the tree) + elif isinstance(item, tuple) and item[0] == "BUILD_EXAMPLE": + example_name = item[1] + src_filter.append(f"+<../examples/{example_name}>") menv.Replace(SRC_FILTER=src_filter) From df18dfb48105fd71efd4ee26525aec6af46f5cc5 Mon Sep 17 00:00:00 2001 From: Florent Date: Mon, 25 Aug 2025 18:34:50 +0200 Subject: [PATCH 08/10] lib_build: exclude file from example --- build_as_lib.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build_as_lib.py b/build_as_lib.py index 910c58fe..4e8eea57 100644 --- a/build_as_lib.py +++ b/build_as_lib.py @@ -58,6 +58,11 @@ for item in menv.get("CPPDEFINES", []): example_name = item[1] src_filter.append(f"+<../examples/{example_name}>") + # EXCLUDE A SOURCE FILE FROM AN EXAMPLE (must be placed after example name or boom) + elif isinstance(item, tuple) and item[0] == "EXCLUDE_FROM_EXAMPLE": + exclude_name = item[1] + src_filter.append(f"-<../examples/{example_name}/{exclude_name}>") + menv.Replace(SRC_FILTER=src_filter) #print (menv.Dump()) From 78fcb704bc30f43046af0ecfb31dfaf2dbafa8c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Br=C3=A1zio?= Date: Mon, 25 Aug 2025 17:44:14 +0100 Subject: [PATCH 09/10] Increase power limit for Heltec v3 433 MHz --- variants/heltec_v3/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/heltec_v3/platformio.ini b/variants/heltec_v3/platformio.ini index b9193431..24bc0bf0 100644 --- a/variants/heltec_v3/platformio.ini +++ b/variants/heltec_v3/platformio.ini @@ -17,7 +17,7 @@ build_flags = -D PIN_VEXT_EN=36 -D SX126X_DIO2_AS_RF_SWITCH=true -D SX126X_DIO3_TCXO_VOLTAGE=1.8 - -D SX126X_CURRENT_LIMIT=140 + -D SX126X_CURRENT_LIMIT=160 -D SX126X_RX_BOOSTED_GAIN=1 -D PIN_GPS_RX=47 -D PIN_GPS_TX=48 From 0959e64d1133ee99e863c789a5cc15a43ea126d2 Mon Sep 17 00:00:00 2001 From: Florent Date: Tue, 26 Aug 2025 13:28:42 +0200 Subject: [PATCH 10/10] lib_build: add UI_FLAVOR and some cleanup --- build_as_lib.py | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/build_as_lib.py b/build_as_lib.py index 4e8eea57..d8e95378 100644 --- a/build_as_lib.py +++ b/build_as_lib.py @@ -15,28 +15,14 @@ src_filter = [ # add build and include dirs according to CPPDEFINES for item in menv.get("CPPDEFINES", []): - # STM32 - if isinstance(item, str) and item == "STM32_PLATFORM": - menv.Append(CPPPATH=[realpath("src/helpers/stm32")]) - menv.Append(BUILD_FLAGS=["-I src/helpers/stm32"]) + # PLATFORM HANDLING + if item == "STM32_PLATFORM": src_filter.append("+") - - # ESP32 - elif isinstance(item, str) and item == "ESP32": - menv.Append(CPPPATH=[realpath("src/helpers/esp32")]) - menv.Append(BUILD_FLAGS=["-I src/helpers/esp32"]) + elif item == "ESP32": src_filter.append("+") - - # NRF52 - elif isinstance(item, str) and item == "NRF52_PLATFORM": - menv.Append(CPPPATH=[realpath("src/helpers/nrf52")]) - menv.Append(BUILD_FLAGS=["-I src/helpers/nrf52"]) + elif item == "NRF52_PLATFORM": src_filter.append("+") - - # RP2040 - elif isinstance(item, str) and item == "RP2040_PLATFORM": - menv.Append(CPPPATH=[realpath("src/helpers/rp2040")]) - menv.Append(BUILD_FLAGS=["-I src/helpers/rp2040"]) + elif item == "RP2040_PLATFORM": src_filter.append("+") # DISPLAY HANDLING @@ -50,19 +36,29 @@ for item in menv.get("CPPDEFINES", []): # VARIANTS HANDLING elif isinstance(item, tuple) and item[0] == "MC_VARIANT": variant_name = item[1] - menv.Append(BUILD_FLAGS=[f"-I variants/{variant_name}"]) src_filter.append(f"+<../variants/{variant_name}>") # INCLUDE EXAMPLE CODE IN BUILD (to provide your own support files without touching the tree) elif isinstance(item, tuple) and item[0] == "BUILD_EXAMPLE": example_name = item[1] - src_filter.append(f"+<../examples/{example_name}>") + src_filter.append(f"+<../examples/{example_name}/*.cpp>") # EXCLUDE A SOURCE FILE FROM AN EXAMPLE (must be placed after example name or boom) elif isinstance(item, tuple) and item[0] == "EXCLUDE_FROM_EXAMPLE": exclude_name = item[1] + if example_name is None: + print("***** PLEASE DEFINE EXAMPLE FIRST *****") + break src_filter.append(f"-<../examples/{example_name}/{exclude_name}>") + # DEAL WITH UI VARIANT FOR AN EXAMPLE + elif isinstance(item, tuple) and item[0] == "MC_UI_FLAVOR": + ui_flavor = item[1] + if example_name is None: + print("***** PLEASE DEFINE EXAMPLE FIRST *****") + break + src_filter.append(f"+<../examples/{example_name}/{ui_flavor}/*.cpp>") + menv.Replace(SRC_FILTER=src_filter) #print (menv.Dump())