Zhen Ye commited on
Commit
3bcc90a
·
1 Parent(s): 48ece04

Fix ReferenceError by removing renderSummary calls and cleanup UI code

Browse files
LaserPerception/LaserPerception.css CHANGED
@@ -750,7 +750,7 @@ input[type="number"]:focus {
750
 
751
  .engage-grid {
752
  display: grid;
753
- grid-template-columns: 2.5fr 1.5fr;
754
  gap: 12px;
755
  min-height: 0;
756
  transition: grid-template-columns 0.3s ease;
 
750
 
751
  .engage-grid {
752
  display: grid;
753
+ grid-template-columns: 1.6fr .9fr;
754
  gap: 12px;
755
  min-height: 0;
756
  transition: grid-template-columns 0.3s ease;
LaserPerception/LaserPerception.html CHANGED
@@ -353,142 +353,143 @@
353
  </div>
354
 
355
  </div>
356
- </div>
357
- </section>
358
-
359
- <!-- ===== Tab 2 ===== -->
360
- <section class="tab" id="tab-engage">
361
- <div class="engage-grid">
362
- <div class="panel">
363
- <h3>
364
- <span>Video Engage · Tracking + Dynamic Dwell</span>
365
- <div style="display: flex; gap: 8px; align-items: center;">
366
- <button class="collapse-btn" id="btnToggleSidebar">◀ Hide Sidebar</button>
367
- <span class="rightnote" id="engageNote">Awaiting video</span>
368
- </div>
369
- </h3>
370
-
371
- <div class="viewbox" style="min-height: 420px;">
372
- <video id="videoEngage" playsinline muted></video>
373
- <canvas id="engageOverlay" class="overlay"></canvas>
374
- <div class="watermark">LOCK · DIST · DWELL · AIMPOINT · FIRE/ASSESS</div>
375
- <div class="empty" id="engageEmpty">
376
- <div class="big">No video loaded</div>
377
- <div class="small">Upload a video. Run <b>Reason</b> first to initialize aimpoints and baseline dwell.
378
- Then click <b>Engage</b>.</div>
379
- </div>
380
- </div>
381
 
382
- <div class="btnrow mt-md">
383
- <button id="btnEngage" class="btn">Engage</button>
384
- <button id="btnPause" class="btn secondary">Pause</button>
385
- <button id="btnReset" class="btn secondary">Reset</button>
386
- </div>
387
 
388
- <div class="strip mt-md">
389
- <span class="chip" id="chipPolicy">POLICY:AUTO</span>
390
- <span class="chip" id="chipTracks">TRACKS:0</span>
391
- <span class="chip" id="chipBeam">BEAM:OFF</span>
392
- <span class="chip" id="chipHz">DET:6Hz</span>
393
- <span class="chip" id="chipFeed" title="Toggle raw vs HF-processed feed (if available)">FEED:RAW</span>
394
- <span class="chip" id="chipDepth" title="Toggle depth view (if available)">VIEW:DEFAULT</span>
395
- </div>
 
 
 
396
 
397
- <div class="mt-md">
398
- <div class="row"><label>Active dwell progress (selected)</label><small class="mini" id="dwellText">—</small>
399
- </div>
400
- <div class="bar">
401
- <div id="dwellBar"></div>
402
- </div>
403
- </div>
 
 
 
404
 
405
- <div class="hint mt-md">Manual targeting: choose “Manual” in Engagement Policy, then
406
- click a target in the video. The “beam” will track its aimpoint and accumulate dwell.</div>
407
- </div>
 
 
408
 
409
- <div class="engage-right">
410
- <div class="panel radar">
411
- <h3>
412
- <span>Radar / Relative Geometry</span>
413
- <span class="rightnote">Dynamic</span>
414
- </h3>
415
- <canvas id="radarCanvas" width="600" height="260" class="full-size"></canvas>
416
- </div>
417
 
418
- <div class="panel" style="flex:1; min-height:0">
419
- <h3>
420
- <span>Live Track Cards</span>
421
- <span class="rightnote" id="liveStamp">—</span>
422
- </h3>
423
- <div class="list" id="trackList" style="max-height:none"></div>
424
- </div>
425
- </div>
426
- </div>
427
- </section>
428
-
429
- <!-- ===== Tab 3 ===== -->
430
- <section class="tab" id="tab-trade">
431
- <div class="trade-grid">
432
- <div class="panel plot">
433
- <h3>
434
- <span>Range Sensitivity · Max vs Required Power · Dwell</span>
435
- <span class="rightnote">Interactive</span>
436
- </h3>
437
- <canvas id="tradeCanvas" width="1100" height="420" class="full-size"></canvas>
438
- </div>
439
 
440
- <div class="panel">
441
- <h3>
442
- <span>Trade Controls</span>
443
- <span class="rightnote">What-if</span>
444
- </h3>
445
- <div class="hint">This plot is computed from your current HEL and atmosphere knobs. It uses the selected
446
- target’s baseline requirements (from Tab 1) as a reference curve.</div>
447
 
448
- <div class="mt-md">
449
- <label>Selected target for curve</label>
450
- <select id="tradeTarget"></select>
451
- </div>
 
 
 
 
452
 
453
- <div class="grid2 mt-sm">
454
- <div>
455
- <label>Range sweep min (m)</label>
456
- <input id="rMin" type="number" value="200" min="50" max="10000" step="50" />
457
- </div>
458
- <div>
459
- <label>Range sweep max (m)</label>
460
- <input id="rMax" type="number" value="6000" min="100" max="20000" step="50" />
461
  </div>
462
  </div>
 
463
 
464
- <div class="row mt-md">
465
- <label>Show P(kill)</label>
466
- <select id="showPk">
467
- <option value="on">On</option>
468
- <option value="off">Off</option>
469
- </select>
470
- </div>
 
 
 
471
 
472
- <div class="btnrow">
473
- <button class="btn secondary" id="btnReplot">Replot</button>
474
- <button class="btn secondary" id="btnSnap">Snapshot (log)</button>
475
- </div>
 
 
 
476
 
477
- <div class="hint">This tab is designed to look like a weapon trade-space console: propagation, lethality
478
- margin, and dwell inflation with range and atmosphere.</div>
479
- </div>
480
- </div>
481
- </section>
482
- </main>
483
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
 
485
- <footer>
486
- <div>Demo mode · Unclassified visuals · Integrate your APIs where marked</div>
487
- <div class="mono" id="telemetry">HEL=60kW · VIS=16km · Cn²=5/10 · AO=7/10 · DET=6Hz</div>
488
- </footer>
489
 
490
- <!-- Hidden video used only for first-frame capture -->
491
- <video id="videoHidden" playsinline muted style="display:none"></video>
492
  </div>
493
 
494
  <script>
 
353
  </div>
354
 
355
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
356
 
357
+ </section>
 
 
 
 
358
 
359
+ <!-- ===== Tab 2 ===== -->
360
+ <section class="tab" id="tab-engage">
361
+ <div class="engage-grid">
362
+ <div class="panel">
363
+ <h3>
364
+ <span>Video Engage · Tracking + Dynamic Dwell</span>
365
+ <div style="display: flex; gap: 8px; align-items: center;">
366
+ <button class="collapse-btn" id="btnToggleSidebar">◀ Hide Sidebar</button>
367
+ <span class="rightnote" id="engageNote">Awaiting video</span>
368
+ </div>
369
+ </h3>
370
 
371
+ <div class="viewbox" style="min-height: 420px;">
372
+ <video id="videoEngage" playsinline muted></video>
373
+ <canvas id="engageOverlay" class="overlay"></canvas>
374
+ <div class="watermark">LOCK · DIST · DWELL · AIMPOINT · FIRE/ASSESS</div>
375
+ <div class="empty" id="engageEmpty">
376
+ <div class="big">No video loaded</div>
377
+ <div class="small">Upload a video. Run <b>Reason</b> first to initialize aimpoints and baseline dwell.
378
+ Then click <b>Engage</b>.</div>
379
+ </div>
380
+ </div>
381
 
382
+ <div class="btnrow mt-md">
383
+ <button id="btnEngage" class="btn">Engage</button>
384
+ <button id="btnPause" class="btn secondary">Pause</button>
385
+ <button id="btnReset" class="btn secondary">Reset</button>
386
+ </div>
387
 
388
+ <div class="strip mt-md">
389
+ <span class="chip" id="chipPolicy">POLICY:AUTO</span>
390
+ <span class="chip" id="chipTracks">TRACKS:0</span>
391
+ <span class="chip" id="chipBeam">BEAM:OFF</span>
392
+ <span class="chip" id="chipHz">DET:6Hz</span>
393
+ <span class="chip" id="chipFeed" title="Toggle raw vs HF-processed feed (if available)">FEED:RAW</span>
394
+ <span class="chip" id="chipDepth" title="Toggle depth view (if available)">VIEW:DEFAULT</span>
395
+ </div>
396
 
397
+ <div class="mt-md">
398
+ <div class="row"><label>Active dwell progress (selected)</label><small class="mini"
399
+ id="dwellText">—</small>
400
+ </div>
401
+ <div class="bar">
402
+ <div id="dwellBar"></div>
403
+ </div>
404
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
405
 
406
+ <div class="hint mt-md">Manual targeting: choose “Manual” in Engagement Policy, then
407
+ click a target in the video. The “beam” will track its aimpoint and accumulate dwell.</div>
408
+ </div>
 
 
 
 
409
 
410
+ <div class="engage-right">
411
+ <div class="panel radar">
412
+ <h3>
413
+ <span>Radar / Relative Geometry</span>
414
+ <span class="rightnote">Dynamic</span>
415
+ </h3>
416
+ <canvas id="radarCanvas" width="600" height="260" class="full-size"></canvas>
417
+ </div>
418
 
419
+ <div class="panel" style="flex:1; min-height:0">
420
+ <h3>
421
+ <span>Live Track Cards</span>
422
+ <span class="rightnote" id="liveStamp">—</span>
423
+ </h3>
424
+ <div class="list" id="trackList" style="max-height:none"></div>
425
+ </div>
 
426
  </div>
427
  </div>
428
+ </section>
429
 
430
+ <!-- ===== Tab 3 ===== -->
431
+ <section class="tab" id="tab-trade">
432
+ <div class="trade-grid">
433
+ <div class="panel plot">
434
+ <h3>
435
+ <span>Range Sensitivity · Max vs Required Power · Dwell</span>
436
+ <span class="rightnote">Interactive</span>
437
+ </h3>
438
+ <canvas id="tradeCanvas" width="1100" height="420" class="full-size"></canvas>
439
+ </div>
440
 
441
+ <div class="panel">
442
+ <h3>
443
+ <span>Trade Controls</span>
444
+ <span class="rightnote">What-if</span>
445
+ </h3>
446
+ <div class="hint">This plot is computed from your current HEL and atmosphere knobs. It uses the selected
447
+ target’s baseline requirements (from Tab 1) as a reference curve.</div>
448
 
449
+ <div class="mt-md">
450
+ <label>Selected target for curve</label>
451
+ <select id="tradeTarget"></select>
452
+ </div>
453
+
454
+ <div class="grid2 mt-sm">
455
+ <div>
456
+ <label>Range sweep min (m)</label>
457
+ <input id="rMin" type="number" value="200" min="50" max="10000" step="50" />
458
+ </div>
459
+ <div>
460
+ <label>Range sweep max (m)</label>
461
+ <input id="rMax" type="number" value="6000" min="100" max="20000" step="50" />
462
+ </div>
463
+ </div>
464
+
465
+ <div class="row mt-md">
466
+ <label>Show P(kill)</label>
467
+ <select id="showPk">
468
+ <option value="on">On</option>
469
+ <option value="off">Off</option>
470
+ </select>
471
+ </div>
472
+
473
+ <div class="btnrow">
474
+ <button class="btn secondary" id="btnReplot">Replot</button>
475
+ <button class="btn secondary" id="btnSnap">Snapshot (log)</button>
476
+ </div>
477
+
478
+ <div class="hint">This tab is designed to look like a weapon trade-space console: propagation, lethality
479
+ margin, and dwell inflation with range and atmosphere.</div>
480
+ </div>
481
+ </div>
482
+ </section>
483
+ </main>
484
+ </div>
485
 
486
+ <footer>
487
+ <div>Demo mode · Unclassified visuals · Integrate your APIs where marked</div>
488
+ <div class="mono" id="telemetry">HEL=60kW · VIS=16km · Cn²=5/10 · AO=7/10 · DET=6Hz</div>
489
+ </footer>
490
 
491
+ <!-- Hidden video used only for first-frame capture -->
492
+ <video id="videoHidden" playsinline muted style="display:none"></video>
493
  </div>
494
 
495
  <script>
LaserPerception/LaserPerception.js CHANGED
@@ -151,15 +151,7 @@
151
  const trackCount = $("#trackCount");
152
  const frameTrackList = $("#frameTrackList");
153
  // Removed old summary references
154
- const summaryTable = $("#summaryTable");
155
- const mMaxP = $("#mMaxP");
156
- const mReqP = $("#mReqP");
157
- const mMargin = $("#mMargin");
158
- const mPlan = $("#mPlan");
159
- const mMaxPSub = $("#mMaxPSub");
160
- const mReqPSub = $("#mReqPSub");
161
- const mMarginSub = $("#mMarginSub");
162
- const mPlanSub = $("#mPlanSub");
163
 
164
  const videoHidden = $("#videoHidden");
165
 
@@ -398,7 +390,11 @@
398
  $$(".tab").forEach(t => t.classList.remove("active"));
399
  $(`#tab-${tab}`).classList.add("active");
400
  if (tab === "trade") renderTrade();
401
- if (tab === "engage") resizeOverlays();
 
 
 
 
402
  });
403
  });
404
 
@@ -486,8 +482,8 @@
486
  clearCanvas(engageOverlay);
487
  renderRadar();
488
 
489
- renderObjectList();
490
- renderSummary();
491
  renderFeatures(null);
492
  renderTrade();
493
 
@@ -1948,7 +1944,7 @@
1948
  moveCursorToRect(btnReason.getBoundingClientRect());
1949
  setTimeout(() => moveCursorToRect(frameCanvas.getBoundingClientRect()), 260);
1950
  setTimeout(() => moveCursorToRect(objList.getBoundingClientRect()), 560);
1951
- setTimeout(() => moveCursorToRect(summaryTable.getBoundingClientRect()), 880);
1952
  }
1953
 
1954
  try {
@@ -2068,7 +2064,7 @@
2068
  btnRecompute.addEventListener("click", () => {
2069
  if (!state.hasReasoned) return;
2070
  recomputeHEL();
2071
- renderSummary();
2072
  renderFrameOverlay();
2073
  renderTrade();
2074
  log("Recomputed HEL metrics using current knobs (no new detection).", "t");
@@ -2083,9 +2079,9 @@
2083
  btnReason.style.opacity = "1";
2084
  btnReason.style.cursor = "pointer";
2085
  btnCancelReason.style.display = "none"; // Hide Cancel button
2086
- renderObjectList();
2087
  renderFrameOverlay();
2088
- renderSummary();
2089
  renderFeatures(null);
2090
  renderTrade();
2091
  log("Cleared Tab 1 outputs.", "w");
@@ -2156,7 +2152,7 @@
2156
  }
2157
 
2158
  summaryStamp.textContent = new Date().toLocaleTimeString();
2159
- renderSummary();
2160
  refreshTradeTargets();
2161
  }
2162
 
@@ -2276,39 +2272,7 @@
2276
  }
2277
  }
2278
 
2279
- function renderSummary() {
2280
- const tbody = summaryTable.querySelector("tbody");
2281
- tbody.innerHTML = "";
2282
- if (!state.detections.length) {
2283
- tbody.innerHTML = `<tr><td class="k">—</td><td colspan="7" class="mini">No outputs yet. Click <b>Reason</b>.</td></tr>`;
2284
- mMaxP.textContent = "—";
2285
- mReqP.textContent = "—";
2286
- mMargin.textContent = "—";
2287
- mPlan.textContent = "—";
2288
- return;
2289
- }
2290
-
2291
- state.detections.forEach(d => {
2292
- const tr = document.createElement("tr");
2293
- const range = d.baseRange_m ?? 0;
2294
- const reqP = d.reqP_kW ?? 0;
2295
- const maxP = d.maxP_kW ?? 0;
2296
- const dwell = d.baseDwell_s ?? 0;
2297
- const p = d.pkill ?? 0;
2298
-
2299
- tr.innerHTML = `
2300
- <td class="k">${d.id}</td>
2301
- <td>${escapeHtml(d.label)}</td>
2302
- <td class="k">${Math.round(range)}</td>
2303
- <td class="k">${escapeHtml(d.aim?.label || "center")}</td>
2304
- <td class="k">${reqP.toFixed(1)} kW</td>
2305
- <td class="k">${maxP.toFixed(1)} kW</td>
2306
- <td class="k">${dwell.toFixed(1)} s</td>
2307
- <td class="k">${Math.round(p * 100)}%</td>
2308
- `;
2309
- tbody.appendChild(tr);
2310
- });
2311
- }
2312
 
2313
  function escapeHtml(s) {
2314
  return s.replace(/[&<>"']/g, m => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[m]));
@@ -2373,10 +2337,8 @@
2373
  .sort((a, b) => (a.d.bbox.w * a.d.bbox.h) - (b.d.bbox.w * b.d.bbox.h))[0];
2374
 
2375
  if (hit) {
2376
- state.selectedId = hit.d.id;
2377
- renderObjectList();
2378
  renderFeatures(hit.d);
2379
- renderFrameOverlay();
2380
  renderTrade();
2381
  }
2382
  };
 
151
  const trackCount = $("#trackCount");
152
  const frameTrackList = $("#frameTrackList");
153
  // Removed old summary references
154
+
 
 
 
 
 
 
 
 
155
 
156
  const videoHidden = $("#videoHidden");
157
 
 
390
  $$(".tab").forEach(t => t.classList.remove("active"));
391
  $(`#tab-${tab}`).classList.add("active");
392
  if (tab === "trade") renderTrade();
393
+ if (tab === "engage") {
394
+ resizeOverlays();
395
+ renderRadar();
396
+ renderTrackCards();
397
+ }
398
  });
399
  });
400
 
 
482
  clearCanvas(engageOverlay);
483
  renderRadar();
484
 
485
+ renderFrameTrackList();
486
+ // renderSummary();
487
  renderFeatures(null);
488
  renderTrade();
489
 
 
1944
  moveCursorToRect(btnReason.getBoundingClientRect());
1945
  setTimeout(() => moveCursorToRect(frameCanvas.getBoundingClientRect()), 260);
1946
  setTimeout(() => moveCursorToRect(objList.getBoundingClientRect()), 560);
1947
+ // setTimeout(() => moveCursorToRect(summaryTable.getBoundingClientRect()), 880);
1948
  }
1949
 
1950
  try {
 
2064
  btnRecompute.addEventListener("click", () => {
2065
  if (!state.hasReasoned) return;
2066
  recomputeHEL();
2067
+ // renderSummary();
2068
  renderFrameOverlay();
2069
  renderTrade();
2070
  log("Recomputed HEL metrics using current knobs (no new detection).", "t");
 
2079
  btnReason.style.opacity = "1";
2080
  btnReason.style.cursor = "pointer";
2081
  btnCancelReason.style.display = "none"; // Hide Cancel button
2082
+ renderFrameTrackList();
2083
  renderFrameOverlay();
2084
+ // renderSummary();
2085
  renderFeatures(null);
2086
  renderTrade();
2087
  log("Cleared Tab 1 outputs.", "w");
 
2152
  }
2153
 
2154
  summaryStamp.textContent = new Date().toLocaleTimeString();
2155
+ // renderSummary();
2156
  refreshTradeTargets();
2157
  }
2158
 
 
2272
  }
2273
  }
2274
 
2275
+ // renderSummary removed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2276
 
2277
  function escapeHtml(s) {
2278
  return s.replace(/[&<>"']/g, m => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[m]));
 
2337
  .sort((a, b) => (a.d.bbox.w * a.d.bbox.h) - (b.d.bbox.w * b.d.bbox.h))[0];
2338
 
2339
  if (hit) {
2340
+ selectObject(hit.d.id);
 
2341
  renderFeatures(hit.d);
 
2342
  renderTrade();
2343
  }
2344
  };