const jsonFilePath = "static/dtc_table.json"; var dtcState = {}; function processDTCNotifications(dtcArray) { for (var i = 0; i < dtcArray.length; i++) { var dtcInfo = dtcArray[i].split(","); var errorCode = dtcInfo[1]; var activity = parseInt(dtcInfo[3]); if (dtcState[errorCode]) { // Überprüfen, ob sich der Zustand von "previous" auf "active" geändert hat if (activity !== dtcState[errorCode]) { dtcState[errorCode] = activity; if (activity === 1) showDTCNotification(errorCode); } } else { // DTC ist neu, Zustand speichern und Benachrichtigung anzeigen dtcState[errorCode] = activity; showDTCNotification(errorCode); } } } function showDTCNotification(dtctext, severity) { // Überprüfen, ob der Browser die Notification API unterstützt if ("Notification" in window) { // Überprüfen, ob der Benutzer bereits Berechtigungen erteilt hat if (Notification.permission === "granted") { // Benachrichtigung anzeigen showNotification(dtctext, severity); } else if (Notification.permission !== "denied") { // Aufforderung zur Erlaubnis einholen Notification.requestPermission().then(function (permission) { if (permission === "granted") { // Benachrichtigung anzeigen showNotification(dtctext, severity); } else { // Der Benutzer hat die Berechtigung abgelehnt oder das Dialogfeld geschlossen console.log("Benachrichtigungsberechtigung wurde verweigert."); } }); } else { // Der Benutzer hat die Berechtigung bereits verweigert console.log("Benachrichtigungsberechtigung wurde bereits verweigert."); } } } // Funktion zum Anzeigen der Benachrichtigung function showNotification(dtctext, severity) { var severityIcon; switch (severity) { case 1: severityIcon = "static/img/info.png"; break; case 2: severityIcon = "static/img/warn.png"; break; case 3: severityIcon = "static/img/critical.png"; break; default: severityIcon = "static/img/none.png"; } var options = { body: dtctext, icon: severityIcon, }; var notification = new Notification("KTM Chain Oiler DTC", options); // Optional: Handle Click-Event notification.onclick = function () { console.log("Benachrichtigung wurde angeklickt."); }; } function getDescriptionForDTCNumber(number, callback) { fetch(jsonFilePath) .then((response) => response.json()) .then((data) => { const foundEntry = data.find((entry) => entry.num === number); if (foundEntry) { const description = foundEntry.description; const title = foundEntry.title; callback(null, title, description); } else { // Wenn die Nummer nicht gefunden wurde, geben Sie einen Fehler zurück callback( `Beschreibung für Nummer ${number} nicht gefunden.`, null, null ); } }) .catch((error) => { // Im Fehlerfall geben Sie den Fehler zurück callback(error, null, null); }); } function fillDTCTable(dtcArray) { // Referenz auf das Tabellen-Element var table = document.getElementById("dtc_table"); var tablediv = document.getElementById("dtc_container"); // Prüfen, ob DTC vorhanden sind if (dtcArray.length === 0) { // Verstecke das Tabellen-Div, wenn keine DTC vorhanden sind tablediv.hidden = true; return; } else { // Zeige das Tabellen-Div, wenn DTC vorhanden sind tablediv.hidden = false; } // Tabelle leeren, bevor sie neu gefüllt wird table.innerHTML = ""; // Überschriften für die Tabelle erstellen var headerRow = table.insertRow(0); // Definition der Klassen und Scopes für die Spalten var columnDefinitions = [ { class: "col-6", scope: "Zeitstempel" }, { class: "col-2", scope: "Fehlercode" }, { class: "col-2", scope: "Schwere" }, { class: "col-2", scope: "Aktiv" }, ]; for (var i = 0; i < columnDefinitions.length; i++) { var headerCell = headerRow.insertCell(i); headerCell.className = `th ${columnDefinitions[i].class}`; headerCell.scope = columnDefinitions[i].scope; headerCell.innerHTML = columnDefinitions[i].scope; } // DTC-Daten in die Tabelle einfügen for (var i = 0; i < dtcArray.length; i++) { var dtcInfo = dtcArray[i].split(","); var row = table.insertRow(i + 1); // +1 wegen der Überschriftenzeile // Zeitstempel var timestampCell = row.insertCell(0); timestampCell.innerHTML = formatTimestamp(parseInt(dtcInfo[0])); // Fehlercode var errorCodeCell = row.insertCell(1); errorCodeCell.innerHTML = dtcInfo[1]; // Schwere var severityCell = row.insertCell(2); var severity = parseInt(dtcInfo[2]); // Schwere switch (severity) { case 1: severityCell.innerHTML = 'Info'; break; case 2: severityCell.innerHTML = 'Warnung'; break; case 3: severityCell.innerHTML = 'Kritisch'; break; default: severityCell.innerHTML = 'Unbekannt'; } row.setAttribute("data-dtc", dtcInfo[1]); row.setAttribute("data-debugval", dtcInfo[4]); // Aktivität var activityCell = row.insertCell(3); activityCell.innerHTML = parseInt(dtcInfo[3]) === 1 ? "active" : "previous"; } } function formatTimestamp(milliseconds) { const date = new Date(milliseconds); const days = String(date.getUTCDate() - 1).padStart(2, "0"); const hours = String(date.getUTCHours()).padStart(2, "0"); const minutes = String(date.getUTCMinutes()).padStart(2, "0"); const seconds = String(date.getUTCSeconds()).padStart(2, "0"); const millisecondsFormatted = String(date.getUTCMilliseconds()).padStart( 3, "0" ); return `${days}-${hours}:${minutes}:${seconds}:${millisecondsFormatted}`; }