<pclass="text-sm text-slate-600">Drag & drop your <kbd>.json</kbd> and <kbd>.mp4</kbd> files onto the window, or use the <kbd>Load JSON</kbd> / <kbd>Load Video</kbd> buttons.</p>
<h3>Load Files</h3>
<pclass="text-sm text-slate-600">Drag & drop your <kbd>.json</kbd> and <kbd>.mp4</kbd> files onto
the window, or use the <kbd>Load JSON</kbd> / <kbd>Load Video</kbd> buttons.</p>
</div>
</div>
<divclass="flow-arrow self-center">➔</div>
<divclass="flow-arrow self-center">➔</div>
<divclass="flow-step flex-1">
<divclass="flow-step flex-1">
<spanclass="text-3xl">2️⃣</span>
<spanclass="text-3xl">2️⃣</span>
<h3class="mt-2">Play & Sync</h3>
<pclass="text-sm text-slate-600">Press <kbd>Play</kbd> (or <kbd>Spacebar</kbd>). The app automatically syncs the radar data to the video based on their timestamps.</p>
<h3>Play & Sync</h3>
<pclass="text-sm text-slate-600">Press <kbd>Play</kbd> (or <kbd>Spacebar</kbd>). The app
automatically syncs the radar data to the video based on their timestamps.</p>
</div>
</div>
<divclass="flow-arrow self-center">➔</div>
<divclass="flow-arrow self-center">➔</div>
<divclass="flow-step flex-1">
<divclass="flow-step flex-1">
<spanclass="text-3xl">3️⃣</span>
<spanclass="text-3xl">3️⃣</span>
<h3class="mt-2">Explore & Analyze</h3>
<pclass="text-sm text-slate-600">Use the timeline, sidebar (<kbd>M</kbd>), zoom (<kbd>G</kbd>), and Data Explorer (<kbd>I</kbd>) to analyze the synchronized data.</p>
<h3>Explore & Analyze</h3>
<pclass="text-sm text-slate-600">Use the timeline, sidebar (<kbd>M</kbd>), zoom (<kbd>G</kbd>), and
Data Explorer (<kbd>I</kbd>) to analyze the synchronized data.</p>
</div>
</div>
</div>
</div>
</section>
</section>
@ -185,7 +351,7 @@
<!-- 3. The Main Interface (VISUAL) -->
<!-- 3. The Main Interface (VISUAL) -->
<section>
<section>
<h2class="text-center mb-8">The Main Interface</h2>
<h2class="text-center mb-8">The Main Interface</h2>
Load <kbd>.json</kbd> and <kbd>.mp4</kbd> files via <strong>Drag & Drop</strong> anywhere on the page or by using the <kbd>Load</kbd> buttons. Files are cached in `IndexedDB` for instant reloads.
Load <kbd>.json</kbd> and <kbd>.mp4</kbd> files via <strong>Drag & Drop</strong> anywhere on the
page or by using the <kbd>Load</kbd> buttons. Files are cached in `IndexedDB` for instant
reloads.
</p>
</p>
</div>
</div>
<!-- Feature: Playback -->
<!-- Feature: Playback -->
<divclass="feature-card p-6">
<divclass="feature-card p-6">
<divclass="flex items-center">
<divclass="flex items-center">
@ -278,10 +446,12 @@
<h3>High-Precision Sync</h3>
<h3>High-Precision Sync</h3>
</div>
</div>
<pclass="text-sm text-slate-600 mt-2">
<pclass="text-sm text-slate-600 mt-2">
The app uses a `performance.now()` master clock to drive playback, correcting any video drift. The <strong>time offset</strong> is automatically calculated from filenames (e.g., `fHist_...` and `WIN_...`).
The app uses a `performance.now()` master clock to drive playback, correcting any video drift.
The <strong>time offset</strong> is automatically calculated from filenames (e.g., `fHist_...`
and `WIN_...`).
</p>
</p>
</div>
</div>
<!-- Feature: Timeline -->
<!-- Feature: Timeline -->
<divclass="feature-card p-6">
<divclass="feature-card p-6">
<divclass="flex items-center">
<divclass="flex items-center">
@ -289,10 +459,11 @@
<h3>Advanced Timeline Control</h3>
<h3>Advanced Timeline Control</h3>
</div>
</div>
<pclass="text-sm text-slate-600 mt-2">
<pclass="text-sm text-slate-600 mt-2">
Click or drag the timeline to seek. You can also hover your <strong>mouse wheel</strong> over the slider to seek frame-by-frame (slow scroll) or scrub quickly (fast scroll).
Click or drag the timeline to seek. You can also hover your <strong>mouse wheel</strong> over
the slider to seek frame-by-frame (slow scroll) or scrub quickly (fast scroll).
(<kbd>D</kbd>), <strong>Predicted Pos</strong> (<kbd>P</kbd>), <strong>Covariance</strong>, and
<strong>Confirmed Tracks</strong>.
<br><strong>Color Modes:</strong> Switch between SNR (<kbd>1</kbd>), Cluster (<kbd>2</kbd>),
Inlier (<kbd>3</kbd>), or Stationary (<kbd>4</kbd>).
<br><strong>TTC Colors:</strong> Customize the Time-to-Collision (TTC) risk colors.
<br><strong>TTC Colors:</strong> Customize the Time-to-Collision (TTC) risk colors.
</p>
</p>
</div>
</div>
<!-- Feature: GOD Mode -->
<!-- Feature: GOD Mode -->
<divclass="feature-card p-6">
<divclass="feature-card p-6">
<divclass="flex items-center">
<divclass="flex items-center">
@ -313,7 +487,9 @@
<h3>"GOD MODE" Zoom (<kbd>G</kbd>)</h3>
<h3>"GOD MODE" Zoom (<kbd>G</kbd>)</h3>
</div>
</div>
<pclass="text-sm text-slate-600 mt-2">
<pclass="text-sm text-slate-600 mt-2">
Activates a separate, high-fidelity p5.js canvas that follows your mouse, showing a <strong>magnified view</strong>. Hover over points/tracks to see a detailed tooltip. Use the <strong>mouse wheel</strong> while in this mode to zoom in/out.
Activates a separate, high-fidelity p5.js canvas that follows your mouse, showing a
<strong>magnified view</strong>. Hover over points/tracks to see a detailed tooltip. Use the
<strong>mouse wheel</strong> while in this mode to zoom in/out.
</p>
</p>
</div>
</div>
@ -330,7 +506,7 @@
<br><strong>Plot View:</strong> Click a grid header to plot that data with Chart.js.
<br><strong>Plot View:</strong> Click a grid header to plot that data with Chart.js.
</p>
</p>
</div>
</div>
<!-- Feature: CAN Data -->
<!-- Feature: CAN Data -->
<divclass="feature-card p-6"hidden>
<divclass="feature-card p-6"hidden>
<divclass="flex items-center">
<divclass="flex items-center">
@ -338,10 +514,12 @@
<h3>CAN Speed Integration</h3>
<h3>CAN Speed Integration</h3>
</div>
</div>
<pclass="text-sm text-slate-600 mt-2">
<pclass="text-sm text-slate-600 mt-2">
The <kbd>Load CAN</kbd> button has been removed. The visualizer now expects CAN speed data (<code>canVehSpeed_kmph</code>) to be included <strong>directly within the main JSON file</strong>, associated with each radar frame.
The <kbd>Load CAN</kbd> button has been removed. The visualizer now expects CAN speed data
(<code>canVehSpeed_kmph</code>) to be included <strong>directly within the main JSON
file</strong>, associated with each radar frame.
</p>
</p>
</div>
</div>
<!-- Feature: Session -->
<!-- Feature: Session -->
<divclass="feature-card p-6"hidden>
<divclass="feature-card p-6"hidden>
<divclass="flex items-center">
<divclass="flex items-center">
@ -349,10 +527,12 @@
<h3>Session Management</h3>
<h3>Session Management</h3>
</div>
</div>
<pclass="text-sm text-slate-600 mt-2">
<pclass="text-sm text-slate-600 mt-2">
<kbd>Save Session</kbd> downloads a <kbd>.json</kbd> file with your current file names, offset, and all UI toggle states. <kbd>Load Session</kbd> restores this state (requires files to be cached).
<kbd>Save Session</kbd> downloads a <kbd>.json</kbd> file with your current file names, offset,
and all UI toggle states. <kbd>Load Session</kbd> restores this state (requires files to be
cached).
</p>
</p>
</div>
</div>
<!-- Feature: Parsing -->
<!-- Feature: Parsing -->
<divclass="feature-card p-6">
<divclass="feature-card p-6">
<divclass="flex items-center">
<divclass="flex items-center">
@ -360,7 +540,8 @@
<h3>Web Worker Parsing</h3>
<h3>Web Worker Parsing</h3>
</div>
</div>
<pclass="text-sm text-slate-600 mt-2">
<pclass="text-sm text-slate-600 mt-2">
Large JSON files are parsed in a background <strong>Web Worker</strong> using a streaming parser. This prevents the UI from freezing and shows a real-time progress bar.
Large JSON files are parsed in a background <strong>Web Worker</strong> using a streaming
parser. This prevents the UI from freezing and shows a real-time progress bar.
<spanclass="text-sm text-slate-600">If the `.bat` fails, run <kbd>python_check.bat</kbd> to diagnose, or manually run `python -m http.server 8000` in the `steps` folder.</span>
<spanclass="text-sm text-slate-600">If the `.bat` fails, run <kbd>python_check.bat</kbd> to
diagnose, or manually run `python -m http.server 8000` in the `steps` folder.</span>