From db57359abdcb373aab7996c6b0492970b7ec8f64 Mon Sep 17 00:00:00 2001 From: John Poole Date: Tue, 2 Jun 2026 11:22:27 -0700 Subject: [PATCH] Current announce cycle was: once per minute, at 2 + NODE_SLOT_INDEX * 4 seconds. So BOB at :06, CY at :10, DAN at :14, etc. I changed it to: first announce: immediately after startup once microReticulum is ready second announce: after ANNOUNCEMENT_2 seconds later announces: every ANNOUNCEMENT_REPEAT seconds --- .../204_established_identities/platformio.ini | 2 + .../scripts/pull_build_from_ryzdesk.sh | 25 +++++++++ .../204_established_identities/src/main.cpp | 51 +++++++++++++++---- 3 files changed, 68 insertions(+), 10 deletions(-) create mode 100755 exercises/204_established_identities/scripts/pull_build_from_ryzdesk.sh diff --git a/exercises/204_established_identities/platformio.ini b/exercises/204_established_identities/platformio.ini index de07b41..8a004fe 100644 --- a/exercises/204_established_identities/platformio.ini +++ b/exercises/204_established_identities/platformio.ini @@ -55,6 +55,8 @@ build_flags = -D MR_TRANSPORT_PROBE=1 -D MR_LINKFWD_DELAY_MS=750 -D MR_LRPROOF_DELAY_MS=750 + -D ANNOUNCEMENT_2=300 + -D ANNOUNCEMENT_REPEAT=3600 ; Live announces are enough for this single-hop field exercise. Do not define ; RNS_PERSIST_PATHS here: the LittleFS-backed path_store compactor can leave an ; active segment FD open while unlinking /path_store_*.dat on ESP32. diff --git a/exercises/204_established_identities/scripts/pull_build_from_ryzdesk.sh b/exercises/204_established_identities/scripts/pull_build_from_ryzdesk.sh new file mode 100755 index 0000000..efa2daa --- /dev/null +++ b/exercises/204_established_identities/scripts/pull_build_from_ryzdesk.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# $Header$ +# $HeadURL$ + +set -e + +EXERCISE="/usr/local/src/microreticulum/microReticulumTbeam/exercises/204_established_identities" + +for env in amy bob cy dan ed flo guy +do + ENV="$(echo "$env" | tr '[:lower:]' '[:upper:]')" + + echo "===== copy artifact $env from ryzdesk =====" + rsync -a \ + "ryzdesk:${EXERCISE}/.pio/build/${env}/" \ + "${EXERCISE}/.pio/build/${env}/" + + echo "===== upload $env / $ENV =====" + pio run \ + -d "$EXERCISE" \ + -e "$env" \ + -t nobuild \ + -t upload \ + --upload-port "/dev/ttyt${ENV}" +done diff --git a/exercises/204_established_identities/src/main.cpp b/exercises/204_established_identities/src/main.cpp index c6c4de1..1d87a87 100644 --- a/exercises/204_established_identities/src/main.cpp +++ b/exercises/204_established_identities/src/main.cpp @@ -49,6 +49,12 @@ #ifndef MR_LINKFWD_DELAY_MS #define MR_LINKFWD_DELAY_MS 0 #endif +#ifndef ANNOUNCEMENT_2 +#define ANNOUNCEMENT_2 300 +#endif +#ifndef ANNOUNCEMENT_REPEAT +#define ANNOUNCEMENT_REPEAT 3600 +#endif static constexpr const char* APP_NAME = "microreticulum"; static constexpr const char* APP_ASPECT = "linkping"; @@ -62,6 +68,8 @@ static constexpr uint32_t LINK_RETRY_MS = 90000; static constexpr uint32_t LINK_RX_STALE_MS = 75000; static constexpr uint32_t LINK_REOPEN_DELAY_MS = 5000; static constexpr uint8_t LINK_MESSAGES_PER_CYCLE = 5; +static constexpr uint32_t ANNOUNCEMENT_2_MS = (uint32_t)ANNOUNCEMENT_2 * 1000UL; +static constexpr uint32_t ANNOUNCEMENT_REPEAT_MS = (uint32_t)ANNOUNCEMENT_REPEAT * 1000UL; struct DateTime { uint16_t year = 0; @@ -614,10 +622,6 @@ static uint8_t node_send_slot_second() { return (uint8_t)(4U + ((uint8_t)NODE_SLOT_INDEX * 4U)); } -static uint8_t node_announce_slot_second() { - return (uint8_t)(2U + ((uint8_t)NODE_SLOT_INDEX * 4U)); -} - static int find_peer_by_label(const String& label) { for (uint8_t i = 0; i < MAX_PEERS; ++i) { if (peers[i].label == label) { @@ -920,6 +924,9 @@ static void print_config() { (int)NODE_SLOT_INDEX, (int)EX204_RNS_TRACE, (unsigned)MR_LINKFWD_DELAY_MS); + Serial.printf("Announce: startup=1 second=%lu repeat=%lu seconds\r\n", + (unsigned long)ANNOUNCEMENT_2, + (unsigned long)ANNOUNCEMENT_REPEAT); } static void send_announce() { @@ -931,6 +938,35 @@ static void send_announce() { inbound_destination.announce(RNS::bytesFromString(NODE_LABEL)); } +static void maybe_send_scheduled_announce() { + if (!clock_ready || !inbound_destination) { + return; + } + + static bool startup_announce_sent = false; + static uint8_t announce_count = 0; + static uint32_t next_announce_ms = 0; + + const uint32_t now = millis(); + if (!startup_announce_sent) { + startup_announce_sent = true; + announce_count = 1; + next_announce_ms = now + ANNOUNCEMENT_2_MS; + send_announce(); + return; + } + + if ((int32_t)(now - next_announce_ms) < 0) { + return; + } + + send_announce(); + if (announce_count < 2) { + announce_count = 2; + } + next_announce_ms = now + ANNOUNCEMENT_REPEAT_MS; +} + static void maybe_open_link(const DateTime& rtc_now, bool have_rtc_now) { const uint32_t now = millis(); static uint32_t last_open_ms = 0; @@ -1114,7 +1150,6 @@ void loop() { static uint32_t last_rtc_poll_ms = 0; static DateTime rtc_now{}; static bool have_rtc_now = false; - static uint8_t last_announce_minute = 255; uint32_t now = millis(); if ((uint32_t)(now - last_rtc_poll_ms) >= 200U) { @@ -1123,11 +1158,7 @@ void loop() { } maybe_open_link(rtc_now, have_rtc_now); - if (have_rtc_now && rtc_now.second == node_announce_slot_second() && - last_announce_minute != rtc_now.minute) { - last_announce_minute = rtc_now.minute; - send_announce(); - } + maybe_send_scheduled_announce(); const uint8_t send_slot = node_send_slot_second(); const uint8_t second_slot = (uint8_t)((send_slot + 30U) % 60U); if (have_rtc_now && (rtc_now.second == send_slot || rtc_now.second == second_slot)) {