screentinker/brightsign/selftest/autorun.brs
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

35 lines
1 KiB
Plaintext

' ScreenTinker — storage self-test.
'
' NOT the player. This is the smallest known-good BrightScript that proves the player is reading
' the card at all, copied from the dev-cookbook html-starter example so the script itself is not
' a variable.
'
' If the screen shows the green panel: storage is fine, and any failure is in the real autorun.brs
' or downstream (network, server, widget config).
' If the screen still says "Please insert storage device": the player is not reading this medium,
' and no amount of work on the player code will help.
function main()
mp = CreateObject("roMessagePort")
vidmode = CreateObject("roVideoMode")
width = vidmode.GetResX()
height = vidmode.GetResY()
r = CreateObject("roRectangle", 0, 0, width, height)
config = {
nodejs_enabled: true
brightsign_js_objects_enabled: true
url: "file:/FLASH:/index.html"
port: mp
}
h = CreateObject("roHtmlWidget", r, config)
h.Show()
while true
msg = wait(0, mp)
print "msg received - type=";type(msg)
end while
end function