mirror of
https://gitlab.com/fabinfra/fabhardware/fabreader.git
synced 2025-03-12 22:51:43 +01:00
Added: website
This commit is contained in:
parent
d7c1288946
commit
7f5395a882
@ -21,3 +21,4 @@ lib_deps =
|
|||||||
uipethernet/UIPEthernet@^2.0.12
|
uipethernet/UIPEthernet@^2.0.12
|
||||||
bblanchon/ArduinoJson@^6.19.4
|
bblanchon/ArduinoJson@^6.19.4
|
||||||
mbed-feb11/Crypto@0.0.0+sha.f04410cef037
|
mbed-feb11/Crypto@0.0.0+sha.f04410cef037
|
||||||
|
ottowinter/ESPAsyncWebServer-esphome@^3.0.0
|
||||||
|
@ -1,183 +1,63 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
#include <ArduinoLog.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "pins.h"
|
|
||||||
#include "nfc.h"
|
|
||||||
#include "otaproxy.h"
|
|
||||||
#include "helpers.h"
|
|
||||||
#include "Desfire.h"
|
|
||||||
#include "display.h"
|
|
||||||
|
|
||||||
#include <ESP8266WiFi.h>
|
#include <ESP8266WiFi.h>
|
||||||
#include <ESP8266WebServer.h>
|
#include <ESPAsyncTCP.h>
|
||||||
|
#include <ESPAsyncWebServer.h>
|
||||||
#include <WiFiClient.h>
|
|
||||||
#include <PubSubClient.h>
|
|
||||||
#include <SPI.h>
|
|
||||||
|
|
||||||
#include "website.h"
|
#include "website.h"
|
||||||
|
|
||||||
WiFiClient espClient;
|
const char* ssid = "FabReader";
|
||||||
//Config_Data config;
|
AsyncWebServer server(80);
|
||||||
|
|
||||||
PubSubClient* mqtt;
|
String template_index(const String& var)
|
||||||
NFC* nfc;
|
|
||||||
OTAProxy* ota;
|
|
||||||
Display* display;
|
|
||||||
|
|
||||||
unsigned long otatimeout = 3000;
|
|
||||||
unsigned long lastotatime;
|
|
||||||
|
|
||||||
void setup_wifi()
|
|
||||||
{
|
{
|
||||||
delay(10);
|
if(var == "STYLE")
|
||||||
Serial.println("Connecting Wifi ...");
|
|
||||||
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
WiFi.begin(WLAN_SSID, WLAN_PASS);
|
|
||||||
|
|
||||||
while (WiFi.status() != WL_CONNECTED)
|
|
||||||
{
|
{
|
||||||
delay(500);
|
return String(WEBSITE_CSS);
|
||||||
}
|
|
||||||
|
|
||||||
randomSeed(micros());
|
|
||||||
Serial.println("WiFi connected");
|
|
||||||
}
|
|
||||||
|
|
||||||
void reconnect()
|
|
||||||
{
|
|
||||||
while (!mqtt->connected())
|
|
||||||
{
|
|
||||||
String clientId = "FabReader_";
|
|
||||||
clientId += String(FABREADERID);
|
|
||||||
|
|
||||||
Serial.println("Connecting MQTT ...");
|
|
||||||
bool connected = false;
|
|
||||||
if(MQTT_USERNAME == "")
|
|
||||||
{
|
|
||||||
connected = mqtt->connect(clientId.c_str());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
connected = mqtt->connect(clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD);
|
return String();
|
||||||
}
|
|
||||||
|
|
||||||
if (connected)
|
|
||||||
{
|
|
||||||
Serial.println("MQTT connected");
|
|
||||||
char id[6] = "00000";
|
|
||||||
sprintf(id, "%05d", FABREADERID);
|
|
||||||
mqtt->publish("fabreader", id);
|
|
||||||
|
|
||||||
char topic_requestOTA[] = "fabreader/00000/requestOTA";
|
|
||||||
sprintf(topic_requestOTA, "fabreader/%05d/requestOTA", FABREADERID);
|
|
||||||
mqtt->subscribe(topic_requestOTA);
|
|
||||||
|
|
||||||
char topic_stopOTA[] = "fabreader/00000/stopOTA";
|
|
||||||
sprintf(topic_stopOTA, "fabreader/%05d/stopOTA", FABREADERID);
|
|
||||||
mqtt->subscribe(topic_stopOTA);
|
|
||||||
|
|
||||||
char topic_display[] = "fabreader/00000/display/#";
|
|
||||||
sprintf(topic_display, "fabreader/%05d/display/#", FABREADERID);
|
|
||||||
mqtt->subscribe(topic_display);
|
|
||||||
|
|
||||||
display->writeTitle("Connected");
|
|
||||||
display->writeInfo("");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
display->writeTitle("Reconnect");
|
|
||||||
display->writeInfo("MQTT");
|
|
||||||
|
|
||||||
Serial.print("failed, rc=");
|
|
||||||
Serial.print(mqtt->state());
|
|
||||||
Serial.println(" try again in 5 seconds");
|
|
||||||
delay(5000);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void callback(char* topic, byte* payload, unsigned int length)
|
String template_saved(const String& var)
|
||||||
{
|
{
|
||||||
Serial.println("Receive Message");
|
if(var == "STYLE")
|
||||||
Serial.println(topic);
|
|
||||||
if(ota->hasActiveOTA())
|
|
||||||
{
|
{
|
||||||
ota->continueOTA(topic, payload, length);
|
return String(WEBSITE_CSS);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return String();
|
||||||
}
|
}
|
||||||
display->updateByMQTT(topic, payload, length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
Serial.print("\n\n\n");
|
Serial.print("\n\n\n");
|
||||||
Serial.println("Booting ...");
|
|
||||||
|
|
||||||
pinMode(PIN_BUZZER, OUTPUT);
|
WiFi.mode(WIFI_AP);
|
||||||
pinMode(PIN_BUTTON, INPUT);
|
WiFi.softAP(ssid);
|
||||||
pinMode(PIN_ETH_SPI_SS, OUTPUT);
|
|
||||||
digitalWrite(PIN_ETH_SPI_SS, HIGH);
|
|
||||||
|
|
||||||
display = new Display(PIN_SDA, PIN_SCL, FABREADERID);
|
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
|
||||||
display->clearReaderInfo();
|
|
||||||
|
|
||||||
display->writeInfo("Start NFC ...");
|
|
||||||
Serial.println("Connecting NFC ...");
|
|
||||||
nfc = new NFC(PIN_RFID_SPI_SS, PIN_RFID_RST);
|
|
||||||
if(!(nfc->rfid->PCD_PerformSelfTest()))
|
|
||||||
{
|
{
|
||||||
Serial.println("NFC Test failed");
|
request->send_P(200, "text/html", WEBSITE_INDEX, template_index);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/update_config", HTTP_POST, [](AsyncWebServerRequest *request)
|
||||||
|
{
|
||||||
|
if(request->hasParam("wlan_ssid", true))
|
||||||
|
{
|
||||||
|
Serial.print("WLAN_SSID set\n");
|
||||||
}
|
}
|
||||||
Serial.println("NFC connected");
|
request->send_P(200, "text/html", WEBSITE_SAVED, template_saved);
|
||||||
|
});
|
||||||
|
|
||||||
display->writeInfo("Start WIFI ...");
|
server.begin();
|
||||||
setup_wifi();
|
Serial.print("Server started\n");
|
||||||
|
|
||||||
display->writeInfo("Start MQTT ...");
|
|
||||||
mqtt = new PubSubClient(espClient);
|
|
||||||
mqtt->setServer(MQTT_BROKER, 1883);
|
|
||||||
mqtt->setCallback(callback);
|
|
||||||
|
|
||||||
display->writeInfo("Start OTA ...");
|
|
||||||
ota = new OTAProxy(mqtt, nfc, FABREADERID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
if (!mqtt->connected())
|
|
||||||
{
|
|
||||||
reconnect();
|
|
||||||
}
|
|
||||||
mqtt->loop();
|
|
||||||
|
|
||||||
if(!ota->hasActiveOTA())
|
|
||||||
{
|
|
||||||
if(nfc->checkforCard())
|
|
||||||
{
|
|
||||||
Serial.println("Card detected");
|
|
||||||
if(nfc->connecttoCard())
|
|
||||||
{
|
|
||||||
Serial.println("Card connected");
|
|
||||||
lastotatime = millis();
|
|
||||||
|
|
||||||
display->createReaderInfo("Run OTA");
|
|
||||||
ota->startOTA();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
display->createReaderInfo("Retry Card");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(ota->hasActiveOTA())
|
|
||||||
{
|
|
||||||
if(millis() - lastotatime > otatimeout)
|
|
||||||
{
|
|
||||||
ota->cancelOTA();
|
|
||||||
display->clearReaderInfo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
183
src/FabReader_v2/src/main.cpp.2
Normal file
183
src/FabReader_v2/src/main.cpp.2
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <ArduinoLog.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "pins.h"
|
||||||
|
#include "nfc.h"
|
||||||
|
#include "otaproxy.h"
|
||||||
|
#include "helpers.h"
|
||||||
|
#include "Desfire.h"
|
||||||
|
#include "display.h"
|
||||||
|
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <ESP8266WebServer.h>
|
||||||
|
|
||||||
|
#include <WiFiClient.h>
|
||||||
|
#include <PubSubClient.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
#include "website.h"
|
||||||
|
|
||||||
|
WiFiClient espClient;
|
||||||
|
//Config_Data config;
|
||||||
|
|
||||||
|
PubSubClient* mqtt;
|
||||||
|
NFC* nfc;
|
||||||
|
OTAProxy* ota;
|
||||||
|
Display* display;
|
||||||
|
|
||||||
|
unsigned long otatimeout = 3000;
|
||||||
|
unsigned long lastotatime;
|
||||||
|
|
||||||
|
void setup_wifi()
|
||||||
|
{
|
||||||
|
delay(10);
|
||||||
|
Serial.println("Connecting Wifi ...");
|
||||||
|
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
WiFi.begin(WLAN_SSID, WLAN_PASS);
|
||||||
|
|
||||||
|
while (WiFi.status() != WL_CONNECTED)
|
||||||
|
{
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
randomSeed(micros());
|
||||||
|
Serial.println("WiFi connected");
|
||||||
|
}
|
||||||
|
|
||||||
|
void reconnect()
|
||||||
|
{
|
||||||
|
while (!mqtt->connected())
|
||||||
|
{
|
||||||
|
String clientId = "FabReader_";
|
||||||
|
clientId += String(FABREADERID);
|
||||||
|
|
||||||
|
Serial.println("Connecting MQTT ...");
|
||||||
|
bool connected = false;
|
||||||
|
if(MQTT_USERNAME == "")
|
||||||
|
{
|
||||||
|
connected = mqtt->connect(clientId.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
connected = mqtt->connect(clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connected)
|
||||||
|
{
|
||||||
|
Serial.println("MQTT connected");
|
||||||
|
char id[6] = "00000";
|
||||||
|
sprintf(id, "%05d", FABREADERID);
|
||||||
|
mqtt->publish("fabreader", id);
|
||||||
|
|
||||||
|
char topic_requestOTA[] = "fabreader/00000/requestOTA";
|
||||||
|
sprintf(topic_requestOTA, "fabreader/%05d/requestOTA", FABREADERID);
|
||||||
|
mqtt->subscribe(topic_requestOTA);
|
||||||
|
|
||||||
|
char topic_stopOTA[] = "fabreader/00000/stopOTA";
|
||||||
|
sprintf(topic_stopOTA, "fabreader/%05d/stopOTA", FABREADERID);
|
||||||
|
mqtt->subscribe(topic_stopOTA);
|
||||||
|
|
||||||
|
char topic_display[] = "fabreader/00000/display/#";
|
||||||
|
sprintf(topic_display, "fabreader/%05d/display/#", FABREADERID);
|
||||||
|
mqtt->subscribe(topic_display);
|
||||||
|
|
||||||
|
display->writeTitle("Connected");
|
||||||
|
display->writeInfo("");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
display->writeTitle("Reconnect");
|
||||||
|
display->writeInfo("MQTT");
|
||||||
|
|
||||||
|
Serial.print("failed, rc=");
|
||||||
|
Serial.print(mqtt->state());
|
||||||
|
Serial.println(" try again in 5 seconds");
|
||||||
|
delay(5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void callback(char* topic, byte* payload, unsigned int length)
|
||||||
|
{
|
||||||
|
Serial.println("Receive Message");
|
||||||
|
Serial.println(topic);
|
||||||
|
if(ota->hasActiveOTA())
|
||||||
|
{
|
||||||
|
ota->continueOTA(topic, payload, length);
|
||||||
|
}
|
||||||
|
display->updateByMQTT(topic, payload, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.print("\n\n\n");
|
||||||
|
Serial.println("Booting ...");
|
||||||
|
|
||||||
|
pinMode(PIN_BUZZER, OUTPUT);
|
||||||
|
pinMode(PIN_BUTTON, INPUT);
|
||||||
|
pinMode(PIN_ETH_SPI_SS, OUTPUT);
|
||||||
|
digitalWrite(PIN_ETH_SPI_SS, HIGH);
|
||||||
|
|
||||||
|
display = new Display(PIN_SDA, PIN_SCL, FABREADERID);
|
||||||
|
display->clearReaderInfo();
|
||||||
|
|
||||||
|
display->writeInfo("Start NFC ...");
|
||||||
|
Serial.println("Connecting NFC ...");
|
||||||
|
nfc = new NFC(PIN_RFID_SPI_SS, PIN_RFID_RST);
|
||||||
|
if(!(nfc->rfid->PCD_PerformSelfTest()))
|
||||||
|
{
|
||||||
|
Serial.println("NFC Test failed");
|
||||||
|
}
|
||||||
|
Serial.println("NFC connected");
|
||||||
|
|
||||||
|
display->writeInfo("Start WIFI ...");
|
||||||
|
setup_wifi();
|
||||||
|
|
||||||
|
display->writeInfo("Start MQTT ...");
|
||||||
|
mqtt = new PubSubClient(espClient);
|
||||||
|
mqtt->setServer(MQTT_BROKER, 1883);
|
||||||
|
mqtt->setCallback(callback);
|
||||||
|
|
||||||
|
display->writeInfo("Start OTA ...");
|
||||||
|
ota = new OTAProxy(mqtt, nfc, FABREADERID);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
if (!mqtt->connected())
|
||||||
|
{
|
||||||
|
reconnect();
|
||||||
|
}
|
||||||
|
mqtt->loop();
|
||||||
|
|
||||||
|
if(!ota->hasActiveOTA())
|
||||||
|
{
|
||||||
|
if(nfc->checkforCard())
|
||||||
|
{
|
||||||
|
Serial.println("Card detected");
|
||||||
|
if(nfc->connecttoCard())
|
||||||
|
{
|
||||||
|
Serial.println("Card connected");
|
||||||
|
lastotatime = millis();
|
||||||
|
|
||||||
|
display->createReaderInfo("Run OTA");
|
||||||
|
ota->startOTA();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
display->createReaderInfo("Retry Card");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ota->hasActiveOTA())
|
||||||
|
{
|
||||||
|
if(millis() - lastotatime > otatimeout)
|
||||||
|
{
|
||||||
|
ota->cancelOTA();
|
||||||
|
display->clearReaderInfo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
138
src/FabReader_v2/src/website.h
Normal file
138
src/FabReader_v2/src/website.h
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
#ifndef WEBSITE_H
|
||||||
|
#define WEBSITE_H
|
||||||
|
const char WEBSITE_INDEX[] = ""
|
||||||
|
"<!DOCTYPE html>\n"
|
||||||
|
"<html>\n"
|
||||||
|
"<head>\n"
|
||||||
|
" <meta charset=\"utf-8\">\n"
|
||||||
|
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
|
||||||
|
" <title>FabReader</title>\n"
|
||||||
|
" <style>\n"
|
||||||
|
" %STYLE%\n"
|
||||||
|
" </style>\n"
|
||||||
|
"</head>\n"
|
||||||
|
"<body>\n"
|
||||||
|
" <div id=\"header\">\n"
|
||||||
|
" <!--<img id=\"header_logo\" src=\"/logo.svg\"/>-->\n"
|
||||||
|
" <h1 id=\"header_title\">FabReader</h1>\n"
|
||||||
|
" </div>\n"
|
||||||
|
" <h2 class=\"title\">Configuration</h2>\n"
|
||||||
|
" <form action=\"/update_config\" method=\"POST\" target=\"_self\">\n"
|
||||||
|
" <h3 class=\"subtitle\">WLAN</h3>\n"
|
||||||
|
" <div class=\"config\"><p class=\"config_title\">SSID: </p><input type=\"text\" name=\"wlan_ssid\" class=\"config_content\" value=\"%WLAN_SSID%\"/></div>\n"
|
||||||
|
" <div class=\"config\"><p class=\"config_title\">PSK: </p><input type=\"password\" name=\"wlan_psk\" class=\"config_content\" value=\"%WLAN_PSK%\"/></div>\n"
|
||||||
|
" \n"
|
||||||
|
" <h3 class=\"subtitle\">MQTT</h3>\n"
|
||||||
|
" <div class=\"config\"><p class=\"config_title\">Host: </p><input type=\"text\" name=\"mqtt_host\" class=\"config_content\" value=\"%MQTT_HOST%\"/></div>\n"
|
||||||
|
" <div class=\"config\"><p class=\"config_title\">Port: </p><input type=\"number\" name=\"mqtt_port\" class=\"config_content\" value=\"%MQTT_PORT%\"/></div>\n"
|
||||||
|
" <div class=\"config\"><p class=\"config_title\">User: </p><input type=\"text\" name=\"mqtt_user\" class=\"config_content\" value=\"%MQTT_CREDENTIALS_USER%\"/></div>\n"
|
||||||
|
" <div class=\"config\"><p class=\"config_title\">Password: </p><input type=\"password\" name=\"mqtt_password\" class=\"config_content\" value=\"%MQTT_CREDENTIALS_PASSWORD%\"/></div>\n"
|
||||||
|
" \n"
|
||||||
|
" <h3 class=\"subtitle\">FabAccess</h3>\n"
|
||||||
|
" <div class=\"config\"><p class=\"config_title\">FabReaderID: </p><input type=\"number\" name=\"fabaccess_fabreaderid\" class=\"config_content\" value=\"%FABACCESS_FABREADERID%\"/></div>\n"
|
||||||
|
"\n"
|
||||||
|
" <button id=\"update_button\" type=\"submit\">Update Configuration</button>\n"
|
||||||
|
" </form>\n"
|
||||||
|
"</body>\n"
|
||||||
|
"</html>";
|
||||||
|
|
||||||
|
const char* WEBSITE_CSS = ""
|
||||||
|
"body\n"
|
||||||
|
"{\n"
|
||||||
|
" float: none;\n"
|
||||||
|
" margin: 0px;\n"
|
||||||
|
" font-family: sans-serif\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"#header\n"
|
||||||
|
"{\n"
|
||||||
|
" display: table;\n"
|
||||||
|
" background-color: #3c474d;\n"
|
||||||
|
" width: calc(100% - 20px);\n"
|
||||||
|
" padding: 10px;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"#header_title\n"
|
||||||
|
"{\n"
|
||||||
|
" display: table-cell;\n"
|
||||||
|
" vertical-align: middle;\n"
|
||||||
|
" color: #00d4aa;\n"
|
||||||
|
" text-align: start;\n"
|
||||||
|
" padding-right: 50px;\n"
|
||||||
|
" padding-left: 20px;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"#header_logo\n"
|
||||||
|
"{\n"
|
||||||
|
" display: table-cell;\n"
|
||||||
|
" height: 50px;\n"
|
||||||
|
" width: 50px;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
".title\n"
|
||||||
|
"{\n"
|
||||||
|
" padding-left: 10px;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
".subtitle\n"
|
||||||
|
"{\n"
|
||||||
|
" padding-left: 30px;\n"
|
||||||
|
" margin-bottom: 5px;\n"
|
||||||
|
"\n"
|
||||||
|
" font-weight: lighter;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
".config\n"
|
||||||
|
"{\n"
|
||||||
|
" display: table;\n"
|
||||||
|
" padding-left: 40px;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
".config_title\n"
|
||||||
|
"{\n"
|
||||||
|
" display: table-cell;\n"
|
||||||
|
" min-width: 120px;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
".config_content\n"
|
||||||
|
"{\n"
|
||||||
|
" display: table-cell;\n"
|
||||||
|
" margin-left: 10px;\n"
|
||||||
|
" min-width: 150px;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"#update_button\n"
|
||||||
|
"{\n"
|
||||||
|
" margin-top: 20px;\n"
|
||||||
|
" margin-left: 30px;\n"
|
||||||
|
" font-weight: bold;\n"
|
||||||
|
" min-width: 300px;\n"
|
||||||
|
" min-height: 30px;\n"
|
||||||
|
"}"
|
||||||
|
".download_link\n"
|
||||||
|
"{\n"
|
||||||
|
" padding-left: 30px;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
const char WEBSITE_SAVED[] = ""
|
||||||
|
"<!DOCTYPE html>\n"
|
||||||
|
"<html>\n"
|
||||||
|
"<head>\n"
|
||||||
|
" <meta charset=\"utf-8\">\n"
|
||||||
|
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
|
||||||
|
" <title>FabReader</title>\n"
|
||||||
|
" <style>\n"
|
||||||
|
" %STYLE%\n"
|
||||||
|
" </style>\n"
|
||||||
|
"</head>\n"
|
||||||
|
"<body>\n"
|
||||||
|
" <div id=\"header\">\n"
|
||||||
|
" <!--<img id=\"header_logo\" src=\"/logo.svg\"/>-->\n"
|
||||||
|
" <h1 id=\"header_title\">FabReader</h1>\n"
|
||||||
|
" </div>\n"
|
||||||
|
" <h2 class=\"title\">Updated</h2>\n"
|
||||||
|
" <p class=\"subtitle\">Configuration is updated.</p>\n"
|
||||||
|
" <p class=\"download_link\"><a href=\"/\">Go Back</a></p>\n"
|
||||||
|
" </body>\n"
|
||||||
|
"</html>";
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user