@@ -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