From c329cf1fc1e7f2e8c8733ab0d000094730458fe3 Mon Sep 17 00:00:00 2001 From: mikecarper Date: Sun, 13 Sep 2026 18:17:51 -0700 Subject: [PATCH] Publish verified Companion ASCII repair metadata and connection guide --- docs/_data/firmware_controls.json | 108 ++++++++++++------------- docs/_javascript/firmware_picker.js | 13 ++- docs/companion_usb_ascii_validation.md | 68 ++++++++++++++++ docs/full_companion_usb_switcher.md | 2 +- 4 files changed, 133 insertions(+), 58 deletions(-) create mode 100644 docs/companion_usb_ascii_validation.md diff --git a/docs/_data/firmware_controls.json b/docs/_data/firmware_controls.json index 554b4ff5b..fa43081f7 100644 --- a/docs/_data/firmware_controls.json +++ b/docs/_data/firmware_controls.json @@ -117,7 +117,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -281,7 +281,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -373,7 +373,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -611,7 +611,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion capacity: 150 contacts and 256 queued messages; all Full transports are retained. Export contacts before updating if you have more than 150; entries beyond this limit may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": true, @@ -1279,7 +1279,7 @@ "femTx": false, "gps": false, "memoryNote": "Wireless Paper Full capacity: 350 contacts and 40 channels. Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -1411,7 +1411,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion capacity: 150 contacts and 256 queued messages; all Full transports are retained. Export contacts before updating if you have more than 150; entries beyond this limit may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -1543,7 +1543,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion capacity: 150 contacts and 256 queued messages; all Full transports are retained. Export contacts before updating if you have more than 150; entries beyond this limit may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -1673,7 +1673,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -1765,7 +1765,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -1877,7 +1877,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -1987,7 +1987,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -2079,7 +2079,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -2173,7 +2173,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -2302,7 +2302,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion capacity: 100 contacts, 8 channels and 16 queued messages. Export contacts and channels before updating if they exceed these limits; extra entries may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -2440,7 +2440,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion capacity: 150 contacts and 256 queued messages; all Full transports are retained. Export contacts before updating if you have more than 150; entries beyond this limit may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": true, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -2628,7 +2628,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -2720,7 +2720,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -2740,7 +2740,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -2832,7 +2832,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -2924,7 +2924,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -3605,7 +3605,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion capacity: 100 contacts, 8 channels and 16 queued messages. Export contacts and channels before updating if they exceed these limits; extra entries may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -3756,7 +3756,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -4178,7 +4178,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -4270,7 +4270,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -4362,7 +4362,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion capacity: 100 contacts, 30 channels and 16 queued messages. Export contacts and channels before updating if they exceed these limits; extra entries may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -4498,7 +4498,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion capacity: 100 contacts, 30 channels and 16 queued messages. Export contacts and channels before updating if they exceed these limits; extra entries may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -4687,7 +4687,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -4707,7 +4707,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -4799,7 +4799,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -4907,7 +4907,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -5017,7 +5017,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -5310,7 +5310,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -5473,7 +5473,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -5765,7 +5765,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -5929,7 +5929,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -6788,7 +6788,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -7028,7 +7028,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -7248,7 +7248,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -7471,7 +7471,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -7746,7 +7746,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -7766,7 +7766,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -7878,7 +7878,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion capacity: 150 contacts and 256 queued messages; all Full transports are retained. Export contacts before updating if you have more than 150; entries beyond this limit may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -8377,7 +8377,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -8843,7 +8843,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion capacity: 150 contacts and 256 queued messages; all Full transports are retained. Export contacts before updating if you have more than 150; entries beyond this limit may be unavailable or omitted by a later save.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "ESP32_PLATFORM", "primaryEspnow": false, @@ -9775,7 +9775,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -9887,7 +9887,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -9999,7 +9999,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -10111,7 +10111,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -10223,7 +10223,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -10335,7 +10335,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -10447,7 +10447,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -10982,7 +10982,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -11057,7 +11057,7 @@ "femTx": false, "gps": false, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, @@ -11132,7 +11132,7 @@ "femTx": false, "gps": true, "memoryNote": "Full Companion queue: 256 offline messages normally; 128 while mOTA borrows queue storage. Sync unread messages with a Companion app before starting mOTA if more than 128 are pending. Stopping or disconnecting the source restores all 256 slots.", - "memorySource": "306feebe6d648a247f925894f876be9d747fc8d2", + "memorySource": "d4a641ff8af1b413c8fb96a670282b799be1f6e8", "mqtt": false, "platform": "NRF52_PLATFORM", "primaryEspnow": false, diff --git a/docs/_javascript/firmware_picker.js b/docs/_javascript/firmware_picker.js index c1b521cae..36c9bbd53 100644 --- a/docs/_javascript/firmware_picker.js +++ b/docs/_javascript/firmware_picker.js @@ -1102,12 +1102,19 @@ } if (companion && ["full", "usb", "usb-ble"].includes(profile.mode)) { const picocom = "picocom -b 115200 --imap spchex --initstring $'\\r+++MESHCORE-TERM-START\\r' /dev/ttyACM0"; - section("Companion USB terminal (Linux / Bash)", [ - { label: "Connect", commands: [picocom], + const terminalActions = [ + { label: "Force ASCII / older firmware", commands: [picocom], text: "Run this in Bash on the Linux computer connected to the radio. Updated 1.17.1.6 USB Companions default to ASCII at boot and after an observable USB session reset; a valid app frame selects Binary Companion. The init string also opens the ASCII CLI on older firmware or a port left in Binary mode; the leading carriage return clears an unfinished input line. spchex displays binary control bytes safely during the transition." }, { label: "Recover scrambled terminal", commands: ["reset", picocom], text: "First exit picocom with Ctrl+A, then Ctrl+X. Run these commands in your Linux shell: reset repairs the terminal display, then picocom reconnects with safe input mapping." }, - ], "Replace /dev/ttyACM0 with your radio's port, such as /dev/ttyACM1 or /dev/ttyUSB0. Use the primary USB data interface (00 when multiple interfaces appear), and close other apps using that port. At the radio prompt, run version and board to identify the node. Exit picocom with Ctrl+A, then Ctrl+X."); + ]; + if (/^v1\.17\.1\.6(?:-|$)/.test(profile.releaseFamily || "")) { + terminalActions.unshift({ label: "Connect (ASCII default)", + commands: ["picocom -b 115200 --imap spchex /dev/ttyACM0"], + text: "Updated 1.17.1.6 USB Companions start in ASCII, so a fresh session needs no mode token. Run version or help at the prompt. If this port is still owned by a previous binary client, use Force ASCII / older firmware instead." }); + } + section("Companion USB terminal (Linux / Bash)", terminalActions, + "Replace /dev/ttyACM0 with your radio's port, such as /dev/ttyACM1 or /dev/ttyUSB0. Use the primary USB data interface (00 when multiple interfaces appear), and close other apps using that port. At the radio prompt, run version and board to identify the node. Exit picocom with Ctrl+A, then Ctrl+X."); } if (!info) return sections; if (companion && supportsRadioProfileCommands(profile)) { diff --git a/docs/companion_usb_ascii_validation.md b/docs/companion_usb_ascii_validation.md new file mode 100644 index 000000000..a9ca454a6 --- /dev/null +++ b/docs/companion_usb_ascii_validation.md @@ -0,0 +1,68 @@ +# USB Companion ASCII default validation + +The updated [1.17.1.6 Companion release](https://github.com/mikecarper/MeshCore/releases/tag/v1.17.1.6-halo-keymind-cascade-dev-306feebe) +covers 103 USB-enabled profiles: 52 ESP32 Full, 43 nRF52 Full, four RP2040 USB, +and four STM32 USB. The BLE-only WM1110 image has no USB interface and is outside +this change. + +## Behavior and cause + +Ordinary USB Companions previously started in Binary mode. Full Companions +started in ASCII, but host-session cleanup could select or retain Binary mode +for the next connection. + +All USB Companions now select ASCII before framed dispatch begins. An +observable USB session boundary cancels old USB operations and clears partial +input, queued protocol output, frame ownership, and mOTA attachment before restoring +ASCII. A network terminal can defer that restoration; a new USB binary client +that connects during the deferral keeps its chosen mode. BLE and network +Companion transports keep their existing binary protocol. + +A complete framed app command still selects Binary mode automatically. An +incomplete initial probe returns to ASCII after one second. Explicit terminal +start/stop controls remain available. + +Session detection depends on the hardware. Native USB with DTR can detect a +terminal closing. ESP32 hardware USB Serial/JTAG observes bus resets and host +loss, but cannot reliably observe a program closing its handle. UART bridges +usually cannot observe that close either. Idle time never forces an active +binary app back into ASCII; use the start token on a port that remains Binary. +See the [USB mode guide](full_companion_usb_switcher.md). + +## Automated validation + +- The real firmware startup and reset functions are compiled and executed for + nRF52, ESP32 TinyUSB, ESP32 hardware USB, and RP2040, with and without the + Full macro. Cases include reconnecting from Binary or ASCII, delayed cleanup, + mOTA cancellation, network ownership, and a new binary client during deferral. +- 55 native serial-mode/flow-control tests and 11 terminal-session/diagnostic + tests passed locally, along with 49 USB Python tests and the picker tests. +- STM32 number formatting is tested against an Arduino API without `ltoa`. + CI also compiles an ordinary RAK 3x72 USB Companion with the real core and + RadioLib, so missing packages and GPIO API incompatibilities fail the build. + +The 99 ESP32/nRF52/RP2040 profiles use +[`d4a641ff`](https://github.com/mikecarper/MeshCore/commit/d4a641ff8af1b413c8fb96a670282b799be1f6e8). +The four STM32 profiles additionally use the compatible Arduino 2.12 platform +pin and build test in +[`d2c52e4d`](https://github.com/mikecarper/MeshCore/commit/d2c52e4d047c4b1068a1053364d9acaddefa64a1). +Both source revisions passed GitHub checks: +[main repair](https://github.com/mikecarper/MeshCore/actions/runs/34792631229) and +[STM32 repair](https://github.com/mikecarper/MeshCore/actions/runs/34793043594). + +All 103 builds passed capability and RAM qualification. Packaging checks bind +each application to its capability and memory manifests, retain the original +profile capabilities and download formats, and verify ESP32 application/merged +image consistency. Replacement publication verifies public SHA-256 digests +before deleting old images and checks that unrelated firmware assets retain +their original hashes. Release manifests, checksum lists, picker links, and +capacity-note source references follow the new binaries. + +Publication completed with all 430 uploaded files verified through their public +download URLs. The 412 superseded firmware/manifest files were removed. The +remaining 1,837 assets kept their original hashes, and all five release checksum +lists matched the final GitHub asset digests. + +No USB Companion was attached to the local computer for this repair. These +results are compilation and automated protocol tests, not physical USB tests +across the board matrix. diff --git a/docs/full_companion_usb_switcher.md b/docs/full_companion_usb_switcher.md index 1385c8b5c..9be879dc5 100644 --- a/docs/full_companion_usb_switcher.md +++ b/docs/full_companion_usb_switcher.md @@ -214,7 +214,7 @@ a long delay. A timed-out client can retry after the ASCII banner appears. Any complete length-prefixed frame selects binary mode, even if its command is unknown or malformed at the application layer. This is safe for stream separation but means a random complete frame can leave the device in binary -mode until manually switched back. +mode until an observable USB session reset or a manual switch back. ### The terminal banner is best effort