diff --git a/data/index.html b/data/index.html
index 1df043e..a8c117c 100644
--- a/data/index.html
+++ b/data/index.html
@@ -3,8 +3,10 @@
diff --git a/data/rfid.css b/data/rfid.css
new file mode 100644
index 0000000..58791b7
--- /dev/null
+++ b/data/rfid.css
@@ -0,0 +1,239 @@
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+ body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 20px;
+ }
+
+ .container {
+ background: rgba(255, 255, 255, 0.95);
+ padding: 40px;
+ border-radius: 20px;
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(10px);
+ width: 100%;
+ max-width: 500px;
+ animation: slideIn 0.5s ease-out;
+ }
+
+ @keyframes slideIn {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+
+ .header {
+ text-align: center;
+ margin-bottom: 30px;
+ }
+
+ .header h1 {
+ color: #333;
+ font-size: 2em;
+ margin-bottom: 10px;
+ }
+
+ .header p {
+ color: #666;
+ font-size: 1.1em;
+ }
+
+ .form-group {
+ margin-bottom: 25px;
+ position: relative;
+ }
+
+ .form-group label {
+ display: block;
+ margin-bottom: 8px;
+ color: #333;
+ font-weight: 600;
+ font-size: 1em;
+ }
+
+ .form-group input {
+ width: 100%;
+ padding: 15px;
+ border: 2px solid #e1e5e9;
+ border-radius: 10px;
+ font-size: 1em;
+ transition: all 0.3s ease;
+ background: #fff;
+ }
+
+ .form-group input:focus {
+ outline: none;
+ border-color: #667eea;
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
+ transform: translateY(-2px);
+ }
+
+ .form-group input:hover {
+ border-color: #667eea;
+ }
+
+ .required {
+ color: #e74c3c;
+ }
+
+ .btn-container {
+ display: flex;
+ gap: 15px;
+ margin-top: 30px;
+ }
+
+ .btn {
+ flex: 1;
+ padding: 15px 25px;
+ border: none;
+ border-radius: 10px;
+ font-size: 1.1em;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ }
+
+ .btn-primary {
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ color: white;
+ }
+
+ .btn-primary:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3);
+ }
+
+ .btn-secondary {
+ background: #f8f9fa;
+ color: #666;
+ border: 2px solid #e1e5e9;
+ }
+
+ .btn-secondary:hover {
+ background: #e9ecef;
+ transform: translateY(-2px);
+ }
+
+ .data-table {
+ margin-top: 30px;
+ background: #f8f9fa;
+ border-radius: 10px;
+ padding: 20px;
+ max-height: 300px;
+ overflow-y: auto;
+ }
+
+ .data-table h3 {
+ color: #333;
+ margin-bottom: 15px;
+ text-align: center;
+ }
+
+ .data-entry {
+ background: white;
+ padding: 15px;
+ margin-bottom: 10px;
+ border-radius: 8px;
+ border-left: 4px solid #667eea;
+ animation: fadeIn 0.3s ease-out;
+ }
+
+ @keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateX(-20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ }
+
+ .data-entry strong {
+ color: #333;
+ }
+
+ .data-entry span {
+ color: #666;
+ }
+
+ .success-message {
+ background: #d4edda;
+ color: #155724;
+ padding: 15px;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ border: 1px solid #c3e6cb;
+ animation: fadeIn 0.3s ease-out;
+ }
+
+ .counter {
+ text-align: center;
+ margin-top: 15px;
+ color: #666;
+ font-weight: 600;
+ }
+
+ .read-uid-btn {
+ background: linear-gradient(135deg, #28a745 0%, #20c997 100%);
+ color: white;
+ border: none;
+ padding: 15px 20px;
+ border-radius: 10px;
+ font-size: 0.9em;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ white-space: nowrap;
+ min-width: 120px;
+ }
+
+ .read-uid-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 16px rgba(40, 167, 69, 0.3);
+ }
+
+ .read-uid-btn:disabled {
+ background: #6c757d;
+ cursor: not-allowed;
+ transform: none;
+ box-shadow: none;
+ }
+
+ .read-uid-btn.reading {
+ background: linear-gradient(135deg, #fd7e14 0%, #e83e8c 100%);
+ animation: pulse 1.5s infinite;
+ }
+
+ @keyframes pulse {
+ 0% { transform: scale(1); }
+ 50% { transform: scale(1.05); }
+ 100% { transform: scale(1); }
+ }
+ .container {
+ padding: 30px 20px;
+ margin: 10px;
+ }
+
+ .btn-container {
+ flex-direction: column;
+ }
+
\ No newline at end of file
diff --git a/data/rfid.html b/data/rfid.html
new file mode 100644
index 0000000..93daaac
--- /dev/null
+++ b/data/rfid.html
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
+ RFID Daten Eingabe
+
+
+
+
+
+
+
+ ✅ Daten erfolgreich gespeichert!
+
+
+
+
+
+
📋 Gespeicherte Einträge
+
+ 0 Einträge gespeichert
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data/settings.html b/data/settings.html
index 54d3d51..2a51a1e 100644
--- a/data/settings.html
+++ b/data/settings.html
@@ -3,8 +3,10 @@
- Ninjacross Timer - Einstellungen
+
+ Ninjacross Timer - Einstellungen
+
@@ -234,6 +236,7 @@
// Einstellungen laden beim Seitenaufruf
window.onload = function () {
loadSettings();
+ loadWifiSettings();
loadSystemInfo();
loadCurrentTime();
updateCurrentTimeDisplay();
diff --git a/src/master.cpp b/src/master.cpp
index 29ae2b1..db6d1ac 100644
--- a/src/master.cpp
+++ b/src/master.cpp
@@ -156,6 +156,20 @@ void loadSettings() {
preferences.end();
}
+void saveWifiSettings() {
+ preferences.begin("wifi", false);
+ preferences.putString("ssid", ssidSTA);
+ preferences.putString("password", passwordSTA);
+ preferences.end();
+}
+
+void loadWifiSettings() {
+ preferences.begin("wifi", true);
+ ssidSTA = preferences.getString("ssid", "").c_str();
+ passwordSTA = preferences.getString("password", "").c_str();
+ preferences.end();
+}
+
int checkLicence() {
loadLicenceFromPrefs();
String id = getUniqueDeviceID();
diff --git a/src/wificlass.h b/src/wificlass.h
index be7ba6f..8eb58c0 100644
--- a/src/wificlass.h
+++ b/src/wificlass.h
@@ -9,7 +9,7 @@
#include "master.h"
#include "licenceing.h"
-String ssidAP;
+const char* ssidAP;
const char* passwordAP = nullptr;
const char* ssidSTA = "Obiwlankenobi";
@@ -20,10 +20,10 @@ PrettyOTA OTAUpdates;
void setupWifi() {
- ssidAP = getUniqueSSID();
+ ssidAP = getUniqueSSID().c_str();
WiFi.mode(WIFI_MODE_APSTA);
- WiFi.softAP(ssidAP.c_str(), passwordAP);
+ WiFi.softAP(ssidAP, passwordAP);
WiFi.begin(ssidSTA, passwordSTA);
while (WiFi.status() != WL_CONNECTED) {