screentinker/brightsign/selftest/index.html
ScreenTinker 4e625abf50 BrightSign: boot from internal flash, proven on hardware
An XT245 with liquid-corroded microSD lines could not read any card, in any
format, with known-good code — the kernel log shows the mmc1 host probing at
400kHz and no card ever answering, while mmc0 (eMMC) is healthy. That unit
turned out to be fully deployable anyway: the player boots FLASH:/autorun.brs
straight from internal storage.

    Loading 'FLASH:/autorun.brs'
    BSPLAY: https://screentinker.com/player?platform=brightsign&model=XT245

So the card is not the only path, and a dead slot is not the end of a player.
Files go to /storage/flash over SFTP and the player runs them on the next boot.

The first attempt failed because the script hard-coded SD: for its own assets:
it loaded from flash and then could not find index.html. StorageRoot() now
probes for FLASH:/autorun.brs and falls back to SD:, and every path that reads a
sibling file — screentinker.json, offline.html, the crash-dump directory — goes
through it.

selftest/ is the bisect that settled the hardware fault: the dev-cookbook's own
html-starter pattern, so the script is not a variable. When known-good code
failed identically, the medium was proven at fault rather than our port.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Uaeo9MvzKoyXuN6ZsbhtkL
2026-08-04 23:26:43 -05:00

34 lines
1.5 KiB
HTML

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>ScreenTinker storage self-test</title>
<style>
html,body{margin:0;height:100%;background:#0b3d1f;color:#eaffea;
font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;text-align:center}
h1{font-size:5vw;margin:0 0 2vh} p{font-size:2vw;margin:.5vh 0;color:#b9e8c4}
code{font-size:1.6vw;color:#9fe6b5}
</style></head>
<body><div>
<h1>STORAGE OK</h1>
<p>The player is reading this card and running <code>autorun.brs</code>.</p>
<p id="js">JavaScript: running</p>
<p id="mods">BrightSign JS modules: checking…</p>
<p id="net">Server reachable: checking…</p>
</div>
<script>
// Each line below removes one suspect from the list, in the order they matter.
try {
var ok = [];
['messageport','registry','deviceinfo','syncmanager'].forEach(function (m) {
try { require('@brightsign/' + m); ok.push(m); } catch (e) {}
});
document.getElementById('mods').textContent =
ok.length ? 'BrightSign JS modules: ' + ok.join(', ') : 'BrightSign JS modules: NONE (brightsign_js_objects_enabled?)';
} catch (e) {
document.getElementById('mods').textContent = 'BrightSign JS modules: require() unavailable';
}
fetch('https://screentinker.com/api/status', { cache: 'no-store' })
.then(function (r) { document.getElementById('net').textContent = 'Server reachable: YES (HTTP ' + r.status + ')'; })
.catch(function (e) { document.getElementById('net').textContent = 'Server reachable: NO — ' + e.message; });
</script>
</body></html>