161 lines
No EOL
4.2 KiB
JavaScript
161 lines
No EOL
4.2 KiB
JavaScript
/*
|
|
* charts.js — chart_logic for data_visualization_web_ui
|
|
* Verantwortlich für das Zeichnen und Aktualisieren der Magnetometer-Zeitreihen
|
|
* und Analyse-Zusammenfassung.
|
|
*/
|
|
|
|
/**
|
|
* Erstellt und rendert Zeitreihen-Diagramme (Bx, By, Bz) basierend auf Messdaten.
|
|
* @param {Array<{timestamp: string, sensor: string, Bx: number, By: number, Bz: number}>} data - Messwerte
|
|
* @param {HTMLCanvasElement} canvas - Canvas-Element zur Darstellung
|
|
* @returns {Chart|null} ChartJS-Instanz oder null, wenn keine Daten vorhanden
|
|
*/
|
|
export function renderDataCharts(data, canvas) {
|
|
if (!Array.isArray(data) || data.length === 0 || !canvas) return null;
|
|
|
|
const ctx = canvas.getContext('2d');
|
|
const timestamps = data.map(d => new Date(d.timestamp).toLocaleTimeString());
|
|
const bx = data.map(d => d.Bx);
|
|
const by = data.map(d => d.By);
|
|
const bz = data.map(d => d.Bz);
|
|
|
|
// Falls vorheriger Chart vorhanden: zerstören
|
|
if (canvas._chartInstance) {
|
|
canvas._chartInstance.destroy();
|
|
}
|
|
|
|
const chart = new Chart(ctx, {
|
|
type: 'line',
|
|
data: {
|
|
labels: timestamps,
|
|
datasets: [
|
|
{
|
|
label: 'Bx',
|
|
data: bx,
|
|
borderColor: '#1e88e5',
|
|
fill: false,
|
|
tension: 0.1
|
|
},
|
|
{
|
|
label: 'By',
|
|
data: by,
|
|
borderColor: '#43a047',
|
|
fill: false,
|
|
tension: 0.1
|
|
},
|
|
{
|
|
label: 'Bz',
|
|
data: bz,
|
|
borderColor: '#f4511e',
|
|
fill: false,
|
|
tension: 0.1
|
|
}
|
|
]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
maintainAspectRatio: false,
|
|
interaction: {
|
|
mode: 'index',
|
|
intersect: false
|
|
},
|
|
scales: {
|
|
x: {
|
|
title: {
|
|
display: true,
|
|
text: 'Zeit'
|
|
}
|
|
},
|
|
y: {
|
|
title: {
|
|
display: true,
|
|
text: 'Feldstärke (nT)'
|
|
}
|
|
}
|
|
},
|
|
plugins: {
|
|
legend: {
|
|
position: 'top'
|
|
},
|
|
tooltip: {
|
|
mode: 'nearest'
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
canvas._chartInstance = chart;
|
|
return chart;
|
|
}
|
|
|
|
/**
|
|
* Zeigt Analyseergebnisse im DOM an (z. B. Durchschnittswerte, Peaks, Noise, Drift).
|
|
* @param {{mean?: number, peaks?: number[], noise?: number, drift?: number}} analysis - Analyseobjekt
|
|
* @returns {void}
|
|
*/
|
|
export function renderAnalysisSummary(analysis) {
|
|
const panel = document.querySelector('#analysis-panel');
|
|
if (!panel) return;
|
|
|
|
panel.innerHTML = '';
|
|
|
|
const summaryList = document.createElement('ul');
|
|
summaryList.className = 'analysis__list';
|
|
|
|
const addItem = (label, value) => {
|
|
const li = document.createElement('li');
|
|
li.className = 'analysis__item';
|
|
li.textContent = `${label}: ${value ?? 'n/a'}`;
|
|
summaryList.appendChild(li);
|
|
};
|
|
|
|
addItem('Durchschnitt', analysis.mean !== undefined ? analysis.mean.toFixed(2) : 'n/a');
|
|
|
|
if (Array.isArray(analysis.peaks)) {
|
|
addItem('Peaks', analysis.peaks.join(', '));
|
|
}
|
|
|
|
addItem('Noise', analysis.noise !== undefined ? analysis.noise.toFixed(2) : 'n/a');
|
|
addItem('Drift', analysis.drift !== undefined ? analysis.drift.toFixed(4) : 'n/a');
|
|
|
|
panel.appendChild(summaryList);
|
|
|
|
// Kleinvisualisierung: Balkendiagramm für Peaks, falls vorhanden
|
|
if (Array.isArray(analysis.peaks) && analysis.peaks.length > 0) {
|
|
const canvas = document.createElement('canvas');
|
|
canvas.className = 'analysis__peaks-chart';
|
|
panel.appendChild(canvas);
|
|
|
|
const ctx = canvas.getContext('2d');
|
|
if (canvas._chartInstance) {
|
|
canvas._chartInstance.destroy();
|
|
}
|
|
|
|
canvas._chartInstance = new Chart(ctx, {
|
|
type: 'bar',
|
|
data: {
|
|
labels: analysis.peaks.map((_, i) => `Peak ${i + 1}`),
|
|
datasets: [
|
|
{
|
|
label: 'Peakw e rte',
|
|
data: analysis.peaks,
|
|
backgroundColor: '#1e88e5'
|
|
}
|
|
]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
maintainAspectRatio: false,
|
|
plugins: {
|
|
legend: { display: false }
|
|
},
|
|
scales: {
|
|
x: { title: { display: true, text: 'Index' } },
|
|
y: { title: { display: true, text: 'Wert' } }
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// © 2026 Donau2Space.de
|