Enable LoRa OTA for nRF52 repeaters

This commit is contained in:
mikecarper committed 2026-07-15 09:49:40 -07:00
1 parent 28afb0cd2c
commit 710790b81d
19 files changed
+260 -26

No files matched your search

+28
View File
@@ -1157,6 +1157,21 @@ filter_out_bluetooth_targets() {
done
}
is_lora_ota_only_target() {
local target_lc=${1,,}
[[ "$target_lc" == *lora_ota* ]]
}
filter_out_lora_ota_only_targets() {
local target
for target in "$@"; do
if ! is_lora_ota_only_target "$target"; then
printf '%s\n' "$target"
fi
done
}
is_logging_size_constrained_target() {
case "$1" in
Tiny_Relay_repeater|RAK_3x72_repeater|wio-e5_repeater|wio-e5-repeater_bridge_rs232|wio-e5-mini_repeater|wio-e5-mini_sensor)
@@ -2045,6 +2060,7 @@ run_logging_matrix_build_targets() {
local original_mqtt_debug_override=$MQTT_DEBUG_OVERRIDE
local original_firmware_filename_infix=$FIRMWARE_FILENAME_INFIX
local bluetooth_skip_count=0
local lora_ota_only_skip_count=0
local logging_target_count=0
local build_status=0
local pass_status=0
@@ -2081,6 +2097,18 @@ run_logging_matrix_build_targets() {
echo "Skipping ${bluetooth_skip_count} Bluetooth target(s) for logging-on pass."
fi
lora_ota_only_skip_count=0
for target in "${logging_targets[@]}"; do
if is_lora_ota_only_target "$target"; then
lora_ota_only_skip_count=$((lora_ota_only_skip_count + 1))
fi
done
mapfile -t logging_targets < <(filter_out_lora_ota_only_targets "${logging_targets[@]}")
if [ "$lora_ota_only_skip_count" -gt 0 ]; then
echo "Skipping ${lora_ota_only_skip_count} LoRa-OTA-only target(s) for logging-on pass because logging disables LoRa OTA."
fi
for target in "${logging_targets[@]}"; do
if is_logging_size_constrained_target "$target"; then
constrained_logging_targets+=("$target")
+4 -1
View File
@@ -31,7 +31,10 @@ You need:
- A standard, non-logging Keymind OTA build on the source and destination nodes. Logging and MQTT builds do
not include LoRa OTA. Use the WiFi or USB connection to update those.
- An OTA-capable ESP32 destination with an A/B partition table. nRF52 has a single application slot and
cannot install this guide's full-image container; it requires an in-place delta plus the OTAFIX bootloader.
cannot install this guide's full-image container; it requires an in-place delta plus the exact matching
OTAFIX bootloader. On RAK4631 repeaters, the OTA target is named
`RAK_4631_repeater_no_external_sensors_lora_ota`; it retains built-in battery monitoring but omits optional
external environmental/GPS sensor packages to fit the safe in-place update limit.
- The new, non-merged `.bin` application firmware for the destination's exact board **and role**. Do not
package an ESP32 `-merged.bin` factory image.
- A source node connected to the computer by USB serial.
+18 -3
View File
@@ -9,8 +9,22 @@ bridge, logging, and roles without `tempradio` support exclude it.
OTA radio traffic is accepted, generated, and relayed only while `tempradio` is actually running on that node.
Every source, receiver, and intermediate repeater must therefore have an overlapping temporary-radio window.
> **Is my node supported?** OTA works on **ESP32** boards (e.g. Heltec V3) and on the **RAK4631** (nRF52,
> which needs the special MeshCore bootloader). Other boards build fine but can't self-update yet.
> **Is my node supported?** LoRa OTA firmware is available for supported **ESP32** boards and nRF52
> repeater targets. Every nRF52 installation requires the OTAFIX bootloader built for that exact board;
> having an OTA-capable application image alone is not enough. Check the bootloader release for an exact
> board match before attempting an update.
The following nRF52 repeater targets gained firmware-side LoRa OTA support in this release without losing
their normal external-sensor support:
- Heltec Mesh Solar, T1, and Tower V2
- Keepteen LT1, LilyGo T-Impulse Plus, Mesh Pocket, and Nano G2 Ultra
- Minewsemi ME25LS01, RAK3401, SenseCAP Solar, and Wio WM1110
The full-sensor `RAK_4631_repeater` image is too large for the safe nRF52 in-place update limit. Use
`RAK_4631_repeater_no_external_sensors_lora_ota` when LoRa OTA is required. That target removes optional
external environmental/GPS sensor packages, but retains the RAK4631's built-in battery-voltage reading,
battery telemetry, and `battery.alert` behavior.
---
@@ -150,7 +164,8 @@ After it reboots, run `ota status` to confirm the new version.
- A download that stalls or gets interrupted just **resumes** later, or you can `ota cancel` and try again.
- If an **install** fails, the node won't boot a broken image — it lands in **recovery mode**:
- **RAK4631 / nRF52:** it appears as a USB drive; drag a known-good firmware `.uf2` onto it to recover.
- **nRF52:** it appears as a USB drive; drag a known-good firmware `.uf2` for that exact board onto it
to recover.
- **ESP32:** it keeps the previous firmware in the other slot and rolls back.
- When in doubt, you can always re-flash over USB the normal way.
+13 -6
View File
@@ -108,15 +108,14 @@ lib_deps =
${arduino_base.lib_deps}
https://github.com/oltaco/CustomLFS#0.2.2
; Shared OTA recipe for board=rak4631-hardware nRF52 variants. nRF52840 has no A/B slot, so the update is
; Shared LoRa OTA recipe for nRF52840 variants. nRF52840 has no A/B slot, so the update is
; applied in place by the custom OTAFIX bootloader (in-place detools); the app only stages + verifies +
; approves it. Reuses the RAK4631 flash layout (src/helpers/ota/OtaFlashLayout_nrf52.h; FS_START 0xD4000
; is the safe staging ceiling for every RAK4631 role/ldscript). The device must run the matching OTAFIX
; approves it. OtaFlashLayout_nrf52.h uses FS_START 0xD4000 as the safe staging ceiling for the supported
; S140 v6/v7 linker scripts. The device must run the matching OTAFIX
; bootloader for `applydelta` to actually apply. (detools.c is intentionally NOT built into the app —
; only the bootloader decodes.) The [rak4631] base defines this same recipe inline because it carries
; board-specific extras (fix_bsec_lib.py, BSEC lib) and a fixed post-script order; the simpler RAK4631
; variants below just extend this section.
[rak4631_hw]
; board-specific extras (fix_bsec_lib.py, BSEC lib) and a fixed post-script order.
[nrf52_lora_ota]
extends = nrf52_base
extra_scripts = ${nrf52_base.extra_scripts}
post:tools/mota/pio_endf.py
@@ -128,6 +127,14 @@ build_src_filter = ${nrf52_base.build_src_filter}
+<helpers/ota/*.cpp>
lib_deps = ${nrf52_base.lib_deps}
; Compatibility alias retained for existing nRF52840 board definitions.
[rak4631_hw]
extends = nrf52_lora_ota
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_flags = ${nrf52_lora_ota.build_flags}
build_src_filter = ${nrf52_lora_ota.build_src_filter}
lib_deps = ${nrf52_lora_ota.lib_deps}
; ----------------- RP2040 ---------------------
[rp2040_base]
+85 -12
View File
@@ -2,7 +2,7 @@
#include <stdint.h>
// AUTO-GENERATED by tools/mota/gen_targets.py — do not edit by hand.
// 418 OTA-capable PlatformIO envs. Maps target_id (= sha2-256:4 of the env name, LE uint32)
// 491 OTA-capable PlatformIO envs. Maps target_id (= sha2-256:4 of the env name, LE uint32)
// to the human-readable env name, so a node/tool can name a target seen over the air WITHOUT
// transmitting the string in the .mota / LoRa protocol. Regenerate when the OTA env set changes.
@@ -34,14 +34,13 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0xc8104197, "GAT562_Mesh_Watch13_kiss_modem" },
{ 0xf5eb61ec, "Generic_E22_kiss_modem" },
{ 0x70d2d590, "Generic_E22_sx1262_repeater" },
{ 0xe1a7ffdf, "Generic_E22_sx1262_repeater_bridge_espnow" },
{ 0xd5e04824, "Generic_E22_sx1268_repeater" },
{ 0x61a7b2dd, "Generic_E22_sx1268_repeater_bridge_espnow" },
{ 0xa416bb20, "Generic_ESPNOW_comp_radio_usb" },
{ 0x875f3744, "Generic_ESPNOW_repeatr" },
{ 0xdaf349be, "Generic_ESPNOW_room_svr" },
{ 0x93b93199, "Generic_ESPNOW_terminal_chat" },
{ 0x5293da13, "Heltec_ct62_companion_radio_ble" },
{ 0xc6dd7723, "Heltec_ct62_companion_radio_ble_ps" },
{ 0xf2eec98c, "Heltec_ct62_companion_radio_usb" },
{ 0x48a986f1, "Heltec_ct62_kiss_modem" },
{ 0xd2cf978c, "Heltec_ct62_repeater" },
@@ -59,6 +58,16 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x2bbe7fd8, "Heltec_E290_repeater" },
{ 0x9e40157c, "Heltec_E290_repeater_bridge_espnow" },
{ 0xb12e6e01, "Heltec_E290_room_server" },
{ 0xf6f835ec, "Heltec_mesh_solar_repeater" },
{ 0xfed35078, "Heltec_t096_companion_radio_ble" },
{ 0x35d42b35, "Heltec_t096_companion_radio_ble_femoff" },
{ 0x9f736ca7, "Heltec_t096_companion_radio_ble_femon" },
{ 0x2a3a88c9, "Heltec_t096_companion_radio_usb" },
{ 0x80dc72a9, "Heltec_t096_kiss_modem" },
{ 0x5d3180ae, "Heltec_t096_repeater" },
{ 0x0f67c768, "Heltec_t096_repeater_bridge_rs232" },
{ 0xa14d9f4a, "Heltec_t096_room_server" },
{ 0x6494fda0, "Heltec_t096_sensor" },
{ 0x32bcdd14, "Heltec_t114_companion_radio_ble" },
{ 0xfe937f14, "Heltec_t114_companion_radio_usb" },
{ 0x5b9b1933, "Heltec_t114_kiss_modem" },
@@ -75,8 +84,13 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x21a73973, "Heltec_T190_kiss_modem" },
{ 0x3067f656, "Heltec_T190_repeater_" },
{ 0xfdb25057, "Heltec_T190_repeater_bridge_espnow_" },
{ 0x836e5931, "Heltec_T190_repeater_observer_mqtt" },
{ 0x0f1767cd, "Heltec_T190_room_server_" },
{ 0x57172fcc, "Heltec_T190_room_server_observer_mqtt" },
{ 0x85edccd3, "Heltec_t1_repeater" },
{ 0x85a8c944, "Heltec_tower_v2_repeater" },
{ 0x73387372, "heltec_tracker_v2_companion_radio_ble" },
{ 0xb43e97a3, "heltec_tracker_v2_companion_radio_ble_ps" },
{ 0xe6eeffe1, "heltec_tracker_v2_companion_radio_usb" },
{ 0x35f4e7ac, "heltec_tracker_v2_companion_radio_wifi" },
{ 0xb62a1e75, "heltec_tracker_v2_kiss_modem" },
@@ -86,32 +100,44 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0xed21ca4f, "heltec_tracker_v2_sensor" },
{ 0x9f5f39a7, "heltec_tracker_v2_terminal_chat" },
{ 0x081d2219, "Heltec_v2_companion_radio_ble" },
{ 0x7c498bc4, "Heltec_v2_companion_radio_ble_ps" },
{ 0xc283ad60, "Heltec_v2_companion_radio_usb" },
{ 0x4fbdc1e1, "Heltec_v2_companion_radio_wifi" },
{ 0xc797fd73, "Heltec_v2_kiss_modem" },
{ 0xab9871c8, "Heltec_v2_repeater" },
{ 0x5caaf9bf, "Heltec_v2_repeater_bridge_espnow" },
{ 0x2075687c, "Heltec_v2_room_server" },
{ 0x5d726067, "Heltec_v2_terminal_chat" },
{ 0x9969bbc9, "Heltec_v3_companion_radio_ble" },
{ 0x804f7a3a, "Heltec_v3_companion_radio_ble_ps" },
{ 0x22f900de, "Heltec_v3_companion_radio_usb" },
{ 0xaca0e153, "Heltec_v3_companion_radio_wifi" },
{ 0x516c9c13, "Heltec_v3_companion_radio_wifi_mqtt" },
{ 0xcb1c2e65, "Heltec_v3_kiss_modem" },
{ 0x9f2a6b84, "Heltec_v3_ota_test" },
{ 0xd1b29b18, "Heltec_v3_repeater" },
{ 0x644bb68d, "Heltec_v3_repeater_bridge_espnow" },
{ 0xd19a9759, "Heltec_v3_repeater_bridge_rs232" },
{ 0xde40f56f, "Heltec_v3_repeater_observer_mqtt" },
{ 0xc59d294e, "Heltec_v3_room_server" },
{ 0xceeddfaf, "Heltec_v3_room_server_observer_mqtt" },
{ 0x21519537, "Heltec_v3_sensor" },
{ 0x382bb181, "Heltec_v3_terminal_chat" },
{ 0x90581c83, "heltec_v4_3_companion_radio_ble_ps_femoff" },
{ 0x01d8f124, "heltec_v4_companion_radio_ble" },
{ 0xe2f9583f, "heltec_v4_companion_radio_ble_ps" },
{ 0xd33b0986, "heltec_v4_companion_radio_ble_ps_femon" },
{ 0x1a4d0096, "heltec_v4_companion_radio_usb" },
{ 0x34240e36, "heltec_v4_companion_radio_wifi" },
{ 0x031cdf96, "heltec_v4_companion_radio_wifi_mqtt" },
{ 0xd522a14f, "heltec_v4_expansionkit_repeater" },
{ 0x76657d76, "heltec_v4_expansionkit_repeater_observer_mqtt" },
{ 0x21ee03bd, "heltec_v4_expansionkit_room_server_observer_mqtt" },
{ 0xe2a1907b, "heltec_v4_expansionkit_tft_companion_radio_ble_ps" },
{ 0xf75feb3e, "heltec_v4_kiss_modem" },
{ 0xe792a051, "heltec_v4_repeater" },
{ 0x2d5ea842, "heltec_v4_repeater_bridge_espnow" },
{ 0xab74db9e, "heltec_v4_repeater_observer_mqtt" },
{ 0xeed78ce4, "heltec_v4_room_server" },
{ 0x7778b7e1, "heltec_v4_room_server_observer_mqtt" },
{ 0x0b6847ed, "heltec_v4_sensor" },
{ 0xab3e1ad3, "heltec_v4_terminal_chat" },
{ 0x60fca2ae, "heltec_v4_tft_companion_radio_ble" },
@@ -123,24 +149,29 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x188f3ac1, "heltec_v4_tft_sensor" },
{ 0x402055ec, "heltec_v4_tft_terminal_chat" },
{ 0x12393f1f, "Heltec_Wireless_Paper_companion_radio_ble" },
{ 0x16fbab07, "Heltec_Wireless_Paper_companion_radio_ble_ps" },
{ 0xed3ef5b8, "Heltec_Wireless_Paper_companion_radio_usb" },
{ 0x8ea86381, "Heltec_Wireless_Paper_kiss_modem" },
{ 0x09f57289, "Heltec_Wireless_Paper_repeater" },
{ 0x148aeaab, "Heltec_Wireless_Paper_repeater_bridge_espnow" },
{ 0x6e9f7fec, "Heltec_Wireless_Paper_room_server" },
{ 0x6a25d024, "Heltec_Wireless_Tracker_companion_radio_ble" },
{ 0xc5a2cb41, "Heltec_Wireless_Tracker_companion_radio_ble_ps" },
{ 0xc4a11710, "Heltec_Wireless_Tracker_companion_radio_usb" },
{ 0x753947a4, "Heltec_Wireless_Tracker_kiss_modem" },
{ 0xe6fa98b4, "Heltec_Wireless_Tracker_repeater" },
{ 0xf8c27cf4, "Heltec_Wireless_Tracker_repeater_bridge_espnow" },
{ 0x90e227d9, "Heltec_Wireless_Tracker_room_server" },
{ 0x812f5e52, "Heltec_WSL3_companion_radio_ble" },
{ 0x61f961c5, "Heltec_WSL3_companion_radio_ble_ps" },
{ 0x1ddd15c8, "Heltec_WSL3_companion_radio_usb" },
{ 0x49d67d0d, "Heltec_WSL3_companion_radio_wifi" },
{ 0xbc003322, "Heltec_WSL3_repeater" },
{ 0x835b70c0, "Heltec_WSL3_repeater_bridge_espnow" },
{ 0xd7460575, "Heltec_WSL3_repeater_bridge_rs232" },
{ 0x36acced5, "Heltec_WSL3_repeater_observer_mqtt" },
{ 0x33e2c171, "Heltec_WSL3_room_server" },
{ 0x5be91148, "Heltec_WSL3_room_server_observer_mqtt" },
{ 0xa165ae99, "Heltec_WSL3_sensor" },
{ 0x04c5c2b7, "ikoka_handheld_nrf_e22_30dbm_096_companion_radio_ble" },
{ 0x6c1ca659, "ikoka_handheld_nrf_e22_30dbm_096_companion_radio_usb" },
@@ -179,6 +210,7 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0xf1ab4c28, "ikoka_stick_nrf_33dbm_kiss_modem" },
{ 0xe5331f02, "ikoka_stick_nrf_33dbm_repeater" },
{ 0xfba7177b, "ikoka_stick_nrf_33dbm_room_server" },
{ 0xde7dc472, "KeepteenLT1_repeater" },
{ 0x69df7765, "LilyGo_T-Echo-Lite_companion_radio_ble" },
{ 0xe9fbc9be, "LilyGo_T-Echo-Lite_kiss_modem" },
{ 0x40818863, "LilyGo_T-Echo-Lite_non_shell_companion_radio_ble" },
@@ -195,11 +227,14 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0xb92ec96b, "LilyGo_T-Echo_repeater" },
{ 0x420ebc63, "LilyGo_T-Echo_room_server" },
{ 0x967ccaee, "LilyGo_T3S3_sx1262_companion_radio_ble" },
{ 0x8021afa2, "LilyGo_T3S3_sx1262_companion_radio_ble_ps" },
{ 0x5f7c7688, "LilyGo_T3S3_sx1262_companion_radio_usb" },
{ 0xbd04e6e7, "LilyGo_T3S3_sx1262_kiss_modem" },
{ 0x1aeac884, "LilyGo_T3S3_sx1262_repeater" },
{ 0x07849209, "LilyGo_T3S3_sx1262_repeater_bridge_espnow" },
{ 0x0c79b100, "LilyGo_T3S3_sx1262_repeater_observer_mqtt" },
{ 0xbfb60e7c, "LilyGo_T3S3_sx1262_room_server" },
{ 0x8a63de3a, "LilyGo_T3S3_sx1262_room_server_observer_mqtt" },
{ 0x96036a68, "LilyGo_T3S3_sx1262_terminal_chat" },
{ 0xb76a745c, "LilyGo_T3S3_sx1276_companion_radio_ble" },
{ 0x43023193, "LilyGo_T3S3_sx1276_companion_radio_usb" },
@@ -208,13 +243,17 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0xb59ea2ed, "LilyGo_T3S3_sx1276_repeater_bridge_espnow" },
{ 0xbe372c6d, "LilyGo_T3S3_sx1276_room_server" },
{ 0x6215e9eb, "LilyGo_T3S3_sx1276_terminal_chat" },
{ 0x07907102, "LilyGo_T_Impulse_Plus_repeater" },
{ 0x3898ea56, "LilyGo_TBeam_1W_companion_radio_ble" },
{ 0x2fb7e218, "LilyGo_TBeam_1W_companion_radio_ble_ps" },
{ 0x4f722e70, "LilyGo_TBeam_1W_companion_radio_usb" },
{ 0x694eed25, "LilyGo_TBeam_1W_companion_radio_wifi" },
{ 0x85b8b9d7, "LilyGo_TBeam_1W_kiss_modem" },
{ 0xe8421e36, "LilyGo_TBeam_1W_repeater" },
{ 0x82eaaf9e, "LilyGo_TBeam_1W_repeater_bridge_espnow" },
{ 0x9f9caba4, "LilyGo_TBeam_1W_repeater_observer_mqtt" },
{ 0xe4a2de74, "LilyGo_TBeam_1W_room_server" },
{ 0x582c7826, "LilyGo_TBeam_1W_room_server_observer_mqtt" },
{ 0xaeb637f1, "LilyGo_TDeck_companion_radio_ble" },
{ 0x86813271, "LilyGo_TDeck_companion_radio_usb" },
{ 0x67b2ff84, "LilyGo_TDeck_kiss_modem" },
@@ -228,35 +267,37 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x21c6d08d, "LilyGo_Tlora_C6_repeater_" },
{ 0x34302c14, "LilyGo_Tlora_C6_room_server_" },
{ 0x268d6fc1, "LilyGo_TLora_V2_1_1_6_companion_radio_ble" },
{ 0xeabe3b40, "LilyGo_TLora_V2_1_1_6_companion_radio_ble_ps" },
{ 0x3c172d27, "LilyGo_TLora_V2_1_1_6_companion_radio_usb" },
{ 0xf7c5d584, "LilyGo_TLora_V2_1_1_6_companion_radio_wifi" },
{ 0x81960cc0, "LilyGo_TLora_V2_1_1_6_kiss_modem" },
{ 0x504020ea, "LilyGo_TLora_V2_1_1_6_repeater" },
{ 0x8e5c0c88, "LilyGo_TLora_V2_1_1_6_repeater_bridge_espnow" },
{ 0x4e42e0ad, "LilyGo_TLora_V2_1_1_6_repeater_bridge_rs232" },
{ 0x9c652703, "LilyGo_TLora_V2_1_1_6_repeater_observer_mqtt" },
{ 0xa2ce002f, "LilyGo_TLora_V2_1_1_6_room_server" },
{ 0xdb780283, "LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt" },
{ 0x6f16479e, "LilyGo_TLora_V2_1_1_6_terminal_chat" },
{ 0x1018e5d1, "M5Stack_Unit_C6L_companion_radio_ble" },
{ 0xc0ab5040, "M5Stack_Unit_C6L_companion_radio_usb" },
{ 0xa2bf90bd, "M5Stack_Unit_C6L_kiss_modem" },
{ 0xe6bff8f9, "M5Stack_Unit_C6L_repeater" },
{ 0xb9cd26cb, "M5Stack_Unit_C6L_room_server" },
{ 0x9bc34bd5, "Mesh_pocket_repeater" },
{ 0xdbfe2675, "Meshadventurer_sx1262_companion_radio_ble" },
{ 0xb00241d0, "Meshadventurer_sx1262_companion_radio_usb" },
{ 0x88e77fee, "Meshadventurer_sx1262_kiss_modem" },
{ 0xae2d9caa, "Meshadventurer_sx1262_repeater" },
{ 0xecea445b, "Meshadventurer_sx1262_repeater_bridge_espnow" },
{ 0xa0043e00, "Meshadventurer_sx1262_room_server" },
{ 0x26bbf4ed, "Meshadventurer_sx1262_terminal_chat" },
{ 0xdcc0f158, "Meshadventurer_sx1268_companion_radio_ble" },
{ 0xe3320463, "Meshadventurer_sx1268_companion_radio_usb" },
{ 0x852b928a, "Meshadventurer_sx1268_kiss_modem" },
{ 0x0ec870e9, "Meshadventurer_sx1268_repeater" },
{ 0xc845072e, "Meshadventurer_sx1268_repeater_bridge_espnow" },
{ 0x8f00c1f2, "Meshadventurer_sx1268_room_server" },
{ 0xcea95e20, "Meshadventurer_sx1268_terminal_chat" },
{ 0xd45277ff, "Meshimi_companion_radio_ble_" },
{ 0x2cad9a9d, "Meshimi_repeater_" },
{ 0x77d0810c, "Minewsemi_me25ls01_repeater" },
{ 0xf8259880, "Nano_G2_Ultra_repeater" },
{ 0x063f1f00, "nibble_screen_connect_companion_radio_ble_" },
{ 0xa8a79da5, "nibble_screen_connect_companion_radio_usb_" },
{ 0xc0d3815b, "nibble_screen_connect_companion_radio_wifi_" },
@@ -294,15 +335,18 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0xfa8510fa, "RAK_3112_repeater" },
{ 0xd34d8461, "RAK_3112_repeater_bridge_espnow" },
{ 0x98077550, "RAK_3112_repeater_bridge_rs232" },
{ 0x11628e29, "RAK_3112_repeater_observer_mqtt" },
{ 0x2ed959aa, "RAK_3112_room_server" },
{ 0xf1e7cadb, "RAK_3112_room_server_observer_mqtt" },
{ 0xced7e127, "RAK_3112_sensor" },
{ 0x6925aaf0, "RAK_3112_terminal_chat" },
{ 0x94c5555a, "RAK_3401_repeater" },
{ 0x9f4d58ac, "RAK_4631_companion_radio_ble" },
{ 0x48d3b5d4, "RAK_4631_companion_radio_usb" },
{ 0x14e6965d, "RAK_4631_kiss_modem" },
{ 0x04d413fd, "RAK_4631_repeater" },
{ 0x22ea8497, "RAK_4631_repeater_bridge_rs232_serial1" },
{ 0x21bae522, "RAK_4631_repeater_bridge_rs232_serial2" },
{ 0xb876506d, "RAK_4631_repeater_no_external_sensors_lora_ota" },
{ 0x626d80ed, "RAK_4631_room_server" },
{ 0x8b1d6850, "RAK_4631_sensor" },
{ 0xf1d3c5a8, "RAK_4631_terminal_chat" },
@@ -312,6 +356,7 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x4fa4ae55, "RAK_WisMesh_Tag_repeater" },
{ 0x9cb0b232, "RAK_WisMesh_Tag_room_server" },
{ 0x51fa1a49, "RAK_WisMesh_Tag_sensor" },
{ 0xdb73638b, "SenseCap_Solar_repeater" },
{ 0xd904c2d5, "SenseCapIndicator-ESPNow_comp_radio_usb" },
{ 0xd0df8303, "Station_G2_companion_radio_ble" },
{ 0x5c1a54f8, "Station_G2_companion_radio_usb" },
@@ -321,7 +366,9 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x75587f24, "Station_G2_logging_repeater_bridge_espnow" },
{ 0xf2128c81, "Station_G2_repeater" },
{ 0x1b34e7b4, "Station_G2_repeater_bridge_espnow" },
{ 0xdbb6a855, "Station_G2_repeater_observer_mqtt" },
{ 0x73c4a019, "Station_G2_room_server" },
{ 0xe4042b21, "Station_G2_room_server_observer_mqtt" },
{ 0x8e549407, "Station_G3_ESP32_companion_radio_ble" },
{ 0x1deac038, "Station_G3_ESP32_companion_radio_usb" },
{ 0x2a2f303b, "Station_G3_ESP32_companion_radio_wifi" },
@@ -335,21 +382,28 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x000fc519, "t1000e_repeater" },
{ 0x3e55e34d, "t1000e_room_server" },
{ 0x16482630, "T_Beam_S3_Supreme_SX1262_companion_radio_ble" },
{ 0xce0f07ad, "T_Beam_S3_Supreme_SX1262_companion_radio_ble_ps" },
{ 0x01c43d49, "T_Beam_S3_Supreme_SX1262_companion_radio_wifi" },
{ 0x51fe3801, "T_Beam_S3_Supreme_SX1262_kiss_modem" },
{ 0x857149e5, "T_Beam_S3_Supreme_SX1262_repeater" },
{ 0xd9d64938, "T_Beam_S3_Supreme_SX1262_repeater_bridge_espnow" },
{ 0xcb7da3f5, "T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt" },
{ 0x9952fbe3, "T_Beam_S3_Supreme_SX1262_room_server" },
{ 0x3729cd74, "T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt" },
{ 0xdc27c37c, "Tbeam_SX1262_companion_radio_ble" },
{ 0x9b9f8775, "Tbeam_SX1262_companion_radio_ble_ps" },
{ 0xb27514a3, "Tbeam_SX1262_kiss_modem" },
{ 0xe9ce038c, "Tbeam_SX1262_repeater" },
{ 0x06406dd4, "Tbeam_SX1262_repeater_bridge_espnow" },
{ 0xe295a7a4, "Tbeam_SX1262_repeater_observer_mqtt" },
{ 0x189660b3, "Tbeam_SX1262_room_server" },
{ 0x99907475, "Tbeam_SX1262_room_server_observer_mqtt" },
{ 0x2082078d, "Tbeam_SX1276_companion_radio_ble" },
{ 0x24a94c81, "Tbeam_SX1276_companion_radio_ble_ps" },
{ 0x3750e80d, "Tbeam_SX1276_kiss_modem" },
{ 0xe4b49973, "Tbeam_SX1276_repeater" },
{ 0x0c0c4605, "Tbeam_SX1276_repeater_bridge_espnow" },
{ 0xe1372b52, "Tbeam_SX1276_repeater_observer_mqtt" },
{ 0x5a79bac1, "Tbeam_SX1276_room_server" },
{ 0x6f339514, "Tbeam_SX1276_room_server_observer_mqtt" },
{ 0x8eaa289e, "Tenstar_C3_sx1262_kiss_modem" },
{ 0x70e91bd9, "Tenstar_C3_sx1262_repeater" },
{ 0x5a7e9c2d, "Tenstar_C3_sx1262_repeater_bridge_espnow" },
@@ -376,6 +430,7 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x087f99c0, "ThinkNode_M3_repeater" },
{ 0x2afe6c63, "ThinkNode_M3_room_server" },
{ 0xf2d61a1c, "ThinkNode_M5_companion_radio_ble" },
{ 0x14b1b097, "ThinkNode_M5_companion_radio_ble_ps" },
{ 0x1da30414, "ThinkNode_M5_companion_radio_serial" },
{ 0xae8fe1c9, "ThinkNode_M5_companion_radio_usb" },
{ 0x67acd73f, "ThinkNode_M5_companion_radio_wifi" },
@@ -389,8 +444,21 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0xe59c9373, "ThinkNode_M6_kiss_modem" },
{ 0x236f605c, "ThinkNode_M6_repeater" },
{ 0x93994fed, "ThinkNode_M6_room_server" },
{ 0x66c47cfd, "ThinkNode_M7_companion_radio_ble" },
{ 0xa01688a7, "ThinkNode_M7_companion_radio_usb" },
{ 0xa5f4a562, "ThinkNode_M7_companion_radio_wifi" },
{ 0xef83222b, "ThinkNode_M7_kiss_modem" },
{ 0xc36ec867, "ThinkNode_M7_repeater" },
{ 0x92f5bbea, "ThinkNode_M7_room_server" },
{ 0x708ac4dc, "ThinkNode_M9_companion_radio_ble_" },
{ 0xdc51bf13, "ThinkNode_M9_companion_radio_usb_" },
{ 0xc27f8304, "ThinkNode_M9_companion_radio_wifi_" },
{ 0x7190df40, "ThinkNode_M9_kiss_modem" },
{ 0x609d50b3, "ThinkNode_M9_repeater_" },
{ 0x5718c7ea, "ThinkNode_M9_room_server_" },
{ 0x37443a5b, "WHY2025_badge_companion_radio_ble_" },
{ 0x603384a7, "WHY2025_badge_repeater_" },
{ 0xce3ef40f, "wio_wm1110_repeater" },
{ 0x475a2a6a, "WioTrackerL1_companion_radio_ble" },
{ 0xf4175d2c, "WioTrackerL1_companion_radio_usb" },
{ 0x3d831006, "WioTrackerL1_kiss_modem" },
@@ -399,6 +467,7 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x91eac424, "WioTrackerL1Eink_companion_radio_ble" },
{ 0x7a84a8c4, "WioTrackerL1Eink_kiss_modem" },
{ 0x67843a5f, "Xiao_C3_companion_radio_ble" },
{ 0x0e83fd51, "Xiao_C3_companion_radio_ble_ps" },
{ 0xfad357ab, "Xiao_C3_companion_radio_usb" },
{ 0x16af5c67, "Xiao_C3_companion_radio_wifi" },
{ 0x8c105104, "Xiao_C3_kiss_modem" },
@@ -413,6 +482,7 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x93145fbb, "Xiao_nrf52_repeater" },
{ 0x33a154ff, "Xiao_nrf52_room_server" },
{ 0x6658b418, "Xiao_S3_companion_radio_ble" },
{ 0x0cfb9c00, "Xiao_S3_companion_radio_ble_ps" },
{ 0x964f4f5c, "Xiao_S3_companion_radio_usb" },
{ 0x0a5dc760, "Xiao_S3_kiss_modem" },
{ 0xd08496ce, "Xiao_S3_repeater" },
@@ -420,13 +490,16 @@ inline const char* ota_target_env_name(uint32_t target_id) {
{ 0x60ebfa87, "Xiao_S3_room_server" },
{ 0x60f5fdc2, "Xiao_S3_sensor" },
{ 0xe8f79d22, "Xiao_S3_WIO_companion_radio_ble" },
{ 0xb97bbb15, "Xiao_S3_WIO_companion_radio_ble_ps" },
{ 0x9f27be15, "Xiao_S3_WIO_companion_radio_serial" },
{ 0x396fecc7, "Xiao_S3_WIO_companion_radio_usb" },
{ 0xf94e3407, "Xiao_S3_WIO_companion_radio_wifi" },
{ 0xe1930103, "Xiao_S3_WIO_kiss_modem" },
{ 0x9f19bcd1, "Xiao_S3_WIO_repeater" },
{ 0xfcebff61, "Xiao_S3_WIO_repeater_bridge_espnow" },
{ 0xac5c1405, "Xiao_S3_WIO_repeater_observer_mqtt" },
{ 0xccb734e2, "Xiao_S3_WIO_room_server" },
{ 0x634ff632, "Xiao_S3_WIO_room_server_observer_mqtt" },
{ 0xf967a300, "Xiao_S3_WIO_sensor" },
{ 0xa0cc1c36, "Xiao_S3_WIO_terminal_chat" },
};
+2 -2
View File
@@ -4,7 +4,7 @@
A target_id is sha2-256:4(pio_env_name); it travels in beacons / the .mota manifest as 4 bytes. This
table lets a node (and motatool) print the human-readable env name for a target seen over the air, WITHOUT
ever transmitting the string. The set of envs is resolved from PlatformIO (every env whose build_flags
include ENABLE_OTA), so it stays in sync with what actually ships OTA.
include ENABLE_OTA and do not include DISABLE_LORA_OTA), so explicit size/safety exclusions stay out.
Run: ./meshcore/bin/python tools/mota/gen_targets.py # resolves via `pio project config`
./meshcore/bin/python tools/mota/gen_targets.py cfg.json # or reuse a cached config dump (faster)
@@ -40,7 +40,7 @@ def ota_envs(cfg):
for k, v in opts:
if k == "build_flags":
flags = " ".join(v) if isinstance(v, list) else str(v)
if "ENABLE_OTA" in flags:
if "ENABLE_OTA" in flags and "DISABLE_LORA_OTA" not in flags:
envs.append(section[4:])
break
return sorted(set(envs))
+11
View File
@@ -40,6 +40,17 @@ def test_target_id_for_env():
assert ml.target_id_for_env("RAK_4631_repeater") != ml.target_id_for_env("RAK_4631_companion_radio_usb")
def test_ota_target_generation_honors_explicit_disable():
from gen_targets import ota_envs
cfg = [
["env:enabled", [["build_flags", ["-D ENABLE_OTA=1"]]]],
["env:disabled", [["build_flags", ["-D ENABLE_OTA=1", "-D DISABLE_LORA_OTA=1"]]]],
["env:unrelated", [["build_flags", ["-D NRF52_PLATFORM"]]]],
]
assert ota_envs(cfg) == ["enabled"]
def test_hardware_id_for_env():
assert ml.hardware_id_for_env("RAK_4631_repeater") == "RAK_4631"
assert ml.hardware_id_for_env("RAK_4631_companion_radio_usb") == "RAK_4631"
@@ -33,7 +33,9 @@ upload_protocol = nrfutil
[env:Heltec_mesh_solar_repeater]
extends = Heltec_mesh_solar
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_src_filter = ${Heltec_mesh_solar.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater>
build_flags =
@@ -43,6 +45,9 @@ build_flags =
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
+5
View File
@@ -29,7 +29,9 @@ upload_protocol = nrfutil
[env:Heltec_t1_repeater]
extends = Heltec_t1
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_src_filter = ${Heltec_t1.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater>
build_flags =
@@ -39,6 +41,9 @@ build_flags =
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
+5
View File
@@ -27,7 +27,9 @@ upload_protocol = nrfutil
[env:Heltec_tower_v2_repeater]
extends = Heltec_tower_v2
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_src_filter = ${Heltec_tower_v2.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater>
build_flags =
${Heltec_tower_v2.build_flags}
@@ -36,6 +38,9 @@ build_flags =
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
+6 -1
View File
@@ -22,7 +22,9 @@ lib_deps= ${nrf52_base.lib_deps}
[env:KeepteenLT1_repeater]
extends = KeepteenLT1
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_src_filter = ${KeepteenLT1.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
@@ -34,6 +36,9 @@ build_flags =
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D DISPLAY_CLASS=SSD1306Display
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
lib_deps = ${KeepteenLT1.lib_deps}
@@ -104,4 +109,4 @@ lib_deps = ${KeepteenLT1.lib_deps}
[env:KeepteenLT1_kiss_modem]
extends = KeepteenLT1
build_src_filter = ${KeepteenLT1.build_src_filter}
+<../examples/kiss_modem/>
+<../examples/kiss_modem/>
@@ -30,13 +30,18 @@ lib_deps= ${nrf52_base.lib_deps}
[env:LilyGo_T_Impulse_Plus_repeater]
extends = LilyGo_T_Impulse_Plus
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_src_filter = ${LilyGo_T_Impulse_Plus.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater>
build_flags =
${LilyGo_T_Impulse_Plus.build_flags}
-D ADVERT_NAME='"T-Impulse-Plus Repeater"'
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
lib_deps = ${LilyGo_T_Impulse_Plus.lib_deps}
+5
View File
@@ -36,7 +36,9 @@ upload_protocol = nrfutil
[env:Mesh_pocket_repeater]
extends = Mesh_pocket
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_src_filter = ${Mesh_pocket.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater>
build_flags =
${Mesh_pocket.build_flags}
@@ -45,6 +47,9 @@ build_flags =
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
@@ -62,6 +62,7 @@ build_src_filter = ${me25ls01.build_src_filter}
[env:Minewsemi_me25ls01_repeater]
extends = me25ls01
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_flags = ${me25ls01.build_flags}
-D MAX_CONTACTS=100
-D MAX_GROUP_CHANNELS=8
@@ -78,7 +79,11 @@ build_flags = ${me25ls01.build_flags}
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D DISPLAY_CLASS=NullDisplayDriver
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
build_src_filter = ${me25ls01.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater>
[env:Minewsemi_me25ls01_room_server]
+5
View File
@@ -27,6 +27,7 @@ lib_deps = ${nrf52_base.lib_deps}
[env:Nano_G2_Ultra_repeater]
extends = Nano_G2_Ultra
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_flags =
${Nano_G2_Ultra.build_flags}
-D DISPLAY_CLASS=SH1106Display
@@ -35,9 +36,13 @@ build_flags =
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${Nano_G2_Ultra.build_src_filter}
+<helpers/ota/*.cpp>
+<helpers/ui/SH1106Display.cpp>
+<../examples/simple_repeater>
+5
View File
@@ -27,6 +27,7 @@ lib_deps =
[env:RAK_3401_repeater]
extends = rak3401
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_flags =
${rak3401.build_flags}
-D DISPLAY_CLASS=SSD1306Display
@@ -35,9 +36,13 @@ build_flags =
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
;-D MESH_PACKET_LOGGING=1
;-D MESH_DEBUG=1
build_src_filter = ${rak3401.build_src_filter}
+<helpers/ota/*.cpp>
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_repeater>
+43 -1
View File
@@ -48,6 +48,7 @@ lib_deps =
extends = rak4631
build_flags =
${rak4631.build_flags}
-UENABLE_OTA
-D DISABLE_LORA_OTA=1 ; Cascade repeater image exceeds the safe nRF52 in-place OTA ceiling
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"RAK4631 Repeater"'
@@ -60,9 +61,50 @@ build_flags =
; -D MESH_DEBUG=1
build_src_filter = ${rak4631.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
; The OTA sources remain inherited, but build.sh removes ENABLE_OTA for this oversized role.
; Shared sources remain inherited, but ENABLE_OTA is explicitly undefined for this oversized role.
+<../examples/simple_repeater>
; Lean OTA target for space-constrained RAK4631 repeaters. This removes only optional external
; environmental/GPS sensor packages. RAK4631Board::getBattMilliVolts(), repeater telemetry, and
; battery.alert remain part of the board/repeater sources below.
[env:RAK_4631_repeater_no_external_sensors_lora_ota]
extends = rak4631
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_flags =
${rak4631.build_flags}
-UENV_INCLUDE_GPS
-UENV_INCLUDE_AHTX0
-UENV_INCLUDE_BME280
-UENV_INCLUDE_BMP280
-UENV_INCLUDE_SHTC3
-UENV_INCLUDE_SHT4X
-UENV_INCLUDE_LPS22HB
-UENV_INCLUDE_INA3221
-UENV_INCLUDE_INA219
-UENV_INCLUDE_INA226
-UENV_INCLUDE_INA260
-UENV_INCLUDE_MLX90614
-UENV_INCLUDE_VL53L0X
-UENV_INCLUDE_BME680
-UENV_INCLUDE_BMP085
-UENV_INCLUDE_RAK12035
-UENV_INCLUDE_BME680_BSEC
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"RAK4631 LoRa OTA No Ext Sensors"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
build_src_filter = ${nrf52_lora_ota.build_src_filter}
+<../variants/rak4631>
+<helpers/sensors/EnvironmentSensorManager.cpp>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<../examples/simple_repeater>
lib_deps =
${nrf52_lora_ota.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13
[env:RAK_4631_repeater_bridge_rs232_serial1]
extends = rak4631
build_flags =
+5
View File
@@ -39,6 +39,7 @@ lib_deps =
[env:SenseCap_Solar_repeater]
extends = SenseCap_Solar
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_flags =
${SenseCap_Solar.build_flags}
-D ADVERT_NAME='"SenseCap_Solar Repeater"'
@@ -46,9 +47,13 @@ build_flags =
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${SenseCap_Solar.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater/*.cpp>
[env:SenseCap_Solar_room_server]
+5
View File
@@ -39,6 +39,7 @@ lib_deps = ${nrf52_base.lib_deps}
[env:wio_wm1110_repeater]
extends = wio_wm1110
extra_scripts = ${nrf52_lora_ota.extra_scripts}
build_flags =
${wio_wm1110.build_flags}
-D ADVERT_NAME='"WM1110 Repeater"'
@@ -46,9 +47,13 @@ build_flags =
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D ENABLE_OTA=1
-D OTA_FLASH_STORE=1
-D OTA_FOLDER_SERIAL
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${wio_wm1110.build_src_filter}
+<helpers/ota/*.cpp>
+<../examples/simple_repeater/*.cpp>
[env:wio_wm1110_room_server]