mirror of
https://github.com/screentinker/screentinker.git
synced 2026-08-14 06:16:20 -06:00
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
34 lines
1.5 KiB
HTML
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>
|