8ccd7689f7
Add configurable Xbox motion and action bindings, frame-aware six-axis MAVLink controls, sensor logging, camera viewing and recording, and a faster startup path. Synchronize both app copies and document companion hardware setup and verification limits.
266 lines
25 KiB
HTML
266 lines
25 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>Argo V2</title>
|
||
<link rel="stylesheet" href="styles.css?v=20261022-v2">
|
||
<link rel="stylesheet" href="v2.css?v=20261022-v2">
|
||
</head>
|
||
<body>
|
||
<main class="app-shell">
|
||
|
||
<!-- ── DECK (Connection, 3D Model, Battery, Deck Controls, Status) ── -->
|
||
<aside class="sidebar-deck" aria-label="Vehicle Deck and Status">
|
||
<div class="sidebar-drag-surface pywebview-drag-region" aria-hidden="true"></div>
|
||
<!-- Connection Controls -->
|
||
<div class="deck-connection">
|
||
<div class="port-row">
|
||
<select id="port" aria-label="Serial port">
|
||
<option value="demo" selected>Demo Mode (no hardware)</option>
|
||
</select>
|
||
<button id="refresh" class="icon-button" title="Refresh ports" aria-label="Refresh ports">
|
||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20 7v5h-5M4 17v-5h5M18.5 9A7 7 0 0 0 6.8 6.8L4 10m16 4-2.8 3.2A7 7 0 0 1 5.5 15"/></svg>
|
||
</button>
|
||
<button class="icon-button" data-open="link-modal" title="Link settings" aria-label="Link settings">
|
||
<svg class="dots-icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="5" cy="12" r="1.25"/><circle cx="12" cy="12" r="1.25"/><circle cx="19" cy="12" r="1.25"/></svg>
|
||
</button>
|
||
</div>
|
||
<button id="connect" class="button connect-button" aria-label="Toggle connection">
|
||
<span class="btn-spinner" aria-hidden="true"></span>
|
||
<span class="btn-label">Connect</span>
|
||
</button>
|
||
</div>
|
||
|
||
<!-- Telemetry / Status Zone -->
|
||
<section class="telemetry-zone" aria-label="Vehicle Telemetry and Status">
|
||
<div class="deck-card model-card">
|
||
<div class="rov-stage" aria-label="Vehicle model">
|
||
<canvas id="model-canvas" aria-label="Interactive STL vehicle model"></canvas>
|
||
<div id="model-status" class="model-status">Initializing…</div>
|
||
<div class="model-tools">
|
||
<button id="load-model">Load STL</button>
|
||
<input id="model-input" type="file" accept=".stl,.STL" hidden>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<button id="link-quality" type="button" class="link-quality" data-grade="offline" title="Open link-quality details" aria-haspopup="dialog" aria-controls="link-quality-modal">
|
||
<span class="link-quality-dot" aria-hidden="true"></span>
|
||
<span><small>Data link</small><strong id="link-quality-grade">Offline</strong></span>
|
||
<i><span id="link-quality-roundtrip">waiting for connection</span><span id="link-quality-downlink"></span></i>
|
||
</button>
|
||
|
||
<div class="deck-status-bar">
|
||
<header class="activity-heading">Activity:</header>
|
||
<ol class="activity-history" aria-label="Last three events" aria-live="polite">
|
||
<li id="activity-oldest" hidden></li>
|
||
<li id="activity-previous" hidden></li>
|
||
<li id="status-text">Not connected</li>
|
||
</ol>
|
||
<div class="activity-actions"><button type="button" id="console" class="logs-link" title="Read live console" aria-label="Read live console">Console</button><button type="button" id="logs" class="logs-link" title="Open session logs" aria-label="Open session logs">Logs</button></div>
|
||
</div>
|
||
<button class="battery-card ghost" data-open="battery-modal" aria-label="Battery status and settings">
|
||
<span class="battery-meter" aria-hidden="true"><em id="battery-fill"></em></span>
|
||
<span class="battery-copy"><span class="battery-summary"><strong id="battery-percent">—</strong><small id="battery-title">No voltage</small></span></span>
|
||
</button>
|
||
</section>
|
||
|
||
</aside>
|
||
|
||
<!-- ── PRIMARY CONTROL ZONE ── -->
|
||
<section class="controls-workspace" aria-label="Primary Vehicle Controls">
|
||
<!-- Frameless Drag & Window Controls Header -->
|
||
<div class="workspace-topbar">
|
||
<div class="input-mode-controls"><div class="input-mode-switch" role="group" aria-label="Control input"><button type="button" id="input-keyboard" aria-pressed="true">Keyboard</button><button type="button" id="input-joystick" aria-pressed="false">Joystick</button></div><button type="button" id="controller-settings" class="controller-settings" data-open="controller-modal">Mapping</button></div>
|
||
<div class="workspace-drag-area pywebview-drag-region"></div>
|
||
<div class="window-actions">
|
||
<button id="window-min" aria-label="Minimize" title="Minimize"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14"/></svg></button>
|
||
<button id="window-max" aria-label="Maximize" title="Maximize"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="5" y="5" width="14" height="14" rx="1.5"/></svg></button>
|
||
<button id="window-close" class="window-close" aria-label="Close" title="Close"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18"/></svg></button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="workspace-nav"><div class="view-switch" role="group" aria-label="Workspace"><button id="view-drive" type="button" aria-pressed="true">Drive</button><button id="view-dashboard" type="button" aria-pressed="false">Dashboard</button></div><span class="version-mark">V2</span><button class="quiet-button" data-open="station-modal" type="button">Vehicle</button></div>
|
||
<p id="controller-status" class="controller-status" role="status">Keyboard + touch</p>
|
||
<section id="dashboard" class="dashboard" aria-label="Vehicle dashboard" hidden>
|
||
<div class="camera-stage">
|
||
<video id="camera-video" muted autoplay playsinline hidden></video><img id="camera-image" alt="Camera stream" hidden><canvas id="camera-demo" aria-label="Simulated inspection camera" hidden></canvas>
|
||
<div id="camera-empty" class="camera-empty"><svg viewBox="0 0 48 48" aria-hidden="true"><rect x="5" y="12" width="27" height="24" rx="6"/><path d="m32 20 11-6v20l-11-6"/></svg><span id="camera-state">Camera off</span></div>
|
||
<div class="camera-overlay"><span id="camera-badge">Preview</span><span id="recording-badge" hidden>● REC</span><span id="stream-clock"></span></div>
|
||
</div>
|
||
<div class="dashboard-actions"><button id="camera-toggle" type="button">Start</button><button id="camera-record" type="button" aria-pressed="false" disabled>Record</button><button id="lights-toggle" type="button" aria-pressed="false" disabled>Lights</button><button id="camera-power" type="button" aria-pressed="false" disabled>Camera power</button><button id="sensor-record" type="button" aria-pressed="false">Log data</button></div>
|
||
<div class="telemetry-strip" aria-label="Live telemetry"><div><span>Depth</span><strong id="live-depth">—</strong></div><div><span>Heading</span><strong id="live-heading">—</strong></div><div><span>Current</span><strong id="live-current">—</strong></div><div><span>Pitch</span><strong id="live-pitch">—</strong></div><div><span>Roll</span><strong id="live-roll">—</strong></div><div><span>Power</span><strong id="live-power">—</strong></div></div>
|
||
<details class="sensor-details"><summary>Sensors <span id="sensor-state">Offline</span></summary><div class="sensor-values"><div><span>Acceleration</span><strong id="live-accel">—</strong></div><div><span>Gyroscope</span><strong id="live-gyro">—</strong></div><div><span>Magnetometer</span><strong id="live-mag">—</strong></div><div><span>Temperature</span><strong id="live-temperature">—</strong></div><div><span>Pressure</span><strong id="live-pressure">—</strong></div><div><span>Charge used</span><strong id="live-charge">—</strong></div></div></details>
|
||
</section>
|
||
<section class="primary-control-zone" aria-label="Primary Control Zone">
|
||
<!-- Reserved Engage / Disarm row -->
|
||
<div class="engage-header-zone">
|
||
<button id="engage" class="button subtle engage-button" aria-label="Engage" aria-describedby="control-status" title="Engage (F2)">
|
||
<span class="engage-face">
|
||
<span id="engage-label" class="engage-label">engage</span>
|
||
<span class="engage-sheen-label" aria-hidden="true">engage</span>
|
||
<span class="engage-progress-label" aria-hidden="true">engage</span>
|
||
</span>
|
||
</button>
|
||
<p id="control-status" class="control-status" role="status" aria-live="polite">Connect to receive vehicle state.</p>
|
||
</div>
|
||
|
||
<!-- Main Joysticks & Thrust Control Grid -->
|
||
<div class="controls-grid">
|
||
<!-- Steering / Throttle Joystick -->
|
||
<article class="control-card steer-card">
|
||
<header>
|
||
<div title="Steer and throttle · W A S D"></div>
|
||
|
||
</header>
|
||
<div class="joystick-pad">
|
||
<div id="joystick" class="joystick" touch-action="none">
|
||
<canvas id="joystick-canvas" title="Steer and throttle · W A S D" aria-label="Steering and throttle joystick; W A S D keys"></canvas>
|
||
</div>
|
||
</div>
|
||
<footer>
|
||
<span class="steer-readout-left">surge <b id="surge-readout">—</b></span>
|
||
<span class="steer-readout-right"><b id="yaw-readout">—</b> turn</span>
|
||
</footer>
|
||
</article>
|
||
|
||
<!-- Vertical Thruster Slider -->
|
||
<article class="control-card vertical-card">
|
||
<header>
|
||
<div title="Vertical thrust · R / F"></div>
|
||
|
||
</header>
|
||
<div class="heave-pad">
|
||
<div class="vertical-control">
|
||
<span>rise</span>
|
||
<div id="heave" title="Vertical thrust · R / F" class="heave-track" touch-action="none">
|
||
<div class="heave-center"></div>
|
||
<div id="heave-fill" class="heave-fill"></div>
|
||
<div id="heave-knob" class="heave-knob"></div>
|
||
</div>
|
||
<span>dive</span>
|
||
</div>
|
||
</div>
|
||
<footer>
|
||
<span><b id="heave-readout">—</b> vertical</span>
|
||
</footer>
|
||
</article>
|
||
</div>
|
||
<div class="control-toolbar">
|
||
<label class="output-limit">
|
||
<span>Output limit <b id="gain-value">20%</b></span>
|
||
<div class="range-pill">
|
||
<button id="gain-down" type="button" aria-label="Decrease output limit"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="m14 6-6 6 6 6"/></svg></button>
|
||
<input id="gain" aria-label="Shared motor output limit" type="range" min="0" max="100" step="1" value="20">
|
||
<button id="gain-up" type="button" aria-label="Increase output limit"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="m10 6 6 6-6 6"/></svg></button>
|
||
</div>
|
||
</label>
|
||
<button class="button subtle config-btn" data-open="motors-modal">Motor setup</button>
|
||
</div>
|
||
<div id="extra-controls" class="extra-controls" hidden><label data-motion="lateral"><span>Strafe</span><input type="range" min="-100" max="100" value="0" aria-label="Strafe demand"><output>0</output></label><label data-motion="pitch"><span>Pitch</span><input type="range" min="-100" max="100" value="0" aria-label="Pitch demand"><output>0</output></label><label data-motion="roll"><span>Roll</span><input type="range" min="-100" max="100" value="0" aria-label="Roll demand"><output>0</output></label></div>
|
||
</section>
|
||
</section>
|
||
<aside id="console-dock" class="console-dock" aria-labelledby="console-title" hidden>
|
||
<header class="console-dock-header"><div><h2 id="console-title" title="Local session messages. Select a message to expand its details.">Console</h2></div><button id="console-close" type="button" class="console-close" aria-label="Hide console" title="Hide console"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18"/></svg></button></header>
|
||
<div class="console-toolbar"><label><span class="visually-hidden">Console filter</span><select id="console-filter"><option value="useful">Useful traffic</option><option value="all">All traffic</option></select></label><button id="console-pause" type="button" aria-pressed="false">Pause</button></div>
|
||
<p id="console-state" class="console-state" role="status" title="Pausing the viewer does not stop session logging." hidden></p>
|
||
<div class="console-streams"><section class="console-side"><header><i class="rx-dot" aria-hidden="true" title="Vehicle to PC · new displayed message"></i><span>RX</span></header><div id="console-rx-output" class="console-output" tabindex="0" aria-label="Received messages"></div></section><section class="console-side"><header><i class="tx-dot" aria-hidden="true" title="PC to vehicle · new displayed message"></i><span>TX</span></header><div id="console-tx-output" class="console-output" tabindex="0" aria-label="Sent messages"></div></section></div>
|
||
</aside>
|
||
</main>
|
||
|
||
<div id="toast" class="toast"></div>
|
||
|
||
<!-- Modals -->
|
||
<dialog id="link-modal" class="modal" aria-labelledby="link-title">
|
||
<button class="modal-close" type="button" data-close aria-label="Close window"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18"/></svg></button><h2 id="link-title">Link settings</h2>
|
||
<form id="link-form" title="Baud changes apply on the next connection.">
|
||
<section class="settings-section"><h3>Serial connection</h3>
|
||
<div class="form-grid two"><label><span>Baud rate</span><select id="baud" name="baud"><option value="9600">9600</option><option value="19200">19200</option><option value="38400">38400</option><option value="57600" selected>57600</option><option value="115200">115200</option></select></label><label><span>Control rate · Hz</span><select id="rate" name="control_hz"><option value="10">10</option><option value="20" selected>20</option></select></label></div>
|
||
|
||
<label class="custom-port-label"><span>Custom port or endpoint</span><div class="custom-port-row"><input id="custom-port-input" placeholder="COM3 or tcp:127.0.0.1:5760" autocomplete="off"><button type="button" id="custom-port-btn" class="button subtle">Use port</button></div></label>
|
||
<p id="custom-port-status" class="note" role="status"></p>
|
||
</section>
|
||
<section class="settings-section"><h3 title="Lower rates leave more bandwidth for controls. Rates reset after a reboot.">Telemetry rates</h3>
|
||
<div class="form-grid two">
|
||
<label><span>Quality check · Hz</span><select name="ping_hz"><option value="1" selected>1</option><option value="2">2</option><option value="5">5</option><option value="10">10</option></select></label>
|
||
<label><span>Battery / system · Hz</span><select name="system_hz"><option value="0">Off</option><option value="1" selected>1</option><option value="2">2</option><option value="5">5</option><option value="10">10</option></select></label>
|
||
<label><span>Battery detail · Hz</span><select name="battery_hz"><option value="0">Off</option><option value="1" selected>1</option><option value="2">2</option><option value="5">5</option><option value="10">10</option></select></label>
|
||
<label><span>Motor outputs · Hz</span><select name="servo_hz"><option value="0">Off</option><option value="1">1</option><option value="2" selected>2</option><option value="5">5</option><option value="10">10</option></select></label>
|
||
<label><span>RC channels · Hz</span><select name="rc_hz"><option value="0">Off</option><option value="1">1</option><option value="2" selected>2</option><option value="5">5</option><option value="10">10</option></select></label>
|
||
<label><span>ESC telemetry · Hz</span><select name="esc_hz"><option value="0">Off</option><option value="1" selected>1</option><option value="2">2</option><option value="5">5</option><option value="10">10</option></select></label>
|
||
</div>
|
||
|
||
</section>
|
||
<p class="form-feedback" role="alert" hidden></p>
|
||
<div class="modal-actions"><button type="button" class="button subtle" data-close>Cancel</button><button type="submit" class="button modal-primary">Apply settings</button></div>
|
||
</form>
|
||
</dialog>
|
||
<dialog id="link-quality-modal" class="modal quality-modal" aria-labelledby="quality-title">
|
||
<button class="modal-close" type="button" data-close aria-label="Close window"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18"/></svg></button><h2 id="quality-title">Link quality</h2>
|
||
|
||
<div class="quality-summary" title="Round-trip replies, incoming packet loss, and heartbeat freshness."><div><span>Round trip</span><strong id="quality-detail-rtt">—</strong></div><div><span>Probe loss</span><strong id="quality-detail-loss">—</strong></div><div><span>FC → PC loss</span><strong id="quality-detail-downlink">—</strong></div></div>
|
||
<section class="heavy-test-panel"><h3 title="Tests 1, 5 and 10 Hz for about 35 seconds while disarmed. The live check resumes afterward.">Extended test</h3>
|
||
<div id="heavy-quality-status" class="heavy-quality-status" role="status">Connect to run an extended test.</div>
|
||
<div id="heavy-quality-results" class="heavy-quality-results"></div>
|
||
<p id="heavy-quality-error" class="form-feedback" role="alert" hidden></p>
|
||
<div class="modal-actions"><button id="heavy-quality-run" type="button" class="button modal-primary">Run extended test</button><button id="heavy-quality-cancel" type="button" class="button subtle" hidden>Stop test</button></div>
|
||
</section>
|
||
</dialog>
|
||
<dialog id="battery-modal" class="modal" aria-labelledby="battery-title-modal">
|
||
<button class="modal-close" type="button" data-close aria-label="Close window"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18"/></svg></button><h2 id="battery-title-modal">Battery</h2>
|
||
<section class="battery-live" aria-label="Live battery readings">
|
||
<div class="battery-live-grid">
|
||
<div><span>Pack voltage</span><strong id="battery-live-voltage">—</strong></div>
|
||
<div><span>Current draw</span><strong id="battery-live-current">—</strong></div>
|
||
<div><span>Charge used</span><strong id="battery-live-consumed">—</strong><small id="battery-live-consumed-source"></small></div>
|
||
<div><span>Capacity left</span><strong id="battery-live-remaining">—</strong></div>
|
||
</div>
|
||
<p id="battery-live-note" class="note">Waiting for battery telemetry.</p>
|
||
</section>
|
||
<form id="battery-form" title="Charge is estimated from voltage; capacity and C rating describe the battery.">
|
||
<div class="form-grid two"><label><span>Cells · S</span><div class="number-pill"><button type="button" class="num-step down" aria-label="Decrease Cells · S">‹</button><input name="cells" type="number" min="1" step="1" max="16" required><button type="button" class="num-step up" aria-label="Increase Cells · S">›</button></div></label><label><span>Capacity · mAh</span><div class="number-pill"><button type="button" class="num-step down" aria-label="Decrease Capacity · mAh">‹</button><input name="capacity_mah" type="number" min="50" step="50" required><button type="button" class="num-step up" aria-label="Increase Capacity · mAh">›</button></div></label><label><span>C rating</span><div class="number-pill"><button type="button" class="num-step down" aria-label="Decrease C rating">‹</button><input name="c_rating" type="number" min="1" step="0.1" required><button type="button" class="num-step up" aria-label="Increase C rating">›</button></div></label><label><span>Low charge warning · %</span><div class="number-pill"><button type="button" class="num-step down" aria-label="Decrease Low charge warning · %">‹</button><input name="warning_percent" type="number" min="0" step="1" max="100" required><button type="button" class="num-step up" aria-label="Increase Low charge warning · %">›</button></div></label></div>
|
||
<section class="settings-section"><h3>Voltage per cell</h3><div class="form-grid two"><label><span>Full · V</span><div class="number-pill"><button type="button" class="num-step down" aria-label="Decrease Full · V">‹</button><input name="full_v_per_cell" type="number" min="0.01" step="0.01" required><button type="button" class="num-step up" aria-label="Increase Full · V">›</button></div></label><label><span>Empty · V</span><div class="number-pill"><button type="button" class="num-step down" aria-label="Decrease Empty · V">‹</button><input name="empty_v_per_cell" type="number" min="0.01" step="0.01" required><button type="button" class="num-step up" aria-label="Increase Empty · V">›</button></div></label></div></section>
|
||
<p class="form-feedback" role="alert" hidden></p>
|
||
<div class="modal-actions"><button type="button" class="button subtle" data-close>Cancel</button><button type="submit" class="button modal-primary">Save battery</button></div>
|
||
</form>
|
||
</dialog>
|
||
<dialog id="motors-modal" class="modal motor-modal" aria-labelledby="motors-title">
|
||
<button class="modal-close" type="button" data-close aria-label="Close window"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18"/></svg></button><h2 id="motors-title">Motor outputs</h2><p id="motor-status" class="note" role="status">Offline</p>
|
||
<p id="motor-feedback" class="form-feedback" role="alert" hidden></p>
|
||
<div class="motor-scale-heading"><span>Output</span><label class="switch-control"><input id="motor-scale-independent" type="checkbox"><span class="switch-track" aria-hidden="true"></span><span>Independent</span></label></div>
|
||
<div id="motor-list" class="motor-list"></div>
|
||
</dialog>
|
||
<dialog id="controller-modal" class="modal controller-modal" aria-labelledby="controller-title">
|
||
<button class="modal-close" type="button" data-close aria-label="Close window"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18"/></svg></button><h2 id="controller-title">Joystick setup</h2>
|
||
<form id="controller-form">
|
||
<div class="form-grid two"><label><span>Controller</span><select id="controller-device"></select></label><label><span>Preset</span><select id="controller-preset"><option value="triggers3">Triggers · 3</option><option value="sixaxis">Six axes</option><option value="classic">Classic sticks</option><option value="custom">Custom</option></select></label></div>
|
||
<p id="controller-axes" class="note" hidden>Xbox · offline</p>
|
||
<div class="binding-head"><span>Motion</span><span>Negative</span><span>Positive</span><span></span><span>Limit %</span></div>
|
||
<div id="controller-bindings"></div>
|
||
<div class="form-grid two mapping-tuning"><label><span>Dead zone %</span><input name="deadZone" type="number" min="0" max="30" step="1" required></label><label><span>Expo %</span><input name="expo" type="number" min="0" max="100" step="1" required></label></div>
|
||
<details class="mapping-actions"><summary>Buttons</summary><div class="form-grid three"><label><span>Lights</span><select name="lights"></select></label><label><span>Stream</span><select name="stream"></select></label><label><span>Record</span><select name="record"></select></label></div></details>
|
||
|
||
<p class="form-feedback" role="alert" hidden></p>
|
||
<div class="modal-actions"><button type="button" class="button subtle" data-close>Cancel</button><button type="submit" class="button modal-primary">Save mapping</button></div>
|
||
</form>
|
||
</dialog>
|
||
|
||
<dialog id="station-modal" class="modal station-modal" aria-labelledby="station-title"><button class="modal-close" type="button" data-close aria-label="Close window"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18"/></svg></button><h2 id="station-title">Vehicle</h2><form id="station-form">
|
||
<div class="form-grid two"><label><span>Preview frame</span><select name="frame"><option value="4">SimpleROV · 3</option><option value="0">BlueROV1 · 6</option><option value="1">Vectored · 6</option><option value="2">Full 6DOF · 8</option><option value="3">6DOF 90° · 8</option><option value="5">SimpleROV · 4</option><option value="6">SimpleROV · 5</option></select></label><div class="detected-frame"><span>FC frame</span><strong id="detected-frame">Offline</strong></div></div>
|
||
<section class="settings-section"><h3>Camera</h3><label><span>Stream type</span><select name="video_mode"><option value="whep">WebRTC · WHEP</option><option value="video">HTTP video</option><option value="mjpeg">MJPEG</option></select></label><label><span>Stream URL</span><input name="video_url" type="url" placeholder="http://192.168.2.2:8889/cam/whep" autocomplete="off"></label></section>
|
||
<section class="settings-section"><h3>Accessories</h3><div class="form-grid two"><label><span>Lights relay</span><select name="lights_relay"></select></label><label><span>Camera relay</span><select name="camera_relay"></select></label></div></section>
|
||
<p class="form-feedback" role="alert" hidden></p><div class="modal-actions"><button type="button" class="button subtle" data-close>Cancel</button><button type="submit" class="button modal-primary">Save</button></div>
|
||
</form></dialog>
|
||
|
||
<script src="model-viewer.js?v=20260826-controls-v2"></script>
|
||
<script src="joystick-3d.js?v=20261002-spacing-motion-v2"></script>
|
||
<script src="control-state.js?v=20260827-state-v1"></script>
|
||
<script src="controller-input.js?v=20261022-v2"></script>
|
||
<script src="dashboard.js?v=20261022-v2"></script>
|
||
<script src="console-view.js?v=20261002-console-v2"></script>
|
||
<script src="app.js?v=20261022-v2"></script>
|
||
<script src="cursor-light.js?v=20260827-directional-v10"></script>
|
||
</body>
|
||
</html>
|