diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100755 index 0000000..394f2aa --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,21 @@ +services: + appRobotHoming: + image: node:20-bullseye + container_name: appRobot_Homing + working_dir: /app + volumes: + - /home/chk/Documents/appRobotHoming:/app + environment: + - WSS_VIDEO_DRIVER=wss://localhost:8448 + - WSS_URL=wss://appRobot_Driver:2095 + - HTTPS_PORT=2093 + ports: + - "2093:2093" + depends_on: + - appRobotDriver + command: > + /bin/bash -lc "npm ci || npm install && node server/server.js" + networks: + - default + restart: unless-stopped + \ No newline at end of file diff --git a/public/client.js b/public/client.js index 8693f0e..6a8e7d7 100755 --- a/public/client.js +++ b/public/client.js @@ -19,12 +19,42 @@ }catch(e){ connEl.textContent = 'unbekannt'; connEl.className = 'badge'; } } + function processDataShortenPosition(data){ + if(data?.text){ + try{ + let obj = JSON.parse(data.text); + if(obj?.position){ + obj.position.x = parseFloat(obj.position.x.toFixed(3)); + obj.position.y = parseFloat(obj.position.y.toFixed(3)); + obj.position.z = parseFloat(obj.position.z.toFixed(3)); + obj.position.a = parseFloat(obj.position.a.toFixed(3)); + obj.position.b = parseFloat(obj.position.b.toFixed(3)); + obj.position.c = parseFloat(obj.position.c.toFixed(3)); + } + if(obj?.motorCounts){ + obj.motorCounts.x = parseFloat(obj.motorCounts.x.toFixed(3)); + obj.motorCounts.y = parseFloat(obj.motorCounts.y.toFixed(3)); + obj.motorCounts.z = parseFloat(obj.motorCounts.z.toFixed(3)); + obj.motorCounts.a = parseFloat(obj.motorCounts.a.toFixed(3)); + obj.motorCounts.b = parseFloat(obj.motorCounts.b.toFixed(3)); + obj.motorCounts.c = parseFloat(obj.motorCounts.c.toFixed(3)); + if(obj.motorCounts.e !== undefined) obj.motorCounts.e = parseFloat(obj.motorCounts.e.toFixed(3)); + } + return "text: " + JSON.stringify(obj); + }catch(e){ + return "text: " + data.text; + } + } + return ""; + } + function connectSSE(){ const es = new EventSource('/api/events'); es.onmessage = (ev)=>{ try{ const p = JSON.parse(ev.data); - if (p.level === 'msg') append(`WSS → ${p.data?.text ?? ''}`); + if (p.level === 'msg' && p.data?.text !== 'Ping') append(`WSS → ${processDataShortenPosition(p.data)}`); + //if (p.level === 'msg') append(`WSS → ${processDataShortenPosition(p.data)}`); else if (p.level === 'tx') append(`TX → ${JSON.stringify(p.data)}`); else append(`${p.level?.toUpperCase?.()}: ${p.message}`); }catch{ append(ev.data); } @@ -60,7 +90,47 @@ }); } + async function loadLatestSnapshot() { + try { + const res = await fetch('/api/latest-snapshot'); + if (!res.ok) throw new Error('Fehler beim Laden des Snapshots'); + let data; + if (res.headers.get('content-type')?.includes('application/json')) { + data = await res.json(); + } else { + const csvData = await res.text(); + // Fallback: filename aus dem Pfad oder unbekannt, mtime jetzt + data = { filename: 'latest.csv', mtime: new Date().toISOString(), content: csvData }; + } + const infoEl = document.getElementById('snapshot-info'); + const tableEl = document.getElementById('snapshot-table'); + + // Info anzeigen + const mtime = new Date(data.mtime).toLocaleString(); + infoEl.textContent = `Datei: ${data.filename} | Erstellt: ${mtime}`; + + // CSV parsen und Tabelle bauen + const lines = data.content.trim().split('\n'); + if (lines.length === 0) { + tableEl.innerHTML = 'Keine Daten'; + return; + } + const headers = lines[0].split(','); + let html = '' + headers.map(h => `${h.trim()}`).join('') + ''; + for (let i = 1; i < lines.length; i++) { + const cells = lines[i].split(','); + html += '' + cells.map(c => `${c.trim()}`).join('') + ''; + } + html += ''; + tableEl.innerHTML = html; + } catch (err) { + document.getElementById('snapshot-info').textContent = 'Fehler: ' + err.message; + document.getElementById('snapshot-table').innerHTML = ''; + } + } + bindButtons(); connectSSE(); refreshStatus(); + loadLatestSnapshot(); })(); diff --git a/public/index.html b/public/index.html index 6182be2..48ef3bc 100755 --- a/public/index.html +++ b/public/index.html @@ -33,6 +33,12 @@ + +
+ +
+
+