diff --git a/404.html b/404.html index adf95b10..bed590e6 100644 --- a/404.html +++ b/404.html @@ -652,6 +652,33 @@ +
  • + + + + + + + + Hardware validation checklist + + + + + + + + +
  • + + + + + + + + +
  • diff --git a/WiFi/index.html b/WiFi/index.html index a54d4f89..0f425955 100644 --- a/WiFi/index.html +++ b/WiFi/index.html @@ -837,6 +837,33 @@ +
  • + + + + + + + + Hardware validation checklist + + + + + + + + +
  • + + + + + + + + +
  • @@ -2087,9 +2114,11 @@ WiFi only, not LoRa transmit power.

    Recognizing the wrong firmware

    get wifi.status, get wifi.ssid, get wifi.powersave, and get wifi.cli are available on MQTT observers and on FULL non-MQTT repeater/room-server -builds with WebConfig. ESP32 WiFi Companions with WebConfig expose those -commands, credential setters, and start webconfig [ap] through their USB text -terminal; Full Companion additionally exposes that terminal on TCP port 5002. +builds with WebConfig. ESP32 WiFi Companions expose the first three commands, +credential setters, and start webconfig [ap] through their USB text terminal; +get/set wifi.cli explicitly report that the repeater/room-server browser CLI +is unavailable. Full Companion instead exposes its complete role-specific text +terminal on TCP port 5002. MQTT commands such as get mqtt.status and set mqtt1.preset ... still require an MQTT observer target. Unknown settings return Error: unknown setting: <name>. Older firmware that used the discontinued compact CLI can instead diff --git a/_javascript/firmware_picker.js b/_javascript/firmware_picker.js index 483726a8..10783510 100644 --- a/_javascript/firmware_picker.js +++ b/_javascript/firmware_picker.js @@ -44,7 +44,7 @@ const OTA_LABELS = Object.freeze({ none: "No LoRa OTA", - "lora-receiver": "LoRa OTA enabled / receiver", + "lora-receiver": "LoRa OTA repeater", "lora-source": "LoRa OTA source only (Full Companion)", }); @@ -501,6 +501,26 @@ }); } + function applyMergedRak4631RepeaterCapabilities(profiles) { + return (profiles || []).map(function (profile) { + const target = String(profile && profile.target || "").toLowerCase(); + if ( + target !== "rak_4631_repeater" && + target !== "rak_4631_repeater_lora_ota_no_external_sensors" + ) { + return profile; + } + + // The canonical RAK4631 repeater contains both the ordinary interface + // and the runtime-selectable RS232 bridge. Legacy Serial1/Serial2 target + // rows remain exact OTA compatibility assets; do not attach their files + // to this profile merely to expose the merged image's second mode. + profile.mode = "standard"; + profile.connectionModes = ["standard", "rs232"]; + return profile; + }); + } + function applyMergedStandardUsbLoggingCapabilities(profiles) { return (profiles || []).map(function (profile) { const safeRole = [ @@ -619,8 +639,10 @@ return !isHiddenLegacyProfile(profile); }); const profiles = applyMergedStandardUsbLoggingCapabilities( - omitTransportsReplacedByFull( - applyFullCompanionCapabilities(visibleProfiles) + applyMergedRak4631RepeaterCapabilities( + omitTransportsReplacedByFull( + applyFullCompanionCapabilities(visibleProfiles) + ) ) ).sort(function (a, b) { return a.target.localeCompare(b.target, undefined, { @@ -655,6 +677,9 @@ } function profileFieldValues(profile, field) { + if (field === "mode" && Array.isArray(profile.connectionModes)) { + return profile.connectionModes; + } if (field === "logging" && Array.isArray(profile.loggingModes)) { return profile.loggingModes; } @@ -714,10 +739,27 @@ rak15001: "RAK15001", qspi: "QSPI", }; - return value.split("-").map(function (token) { - return tokenLabels[token] || - token.charAt(0).toUpperCase() + token.slice(1); - }).join(" "); + const tokens = value.split("-"); + const labels = []; + for (let index = 0; index < tokens.length; index += 1) { + if ( + tokens[index] === "no" && + tokens[index + 1] === "external" && + tokens[index + 2] === "sensors" + ) { + // The legacy target token is an OTA identity, not a literal statement + // that the I2C bus and every external peripheral have been removed. + labels.push("Reduced optional environmental/ranging drivers"); + index += 2; + continue; + } + const token = tokens[index]; + labels.push( + tokenLabels[token] || + token.charAt(0).toUpperCase() + token.slice(1) + ); + } + return labels.join(" "); } function labelFor(field, value) { @@ -790,7 +832,7 @@ ], zip: [ "Use the ZIP as the native nRF52 Serial DFU package; it is not an extra archive.", - "For LoRa OTA receiving, install the exact-board OTAFIX bootloader first.", + "For a LoRa OTA repeater, install the exact-board OTAFIX bootloader first.", ], uf2: [ "Place the device in its UF2 bootloader mode and copy the UF2 to the mounted drive.", @@ -804,7 +846,7 @@ const extra = []; if (profile.ota === "lora-receiver") { extra.push( - "This installs the LoRa OTA receiver profile. The later update package must still match the exact target and partition signature." + "This installs the LoRa OTA repeater profile. The later update package must still match the exact target and partition signature." ); } else if (profile.ota === "lora-source") { extra.push( @@ -860,7 +902,12 @@ facts.className = "firmware-picker-facts"; const factRows = [ ["Target", profile.target], - ["Connection / mode", labelFor("mode", profile.mode)], + [ + "Connection / mode", + profileFieldValues(profile, "mode").map(function (mode) { + return labelFor("mode", mode); + }).join(" / "), + ], ["Logging", labelFor("logging", profile.logging)], ["OTA", labelFor("ota", profile.ota)], ["Feature profile", labelFor("feature", profile.feature)], @@ -1203,6 +1250,8 @@ parseFirmwareAsset: parseFirmwareAsset, parseTargetProfile: parseTargetProfile, applyFullCompanionCapabilities: applyFullCompanionCapabilities, + applyMergedRak4631RepeaterCapabilities: + applyMergedRak4631RepeaterCapabilities, applyMergedStandardUsbLoggingCapabilities: applyMergedStandardUsbLoggingCapabilities, applyDualCdcFullCompanionCapabilities: applyFullCompanionCapabilities, diff --git a/cli_build_matrix/index.html b/cli_build_matrix/index.html index 07e2ee40..2813e495 100644 --- a/cli_build_matrix/index.html +++ b/cli_build_matrix/index.html @@ -787,6 +787,33 @@ +

  • + + + + + + + + Hardware validation checklist + + + + + + + + +
  • + + + + + + + + +
  • @@ -1538,7 +1565,7 @@ retain 50 because their MQTT discovery tables are constrained by internal DRAM.< Internal-flash nRF52 repeater auto pair -full-ota retains the board's external-sensor drivers; reduced-ota omits the declared optional sensors to leave additional internal-flash staging room. RAK3401 and RAK4631 reduced builds retain INA219, INA226, INA260, and INA3221 I2C voltage/current monitors at a measured 4,808-byte flash cost. Both artifacts carry the same stable OTA target identity and are checked for ota ... and retry.preset; RAK artifacts also verify the retained monitor drivers. +full-ota retains the board's external-sensor drivers; reduced-ota omits the declared optional sensors to leave additional internal-flash staging room. RAK3401 and RAK4631 reduced builds retain INA219, INA226, INA260, and INA3221 I2C voltage/current monitors at a measured cost below 5 KiB. Both artifacts carry the same stable OTA target identity and are checked for ota ... and retry.preset; RAK artifacts also verify the retained monitor drivers. ESP32 MQTT observer or ESP-NOW bridge @@ -1562,10 +1589,19 @@ retain 50 because their MQTT discovery tables are constrained by internal DRAM.< no_external_sensors -Removes optional external-sensor drivers and their settings; it does not remove core repeater discovery, routing, or runtime RS-232 commands. RAK3401 and RAK4631 profiles retain the four common INA I2C voltage/current monitors. GPS-preserving RAK nRF52 OTA profiles retain their GPS commands and provider; RAK4631 defaults the bridge to UART 2 because GPS uses UART 1. Legacy target suffixes remain stable for OTA identity compatibility. +Trims selected optional environmental/ranging drivers and their settings; it does not remove generic I2C, core repeater discovery, routing, or runtime RS-232 commands. RAK3401 and RAK4631 profiles retain the four common INA I2C voltage/current monitors. GPS-preserving RAK nRF52 OTA profiles retain their GPS commands and provider; RAK4631 defaults the bridge to UART 2 because RAK12501/L76K GPS uses UART 1. Legacy target suffixes remain stable for OTA identity compatibility. +

    The four retained INA drivers are entries in the optional environmental-sensor +table, not the complete set of RAK I2C consumers. Compatible reduced profiles +also retain the SSD1306 OLED, supported autodiscovered RTCs, and RAK12500 I2C +GPS as separate board peripherals. RAK12501/L76K GPS uses UART Serial1. The +explicit RAK4631 Serial1 bridge omits the combined GPS provider, including the +otherwise non-UART RAK12500 path.

    +

    The firmware-configured INA3221 and RAK12500 addresses are both 0x42. To use +both devices on one bus, leave RAK12500 at 0x42, strap INA3221 A0 to SCL for +0x43, and build with -DTELEM_INA3221_ADDRESS=0x43.

    logging, OTA, and FULL describe independent build features in historical filenames. Current standard artifacts use no -logging- infix because their USB logging is runtime controlled.

    @@ -1615,7 +1651,7 @@ available from a canonical image:

    partition by 2,192 bytes.
  • The old aliases still work with build-firmware and -build-matching-firmwares. Dedicated repeater LoRa OTA receiver images are not +build-matching-firmwares. Dedicated LoRa OTA repeater images are not collapsed; they retain their exact storage, bootloader, role, and target identity contracts. Companion boards keep transport-specific canonical images only when no exact Full recipe has passed the combined flash/RAM qualification. @@ -1652,14 +1688,15 @@ maintain the repeater administrator neighbor table.

    Even in a FULL build, a command can be unavailable when its underlying feature does not exist on that target:

    +

    The firmware-configured INA3221 and RAK12500 addresses are both 0x42; they +cannot coexist on one bus at those addresses. Leave RAK12500 at 0x42, strap +INA3221 A0 to SCL for 0x43, and use a build with +-DTELEM_INA3221_ADDRESS=0x43 when both are installed.

    Cell values mean: