14e2f2ea9f
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.
64 lines
2.4 KiB
HTML
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>
|