Initial commit

This commit is contained in:
2026-01-02 20:52:43 +01:00
commit e9d2257d73
854 changed files with 164132 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
<?php
print("true");
?>

32
alt/index.php Normal file
View File

@@ -0,0 +1,32 @@
<html>
<head>
<script src="/vendor/jquery.min.js"></script>
<script src="script.js"></script>
<link rel="stylesheet" href="style.css">
</head>
<body onload="pageload(), checkConnection(), applySettings('plug')" onhashchange="pageload()">
<div class="main">
<div class="navigation">
<div class="navigation-header" onclick="secondaryNavigation('open','plug-select')">
Steckerauswahl
<div>Wird geladen...</div>
</div>
<div id="index" id="start" onclick="window.location.href='#index'; pageload();"><img src="/vendor/icons/electric-plug-icon.svg" />Federleiste prüfen</div>
<div id="cable-check" onclick="window.location.href='#cable-check'; pageload();"><img src="/vendor/icons/fiber-cable-icon.svg" />Spurkabel prüfen</div>
<div id="index" class="navigation-footer">
<div class="connection-indicator unknown"></div>Verbinde...<br>
<img class="infrago-logo" src="/vendor/DB_InfraGo_logo_red_black_100px_rgb.svg" width="100%" />
</div>
</div>
<div class="navigation secondary" id="navigation-secondary">
</div>
<div id="message-box" style="display: none;position: absolute; bottom: 10px; left: 260px; right: 10px; background-color:grey;height:auto;padding:20px;box-sizing:border-box;transform: translateY(calc(100% + 5px));transition-duration:.5s; border-radius: 10px;background-color: #d2d2d2;z-index: 502;"></div>
<div class="content" id="content">
</div>
</div>
</body>
</html>

24
alt/pagecontent/index.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
session_start();
header('Content-Type: text/plain');
header('Cache-Control: no-cache');
ob_implicit_flush(true);
ob_end_flush();
$view = $_GET["view"];
$meta = $_GET["meta"];
$_SESSION["meta"]=$meta;
?>
<div class="content-header">Federleiste prüfen</div>
<hr />
<p>Automatische Erkennung</p>
<i>Verbinden Sie den zu messenden Stecker mit dem Gerät. Vermeiden Sie Bewegungen während der Messung.</i>
<div class="save-button" onclick="window.location.href='#start';$('.save-button').html('<img src=\'/vendor/icons/load.gif\' \>Initialisieren...'); "><img src="/vendor/icons/play.svg" \>Jetzt prüfen</div>

339
alt/pagecontent/start.php Normal file
View File

@@ -0,0 +1,339 @@
<?php
session_start();
header('Content-Type: text/plain');
header('Cache-Control: no-cache');
ob_implicit_flush(true);
ob_end_flush();
$translationMap = [
"A" => "30",
"B" => "20",
"C" => "10",
"D" => "39",
"E" => "29",
"F" => "19",
"G" => "38",
"H" => "28",
"I" => "18",
"J" => "37",
"K" => "27",
"L" => "17",
"M" => "36",
"N" => "26",
"O" => "16",
"P" => "35",
"Q" => "25",
"R" => "15",
"S" => "34",
"T" => "24",
"U" => "14",
"V" => "33",
"W" => "23",
"X" => "13",
"Y" => "32",
"Z" => "22",
"AA" => "12",
"AB" => "31",
"AC" => "21",
"AD" => "11"
];
function translateArray($inputArray, $translationMap) {
return array_map(function($subArray) use ($translationMap) {
return array_map(function($item) use ($translationMap) {
return $translationMap[$item] ?? $item; // Falls kein Mapping existiert, bleibt das Original erhalten
}, $subArray);
}, $inputArray);
}
flush();
?>
<style>
div.check-loading-screen {
width: 250px;
height: auto;
background-color: #ebebeb;
margin: 0 auto;
text-align: left;
padding: 5px;
border-radius: 25px;
}
div.check-loading-screen div {
padding: 5px;
margin: 10px;
line-height: 30px;
transition-duration: .4s;
cursor: pointer;
border-radius: 10px;
}
div.check-loading-screen div img {
width: 30px;
margin-right: 20px;
vertical-align: middle;
filter: contrast(0.3);
line-height: 30px;
cursor: pointer;
display: inline-block;
}
</style>
<div class="check-loading-screen" id="_1">
<div>
<img src="/vendor/icons/load.gif">Initialisieren
</div>
<div>
<img src="/vendor/icons/clock-rotate-right.svg">Prüfung 1/2
</div>
<div>
<img src="/vendor/icons/clock-rotate-right.svg">Prüfung 2/2
</div>
</div>
<?php
flush();
// To Run the Python program
$command = escapeshellcmd('python3 /var/www/html/alt/python/plug-check.py');
// Use shell_exec to execute the command and capture the output
$output0 = shell_exec($command);
?>
<style>
#_1 {
display: none;
}
</style>
<div class="check-loading-screen" id="_2">
<div>
<img src="/vendor/icons/check.svg">Initialisieren
</div>
<div>
<img src="/vendor/icons/load.gif">Prüfung 1/2
</div>
<div>
<img src="/vendor/icons/clock-rotate-right.svg">Prüfung 2/2
</div>
</div>
<?php
$command = escapeshellcmd('python3 /var/www/html/alt/python/plug-check.py');
// Use shell_exec to execute the command and capture the output
$bridges1 = shell_exec($command);
$number_bridges1 = count(json_decode($bridges1, true));
?>
<style>
#_2 {
display: none;
}
</style>
<div class="check-loading-screen" id="_3">
<div>
<img src="/vendor/icons/check.svg">Initialisieren
</div>
<div>
<img src="/vendor/icons/check.svg">Prüfung 1/2 (<?php echo $number_bridges1; ?>x)
</div>
<div>
<img src="/vendor/icons/load.gif">Prüfung 2/2
</div>
</div>
<?php
$command = escapeshellcmd('python3 /var/www/html/alt/python/plug-check.py');
// Use shell_exec to execute the command and capture the output
$bridges2 = shell_exec($command);
?>
<style>
#_3 {
display: none;
}
</style>
<?php
$bridges1 = $bridges2;
if($bridges1 == $bridges2) {
$output = translateArray(json_decode($bridges1, true), $translationMap);
if($output == "error") {
die("Fehler");
}
//$output = [ ["16", "30"], ["30", "16"]];
$array = $output;
$doubles = []; // Array zur Verfolgung von Doppelungen
$errors = []; // Array für fehlende Doppelungen
// Schritt 1: Prüfung auf Doppelungen
foreach ($array as $pair) {
// Sortiere die Paare, um `[23,14]` und `[14,23]` gleich zu behandeln
sort($pair);
$key = implode("-", $pair);
if (isset($doubles[$key])) {
$doubles[$key]++; // Verbindung erneut gefunden
} else {
$doubles[$key] = 1; // Erstmaliges Auftreten
}
}
// Schritt 2: Bereinigung der doppelten Einträge
$unique = []; // Array für eindeutige Verbindungen
$seen = []; // Array zur Verfolgung bereits bearbeiteter Verbindungen
foreach ($array as $pair) {
// Sortiere das Paar
sort($pair);
$key = implode("-", $pair);
// Füge nur ein Exemplar hinzu
if (!isset($seen[$key])) {
$unique[] = $pair;
$seen[$key] = true; // Markiere als verarbeitet
}
}
$cleaned_output = json_encode($unique);
$url = '../stecker.php?data=' . urlencode($cleaned_output); // Kodiert es für die URL
?>
<div class="content-header">Ergebnis</div>
<hr />
<div class="toggle-switch">
<div align="right"><p>Gesamtergebnis</p></div>
<div><label class="switch"><input type="checkbox" onchange='$("#op-1").toggle(this.unchecked);$("#op-2").toggle(this.checked);'><span class="slider"></span></label></div>
<div align="left"><p>Einzelbrücken</p></div>
</div>
<div id="op-1">
<img src="<?php echo $url; ?>" />
</div>
<div id="op-2" style="display: none;">
<?php
foreach($unique as $unique_element) {
$cleaned_output = "[" . json_encode($unique_element) . "]";
$url = 'stecker.php?data=' . urlencode($cleaned_output); // Kodiert es für die URL
?>
<img style="margin-bottom: 5px;" src="<?php echo $url; ?>" />
<?php
}
?>
</div>
<hr />
<?php
}
else {
$output = "error";
/*
$url1 = 'stecker.php?data=' . urlencode(translateArray($bridges1, $translationMap)); // Kodiert es für die URL
$url2 = 'stecker.php?data=' . urlencode(translateArray($bridges2, $translationMap)); // Kodiert es für die URL
*/
?>
<style>
#_3 {
display: none;
}
</style>
<div class="check-loading-screen" id="_4">
<div>
<img src="/vendor/icons/check.svg">Initialisieren
</div>
<div>
<img src="/vendor/icons/xmark.svg">Prüfung 1/2
</div>
<div>
<img src="/vendor/icons/xmark.svg">Prüfung 2/2
</div>
</div>
<p>Es gab einen Fehler bei der Messung!</br>Messung 1 und Messung 2 lieferten keine übereinstimmenden Ergebnisse.<br>Bitte prüfen Sie, ob alle Steckverbindungen fest sitzen und vermeiden Sie Bewegungen, welche die Messung beeinträchtigen können.</br>Stellen Sie sicher, dass keine der Verbindungen gegen Erde kurzgeschlossen ist, da dies die Messung beeinträchtigt.<br>Erwägen Sie, eine erneute Messung zurchzuführen.</p>
<br>
<p>Ergebnis Messung 1:</p>
<i><?php echo $bridges1; ?><i>
<img src="<?php echo $url1; ?>" />
<p>Ergebnis Messung 2:</p>
<i><?php echo $bridges2; ?><i>
<img src="<?php echo $url2; ?>" />
<div class="save-button" onclick="window.location.href='#index'; pageload();$('.save-button').html('<img src=\'load.gif\' \>Bitte warten...');"><img src="/vendor/icons/nav-arrow-left.svg" \>Zurück</div>
<?php
}
?>

144
alt/python/plug-check.py Normal file
View File

@@ -0,0 +1,144 @@
import smbus
import time
import json
# Adressen der beiden MCP23017 Chips
AusgangRechts = 0x20 # Ausgang rechte Hälfte
AusgangLinks = 0x21 # Ausgang linke Hälfte
EingangRechts = 0x24 # Eingang rechte Hälfte
EingangLinks = 0x23 # Eingang linke Hälfte
# Register-Adressen für den MCP23017
IODIRA = 0x00 # Eingang / Ausgang A
IODIRB = 0x01 # Eingang / Ausgang B
GPIOA = 0x12 # GPIO A
GPIOB = 0x13 # GPIO B
# Initialisiere den I2C Bus
bus = smbus.SMBus(1)
RechtsA_ausgang = ["Z", "AA", "W", "AB", "AC", "AD", "AE", "AF"]
RechtsB_ausgang = ["Q", "U", "V", "T", "S", "R", "Y", "X"]
RechtsA_eingang = ["R", "T", "V", "X", "Z", "AB", "AD", "AE"]
RechtsB_eingang = ["Q", "S", "W", "U", "AA", "Y", "AC", "AF"]
LinksA_ausgang = ["C", "D", "E", "J", "F", "G", "H", "I"]
LinksB_ausgang = ["A", "B", "P", "O", "K", "L", "M", "N"]
LinksA_eingang = ["B", "D", "F", "H", "J", "K", "M", "I"]
LinksB_eingang = ["A", "C", "E", "G", "L", "N", "O", "P"]
array = []
def default():
adressen = [AusgangRechts, AusgangLinks, EingangRechts, EingangLinks]
# Schleife für alle Registeradressen (0x00 bis 0x15)
for register in range(0x00, 0x16):
for adresse in adressen:
bus.write_byte_data(adresse, register, 0x00)
# Konfiguriere alle Pins auf Chip 1 als Ausgang (A und B)
def configure_chip1_as_output():
bus.write_byte_data(AusgangRechts, IODIRA, 0x00) # Setze alle Pins von A als Ausgang
bus.write_byte_data(AusgangRechts, IODIRB, 0x00) # Setze alle Pins von B als Ausgang
bus.write_byte_data(AusgangLinks, IODIRA, 0x00) # Setze alle Pins von A als Ausgang
bus.write_byte_data(AusgangLinks, IODIRB, 0x00) # Setze alle Pins von B als Ausgang
# Konfiguriere alle Pins auf Chip 2 als Eingang (A und B)
def configure_chip2_as_input():
bus.write_byte_data(EingangRechts, IODIRA, 0xFF) # Setze alle Pins von A als Eingang
bus.write_byte_data(EingangRechts, IODIRB, 0xFF) # Setze alle Pins von B als Eingang
bus.write_byte_data(EingangLinks, IODIRA, 0xFF) # Setze alle Pins von A als Eingang
bus.write_byte_data(EingangLinks, IODIRB, 0xFF) # Setze alle Pins von B als Eingang
# Hauptprogramm
def main():
default()
time.sleep(0.5)
configure_chip1_as_output()
configure_chip2_as_input()
# Teste alle Pins auf Chip 1 (A0-A7, B0-B7)
for pin in range(32): # 0 bis 31
#print(f"Setze Pin {pin} auf HIGH auf Chip 1")
bus.write_byte_data(AusgangRechts, GPIOA, 0x00)
bus.write_byte_data(AusgangRechts, GPIOB, 0x00)
bus.write_byte_data(AusgangLinks, GPIOA, 0x00)
bus.write_byte_data(AusgangLinks, GPIOB, 0x00)
if pin < 16:
# Setze den gewählten Pin auf HIGH
if pin < 8: # Pins A0-A7
bus.write_byte_data(AusgangRechts, GPIOA, 1 << pin)
aktuellAn = RechtsA_ausgang[pin]
else: # Pins B0-B7
bus.write_byte_data(AusgangRechts, GPIOB, 1 << (pin - 8))
aktuellAn = RechtsB_ausgang[pin - 8]
else:
# Setze den gewählten Pin auf HIGH
if pin < 24: # Pins A0-A7
bus.write_byte_data(AusgangLinks, GPIOA, 1 << pin - 16)
aktuellAn = LinksA_ausgang[pin - 16]
else: # Pins B0-B7
bus.write_byte_data(AusgangLinks, GPIOB, 1 << (pin - 24))
aktuellAn = LinksB_ausgang[pin - 24]
#print("====================" + aktuellAn + "==========================")
time.sleep(0.02) # Kurze Pause, damit die Änderung sichtbar wird
Wert_Rechts_A = bus.read_byte_data(EingangRechts, GPIOA)
Wert_Links_A = bus.read_byte_data(EingangLinks, GPIOA)
Wert_Rechts_B = bus.read_byte_data(EingangRechts, GPIOB)
Wert_Links_B = bus.read_byte_data(EingangLinks, GPIOB)
for j in range(8): # Lese 4*8=32 Pins
bitmaske = 1 << j # Erstelle eine Maske: 1, 2, 4, 8, 16, ...
Bit_Rechts_A = bool(Wert_Rechts_A & bitmaske) # Isoliere das entsprechende Bit
Bit_Links_A = bool(Wert_Links_A & bitmaske) # Isoliere das entsprechende Bit
Bit_Rechts_B = bool(Wert_Rechts_B & bitmaske) # Isoliere das entsprechende Bit
Bit_Links_B = bool(Wert_Links_B & bitmaske) # Isoliere das entsprechende Bit
if Bit_Rechts_A == True:
if aktuellAn != RechtsA_eingang[j]:
array.append([aktuellAn ,RechtsA_eingang[j]])
#print("Gefunden: " + RechtsA_eingang[j])
if Bit_Links_A == True:
if aktuellAn != LinksA_eingang[j]:
array.append([aktuellAn ,LinksA_eingang[j]])
#print("Gefunden: " + LinksA_eingang[j])
if Bit_Rechts_B == True:
if aktuellAn != RechtsB_eingang[j]:
array.append([aktuellAn ,RechtsB_eingang[j]])
#print("Gefunden: " + RechtsB_eingang[j])
if Bit_Links_B == True:
if aktuellAn != LinksB_eingang[j]:
array.append([aktuellAn ,LinksB_eingang[j]])
#print("Gefunden: " + LinksB_eingang[j])
json_output = json.dumps(array)
print(json_output)
if __name__ == "__main__":
main()

117
alt/script.js Normal file
View File

@@ -0,0 +1,117 @@
function pageload(view, meta) { // Funktion zum Laden des Inhalts
secondaryNavigation("close"); // Schließe das Stecker-Menü
page = window.location.hash.substr(1); // Hole die aufzurufende Seite über den URL-Hash (#xy)
$.ajax({
url: "pagecontent/" + page + ".php?view=" + view + "&meta=" + meta, // Pfad der zu ladenden Seite aufbauen
success: function(result){ // Abfrage erfolgreich
$("#content").html(result);
$("div.navigation>div").removeClass("active"); // Alle Buttons inaktiv
$("#" + page).addClass("active"); // Button mit Klasse "page" wird aktiv geschaltet (im Menü)
}});
}
function checkConnection(last) { // Verbindunsstatus überwachen // Last ist der letzte gemessene Netzwerkzustand
$.ajax({
url: "actions/connection-test.php?a=" + Date.now(), // verändere idr URL leicht, damit der Server nicht cached
timeout: 5000, // maximale Wartezeit sind 5 Sekunden; alles darüber wird als zu unzuverlässig angesehen
error: function(jqXHR, textStatus, errorThrown) { // Wenn ein Fehler bei der Anfrage auftritt (z.B. Netzwerkprobleme)
$(".navigation-footer").html('<div class="connection-indicator false"></div>Keine Verbindung<img class="infrago-logo" src="/vendor/DB_InfraGo_logo_red_black_100px_rgb.svg" width="100%" />');
console.error("Fehler bei der Anfrage:", textStatus, errorThrown);
if (last != 1) { // letzter Zustand war "online" // Vermeiden von ständigen Nachrichten
message("Keine Verbindung"); // Werfe eine Nachricht
}
setTimeout(function() { // nächste Prüfung in 5 Sekunden
checkConnection(1); // der Status offline wird mit übertragen
}, 5000);
},
success: function(data) { // Verbindung iO
setTimeout(function() { // nächste Prüfung in 5 Sekunden
checkConnection();
}, 5000);
if (data == 'true') { // der Rückgabewert ist true, alles IO
$(".navigation-footer").html('<div class="connection-indicator true"></div>Verbunden<img class="infrago-logo" src="/vendor/DB_InfraGo_logo_red_black_100px_rgb.svg" width="100%" />');
if (last == 1) { // war der letzte Status noch "offline", wird der Nutzer benachrichtigt
message("Verbindung wiederhergestellt!");
}
} else { // außergewöhnlicher Fehler, aber möglich
message("Keine Verbindung"); // Verbindung dennoch unbrauchbar, wenn keine Daten geladen werden
$(".navigation-footer").html('<div class="connection-indicator false"></div>Keine Verbindung<img class="infrago-logo" src="/vendor/DB_InfraGo_logo_red_black_100px_rgb.svg" width="100%" />');
}
}
});
}
function secondaryNavigation(animation, content) {
if (animation == "open") {
$.get("pagecontent/plug-select.php", {
},
function(data, status) {
if (status == "success") {
if (data != 'false') {
$("#navigation-secondary").css("left", "250px");
$(".navigation-header").attr("onclick", "secondaryNavigation('close','plug-select')");
setTimeout(function() {
$("#navigation-secondary").html(data);
console.log(data);
}, 200);
} else {
window.location.href = "#";
alert("Die Inhalte konnten nicht abgerufen werden. Vergewissern Sie sich, dass Sie mit dem WLAN-Netzwerk verbunden sind und laden Sie bei Bedarf die Seite neu.");
}
}
});
} else {
$("#navigation-secondary").css("left", "-250px");
$(".navigation-header").attr("onclick", "secondaryNavigation('open','plug-select')");
}
}
function message(content) {
$("#message-box").html(content);
$("#message-box").css("display", "block");
setTimeout(function() {
$("#message-box").css("transform", "translateY(0)");
}, 50);
setTimeout(function() {
setTimeout(function() {
$("#message-box").css("display", "none");
}, 500);
$("#message-box").css("transform", "translateY(calc(100% + 5px))");
}, 3000);
}
$(window).bind('beforeunload', function() {
$("#warning").css("display", "block");
return 'Are you sure you want to leave?';
});

120
alt/stecker.php Normal file
View File

@@ -0,0 +1,120 @@
<?php
// Setze den Content-Type-Header für SVG
header('Content-Type: image/svg+xml');
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="500" height="100">
<defs>
<style>
@font-face {
font-family: LexendDecaBold;
src: url(http://192.168.37.103/vendor/fonts/LexendDeca-Bold.ttf);
}
* {
font-family: LexendDecaBold;
font-size: 14px;
}
</style>
</defs>
<text x="30" y="5" fill="black" text-anchor="middle" transform="translate(50,50) rotate(-90)">30</text>
<text x="-30" y="5" fill="black" text-anchor="middle" transform="translate(50,50) rotate(-90)">10</text>
<text x="30" y="405" fill="black" text-anchor="middle" transform="translate(50,50) rotate(-90)">31</text>
<text x="-30" y="405" fill="black" text-anchor="middle" transform="translate(50,50) rotate(-90)">11</text>
<path d="M500 0 L50 0" style="stroke:black;stroke-width:5; fill:none;" />
<path d="M50 0 L0 25" style="stroke:black;stroke-width:3; fill:none;" />
<path d="M0 25 L0 75" style="stroke:black;stroke-width:5; fill:none;" />
<path d="M0 75 L50 100" style="stroke:black;stroke-width:3; fill:none;" />
<path d="M50 100 L500 100" style="stroke:black;stroke-width:5; fill:none;" />
<path d="M500 100 L500 0" style="stroke:black;stroke-width:5; fill:none;" />
<rect width="35" height="35" x="452" y="32" rx="5" ry="5" style="stroke:black;stroke-width:3;fill:none" />
<circle r="8" cx="470" cy="50" fill="none" style="stroke:black;stroke-width:3;" />
<rect width="35" height="35" x="13" y="32" rx="5" ry="5" style="stroke:black;stroke-width:3;fill:none" />
<circle r="8" cx="30" cy="50" fill="none" style="stroke:black;stroke-width:3;" />
<rect width="380" height="80" x="60" y="10" rx="5" ry="5" style="stroke:black;stroke-width:3;fill:none" />
<?php
$pin_coordinates = [
10 => [70, 68],
20 => [70, 44],
30 => [70, 20],
11 => [405, 68],
12 => [370, 68],
13 => [335, 68],
14 => [300, 68],
15 => [265, 68],
16 => [230, 68],
17 => [195, 68],
18 => [160, 68],
19 => [125, 68],
21 => [405, 44],
22 => [370, 44],
23 => [335, 44],
24 => [300, 44],
25 => [265, 44],
26 => [220, 44],
27 => [185, 44],
28 => [150, 44],
29 => [115, 44],
31 => [405, 20],
32 => [370, 20],
33 => [335, 20],
34 => [300, 20],
35 => [265, 20],
36 => [230, 20],
37 => [195, 20],
38 => [160, 20],
39 => [125, 20],
];
foreach ($pin_coordinates as $coordinates) {
echo '<rect width="25" height="10" x="' . $coordinates[0] . '" y="' . $coordinates[1] . '" rx="1" ry="1" style="stroke:black;stroke-width:3;fill:none" />';
}
if (empty($_GET['data'])) {
print "</svg>";
die();
}
$inputArray = json_decode($_GET['data'], true); // JSON in ein PHP-Array umwandeln
// Neues Array mit übersetzten Koordinaten
$translatedArray = array_map(function ($pair) use ($pin_coordinates) {
return [
$pin_coordinates[$pair[0]], // Übersetze den ersten Wert
$pin_coordinates[$pair[1]], // Übersetze den zweiten Wert
];
}, $inputArray);
$colors = ["#1a5fb4", "#26a269", "#e5a50a", "#c64600", "#a51d2d", "#613583", "#63452c", "#3d3846"];
// Schleife durch das übersetzte Array
$colorNumber = 0;
foreach ($translatedArray as $line) {
$point1 = $line[0]; // Erster Punkt [x, y]
$point2 = $line[1]; // Zweiter Punkt [x, y]
$point1x = $point1[0] + 10;
$point1y = $point1[1] + 5;
$point2x = $point2[0] + 10;
$point2y = $point2[1] + 5;
// Ausgabe eines Pfades (Linie zwischen zwei Punkten)
echo '<path d="M' . $point1x . " " . $point1y . " L" . $point2x . " " . $point2y . '" style="stroke:' . $colors[$colorNumber] . ';stroke-width:3; fill:none;" />';
$colorNumber++;
if ($colorNumber > 7) {
$colorNumber = 0;
}
}
?>
</svg>

241
alt/style.css Normal file
View File

@@ -0,0 +1,241 @@
@font-face {
font-family: LexendDecaBold;
src: url(/vendor/fonts/LexendDeca-Bold.ttf);
}
@font-face {
font-family: LexendDecaMedium;
src: url(/vendor/fonts/LexendDeca-Medium.ttf);
}
body {
height: 100%;
width: 100%;
padding: 20px;
margin: 0;
box-sizing: border-box;
font-family: LexendDecaBold;
font-weight: light;
color: #2e3436;
}
div.main {
width: 100%;
max-width: 900px;
height: auto;
border-radius: 15px;
overflow: hidden;
margin: 0 auto;
border: 5px solid #c3c3c3;
position: relative;
}
div.navigation {
width: 250px;
height: 600px;
background-color: #ebebeb;
float: left;
display: inline-block;
position: relative;
z-index: 501;
}
div.navigation.secondary {
position: absolute;
left: -250px;
top: 0;
overflow-y: auto;
z-index: 500;
transition-duration: .6s;
width: 500px;
backdrop-filter: blur(10px);
background-color: #ebebeb8c;
}
div.navigation.secondary img {
width: 100px !important;
}
div.navigation>div, div.save-button {
padding: 5px;
margin: 10px;
line-height: 30px;
transition-duration: .4s;
cursor: pointer;
border-radius: 10px;
}
div.navigation>div:hover,div.navigation>div.active,div.navigation-footer,div.navigation-header,div.save-button:hover {
background-color: #d2d2d2;
}
div.navigation div.navigation-header {
text-align: center;
}
div.navigation div.navigation-header>div {
background-color: #fff;
border-radius: 0 0 7px 7px;
color: grey;
line-height: 20px;
font-size: 12px;
}
div.navigation>div>img:not(.infrago-logo),div.content div.save-button>img {
width: 30px;
max-height: 30px;
margin-right:20px;
vertical-align:middle;
filter: contrast(0.3);
}
div.navigation>div>img.infrago-logo {
width: 100%;
display:block;
margin-top: 15px;
}
div.content {
width: calc(100% - 250px);
float: right;
display: inline-block;
padding: 15px 20px;
height: 600px;
box-sizing: border-box;
overflow-y: auto;
text-align: center;
}
div.content div.content-header {
text-align: center;
line-height: 30px;
padding: 0;
margin-bottom: 20px;
display: block;
font-size: 2em;
margin-block-start: 0.67em;
margin-block-end: 0.67em;
margin-inline-start: 0px;
margin-inline-end: 0px;
font-weight: bold;
unicode-bidi: isolate;
}
div.content img {
width: 100%;
margin: 0 auto;
display: block;
}
div.navigation-footer {
position: absolute;
bottom:0;
width: calc(100% - 40px);
padding: 10px !important;
cursor: auto !important;
}
div.connection-indicator {
height: 15px;
width: 15px;
border-radius: 100%;
float: left;
vertical-align:middle;
margin: 7.5px;
}
div.connection-indicator.true {
background-color: #2ec27e;
}
div.connection-indicator.unknown {
background-color: #f6d32d;
}
div.connection-indicator.false {
background-color: #ed333b;
}
div.save-button img {
display: inline-block;
}
div.save-button {
background-color: #ebebeb
}
::-webkit-scrollbar {
width: 5px;
}
/* Track */
::-webkit-scrollbar-track {
background: #ebebeb;
}
/* Handle */
::-webkit-scrollbar-thumb, ::-webkit-scrollbar-thumb:hover {
background: #d2d2d2;
}
div.toggle-switch {
width: 100%;
height: 50px;
margin-bottom: 10px;
display: flex;
}
div.toggle-switch div {
display: inline-block;
}
div.toggle-switch div:nth-child(1), div.toggle-switch div:nth-child(3) {
width: 39%;
}
div.toggle-switch div:nth-child(2) {
width: 20%;
padding: 10px;
}
.switch {
position: relative;
display: inline-block;
width: 100%;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
border-radius: 25px;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
border-radius: 100%;
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
table.simple-devider th,table.simple-devider td {
padding: 15px;
}
table.simple-devider * {
margin: 0;
vertical-align: top;
}

View File

@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="DB_InfraGO_logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 316.5 70"><desc>Das ist das Firmenlogo der gemeinwohlorientierten Infrastrukturgesellschaft DB InfraGO AG.</desc>
<metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 9.1-c001 79.a8d4753, 2023/03/23-08:56:37 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
<dc:creator>
<rdf:Seq>
<rdf:li>Deutsche Bahn</rdf:li>
</rdf:Seq>
</dc:creator>
<dc:description>
<rdf:Alt>
<rdf:li xml:lang="x-default">Das ist das Firmenlogo der gemeinwohlorientierten Infrastrukturgesellschaft DB InfraGO AG.</rdf:li>
</rdf:Alt>
</dc:description>
<Iptc4xmpCore:AltTextAccessibility>
<rdf:Alt>
<rdf:li xml:lang="x-default">Das ist das Firmenlogo der gemeinwohlorientierten Infrastrukturgesellschaft DB InfraGO AG.</rdf:li>
</rdf:Alt>
</Iptc4xmpCore:AltTextAccessibility>
<Iptc4xmpCore:ExtDescrAccessibility>
<rdf:Alt>
<rdf:li xml:lang="x-default">Das ist das Firmenlogo der gemeinwohlorientierten Infrastrukturgesellschaft DB InfraGO AG.</rdf:li>
</rdf:Alt>
</Iptc4xmpCore:ExtDescrAccessibility>
<xmp:MetadataDate>2023-12-20T16:18:38+01:00</xmp:MetadataDate>
<xmpMM:InstanceID>xmp.iid:f4896118-a5fc-4ec6-884b-265e34b1ca9a</xmpMM:InstanceID>
<xmpMM:DocumentID>xmp.did:8feca862-1f36-49d9-a283-4022945ab9e2</xmpMM:DocumentID>
<xmpMM:OriginalDocumentID>xmp.did:8feca862-1f36-49d9-a283-4022945ab9e2</xmpMM:OriginalDocumentID>
<xmpMM:History>
<rdf:Seq>
<rdf:li>
<rdf:Description>
<stEvt:action>saved</stEvt:action>
<stEvt:instanceID>xmp.iid:8feca862-1f36-49d9-a283-4022945ab9e2</stEvt:instanceID>
<stEvt:when>2023-12-20T16:13:32+01:00</stEvt:when>
<stEvt:softwareAgent>Adobe Bridge 2024</stEvt:softwareAgent>
<stEvt:changed>/metadata</stEvt:changed>
</rdf:Description>
</rdf:li>
<rdf:li>
<rdf:Description>
<stEvt:action>saved</stEvt:action>
<stEvt:instanceID>xmp.iid:f4896118-a5fc-4ec6-884b-265e34b1ca9a</stEvt:instanceID>
<stEvt:when>2023-12-20T16:18:38+01:00</stEvt:when>
<stEvt:softwareAgent>Adobe Bridge 2024</stEvt:softwareAgent>
<stEvt:changed>/metadata</stEvt:changed>
</rdf:Description>
</rdf:li>
</rdf:Seq>
</xmpMM:History>
<photoshop:CaptionWriter>Deutsche Bahn</photoshop:CaptionWriter>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?></metadata>
<g id="DB_Logo"><path d="M90,0H10C4.6,0,0,4.3,0,10v50c0,5.5,4.6,10,10,10h80c5.5,0,10-4.5,10-10.1V10c0-5.7-4.6-10-10-10ZM92.7,59.9c0,1.6-1.2,2.9-2.7,2.9H10c-1.6,0-2.7-1.3-2.7-2.9V10c0-1.6,1.2-2.9,2.7-2.9h80c1.6,0,2.7,1.3,2.7,2.9v49.9Z" style="fill:#ec0016; stroke-width:0px;"/><path d="M30.6,57.9H13.8V12.1h16.8c11.9,0,18.4,7.4,18.4,22.7,0,13.2-4.5,23-18.4,23.1ZM37.9,35.7c0-9.2-1-16.4-10.9-16.4h-2.2v31.2h3.9c5.8,0,9.2-4.7,9.2-14.8Z" style="fill:#ec0016; stroke-width:0px;"/><path d="M78,33.9c3.2-.9,8-4.6,8-10.7,0-1-.2-11.2-13.1-11.2h-19.1v45.8h16.2c4.3,0,17.7,0,17.7-12.9,0-3.1-1.4-9.1-9.7-11ZM64.7,19.2h3.5c4.9,0,6.9,1.7,6.9,5.5,0,3-2.2,5.5-6,5.5h-4.4v-11ZM69.2,50.5h-4.5v-11.8h4.8c5.7,0,7.1,3.3,7.1,5.9,0,5.9-5.6,5.9-7.4,5.9Z" style="fill:#ec0016; stroke-width:0px;"/></g><g id="InfraGo"><path d="M125,19.1h10v38.9h-10V19.1Z" style="stroke-width:0px;"/><path d="M148.3,28.5h2.2v5.2c3.1-3.5,6.2-5.1,9.9-5.1,4.9,0,7.7,3.3,7.7,9v20.3h-9.3v-18.2c0-2.4-1.1-3.5-3.4-3.5-1.6,0-2.8.4-4.9,1.5v20.2h-9.3v-27.6c3.7-.1,6-.7,7.1-1.8Z" style="stroke-width:0px;"/><path d="M175,37.2h-3.6v-6.6h3.6v-2c0-6.3,3.8-10.2,11.3-10.2,1.9,0,3.3.2,4.6.3v6.4c-.7-.1-1.3-.2-2-.2-3.2,0-4.5,1.2-4.5,4v1.7h4.8v6.6h-4.8v20.7h-9.4v-20.7Z" style="stroke-width:0px;"/><path d="M199.3,28.6h2.2v5.7c2.4-3.8,4.9-5.6,7.6-5.6.3,0,.5.1.7.1v8.3l-.6.1c-2.5.2-5.3.8-7.7,1.9v18.9h-9.3v-27.6c3.6-.1,5.9-.7,7.1-1.8Z" style="stroke-width:0px;"/><path d="M226.7,54.2c-2.1,3-4.9,4.5-8.4,4.5-5.3,0-8.4-3-8.4-8.6,0-8.1,7-8.6,16.3-9v-1.5c0-3-1.4-4.1-4.2-4.1s-5.9.5-9.8,1.2v-7.2c4.1-.9,7.2-1.3,10.8-1.3,8.9,0,12.5,3.3,12.5,11.2v11.7c0,3.2.3,4.3,1.2,5v1.6h-9l-1-3.5ZM222.1,52.6c1.5,0,2.9-.5,4.2-1.6v-5.7c-5.3.2-7.2.5-7.2,4-.1,2.3.8,3.3,3,3.3Z" style="stroke-width:0px;"/><path d="M240.1,39v-.2c0-13.6,7.2-20.3,20.4-20.3,4.3,0,7.6.5,11.6,1.7v7.9c-3.9-1.3-7.3-1.9-11.1-1.9-7.9,0-10,4-10,12.6v.3c0,8.8,2.4,12.2,9.4,12.2,1.6,0,2.7-.2,4.2-.6v-6.5h-6.2v-7.4h15.6v19c-4.8,1.8-9,2.8-13.9,2.8-13.6,0-20-5-20-19.6Z" style="stroke-width:0px;"/><path d="M278.7,38.6v-.2c0-12.5,7.1-20,18.9-20,11.9,0,18.9,7.6,18.9,20.1v.2c0,12.5-7,19.9-18.9,19.9-12,0-18.9-7.5-18.9-20ZM305.6,38.7v-.3c0-9-2.4-12.7-8-12.7-5.7,0-8,3.7-8,12.8v.3c0,8.8,2.4,12.4,8,12.4,5.7,0,8-3.6,8-12.5Z" style="stroke-width:0px;"/></g></svg>

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
alt/vendor/fonts/LexendDeca-Bold.ttf vendored Normal file

Binary file not shown.

BIN
alt/vendor/fonts/LexendDeca-Medium.ttf vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 99.15 123.38" style="enable-background:new 0 0 99.15 123.38" xml:space="preserve"><style type="text/css">.st0{fill-rule:evenodd;clip-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-miterlimit:2.6131;}</style><g><path class="st0" d="M5.44,40.34h15.84V8.47c0-4.52,3.7-8.22,8.22-8.22l0,0c4.52,0,8.22,3.7,8.22,8.22v31.87h24.13V8.47 c0-4.52,3.7-8.22,8.22-8.22l0,0c4.52,0,8.22,3.7,8.22,8.22v31.87h15.42c2.86,0,5.19,2.34,5.19,5.19v6.02 c0,2.86-2.34,5.19-5.19,5.19l-88.27,0c-2.86,0-5.19-2.34-5.19-5.19v-6.02C0.25,42.67,2.59,40.34,5.44,40.34L5.44,40.34z M9.52,56.84l0,12.58c-0.01,22.06,9.79,32.85,32.27,35.56v18.15h16.44v-18.35c22.25-2.14,32.27-15.22,32.27-36.59V56.84H9.52 L9.52,56.84z M28.11,61.42H71.9v6.51H28.11V61.42L28.11,61.42z"/></g></svg>

After

Width:  |  Height:  |  Size: 919 B

1
alt/vendor/icons/fiber-cable-icon.svg vendored Normal file
View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 85.74 122.88" style="enable-background:new 0 0 85.74 122.88" xml:space="preserve"><style type="text/css">.st0{fill-rule:evenodd;clip-rule:evenodd;}</style><g><path class="st0" d="M78.27,38.12c3.55-0.53,6.86,1.91,7.4,5.46c0.53,3.55-1.91,6.86-5.46,7.39c-2.5,0.38-4.89-0.73-6.26-2.66 c-3.57,0.93-6.69,2.33-9.49,4.22c-2.45,1.65-4.67,3.69-6.77,6.13c0.49,0.44,0.97,0.92,1.42,1.43c-0.01,0.55-0.42,1.34-0.8,1.79 c-10.22,12.67-19.42,32.79-22.49,54.84c-0.28,2.04-0.51,4.09-0.69,6.15h-5.2c0.19-2.3,0.44-4.58,0.76-6.85 c3-21.46,11.58-41.2,21.41-54.56l-0.14-0.1c-0.43-0.33-0.74-0.75-0.92-1.22l-4.97-2.97c-0.27-0.09-0.54-0.23-0.78-0.4 c-0.1-0.07-0.19-0.15-0.27-0.23l-13.19-7.89C18.9,63.78,11.24,82.96,7.6,102.58c-1.26,6.77-2.05,13.58-2.41,20.3H0 c0.37-7.03,1.18-14.16,2.5-21.24C6.43,80.5,14.85,59.81,29.27,43.69c0.81-0.99,2.23-1.27,3.35-0.6l0.35,0.21 c1.31-2.91,2.24-5.92,2.85-9c0.58-2.95,0.87-5.96,0.89-9.02c-2.35-0.79-4.18-2.83-4.58-5.45c-0.56-3.72,2-7.2,5.73-7.76 c3.72-0.56,7.2,2,7.76,5.73c0.42,2.81-0.94,5.48-3.23,6.86c0.02,3.67-0.29,7.25-0.98,10.73c-0.73,3.71-1.89,7.33-3.54,10.86 l1.64,0.99c3.86-4.82,7.05-10.17,9.59-16c2.5-5.73,4.39-11.93,5.71-18.58c-1.67-1.01-2.9-2.73-3.21-4.82 c-0.56-3.72,2-7.2,5.73-7.76c3.72-0.56,7.2,2,7.76,5.73c0.5,3.34-1.51,6.48-4.62,7.5c-1.41,7.23-3.44,13.98-6.16,20.2 c-2.65,6.07-5.93,11.65-9.88,16.69l0.87,0.52l0.62,0.37c3.14-4.22,6.38-8.37,9.69-12.45c3.6-4.42,7.29-8.77,11.06-13.05 c-0.05-0.22-0.1-0.43-0.13-0.66c-0.55-3.66,1.97-7.08,5.63-7.63c3.66-0.55,7.08,1.97,7.63,5.63c0.55,3.66-1.97,7.08-5.63,7.63 c-1.35,0.2-2.67-0.01-3.82-0.55c-3.48,3.96-6.92,8.03-10.32,12.21c-3.11,3.82-6.17,7.75-9.18,11.78l1.21,0.72l1,0.6 c2.52-2.99,5.21-5.49,8.22-7.51c3.46-2.33,7.31-4.03,11.75-5.13C73.71,40.35,75.7,38.5,78.27,38.12L78.27,38.12z M19.21,122.88 c0.13-1.7,0.29-3.39,0.48-5.07c2.53-21.67,10.92-41.79,20.71-55.55c0.52-0.72,1.53-0.9,2.27-0.38c0.72,0.52,0.9,1.53,0.38,2.27 c-9.51,13.37-17.65,32.94-20.12,54.03c-0.18,1.56-0.33,3.12-0.45,4.69H19.21L19.21,122.88z M78.86,42 c1.41-0.21,2.72,0.76,2.93,2.17c0.21,1.41-0.76,2.72-2.17,2.93c-1.41,0.21-2.72-0.76-2.93-2.17C76.48,43.52,77.45,42.21,78.86,42 L78.86,42z M57.97,4.27c1.41-0.21,2.72,0.76,2.93,2.17c0.21,1.41-0.76,2.72-2.17,2.93c-1.41,0.21-2.72-0.76-2.93-2.17 C55.59,5.8,56.56,4.48,57.97,4.27L57.97,4.27z M38.5,16.26c1.41-0.21,2.72,0.76,2.93,2.17c0.21,1.41-0.76,2.72-2.17,2.93 c-1.41,0.21-2.72-0.76-2.93-2.17C36.12,17.79,37.09,16.48,38.5,16.26L38.5,16.26z M72.79,21.38c1.41-0.21,2.72,0.76,2.93,2.17 c0.21,1.41-0.76,2.72-2.17,2.93c-1.41,0.21-2.72-0.76-2.93-2.17C70.41,22.9,71.38,21.59,72.79,21.38L72.79,21.38z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

1
alt/vendor/icons/play.svg vendored Normal file
View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg width="24px" height="24px" stroke-width="1.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" color="#000000"><path d="M6.90588 4.53682C6.50592 4.2998 6 4.58808 6 5.05299V18.947C6 19.4119 6.50592 19.7002 6.90588 19.4632L18.629 12.5162C19.0211 12.2838 19.0211 11.7162 18.629 11.4838L6.90588 4.53682Z" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg>

After

Width:  |  Height:  |  Size: 458 B

2
alt/vendor/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long