Files
xteink-web-emulator/web/index.html
T
evan 14e2f2ea9f feat(web): surface QEMU logs in-page and enable guest-error diagnostics
Add a log panel that captures QEMU stdout/stderr, route serial to stdio, and
pass -d guest_errors,unimp so device warnings (e.g. the m25p80 Read-ID gap that
stalls CrossPoint boot) are visible in the browser. Read the framebuffer via
HEAPU8 to match the validated node path.
2026-07-20 08:32:14 -04:00

64 lines
2.4 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>xteink web emulator</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<main>
<header>
<p class="eyebrow">ESP32-C3 emulator</p>
<h1>xteink X3 / X4</h1>
<p>Choose a CrossPoint firmware <code>.bin</code> (the ~5 MB release app image, or a full 16 MB flash) and boot it locally in your browser.</p>
</header>
<form id="boot-form" class="boot-panel">
<label>
Firmware (.bin)
<input id="firmware" name="firmware" type="file" accept=".bin,application/octet-stream" required>
</label>
<label>
Device
<select id="variant" name="variant">
<option value="x3">X3</option>
<option value="x4">X4 (display stub)</option>
</select>
</label>
<button id="boot" type="submit">Boot firmware</button>
</form>
<p id="status" class="status" role="status">Waiting for firmware.</p>
<section class="device" aria-label="Emulated xteink device">
<div class="screen-shell">
<canvas id="screen" width="528" height="792" aria-label="E-ink display"></canvas>
</div>
<div id="controls" class="controls" aria-label="Device controls">
<button type="button" data-button="back" disabled>Back</button>
<div class="dpad">
<button type="button" class="up" data-button="up" disabled aria-label="Up"></button>
<button type="button" class="left" data-button="left" disabled aria-label="Left"></button>
<button type="button" class="confirm" data-button="confirm" disabled>OK</button>
<button type="button" class="right" data-button="right" disabled aria-label="Right"></button>
<button type="button" class="down" data-button="down" disabled aria-label="Down"></button>
</div>
<button type="button" class="power" data-button="power" disabled>Power</button>
</div>
</section>
<section class="log-panel" aria-label="Emulator logs">
<div class="log-header">
<span>QEMU log</span>
<button id="log-clear" type="button">Clear</button>
</div>
<pre id="log" class="log" role="log" aria-live="polite"></pre>
</section>
</main>
<script type="module" src="app.js"></script>
</body>
</html>