From d102d099c7280c1baafc3baf0b0d95dee603289d Mon Sep 17 00:00:00 2001 From: Mark Nolan Date: Thu, 17 Sep 2026 17:30:49 +0100 Subject: [PATCH] Name ShimmerCapture's link test a throughput test The test itself was already pathway-neutral - "Link speed", measuring whichever link is connected - but the Verisense console names the same idea a throughput test, and one vocabulary across the two apps is worth more than either wording on its own. So: the Test tab card is "Throughput test", its button "Measure throughput (5 s)", and every refusal that names the thing holding the link says "the throughput test is running". The wording that explains why the dock link cannot run it is untouched, because that limit is real: the dock command set has no data-rate test, so only the Bluetooth links can measure anything here. The SD card tab's stat is "Link throughput" rather than "Throughput". The Stream & record tab already has a "Throughput" stat meaning the live stream's rate, and two stats reading the same word for different figures is worse than the longer label. verify.mjs asserted on two of the strings ("raw link speed: " in the log and "link-speed test" in the apply note) and on the drift panel's skip reason, so those move with the copy. Full pass green: 293/293. Co-Authored-By: Claude Opus 5 --- ShimmerCapture/README.md | 14 ++++++++------ ShimmerCapture/index.html | 16 ++++++++-------- common/dev/verify.mjs | 18 +++++++++--------- common/sd-browser.js | 8 ++++---- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/ShimmerCapture/README.md b/ShimmerCapture/README.md index 48b7042..fd36deb 100644 --- a/ShimmerCapture/README.md +++ b/ShimmerCapture/README.md @@ -488,14 +488,16 @@ Three things that take the sensor's link exclusively for a while. (The red LED used to be here too; it is on **General** now, because nothing about it is a test.) -**Link speed** free-runs the firmware's data-rate test for five seconds and +**Throughput** free-runs the firmware's data-rate test for five seconds and counts what arrives, which is the only honest way to know a link's throughput: BLE negotiates its connection interval with the host's own Bluetooth stack, so -two hosts and the same sensor can differ severalfold. It is Bluetooth-only — -the dock command set has no data-rate test — and refused while the sensor is -sensing or a transfer is running, because it saturates the link on purpose. The -figure lands in the SD card tab's stats and drives its download estimates, so -measuring once after connecting makes those estimates worth reading. +two hosts and the same sensor can differ severalfold. It is named for what it +measures rather than for a link, but on this sensor only the Bluetooth ones can +run it — the dock command set has no data-rate test at all. It is refused +while the sensor is sensing or a transfer is running, because it saturates the +link on purpose. The figure lands in the +SD card tab's stats and drives its download estimates, so measuring once after +connecting makes those estimates worth reading. It used to sit beside the connect buttons. It is here now because it is a test that holds the link, which is what everything else on this tab does, and it diff --git a/ShimmerCapture/index.html b/ShimmerCapture/index.html index 14ee66a..5d90723 100644 --- a/ShimmerCapture/index.html +++ b/ShimmerCapture/index.html @@ -964,7 +964,7 @@

Shimmer Capture

gating machinery with them. The connect row is where the eye should land on the primary action. -->
-
Link speed
+
Throughput test
not measured
@@ -1783,7 +1783,7 @@

Shimmer Capture

$("applyNote").textContent = plan.blocked; } else if (linkTesting) { $("applyNote").textContent = - "Waiting for the link-speed test to finish — it saturates the link on purpose, which is the whole point of it."; + "Waiting for the throughput test to finish — it saturates the link on purpose, which is the whole point of it."; } else if (sdBusy) { /* Not the firmware refusing this time — the page is. One link, one conversation: a configuration write in the middle of a file @@ -3654,7 +3654,7 @@

Shimmer Capture

three (see its setEnabled call), so leaving them unsaid greyed the card out with no reason on screen. */ if (linkTesting) { - return "The link-speed test is running. It saturates the link on purpose — wait the few seconds for it to finish."; + return "The throughput test is running. It saturates the link on purpose — wait the few seconds for it to finish."; } if (brandBusy) { return "A device-naming write is using the link. A download and a name write cannot share it — wait for it to finish."; @@ -3856,7 +3856,7 @@

Shimmer Capture

return "The sensor is sensing, and the firmware refuses every configuration command while it is. Stop the stream before reading or writing calibration."; } if (linkTesting) { - return "The link-speed test is running. It saturates the link on purpose — wait the few seconds for it to finish."; + return "The throughput test is running. It saturates the link on purpose — wait the few seconds for it to finish."; } if (sdBusy) { return "An SD card transfer is using the link. A calibration write and a download cannot share it — wait for the transfer to finish."; @@ -3902,7 +3902,7 @@

Shimmer Capture

return "The sensor is sensing, and the firmware refuses a self-test while it is — the test takes the whole sensor over for up to a minute. Stop the stream first."; } if (linkTesting) { - return "The link-speed test is running. It saturates the link on purpose — wait the few seconds for it to finish."; + return "The throughput test is running. It saturates the link on purpose — wait the few seconds for it to finish."; } if (sdBusy) { return "An SD card transfer is using the link. A report printed into the middle of a block stream would interleave with it — wait for the transfer to finish."; @@ -3974,7 +3974,7 @@

Shimmer Capture

if (!client) return "disconnected"; if (testBusy) return "the self-test is running"; if (streaming || sdLogging) return "the sensor is sensing"; - if (linkTesting) return "the link-speed test is running"; + if (linkTesting) return "the throughput test is running"; if (sdBusy) return "an SD card transfer is using the link"; if (brandBusy) return "a device-naming write is using the link"; if (calibBusy) return "a calibration write is using the link"; @@ -4094,7 +4094,7 @@

Shimmer Capture

return "The sensor is sensing. New names only take effect when it restarts, and the firmware skips a restart while it is sensing so a recording can never be truncated — stop the stream before changing the names."; } if (linkTesting) { - return "The link-speed test is running. It saturates the link on purpose — wait the few seconds for it to finish."; + return "The throughput test is running. It saturates the link on purpose — wait the few seconds for it to finish."; } if (sdBusy) { return "An SD card transfer is using the link. A name write and a download cannot share it — wait for the transfer to finish."; diff --git a/common/dev/verify.mjs b/common/dev/verify.mjs index f72f996..64426ee 100644 --- a/common/dev/verify.mjs +++ b/common/dev/verify.mjs @@ -209,7 +209,7 @@ check( linkOrder.ids.join(" → "), ); -// --- 4. the link-speed button's new home, before anything is connected ---- +// --- 4. the throughput button's new home, before anything is connected ---- const linkIdle = await evaluate(` const sdk = await import('/vendor/shimmer-web-sdk.esm.js'); const btn = document.getElementById('btnLinkTest'); @@ -234,7 +234,7 @@ check( /* Twice moved: out of the SD panel, then out of the connect column. It is a test that takes the link exclusively, which is what the Test tab is for, and its result is still read by the SD panel's own estimates. */ - "the link-speed button lives in the Test tab, not the SD panel or the connect column", + "the throughput button lives in the Test tab, not the SD panel or the connect column", linkIdle.inTestTab && linkIdle.notInLinkCard && linkIdle.notInSdPanel && @@ -905,7 +905,7 @@ check( `${sdDelete.before.length} → ${sdDelete.after.length} files, ${sdDelete.deleteCmds} SD_DELETE commands`, ); -// ---- the link-speed test +// ---- the throughput test const sdLink = await evaluate(` await window.sdBrowser.measureLinkSpeed(1200); // The event log flushes on an animation frame, so the last lines are not @@ -915,11 +915,11 @@ const sdLink = await evaluate(` on: window.mockTransport.writes.some(w => w.bytes[0] === 0xA4 && w.bytes[1] === 1), off: window.mockTransport.writes.some(w => w.bytes[0] === 0xA4 && w.bytes[1] === 0), guide: [...document.querySelectorAll('#log .log-line')].map(l => l.textContent) - .filter(l => /raw link speed: |as a guide|currently on this card/.test(l)) }; + .filter(l => /raw throughput: |as a guide|currently on this card/.test(l)) }; `); const linkKBps = Number(/^([\d.]+) KB\/s$/.exec(sdLink.link)?.[1]); check( - "the link-speed test runs the firmware data-rate test and reports a plausible rate", + "the throughput test runs the firmware data-rate test and reports a plausible rate", sdLink.on && sdLink.off && linkKBps > 100 && @@ -951,7 +951,7 @@ const linkBtn = await evaluate(` noteAfter: document.getElementById('linkTestNote').textContent }; `); check( - "the link-speed button works from the Test tab and reports beside itself", + "the throughput button works from the Test tab and reports beside itself", linkBtn.before.inTestTab && !linkBtn.before.disabled && linkBtn.before.note === "" && @@ -965,7 +965,7 @@ check( "and while it runs it names itself as the thing holding the link", linkBtn.during.disabled && /^(measuring…|[\d.]+ KB\/s …)$/.test(linkBtn.during.pill) && - /link-speed test/.test(linkBtn.during.applyNote) && + /throughput test/.test(linkBtn.during.applyNote) && /Measuring/.test(linkBtn.during.note), `${linkBtn.during.pill} | ${linkBtn.during.applyNote}`, ); @@ -1085,7 +1085,7 @@ check( sdWhileStreaming.banner.slice(0, 80) + "…", ); check( - "the link-speed test is refused while streaming, and says why rather than just greying", + "the throughput test is refused while streaming, and says why rather than just greying", sdWhileStreaming.linkTestRoleGone && sdWhileStreaming.linkTest && /deliberately saturates the link/.test(sdWhileStreaming.linkTestNote) && @@ -4260,7 +4260,7 @@ const skip = await evaluate(` `); check( "a sample is skipped, with the reason, while another panel holds the link", - /skipped/i.test(skip.status) && /link-speed/i.test(skip.status), + /skipped/i.test(skip.status) && /throughput/i.test(skip.status), skip.status.slice(0, 90), ); await send("Emulation.setTimezoneOverride", { timezoneId: "" }); diff --git a/common/sd-browser.js b/common/sd-browser.js index cb10ff0..774329e 100644 --- a/common/sd-browser.js +++ b/common/sd-browser.js @@ -308,7 +308,7 @@ export function createSdBrowser(host, opts = {}) { stat("capacity", "Card capacity"), stat("files", "Files"), stat("bytes", "Total size"), - stat("link", "Link speed"), + stat("link", "Link throughput"), ); const setStat = (key, text) => { @@ -994,7 +994,7 @@ export function createSdBrowser(host, opts = {}) { } setBusy(true); log.log( - `measuring raw link speed (${(durationMs / 1000).toFixed(0)} s, firmware data-rate test)…`, + `measuring raw throughput (${(durationMs / 1000).toFixed(0)} s, firmware data-rate test)…`, ); try { const res = await client.runDataRateTest(durationMs, (bytes, ms) => { @@ -1005,7 +1005,7 @@ export function createSdBrowser(host, opts = {}) { setStat("link", `${res.kBps.toFixed(1)} KB/s`); reportLinkSpeed(res.kBps, true); log.log( - `raw link speed: ${res.kBps.toFixed(1)} KB/s ` + + `raw throughput: ${res.kBps.toFixed(1)} KB/s ` + `(${fmtBytes(res.bytesReceived)} in ${(res.durationMs / 1000).toFixed(1)}s).`, ); if (res.kBps > 0) { @@ -1024,7 +1024,7 @@ export function createSdBrowser(host, opts = {}) { } return res; } catch (err) { - log.error(`Link speed test failed: ${err?.message ?? err}`); + log.error(`Throughput test failed: ${err?.message ?? err}`); reportLinkSpeed(null, true); return null; } finally {