Skip to content
This repository was archived by the owner on Jul 31, 2026. It is now read-only.

Commit fe1af4c

Browse files
feat(hw+debug): hardware config panel, UID left/right, WS & Firebase log side panel
Hardware: - RFID side selector (Left/Right) when count=1, persisted in NVS - Motor preferred scan speed (1-5) persisted in NVS, noise badge (🔇/🔉/🔊) - UID Left / UID Right in weight card — mapped to physical rfid2/rfid1 readers - uid_left / uid_right dedicated fields in WS frame (reliable vs first-detected uid/uid2) Debug panels: - 🔥 Firebase Log + 🔌 WebSocket Log open as full-height right side panel - WS log: 100 entries, newest-first, pause/resume, "changes only" filter - Firebase log: polls /api/logs every 4s, color-coded (OK/ERR/AUTH/DATA), clear via POST /api/logs/clear - New POST /api/logs/clear endpoint (safer than DELETE with ESPAsyncWebServer) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent f61614d commit fe1af4c

4 files changed

Lines changed: 1295 additions & 56 deletions

File tree

‎data/www/index.html‎

Lines changed: 186 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ <h1>TigerTag</h1>
6363

6464
<!-- UIDs -->
6565
<div class="uid-rows">
66-
<div class="uid-row">
67-
<span class="uid-chip-label">UID1</span>
68-
<span id="uid" class="uid-value" data-i18n="waiting">—</span>
66+
<div class="uid-row" id="uidLeftRow">
67+
<span class="uid-chip-label" data-i18n="uidLeft">◀ Left</span>
68+
<span id="uidLeftDisplay" class="uid-value">—</span>
6969
</div>
70-
<div class="uid-row">
71-
<span class="uid-chip-label">UID2</span>
72-
<span id="uid2Display" class="uid-value">—</span>
70+
<div class="uid-row" id="uidRightRow">
71+
<span class="uid-chip-label" data-i18n="uidRight">Right ▶</span>
72+
<span id="uid" class="uid-value" data-i18n-empty="waiting">—</span>
7373
</div>
7474
</div>
7575

@@ -190,6 +190,132 @@ <h1>TigerTag</h1>
190190
</div>
191191
</div>
192192

193+
<!-- Hardware -->
194+
<div class="card">
195+
<div class="card-title collapsible" onclick="toggleSection(this)">
196+
🔧 <span data-i18n="hardware">Hardware</span>
197+
</div>
198+
<div class="collapsible-content">
199+
200+
<!-- RFID Reader count -->
201+
<div class="setting-row">
202+
<div class="setting-row-label">
203+
📡 <span data-i18n="rfidReaders">RFID Readers</span>
204+
</div>
205+
<div class="segment-control" id="rfidSegment">
206+
<button class="segment-btn active" data-val="1" onclick="setRfidCount(1)">1</button>
207+
<button class="segment-btn" data-val="2" onclick="setRfidCount(2)">2</button>
208+
</div>
209+
</div>
210+
211+
<!-- Left/Right selector — visible only when count=1 -->
212+
<div class="setting-row setting-row--indent" id="rfidSideRow" style="display:none">
213+
<div class="setting-row-label">
214+
<span data-i18n="rfidSide">Position</span>
215+
</div>
216+
<div class="segment-control" id="rfidSideSegment">
217+
<button class="segment-btn active" data-val="left" onclick="setRfidSide('left')" data-i18n="rfidReaderLeft">Left</button>
218+
<button class="segment-btn" data-val="right" onclick="setRfidSide('right')" data-i18n="rfidReaderRight">Right</button>
219+
</div>
220+
</div>
221+
222+
<!-- RFID test panel -->
223+
<div class="motor-test-panel" id="rfidTestPanel">
224+
<div class="motor-test-header">
225+
📡 <span data-i18n="rfidTest">RFID test</span>
226+
</div>
227+
<!-- Left reader row -->
228+
<div class="rfid-reader-row" id="rfidLeftRow">
229+
<span class="rfid-reader-row-label" data-i18n="rfidReaderLeft">Left</span>
230+
<div class="rfid-uid-wrap">
231+
<div class="rfid-test-uid" id="rfidTestUidLeft">—</div>
232+
<button class="rfid-clear-btn" id="rfidClearBtnLeft" onclick="clearRfidUid('left')" style="display:none" aria-label="Clear">
233+
<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
234+
</button>
235+
</div>
236+
</div>
237+
<!-- Right reader row -->
238+
<div class="rfid-reader-row" id="rfidRightRow">
239+
<span class="rfid-reader-row-label" data-i18n="rfidReaderRight">Right</span>
240+
<div class="rfid-uid-wrap">
241+
<div class="rfid-test-uid" id="rfidTestUidRight">—</div>
242+
<button class="rfid-clear-btn" id="rfidClearBtnRight" onclick="clearRfidUid('right')" style="display:none" aria-label="Clear">
243+
<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
244+
</button>
245+
</div>
246+
</div>
247+
<button class="motor-test-run-btn" id="rfidTestRunBtn" onclick="toggleRfidTest()">
248+
<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" id="rfidTestIcon"><polygon points="5,3 19,12 5,21"/></svg>
249+
<span id="rfidTestLabel">Scan</span>
250+
</button>
251+
</div>
252+
253+
<div class="divider"></div>
254+
255+
<!-- Motor connected toggle -->
256+
<div class="setting-row">
257+
<div class="setting-row-label">
258+
⚙️ <span data-i18n="motorConnected">Motor connected</span>
259+
</div>
260+
<label class="ios-switch" aria-label="Motor connected">
261+
<input type="checkbox" id="motorConnectedCheck" onchange="onMotorConnectedChange()">
262+
<span class="ios-switch-track"></span>
263+
</label>
264+
</div>
265+
266+
<!-- Rotation enabled (shown only when motor connected) -->
267+
<div class="setting-row setting-row--indent" id="motorEnabledRow" style="display:none">
268+
<div class="setting-row-label">
269+
<span data-i18n="motorEnabled">Rotation enabled</span>
270+
</div>
271+
<label class="ios-switch" aria-label="Rotation enabled">
272+
<input type="checkbox" id="motorEnabledCheck" onchange="onMotorEnabledChange()">
273+
<span class="ios-switch-track"></span>
274+
</label>
275+
</div>
276+
277+
<!-- Speed + test panel (shown only when connected + enabled) -->
278+
<div class="motor-test-panel" id="motorTestPanel" style="display:none">
279+
<div class="motor-test-header">
280+
⚙️ <span data-i18n="motorSpeedLabel">Vitesse de rotation</span>
281+
</div>
282+
<!-- Noise badge -->
283+
<div class="motor-noise-row">
284+
<span class="motor-noise-badge" id="motorNoiseBadge">🔉</span>
285+
<span class="motor-noise-label" id="motorNoiseLabel" data-i18n="motorNoiseModerate">Modéré</span>
286+
</div>
287+
<div class="motor-test-speeds">
288+
<input type="range" class="motor-speed-slider" id="motorSpeedSlider"
289+
min="1" max="5" step="1" value="3"
290+
oninput="setMotorSpeed(+this.value)">
291+
<div class="motor-speed-ticks">
292+
<span>1</span><span>2</span><span>3</span><span>4</span><span>5</span>
293+
</div>
294+
</div>
295+
<!-- Test run button -->
296+
<button class="motor-test-run-btn" id="motorTestRunBtn" onclick="toggleMotorTest()">
297+
<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" id="motorTestIcon"><polygon points="5,3 19,12 5,21"/></svg>
298+
<span id="motorTestLabel" data-i18n="motorTestRun">Run</span>
299+
</button>
300+
</div>
301+
302+
<div class="divider"></div>
303+
304+
<!-- Spool detection (read-only, from WS) -->
305+
<div class="setting-row">
306+
<div class="setting-row-label">
307+
🧵 <span data-i18n="spoolDetected">Spool detected</span>
308+
</div>
309+
<span class="compact-value" id="spoolDetectedVal">—</span>
310+
</div>
311+
<div class="setting-row" id="spoolPositionRow" style="display:none">
312+
<span class="setting-row-label" data-i18n="spoolPosition">Position</span>
313+
<span class="compact-value" id="spoolPositionVal">—</span>
314+
</div>
315+
316+
</div>
317+
</div>
318+
193319
<!-- Advanced -->
194320
<div class="card">
195321
<div class="card-title collapsible" onclick="toggleSection(this)">
@@ -207,6 +333,16 @@ <h1>TigerTag</h1>
207333
</div>
208334
</div>
209335

336+
<!-- Log buttons -->
337+
<div style="display:flex;gap:10px;margin-bottom:0">
338+
<button class="log-open-btn" onclick="logPanelOpen('fb')">
339+
🔥 Firebase Log <span class="log-open-arrow">›</span>
340+
</button>
341+
<button class="log-open-btn" onclick="logPanelOpen('ws')">
342+
🔌 WebSocket Log <span class="log-open-arrow">›</span>
343+
</button>
344+
</div>
345+
210346
<!-- Footer -->
211347
<div class="footer">
212348
<div class="footer-version">
@@ -404,5 +540,49 @@ <h2 class="auth-title" id="authTitle" data-i18n="authTitle">Bienvenue sur votre
404540
});
405541
}
406542
</script>
543+
544+
<!-- ── Log Side Panel ───────────────────────────────────────────────── -->
545+
<div id="logSideOverlay" class="log-side-overlay" onclick="logPanelClose()"></div>
546+
<div id="logSidePanel" class="log-side-panel">
547+
<div class="log-side-header">
548+
<div class="log-side-tabs">
549+
<button class="log-side-tab active" id="logTabFb" onclick="logTabSwitch('fb')">🔥 Firebase</button>
550+
<button class="log-side-tab" id="logTabWs" onclick="logTabSwitch('ws')">🔌 WebSocket</button>
551+
</div>
552+
<button class="log-side-close" onclick="logPanelClose()">✕</button>
553+
</div>
554+
555+
<!-- Firebase pane -->
556+
<div id="logPaneFb" class="log-pane active">
557+
<div class="log-pane-toolbar">
558+
<span class="ws-log-count"><span id="fbLogCount">0</span> entrées</span>
559+
<div class="ws-log-toolbar-btns">
560+
<button class="ws-log-btn" id="fbLogRefreshBtn" onclick="fbLogFetch()">↺</button>
561+
<button class="ws-log-btn" onclick="fbLogClear()">🗑</button>
562+
</div>
563+
</div>
564+
<div class="log-pane-entries" id="fbLogContainer">
565+
<div class="ws-log-empty">Chargement...</div>
566+
</div>
567+
</div>
568+
569+
<!-- WebSocket pane -->
570+
<div id="logPaneWs" class="log-pane">
571+
<div class="log-pane-toolbar">
572+
<label class="ws-log-toggle-wrap">
573+
<input type="checkbox" id="wsLogOnlyChanges" checked onchange="wsLogSetOnlyChanges(this.checked)">
574+
<span>Changements seulement</span>
575+
</label>
576+
<div class="ws-log-toolbar-btns">
577+
<button class="ws-log-btn" id="wsLogPauseBtn" onclick="wsLogTogglePause()">⏸</button>
578+
<button class="ws-log-btn" onclick="wsLogClear()">🗑</button>
579+
</div>
580+
</div>
581+
<div class="ws-log-count" style="padding:0 12px 6px"><span id="wsLogCount">0</span> messages</div>
582+
<div class="log-pane-entries" id="wsLogContainer">
583+
<div class="ws-log-empty">En attente de messages...</div>
584+
</div>
585+
</div>
586+
</div>
407587
</body>
408588
</html>

0 commit comments

Comments
 (0)