194 lines
4.8 KiB
C++
194 lines
4.8 KiB
C++
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
|
|
|
#include "master.h"
|
|
#include <Arduino.h>
|
|
|
|
// Aquacross Timer - ESP32 Master (Webserver + ESP-NOW + Anlernmodus)
|
|
#include <ArduinoJson.h>
|
|
#include <AsyncTCP.h>
|
|
#include <ESPAsyncWebServer.h>
|
|
#include <Preferences.h>
|
|
#include <SPIFFS.h>
|
|
#include <esp_now.h>
|
|
#include <esp_wifi.h>
|
|
|
|
#include <battery.h>
|
|
#include <communication.h>
|
|
#include <databasebackend.h>
|
|
#include <debug.h>
|
|
#include <licenceing.h>
|
|
#include <rfid.h>
|
|
#include <timesync.h>
|
|
#include <webserverrouter.h>
|
|
#include <wificlass.h>
|
|
#include <gamemodes.h>
|
|
|
|
const char *firmwareversion = "1.0.0"; // Version der Firmware
|
|
|
|
|
|
void saveButtonConfig() {
|
|
preferences.begin("buttons", false);
|
|
preferences.putBytes("config", &buttonConfigs, sizeof(buttonConfigs));
|
|
preferences.end();
|
|
}
|
|
|
|
void loadButtonConfig() {
|
|
preferences.begin("buttons", true);
|
|
size_t schLen = preferences.getBytesLength("config");
|
|
if (schLen == sizeof(buttonConfigs)) {
|
|
preferences.getBytes("config", &buttonConfigs, schLen);
|
|
}
|
|
preferences.end();
|
|
}
|
|
|
|
void saveBestTimes() {
|
|
preferences.begin("times", false);
|
|
preferences.putULong("best1", timerData.bestTime1);
|
|
preferences.putULong("best2", timerData.bestTime2);
|
|
preferences.end();
|
|
}
|
|
|
|
void loadBestTimes() {
|
|
preferences.begin("times", true);
|
|
timerData.bestTime1 = preferences.getULong("best1", 0);
|
|
timerData.bestTime2 = preferences.getULong("best2", 0);
|
|
preferences.end();
|
|
}
|
|
|
|
void saveSettings() {
|
|
preferences.begin("settings", false);
|
|
preferences.putULong("maxTime", maxTimeBeforeReset);
|
|
preferences.putULong("maxTimeDisplay", maxTimeDisplay);
|
|
preferences.end();
|
|
}
|
|
|
|
void loadSettings() {
|
|
preferences.begin("settings", true);
|
|
maxTimeBeforeReset = preferences.getULong("maxTime", 300000);
|
|
maxTimeDisplay = preferences.getULong("maxTimeDisplay", 20000);
|
|
preferences.end();
|
|
}
|
|
|
|
void saveWifiSettings() {
|
|
preferences.begin("wifi", false);
|
|
preferences.putString("ssid", ssidSTA);
|
|
preferences.putString("password", passwordSTA);
|
|
preferences.end();
|
|
delay(500); // Warte 2 Sekunden, bevor der Neustart erfolgt
|
|
ESP.restart(); // Neustart des ESP32
|
|
}
|
|
|
|
void loadLocationSettings() {
|
|
preferences.begin("location", true);
|
|
masterlocation = preferences.getString("location", "");
|
|
preferences.end();
|
|
}
|
|
|
|
void saveLocationSettings() {
|
|
preferences.begin("location", false);
|
|
preferences.putString("location", masterlocation);
|
|
preferences.end();
|
|
}
|
|
|
|
void loadWifiSettings() {
|
|
preferences.begin("wifi", true);
|
|
String ssid = preferences.getString("ssid", "");
|
|
String password = preferences.getString("password", "");
|
|
ssidSTA = strdup(ssid.c_str());
|
|
passwordSTA = strdup(password.c_str());
|
|
preferences.end();
|
|
}
|
|
|
|
int checkLicence() {
|
|
loadLicenceFromPrefs();
|
|
String id = getUniqueDeviceID();
|
|
int tier = getLicenseTier(id, licence); // licence = stored or entered key
|
|
return tier;
|
|
}
|
|
|
|
String getTimerDataJSON() {
|
|
DynamicJsonDocument doc(1024);
|
|
|
|
unsigned long currentTime = millis();
|
|
// Bahn 1
|
|
if (timerData.isRunning1) {
|
|
doc["time1"] = (currentTime - timerData.localStartTime1) / 1000.0;
|
|
doc["status1"] = "running";
|
|
} else if (timerData.endTime1 > 0) {
|
|
doc["time1"] = (timerData.endTime1 - timerData.startTime1) / 1000.0;
|
|
doc["status1"] = "finished";
|
|
} else {
|
|
doc["time1"] = 0;
|
|
doc["status1"] = "ready";
|
|
}
|
|
|
|
// Bahn 2
|
|
if (timerData.isRunning2) {
|
|
doc["time2"] = (currentTime - timerData.localStartTime2) / 1000.0;
|
|
doc["status2"] = "running";
|
|
} else if (timerData.endTime2 > 0) {
|
|
doc["time2"] = (timerData.endTime2 - timerData.startTime2) / 1000.0;
|
|
doc["status2"] = "finished";
|
|
} else {
|
|
doc["time2"] = 0;
|
|
doc["status2"] = "ready";
|
|
}
|
|
|
|
// Beste Zeiten
|
|
doc["best1"] = timerData.bestTime1 / 1000.0;
|
|
doc["best2"] = timerData.bestTime2 / 1000.0;
|
|
|
|
// Lernmodus
|
|
doc["learningMode"] = learningMode;
|
|
if (learningMode) {
|
|
String buttons[] = {"Start Bahn 1", "Stop Bahn 1", "Start Bahn 2",
|
|
"Stop Bahn 2"};
|
|
doc["learningButton"] = buttons[learningStep];
|
|
}
|
|
|
|
String result;
|
|
serializeJson(doc, result);
|
|
return result;
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
|
|
if (!SPIFFS.begin(true)) {
|
|
Serial.println("SPIFFS Mount Failed");
|
|
return;
|
|
}
|
|
|
|
// setup API libararies
|
|
setupTimeAPI(server);
|
|
setupLicenceAPI(server);
|
|
setupDebugAPI(server);
|
|
setupBackendRoutes(server);
|
|
setupRFIDRoute(server);
|
|
|
|
// Gespeicherte Daten laden
|
|
loadButtonConfig();
|
|
loadBestTimes();
|
|
loadSettings();
|
|
loadWifiSettings();
|
|
loadLocationSettings();
|
|
|
|
setupWifi(); // WiFi initialisieren
|
|
setupOTA(&server);
|
|
|
|
setupRoutes();
|
|
setupWebSocket();
|
|
setupLED();
|
|
setupMqttServer(); // MQTT Server initialisieren
|
|
// setupBattery();
|
|
// setupRFID();
|
|
}
|
|
|
|
void loop() {
|
|
checkAutoReset();
|
|
loopMqttServer(); // MQTT Server in der Loop aufrufen
|
|
loopWebSocket();
|
|
// loopBattery(); // Batterie-Loop aufrufen
|
|
// loopRFID(); // RFID Loop aufrufen
|
|
}
|