diff --git a/BoundaryConfig.h b/BoundaryConfig.h index 19cd4f8..170d098 100755 --- a/BoundaryConfig.h +++ b/BoundaryConfig.h @@ -24,6 +24,11 @@ #include #include +// ─── Node hash (cached in RTC by normal boot, read here without starting RNS) ─ +#define NODE_HASH_RTC_MAGIC 0x504B4841UL +extern uint32_t rtc_node_hash_magic; +extern char rtc_node_hash_hex[33]; + // ─── Config Portal State ───────────────────────────────────────────────────── static bool config_portal_active = false; static WebServer* config_server = nullptr; @@ -126,12 +131,25 @@ static void config_send_html() { "button:hover{background:#c73e54;}" ".ok{background:#16213e;padding:20px;border-radius:8px;text-align:center;}" ".ok h1{color:#0f0;}" + ".node-hash{background:#0f1a30;border:1px solid #0f3460;border-radius:6px;" + "padding:10px 14px;margin:0 0 16px;}" + ".node-hash .nh-label{display:block;font-size:0.75em;color:#888;margin-bottom:4px;}" + ".node-hash code{font-family:monospace;font-size:0.95em;color:#7ecfff;" + "word-break:break-all;letter-spacing:0.05em;}" "" "

📡 RNode Boundary Node

" - "
" ); - // ── WiFi STA Section ── + // ── Node public hash ── + html += F("
🔑 Node Hash (Reticulum destination)"); + if (rtc_node_hash_magic == NODE_HASH_RTC_MAGIC && rtc_node_hash_hex[0] != '\0') { + html += String(rtc_node_hash_hex); + } else { + html += F("Not yet assigned — will be set on first normal boot"); + } + html += F("
"); + + html += F(""); html += F( "

📶 WiFi Network

" "" diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino index 42bbd43..0de0618 100755 --- a/RNode_Firmware.ino +++ b/RNode_Firmware.ino @@ -259,6 +259,13 @@ RTC_NOINIT_ATTR uint32_t boundary_skip_config; RTC_NOINIT_ATTR uint32_t bootloop_magic; RTC_NOINIT_ATTR uint32_t bootloop_count; RTC_NOINIT_ATTR uint32_t bootloop_first_boot_ms; + +// Node public hash — cached in RTC so the config portal can display it without +// needing to start RNS. Populated after the transport destination is created +// on a normal boot; survives software reboots into the captive portal. +#define NODE_HASH_RTC_MAGIC 0x504B4841UL // "PKHA" +RTC_NOINIT_ATTR uint32_t rtc_node_hash_magic; +RTC_NOINIT_ATTR char rtc_node_hash_hex[33]; // 32 hex chars + NUL #endif #endif // HAS_RNS @@ -927,6 +934,17 @@ void setup() { */ RNS::Destination destination(RNS::Transport::identity(), RNS::Type::Destination::IN, RNS::Type::Destination::SINGLE, "rnstransport", "local"); + // Cache this node's destination hash in RTC memory so the captive-portal + // config page can show it without needing RNS to be running. + { + std::string h = destination.hash().toHex(); + size_t len = h.length(); + if (len > 32) len = 32; + memcpy(rtc_node_hash_hex, h.c_str(), len); + rtc_node_hash_hex[len] = '\0'; + rtc_node_hash_magic = NODE_HASH_RTC_MAGIC; + } + HEAD("RNS is READY!", RNS::LOG_TRACE); #ifdef BOUNDARY_MODE HEAD("*** BOUNDARY MODE ACTIVE ***", RNS::LOG_TRACE); diff --git a/Release/rnode_firmware_heltec32v3.bin b/Release/rnode_firmware_heltec32v3.bin index 22d7d56..afe67c5 100755 Binary files a/Release/rnode_firmware_heltec32v3.bin and b/Release/rnode_firmware_heltec32v3.bin differ