Files
MultiRoombaRover/server/public/index.html
T
2025-11-13 23:45:02 -05:00

94 lines
3.9 KiB
HTML

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Multi Roomba Rover</title>
<style>
body { font-family: sans-serif; margin: 16px; }
#layout { display: flex; gap: 16px; }
#roverList { width: 240px; }
#sensorOutput { font-family: monospace; height: 320px; overflow: auto; border: 1px solid #999; padding: 8px; }
button { margin: 4px; }
.row { margin-bottom: 8px; }
#alerts { margin-top: 12px; max-width: 600px; }
.alert { background: #fff1d2; border: 1px solid #f0b651; padding: 6px 8px; margin-bottom: 6px; font-size: 0.9rem; }
#authPanel { margin: 12px 0; display: flex; gap: 8px; align-items: center; }
#authPanel input { padding: 4px; }
#activeDriver { margin-bottom: 8px; font-weight: bold; }
#videoPanel { margin-bottom: 12px; }
#videoContainer { width: 100%; background: #000; min-height: 200px; display: flex; align-items: center; justify-content: center; }
#videoContainer video { width: 100%; max-height: 320px; background: #000; }
#videoStatus { margin-top: 6px; font-size: 0.9rem; color: #444; }
</style>
</head>
<body>
<h1>Multi Roomba Rover</h1>
<div id="status">Connecting…</div>
<div id="authPanel">
<input id="username" placeholder="Username" />
<input id="password" type="password" placeholder="Password" />
<button id="loginBtn">Admin Login</button>
<span id="roleStatus">Role: user</span>
</div>
<div id="layout">
<div id="roverList">
<label for="roverSelect">Rovers</label>
<select id="roverSelect" size="10" style="width: 100%"></select>
<div class="row" id="adminControls">
<label><input type="checkbox" id="forceControl" /> Force control</label>
<button id="lockToggle">Lock/Unlock</button>
</div>
<div class="row" id="modeControls" style="display:none">
<label for="modeSelect">Server mode</label>
<select id="modeSelect">
<option value="open">Open</option>
<option value="turns">Turns</option>
<option value="admin">Admin</option>
<option value="lockdown">Lockdown</option>
</select>
</div>
<div class="row">
<button data-oi="start">Start OI</button>
<button data-oi="safe">Safe</button>
<button data-oi="full">Full</button>
<button data-oi="passive">Passive</button>
<button data-oi="dock">Dock</button>
</div>
<div class="row">
<button id="sensorToggle">Enable Sensor Stream</button>
</div>
<div class="row">
<button id="motorsStop">Stop Motors</button>
</div>
</div>
<div style="flex: 1">
<h3>Sensor Frames</h3>
<div id="currentRover">Active rover: --</div>
<div id="activeDriver">Driver: --</div>
<div id="videoPanel">
<div id="videoContainer">
<video id="driverVideo" muted playsinline></video>
</div>
<div id="videoStatus">No rover selected</div>
<button id="videoReconnect">Reconnect Video</button>
</div>
<pre id="sensorOutput"></pre>
<p>Use WASD keys to drive the selected rover. Shift increases speed.</p>
<div id="alerts"></div>
</div>
</div>
<script src="/socket.io/socket.io.js"></script>
<script src="loader.js"></script>
<script src="src/globals/socket.js"></script>
<script src="src/helpers/formatters.js"></script>
<script src="src/services/state.js"></script>
<script src="src/services/alertFeed.js"></script>
<script src="src/services/authControls.js"></script>
<script src="src/services/videoPlayer.js"></script>
<script src="src/services/roverUI.js"></script>
<script src="src/services/driveControls.js"></script>
<script src="src/main.js"></script>
<p><a href="/spectate/">Open spectator view</a></p>
</body>
</html>