228 lines
6.9 KiB
JavaScript
228 lines
6.9 KiB
JavaScript
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 dtcList = data.dtc_table_data;
|
|
const foundEntry = dtcList.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 showDTCModal(event) {
|
|
var dtc = parseInt(event.currentTarget.getAttribute("data-dtc"));
|
|
var debugval = event.currentTarget.getAttribute("data-debugval");
|
|
var modal = $("#dtcModal");
|
|
|
|
getDescriptionForDTCNumber(dtc, function (error, title, description) {
|
|
if (error) {
|
|
console.error("Fehler beim Abrufen der Beschreibung:", error);
|
|
modal.find(".modal-title").text("Fehler");
|
|
modal
|
|
.find(".dtc-desc")
|
|
.text("DTC-Beschreibung konnte nicht geladen werden");
|
|
} else {
|
|
modal.find(".modal-title").text(title);
|
|
modal.find(".dtc-desc").text(description);
|
|
if (debugval > 0) {
|
|
modal.find(".dtc-debugval").text("Debugvalue: " + debugval);
|
|
} else {
|
|
modal.find(".dtc-debugval").remove();
|
|
}
|
|
}
|
|
});
|
|
// Modal anzeigen
|
|
modal.modal("show");
|
|
}
|
|
|
|
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 = '<img src="static/img/info.png" alt="Info" />';
|
|
break;
|
|
case 2:
|
|
severityCell.innerHTML =
|
|
'<img src="static/img/warn.png" alt="Warnung" />';
|
|
break;
|
|
case 3:
|
|
severityCell.innerHTML =
|
|
'<img src="static/img/critical.png" alt="Kritisch" />';
|
|
break;
|
|
default:
|
|
severityCell.innerHTML =
|
|
'<img src="static/img/none.png" alt="Unbekannt" />';
|
|
}
|
|
|
|
row.setAttribute("data-dtc", dtcInfo[1]);
|
|
row.setAttribute("data-debugval", dtcInfo[4]);
|
|
row.addEventListener("click", showDTCModal);
|
|
|
|
// 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}`;
|
|
}
|