diff --git a/_javascript/firmware_picker.js b/_javascript/firmware_picker.js index e2e613b1..374c6862 100644 --- a/_javascript/firmware_picker.js +++ b/_javascript/firmware_picker.js @@ -403,9 +403,14 @@ ].includes(target); } - function omitTransportsReplacedByDualCdcFull(profiles) { + function isFullCompanion(profile) { + return Boolean(profile && profile.role === "companion" && + profile.mode === "full"); + } + + function omitTransportsReplacedByFull(profiles) { const fullKeys = new Set((profiles || []).filter(function (profile) { - return isDualCdcFullCompanion(profile); + return isFullCompanion(profile); }).map(function (profile) { return profile.hardware + "\n" + profile.variant; })); @@ -419,16 +424,18 @@ }); } - function applyDualCdcFullCompanionCapabilities(profiles) { + function applyFullCompanionCapabilities(profiles) { return (profiles || []).map(function (profile) { - if (!isDualCdcFullCompanion(profile)) return profile; + if (!isFullCompanion(profile)) return profile; - // Supported Full Companion images always expose framed Companion traffic - // on interface 00. Logging defaults off; enabling it and rebooting adds - // the independent plaintext CDC interface 02. + // Every Full Companion has a runtime USB logging mode. Dual-CDC targets + // add an independent plaintext interface after reboot; single-TTY + // targets switch their existing port between framed and plaintext modes. profile.logging = "usb-runtime"; profile.loggingModes = ["none", "usb"]; - profile.dedicatedUsbLogging = true; + if (isDualCdcFullCompanion(profile)) { + profile.dedicatedUsbLogging = true; + } return profile; }); } @@ -532,8 +539,8 @@ }).filter(function (profile) { return !isHiddenLegacyProfile(profile); }); - const profiles = omitTransportsReplacedByDualCdcFull( - applyDualCdcFullCompanionCapabilities(visibleProfiles) + const profiles = omitTransportsReplacedByFull( + applyFullCompanionCapabilities(visibleProfiles) ).sort(function (a, b) { return a.target.localeCompare(b.target, undefined, { numeric: true, @@ -731,13 +738,17 @@ "With no saved SSID, the setup AP stays available for 30 minutes after each boot, then Wi-Fi powers off automatically until reboot or an explicit start webconfig command. A configured Wi-Fi mode keeps reconnecting instead." ); } else if (profile.logging === "usb-runtime") { - extra.push( - "Full Companion starts with USB logging off and only interface 00. Use get usb.logging, or set usb.logging on reboot to save logging on and reboot when needed; set usb.logging off reboot removes interface 02 again." - ); if (profile.dedicatedUsbLogging) { + extra.push( + "Full Companion starts with USB logging off and only interface 00. Use get usb.logging, or set usb.logging on reboot to add interface 02; set usb.logging off reboot removes it again." + ); extra.push( "Interface 00 always carries Companion/terminal/mOTA traffic. After logging is enabled and the node reboots, interface 02 carries plaintext logs. Match services by USB interface number instead of assuming tty or COM numbering." ); + } else { + extra.push( + "Full Companion starts with USB logging off and Binary Companion on its single TTY. Enter the text terminal and use set usb.logging on for plaintext logs; that TTY still accepts set usb.logging off and automatically returns to Binary Companion after the reply." + ); } } return common.concat(byKind[kind] || [], extra); @@ -1106,15 +1117,16 @@ flattenReleaseAssets: flattenReleaseAssets, parseFirmwareAsset: parseFirmwareAsset, parseTargetProfile: parseTargetProfile, - applyDualCdcFullCompanionCapabilities: - applyDualCdcFullCompanionCapabilities, + applyFullCompanionCapabilities: applyFullCompanionCapabilities, + applyDualCdcFullCompanionCapabilities: applyFullCompanionCapabilities, applyNrf52FullCompanionCapabilities: - applyDualCdcFullCompanionCapabilities, + applyFullCompanionCapabilities, canonicalHardware: canonicalHardware, + omitTransportsReplacedByFull: omitTransportsReplacedByFull, omitTransportsReplacedByDualCdcFull: - omitTransportsReplacedByDualCdcFull, + omitTransportsReplacedByFull, omitNrf52TransportsReplacedByFull: - omitTransportsReplacedByDualCdcFull, + omitTransportsReplacedByFull, hardwareFamilyFor: hardwareFamilyFor, humanizeHardwareVariant: humanizeHardwareVariant, buildCatalog: buildCatalog, diff --git a/cli_build_matrix/index.html b/cli_build_matrix/index.html index f143e451..1ee25c97 100644 --- a/cli_build_matrix/index.html +++ b/cli_build_matrix/index.html @@ -1503,7 +1503,7 @@ retain 50 because their MQTT discovery tables are constrained by internal DRAM.< Standard logging -Logging does not remove commands by itself. It has the same CLI as the selected role/profile and adds compiled logging behavior. CommonCLI roles persist get/set usb.logging. ESP32 roles covered by unified FULL and nRF52 Companions covered by dual-CDC Full Companion are not duplicated here. +Logging does not remove commands by itself. It has the same CLI as the selected role/profile and adds compiled logging behavior. CommonCLI roles persist get/set usb.logging. Roles covered by a Full image with runtime logging are not duplicated here. LoRa-OTA (-ota-) @@ -1530,6 +1530,10 @@ retain 50 because their MQTT discovery tables are constrained by internal DRAM.< nRF52 and qualified native-USB ESP32-S3 Full images use one physical USB connection. Fresh installs expose only interface 00 for framed Companion/terminal/mOTA traffic. Enabling logging and rebooting adds interface 02 for plaintext logs. They also provide BLE and source-only LoRa OTA; ESP32 additionally provides WiFi. get/set usb.logging persistently controls whether the logging interface is present. +Single-TTY Full Companion +ESP32 Full images without dual CDC start with framed Companion on their one TTY. set usb.logging on switches it to an input-capable plaintext logging terminal; set usb.logging off replies and then restores framed Companion automatically. BLE, WiFi, and source-only LoRa OTA remain available. + + no_external_sensors Removes optional external-sensor drivers and their settings; it does not remove core repeater discovery or routing commands. RAK3401 and RAK4631 profiles retain the four common INA I2C voltage/current monitors. GPS-preserving RAK nRF52 OTA profiles also retain their GPS commands and provider. The RAK4631 Serial1 RS232 bridge remains GPS-off because both features require Serial1. The legacy target suffix is retained for OTA identity compatibility. @@ -1550,16 +1554,13 @@ available from a canonical image:

replaced by their ordinary Station target. G2 boosted receive gain is the persisted radio.rxgain on|off setting; the G3 alias changed only the advertised default name. -
  • When a board has a dual-CDC Full Companion, that one artifact replaces its +
  • When a board has a Full Companion, that one artifact replaces its separate USB, BLE, ordinary WiFi, and USB packet-logging Companion artifacts. - Current support includes nRF52 Full Companion plus qualified native-USB - ESP32-S3 Full targets: Heltec V4, T-Beam 1W, Station G2/G3, XIAO S3 WIO, - Heltec Tracker V2, Meshnology W12, and Nibble Screen/Zero Connect. RAK3112 - and Heltec RC32 keep separate transport and logging artifacts pending live - hardware validation. - It provides BLE plus an always-present interface 00 for framed - Companion/terminal/mOTA traffic. Enabling logging and rebooting adds - interface 02 for plaintext logs. + It provides BLE and source-only LoRa OTA; ESP32 also provides ordinary WiFi. + Dual-CDC builds keep framed traffic on interface 00 and add logging on + interface 02 after a reboot. Single-TTY builds switch interface 00 into + an input-capable logging terminal and restore Binary Companion when that + terminal session ends. Its LoRa OTA support is source-only: it can serve a host file to another node but has no staging store and cannot update itself over LoRa. Installing an ESP32 Full Companion may require one merged-image erase/flash @@ -1571,9 +1572,10 @@ available from a canonical image:

    The old aliases still work with build-firmware and build-matching-firmwares. Dedicated repeater LoRa OTA receiver images are not collapsed; they retain their exact storage, bootloader, role, and target -identity contracts. ESP32 boards without the tested dual-CDC Full profile keep -USB, BLE, WiFi, and Full Companion images separate because Full changes -partitions, RAM use, active transports, and power behavior.

    +identity contracts. Companion boards keep transport-specific canonical images +only when no exact Full recipe has passed the combined flash/RAM qualification. +Dual CDC is not required: a qualified single-TTY Full image safely makes Binary +Companion and plaintext USB logging mutually exclusive.

    Complete CLI policy

    The compact ESP32 CLI has been removed. retry.preset is a checked invariant for every repeater and room-server artifact, not a FULL-only command. MQTT diff --git a/cli_command_availability/index.html b/cli_command_availability/index.html index 1293d57b..36567d7e 100644 --- a/cli_command_availability/index.html +++ b/cli_command_availability/index.html @@ -1868,7 +1868,7 @@ fix, no WiFi connection, an inactive bridge, or an nRF52 bootloader without Logging get/set usb.logging; unified FULL get/set logging.output -Logging artifacts; CommonCLI USB gate is persistent; unified ESP32 FULL selects off/USB/WiFi/both; dual-CDC Full Companion adds/removes its second USB port after reboot +Logging artifacts; CommonCLI USB gate is persistent; unified ESP32 FULL selects off/USB/WiFi/both; Full Companion uses either a reboot-controlled second CDC or an input-capable single-TTY logging terminal No Yes No @@ -3207,7 +3207,7 @@ fix, no WiFi connection, an inactive bridge, or an nRF52 bootloader without Logging get/set usb.logging; unified FULL get/set logging.output -Logging artifacts; CommonCLI USB gate is persistent; unified ESP32 FULL selects off/USB/WiFi/both; dual-CDC Full Companion adds/removes its second USB port after reboot +Logging artifacts; CommonCLI USB gate is persistent; unified ESP32 FULL selects off/USB/WiFi/both; Full Companion uses either a reboot-controlled second CDC or an input-capable single-TTY logging terminal No Yes No diff --git a/cli_commands/index.html b/cli_commands/index.html index c8a2b954..528d5a22 100644 --- a/cli_commands/index.html +++ b/cli_commands/index.html @@ -5630,9 +5630,10 @@ set usb.logging off set usb.logging on reboot set usb.logging off reboot -

    These commands are compiled into logging artifacts and control their live USB -debug and packet output. CommonCLI roles save the setting in /com_prefs, so -it survives reboot; their first boot defaults to on.

    +

    These commands are compiled into logging artifacts and every Full Companion. +They control live USB debug and packet output. CommonCLI roles save the setting +in /com_prefs, so it survives reboot; their first boot defaults to on. Full +Companion starts off on a fresh installation.

    On Full Companion these lines belong to its text terminal, not meshcli's Binary get/set parameter namespace. Open interface 00, send +++MESHCORE-TERM-START, and then issue the command. Running @@ -5646,10 +5647,16 @@ without the optional reboot argument saves the choice and reports t reboot is required when the USB interface count must change. The exact set usb.logging on reboot and set usb.logging off reboot forms save the choice, send their reply, and reboot one second later only when needed. This -behavior includes nRF52 and qualified native-USB ESP32-S3 Full images.

    -

    Turning USB logging off does not disable CLI replies or Companion protocol -frames. It also does not change the node-storage capture controlled by log -start and log stop.

    +behavior includes nRF52 and dual-CDC native-USB ESP32-S3 Full images.

    +

    On a single-TTY ESP32 Full Companion, enter the USB text terminal and use +set usb.logging on to turn that TTY into a logging-repeater-style plaintext +stream. It remains an input-capable CLI, so set usb.logging off works on the +same TTY and automatically restores Binary Companion after its reply. No +reboot is needed because the USB interface count does not change.

    +

    Turning USB logging off does not disable CLI replies. Dual-CDC builds keep +Companion frames active on interface 00; single-TTY builds resume frames when +their terminal session ends. This setting does not change the node-storage +capture controlled by log start and log stop.

    Unified ESP32 FULL builds add one saved selector for both output paths:

    get logging.output
     set logging.output off
    diff --git a/companion_offline_queue/index.html b/companion_offline_queue/index.html
    index cd1945ca..1571024f 100644
    --- a/companion_offline_queue/index.html
    +++ b/companion_offline_queue/index.html
    @@ -1324,6 +1324,10 @@ A reboot clears it.

    128 +Meshadventurer Full Companion +64 + + Constrained Full ESP32 fallback 16 @@ -1332,7 +1336,10 @@ A reboot clears it.

    An explicit target OFFLINE_QUEUE_SIZE overrides the platform default. The Heltec V2 and TLora V2 Full Companion profiles, for example, use 16 frames so their combined WiFi, BLE, and LoRa mOTA image retains enough internal DRAM. -Standard, logging, MQTT, and Cascade build overlays retain the selected target +Meshadventurer SX1262 and SX1268 Full Companion use 64 frames together with 160 +contacts and 30 group channels; their ordinary transport-specific images keep +128 frames and 40 channels.

    +

    Standard, logging, MQTT, and Cascade build overlays retain the selected target capacity; they do not silently shrink the queue.

    Each queue slot currently costs 177 bytes. A 256-frame queue reserves 45,312 bytes, while a 512-frame queue reserves 90,624 bytes. There is no 256-frame diff --git a/companion_radio_full/index.html b/companion_radio_full/index.html index 327b287e..62233875 100644 --- a/companion_radio_full/index.html +++ b/companion_radio_full/index.html @@ -514,6 +514,17 @@