From 4d4b9bd988012b487b595d0bbb91ca6287a5ae5d Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:18 +0200
Subject: [PATCH 01/90] New translations en.json (Romanian)
---
data/ro_RO.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/ro_RO.json
diff --git a/data/ro_RO.json b/data/ro_RO.json
new file mode 100644
index 00000000..6c4269b8
--- /dev/null
+++ b/data/ro_RO.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Română",
+ "home": {
+ "title": "Meniu principal",
+ "btn": "Meniu principal",
+ "nav": "Acasă"
+ },
+ "save": "Salvarea setărilor",
+ "user": "Nume utilizator",
+ "pass": "Parola",
+ "hasp": {
+ "title": "Desenul ecranului",
+ "btn": "Desenul ecranului",
+ "theme": "Tema UI",
+ "color1": "Culoare primară",
+ "color2": "Culoare secundară",
+ "pages": "Layout inițial",
+ "font": "Font implicit",
+ "startpage": "Pagină inițială",
+ "startdim": "Luminozitatea"
+ },
+ "screenshot": {
+ "title": "Captură de ecran",
+ "btn": "Captură de ecran",
+ "nav": "Captură de ecran",
+ "prev": "Pagina anterioară",
+ "next": "Pagina următoare",
+ "refresh": "Reîmprospătare"
+ },
+ "info": {
+ "title": "Informații",
+ "btn": "Informații",
+ "nav": "Informații"
+ },
+ "config": {
+ "title": "Setări",
+ "btn": "Setări",
+ "nav": "Setări"
+ },
+ "ota": {
+ "title": "Actualizare Firmware",
+ "btn": "Actualizare Firmware",
+ "nav": "Firmware",
+ "submit": "Actualizarea firmware-ului",
+ "file": "Fișier firmware",
+ "url": "URL firmware",
+ "redirect": "Redirecționări",
+ "never": "Niciodată",
+ "strict": "Strict",
+ "always": "Mereu"
+ },
+ "editor": {
+ "title": "Browser de fișiere",
+ "btn": "Browser de fișiere",
+ "nav": "Browser de fișiere"
+ },
+ "reset": {
+ "title": "Resetare la parametri de fabrică",
+ "btn": "Resetare la parametri de fabrică",
+ "warning": "Avertizare",
+ "message": "Acest proces va reseta toate setările la valorile implicite. Flash intern va fi șters și dispozitivul este repornit. Este posibil să fie necesar să vă conectați la WiFi AP afișat pe panou pentru a reconfigura dispozitivul înainte de a-l accesa din nou.",
+ "fileloss": "TOATE FIȘIERELE VOR FI PIERDE!"
+ },
+ "reboot": {
+ "title": "Repornire...",
+ "btn": "Repornire",
+ "nav": "Repornire",
+ "message": "Dispozitivul se repornire."
+ },
+ "about": {
+ "credits": "Pe baza lucrărilor anterioare ale următorilor dezvoltatori open source:",
+ "copyright": "Drepturi de autor ",
+ "rights": "Toate drepturile rezervate.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "Licență MIT",
+ "bsd": "Licență BSD",
+ "freebsd": "Licență FreeBSD",
+ "apache2": "Licență Apache2"
+ },
+ "wifi": {
+ "title": "Setări WiFi",
+ "btn": "Setări WiFi",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "Setări MQTT",
+ "btn": "Setări MQTT",
+ "name": "Nume gazdă",
+ "group": "Nume grup",
+ "host": "Broker",
+ "port": "Poartă",
+ "node_t": "Subiect nod",
+ "group_t": "Subiect Grup",
+ "broadcast_t": "Subiect difuzare",
+ "hass_t": "Subiect HA LWT"
+ },
+ "http": {
+ "title": "Setări HTTP",
+ "btn": "Setări HTTP"
+ },
+ "ftp": {
+ "title": "Setări FTP",
+ "btn": "Setări FTP",
+ "port": "Port FTP",
+ "pasv": "Port Pasiv"
+ },
+ "gui": {
+ "title": "Setări ecran",
+ "btn": "Setări ecran",
+ "antiburn": "Anti-arsuri",
+ "calibrate": "Calibrare"
+ },
+ "gpio": "Setări GPIO",
+ "debug": {
+ "title": "Setări Depanare",
+ "btn": "Setări Depanare",
+ "baud": "Baudrate",
+ "tele": "Perioada Tele",
+ "ansi": "Utilizează codurile ANSI",
+ "host": "Server Syslog",
+ "port": "Poartă Syslog",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facilitate"
+ },
+ "time": {
+ "title": "Setări de timp",
+ "btn": "Setări de timp",
+ "region": "Regiune",
+ "zone": "Fus orar",
+ "tz": "Fus orar",
+ "ntp": "Servere NTP"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Continente ",
+ "af": "Africa ",
+ "as": "Asia ",
+ "au": "Australia ",
+ "aq": "Antarctica ",
+ "eu": "Europa ",
+ "na": "America de Nord ",
+ "sa": "America de Sud ",
+ "islands": "Insulele ",
+ "at": "Oceanul Atlantic ",
+ "in": "Oceanul Indian ",
+ "pa": "Oceanul Pacific "
+ }
+ }
+}
\ No newline at end of file
From 57f03e1f34472af7860d35b5c9ebe468c44b8197 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:18 +0200
Subject: [PATCH 02/90] New translations en.json (French)
---
data/fr_FR.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/fr_FR.json
diff --git a/data/fr_FR.json b/data/fr_FR.json
new file mode 100644
index 00000000..a6deaa8b
--- /dev/null
+++ b/data/fr_FR.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Français",
+ "home": {
+ "title": "Menu Principal",
+ "btn": "Menu Principal",
+ "nav": "Page d'accueil"
+ },
+ "save": "Enregistrer les Paramètres",
+ "user": "Nom d'utilisateur",
+ "pass": "Mot de Passe",
+ "hasp": {
+ "title": "Design HASP",
+ "btn": "Design HASP",
+ "theme": "Thème UI",
+ "color1": "Couleur Primaire",
+ "color2": "Couleur Secondaire",
+ "pages": "Mise en page",
+ "font": "Police par défaut",
+ "startpage": "Page de départ",
+ "startdim": "Luminosité"
+ },
+ "screenshot": {
+ "title": "Capture d'écran",
+ "btn": "Capture d'écran",
+ "nav": "Capture d'écran",
+ "prev": "Page Précédente",
+ "next": "Page Suivante",
+ "refresh": "Actualiser"
+ },
+ "info": {
+ "title": "Information",
+ "btn": "Information",
+ "nav": "Information"
+ },
+ "config": {
+ "title": "Configuration",
+ "btn": "Configuration",
+ "nav": "Paramètres"
+ },
+ "ota": {
+ "title": "Mise à jour du micrologiciel",
+ "btn": "Mise à jour du micrologiciel",
+ "nav": "Micrologiciel",
+ "submit": "Mettre à jour le firmware",
+ "file": "Fichier du Firmware",
+ "url": "URL du Firmware",
+ "redirect": "Suivre les redirections",
+ "never": "Jamais",
+ "strict": "Stricte",
+ "always": "Toujours"
+ },
+ "editor": {
+ "title": "Éditeur de fichiers",
+ "btn": "Éditeur de fichiers",
+ "nav": "Éditeur de fichiers"
+ },
+ "reset": {
+ "title": "Paramètres d'usine",
+ "btn": "Retour aux paramètres d'usine",
+ "warning": "Attention",
+ "message": "Ce processus va réinitialiser tous les paramètres aux valeurs par défaut. Le flash interne sera effacé et l'appareil sera redémarré. Il se peut que vous deviez vous connecter à l'AP WiFi affiché sur le panneau pour reconfigurer l'appareil avant d'y accéder.",
+ "fileloss": "TOUS LES FICHIERS SERONT PERDUS !"
+ },
+ "reboot": {
+ "title": "Redémarrage en cours...",
+ "btn": "Redémarrer",
+ "nav": "Redémarrer",
+ "message": "L'appareil est en cours de redémarrage."
+ },
+ "about": {
+ "credits": "Basé sur le travail précédent des développeurs Open Source suivants :",
+ "copyright": "Droits d’auteur ",
+ "rights": "Tous les droits sont réservés.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "Licence MIT",
+ "bsd": "Licence BSD",
+ "freebsd": "Licence FreeBSD",
+ "apache2": "Licence Apache2"
+ },
+ "wifi": {
+ "title": "Paramètres WiFi",
+ "btn": "Paramètres WiFi",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "Paramètres MQTT",
+ "btn": "Paramètres MQTT",
+ "name": "Nom d'hôte",
+ "group": "Groupe",
+ "host": "Broker",
+ "port": "Port",
+ "node_t": "Sujet du Node",
+ "group_t": "Sujet de Groupe",
+ "broadcast_t": "Sujet Broadcast",
+ "hass_t": "Sujet HA LWT"
+ },
+ "http": {
+ "title": "Paramètres HTTP",
+ "btn": "Paramètres HTTP"
+ },
+ "ftp": {
+ "title": "Paramètres FTP",
+ "btn": "Paramètres FTP",
+ "port": "Port FTP",
+ "pasv": "Port Passif"
+ },
+ "gui": {
+ "title": "Paramètres d'affichage",
+ "btn": "Paramètres d'affichage",
+ "antiburn": "Anti-brûlure",
+ "calibrate": "Calibrer"
+ },
+ "gpio": "Paramètres GPIO",
+ "debug": {
+ "title": "Paramètres de Débogage",
+ "btn": "Paramètres de Débogage",
+ "baud": "Baudrate",
+ "tele": "Période de Tele",
+ "ansi": "Utiliser les codes ANSI",
+ "host": "Serveur Syslog",
+ "port": "Port Syslog",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facility"
+ },
+ "time": {
+ "title": "Paramètres de l'heure",
+ "btn": "Paramètres de l'heure",
+ "region": "Région",
+ "zone": "Fuseau horaire",
+ "tz": "Fuseau horaire",
+ "ntp": "Serveurs NTP"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Continents ",
+ "af": "L'Afrique ",
+ "as": "L'Asie ",
+ "au": "L'Australie ",
+ "aq": "Antarctique ",
+ "eu": "L’Europe ",
+ "na": "L'Amérique du Nord ",
+ "sa": "L'Amérique du Sud ",
+ "islands": "Îles ",
+ "at": "L'océan Atlantique ",
+ "in": "L'océan Indien ",
+ "pa": "L'océan Pacifique "
+ }
+ }
+}
\ No newline at end of file
From 0f50710708d4aaa80fee469ff03f8c3d67168355 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:19 +0200
Subject: [PATCH 03/90] New translations en.json (Spanish)
---
data/es_ES.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/es_ES.json
diff --git a/data/es_ES.json b/data/es_ES.json
new file mode 100644
index 00000000..ba317b90
--- /dev/null
+++ b/data/es_ES.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Español",
+ "home": {
+ "title": "Menu Principal",
+ "btn": "Menu Principal",
+ "nav": "Inicio"
+ },
+ "save": "Guardar Configuración",
+ "user": "Usuario",
+ "pass": "Contraseña",
+ "hasp": {
+ "title": "Diseño de HASP",
+ "btn": "Diseño de HASP",
+ "theme": "Tema de IU",
+ "color1": "Color Primario",
+ "color2": "Color Secundario",
+ "pages": "Diseño inicial",
+ "font": "Fuente por Defecto",
+ "startpage": "Página inicial",
+ "startdim": "Brillo inicial"
+ },
+ "screenshot": {
+ "title": "Captura de pantalla",
+ "btn": "Captura de pantalla",
+ "nav": "Captura de pantalla",
+ "prev": "Página Previa",
+ "next": "Siguiente Página",
+ "refresh": "Refrescar"
+ },
+ "info": {
+ "title": "Información",
+ "btn": "Información",
+ "nav": "Información"
+ },
+ "config": {
+ "title": "Configuración",
+ "btn": "Configuración",
+ "nav": "Configuración"
+ },
+ "ota": {
+ "title": "Actualización de firmware",
+ "btn": "Actualización de firmware",
+ "nav": "Firmware",
+ "submit": "Actualizar Firmware",
+ "file": "Archivo Firmware",
+ "url": "URL del firmware",
+ "redirect": "Seguir redirecciones",
+ "never": "Nunca",
+ "strict": "Estricto",
+ "always": "Siempre"
+ },
+ "editor": {
+ "title": "Editor de Archivos",
+ "btn": "Editor de Archivos",
+ "nav": "Editor de Archivos"
+ },
+ "reset": {
+ "title": "Restaurar conf de fábrica",
+ "btn": "Restaurar conf de fábrica",
+ "warning": "Aviso",
+ "message": "Este proceso restablecerá todos los ajustes a los valores por defecto. El flash interno se borrará y el dispositivo se reiniciará. Puede que necesite conectarse al AP WiFi mostrado en el panel para reconfigurar el dispositivo antes de volver a acceder a él.",
+ "fileloss": "¡TODOS LOS ARCHIVOS SERÁN PERDIDOS!"
+ },
+ "reboot": {
+ "title": "Reiniciando...",
+ "btn": "Reiniciar",
+ "nav": "Reiniciar",
+ "message": "El dispositivo se está reiniciando."
+ },
+ "about": {
+ "credits": "Basado en el trabajo anterior de los siguientes desarrolladores de código abierto:",
+ "copyright": "Copyright ",
+ "rights": "Todos los derechos reservados.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "Licencia MIT",
+ "bsd": "Licencia BSD",
+ "freebsd": "Licencia FreeBSD",
+ "apache2": "Licencia Apache2"
+ },
+ "wifi": {
+ "title": "Ajustes Wifi",
+ "btn": "Ajustes Wifi",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "Ajustes MQTT",
+ "btn": "Ajustes MQTT",
+ "name": "Nombre de equipo",
+ "group": "Nombre del Grupo",
+ "host": "Broker",
+ "port": "Puerto",
+ "node_t": "Tema del Nodo",
+ "group_t": "Tema del Grupo",
+ "broadcast_t": "Tema de Broadcast",
+ "hass_t": "Tema HA LWT"
+ },
+ "http": {
+ "title": "Ajustes HTTP",
+ "btn": "Ajustes HTTP"
+ },
+ "ftp": {
+ "title": "Ajustes FTP",
+ "btn": "Ajustes FTP",
+ "port": "Puerto FTP",
+ "pasv": "Puerto Pasivo"
+ },
+ "gui": {
+ "title": "Ajustes de Pantalla",
+ "btn": "Ajustes de Pantalla",
+ "antiburn": "Anti-quemaduras",
+ "calibrate": "Calibrar"
+ },
+ "gpio": "Ajustes GPIO",
+ "debug": {
+ "title": "Ajustes de depuración",
+ "btn": "Ajustes de depuración",
+ "baud": "Baudios",
+ "tele": "Periodo de Tele",
+ "ansi": "Usar códigos ANSI",
+ "host": "Servidor Syslog",
+ "port": "Puerto Syslog",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facility"
+ },
+ "time": {
+ "title": "Ajustes de Tiempo",
+ "btn": "Ajustes de Tiempo",
+ "region": "Región",
+ "zone": "Zona horaria",
+ "tz": "Zona horaria",
+ "ntp": "Servidores NTP"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Continentes ",
+ "af": "Africa ",
+ "as": "Asia ",
+ "au": "Australia ",
+ "aq": "Antarctica ",
+ "eu": "Europa ",
+ "na": "América del Norte ",
+ "sa": "América del Sur ",
+ "islands": "Islas ",
+ "at": "Océano Atlántico ",
+ "in": "Océano Índico ",
+ "pa": "Océano Pacífico "
+ }
+ }
+}
\ No newline at end of file
From 0ae9bd02f630b4a575bf5d2cee21b34607d0461b Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:20 +0200
Subject: [PATCH 04/90] New translations en.json (German)
---
data/de_DE.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/de_DE.json
diff --git a/data/de_DE.json b/data/de_DE.json
new file mode 100644
index 00000000..d3f99e9e
--- /dev/null
+++ b/data/de_DE.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Deutsch",
+ "home": {
+ "title": "Hauptmenü",
+ "btn": "Hauptmenü",
+ "nav": "Startseite"
+ },
+ "save": "Einstellungen speichern",
+ "user": "Benutzername",
+ "pass": "Passwort",
+ "hasp": {
+ "title": "HASP-Design",
+ "btn": "HASP-Design",
+ "theme": "UI-Thema",
+ "color1": "Hauptfarbe",
+ "color2": "Sekundärfarbe",
+ "pages": "Start-Layout",
+ "font": "Standardschrift",
+ "startpage": "Startseite",
+ "startdim": "Starthelligkeit"
+ },
+ "screenshot": {
+ "title": "Bildschirmaufnahme",
+ "btn": "Bildschirmaufnahme",
+ "nav": "Bildschirmaufnahme",
+ "prev": "Vorherige Seite",
+ "next": "Nächste Seite",
+ "refresh": "Aktualisieren"
+ },
+ "info": {
+ "title": "Informationen",
+ "btn": "Informationen",
+ "nav": "Informationen"
+ },
+ "config": {
+ "title": "Konfiguration",
+ "btn": "Konfiguration",
+ "nav": "Konfiguration"
+ },
+ "ota": {
+ "title": "Firmware Update",
+ "btn": "Firmware Update",
+ "nav": "Firmware",
+ "submit": "Firmware aktualisieren",
+ "file": "Firmware-Datei",
+ "url": "Firmware-URL",
+ "redirect": "Umleitungen folgen",
+ "never": "Niemals",
+ "strict": "Strikt",
+ "always": "Immer"
+ },
+ "editor": {
+ "title": "Datei Editor",
+ "btn": "Datei Editor",
+ "nav": "Datei Editor"
+ },
+ "reset": {
+ "title": "Werkseinsetzung",
+ "btn": "Werkseinstellungen zurücksetzen",
+ "warning": "Warnung",
+ "message": "Dieser Prozess setzt alle Einstellungen auf die Standardwerte zurück. Der interne Blitz wird gelöscht und das Gerät wird neu gestartet. Möglicherweise müssen Sie eine Verbindung zu dem WiFi AP auf dem Panel herstellen, um das Gerät neu zu konfigurieren, bevor Sie auf es erneut zugreifen.",
+ "fileloss": "ALLE DATEIEN WERDEN GELÖSCHT!"
+ },
+ "reboot": {
+ "title": "Neustarten...",
+ "btn": "Neustarten",
+ "nav": "Neustart",
+ "message": "Das Gerät wird neu gestartet."
+ },
+ "about": {
+ "credits": "Basierend auf der bisherigen Arbeit der folgenden Open-Source-Entwickler:",
+ "copyright": "Urheberrechte ",
+ "rights": "Alle Rechte vorbehalten.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "MIT-Lizenz",
+ "bsd": "BSD-Lizenz",
+ "freebsd": "FreeBSD-Lizenz",
+ "apache2": "Apache2-Lizenz"
+ },
+ "wifi": {
+ "title": "WiFi-Einstellungen",
+ "btn": "WiFi-Einstellungen",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "MQTT-Einstellungen",
+ "btn": "MQTT-Einstellungen",
+ "name": "Hostname",
+ "group": "Gruppenname",
+ "host": "Broker",
+ "port": "Port",
+ "node_t": "Knoten-Thema",
+ "group_t": "Gruppen-Thema",
+ "broadcast_t": "Broadcast-Thema",
+ "hass_t": "HA LWT-Thema"
+ },
+ "http": {
+ "title": "HTTP-Einstellungen",
+ "btn": "HTTP-Einstellungen"
+ },
+ "ftp": {
+ "title": "FTP-Einstellungen",
+ "btn": "FTP-Einstellungen",
+ "port": "FTP-Port",
+ "pasv": "Passiver Port"
+ },
+ "gui": {
+ "title": "Bildschirmeinstellungen",
+ "btn": "Bildschirmeinstellungen",
+ "antiburn": "Anti-Burn",
+ "calibrate": "Kalibrieren"
+ },
+ "gpio": "GPIO-Einstellungen",
+ "debug": {
+ "title": "Debug-Einstellungen",
+ "btn": "Debug-Einstellungen",
+ "baud": "Baudrate",
+ "tele": "Tele-Periode",
+ "ansi": "ANSI-Codes verwenden",
+ "host": "Syslog-Server",
+ "port": "Syslog-Port",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facility"
+ },
+ "time": {
+ "title": "Zeit Einstellungen",
+ "btn": "Zeit Einstellungen",
+ "region": "Region",
+ "zone": "Zeitzone",
+ "tz": "Zeitzone",
+ "ntp": "NTP-Server"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Kontinenten ",
+ "af": "Afrika ",
+ "as": "Asien ",
+ "au": "Australien ",
+ "aq": "Antarctica ",
+ "eu": "Europa ",
+ "na": "Nordamerika ",
+ "sa": "Südamerika ",
+ "islands": "Inseln ",
+ "at": "Atlantischer Ozean ",
+ "in": "Indischer Ozean ",
+ "pa": "Pazifischer Ozean "
+ }
+ }
+}
\ No newline at end of file
From 6b9b66bc358b6c7e261eeec6a7a4fd5213136706 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:20 +0200
Subject: [PATCH 05/90] New translations en.json (Hungarian)
---
data/hu_HU.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/hu_HU.json
diff --git a/data/hu_HU.json b/data/hu_HU.json
new file mode 100644
index 00000000..9912460c
--- /dev/null
+++ b/data/hu_HU.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Magyar",
+ "home": {
+ "title": "Főmenü",
+ "btn": "Főmenü",
+ "nav": "Főoldal"
+ },
+ "save": "Beállítások mentése",
+ "user": "Felhasználónév",
+ "pass": "Jelszó",
+ "hasp": {
+ "title": "Képernyő dizájn",
+ "btn": "Képernyő dizájn",
+ "theme": "UI téma",
+ "color1": "Elsődleges szín",
+ "color2": "Szekunder szín",
+ "pages": "Start Layout",
+ "font": "Alapértelmezett font",
+ "startpage": "Startup Page",
+ "startdim": "Startup Dim"
+ },
+ "screenshot": {
+ "title": "Képernyőkép",
+ "btn": "Képernyőkép",
+ "nav": "Képernyőkép",
+ "prev": "Előző oldal",
+ "next": "Következő oldal",
+ "refresh": "Frissítés"
+ },
+ "info": {
+ "title": "Információk",
+ "btn": "Információk",
+ "nav": "Információk"
+ },
+ "config": {
+ "title": "Beállítások",
+ "btn": "Beállítások",
+ "nav": "Beállítások"
+ },
+ "ota": {
+ "title": "Firmware frissítés",
+ "btn": "Firmware frissítés",
+ "nav": "Firmware",
+ "submit": "Firmware frissítése",
+ "file": "Firmware fájl",
+ "url": "Firmware URL",
+ "redirect": "Átirányítások",
+ "never": "Soha",
+ "strict": "Szigorú",
+ "always": "Mindig"
+ },
+ "editor": {
+ "title": "Fájlkezelő",
+ "btn": "Fájlkezelő",
+ "nav": "Fájlkezelő"
+ },
+ "reset": {
+ "title": "Gyári beállítások visszaállítása",
+ "btn": "Gyári beállítások visszaállítása",
+ "warning": "Warning",
+ "message": "This process will reset all settings to the default values. The internal flash will be erased and the device is restarted. You may need to connect to the WiFi AP displayed on the panel to reconfigure the device before accessing it again.",
+ "fileloss": "ALL FILES WILL BE LOST!"
+ },
+ "reboot": {
+ "title": "Újraindítás...",
+ "btn": "Újraindítás",
+ "nav": "Újraindítás",
+ "message": "Az eszköz újraindul."
+ },
+ "about": {
+ "credits": "Az alábbi nyílt forráskódú fejlesztők korábbi munkája alapján:",
+ "copyright": "Copyright ",
+ "rights": "Minden jog fenntartva.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "MIT licenc",
+ "bsd": "BSD licenc",
+ "freebsd": "FreeBSD licenc",
+ "apache2": "Apache2 licenc"
+ },
+ "wifi": {
+ "title": "WiFi beállítások",
+ "btn": "WiFi beállítások",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "MQTT beállítások",
+ "btn": "MQTT beállítások",
+ "name": "Gazdagépnév",
+ "group": "Csoportnév",
+ "host": "Broker",
+ "port": "Port",
+ "node_t": "Node Topic",
+ "group_t": "Group Topic",
+ "broadcast_t": "Broadcast Topic",
+ "hass_t": "HA LWT Topic"
+ },
+ "http": {
+ "title": "HTTP beállítások",
+ "btn": "HTTP beállítások"
+ },
+ "ftp": {
+ "title": "FTP beállítások",
+ "btn": "FTP beállítások",
+ "port": "FTP Port",
+ "pasv": "Passzív Port"
+ },
+ "gui": {
+ "title": "Képernyő beállítások",
+ "btn": "Képernyő beállítások",
+ "antiburn": "Beégésvédelem futtatás",
+ "calibrate": "Kalibrálás"
+ },
+ "gpio": "GPIO beállítások",
+ "debug": {
+ "title": "Hibakeresési beállítások",
+ "btn": "Hibakeresési beállítások",
+ "baud": "Baudrate",
+ "tele": "Tele Period",
+ "ansi": "Use ANSI codes",
+ "host": "Syslog Server",
+ "port": "Syslog Port",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facility"
+ },
+ "time": {
+ "title": "Idő beállítások",
+ "btn": "Idő beállítások",
+ "region": "Régió",
+ "zone": "Időzóna",
+ "tz": "Időzóna",
+ "ntp": "NTP szerverek"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Kontinensek ",
+ "af": "Afrika ",
+ "as": "Ázsia ",
+ "au": "Ausztrália ",
+ "aq": "Antarktika ",
+ "eu": "Európa ",
+ "na": "Észak-Amerika ",
+ "sa": "Dél-Amerika ",
+ "islands": "Szigetek ",
+ "at": "Atlanti-óceán ",
+ "in": "Indiai-óceán ",
+ "pa": "Csendes-óceán "
+ }
+ }
+}
\ No newline at end of file
From 115f11da70f943c8ea0c3797640f01b98cf5762b Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:21 +0200
Subject: [PATCH 06/90] New translations en.json (Dutch)
---
data/nl_NL.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/nl_NL.json
diff --git a/data/nl_NL.json b/data/nl_NL.json
new file mode 100644
index 00000000..101c27b5
--- /dev/null
+++ b/data/nl_NL.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Nederlands",
+ "home": {
+ "title": "Hoofdmenu",
+ "btn": "Hoofdmenu",
+ "nav": "Hoofdpagina"
+ },
+ "save": "Instellingen Opslaan",
+ "user": "Gebruikersnaam",
+ "pass": "Wachtwoord",
+ "hasp": {
+ "title": "HASP Design",
+ "btn": "HASP Design",
+ "theme": "UI Thema",
+ "color1": "Primaire Kleur",
+ "color2": "Secundaire Kleur",
+ "pages": "Start Lay-out",
+ "font": "Standaard Lettertype",
+ "startpage": "Startpagina",
+ "startdim": "Start Helderheid"
+ },
+ "screenshot": {
+ "title": "Schermafdruk",
+ "btn": "Schermafdruk",
+ "nav": "Schermafdruk",
+ "prev": "Vorige Pagina",
+ "next": "Volgende Pagina",
+ "refresh": "Vernieuwen"
+ },
+ "info": {
+ "title": "Informatie",
+ "btn": "Informatie",
+ "nav": "Informatie"
+ },
+ "config": {
+ "title": "Instellingen",
+ "btn": "Instellingen",
+ "nav": "Instellingen"
+ },
+ "ota": {
+ "title": "Firmware Bijwerken",
+ "btn": "Firmware Bijwerken",
+ "nav": "Firmware",
+ "submit": "Firmware Bijwerken",
+ "file": "Firmware Bestand",
+ "url": "Firmware URL",
+ "redirect": "Volg Redirects",
+ "never": "Nooit",
+ "strict": "Strikt",
+ "always": "Altijd"
+ },
+ "editor": {
+ "title": "Bestands Editor",
+ "btn": "Bestands Editor",
+ "nav": "Bestands Editor"
+ },
+ "reset": {
+ "title": "Fabrieksinstellingen",
+ "btn": "Fabrieksinstellingen",
+ "warning": "Waarschuwing",
+ "message": "Dit proces zal alle instellingen terugzetten naar de standaardwaarden. De interne flash zal worden gewist en het apparaat wordt opnieuw gestart. U moet mogelijk verbinding maken met het Wifi AP die wordt weergegeven op het paneel om het apparaat opnieuw te configureren voordat u weer toegang krijgt.",
+ "fileloss": "ALLE BESTANDEN WORDEN VERWIJDERD!"
+ },
+ "reboot": {
+ "title": "Herstarten...",
+ "btn": "Herstarten",
+ "nav": "Herstart",
+ "message": "Het apparaat wordt herstart."
+ },
+ "about": {
+ "credits": "Gebaseerd op het eerdere werk van de volgende Open Source ontwikkelaars:",
+ "copyright": "Copyright ",
+ "rights": "Alle rechten voorbehouden.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "MIT Licentie",
+ "bsd": "BSD Licentie",
+ "freebsd": "FreeBSD Licentie",
+ "apache2": "Apache2 Licentie"
+ },
+ "wifi": {
+ "title": "Wifi Instellingen",
+ "btn": "Wifi Instellingen",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "MQTT Instellingen",
+ "btn": "MQTT Instellingen",
+ "name": "Hostnaam",
+ "group": "Groepsnaam",
+ "host": "Broker",
+ "port": "Poort",
+ "node_t": "Node Onderwerp",
+ "group_t": "Groep Onderwerp",
+ "broadcast_t": "Broadcast Onderwerp",
+ "hass_t": "HA LWT Onderwerp"
+ },
+ "http": {
+ "title": "HTTP Instellingen",
+ "btn": "HTTP Instellingen"
+ },
+ "ftp": {
+ "title": "FTP Instellingen",
+ "btn": "FTP Instellingen",
+ "port": "FTP Poort",
+ "pasv": "Passieve Poort"
+ },
+ "gui": {
+ "title": "Weergave Instellingen",
+ "btn": "Weergave Instellingen",
+ "antiburn": "Inbranden Voorkomen",
+ "calibrate": "Kalibreer"
+ },
+ "gpio": "GPIO Instellingen",
+ "debug": {
+ "title": "Debug Instellingen",
+ "btn": "Debug Instellingen",
+ "baud": "Baudrate",
+ "tele": "Tele Periode",
+ "ansi": "Gebruik ANSI-codes",
+ "host": "Syslog Server",
+ "port": "Syslog Poort",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Faciliteit"
+ },
+ "time": {
+ "title": "Tijd Instellingen",
+ "btn": "Tijd Instellingen",
+ "region": "Regio",
+ "zone": "Tijdzone",
+ "tz": "Tijdzone",
+ "ntp": "NTP Servers"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Continenten ",
+ "af": "Afrika ",
+ "as": "Azië ",
+ "au": "Australië ",
+ "aq": "Antarctica ",
+ "eu": "Europa ",
+ "na": "Noord-Amerika ",
+ "sa": "Zuid-Amerika ",
+ "islands": "Eilanden ",
+ "at": "Atlantische Oceaan ",
+ "in": "Indische Oceaan ",
+ "pa": "Stille Oceaan "
+ }
+ }
+}
\ No newline at end of file
From dd076ec34a310966c7b2c851dae465bd11b040c4 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:21 +0200
Subject: [PATCH 07/90] New translations en.json (Portuguese)
---
data/pt_PT.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/pt_PT.json
diff --git a/data/pt_PT.json b/data/pt_PT.json
new file mode 100644
index 00000000..a92b91a5
--- /dev/null
+++ b/data/pt_PT.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Português",
+ "home": {
+ "title": "Menu Principal",
+ "btn": "Menu Principal",
+ "nav": "Início"
+ },
+ "save": "Guardar Configuração",
+ "user": "Utilizador",
+ "pass": "Palavra-passe",
+ "hasp": {
+ "title": "Design do HASP",
+ "btn": "Design do HASP",
+ "theme": "Tema da IU",
+ "color1": "Cor Principal",
+ "color2": "Cor secundária",
+ "pages": "Layout inicial",
+ "font": "Fonte padrão",
+ "startpage": "Startup Page",
+ "startdim": "Startup Dim"
+ },
+ "screenshot": {
+ "title": "Screenshot",
+ "btn": "Screenshot",
+ "nav": "Screenshot",
+ "prev": "Página Anterior",
+ "next": "Página Seguinte",
+ "refresh": "Atualizar"
+ },
+ "info": {
+ "title": "Informação",
+ "btn": "Informação",
+ "nav": "Informação"
+ },
+ "config": {
+ "title": "Configuração",
+ "btn": "Configuração",
+ "nav": "Configuração"
+ },
+ "ota": {
+ "title": "Atualização do firmware",
+ "btn": "Atualização do firmware",
+ "nav": "Firmware",
+ "submit": "Atualizar o firmware",
+ "file": "Arquivo de Firmware",
+ "url": "URL do Firmware",
+ "redirect": "Seguir Redirecionamentos",
+ "never": "Nunca",
+ "strict": "Estrito",
+ "always": "Sempre"
+ },
+ "editor": {
+ "title": "Editor de ficheiros",
+ "btn": "Editor de ficheiros",
+ "nav": "Editor de ficheiros"
+ },
+ "reset": {
+ "title": "Repor configuração de fábrica",
+ "btn": "Repor configuração de fábrica",
+ "warning": "Aviso",
+ "message": "Este processo irá redefinir todas as configurações para os valores padrão. O flash interno será apagado e o dispositivo será reiniciado. Talvez seja necessário conectar-se ao WiFi AP exibido no painel para reconfigurar o dispositivo antes de acessá-lo novamente.",
+ "fileloss": "TODOS OS ARQUIVOS SERÃO PERDIDOS!"
+ },
+ "reboot": {
+ "title": "Reiniciando...",
+ "btn": "Reiniciar",
+ "nav": "Reiniciar",
+ "message": "O dispositivo está reiniciando."
+ },
+ "about": {
+ "credits": "Baseado no trabalho anterior dos seguintes desenvolvedores de código aberto:",
+ "copyright": "Copyright ",
+ "rights": "Todos os direitos reservados.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "Licença MIT",
+ "bsd": "Licença BSD",
+ "freebsd": "Licença FreeBSD",
+ "apache2": "Licença Apache2"
+ },
+ "wifi": {
+ "title": "Configurar Wifi",
+ "btn": "Configurar Wifi",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "Configurar MQTT",
+ "btn": "Configurar MQTT",
+ "name": "Nome do host",
+ "group": "Nome do Grupo",
+ "host": "Broker",
+ "port": "Porta",
+ "node_t": "Tópico do Node",
+ "group_t": "Tópico de Grupo",
+ "broadcast_t": "Tópico do Broadcast",
+ "hass_t": "Tópico HA LWT"
+ },
+ "http": {
+ "title": "Configurar HTTP",
+ "btn": "Configurar HTTP"
+ },
+ "ftp": {
+ "title": "Configurar FTP",
+ "btn": "Configurar FTP",
+ "port": "Porta de FTP",
+ "pasv": "Porta Passiva"
+ },
+ "gui": {
+ "title": "Configurar tela",
+ "btn": "Configurar tela",
+ "antiburn": "Anti-queimaduras",
+ "calibrate": "Calibrar"
+ },
+ "gpio": "Configurar MQTT",
+ "debug": {
+ "title": "Configurar debug",
+ "btn": "Configurar debug",
+ "baud": "Baudrate",
+ "tele": "Período Tele",
+ "ansi": "Usar códigos ANSI",
+ "host": "Servidor Syslog",
+ "port": "Porta Syslog",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facility"
+ },
+ "time": {
+ "title": "Configurar Hora",
+ "btn": "Configurar Hora",
+ "region": "Região",
+ "zone": "Fuso horário",
+ "tz": "Fuso horário",
+ "ntp": "Servidores NTP"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Continentes ",
+ "af": "África ",
+ "as": "Ásia ",
+ "au": "Austrália ",
+ "aq": "Antarctica ",
+ "eu": "Europa ",
+ "na": "América do Norte ",
+ "sa": "América do Sul ",
+ "islands": "Ilhas ",
+ "at": "Oceano Atlântico ",
+ "in": "Oceano Índico ",
+ "pa": "Oceano Pacífico "
+ }
+ }
+}
\ No newline at end of file
From 346e4f93f9e8408ad3b82badb7a119b63fc00825 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:22 +0200
Subject: [PATCH 08/90] New translations en.json (Portuguese, Brazilian)
---
data/pt_BR.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/pt_BR.json
diff --git a/data/pt_BR.json b/data/pt_BR.json
new file mode 100644
index 00000000..458b9ba5
--- /dev/null
+++ b/data/pt_BR.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Portuguese-Brazil",
+ "home": {
+ "title": "Menu Principal",
+ "btn": "Menu Principal",
+ "nav": "Início"
+ },
+ "save": "Guardar Configuração",
+ "user": "Usuário",
+ "pass": "Senha",
+ "hasp": {
+ "title": "Design do HASP",
+ "btn": "Design do HASP",
+ "theme": "Tema da IU",
+ "color1": "Cor principal",
+ "color2": "Cor secundária",
+ "pages": "Layout inicial",
+ "font": "Fonte padrão",
+ "startpage": "Startup Page",
+ "startdim": "Startup Dim"
+ },
+ "screenshot": {
+ "title": "Screenshot",
+ "btn": "Screenshot",
+ "nav": "Screenshot",
+ "prev": "Página Anterior",
+ "next": "Página Seguinte",
+ "refresh": "Atualizar"
+ },
+ "info": {
+ "title": "Informação",
+ "btn": "Informação",
+ "nav": "Informação"
+ },
+ "config": {
+ "title": "Configuração",
+ "btn": "Configuração",
+ "nav": "Configuração"
+ },
+ "ota": {
+ "title": "Atualização do firmware",
+ "btn": "Atualização do firmware",
+ "nav": "Firmware",
+ "submit": "Atualizar o firmware",
+ "file": "Arquivo de Firmware",
+ "url": "URL de Firmware",
+ "redirect": "Seguir redirecionamentos",
+ "never": "Nunca",
+ "strict": "Estrito",
+ "always": "Sempre"
+ },
+ "editor": {
+ "title": "Editor de ficheiros",
+ "btn": "Editor de ficheiros",
+ "nav": "Editor de ficheiros"
+ },
+ "reset": {
+ "title": "Repor configuração de fábrica",
+ "btn": "Repor configuração de fábrica",
+ "warning": "Aviso",
+ "message": "Este processo irá redefinir todas as configurações para os valores padrão. O flash interno será apagado e o dispositivo será reiniciado. Talvez seja necessário conectar-se ao WiFi AP exibido no painel para reconfigurar o dispositivo antes de acessá-lo novamente.",
+ "fileloss": "TODOS OS ARQUIVOS SERÃO PERDIDOS!"
+ },
+ "reboot": {
+ "title": "Reiniciando...",
+ "btn": "Reiniciar",
+ "nav": "Reiniciar",
+ "message": "Este dispositivo está reiniciando."
+ },
+ "about": {
+ "credits": "Com base no trabalho anterior dos seguintes desenvolvedores de código aberto:",
+ "copyright": "Direitos autorais ",
+ "rights": "Todos os direitos reservados.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "Licença MIT",
+ "bsd": "Licença BSD",
+ "freebsd": "Licença FreeBSD",
+ "apache2": "Licença Apache2"
+ },
+ "wifi": {
+ "title": "Configurar Wifi",
+ "btn": "Configurar Wifi",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "Configurar MQTT",
+ "btn": "Configurar MQTT",
+ "name": "Nome do host",
+ "group": "Nome do Grupo",
+ "host": "Broker",
+ "port": "Porta",
+ "node_t": "Tópico do Node",
+ "group_t": "Tópico do Grupo",
+ "broadcast_t": "Tópico do Broadcast",
+ "hass_t": "Tópico HA LWT"
+ },
+ "http": {
+ "title": "Configurar HTTP",
+ "btn": "Configurar HTTP"
+ },
+ "ftp": {
+ "title": "Configurar FTP",
+ "btn": "Configurar FTP",
+ "port": "Porta FTP",
+ "pasv": "Porta Passiva"
+ },
+ "gui": {
+ "title": "Configurar Tela",
+ "btn": "Configurar Tela",
+ "antiburn": "Anti-queimadura",
+ "calibrate": "Calibrar"
+ },
+ "gpio": "Configurar GPIO",
+ "debug": {
+ "title": "Configurar debug",
+ "btn": "Configurar debug",
+ "baud": "Baudrate",
+ "tele": "Período Tele",
+ "ansi": "Usar códigos ANSI",
+ "host": "Servidor Syslog",
+ "port": "Porta Syslog",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facility"
+ },
+ "time": {
+ "title": "Configurar hora",
+ "btn": "Configurar hora",
+ "region": "Região",
+ "zone": "Fuso horário",
+ "tz": "Fuso horário",
+ "ntp": "Servidores NTP"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Continentes ",
+ "af": "África ",
+ "as": "Ásia ",
+ "au": "Austrália ",
+ "aq": "Antarctica ",
+ "eu": "Europa ",
+ "na": "América do Norte ",
+ "sa": "América do Sul ",
+ "islands": "Ilhas ",
+ "at": "Oceano Atlântico ",
+ "in": "Oceano Índico ",
+ "pa": "Oceano Pacífico "
+ }
+ }
+}
\ No newline at end of file
From d3ab954f253598ea595efb12a74bdb4f7c19f2e1 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:23 +0200
Subject: [PATCH 09/90] New translations en_US.h (Romanian)
---
src/lang/ro_RO.h | 366 +++++++++++++++++++++++------------------------
1 file changed, 183 insertions(+), 183 deletions(-)
diff --git a/src/lang/ro_RO.h b/src/lang/ro_RO.h
index 03125f6d..37558021 100644
--- a/src/lang/ro_RO.h
+++ b/src/lang/ro_RO.h
@@ -1,232 +1,232 @@
-#ifndef HASP_LANG_RO_RO_H
-#define HASP_LANG_RO_RO_H
+#ifndef HASP_LANG_EN_US_H
+#define HASP_LANG_EN_US_H
-#define D_ISO_LANG_CODE "ro-RO"
+#define D_ISO_LANG_CODE "en-US"
-#define D_USERNAME "Nume utilizator:"
-#define D_PASSWORD "Parola:"
-#define D_SSID "SSID:"
-#define D_YES "Da"
-#define D_NO "Nu"
+#define D_USERNAME "Username:"
+#define D_PASSWORD "Password:"
+#define D_SSID "Ssid:"
+#define D_YES "Yes"
+#define D_NO "No"
-#define D_ERROR_OUT_OF_MEMORY "Memorie epuizată"
-#define D_ERROR_UNKNOWN "Eroare necunoscută"
+#define D_ERROR_OUT_OF_MEMORY "Out of memory"
+#define D_ERROR_UNKNOWN "Unkown error"
-#define D_CONFIG_NOT_CHANGED "Setările nu s-au schimbat"
-#define D_CONFIG_CHANGED "Setările s-au schimbat"
-#define D_CONFIG_LOADED "Setările s-au încărcat"
+#define D_CONFIG_NOT_CHANGED "Settings did not change"
+#define D_CONFIG_CHANGED "Settings changed"
+#define D_CONFIG_LOADED "Settings loaded"
-#define D_FILE_LOADING "Se încarcă %s"
-#define D_FILE_LOADED "S-a încărcat %s"
-#define D_FILE_LOAD_FAILED "Încărcarea %s a eșuat"
-#define D_FILE_SAVING "Se salvează %s"
-#define D_FILE_SAVED "S-a salvat %s"
-#define D_FILE_SAVE_FAILED "Salvarea %s a eșuat"
-#define D_FILE_NOT_FOUND "Lipsă fișier"
-#define D_FILE_SIZE_BYTES "baiți"
+#define D_FILE_LOADING "Loading %s"
+#define D_FILE_LOADED "Loaded %s"
+#define D_FILE_LOAD_FAILED "Failed to load %s"
+#define D_FILE_SAVING "Saving %s"
+#define D_FILE_SAVED "Saved %s"
+#define D_FILE_SAVE_FAILED "Failed to save %s"
+#define D_FILE_NOT_FOUND "File not found"
+#define D_FILE_SIZE_BYTES "bytes"
#define D_FILE_SIZE_KILOBYTES "KiB"
#define D_FILE_SIZE_MEGABYTES "MiB"
#define D_FILE_SIZE_GIGABYTES "GiB"
-#define D_FILE_SIZE_DIVIDER 1024
-#define D_DECIMAL_POINT ","
+#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
+#define D_DECIMAL_POINT "." // decimal comma or point
-#define D_SETTING_ENABLED "Activ"
-#define D_SETTING_DISABLED "Inactiv"
-#define D_SETTING_DEFAULT "Implicit"
+#define D_SERVICE_STARTING "Starting..."
+#define D_SERVICE_STARTED "Started"
+#define D_SERVICE_START_FAILED "Failed to start"
+#define D_SERVICE_STOPPED "Stopped"
+#define D_SERVICE_DISABLED "Disabled"
+#define D_SERVICE_CONNECTED "Connected"
+#define D_SERVICE_DISCONNECTED "Disconnected"
-#define D_SERVICE_STARTING "Pornire..."
-#define D_SERVICE_STARTED "Pornit"
-#define D_SERVICE_START_FAILED "Pornirea a eșuat"
-#define D_SERVICE_STOPPED "S-a oprit"
-#define D_SERVICE_DISABLED "Dezactivat"
-#define D_SERVICE_CONNECTED "Conectat"
-#define D_SERVICE_DISCONNECTED "Deconectat"
+#define D_SETTING_ENABLED "Enabled"
+#define D_SETTING_DISABLED "Disabled"
+#define D_SETTING_DEFAULT "Default"
-#define D_NETWORK_IP_ADDRESS_RECEIVED "A primit adresa IP %s"
+#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s"
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
-#define D_NETWORK_CONNECTION_FAILED "Conexiune eșuată"
-#define D_NETWORK_CONNECTION_UNAUTHORIZED "Autorizatia a esuat"
+#define D_NETWORK_CONNECTION_FAILED "Connection failed"
+#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
#define D_MQTT_DEFAULT_NAME "plate_%s"
-#define D_MQTT_CONNECTING "Conectare..."
-#define D_MQTT_CONNECTED "Conectat la serverul %s ca %s"
-#define D_MQTT_NOT_CONNECTED "Nu e conectat ???"
-#define D_MQTT_DISCONNECTING "Deconectare..."
-#define D_MQTT_DISCONNECTED "Deconectat"
-#define D_MQTT_RECONNECTING "Deconectat de la server, reconectare..."
-#define D_MQTT_NOT_CONFIGURED "Nu este configurat serverul MQTT"
-#define D_MQTT_STARTED "Început: %d octeți"
-#define D_MQTT_FAILED "A eșuat:"
-#define D_MQTT_INVALID_TOPIC "Mesajul are subiect nevalid"
-#define D_MQTT_SUBSCRIBED "Abonat la %s"
-#define D_MQTT_NOT_SUBSCRIBED "Abonarea la %s a eșuat"
-#define D_MQTT_HA_AUTO_DISCOVERY "Înregistrare la auto-descoperire în HA"
-#define D_MQTT_PAYLOAD_TOO_LONG "Payload prea lung (%u baiți)"
+#define D_MQTT_CONNECTING "Connecting..."
+#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s"
+#define D_MQTT_NOT_CONNECTED "Not connected ???"
+#define D_MQTT_DISCONNECTING "Disconnecting..."
+#define D_MQTT_DISCONNECTED "Disconnected"
+#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..."
+#define D_MQTT_NOT_CONFIGURED "Broker not configured"
+#define D_MQTT_STARTED "Started: %d bytes"
+#define D_MQTT_FAILED "Failed:"
+#define D_MQTT_INVALID_TOPIC "Message has invalid topic"
+#define D_MQTT_SUBSCRIBED "Subscribed to %s"
+#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s"
+#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery"
+#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)"
-#define D_TELNET_CLOSING_CONNECTION "Terminarea sesiunii de la %s"
-#define D_TELNET_CLIENT_LOGIN_FROM "Conectare client de la %s"
-#define D_TELNET_CLIENT_CONNECT_FROM "Client conectat de la %s"
-#define D_TELNET_CLIENT_NOT_CONNECTED "Clientul NU este conectat"
-#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Încercare incorectă de autentificare de la %s"
-#define D_TELNET_STARTED "Consola Telnet pornită"
-#define D_TELNET_FAILED "Nu s-a putut porni consola Telnet"
-#define D_TELNET_CLIENT_CONNECTED "Client conectat"
-#define D_TELNET_CLIENT_REJECTED "Client respins"
+#define D_TELNET_CLOSING_CONNECTION "Closing session from %s"
+#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
+#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
+#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
+#define D_TELNET_STARTED "Telnet console started"
+#define D_TELNET_FAILED "Failed to start telnet console"
+#define D_TELNET_CLIENT_CONNECTED "Client connected"
+#define D_TELNET_CLIENT_REJECTED "Client rejected"
-#define D_HASP_INVALID_PAGE "Pagina invalidă: %u"
-#define D_HASP_INVALID_LAYER "Nu se poate șterge stratul de sistem"
-#define D_HASP_CHANGE_PAGE "Schimbarea paginii: %u"
-#define D_HASP_CLEAR_PAGE "Ștergerea paginii: %u"
+#define D_HASP_INVALID_PAGE "Invalid page %u"
+#define D_HASP_INVALID_LAYER "Cannot clear system layer"
+#define D_HASP_CHANGE_PAGE "Changing page to %u"
+#define D_HASP_CLEAR_PAGE "Clearing page %u"
-#define D_OBJECT_DELETED "Obiect șters"
-#define D_OBJECT_UNKNOWN "Obiect necunoscut"
-#define D_OBJECT_MISMATCH "Obiectele NU se potrivesc!"
-#define D_OBJECT_LOST "Obiect pierdut!"
-#define D_OBJECT_CREATE_FAILED "Obiectul %u a eșuat"
-#define D_OBJECT_PAGE_UNKNOWN "ID-ul paginii %u nu este definit"
-#define D_OBJECT_EVENT_UNKNOWN "Eveniment necunoscut: %d"
+#define D_OBJECT_DELETED "Object deleted"
+#define D_OBJECT_UNKNOWN "Unknown object"
+#define D_OBJECT_MISMATCH "Objects DO NOT match!"
+#define D_OBJECT_LOST "Lost object!"
+#define D_OBJECT_CREATE_FAILED "Failed to create object id %u"
+#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined"
+#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d"
-#define D_ATTRIBUTE_UNKNOWN "Proprietate necunoscută: %s"
+#define D_ATTRIBUTE_UNKNOWN "Unknown property %s"
// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
-#define D_ATTRIBUTE_OBSOLETE "%s s-a scos din uz"
-#define D_ATTRIBUTE_INSTEAD ", folosiți %s"
-#define D_ATTRIBUTE_READ_ONLY "%s este numai în citire"
-#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Nu se poate apela %s pe o pagină"
-#define D_ATTRIBUTE_ALIGN_INVALID "Aliniere invalidă (align): %s"
-#define D_ATTRIBUTE_COLOR_INVALID "Culoare invalidă (color): %s"
+#define D_ATTRIBUTE_OBSOLETE "%s is obsolete"
+#define D_ATTRIBUTE_INSTEAD ", use %s instead"
+#define D_ATTRIBUTE_READ_ONLY "%s is read-only"
+#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page"
+#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s"
+#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s"
#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s"
-#define D_OOBE_SSID_VALIDATED "SSID %s validat"
-#define D_OOBE_AUTO_CALIBRATE "Calibrarea automată este activă"
-#define D_OOBE_CALIBRATED "Deja calibrat"
+#define D_OOBE_SSID_VALIDATED "SSID %s validated"
+#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled"
+#define D_OOBE_CALIBRATED "Already calibrated"
-#define D_DISPATCH_COMMAND_NOT_FOUND "Comanda %s nu a fost găsită"
-#define D_DISPATCH_INVALID_PAGE "Pagina invalidă %s"
-#define D_DISPATCH_REBOOT "MCU-ul repornește acum!"
+#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found"
+#define D_DISPATCH_INVALID_PAGE "Invalid page %s"
+#define D_DISPATCH_REBOOT "Rebooting the MCU now!"
-#define D_JSON_FAILED "Analiza JSON a eșuat:"
-#define D_JSONL_FAILED "Analiza JSONL a eșuat la linia %u"
-#define D_JSONL_SUCCEEDED "Analiza JSONL completă"
+#define D_JSON_FAILED "JSON parsing failed:"
+#define D_JSONL_FAILED "JSONL parsing failed at line %u"
+#define D_JSONL_SUCCEEDED "Jsonl fully parsed"
-#define D_OTA_CHECK_UPDATE "Verificare la URL-ul actualizărilor: %s"
-#define D_OTA_CHECK_COMPLETE "Verificarea actualizării a fost finalizată"
-#define D_OTA_CHECK_FAILED "Verificarea actualizării a eșuat: %s"
-#define D_OTA_UPDATE_FIRMWARE "Actualizare firmware prin OTA"
-#define D_OTA_UPDATE_COMPLETE "Actualizare prin OTA finalizată"
-#define D_OTA_UPDATE_APPLY "Aplicarea firmware-ului și repornire"
-#define D_OTA_UPDATE_FAILED "Actualizarea prin OTA a eșuat"
-#define D_OTA_UPDATING_FIRMWARE "Actualizare firmware..."
-#define D_OTA_UPDATING_FILESYSTEM "Actualizare sistem fișiere..."
+#define D_OTA_CHECK_UPDATE "Trying update URL: %s"
+#define D_OTA_CHECK_COMPLETE "Update check complete"
+#define D_OTA_CHECK_FAILED "Update check failed: %s"
+#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update"
+#define D_OTA_UPDATE_COMPLETE "OTA Update complete"
+#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot"
+#define D_OTA_UPDATE_FAILED "OTA Update failed"
+#define D_OTA_UPDATING_FIRMWARE "Updating firmware..."
+#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..."
-#define D_HTTP_HASP_DESIGN "Desenul ecranului"
-#define D_HTTP_INFORMATION "Informații"
-#define D_HTTP_HTTP_SETTINGS "Setări HTTP"
-#define D_HTTP_FTP_SETTINGS "Setări FTP"
-#define D_HTTP_WIFI_SETTINGS "Setări WiFi"
-#define D_HTTP_MQTT_SETTINGS "Setări MQTT"
-#define D_HTTP_GPIO_SETTINGS "Setări GPIO"
-#define D_HTTP_MDNS_SETTINGS "Setări mDNS"
-#define D_HTTP_TELNET_SETTINGS "Setări Telnet"
-#define D_HTTP_DEBUG_SETTINGS "Setări de depanare"
-#define D_HTTP_GUI_SETTINGS "Setări ecran"
-#define D_HTTP_SAVE_SETTINGS "Salvarea setărilor"
-#define D_HTTP_UPLOAD_FILE "Încărcare fișier"
-#define D_HTTP_ERASE_DEVICE "Resetarea tuturor setărilor"
-#define D_HTTP_ADD_GPIO "Adăugare pin"
-#define D_HTTP_BACK "Înapoi"
-#define D_HTTP_REFRESH "Reîmprospătare"
-#define D_HTTP_PREV_PAGE "Pagina anterioară"
-#define D_HTTP_NEXT_PAGE "Pagina următoare"
-#define D_HTTP_CALIBRATE "Calibrare"
-#define D_HTTP_ANTIBURN "Protecție ardere ecran"
-#define D_HTTP_SCREENSHOT "Captură de ecran"
-#define D_HTTP_FILE_BROWSER "Browser de fișiere"
-#define D_HTTP_FIRMWARE_UPGRADE "Actualizare firmware"
-#define D_HTTP_UPDATE_FIRMWARE "Actualizarea firmware-ului"
-#define D_HTTP_FACTORY_RESET "Resetare la parametri de fabrică"
-#define D_HTTP_MAIN_MENU "Meniu principal"
-#define D_HTTP_REBOOT "Repornire"
-#define D_HTTP_CONFIGURATION "Setări"
+#define D_HTTP_HASP_DESIGN "HASP Design"
+#define D_HTTP_INFORMATION "Information"
+#define D_HTTP_HTTP_SETTINGS "HTTP Settings"
+#define D_HTTP_FTP_SETTINGS "FTP Settings"
+#define D_HTTP_WIFI_SETTINGS "Wifi Settings"
+#define D_HTTP_MQTT_SETTINGS "MQTT Settings"
+#define D_HTTP_GPIO_SETTINGS "GPIO Settings"
+#define D_HTTP_MDNS_SETTINGS "mDNS Settings"
+#define D_HTTP_TELNET_SETTINGS "Telnet Settings"
+#define D_HTTP_DEBUG_SETTINGS "Debug Settings"
+#define D_HTTP_GUI_SETTINGS "Display Settings"
+#define D_HTTP_SAVE_SETTINGS "Save Settings"
+#define D_HTTP_UPLOAD_FILE "Upload File"
+#define D_HTTP_ERASE_DEVICE "Reset All Settings"
+#define D_HTTP_ADD_GPIO "Add New Pin"
+#define D_HTTP_BACK "Back"
+#define D_HTTP_REFRESH "Refresh"
+#define D_HTTP_PREV_PAGE "Prev Page"
+#define D_HTTP_NEXT_PAGE "Next Page"
+#define D_HTTP_CALIBRATE "Calibrate"
+#define D_HTTP_ANTIBURN "Run Anti Burn-in"
+#define D_HTTP_SCREENSHOT "Screenshot"
+#define D_HTTP_FILE_BROWSER "File Editor"
+#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade"
+#define D_HTTP_UPDATE_FIRMWARE "Update Firmware"
+#define D_HTTP_FACTORY_RESET "Factory Reset"
+#define D_HTTP_MAIN_MENU "Main Menu"
+#define D_HTTP_REBOOT "Restart"
+#define D_HTTP_CONFIGURATION "Configuration"
#define D_HTTP_CONFIG_CHANGED \
- "Configurația s-a modificat, pentru a se salva, este necesară repornirea dispozitivului."
-#define D_HTTP_SENDING_PAGE "Pagina %S trimisă la %s"
-#define D_HTTP_FOOTER "de Francis Van Roie"
+ "The configuration has changed, please click Restart to save changes to flash."
+#define D_HTTP_SENDING_PAGE "Sent %S page to %s"
+#define D_HTTP_FOOTER "by Francis Van Roie"
-#define D_INFO_VERSION "Versiune"
-#define D_INFO_BUILD_DATETIME "Data Build-ului"
-#define D_INFO_ENVIRONMENT "Mediu"
+#define D_INFO_VERSION "Version"
+#define D_INFO_BUILD_DATETIME "Build DateTime"
+#define D_INFO_ENVIRONMENT "Environment"
#define D_INFO_UPTIME "Uptime"
-#define D_INFO_FREE_HEAP "Heap liber"
-#define D_INFO_FREE_BLOCK "Bloc liber"
-#define D_INFO_DEVICE_MEMORY "Memorie dispozitiv"
-#define D_INFO_LVGL_MEMORY "Memorie LVGL"
+#define D_INFO_FREE_HEAP "Free Heap"
+#define D_INFO_FREE_BLOCK "Free Block"
+#define D_INFO_DEVICE_MEMORY "Device Memory"
+#define D_INFO_LVGL_MEMORY "LVGL Memory"
#define D_INFO_TOTAL_MEMORY "Total"
-#define D_INFO_FREE_MEMORY "Liber"
-#define D_INFO_FRAGMENTATION "Fragmentație"
-#define D_INFO_PSRAM_FREE "PSRam liber"
-#define D_INFO_PSRAM_SIZE "PSRam mărime"
-#define D_INFO_FLASH_SIZE "Flash mărime"
-#define D_INFO_SKETCH_USED "Mărime program folosită"
-#define D_INFO_SKETCH_FREE "Mărime program liberă"
+#define D_INFO_FREE_MEMORY "Free"
+#define D_INFO_FRAGMENTATION "Fragmentation"
+#define D_INFO_PSRAM_FREE "PSRam Free"
+#define D_INFO_PSRAM_SIZE "PSRam Size"
+#define D_INFO_FLASH_SIZE "Flash Size"
+#define D_INFO_SKETCH_USED "Program Size Used"
+#define D_INFO_SKETCH_FREE "Program Size Free"
#define D_INFO_FS_SIZE "Filesystem Size"
#define D_INFO_FS_USED "Filesystem Used"
#define D_INFO_FS_FREE "Filesystem Free"
-#define D_INFO_MODULE "Modul"
+#define D_INFO_MODULE "Module"
#define D_INFO_MODEL "Model"
-#define D_INFO_FREQUENCY "Frecvență"
-#define D_INFO_CORE_VERSION "Versiune Core"
-#define D_INFO_RESET_REASON "Motiv reset"
-#define D_INFO_STATUS "Stare"
+#define D_INFO_FREQUENCY "Frequency"
+#define D_INFO_CORE_VERSION "Core Version"
+#define D_INFO_RESET_REASON "Reset Reason"
+#define D_INFO_STATUS "Status"
#define D_INFO_SERVER "Server"
-#define D_INFO_USERNAME "Utilizatur"
-#define D_INFO_CLIENTID "ID Client"
-// #define D_INFO_CONNECTED "Conectat"
-// #define D_INFO_DISCONNECTED "Deconectat"
-#define D_INFO_RECEIVED "Primite"
-#define D_INFO_PUBLISHED "Trimise"
-#define D_INFO_FAILED "Eșuate"
+#define D_INFO_USERNAME "Username"
+#define D_INFO_CLIENTID "Client ID"
+// #define D_INFO_CONNECTED "Connected"
+// #define D_INFO_DISCONNECTED "Disconnected"
+#define D_INFO_RECEIVED "Received"
+#define D_INFO_PUBLISHED "Published"
+#define D_INFO_FAILED "Failed"
#define D_INFO_ETHERNET "Ethernet"
-#define D_INFO_WIFI "WiFi"
-#define D_INFO_LINK_SPEED "Viteză Link"
-#define D_INFO_FULL_DUPLEX "Duplexitate completă"
+#define D_INFO_WIFI "Wifi"
+#define D_INFO_LINK_SPEED "Link Speed"
+#define D_INFO_FULL_DUPLEX "Full Duplex"
#define D_INFO_BSSID "BSSID"
#define D_INFO_SSID "SSID"
-#define D_INFO_RSSI "Putere semnal"
-#define D_INFO_IP_ADDRESS "Addresa IP"
-#define D_INFO_MAC_ADDRESS "Addresa MAC"
+#define D_INFO_RSSI "Signal Strength"
+#define D_INFO_IP_ADDRESS "IP Address"
+#define D_INFO_MAC_ADDRESS "MAC Address"
#define D_INFO_GATEWAY "Gateway"
-#define D_INFO_DNS_SERVER "Server DNS"
+#define D_INFO_DNS_SERVER "DNS Server"
-#define D_OOBE_MSG "Atingeți ecranul pentru a configura WiFi sau conectați-vă la acest punct de acces:"
-#define D_OOBE_SCAN_TO_CONNECT "Scanați pentru a vă conecta:"
+#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:"
+#define D_OOBE_SCAN_TO_CONNECT "Scan to connect"
-#define D_WIFI_CONNECTING_TO "Conectare la %s"
-#define D_WIFI_CONNECTED_TO "Conectat la %s, cerere IP..."
-#define D_WIFI_RSSI_EXCELLENT "Excelentă"
-#define D_WIFI_RSSI_GOOD "Bună"
-#define D_WIFI_RSSI_FAIR "Acceptabilă"
-#define D_WIFI_RSSI_WEAK "Slabă"
-#define D_WIFI_RSSI_BAD "Foarte slabă"
+#define D_WIFI_CONNECTING_TO "Connecting to %s"
+#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..."
+#define D_WIFI_RSSI_EXCELLENT "Excellent"
+#define D_WIFI_RSSI_GOOD "Good"
+#define D_WIFI_RSSI_FAIR "Fair"
+#define D_WIFI_RSSI_WEAK "Weak"
+#define D_WIFI_RSSI_BAD "Very bad"
// new
-#define D_GPIO_SWITCH "Întrerupător"
-#define D_GPIO_BUTTON "Buton"
-#define D_GPIO_TOUCH "Atingere capacitivă"
+#define D_GPIO_SWITCH "Switch"
+#define D_GPIO_BUTTON "Push Button"
+#define D_GPIO_TOUCH "Capacitive Touch"
#define D_GPIO_LED "Led"
-#define D_GPIO_LED_R "Ramă Roșu"
-#define D_GPIO_LED_G "Ramă Verde"
-#define D_GPIO_LED_B "Ramă Albastru"
-#define D_GPIO_POWER_RELAY "Releu general"
-#define D_GPIO_LIGHT_RELAY "Releu iluminare"
+#define D_GPIO_LED_R "Mood Red"
+#define D_GPIO_LED_G "Mood Green"
+#define D_GPIO_LED_B "Mood Blue"
+#define D_GPIO_POWER_RELAY "Power Relay"
+#define D_GPIO_LIGHT_RELAY "Light Relay"
#define D_GPIO_PWM "PWM"
#define D_GPIO_DAC "DAC"
-#define D_GPIO_SERIAL_DIMMER "Dimer Serial"
-#define D_GPIO_UNKNOWN "Necunoscut"
+#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
+#define D_GPIO_UNKNOWN "Unknown"
#define D_GPIO_PIN "Pin"
-#define D_GPIO_GROUP "Grup"
-#define D_GPIO_GROUP_NONE "Nimic"
+#define D_GPIO_GROUP "Group"
+#define D_GPIO_GROUP_NONE "None"
#define D_GPIO_STATE_NORMAL "Normal"
-#define D_GPIO_STATE_INVERTED "Invertat"
+#define D_GPIO_STATE_INVERTED "Inverted"
-#endif
+#endif
\ No newline at end of file
From 8c5bd749f373498fde8bf83541b236f4018d0be6 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:23 +0200
Subject: [PATCH 10/90] New translations en_US.h (French)
---
src/lang/fr_FR.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/fr_FR.h b/src/lang/fr_FR.h
index a29d520b..66416a90 100644
--- a/src/lang/fr_FR.h
+++ b/src/lang/fr_FR.h
@@ -150,7 +150,6 @@
#define D_HTTP_CONFIGURATION "Configuration"
#define D_HTTP_CONFIG_CHANGED \
"La configuration a changé, cliquez sur Redémarrer pour enregistrer les modifications dans " \
- "le flash."
#define D_HTTP_SENDING_PAGE "La page %S envoyée à %s"
#define D_HTTP_FOOTER "par Francis Van Roie"
@@ -210,6 +209,7 @@
#define D_WIFI_RSSI_WEAK "Faible"
#define D_WIFI_RSSI_BAD "Très mauvais"
+// new
#define D_GPIO_SWITCH "Interrupteur"
#define D_GPIO_BUTTON "Bouton"
#define D_GPIO_TOUCH "Touche Capacitive"
From d8b5e4537c50b1c7264009bbd52d7cd7ef22e008 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:24 +0200
Subject: [PATCH 11/90] New translations en_US.h (Spanish)
---
src/lang/es_ES.h | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/lang/es_ES.h b/src/lang/es_ES.h
index 1892ee9f..f5699a68 100644
--- a/src/lang/es_ES.h
+++ b/src/lang/es_ES.h
@@ -67,11 +67,11 @@
#define D_TELNET_CLOSING_CONNECTION "Cerrando sesión de %s"
#define D_TELNET_CLIENT_LOGIN_FROM "Se ha firmado el cliente %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Se ha conectado el cliente %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Cliente NO conectado"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Intento de conexión incorrecta desde %s"
#define D_TELNET_STARTED "Console Telnet arrancada"
#define D_TELNET_FAILED "Falló el arranque de la consola Telnet"
#define D_TELNET_CLIENT_CONNECTED "Cliente conectado"
-#define D_TELNET_CLIENT_NOT_CONNECTED "Cliente NO conectado"
#define D_TELNET_CLIENT_REJECTED "Cliente rechazado"
#define D_HASP_INVALID_PAGE "Página inválida %u"
@@ -150,7 +150,6 @@
#define D_HTTP_CONFIGURATION "Configuración"
#define D_HTTP_CONFIG_CHANGED \
"La configuración ha cambiado, haga clic en Reiniciar para guardar los cambios en la " \
- "memoria flash."
#define D_HTTP_SENDING_PAGE "Se envió pagina %S a %s"
#define D_HTTP_FOOTER "por Francis Van Roie"
From 1a5a3fc966f6da274eff35ccd719c091981399f8 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:25 +0200
Subject: [PATCH 12/90] New translations en_US.h (German)
---
src/lang/de_DE.h | 232 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 232 insertions(+)
create mode 100644 src/lang/de_DE.h
diff --git a/src/lang/de_DE.h b/src/lang/de_DE.h
new file mode 100644
index 00000000..37558021
--- /dev/null
+++ b/src/lang/de_DE.h
@@ -0,0 +1,232 @@
+#ifndef HASP_LANG_EN_US_H
+#define HASP_LANG_EN_US_H
+
+#define D_ISO_LANG_CODE "en-US"
+
+#define D_USERNAME "Username:"
+#define D_PASSWORD "Password:"
+#define D_SSID "Ssid:"
+#define D_YES "Yes"
+#define D_NO "No"
+
+#define D_ERROR_OUT_OF_MEMORY "Out of memory"
+#define D_ERROR_UNKNOWN "Unkown error"
+
+#define D_CONFIG_NOT_CHANGED "Settings did not change"
+#define D_CONFIG_CHANGED "Settings changed"
+#define D_CONFIG_LOADED "Settings loaded"
+
+#define D_FILE_LOADING "Loading %s"
+#define D_FILE_LOADED "Loaded %s"
+#define D_FILE_LOAD_FAILED "Failed to load %s"
+#define D_FILE_SAVING "Saving %s"
+#define D_FILE_SAVED "Saved %s"
+#define D_FILE_SAVE_FAILED "Failed to save %s"
+#define D_FILE_NOT_FOUND "File not found"
+#define D_FILE_SIZE_BYTES "bytes"
+#define D_FILE_SIZE_KILOBYTES "KiB"
+#define D_FILE_SIZE_MEGABYTES "MiB"
+#define D_FILE_SIZE_GIGABYTES "GiB"
+#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
+#define D_DECIMAL_POINT "." // decimal comma or point
+
+#define D_SERVICE_STARTING "Starting..."
+#define D_SERVICE_STARTED "Started"
+#define D_SERVICE_START_FAILED "Failed to start"
+#define D_SERVICE_STOPPED "Stopped"
+#define D_SERVICE_DISABLED "Disabled"
+#define D_SERVICE_CONNECTED "Connected"
+#define D_SERVICE_DISCONNECTED "Disconnected"
+
+#define D_SETTING_ENABLED "Enabled"
+#define D_SETTING_DISABLED "Disabled"
+#define D_SETTING_DEFAULT "Default"
+
+#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s"
+#define D_NETWORK_ONLINE "online"
+#define D_NETWORK_OFFLINE "offline"
+#define D_NETWORK_CONNECTION_FAILED "Connection failed"
+#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
+
+#define D_MQTT_DEFAULT_NAME "plate_%s"
+#define D_MQTT_CONNECTING "Connecting..."
+#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s"
+#define D_MQTT_NOT_CONNECTED "Not connected ???"
+#define D_MQTT_DISCONNECTING "Disconnecting..."
+#define D_MQTT_DISCONNECTED "Disconnected"
+#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..."
+#define D_MQTT_NOT_CONFIGURED "Broker not configured"
+#define D_MQTT_STARTED "Started: %d bytes"
+#define D_MQTT_FAILED "Failed:"
+#define D_MQTT_INVALID_TOPIC "Message has invalid topic"
+#define D_MQTT_SUBSCRIBED "Subscribed to %s"
+#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s"
+#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery"
+#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)"
+
+#define D_TELNET_CLOSING_CONNECTION "Closing session from %s"
+#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
+#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
+#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
+#define D_TELNET_STARTED "Telnet console started"
+#define D_TELNET_FAILED "Failed to start telnet console"
+#define D_TELNET_CLIENT_CONNECTED "Client connected"
+#define D_TELNET_CLIENT_REJECTED "Client rejected"
+
+#define D_HASP_INVALID_PAGE "Invalid page %u"
+#define D_HASP_INVALID_LAYER "Cannot clear system layer"
+#define D_HASP_CHANGE_PAGE "Changing page to %u"
+#define D_HASP_CLEAR_PAGE "Clearing page %u"
+
+#define D_OBJECT_DELETED "Object deleted"
+#define D_OBJECT_UNKNOWN "Unknown object"
+#define D_OBJECT_MISMATCH "Objects DO NOT match!"
+#define D_OBJECT_LOST "Lost object!"
+#define D_OBJECT_CREATE_FAILED "Failed to create object id %u"
+#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined"
+#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d"
+
+#define D_ATTRIBUTE_UNKNOWN "Unknown property %s"
+// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
+#define D_ATTRIBUTE_OBSOLETE "%s is obsolete"
+#define D_ATTRIBUTE_INSTEAD ", use %s instead"
+#define D_ATTRIBUTE_READ_ONLY "%s is read-only"
+#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page"
+#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s"
+#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s"
+#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s"
+
+#define D_OOBE_SSID_VALIDATED "SSID %s validated"
+#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled"
+#define D_OOBE_CALIBRATED "Already calibrated"
+
+#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found"
+#define D_DISPATCH_INVALID_PAGE "Invalid page %s"
+#define D_DISPATCH_REBOOT "Rebooting the MCU now!"
+
+#define D_JSON_FAILED "JSON parsing failed:"
+#define D_JSONL_FAILED "JSONL parsing failed at line %u"
+#define D_JSONL_SUCCEEDED "Jsonl fully parsed"
+
+#define D_OTA_CHECK_UPDATE "Trying update URL: %s"
+#define D_OTA_CHECK_COMPLETE "Update check complete"
+#define D_OTA_CHECK_FAILED "Update check failed: %s"
+#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update"
+#define D_OTA_UPDATE_COMPLETE "OTA Update complete"
+#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot"
+#define D_OTA_UPDATE_FAILED "OTA Update failed"
+#define D_OTA_UPDATING_FIRMWARE "Updating firmware..."
+#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..."
+
+#define D_HTTP_HASP_DESIGN "HASP Design"
+#define D_HTTP_INFORMATION "Information"
+#define D_HTTP_HTTP_SETTINGS "HTTP Settings"
+#define D_HTTP_FTP_SETTINGS "FTP Settings"
+#define D_HTTP_WIFI_SETTINGS "Wifi Settings"
+#define D_HTTP_MQTT_SETTINGS "MQTT Settings"
+#define D_HTTP_GPIO_SETTINGS "GPIO Settings"
+#define D_HTTP_MDNS_SETTINGS "mDNS Settings"
+#define D_HTTP_TELNET_SETTINGS "Telnet Settings"
+#define D_HTTP_DEBUG_SETTINGS "Debug Settings"
+#define D_HTTP_GUI_SETTINGS "Display Settings"
+#define D_HTTP_SAVE_SETTINGS "Save Settings"
+#define D_HTTP_UPLOAD_FILE "Upload File"
+#define D_HTTP_ERASE_DEVICE "Reset All Settings"
+#define D_HTTP_ADD_GPIO "Add New Pin"
+#define D_HTTP_BACK "Back"
+#define D_HTTP_REFRESH "Refresh"
+#define D_HTTP_PREV_PAGE "Prev Page"
+#define D_HTTP_NEXT_PAGE "Next Page"
+#define D_HTTP_CALIBRATE "Calibrate"
+#define D_HTTP_ANTIBURN "Run Anti Burn-in"
+#define D_HTTP_SCREENSHOT "Screenshot"
+#define D_HTTP_FILE_BROWSER "File Editor"
+#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade"
+#define D_HTTP_UPDATE_FIRMWARE "Update Firmware"
+#define D_HTTP_FACTORY_RESET "Factory Reset"
+#define D_HTTP_MAIN_MENU "Main Menu"
+#define D_HTTP_REBOOT "Restart"
+#define D_HTTP_CONFIGURATION "Configuration"
+#define D_HTTP_CONFIG_CHANGED \
+ "The configuration has changed, please click Restart to save changes to flash."
+#define D_HTTP_SENDING_PAGE "Sent %S page to %s"
+#define D_HTTP_FOOTER "by Francis Van Roie"
+
+#define D_INFO_VERSION "Version"
+#define D_INFO_BUILD_DATETIME "Build DateTime"
+#define D_INFO_ENVIRONMENT "Environment"
+#define D_INFO_UPTIME "Uptime"
+#define D_INFO_FREE_HEAP "Free Heap"
+#define D_INFO_FREE_BLOCK "Free Block"
+#define D_INFO_DEVICE_MEMORY "Device Memory"
+#define D_INFO_LVGL_MEMORY "LVGL Memory"
+#define D_INFO_TOTAL_MEMORY "Total"
+#define D_INFO_FREE_MEMORY "Free"
+#define D_INFO_FRAGMENTATION "Fragmentation"
+#define D_INFO_PSRAM_FREE "PSRam Free"
+#define D_INFO_PSRAM_SIZE "PSRam Size"
+#define D_INFO_FLASH_SIZE "Flash Size"
+#define D_INFO_SKETCH_USED "Program Size Used"
+#define D_INFO_SKETCH_FREE "Program Size Free"
+#define D_INFO_FS_SIZE "Filesystem Size"
+#define D_INFO_FS_USED "Filesystem Used"
+#define D_INFO_FS_FREE "Filesystem Free"
+#define D_INFO_MODULE "Module"
+#define D_INFO_MODEL "Model"
+#define D_INFO_FREQUENCY "Frequency"
+#define D_INFO_CORE_VERSION "Core Version"
+#define D_INFO_RESET_REASON "Reset Reason"
+#define D_INFO_STATUS "Status"
+#define D_INFO_SERVER "Server"
+#define D_INFO_USERNAME "Username"
+#define D_INFO_CLIENTID "Client ID"
+// #define D_INFO_CONNECTED "Connected"
+// #define D_INFO_DISCONNECTED "Disconnected"
+#define D_INFO_RECEIVED "Received"
+#define D_INFO_PUBLISHED "Published"
+#define D_INFO_FAILED "Failed"
+#define D_INFO_ETHERNET "Ethernet"
+#define D_INFO_WIFI "Wifi"
+#define D_INFO_LINK_SPEED "Link Speed"
+#define D_INFO_FULL_DUPLEX "Full Duplex"
+#define D_INFO_BSSID "BSSID"
+#define D_INFO_SSID "SSID"
+#define D_INFO_RSSI "Signal Strength"
+#define D_INFO_IP_ADDRESS "IP Address"
+#define D_INFO_MAC_ADDRESS "MAC Address"
+#define D_INFO_GATEWAY "Gateway"
+#define D_INFO_DNS_SERVER "DNS Server"
+
+#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:"
+#define D_OOBE_SCAN_TO_CONNECT "Scan to connect"
+
+#define D_WIFI_CONNECTING_TO "Connecting to %s"
+#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..."
+#define D_WIFI_RSSI_EXCELLENT "Excellent"
+#define D_WIFI_RSSI_GOOD "Good"
+#define D_WIFI_RSSI_FAIR "Fair"
+#define D_WIFI_RSSI_WEAK "Weak"
+#define D_WIFI_RSSI_BAD "Very bad"
+
+// new
+#define D_GPIO_SWITCH "Switch"
+#define D_GPIO_BUTTON "Push Button"
+#define D_GPIO_TOUCH "Capacitive Touch"
+#define D_GPIO_LED "Led"
+#define D_GPIO_LED_R "Mood Red"
+#define D_GPIO_LED_G "Mood Green"
+#define D_GPIO_LED_B "Mood Blue"
+#define D_GPIO_POWER_RELAY "Power Relay"
+#define D_GPIO_LIGHT_RELAY "Light Relay"
+#define D_GPIO_PWM "PWM"
+#define D_GPIO_DAC "DAC"
+#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
+#define D_GPIO_UNKNOWN "Unknown"
+#define D_GPIO_PIN "Pin"
+#define D_GPIO_GROUP "Group"
+#define D_GPIO_GROUP_NONE "None"
+#define D_GPIO_STATE_NORMAL "Normal"
+#define D_GPIO_STATE_INVERTED "Inverted"
+
+#endif
\ No newline at end of file
From 23cb1e03e5ae2250aed140127d2cc362a991db13 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:25 +0200
Subject: [PATCH 13/90] New translations en_US.h (Hungarian)
---
src/lang/hu_HU.h | 377 ++++++++++++++++++++++++-----------------------
1 file changed, 189 insertions(+), 188 deletions(-)
diff --git a/src/lang/hu_HU.h b/src/lang/hu_HU.h
index b617a64c..37558021 100644
--- a/src/lang/hu_HU.h
+++ b/src/lang/hu_HU.h
@@ -1,231 +1,232 @@
-#ifndef HASP_LANG_HU_HU_H
-#define HASP_LANG_HU_HU_H
+#ifndef HASP_LANG_EN_US_H
+#define HASP_LANG_EN_US_H
-#define D_ISO_LANG_CODE "hu-HU"
+#define D_ISO_LANG_CODE "en-US"
-#define D_USERNAME "Felhasználónév:"
-#define D_PASSWORD "Jelszó:"
-#define D_SSID "SSID:"
-#define D_YES "Igen"
-#define D_NO "Nem"
+#define D_USERNAME "Username:"
+#define D_PASSWORD "Password:"
+#define D_SSID "Ssid:"
+#define D_YES "Yes"
+#define D_NO "No"
-#define D_ERROR_OUT_OF_MEMORY "Elfogyott a memória"
-#define D_ERROR_UNKNOWN "Ismeretlen hiba"
+#define D_ERROR_OUT_OF_MEMORY "Out of memory"
+#define D_ERROR_UNKNOWN "Unkown error"
-#define D_CONFIG_NOT_CHANGED "A beállítások nem változtak"
-#define D_CONFIG_CHANGED "A beállítások megváltoztak"
-#define D_CONFIG_LOADED "Beállítások betöltve"
+#define D_CONFIG_NOT_CHANGED "Settings did not change"
+#define D_CONFIG_CHANGED "Settings changed"
+#define D_CONFIG_LOADED "Settings loaded"
-#define D_FILE_LOADING "%s betöltése"
-#define D_FILE_LOADED "%s betöltve"
-#define D_FILE_LOAD_FAILED "%s betöltése nem sikerült"
-#define D_FILE_NOT_FOUND "Fájl nem található"
-#define D_FILE_SAVING "%s mentése"
-#define D_FILE_SAVED "%s mentve"
-#define D_FILE_SAVE_FAILED "%s mentése meghiúsult"
-#define D_FILE_SIZE_BYTES "bájt"
+#define D_FILE_LOADING "Loading %s"
+#define D_FILE_LOADED "Loaded %s"
+#define D_FILE_LOAD_FAILED "Failed to load %s"
+#define D_FILE_SAVING "Saving %s"
+#define D_FILE_SAVED "Saved %s"
+#define D_FILE_SAVE_FAILED "Failed to save %s"
+#define D_FILE_NOT_FOUND "File not found"
+#define D_FILE_SIZE_BYTES "bytes"
#define D_FILE_SIZE_KILOBYTES "KiB"
#define D_FILE_SIZE_MEGABYTES "MiB"
#define D_FILE_SIZE_GIGABYTES "GiB"
-#define D_FILE_SIZE_DIVIDER 1024
-#define D_DECIMAL_POINT ","
+#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
+#define D_DECIMAL_POINT "." // decimal comma or point
-#define D_SERVICE_STARTING "Indítás..."
-#define D_SERVICE_STARTED "Elindítva"
-#define D_SERVICE_START_FAILED "Az indítás meghiúsult"
-#define D_SERVICE_STOPPED "Megállva"
-#define D_SERVICE_DISABLED "Tiltva"
-#define D_SERVICE_CONNECTED "Csatlakoztatva"
-#define D_SERVICE_DISCONNECTED "Szétkapcsolva"
+#define D_SERVICE_STARTING "Starting..."
+#define D_SERVICE_STARTED "Started"
+#define D_SERVICE_START_FAILED "Failed to start"
+#define D_SERVICE_STOPPED "Stopped"
+#define D_SERVICE_DISABLED "Disabled"
+#define D_SERVICE_CONNECTED "Connected"
+#define D_SERVICE_DISCONNECTED "Disconnected"
-#define D_SETTING_ENABLED "Engedélyezve"
-#define D_SETTING_DISABLED "Letiltva"
-#define D_SETTING_DEFAULT "Alapértelmezett"
+#define D_SETTING_ENABLED "Enabled"
+#define D_SETTING_DISABLED "Disabled"
+#define D_SETTING_DEFAULT "Default"
-#define D_NETWORK_IP_ADDRESS_RECEIVED "Beállított IP-cím: %s"
+#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s"
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
-#define D_NETWORK_CONNECTION_FAILED "A kapcsolódás meghiúsult"
-#define D_NETWORK_CONNECTION_UNAUTHORIZED "A hitelesítés sikertelen"
+#define D_NETWORK_CONNECTION_FAILED "Connection failed"
+#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
#define D_MQTT_DEFAULT_NAME "plate_%s"
-#define D_MQTT_CONNECTING "Csatlakozás..."
-#define D_MQTT_CONNECTED "Csatlakozva a %s szerverhez mint %s"
-#define D_MQTT_NOT_CONNECTED "Nincs kapcsolat ???"
-#define D_MQTT_DISCONNECTING "Szétkapcsolás..."
-#define D_MQTT_DISCONNECTED "Szétkapcsolva"
-#define D_MQTT_RECONNECTING "Lekapcsolva a szerverről, újracsatlakozás..."
-#define D_MQTT_NOT_CONFIGURED "Nincs konfigurálva MQTT szerver"
-#define D_MQTT_STARTED "Elindítva: %d bájt"
-#define D_MQTT_FAILED "Nem sikerült:"
-#define D_MQTT_INVALID_TOPIC "Az üzenet érvénytelen topik-ot tartalmaz"
-#define D_MQTT_SUBSCRIBED "Feliratkozva: %s"
-#define D_MQTT_NOT_SUBSCRIBED "Nem sikerült feliratkozni: %s"
-#define D_MQTT_HA_AUTO_DISCOVERY "Regisztrálás HA automatikus felfedezésre"
-#define D_MQTT_PAYLOAD_TOO_LONG "Túl hosszú payload (%u bájt)"
+#define D_MQTT_CONNECTING "Connecting..."
+#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s"
+#define D_MQTT_NOT_CONNECTED "Not connected ???"
+#define D_MQTT_DISCONNECTING "Disconnecting..."
+#define D_MQTT_DISCONNECTED "Disconnected"
+#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..."
+#define D_MQTT_NOT_CONFIGURED "Broker not configured"
+#define D_MQTT_STARTED "Started: %d bytes"
+#define D_MQTT_FAILED "Failed:"
+#define D_MQTT_INVALID_TOPIC "Message has invalid topic"
+#define D_MQTT_SUBSCRIBED "Subscribed to %s"
+#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s"
+#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery"
+#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)"
-#define D_TELNET_CLOSING_CONNECTION "Munkamenet befejezése %s-el"
-#define D_TELNET_CLIENT_LOGIN_FROM "Kliens bejelentkezés innen: %s"
-#define D_TELNET_CLIENT_CONNECT_FROM "Kliens csatlakozva innen: %s"
-#define D_TELNET_CLIENT_NOT_CONNECTED "Kliens NEM csatlakozik"
-#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Helytelen bejelentkezési kísérlet %s-ről"
-#define D_TELNET_STARTED "Telnet konzol elindítva"
-#define D_TELNET_FAILED "Telnet konzol elindítása meghiúsult"
-#define D_TELNET_CLIENT_CONNECTED "Kliens csatlakozva"
-#define D_TELNET_CLIENT_REJECTED "Kliens elutasítva"
+#define D_TELNET_CLOSING_CONNECTION "Closing session from %s"
+#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
+#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
+#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
+#define D_TELNET_STARTED "Telnet console started"
+#define D_TELNET_FAILED "Failed to start telnet console"
+#define D_TELNET_CLIENT_CONNECTED "Client connected"
+#define D_TELNET_CLIENT_REJECTED "Client rejected"
-#define D_HASP_INVALID_PAGE "Érvénytelen oldal: %u"
-#define D_HASP_INVALID_LAYER "Nem törölhető a rendszerréteg"
-#define D_HASP_CHANGE_PAGE "Oldalváltás: %u"
-#define D_HASP_CLEAR_PAGE "Oldal törlése: %u"
+#define D_HASP_INVALID_PAGE "Invalid page %u"
+#define D_HASP_INVALID_LAYER "Cannot clear system layer"
+#define D_HASP_CHANGE_PAGE "Changing page to %u"
+#define D_HASP_CLEAR_PAGE "Clearing page %u"
-#define D_OBJECT_DELETED "Objektum törölve"
-#define D_OBJECT_UNKNOWN "Ismeretlen objektum"
-#define D_OBJECT_MISMATCH "Az objektumok NEM passzolnak!"
-#define D_OBJECT_LOST "Elveszett objektum!"
-#define D_OBJECT_CREATE_FAILED "%u objektum sikertelen"
-#define D_OBJECT_PAGE_UNKNOWN "%u oldalazonosító nincs meghatározva"
-#define D_OBJECT_EVENT_UNKNOWN "Ismeretlen esemény %d"
+#define D_OBJECT_DELETED "Object deleted"
+#define D_OBJECT_UNKNOWN "Unknown object"
+#define D_OBJECT_MISMATCH "Objects DO NOT match!"
+#define D_OBJECT_LOST "Lost object!"
+#define D_OBJECT_CREATE_FAILED "Failed to create object id %u"
+#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined"
+#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d"
-#define D_ATTRIBUTE_UNKNOWN "Ismeretlen tulajdonság: %s"
+#define D_ATTRIBUTE_UNKNOWN "Unknown property %s"
// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
-#define D_ATTRIBUTE_OBSOLETE "%s elavult"
-#define D_ATTRIBUTE_INSTEAD ", helyette %s-t kell használni"
-#define D_ATTRIBUTE_READ_ONLY "%s csak olvasható"
-#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Nem lehet meghívni %s-t egy oldalon"
-#define D_ATTRIBUTE_ALIGN_INVALID "Helytelen elrendezés (align): %s"
-#define D_ATTRIBUTE_COLOR_INVALID "Helytelen szín (color): %s"
-#define D_ATTRIBUTE_LONG_MODE_INVALID "Helytelen long mód: %s"
+#define D_ATTRIBUTE_OBSOLETE "%s is obsolete"
+#define D_ATTRIBUTE_INSTEAD ", use %s instead"
+#define D_ATTRIBUTE_READ_ONLY "%s is read-only"
+#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page"
+#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s"
+#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s"
+#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s"
-#define D_OOBE_SSID_VALIDATED "%s SSID érvényes"
-#define D_OOBE_AUTO_CALIBRATE "Automatikus kalibrálás engedélyezve"
-#define D_OOBE_CALIBRATED "Korábban kalibrálva"
+#define D_OOBE_SSID_VALIDATED "SSID %s validated"
+#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled"
+#define D_OOBE_CALIBRATED "Already calibrated"
-#define D_DISPATCH_COMMAND_NOT_FOUND "%s parancs nem található"
-#define D_DISPATCH_INVALID_PAGE "Érvénytelen oldal: %s"
-#define D_DISPATCH_REBOOT "Az MCU most újraindul!"
+#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found"
+#define D_DISPATCH_INVALID_PAGE "Invalid page %s"
+#define D_DISPATCH_REBOOT "Rebooting the MCU now!"
-#define D_JSON_FAILED "JSON elemzése nem sikerült:"
-#define D_JSONL_FAILED "JSONL elemzése meghiúsult a %u vonalnál"
-#define D_JSONL_SUCCEEDED "JSONL teljes körűen elemezve"
+#define D_JSON_FAILED "JSON parsing failed:"
+#define D_JSONL_FAILED "JSONL parsing failed at line %u"
+#define D_JSONL_SUCCEEDED "Jsonl fully parsed"
-#define D_OTA_CHECK_UPDATE "A frissítések ellenőrzése az URL-en: %s"
-#define D_OTA_CHECK_COMPLETE "A frissítések ellenőrzése befejeződött"
-#define D_OTA_CHECK_FAILED "A frissítések ellenőrzése meghiúsult: %s"
-#define D_OTA_UPDATE_FIRMWARE "Firmware frissítése OTA-val"
-#define D_OTA_UPDATE_COMPLETE "Az OTA frissítés elkészült"
-#define D_OTA_UPDATE_APPLY "Firmware alkalmazása és újraindítás"
-#define D_OTA_UPDATE_FAILED "Az OTA frissítés meghiúsult"
-#define D_OTA_UPDATING_FIRMWARE "Firmware frissítés..."
-#define D_OTA_UPDATING_FILESYSTEM "Fájlrendszer frissítés..."
+#define D_OTA_CHECK_UPDATE "Trying update URL: %s"
+#define D_OTA_CHECK_COMPLETE "Update check complete"
+#define D_OTA_CHECK_FAILED "Update check failed: %s"
+#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update"
+#define D_OTA_UPDATE_COMPLETE "OTA Update complete"
+#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot"
+#define D_OTA_UPDATE_FAILED "OTA Update failed"
+#define D_OTA_UPDATING_FIRMWARE "Updating firmware..."
+#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..."
-#define D_HTTP_HASP_DESIGN "Képernyő dizájn"
-#define D_HTTP_INFORMATION "Információk"
-#define D_HTTP_HTTP_SETTINGS "HTTP beállítások"
-#define D_HTTP_FTP_SETTINGS "FTP beállítások"
-#define D_HTTP_WIFI_SETTINGS "WiFi beállítások"
-#define D_HTTP_MQTT_SETTINGS "MQTT beállítások"
-#define D_HTTP_GPIO_SETTINGS "GPIO beállítások"
-#define D_HTTP_MDNS_SETTINGS "mDNS beállítások"
-#define D_HTTP_TELNET_SETTINGS "Telnet beállítások"
-#define D_HTTP_DEBUG_SETTINGS "Hibakeresési beállítások"
-#define D_HTTP_GUI_SETTINGS "Képernyő beállítások"
-#define D_HTTP_SAVE_SETTINGS "Beállítások mentése"
-#define D_HTTP_UPLOAD_FILE "Fájl feltöltése"
-#define D_HTTP_ERASE_DEVICE "Minden beállítás visszaállítása"
-#define D_HTTP_ADD_GPIO "Új pin hozzáadása"
-#define D_HTTP_BACK "Vissza"
-#define D_HTTP_REFRESH "Frissítés"
-#define D_HTTP_PREV_PAGE "Előző oldal"
-#define D_HTTP_NEXT_PAGE "Következő oldal"
-#define D_HTTP_CALIBRATE "Kalibrálás"
-#define D_HTTP_ANTIBURN "Beégésvédelem futtatás"
-#define D_HTTP_SCREENSHOT "Képernyőkép"
-#define D_HTTP_FILE_BROWSER "Fájlkezelő"
-#define D_HTTP_FIRMWARE_UPGRADE "Firmware frissítés"
-#define D_HTTP_UPDATE_FIRMWARE "Firmware frissítése"
-#define D_HTTP_FACTORY_RESET "Gyári beállítások visszaállítása"
-#define D_HTTP_MAIN_MENU "Főmenü"
-#define D_HTTP_REBOOT "Újraindítás"
-#define D_HTTP_CONFIGURATION "Beállítások"
+#define D_HTTP_HASP_DESIGN "HASP Design"
+#define D_HTTP_INFORMATION "Information"
+#define D_HTTP_HTTP_SETTINGS "HTTP Settings"
+#define D_HTTP_FTP_SETTINGS "FTP Settings"
+#define D_HTTP_WIFI_SETTINGS "Wifi Settings"
+#define D_HTTP_MQTT_SETTINGS "MQTT Settings"
+#define D_HTTP_GPIO_SETTINGS "GPIO Settings"
+#define D_HTTP_MDNS_SETTINGS "mDNS Settings"
+#define D_HTTP_TELNET_SETTINGS "Telnet Settings"
+#define D_HTTP_DEBUG_SETTINGS "Debug Settings"
+#define D_HTTP_GUI_SETTINGS "Display Settings"
+#define D_HTTP_SAVE_SETTINGS "Save Settings"
+#define D_HTTP_UPLOAD_FILE "Upload File"
+#define D_HTTP_ERASE_DEVICE "Reset All Settings"
+#define D_HTTP_ADD_GPIO "Add New Pin"
+#define D_HTTP_BACK "Back"
+#define D_HTTP_REFRESH "Refresh"
+#define D_HTTP_PREV_PAGE "Prev Page"
+#define D_HTTP_NEXT_PAGE "Next Page"
+#define D_HTTP_CALIBRATE "Calibrate"
+#define D_HTTP_ANTIBURN "Run Anti Burn-in"
+#define D_HTTP_SCREENSHOT "Screenshot"
+#define D_HTTP_FILE_BROWSER "File Editor"
+#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade"
+#define D_HTTP_UPDATE_FIRMWARE "Update Firmware"
+#define D_HTTP_FACTORY_RESET "Factory Reset"
+#define D_HTTP_MAIN_MENU "Main Menu"
+#define D_HTTP_REBOOT "Restart"
+#define D_HTTP_CONFIGURATION "Configuration"
#define D_HTTP_CONFIG_CHANGED \
- "A konfiguráció meg lett változtatva. Indítson újra a beállítások mentéséhez!"
-#define D_HTTP_SENDING_PAGE "%S oldal küldése %s-re"
-#define D_HTTP_FOOTER "készítette: Francis Van Roie"
+ "The configuration has changed, please click Restart to save changes to flash."
+#define D_HTTP_SENDING_PAGE "Sent %S page to %s"
+#define D_HTTP_FOOTER "by Francis Van Roie"
-#define D_INFO_VERSION "Verziószám"
-#define D_INFO_BUILD_DATETIME "Build időpontja"
-#define D_INFO_ENVIRONMENT "Környezet"
+#define D_INFO_VERSION "Version"
+#define D_INFO_BUILD_DATETIME "Build DateTime"
+#define D_INFO_ENVIRONMENT "Environment"
#define D_INFO_UPTIME "Uptime"
-#define D_INFO_FREE_HEAP "Szabad Heap"
-#define D_INFO_FREE_BLOCK "Szabad Blokk"
-#define D_INFO_DEVICE_MEMORY "Eszköz Memória"
-#define D_INFO_LVGL_MEMORY "LVGL Memória"
-#define D_INFO_TOTAL_MEMORY "Összesen"
-#define D_INFO_FREE_MEMORY "Szabad"
-#define D_INFO_FRAGMENTATION "Fragmentáció"
-#define D_INFO_PSRAM_FREE "PSRam szabad"
-#define D_INFO_PSRAM_SIZE "PSRam méret"
-#define D_INFO_FLASH_SIZE "Flash méret"
-#define D_INFO_SKETCH_USED "Program használatban"
-#define D_INFO_SKETCH_FREE "Program szabad"
+#define D_INFO_FREE_HEAP "Free Heap"
+#define D_INFO_FREE_BLOCK "Free Block"
+#define D_INFO_DEVICE_MEMORY "Device Memory"
+#define D_INFO_LVGL_MEMORY "LVGL Memory"
+#define D_INFO_TOTAL_MEMORY "Total"
+#define D_INFO_FREE_MEMORY "Free"
+#define D_INFO_FRAGMENTATION "Fragmentation"
+#define D_INFO_PSRAM_FREE "PSRam Free"
+#define D_INFO_PSRAM_SIZE "PSRam Size"
+#define D_INFO_FLASH_SIZE "Flash Size"
+#define D_INFO_SKETCH_USED "Program Size Used"
+#define D_INFO_SKETCH_FREE "Program Size Free"
#define D_INFO_FS_SIZE "Filesystem Size"
#define D_INFO_FS_USED "Filesystem Used"
#define D_INFO_FS_FREE "Filesystem Free"
-#define D_INFO_MODULE "Modul"
-#define D_INFO_MODEL "Modell"
-#define D_INFO_FREQUENCY "Frekvencia"
-#define D_INFO_CORE_VERSION "Core Verzió"
-#define D_INFO_RESET_REASON "Újraindulás oka"
-#define D_INFO_STATUS "Státusz"
-#define D_INFO_SERVER "Szerver"
-#define D_INFO_USERNAME "Felhasználónév"
-#define D_INFO_CLIENTID "Kliens ID"
-// #define D_INFO_CONNECTED "Csatlakoztatva"
-// #define D_INFO_DISCONNECTED "Szétkapcsolva"
-#define D_INFO_RECEIVED "Fogadott"
-#define D_INFO_PUBLISHED "Küldött"
-#define D_INFO_FAILED "Sikertelen"
+#define D_INFO_MODULE "Module"
+#define D_INFO_MODEL "Model"
+#define D_INFO_FREQUENCY "Frequency"
+#define D_INFO_CORE_VERSION "Core Version"
+#define D_INFO_RESET_REASON "Reset Reason"
+#define D_INFO_STATUS "Status"
+#define D_INFO_SERVER "Server"
+#define D_INFO_USERNAME "Username"
+#define D_INFO_CLIENTID "Client ID"
+// #define D_INFO_CONNECTED "Connected"
+// #define D_INFO_DISCONNECTED "Disconnected"
+#define D_INFO_RECEIVED "Received"
+#define D_INFO_PUBLISHED "Published"
+#define D_INFO_FAILED "Failed"
#define D_INFO_ETHERNET "Ethernet"
-#define D_INFO_WIFI "WiFi"
-#define D_INFO_LINK_SPEED "Linksebesség"
+#define D_INFO_WIFI "Wifi"
+#define D_INFO_LINK_SPEED "Link Speed"
#define D_INFO_FULL_DUPLEX "Full Duplex"
#define D_INFO_BSSID "BSSID"
#define D_INFO_SSID "SSID"
-#define D_INFO_RSSI "Jelerősség"
-#define D_INFO_IP_ADDRESS "IP cím"
-#define D_INFO_MAC_ADDRESS "MAC cím"
-#define D_INFO_GATEWAY "Átjáró"
-#define D_INFO_DNS_SERVER "DNS szerver"
+#define D_INFO_RSSI "Signal Strength"
+#define D_INFO_IP_ADDRESS "IP Address"
+#define D_INFO_MAC_ADDRESS "MAC Address"
+#define D_INFO_GATEWAY "Gateway"
+#define D_INFO_DNS_SERVER "DNS Server"
-#define D_OOBE_MSG "Koppintson a képernyőre a WiFi beállításához, vagy csatlakozzon az alábbi Access Point-hoz:"
-#define D_OOBE_SCAN_TO_CONNECT "Szkennelje le a csatlakozáshoz:"
+#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:"
+#define D_OOBE_SCAN_TO_CONNECT "Scan to connect"
-#define D_WIFI_CONNECTING_TO "Csatlakozás %s-hez"
-#define D_WIFI_CONNECTED_TO "Csatlakozva %s-hez, IP cím kérése..."
-#define D_WIFI_RSSI_EXCELLENT "Kiváló"
-#define D_WIFI_RSSI_GOOD "Jó"
-#define D_WIFI_RSSI_FAIR "Elfogadható"
-#define D_WIFI_RSSI_WEAK "Gyenge"
-#define D_WIFI_RSSI_BAD "Rossz"
+#define D_WIFI_CONNECTING_TO "Connecting to %s"
+#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..."
+#define D_WIFI_RSSI_EXCELLENT "Excellent"
+#define D_WIFI_RSSI_GOOD "Good"
+#define D_WIFI_RSSI_FAIR "Fair"
+#define D_WIFI_RSSI_WEAK "Weak"
+#define D_WIFI_RSSI_BAD "Very bad"
-#define D_GPIO_SWITCH "Kapcsoló"
-#define D_GPIO_BUTTON "Nyomógomb"
-#define D_GPIO_TOUCH "Kapacitív érintő"
+// new
+#define D_GPIO_SWITCH "Switch"
+#define D_GPIO_BUTTON "Push Button"
+#define D_GPIO_TOUCH "Capacitive Touch"
#define D_GPIO_LED "Led"
-#define D_GPIO_LED_R "Keret Piros"
-#define D_GPIO_LED_G "Keret Zöld"
-#define D_GPIO_LED_B "Keret Kék"
-#define D_GPIO_POWER_RELAY "Általános relé"
-#define D_GPIO_LIGHT_RELAY "Lámpa relé"
+#define D_GPIO_LED_R "Mood Red"
+#define D_GPIO_LED_G "Mood Green"
+#define D_GPIO_LED_B "Mood Blue"
+#define D_GPIO_POWER_RELAY "Power Relay"
+#define D_GPIO_LIGHT_RELAY "Light Relay"
#define D_GPIO_PWM "PWM"
#define D_GPIO_DAC "DAC"
-#define D_GPIO_SERIAL_DIMMER "Soros Dimmer"
-#define D_GPIO_UNKNOWN "Ismeretlen"
+#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
+#define D_GPIO_UNKNOWN "Unknown"
#define D_GPIO_PIN "Pin"
-#define D_GPIO_GROUP "Csoport"
-#define D_GPIO_GROUP_NONE "Nincs"
-#define D_GPIO_STATE_NORMAL "Normál"
-#define D_GPIO_STATE_INVERTED "Invertált"
+#define D_GPIO_GROUP "Group"
+#define D_GPIO_GROUP_NONE "None"
+#define D_GPIO_STATE_NORMAL "Normal"
+#define D_GPIO_STATE_INVERTED "Inverted"
-#endif
+#endif
\ No newline at end of file
From 38679100d548a5138660701ed11106c42ebb7cc8 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:26 +0200
Subject: [PATCH 14/90] New translations en_US.h (Dutch)
---
src/lang/nl_NL.h | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/lang/nl_NL.h b/src/lang/nl_NL.h
index 33b1f0a9..429d0b5d 100644
--- a/src/lang/nl_NL.h
+++ b/src/lang/nl_NL.h
@@ -30,10 +30,6 @@
#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
#define D_DECIMAL_POINT "," // decimal comma or point
-#define D_SETTING_ENABLED "Ingeschakeld"
-#define D_SETTING_DISABLED "Uitgeschakeld"
-#define D_SETTING_DEFAULT "Standaard"
-
#define D_SERVICE_STARTING "Starten..."
#define D_SERVICE_STARTED "Gestart"
#define D_SERVICE_START_FAILED "Starten mislukt"
@@ -42,6 +38,10 @@
#define D_SERVICE_CONNECTED "Verbonden"
#define D_SERVICE_DISCONNECTED "Verbroken"
+#define D_SETTING_ENABLED "Ingeschakeld"
+#define D_SETTING_DISABLED "Uitgeschakeld"
+#define D_SETTING_DEFAULT "Standaard"
+
#define D_NETWORK_IP_ADDRESS_RECEIVED "IP adres %s ontvangen"
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
@@ -209,6 +209,7 @@
#define D_WIFI_RSSI_WEAK "Zwak"
#define D_WIFI_RSSI_BAD "Zeer Slecht"
+// new
#define D_GPIO_SWITCH "Schakelaar"
#define D_GPIO_BUTTON "Drukknop"
#define D_GPIO_TOUCH "Aanraakknop"
From 8be5599d88c1fc3aed39fb13c222a25c1c642da1 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:27 +0200
Subject: [PATCH 15/90] New translations en_US.h (Portuguese)
---
src/lang/pt_PT.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/lang/pt_PT.h b/src/lang/pt_PT.h
index 82c273db..3fae3d94 100644
--- a/src/lang/pt_PT.h
+++ b/src/lang/pt_PT.h
@@ -19,7 +19,6 @@
#define D_FILE_LOADING "A carregar %s"
#define D_FILE_LOADED "%s carregado"
#define D_FILE_LOAD_FAILED "Não foi possível carregar %s"
-
#define D_FILE_SAVING "A guardar %s"
#define D_FILE_SAVED "%s guardado"
#define D_FILE_SAVE_FAILED "Não foi possível guardar %s"
@@ -68,11 +67,11 @@
#define D_TELNET_CLOSING_CONNECTION "A fechar a ligação de %s"
#define D_TELNET_CLIENT_LOGIN_FROM "Foi feito login ao cliente %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Foi conectado ao cliente %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Cliente não ligado"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Tentativa de ligação incorreta desde %s"
#define D_TELNET_STARTED "Consola inicializada"
#define D_TELNET_FAILED "Falhou inicialização da consola"
#define D_TELNET_CLIENT_CONNECTED "Cliente ligado"
-#define D_TELNET_CLIENT_NOT_CONNECTED "Cliente não ligado"
#define D_TELNET_CLIENT_REJECTED "Cliente rejeitado"
#define D_HASP_INVALID_PAGE "Página inválida %u"
@@ -206,10 +205,11 @@
#define D_WIFI_CONNECTED_TO "Ligado a %s, a pedir IP..."
#define D_WIFI_RSSI_EXCELLENT "Excelente"
#define D_WIFI_RSSI_GOOD "Bom"
-#define D_WIFI_RSSI_FAIR "Decente"
#define D_WIFI_RSSI_WEAK "Fraco"
#define D_WIFI_RSSI_BAD "Muito baixo"
+#define D_WIFI_RSSI_FAIR "Decente"
+// new
#define D_GPIO_SWITCH "Interruptor"
#define D_GPIO_BUTTON "Botão"
#define D_GPIO_TOUCH "Capacitive Touch" // new
@@ -229,4 +229,4 @@
#define D_GPIO_STATE_NORMAL "Normal" // new
#define D_GPIO_STATE_INVERTED "Inverted" // new
-#endif
+#endif
\ No newline at end of file
From 4cfd34a8666926ec0009e103eb33a4c902f6e511 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 01:36:27 +0200
Subject: [PATCH 16/90] New translations en_US.h (Portuguese, Brazilian)
---
src/lang/pt_BR.h | 229 +++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 221 insertions(+), 8 deletions(-)
diff --git a/src/lang/pt_BR.h b/src/lang/pt_BR.h
index f2f83607..bbe134fc 100644
--- a/src/lang/pt_BR.h
+++ b/src/lang/pt_BR.h
@@ -1,19 +1,232 @@
#ifndef HASP_LANG_PT_BR_H
#define HASP_LANG_PT_BR_H
-#include "pt_PT.h" // Common language file
-
-// Overrides
-#undef D_ISO_LANG_CODE
#define D_ISO_LANG_CODE "pt-BR"
-#undef D_USERNAME
#define D_USERNAME "Usuário:"
-
-#undef D_PASSWORD
#define D_PASSWORD "Senha:"
+#define D_SSID "Ssid:"
+#define D_YES "Yes"
+#define D_NO "No"
-#undef D_NETWORK_CONNECTION_FAILED
+#define D_ERROR_OUT_OF_MEMORY "Out of memory"
+#define D_ERROR_UNKNOWN "Unkown error"
+
+#define D_CONFIG_NOT_CHANGED "Settings did not change"
+#define D_CONFIG_CHANGED "Settings changed"
+#define D_CONFIG_LOADED "Settings loaded"
+
+#define D_FILE_LOADING "Loading %s"
+#define D_FILE_LOADED "Loaded %s"
+#define D_FILE_LOAD_FAILED "Failed to load %s"
+#define D_FILE_SAVING "Saving %s"
+#define D_FILE_SAVED "Saved %s"
+#define D_FILE_SAVE_FAILED "Failed to save %s"
+#define D_FILE_NOT_FOUND "File not found"
+#define D_FILE_SIZE_BYTES "bytes"
+#define D_FILE_SIZE_KILOBYTES "KiB"
+#define D_FILE_SIZE_MEGABYTES "MiB"
+#define D_FILE_SIZE_GIGABYTES "GiB"
+#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
+#define D_DECIMAL_POINT "." // decimal comma or point
+
+#define D_SERVICE_STARTING "Starting..."
+#define D_SERVICE_STARTED "Started"
+#define D_SERVICE_START_FAILED "Failed to start"
+#define D_SERVICE_STOPPED "Stopped"
+#define D_SERVICE_DISABLED "Disabled"
+#define D_SERVICE_CONNECTED "Connected"
+#define D_SERVICE_DISCONNECTED "Disconnected"
+
+#define D_SETTING_ENABLED "Enabled"
+#define D_SETTING_DISABLED "Disabled"
+#define D_SETTING_DEFAULT "Default"
+
+#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s"
+#define D_NETWORK_ONLINE "online"
+#define D_NETWORK_OFFLINE "offline"
#define D_NETWORK_CONNECTION_FAILED "Falhou a conexão"
+#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
+
+#define D_MQTT_DEFAULT_NAME "plate_%s"
+#define D_MQTT_CONNECTING "Connecting..."
+#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s"
+#define D_MQTT_NOT_CONNECTED "Not connected ???"
+#define D_MQTT_DISCONNECTING "Disconnecting..."
+#define D_MQTT_DISCONNECTED "Disconnected"
+#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..."
+#define D_MQTT_NOT_CONFIGURED "Broker not configured"
+#define D_MQTT_STARTED "Started: %d bytes"
+#define D_MQTT_FAILED "Failed:"
+#define D_MQTT_INVALID_TOPIC "Message has invalid topic"
+#define D_MQTT_SUBSCRIBED "Subscribed to %s"
+#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s"
+#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery"
+#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)"
+
+#define D_TELNET_CLOSING_CONNECTION "Closing session from %s"
+#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
+#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
+#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
+#define D_TELNET_STARTED "Telnet console started"
+#define D_TELNET_FAILED "Failed to start telnet console"
+#define D_TELNET_CLIENT_CONNECTED "Client connected"
+#define D_TELNET_CLIENT_REJECTED "Client rejected"
+
+#define D_HASP_INVALID_PAGE "Invalid page %u"
+#define D_HASP_INVALID_LAYER "Cannot clear system layer"
+#define D_HASP_CHANGE_PAGE "Changing page to %u"
+#define D_HASP_CLEAR_PAGE "Clearing page %u"
+
+#define D_OBJECT_DELETED "Object deleted"
+#define D_OBJECT_UNKNOWN "Unknown object"
+#define D_OBJECT_MISMATCH "Objects DO NOT match!"
+#define D_OBJECT_LOST "Lost object!"
+#define D_OBJECT_CREATE_FAILED "Failed to create object id %u"
+#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined"
+#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d"
+
+#define D_ATTRIBUTE_UNKNOWN "Unknown property %s"
+// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
+#define D_ATTRIBUTE_OBSOLETE "%s is obsolete"
+#define D_ATTRIBUTE_INSTEAD ", use %s instead"
+#define D_ATTRIBUTE_READ_ONLY "%s is read-only"
+#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page"
+#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s"
+#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s"
+#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s"
+
+#define D_OOBE_SSID_VALIDATED "SSID %s validated"
+#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled"
+#define D_OOBE_CALIBRATED "Already calibrated"
+
+#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found"
+#define D_DISPATCH_INVALID_PAGE "Invalid page %s"
+#define D_DISPATCH_REBOOT "Rebooting the MCU now!"
+
+#define D_JSON_FAILED "JSON parsing failed:"
+#define D_JSONL_FAILED "JSONL parsing failed at line %u"
+#define D_JSONL_SUCCEEDED "Jsonl fully parsed"
+
+#define D_OTA_CHECK_UPDATE "Trying update URL: %s"
+#define D_OTA_CHECK_COMPLETE "Update check complete"
+#define D_OTA_CHECK_FAILED "Update check failed: %s"
+#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update"
+#define D_OTA_UPDATE_COMPLETE "OTA Update complete"
+#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot"
+#define D_OTA_UPDATE_FAILED "OTA Update failed"
+#define D_OTA_UPDATING_FIRMWARE "Updating firmware..."
+#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..."
+
+#define D_HTTP_HASP_DESIGN "HASP Design"
+#define D_HTTP_INFORMATION "Information"
+#define D_HTTP_HTTP_SETTINGS "HTTP Settings"
+#define D_HTTP_FTP_SETTINGS "FTP Settings"
+#define D_HTTP_WIFI_SETTINGS "Wifi Settings"
+#define D_HTTP_MQTT_SETTINGS "MQTT Settings"
+#define D_HTTP_GPIO_SETTINGS "GPIO Settings"
+#define D_HTTP_MDNS_SETTINGS "mDNS Settings"
+#define D_HTTP_TELNET_SETTINGS "Telnet Settings"
+#define D_HTTP_DEBUG_SETTINGS "Debug Settings"
+#define D_HTTP_GUI_SETTINGS "Display Settings"
+#define D_HTTP_SAVE_SETTINGS "Save Settings"
+#define D_HTTP_UPLOAD_FILE "Upload File"
+#define D_HTTP_ERASE_DEVICE "Reset All Settings"
+#define D_HTTP_ADD_GPIO "Add New Pin"
+#define D_HTTP_BACK "Back"
+#define D_HTTP_REFRESH "Refresh"
+#define D_HTTP_PREV_PAGE "Prev Page"
+#define D_HTTP_NEXT_PAGE "Next Page"
+#define D_HTTP_CALIBRATE "Calibrate"
+#define D_HTTP_ANTIBURN "Run Anti Burn-in"
+#define D_HTTP_SCREENSHOT "Screenshot"
+#define D_HTTP_FILE_BROWSER "File Editor"
+#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade"
+#define D_HTTP_UPDATE_FIRMWARE "Update Firmware"
+#define D_HTTP_FACTORY_RESET "Factory Reset"
+#define D_HTTP_MAIN_MENU "Main Menu"
+#define D_HTTP_REBOOT "Restart"
+#define D_HTTP_CONFIGURATION "Configuration"
+#define D_HTTP_CONFIG_CHANGED \
+ "The configuration has changed, please click Restart to save changes to flash."
+#define D_HTTP_SENDING_PAGE "Sent %S page to %s"
+#define D_HTTP_FOOTER "by Francis Van Roie"
+
+#define D_INFO_VERSION "Version"
+#define D_INFO_BUILD_DATETIME "Build DateTime"
+#define D_INFO_ENVIRONMENT "Environment"
+#define D_INFO_UPTIME "Uptime"
+#define D_INFO_FREE_HEAP "Free Heap"
+#define D_INFO_FREE_BLOCK "Free Block"
+#define D_INFO_DEVICE_MEMORY "Device Memory"
+#define D_INFO_LVGL_MEMORY "LVGL Memory"
+#define D_INFO_TOTAL_MEMORY "Total"
+#define D_INFO_FREE_MEMORY "Free"
+#define D_INFO_FRAGMENTATION "Fragmentation"
+#define D_INFO_PSRAM_FREE "PSRam Free"
+#define D_INFO_PSRAM_SIZE "PSRam Size"
+#define D_INFO_FLASH_SIZE "Flash Size"
+#define D_INFO_SKETCH_USED "Program Size Used"
+#define D_INFO_SKETCH_FREE "Program Size Free"
+#define D_INFO_FS_SIZE "Filesystem Size"
+#define D_INFO_FS_USED "Filesystem Used"
+#define D_INFO_FS_FREE "Filesystem Free"
+#define D_INFO_MODULE "Module"
+#define D_INFO_MODEL "Model"
+#define D_INFO_FREQUENCY "Frequency"
+#define D_INFO_CORE_VERSION "Core Version"
+#define D_INFO_RESET_REASON "Reset Reason"
+#define D_INFO_STATUS "Status"
+#define D_INFO_SERVER "Server"
+#undef D_USERNAME
+#define D_INFO_CLIENTID "Client ID"
+#undef D_NETWORK_CONNECTION_FAILED
+// #define D_INFO_DISCONNECTED "Disconnected"
+#define D_INFO_RECEIVED "Received"
+#define D_INFO_PUBLISHED "Published"
+#define D_INFO_FAILED "Failed"
+#define D_INFO_ETHERNET "Ethernet"
+#define D_INFO_WIFI "Wifi"
+#define D_INFO_LINK_SPEED "Link Speed"
+#define D_INFO_FULL_DUPLEX "Full Duplex"
+#define D_INFO_BSSID "BSSID"
+#define D_INFO_SSID "SSID"
+#define D_INFO_RSSI "Signal Strength"
+#define D_INFO_IP_ADDRESS "IP Address"
+#define D_INFO_MAC_ADDRESS "MAC Address"
+#define D_INFO_GATEWAY "Gateway"
+#define D_INFO_DNS_SERVER "DNS Server"
+
+#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:"
+#define D_OOBE_SCAN_TO_CONNECT "Scan to connect"
+
+#define D_WIFI_CONNECTING_TO "Connecting to %s"
+#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..."
+#define D_WIFI_RSSI_EXCELLENT "Excellent"
+#define D_WIFI_RSSI_GOOD "Good"
+#define D_WIFI_RSSI_FAIR "Fair"
+#define D_WIFI_RSSI_WEAK "Weak"
+#define D_WIFI_RSSI_BAD "Very bad"
+
+// Overrides
+#define D_GPIO_SWITCH "Switch"
+#define D_GPIO_BUTTON "Push Button"
+#define D_GPIO_TOUCH "Capacitive Touch"
+#define D_GPIO_LED "Led"
+#define D_GPIO_LED_R "Mood Red"
+#define D_GPIO_LED_G "Mood Green"
+#define D_GPIO_LED_B "Mood Blue"
+#define D_GPIO_POWER_RELAY "Power Relay"
+#define D_GPIO_LIGHT_RELAY "Light Relay"
+#define D_GPIO_PWM "PWM"
+#undef D_ISO_LANG_CODE
+#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
+#define D_GPIO_UNKNOWN "Unknown"
+#undef D_PASSWORD
+#define D_GPIO_GROUP "Group"
+#define D_GPIO_GROUP_NONE "None"
+#include "pt_PT.h" // Common language file
+#define D_GPIO_STATE_INVERTED "Inverted"
#endif
\ No newline at end of file
From 38b316a3753fb98edd7c376c8cf7dd378a93ffa2 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 02:47:57 +0200
Subject: [PATCH 17/90] New translations en.json (Danish)
---
data/da_DK.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/da_DK.json
diff --git a/data/da_DK.json b/data/da_DK.json
new file mode 100644
index 00000000..22bf5098
--- /dev/null
+++ b/data/da_DK.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "Dansk",
+ "home": {
+ "title": "Hovedmenu",
+ "btn": "Hovedmenu",
+ "nav": "Home"
+ },
+ "save": "Gem Indstillinger",
+ "user": "Brugernavn",
+ "pass": "Adgangskode",
+ "hasp": {
+ "title": "HASP Design",
+ "btn": "HASP Design",
+ "theme": "UI Theme",
+ "color1": "Primær farve",
+ "color2": "Sekundær farve",
+ "pages": "Start Layout",
+ "font": "Standardfont",
+ "startpage": "Startup Page",
+ "startdim": "Startup Dim"
+ },
+ "screenshot": {
+ "title": "Skærmbillede",
+ "btn": "Skærmbillede",
+ "nav": "Skærmbillede",
+ "prev": "Forrige Side",
+ "next": "Næste Side",
+ "refresh": "Opdater"
+ },
+ "info": {
+ "title": "Information",
+ "btn": "Information",
+ "nav": "Information"
+ },
+ "config": {
+ "title": "Konfiguration",
+ "btn": "Konfiguration",
+ "nav": "Indstillinger"
+ },
+ "ota": {
+ "title": "Firmware Opdatering",
+ "btn": "Firmware Opdatering",
+ "nav": "Firmware",
+ "submit": "Opdater Firmware",
+ "file": "Firmware Fil",
+ "url": "Firmware URL",
+ "redirect": "Følg Omdirigeringer",
+ "never": "Aldrig",
+ "strict": "Streng",
+ "always": "Altid"
+ },
+ "editor": {
+ "title": "Fil Editor",
+ "btn": "Fil Editor",
+ "nav": "Fil Editor"
+ },
+ "reset": {
+ "title": "Gendan fabriksindstillinger",
+ "btn": "Gendan fabriksindstillinger",
+ "warning": "Advarsel",
+ "message": "This process will reset all settings to the default values. The internal flash will be erased and the device is restarted. You may need to connect to the WiFi AP displayed on the panel to reconfigure the device before accessing it again.",
+ "fileloss": "ALLE FILER VIL TABE!"
+ },
+ "reboot": {
+ "title": "Genstarter...",
+ "btn": "Genstart",
+ "nav": "Genstart",
+ "message": "Enheden er ved at genstarte."
+ },
+ "about": {
+ "credits": "Baseret på det tidligere arbejde fra følgende open source-udviklere:",
+ "copyright": "Ophavsret ",
+ "rights": "Alle rettigheder forbeholdes.",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "MIT Licens",
+ "bsd": "Bsd Licens",
+ "freebsd": "FreeBSD Licens",
+ "apache2": "Apache2 Licens"
+ },
+ "wifi": {
+ "title": "WiFi Indstillinger",
+ "btn": "WiFi Indstillinger",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "MQTT Indstillinger",
+ "btn": "MQTT Indstillinger",
+ "name": "Værtsnavn",
+ "group": "Gruppenavn",
+ "host": "Broker",
+ "port": "Port",
+ "node_t": "Node Emne",
+ "group_t": "Gruppe Emne",
+ "broadcast_t": "Broadcast Emne",
+ "hass_t": "HA LWT Emne"
+ },
+ "http": {
+ "title": "HTTP Indstillinger",
+ "btn": "HTTP Indstillinger"
+ },
+ "ftp": {
+ "title": "FTP Indstillinger",
+ "btn": "FTP Indstillinger",
+ "port": "FTP Port",
+ "pasv": "Passiv Port"
+ },
+ "gui": {
+ "title": "Display Settings",
+ "btn": "Display Settings",
+ "antiburn": "Antiburn",
+ "calibrate": "Kalibrér"
+ },
+ "gpio": "GPIO Indstillinger",
+ "debug": {
+ "title": "Debug Indstillinger",
+ "btn": "Debug Indstillinger",
+ "baud": "Baudrate",
+ "tele": "Tele Period",
+ "ansi": "Brug ANSI-koder",
+ "host": "Syslog Server",
+ "port": "Syslog Port",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facilitet"
+ },
+ "time": {
+ "title": "Tids Indstillinger",
+ "btn": "Tids Indstillinger",
+ "region": "Region",
+ "zone": "Tidszone",
+ "tz": "Tidszone",
+ "ntp": "NTP-servere"
+ },
+ "region": {
+ "etc": "Etcetera ",
+ "continents": "Kontinenter ",
+ "af": "Afrika ",
+ "as": "Asien ",
+ "au": "Australien ",
+ "aq": "Antarktis ",
+ "eu": "Europa ",
+ "na": "Nordamerika ",
+ "sa": "Sydamerika ",
+ "islands": "Øer ",
+ "at": "Atlanterhavet ",
+ "in": "Indiske Ocean ",
+ "pa": "Stillehavet "
+ }
+ }
+}
\ No newline at end of file
From 24e27ac3f30ef2d652340515878f70dbd750ca4c Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 02:47:58 +0200
Subject: [PATCH 18/90] New translations en_US.h (Danish)
---
src/lang/da_DK.h | 232 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 232 insertions(+)
create mode 100644 src/lang/da_DK.h
diff --git a/src/lang/da_DK.h b/src/lang/da_DK.h
new file mode 100644
index 00000000..37558021
--- /dev/null
+++ b/src/lang/da_DK.h
@@ -0,0 +1,232 @@
+#ifndef HASP_LANG_EN_US_H
+#define HASP_LANG_EN_US_H
+
+#define D_ISO_LANG_CODE "en-US"
+
+#define D_USERNAME "Username:"
+#define D_PASSWORD "Password:"
+#define D_SSID "Ssid:"
+#define D_YES "Yes"
+#define D_NO "No"
+
+#define D_ERROR_OUT_OF_MEMORY "Out of memory"
+#define D_ERROR_UNKNOWN "Unkown error"
+
+#define D_CONFIG_NOT_CHANGED "Settings did not change"
+#define D_CONFIG_CHANGED "Settings changed"
+#define D_CONFIG_LOADED "Settings loaded"
+
+#define D_FILE_LOADING "Loading %s"
+#define D_FILE_LOADED "Loaded %s"
+#define D_FILE_LOAD_FAILED "Failed to load %s"
+#define D_FILE_SAVING "Saving %s"
+#define D_FILE_SAVED "Saved %s"
+#define D_FILE_SAVE_FAILED "Failed to save %s"
+#define D_FILE_NOT_FOUND "File not found"
+#define D_FILE_SIZE_BYTES "bytes"
+#define D_FILE_SIZE_KILOBYTES "KiB"
+#define D_FILE_SIZE_MEGABYTES "MiB"
+#define D_FILE_SIZE_GIGABYTES "GiB"
+#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
+#define D_DECIMAL_POINT "." // decimal comma or point
+
+#define D_SERVICE_STARTING "Starting..."
+#define D_SERVICE_STARTED "Started"
+#define D_SERVICE_START_FAILED "Failed to start"
+#define D_SERVICE_STOPPED "Stopped"
+#define D_SERVICE_DISABLED "Disabled"
+#define D_SERVICE_CONNECTED "Connected"
+#define D_SERVICE_DISCONNECTED "Disconnected"
+
+#define D_SETTING_ENABLED "Enabled"
+#define D_SETTING_DISABLED "Disabled"
+#define D_SETTING_DEFAULT "Default"
+
+#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s"
+#define D_NETWORK_ONLINE "online"
+#define D_NETWORK_OFFLINE "offline"
+#define D_NETWORK_CONNECTION_FAILED "Connection failed"
+#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
+
+#define D_MQTT_DEFAULT_NAME "plate_%s"
+#define D_MQTT_CONNECTING "Connecting..."
+#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s"
+#define D_MQTT_NOT_CONNECTED "Not connected ???"
+#define D_MQTT_DISCONNECTING "Disconnecting..."
+#define D_MQTT_DISCONNECTED "Disconnected"
+#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..."
+#define D_MQTT_NOT_CONFIGURED "Broker not configured"
+#define D_MQTT_STARTED "Started: %d bytes"
+#define D_MQTT_FAILED "Failed:"
+#define D_MQTT_INVALID_TOPIC "Message has invalid topic"
+#define D_MQTT_SUBSCRIBED "Subscribed to %s"
+#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s"
+#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery"
+#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)"
+
+#define D_TELNET_CLOSING_CONNECTION "Closing session from %s"
+#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
+#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
+#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
+#define D_TELNET_STARTED "Telnet console started"
+#define D_TELNET_FAILED "Failed to start telnet console"
+#define D_TELNET_CLIENT_CONNECTED "Client connected"
+#define D_TELNET_CLIENT_REJECTED "Client rejected"
+
+#define D_HASP_INVALID_PAGE "Invalid page %u"
+#define D_HASP_INVALID_LAYER "Cannot clear system layer"
+#define D_HASP_CHANGE_PAGE "Changing page to %u"
+#define D_HASP_CLEAR_PAGE "Clearing page %u"
+
+#define D_OBJECT_DELETED "Object deleted"
+#define D_OBJECT_UNKNOWN "Unknown object"
+#define D_OBJECT_MISMATCH "Objects DO NOT match!"
+#define D_OBJECT_LOST "Lost object!"
+#define D_OBJECT_CREATE_FAILED "Failed to create object id %u"
+#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined"
+#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d"
+
+#define D_ATTRIBUTE_UNKNOWN "Unknown property %s"
+// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
+#define D_ATTRIBUTE_OBSOLETE "%s is obsolete"
+#define D_ATTRIBUTE_INSTEAD ", use %s instead"
+#define D_ATTRIBUTE_READ_ONLY "%s is read-only"
+#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page"
+#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s"
+#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s"
+#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s"
+
+#define D_OOBE_SSID_VALIDATED "SSID %s validated"
+#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled"
+#define D_OOBE_CALIBRATED "Already calibrated"
+
+#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found"
+#define D_DISPATCH_INVALID_PAGE "Invalid page %s"
+#define D_DISPATCH_REBOOT "Rebooting the MCU now!"
+
+#define D_JSON_FAILED "JSON parsing failed:"
+#define D_JSONL_FAILED "JSONL parsing failed at line %u"
+#define D_JSONL_SUCCEEDED "Jsonl fully parsed"
+
+#define D_OTA_CHECK_UPDATE "Trying update URL: %s"
+#define D_OTA_CHECK_COMPLETE "Update check complete"
+#define D_OTA_CHECK_FAILED "Update check failed: %s"
+#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update"
+#define D_OTA_UPDATE_COMPLETE "OTA Update complete"
+#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot"
+#define D_OTA_UPDATE_FAILED "OTA Update failed"
+#define D_OTA_UPDATING_FIRMWARE "Updating firmware..."
+#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..."
+
+#define D_HTTP_HASP_DESIGN "HASP Design"
+#define D_HTTP_INFORMATION "Information"
+#define D_HTTP_HTTP_SETTINGS "HTTP Settings"
+#define D_HTTP_FTP_SETTINGS "FTP Settings"
+#define D_HTTP_WIFI_SETTINGS "Wifi Settings"
+#define D_HTTP_MQTT_SETTINGS "MQTT Settings"
+#define D_HTTP_GPIO_SETTINGS "GPIO Settings"
+#define D_HTTP_MDNS_SETTINGS "mDNS Settings"
+#define D_HTTP_TELNET_SETTINGS "Telnet Settings"
+#define D_HTTP_DEBUG_SETTINGS "Debug Settings"
+#define D_HTTP_GUI_SETTINGS "Display Settings"
+#define D_HTTP_SAVE_SETTINGS "Save Settings"
+#define D_HTTP_UPLOAD_FILE "Upload File"
+#define D_HTTP_ERASE_DEVICE "Reset All Settings"
+#define D_HTTP_ADD_GPIO "Add New Pin"
+#define D_HTTP_BACK "Back"
+#define D_HTTP_REFRESH "Refresh"
+#define D_HTTP_PREV_PAGE "Prev Page"
+#define D_HTTP_NEXT_PAGE "Next Page"
+#define D_HTTP_CALIBRATE "Calibrate"
+#define D_HTTP_ANTIBURN "Run Anti Burn-in"
+#define D_HTTP_SCREENSHOT "Screenshot"
+#define D_HTTP_FILE_BROWSER "File Editor"
+#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade"
+#define D_HTTP_UPDATE_FIRMWARE "Update Firmware"
+#define D_HTTP_FACTORY_RESET "Factory Reset"
+#define D_HTTP_MAIN_MENU "Main Menu"
+#define D_HTTP_REBOOT "Restart"
+#define D_HTTP_CONFIGURATION "Configuration"
+#define D_HTTP_CONFIG_CHANGED \
+ "The configuration has changed, please click Restart to save changes to flash."
+#define D_HTTP_SENDING_PAGE "Sent %S page to %s"
+#define D_HTTP_FOOTER "by Francis Van Roie"
+
+#define D_INFO_VERSION "Version"
+#define D_INFO_BUILD_DATETIME "Build DateTime"
+#define D_INFO_ENVIRONMENT "Environment"
+#define D_INFO_UPTIME "Uptime"
+#define D_INFO_FREE_HEAP "Free Heap"
+#define D_INFO_FREE_BLOCK "Free Block"
+#define D_INFO_DEVICE_MEMORY "Device Memory"
+#define D_INFO_LVGL_MEMORY "LVGL Memory"
+#define D_INFO_TOTAL_MEMORY "Total"
+#define D_INFO_FREE_MEMORY "Free"
+#define D_INFO_FRAGMENTATION "Fragmentation"
+#define D_INFO_PSRAM_FREE "PSRam Free"
+#define D_INFO_PSRAM_SIZE "PSRam Size"
+#define D_INFO_FLASH_SIZE "Flash Size"
+#define D_INFO_SKETCH_USED "Program Size Used"
+#define D_INFO_SKETCH_FREE "Program Size Free"
+#define D_INFO_FS_SIZE "Filesystem Size"
+#define D_INFO_FS_USED "Filesystem Used"
+#define D_INFO_FS_FREE "Filesystem Free"
+#define D_INFO_MODULE "Module"
+#define D_INFO_MODEL "Model"
+#define D_INFO_FREQUENCY "Frequency"
+#define D_INFO_CORE_VERSION "Core Version"
+#define D_INFO_RESET_REASON "Reset Reason"
+#define D_INFO_STATUS "Status"
+#define D_INFO_SERVER "Server"
+#define D_INFO_USERNAME "Username"
+#define D_INFO_CLIENTID "Client ID"
+// #define D_INFO_CONNECTED "Connected"
+// #define D_INFO_DISCONNECTED "Disconnected"
+#define D_INFO_RECEIVED "Received"
+#define D_INFO_PUBLISHED "Published"
+#define D_INFO_FAILED "Failed"
+#define D_INFO_ETHERNET "Ethernet"
+#define D_INFO_WIFI "Wifi"
+#define D_INFO_LINK_SPEED "Link Speed"
+#define D_INFO_FULL_DUPLEX "Full Duplex"
+#define D_INFO_BSSID "BSSID"
+#define D_INFO_SSID "SSID"
+#define D_INFO_RSSI "Signal Strength"
+#define D_INFO_IP_ADDRESS "IP Address"
+#define D_INFO_MAC_ADDRESS "MAC Address"
+#define D_INFO_GATEWAY "Gateway"
+#define D_INFO_DNS_SERVER "DNS Server"
+
+#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:"
+#define D_OOBE_SCAN_TO_CONNECT "Scan to connect"
+
+#define D_WIFI_CONNECTING_TO "Connecting to %s"
+#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..."
+#define D_WIFI_RSSI_EXCELLENT "Excellent"
+#define D_WIFI_RSSI_GOOD "Good"
+#define D_WIFI_RSSI_FAIR "Fair"
+#define D_WIFI_RSSI_WEAK "Weak"
+#define D_WIFI_RSSI_BAD "Very bad"
+
+// new
+#define D_GPIO_SWITCH "Switch"
+#define D_GPIO_BUTTON "Push Button"
+#define D_GPIO_TOUCH "Capacitive Touch"
+#define D_GPIO_LED "Led"
+#define D_GPIO_LED_R "Mood Red"
+#define D_GPIO_LED_G "Mood Green"
+#define D_GPIO_LED_B "Mood Blue"
+#define D_GPIO_POWER_RELAY "Power Relay"
+#define D_GPIO_LIGHT_RELAY "Light Relay"
+#define D_GPIO_PWM "PWM"
+#define D_GPIO_DAC "DAC"
+#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
+#define D_GPIO_UNKNOWN "Unknown"
+#define D_GPIO_PIN "Pin"
+#define D_GPIO_GROUP "Group"
+#define D_GPIO_GROUP_NONE "None"
+#define D_GPIO_STATE_NORMAL "Normal"
+#define D_GPIO_STATE_INVERTED "Inverted"
+
+#endif
\ No newline at end of file
From e8de162d8c8f2f93bda2cba01d68812a53fe02f6 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 02:47:59 +0200
Subject: [PATCH 19/90] New translations en.json (Chinese Simplified)
---
data/zh_CN.json | 153 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 data/zh_CN.json
diff --git a/data/zh_CN.json b/data/zh_CN.json
new file mode 100644
index 00000000..34d310c4
--- /dev/null
+++ b/data/zh_CN.json
@@ -0,0 +1,153 @@
+{
+ "en": {
+ "language": "中文(简体)",
+ "home": {
+ "title": "主菜单",
+ "btn": "主菜单",
+ "nav": "首页"
+ },
+ "save": "保存设置",
+ "user": "用户名",
+ "pass": "密码",
+ "hasp": {
+ "title": "HASP 设计",
+ "btn": "HASP 设计",
+ "theme": "界面主题",
+ "color1": "主颜色",
+ "color2": "副颜色",
+ "pages": "开始布局",
+ "font": "默认字体",
+ "startpage": "开机页面",
+ "startdim": "开机亮度"
+ },
+ "screenshot": {
+ "title": "截屏",
+ "btn": "截屏",
+ "nav": "截屏",
+ "prev": "上一页",
+ "next": "下一页",
+ "refresh": "刷新页面"
+ },
+ "info": {
+ "title": "信息",
+ "btn": "信息",
+ "nav": "信息"
+ },
+ "config": {
+ "title": "配置",
+ "btn": "配置",
+ "nav": "配置"
+ },
+ "ota": {
+ "title": "固件更新",
+ "btn": "固件更新",
+ "nav": "固件",
+ "submit": "更新固件",
+ "file": "固件文件",
+ "url": "固件网址",
+ "redirect": "跟随重定向",
+ "never": "从不",
+ "strict": "严格",
+ "always": "总是"
+ },
+ "editor": {
+ "title": "文件编辑器",
+ "btn": "文件编辑器",
+ "nav": "文件编辑器"
+ },
+ "reset": {
+ "title": "出厂重置",
+ "btn": "出厂重置",
+ "warning": "警告",
+ "message": "此过程会将所有设置重置为默认值。 内部闪存将被擦除,设备将重新启动。 您可能需要连接到面板上显示的 WiFi AP 以重新配置设备,然后才能再次访问它。",
+ "fileloss": "所有文件都会被删除!"
+ },
+ "reboot": {
+ "title": "重启中...",
+ "btn": "重启",
+ "nav": "重启",
+ "message": "设备正在重启。"
+ },
+ "about": {
+ "credits": "基于以下开源开发者的先前工作:",
+ "copyright": "版权 ",
+ "rights": "版权所有。",
+ "clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
+ "clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
+ "clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
+ "mit": "MIT 许可证",
+ "bsd": "BSD 许可证",
+ "freebsd": "FreeBSD 许可证",
+ "apache2": "Apache2 许可证"
+ },
+ "wifi": {
+ "title": "Wifi 设置",
+ "btn": "Wifi 设置",
+ "ssid": "SSID"
+ },
+ "mqtt": {
+ "title": "MQTT 设置",
+ "btn": "MQTT 设置",
+ "name": "主机名",
+ "group": "组名",
+ "host": "MQTT 经纪人",
+ "port": "端口",
+ "node_t": "设备主题",
+ "group_t": "群组主题",
+ "broadcast_t": "广播主题",
+ "hass_t": "HA LWT 主题"
+ },
+ "http": {
+ "title": "HTTP 设置",
+ "btn": "HTTP 设置"
+ },
+ "ftp": {
+ "title": "FTP设置",
+ "btn": "FTP设置",
+ "port": "FTP 端口",
+ "pasv": "被动端口"
+ },
+ "gui": {
+ "title": "屏幕设置",
+ "btn": "屏幕设置",
+ "antiburn": "防烧",
+ "calibrate": "校准"
+ },
+ "gpio": "GPIO 设置",
+ "debug": {
+ "title": "调试设置",
+ "btn": "调试设置",
+ "baud": "波特率",
+ "tele": "远程时期",
+ "ansi": "使用 ANSI 代码",
+ "host": "Syslog 服务器",
+ "port": "Syslog端口",
+ "ietf": "IETF (RFC 5424)",
+ "bsd": "BSD (RFC 3164)",
+ "log": "Facility"
+ },
+ "time": {
+ "title": "时间设置",
+ "btn": "时间设置",
+ "region": "区域",
+ "zone": "时区",
+ "tz": "时区",
+ "ntp": "NTP 服务器"
+ },
+ "region": {
+ "etc": "等等 ",
+ "continents": "大洲数 ",
+ "af": "非洲 ",
+ "as": "亚洲 ",
+ "au": "澳大利亚 ",
+ "aq": "南极洲 ",
+ "eu": "欧洲 ",
+ "na": "北美洲 ",
+ "sa": "南美洲 ",
+ "islands": "群岛 ",
+ "at": "大西洋 ",
+ "in": "印度洋 ",
+ "pa": "太平洋 "
+ }
+ }
+}
\ No newline at end of file
From 23eadbb1eb1f87db3ce4c45e4959aca7706e314c Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 02:47:59 +0200
Subject: [PATCH 20/90] New translations en_US.h (Chinese Simplified)
---
src/lang/zh_CN.h | 232 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 232 insertions(+)
create mode 100644 src/lang/zh_CN.h
diff --git a/src/lang/zh_CN.h b/src/lang/zh_CN.h
new file mode 100644
index 00000000..37558021
--- /dev/null
+++ b/src/lang/zh_CN.h
@@ -0,0 +1,232 @@
+#ifndef HASP_LANG_EN_US_H
+#define HASP_LANG_EN_US_H
+
+#define D_ISO_LANG_CODE "en-US"
+
+#define D_USERNAME "Username:"
+#define D_PASSWORD "Password:"
+#define D_SSID "Ssid:"
+#define D_YES "Yes"
+#define D_NO "No"
+
+#define D_ERROR_OUT_OF_MEMORY "Out of memory"
+#define D_ERROR_UNKNOWN "Unkown error"
+
+#define D_CONFIG_NOT_CHANGED "Settings did not change"
+#define D_CONFIG_CHANGED "Settings changed"
+#define D_CONFIG_LOADED "Settings loaded"
+
+#define D_FILE_LOADING "Loading %s"
+#define D_FILE_LOADED "Loaded %s"
+#define D_FILE_LOAD_FAILED "Failed to load %s"
+#define D_FILE_SAVING "Saving %s"
+#define D_FILE_SAVED "Saved %s"
+#define D_FILE_SAVE_FAILED "Failed to save %s"
+#define D_FILE_NOT_FOUND "File not found"
+#define D_FILE_SIZE_BYTES "bytes"
+#define D_FILE_SIZE_KILOBYTES "KiB"
+#define D_FILE_SIZE_MEGABYTES "MiB"
+#define D_FILE_SIZE_GIGABYTES "GiB"
+#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
+#define D_DECIMAL_POINT "." // decimal comma or point
+
+#define D_SERVICE_STARTING "Starting..."
+#define D_SERVICE_STARTED "Started"
+#define D_SERVICE_START_FAILED "Failed to start"
+#define D_SERVICE_STOPPED "Stopped"
+#define D_SERVICE_DISABLED "Disabled"
+#define D_SERVICE_CONNECTED "Connected"
+#define D_SERVICE_DISCONNECTED "Disconnected"
+
+#define D_SETTING_ENABLED "Enabled"
+#define D_SETTING_DISABLED "Disabled"
+#define D_SETTING_DEFAULT "Default"
+
+#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s"
+#define D_NETWORK_ONLINE "online"
+#define D_NETWORK_OFFLINE "offline"
+#define D_NETWORK_CONNECTION_FAILED "Connection failed"
+#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
+
+#define D_MQTT_DEFAULT_NAME "plate_%s"
+#define D_MQTT_CONNECTING "Connecting..."
+#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s"
+#define D_MQTT_NOT_CONNECTED "Not connected ???"
+#define D_MQTT_DISCONNECTING "Disconnecting..."
+#define D_MQTT_DISCONNECTED "Disconnected"
+#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..."
+#define D_MQTT_NOT_CONFIGURED "Broker not configured"
+#define D_MQTT_STARTED "Started: %d bytes"
+#define D_MQTT_FAILED "Failed:"
+#define D_MQTT_INVALID_TOPIC "Message has invalid topic"
+#define D_MQTT_SUBSCRIBED "Subscribed to %s"
+#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s"
+#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery"
+#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)"
+
+#define D_TELNET_CLOSING_CONNECTION "Closing session from %s"
+#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
+#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
+#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
+#define D_TELNET_STARTED "Telnet console started"
+#define D_TELNET_FAILED "Failed to start telnet console"
+#define D_TELNET_CLIENT_CONNECTED "Client connected"
+#define D_TELNET_CLIENT_REJECTED "Client rejected"
+
+#define D_HASP_INVALID_PAGE "Invalid page %u"
+#define D_HASP_INVALID_LAYER "Cannot clear system layer"
+#define D_HASP_CHANGE_PAGE "Changing page to %u"
+#define D_HASP_CLEAR_PAGE "Clearing page %u"
+
+#define D_OBJECT_DELETED "Object deleted"
+#define D_OBJECT_UNKNOWN "Unknown object"
+#define D_OBJECT_MISMATCH "Objects DO NOT match!"
+#define D_OBJECT_LOST "Lost object!"
+#define D_OBJECT_CREATE_FAILED "Failed to create object id %u"
+#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined"
+#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d"
+
+#define D_ATTRIBUTE_UNKNOWN "Unknown property %s"
+// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
+#define D_ATTRIBUTE_OBSOLETE "%s is obsolete"
+#define D_ATTRIBUTE_INSTEAD ", use %s instead"
+#define D_ATTRIBUTE_READ_ONLY "%s is read-only"
+#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page"
+#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s"
+#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s"
+#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s"
+
+#define D_OOBE_SSID_VALIDATED "SSID %s validated"
+#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled"
+#define D_OOBE_CALIBRATED "Already calibrated"
+
+#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found"
+#define D_DISPATCH_INVALID_PAGE "Invalid page %s"
+#define D_DISPATCH_REBOOT "Rebooting the MCU now!"
+
+#define D_JSON_FAILED "JSON parsing failed:"
+#define D_JSONL_FAILED "JSONL parsing failed at line %u"
+#define D_JSONL_SUCCEEDED "Jsonl fully parsed"
+
+#define D_OTA_CHECK_UPDATE "Trying update URL: %s"
+#define D_OTA_CHECK_COMPLETE "Update check complete"
+#define D_OTA_CHECK_FAILED "Update check failed: %s"
+#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update"
+#define D_OTA_UPDATE_COMPLETE "OTA Update complete"
+#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot"
+#define D_OTA_UPDATE_FAILED "OTA Update failed"
+#define D_OTA_UPDATING_FIRMWARE "Updating firmware..."
+#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..."
+
+#define D_HTTP_HASP_DESIGN "HASP Design"
+#define D_HTTP_INFORMATION "Information"
+#define D_HTTP_HTTP_SETTINGS "HTTP Settings"
+#define D_HTTP_FTP_SETTINGS "FTP Settings"
+#define D_HTTP_WIFI_SETTINGS "Wifi Settings"
+#define D_HTTP_MQTT_SETTINGS "MQTT Settings"
+#define D_HTTP_GPIO_SETTINGS "GPIO Settings"
+#define D_HTTP_MDNS_SETTINGS "mDNS Settings"
+#define D_HTTP_TELNET_SETTINGS "Telnet Settings"
+#define D_HTTP_DEBUG_SETTINGS "Debug Settings"
+#define D_HTTP_GUI_SETTINGS "Display Settings"
+#define D_HTTP_SAVE_SETTINGS "Save Settings"
+#define D_HTTP_UPLOAD_FILE "Upload File"
+#define D_HTTP_ERASE_DEVICE "Reset All Settings"
+#define D_HTTP_ADD_GPIO "Add New Pin"
+#define D_HTTP_BACK "Back"
+#define D_HTTP_REFRESH "Refresh"
+#define D_HTTP_PREV_PAGE "Prev Page"
+#define D_HTTP_NEXT_PAGE "Next Page"
+#define D_HTTP_CALIBRATE "Calibrate"
+#define D_HTTP_ANTIBURN "Run Anti Burn-in"
+#define D_HTTP_SCREENSHOT "Screenshot"
+#define D_HTTP_FILE_BROWSER "File Editor"
+#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade"
+#define D_HTTP_UPDATE_FIRMWARE "Update Firmware"
+#define D_HTTP_FACTORY_RESET "Factory Reset"
+#define D_HTTP_MAIN_MENU "Main Menu"
+#define D_HTTP_REBOOT "Restart"
+#define D_HTTP_CONFIGURATION "Configuration"
+#define D_HTTP_CONFIG_CHANGED \
+ "The configuration has changed, please click Restart to save changes to flash."
+#define D_HTTP_SENDING_PAGE "Sent %S page to %s"
+#define D_HTTP_FOOTER "by Francis Van Roie"
+
+#define D_INFO_VERSION "Version"
+#define D_INFO_BUILD_DATETIME "Build DateTime"
+#define D_INFO_ENVIRONMENT "Environment"
+#define D_INFO_UPTIME "Uptime"
+#define D_INFO_FREE_HEAP "Free Heap"
+#define D_INFO_FREE_BLOCK "Free Block"
+#define D_INFO_DEVICE_MEMORY "Device Memory"
+#define D_INFO_LVGL_MEMORY "LVGL Memory"
+#define D_INFO_TOTAL_MEMORY "Total"
+#define D_INFO_FREE_MEMORY "Free"
+#define D_INFO_FRAGMENTATION "Fragmentation"
+#define D_INFO_PSRAM_FREE "PSRam Free"
+#define D_INFO_PSRAM_SIZE "PSRam Size"
+#define D_INFO_FLASH_SIZE "Flash Size"
+#define D_INFO_SKETCH_USED "Program Size Used"
+#define D_INFO_SKETCH_FREE "Program Size Free"
+#define D_INFO_FS_SIZE "Filesystem Size"
+#define D_INFO_FS_USED "Filesystem Used"
+#define D_INFO_FS_FREE "Filesystem Free"
+#define D_INFO_MODULE "Module"
+#define D_INFO_MODEL "Model"
+#define D_INFO_FREQUENCY "Frequency"
+#define D_INFO_CORE_VERSION "Core Version"
+#define D_INFO_RESET_REASON "Reset Reason"
+#define D_INFO_STATUS "Status"
+#define D_INFO_SERVER "Server"
+#define D_INFO_USERNAME "Username"
+#define D_INFO_CLIENTID "Client ID"
+// #define D_INFO_CONNECTED "Connected"
+// #define D_INFO_DISCONNECTED "Disconnected"
+#define D_INFO_RECEIVED "Received"
+#define D_INFO_PUBLISHED "Published"
+#define D_INFO_FAILED "Failed"
+#define D_INFO_ETHERNET "Ethernet"
+#define D_INFO_WIFI "Wifi"
+#define D_INFO_LINK_SPEED "Link Speed"
+#define D_INFO_FULL_DUPLEX "Full Duplex"
+#define D_INFO_BSSID "BSSID"
+#define D_INFO_SSID "SSID"
+#define D_INFO_RSSI "Signal Strength"
+#define D_INFO_IP_ADDRESS "IP Address"
+#define D_INFO_MAC_ADDRESS "MAC Address"
+#define D_INFO_GATEWAY "Gateway"
+#define D_INFO_DNS_SERVER "DNS Server"
+
+#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:"
+#define D_OOBE_SCAN_TO_CONNECT "Scan to connect"
+
+#define D_WIFI_CONNECTING_TO "Connecting to %s"
+#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..."
+#define D_WIFI_RSSI_EXCELLENT "Excellent"
+#define D_WIFI_RSSI_GOOD "Good"
+#define D_WIFI_RSSI_FAIR "Fair"
+#define D_WIFI_RSSI_WEAK "Weak"
+#define D_WIFI_RSSI_BAD "Very bad"
+
+// new
+#define D_GPIO_SWITCH "Switch"
+#define D_GPIO_BUTTON "Push Button"
+#define D_GPIO_TOUCH "Capacitive Touch"
+#define D_GPIO_LED "Led"
+#define D_GPIO_LED_R "Mood Red"
+#define D_GPIO_LED_G "Mood Green"
+#define D_GPIO_LED_B "Mood Blue"
+#define D_GPIO_POWER_RELAY "Power Relay"
+#define D_GPIO_LIGHT_RELAY "Light Relay"
+#define D_GPIO_PWM "PWM"
+#define D_GPIO_DAC "DAC"
+#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
+#define D_GPIO_UNKNOWN "Unknown"
+#define D_GPIO_PIN "Pin"
+#define D_GPIO_GROUP "Group"
+#define D_GPIO_GROUP_NONE "None"
+#define D_GPIO_STATE_NORMAL "Normal"
+#define D_GPIO_STATE_INVERTED "Inverted"
+
+#endif
\ No newline at end of file
From 15c9858d3747dca391bfc59357d780418346fb6d Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 03:04:49 +0200
Subject: [PATCH 21/90] New translations en.json (Dutch)
---
data/nl_NL.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/data/nl_NL.json b/data/nl_NL.json
index 101c27b5..a8b4ed78 100644
--- a/data/nl_NL.json
+++ b/data/nl_NL.json
@@ -51,9 +51,9 @@
"always": "Altijd"
},
"editor": {
- "title": "Bestands Editor",
- "btn": "Bestands Editor",
- "nav": "Bestands Editor"
+ "title": "Bestandseditor",
+ "btn": "Bestandseditor",
+ "nav": "Bestandseditor"
},
"reset": {
"title": "Fabrieksinstellingen",
@@ -119,7 +119,7 @@
"btn": "Debug Instellingen",
"baud": "Baudrate",
"tele": "Tele Periode",
- "ansi": "Gebruik ANSI-codes",
+ "ansi": "Gebruik ANSI codes",
"host": "Syslog Server",
"port": "Syslog Poort",
"ietf": "IETF (RFC 5424)",
From 83fe5474f4c5e2b284faafefe5394e395ab8b3a9 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 17 May 2023 03:04:53 +0200
Subject: [PATCH 22/90] New translations en.json (Danish)
---
data/da_DK.json | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/data/da_DK.json b/data/da_DK.json
index 22bf5098..fb67c5d9 100644
--- a/data/da_DK.json
+++ b/data/da_DK.json
@@ -4,7 +4,7 @@
"home": {
"title": "Hovedmenu",
"btn": "Hovedmenu",
- "nav": "Home"
+ "nav": "Forside"
},
"save": "Gem Indstillinger",
"user": "Brugernavn",
@@ -12,13 +12,13 @@
"hasp": {
"title": "HASP Design",
"btn": "HASP Design",
- "theme": "UI Theme",
+ "theme": "UI Tema",
"color1": "Primær farve",
"color2": "Sekundær farve",
"pages": "Start Layout",
"font": "Standardfont",
- "startpage": "Startup Page",
- "startdim": "Startup Dim"
+ "startpage": "Opstarts side",
+ "startdim": "Opstartslysstyrke"
},
"screenshot": {
"title": "Skærmbillede",
@@ -59,7 +59,7 @@
"title": "Gendan fabriksindstillinger",
"btn": "Gendan fabriksindstillinger",
"warning": "Advarsel",
- "message": "This process will reset all settings to the default values. The internal flash will be erased and the device is restarted. You may need to connect to the WiFi AP displayed on the panel to reconfigure the device before accessing it again.",
+ "message": "Denne proces vil nulstille alle indstillinger til standardværdierne. Den interne flash vil blive slettet, og enheden genstartes. Du skal muligvis oprette forbindelse til WiFi AP vist på panelet for at omkonfigurere enheden, før du får adgang til den igen.",
"fileloss": "ALLE FILER VIL TABE!"
},
"reboot": {
@@ -108,9 +108,9 @@
"pasv": "Passiv Port"
},
"gui": {
- "title": "Display Settings",
- "btn": "Display Settings",
- "antiburn": "Antiburn",
+ "title": "Skærm Indstillinger",
+ "btn": "Skærm Indstillinger",
+ "antiburn": "Antiforbrænding",
"calibrate": "Kalibrér"
},
"gpio": "GPIO Indstillinger",
@@ -118,7 +118,7 @@
"title": "Debug Indstillinger",
"btn": "Debug Indstillinger",
"baud": "Baudrate",
- "tele": "Tele Period",
+ "tele": "Tele Periode",
"ansi": "Brug ANSI-koder",
"host": "Syslog Server",
"port": "Syslog Port",
From fd6a689ec5afd262b7e15d284bc853e0e882d256 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Mon, 19 Jun 2023 20:43:13 +0200
Subject: [PATCH 23/90] New translations en.json (Dutch)
---
data/nl_NL.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/data/nl_NL.json b/data/nl_NL.json
index a8b4ed78..918de554 100644
--- a/data/nl_NL.json
+++ b/data/nl_NL.json
@@ -108,8 +108,8 @@
"pasv": "Passieve Poort"
},
"gui": {
- "title": "Weergave Instellingen",
- "btn": "Weergave Instellingen",
+ "title": "Scherminstellingen",
+ "btn": "Scherminstellingen",
"antiburn": "Inbranden Voorkomen",
"calibrate": "Kalibreer"
},
@@ -127,8 +127,8 @@
"log": "Faciliteit"
},
"time": {
- "title": "Tijd Instellingen",
- "btn": "Tijd Instellingen",
+ "title": "Tijdsinstellingen",
+ "btn": "Tijdsinstellingen",
"region": "Regio",
"zone": "Tijdzone",
"tz": "Tijdzone",
From a1b514eac936a64b3d38be38c690da01a2ee6489 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Mon, 3 Jul 2023 17:43:20 +0200
Subject: [PATCH 24/90] Update hasp_mqtt.h
---
src/mqtt/hasp_mqtt.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/mqtt/hasp_mqtt.h b/src/mqtt/hasp_mqtt.h
index 5ae231ea..63e9ed9e 100644
--- a/src/mqtt/hasp_mqtt.h
+++ b/src/mqtt/hasp_mqtt.h
@@ -73,7 +73,7 @@ bool mqttSetConfig(const JsonObject& settings);
// These defaults may be overwritten with values saved by the web interface
#ifndef MQTT_GROUPNAME
-#define MQTT_GROUPNAME "plates";
+#define MQTT_GROUPNAME "plates"
#endif
#ifndef MQTT_HOSTNAME
@@ -104,4 +104,4 @@ bool mqttSetConfig(const JsonObject& settings);
#endif
#endif
-#endif // HASP_MQTT_H
\ No newline at end of file
+#endif // HASP_MQTT_H
From 6fd20bae3baf434bdb397c9c0d241c9813e3d04c Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Thu, 6 Jul 2023 22:22:41 +0200
Subject: [PATCH 25/90] Fix flash partition size
---
user_setups/esp32/yeacreate-nscreen32.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/user_setups/esp32/yeacreate-nscreen32.ini b/user_setups/esp32/yeacreate-nscreen32.ini
index 6dab5e15..3b7e21f5 100644
--- a/user_setups/esp32/yeacreate-nscreen32.ini
+++ b/user_setups/esp32/yeacreate-nscreen32.ini
@@ -6,7 +6,7 @@
; untested config
[env:yeacreate-nscreen32]
-extends = arduino_esp32_v2, flash_8mb
+extends = arduino_esp32_v2, flash_16mb
board = esp32dev
build_flags =
From 579d24361a2b2a3df5b87f9041dd7179aeaae208 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Fri, 7 Jul 2023 17:16:21 +0200
Subject: [PATCH 26/90] Update ace.js to v1.23.2
---
data/edit.htm | 2 +-
data/script.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/edit.htm b/data/edit.htm
index c37c0d69..5f8a5da6 100644
--- a/data/edit.htm
+++ b/data/edit.htm
@@ -1 +1 @@
-openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
+openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
diff --git a/data/script.js b/data/script.js
index 2d856d5c..50641015 100644
--- a/data/script.js
+++ b/data/script.js
@@ -1 +1 @@
-var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.0")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
+var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
From 012d6afa6c491d34cb033fd487a8b66f119a5bc3 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Tue, 11 Jul 2023 00:38:50 +0200
Subject: [PATCH 27/90] Update ace.js to 1.23.3
---
data/edit.htm | 2 +-
data/script.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/edit.htm b/data/edit.htm
index 5f8a5da6..7449c00f 100644
--- a/data/edit.htm
+++ b/data/edit.htm
@@ -1 +1 @@
-openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
+openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
diff --git a/data/script.js b/data/script.js
index 50641015..291d7aef 100644
--- a/data/script.js
+++ b/data/script.js
@@ -1 +1 @@
-var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
+var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
From 7b10553a5eb554baa28b468275f64cfc354fdb0a Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Wed, 12 Jul 2023 14:15:16 +0200
Subject: [PATCH 28/90] Update ace.js to 1.23.4
---
data/edit.htm | 2 +-
data/script.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/edit.htm b/data/edit.htm
index 7449c00f..60aa40e9 100644
--- a/data/edit.htm
+++ b/data/edit.htm
@@ -1 +1 @@
-openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
+openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
diff --git a/data/script.js b/data/script.js
index 291d7aef..39a83573 100644
--- a/data/script.js
+++ b/data/script.js
@@ -1 +1 @@
-var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.3")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
+var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.4")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
From 7c35ef778de75b9891b9b3866e9979bc1557b0e1 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Wed, 12 Jul 2023 16:44:27 +0200
Subject: [PATCH 29/90] Add ESP32C3
---
src/sys/svc/hasp_http.cpp | 4 ++--
user_setups/esp32c3/_esp32c3.ini | 22 ++++++++++++++++++++++
2 files changed, 24 insertions(+), 2 deletions(-)
create mode 100644 user_setups/esp32c3/_esp32c3.ini
diff --git a/src/sys/svc/hasp_http.cpp b/src/sys/svc/hasp_http.cpp
index 8e1160bf..318d4efb 100644
--- a/src/sys/svc/hasp_http.cpp
+++ b/src/sys/svc/hasp_http.cpp
@@ -71,7 +71,7 @@ ESP8266WebServer webServer(80);
#include
WebServer webServer(80);
-#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
+#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
extern const uint8_t EDIT_HTM_GZ_START[] asm("_binary_data_static_edit_htm_gz_start");
extern const uint8_t EDIT_HTM_GZ_END[] asm("_binary_data_static_edit_htm_gz_end");
extern const uint8_t STYLE_CSS_GZ_START[] asm("_binary_data_static_style_css_gz_start");
@@ -2310,7 +2310,7 @@ static inline int handleFirmwareFile(String path)
path = path.substring(7);
}
-#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
+#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
if(path == F("/edit.htm")) {
return http_send_static_gzip_file(EDIT_HTM_GZ_START, EDIT_HTM_GZ_END, contentType);
// } else if(path == F("/hasp.htm")) { // 39 kB
diff --git a/user_setups/esp32c3/_esp32c3.ini b/user_setups/esp32c3/_esp32c3.ini
new file mode 100644
index 00000000..20811d99
--- /dev/null
+++ b/user_setups/esp32c3/_esp32c3.ini
@@ -0,0 +1,22 @@
+; -- Platform specific build flags
+[esp32c3]
+extends = esp32
+board_build.mcu = esp32c3
+board_build.f_cpu = 160000000
+
+ps_ram =
+ -DBOARD_HAS_PSRAM
+ -D HASP_USE_FREETYPE=1
+ -D LV_USE_FREETYPE=1
+no_ps_ram =
+ -D HASP_USE_FREETYPE=1
+ -D LV_USE_FREETYPE=1
+
+; -- The Arduino ESP32 v2.0.2 with 3 available flash sizes:
+[arduino_esp32c3_v2]
+extends = esp32c3
+framework = arduino
+;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.01.01/platform-espressif32.zip
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip
+;platform = espressif32@5.3.0
+
From bc407b3613a272ee5f9b12503e38dc2116002a6a Mon Sep 17 00:00:00 2001
From: Faidon Liambotis
Date: Sun, 16 Jul 2023 16:18:06 +0300
Subject: [PATCH 30/90] Spelling fixes (user-visible)
While debugging a few WiFi issues, I got a bunch of "Unkown" errors. Fix
this, and an unrelated, but also user-visible s/propery/property/.
---
src/hasp/hasp_attribute_helper.h | 2 +-
src/lang/en_US.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/hasp/hasp_attribute_helper.h b/src/hasp/hasp_attribute_helper.h
index ed2863b5..960ae4a3 100644
--- a/src/hasp/hasp_attribute_helper.h
+++ b/src/hasp/hasp_attribute_helper.h
@@ -921,7 +921,7 @@ static bool attribute_lookup_lv_property(uint16_t hash, uint8_t * prop)
for(uint32_t i = 0; i < sizeof(props) / sizeof(props[0]); i++) {
if(props[i].hash == hash) {
*prop = props[1].prop;
- LOG_WARNING(TAG_ATTR, F("%d found and has propery %d"), hash, props[i].prop);
+ LOG_WARNING(TAG_ATTR, F("%d found and has property %d"), hash, props[i].prop);
return true;
}
}
diff --git a/src/lang/en_US.h b/src/lang/en_US.h
index 37558021..d9f83733 100644
--- a/src/lang/en_US.h
+++ b/src/lang/en_US.h
@@ -10,7 +10,7 @@
#define D_NO "No"
#define D_ERROR_OUT_OF_MEMORY "Out of memory"
-#define D_ERROR_UNKNOWN "Unkown error"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Settings did not change"
#define D_CONFIG_CHANGED "Settings changed"
From 5b3f9f0d8c50dbdfddbc6d784a592dabba0b1246 Mon Sep 17 00:00:00 2001
From: Faidon Liambotis
Date: Sun, 16 Jul 2023 16:19:05 +0300
Subject: [PATCH 31/90] Spelling fixes (comments & variables)
---
src/custom/bootlogo_template.h | 2 +-
src/dev/esp32/esp32.cpp | 4 ++--
src/drv/tft/tft_driver_arduinogfx.cpp | 2 +-
src/drv/tft/tft_driver_lovyangfx.cpp | 2 +-
src/drv/tft/tft_driver_tftespi.cpp | 2 +-
src/drv/touch/touch_driver_gslx680.h | 2 +-
src/hal/hasp_hal.cpp | 10 +++++-----
src/hal/hasp_hal.h | 2 +-
src/hasp/hasp.cpp | 4 ++--
src/hasp/hasp_attribute.cpp | 4 ++--
src/hasp/hasp_attribute_helper.h | 4 ++--
src/hasp/hasp_dispatch.cpp | 10 +++++-----
src/hasp/hasp_event.cpp | 22 +++++++++++-----------
src/hasp/hasp_object.h | 2 +-
src/hasp_filesystem.cpp | 4 ++--
src/hasp_gui.cpp | 8 ++++----
src/log/hasp_debug.cpp | 4 ++--
src/mqtt/hasp_mqtt_esp.cpp | 2 +-
src/mqtt/hasp_mqtt_paho_single.cpp | 2 +-
src/mqtt/hasp_mqtt_pubsubclient.cpp | 2 +-
src/sys/gpio/hasp_gpio.cpp | 4 ++--
src/sys/net/hasp_wifi.cpp | 2 +-
src/sys/svc/hasp_ftp.cpp | 2 +-
src/sys/svc/hasp_http.cpp | 2 +-
src/sys/svc/hasp_http_async.cpp | 2 +-
src/sys/svc/hasp_mdns.cpp | 2 +-
src/sys/svc/hasp_ota.cpp | 2 +-
src/sys/svc/hasp_telnet.cpp | 4 ++--
28 files changed, 57 insertions(+), 57 deletions(-)
diff --git a/src/custom/bootlogo_template.h b/src/custom/bootlogo_template.h
index 28e0ba0c..fcaf7db1 100644
--- a/src/custom/bootlogo_template.h
+++ b/src/custom/bootlogo_template.h
@@ -2,7 +2,7 @@
// https://www.online-utility.org/image/convert/to/XBM
// The output must be pasted in a header file, renamed and adjusted to appear
-// as as a const unsigned char array in PROGMEM (FLASH program memory).
+// as a const unsigned char array in PROGMEM (FLASH program memory).
// The xbm format adds padding to pixel rows so they are a whole number of bytes
// In this example 93 pixel width means 96 bits = 12 bytes
diff --git a/src/dev/esp32/esp32.cpp b/src/dev/esp32/esp32.cpp
index c24ae0f5..88d34460 100644
--- a/src/dev/esp32/esp32.cpp
+++ b/src/dev/esp32/esp32.cpp
@@ -80,7 +80,7 @@ static String esp32ResetReason(uint8_t cpuid)
break; /**<13, RTC Watch dog Reset CPU*/
case 14:
resetReason += F("EXT_CPU");
- break; /**<14, for APP CPU, reseted by PRO CPU*/
+ break; /**<14, for APP CPU, reset by PRO CPU*/
case 15:
resetReason += F("RTCWDT_BROWN_OUT");
break; /**<15, Reset when the vdd voltage is not stable*/
@@ -108,7 +108,7 @@ Esp32Device::Esp32Device()
_backlight_invert = (TFT_BACKLIGHT_ON == LOW);
_backlight_power = 1;
_backlight_level = 255;
- _backlight_pin = 255; // not TFT_BCKL because it is unkown at this stage
+ _backlight_pin = 255; // not TFT_BCKL because it is unknown at this stage
/* fill unique identifier with wifi mac */
byte mac[6];
diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp
index 48f798c2..fc596422 100644
--- a/src/drv/tft/tft_driver_arduinogfx.cpp
+++ b/src/drv/tft/tft_driver_arduinogfx.cpp
@@ -86,7 +86,7 @@ void ArduinoGfx::init(int w, int h)
LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__);
tft->begin(GFX_NOT_DEFINED);
LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__);
- // tft.setSwapBytes(true); /* set endianess */
+ // tft.setSwapBytes(true); /* set endianness */
LOG_INFO(TAG_TFT, F(D_SERVICE_STARTED));
}
diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp
index 2a3c642e..9469f603 100644
--- a/src/drv/tft/tft_driver_lovyangfx.cpp
+++ b/src/drv/tft/tft_driver_lovyangfx.cpp
@@ -978,7 +978,7 @@ void LovyanGfx::init(int w, int h)
LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__);
tft.begin();
LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__);
- tft.setSwapBytes(true); /* set endianess */
+ tft.setSwapBytes(true); /* set endianness */
LOG_INFO(TAG_TFT, F(D_SERVICE_STARTED));
}
diff --git a/src/drv/tft/tft_driver_tftespi.cpp b/src/drv/tft/tft_driver_tftespi.cpp
index 10cbbb85..291f3b20 100644
--- a/src/drv/tft/tft_driver_tftespi.cpp
+++ b/src/drv/tft/tft_driver_tftespi.cpp
@@ -16,7 +16,7 @@ void TftEspi::init(int w, int h)
/* TFT init */
tft.begin();
- tft.setSwapBytes(true); /* set endianess */
+ tft.setSwapBytes(true); /* set endianness */
}
void TftEspi::show_info()
diff --git a/src/drv/touch/touch_driver_gslx680.h b/src/drv/touch/touch_driver_gslx680.h
index 03d6a960..ca022960 100644
--- a/src/drv/touch/touch_driver_gslx680.h
+++ b/src/drv/touch/touch_driver_gslx680.h
@@ -77,7 +77,7 @@ class TouchGsl1680 : public BaseTouch {
// delay(300); // already happens in touch.begin()
touch_scan(Wire);
- // Startup sequence CONTROLER part
+ // Startup sequence CONTROLLER part
TS.begin(TOUCH_RST, TOUCH_IRQ);
// Setup Interrupt handler
diff --git a/src/hal/hasp_hal.cpp b/src/hal/hasp_hal.cpp
index a0729fdb..1918fc9c 100644
--- a/src/hal/hasp_hal.cpp
+++ b/src/hal/hasp_hal.cpp
@@ -72,7 +72,7 @@
// break; /**<13, RTC Watch dog Reset CPU*/
// case 14:
// resetReason += F("EXT_CPU");
-// break; /**<14, for APP CPU, reseted by PRO CPU*/
+// break; /**<14, for APP CPU, reset by PRO CPU*/
// case 15:
// resetReason += F("RTCWDT_BROWN_OUT");
// break; /**<15, Reset when the vdd voltage is not stable*/
@@ -234,12 +234,12 @@ int getMemFree() { // returns the amount of free memory in bytes
// #elif defined(ARDUINO_ARCH_ESP8266)
// return ESP.getFreeHeap();
// #else
-// struct mallinfo chuncks = mallinfo();
+// struct mallinfo chunks = mallinfo();
// // fordblks
// // This is the total size of memory occupied by free (not in use) chunks.
-// return chuncks.fordblks + freeHighMemory();
+// return chunks.fordblks + freeHighMemory();
// #endif
// }
@@ -254,7 +254,7 @@ int getMemFree() { // returns the amount of free memory in bytes
// #endif
// }
-String halGetMacAddress(int start, const char* seperator)
+String halGetMacAddress(int start, const char* separator)
{
byte mac[6];
@@ -278,7 +278,7 @@ String halGetMacAddress(int start, const char* seperator)
for(int i = start; i < 6; ++i) {
if(mac[i] < 0x10) cMac += "0";
cMac += String(mac[i], HEX);
- if(i < 5) cMac += seperator;
+ if(i < 5) cMac += separator;
}
cMac.toUpperCase();
return cMac;
diff --git a/src/hal/hasp_hal.h b/src/hal/hasp_hal.h
index 7122642b..d1c34d53 100644
--- a/src/hal/hasp_hal.h
+++ b/src/hal/hasp_hal.h
@@ -13,7 +13,7 @@
// size_t halGetFreeHeap(void);
// String halGetCoreVersion(void);
// String halGetChipModel();
-String halGetMacAddress(int start, const char* seperator);
+String halGetMacAddress(int start, const char* separator);
// uint16_t halGetCpuFreqMHz(void);
// String halDisplayDriverName(void);
// String halGpioName(uint8_t gpio);
diff --git a/src/hasp/hasp.cpp b/src/hasp/hasp.cpp
index e80582be..9187f4ad 100644
--- a/src/hasp/hasp.cpp
+++ b/src/hasp/hasp.cpp
@@ -387,7 +387,7 @@ void haspReconnect()
// String progress_str((char *)0);
-// Shows/hides the the global progress bar and updates the value
+// Shows/hides the global progress bar and updates the value
void haspProgressVal(uint8_t val)
{
lv_obj_t* layer = lv_disp_get_layer_sys(NULL);
@@ -818,7 +818,7 @@ bool haspGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp
index ce316079..f0934fb7 100644
--- a/src/hasp/hasp_attribute.cpp
+++ b/src/hasp/hasp_attribute.cpp
@@ -82,7 +82,7 @@ void my_msgbox_map_clear(lv_obj_t* obj)
lv_btnmatrix_ext_t* ext_btnmatrix = (lv_btnmatrix_ext_t*)lv_obj_get_ext_attr(btnmatrix);
if(!ext_btnmatrix) return;
- if(ext_btnmatrix->map_p != msgbox_default_map) // Dont clear the default btnmap
+ if(ext_btnmatrix->map_p != msgbox_default_map) // Don't clear the default btnmap
my_btnmatrix_map_clear(btnmatrix); // Clear the custom button map if it exists
}
@@ -2326,7 +2326,7 @@ static hasp_attribute_type_t attribute_common_method(lv_obj_t* obj, uint16_t att
case ATTR_OPEN:
case ATTR_CLOSE:
if(!obj_check_type(obj, LV_HASP_DROPDOWN)) return HASP_ATTR_TYPE_NOT_FOUND;
- event_reset_last_value_sent(); // Prevents manual selection bug because no manual 'down' occured
+ event_reset_last_value_sent(); // Prevents manual selection bug because no manual 'down' occurred
if(attr_hash == ATTR_OPEN)
lv_dropdown_open(obj);
else
diff --git a/src/hasp/hasp_attribute_helper.h b/src/hasp/hasp_attribute_helper.h
index 960ae4a3..dbdae43c 100644
--- a/src/hasp/hasp_attribute_helper.h
+++ b/src/hasp/hasp_attribute_helper.h
@@ -84,7 +84,7 @@ void my_obj_set_template(lv_obj_t* obj, const char* text)
LOG_WARNING(TAG_ATTR, "Failed to allocate memory!");
}
-// free the extended user_data when all properies are NULL
+// free the extended user_data when all properties are NULL
static void my_prune_ext_tags(lv_obj_t* obj)
{
if(!obj || !obj->user_data.ext) return;
@@ -96,7 +96,7 @@ static void my_prune_ext_tags(lv_obj_t* obj)
}
}
-// create extended user_data properies object
+// create extended user_data properties object
static hasp_ext_user_data_t* my_create_ext_tags(lv_obj_t* obj)
{
void* ext = hasp_calloc(1, sizeof(hasp_ext_user_data_t));
diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp
index cee2ecb2..587e7fca 100644
--- a/src/hasp/hasp_dispatch.cpp
+++ b/src/hasp/hasp_dispatch.cpp
@@ -177,7 +177,7 @@ static inline bool dispatch_parse_button_attribute(const char* topic_p, const ch
objid = (uint8_t)num;
topic_p = pEnd;
- if(*topic_p != '.') return false; // obligated seperator
+ if(*topic_p != '.') return false; // obligated separator
topic_p++;
hasp_process_attribute(pageid, objid, topic_p, payload, update);
@@ -1312,7 +1312,7 @@ void dispatch_current_state(uint8_t source)
// Format filesystem and erase EEPROM
bool dispatch_factory_reset()
{
- bool formated = true;
+ bool formatted = true;
bool erased = true;
bool cleared = true;
@@ -1321,15 +1321,15 @@ bool dispatch_factory_reset()
#endif
#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0
- formated = HASP_FS.format();
- if(formated) filesystemSetupFiles();
+ formatted = HASP_FS.format();
+ if(formatted) filesystemSetupFiles();
#endif
#if HASP_USE_EEPROM > 0
erased = configClearEeprom();
#endif
- return formated && erased && cleared;
+ return formatted && erased && cleared;
}
void dispatch_calibrate(const char*, const char*, uint8_t source)
diff --git a/src/hasp/hasp_event.cpp b/src/hasp/hasp_event.cpp
index 686e9d5f..433bc7ea 100644
--- a/src/hasp/hasp_event.cpp
+++ b/src/hasp/hasp_event.cpp
@@ -215,7 +215,7 @@ void event_timer_refresh(lv_task_t* task)
* Get the hasp eventid for LV_EVENT_PRESSED, LV_EVENT_VALUE_CHANGED, LV_EVENT_LONG_PRESSED_REPEAT and
* LV_EVENT_RELEASED Also updates the sleep state and handles LV_EVENT_DELETE events
* @param obj pointer to a color picker
- * @param event type of event that occured
+ * @param event type of event that occurred
* @param eventid returns the hasp eventid
*/
static bool translate_event(lv_obj_t* obj, lv_event_t event, uint8_t& eventid)
@@ -367,7 +367,7 @@ static void log_event(const char* name, lv_event_t event)
/**
* Called when a press on the system layer is detected
* @param obj pointer to a button matrix
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void first_touch_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -419,7 +419,7 @@ void swipe_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a textarea is clicked
* @param obj pointer to a textarea object
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void textarea_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -455,7 +455,7 @@ void textarea_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a button-style object is clicked
* @param obj pointer to a button object
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void generic_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -546,7 +546,7 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a object state is toggled on/off
* @param obj pointer to a switch object
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void toggle_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -591,7 +591,7 @@ void toggle_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a range value has changed
* @param obj pointer to a dropdown list or roller
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void selector_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -670,7 +670,7 @@ void selector_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a btnmatrix value has changed
* @param obj pointer to a dropdown list or roller
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void alarm_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -714,7 +714,7 @@ void alarm_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a btnmatrix value has changed
* @param obj pointer to a dropdown list or roller
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void btnmatrix_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -749,7 +749,7 @@ void btnmatrix_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a msgbox value has changed
* @param obj pointer to a dropdown list or roller
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void msgbox_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -783,7 +783,7 @@ void msgbox_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a slider or adjustable arc is clicked
* @param obj pointer to a slider
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void slider_event_handler(lv_obj_t* obj, lv_event_t event)
{
@@ -825,7 +825,7 @@ void slider_event_handler(lv_obj_t* obj, lv_event_t event)
/**
* Called when a color picker is clicked
* @param obj pointer to a color picker
- * @param event type of event that occured
+ * @param event type of event that occurred
*/
void cpicker_event_handler(lv_obj_t* obj, lv_event_t event)
{
diff --git a/src/hasp/hasp_object.h b/src/hasp/hasp_object.h
index 22f2d582..cd1a0a20 100644
--- a/src/hasp/hasp_object.h
+++ b/src/hasp/hasp_object.h
@@ -137,7 +137,7 @@ inline const char* obj_get_type_name(const lv_obj_t* obj)
* Check if an lvgl objecttype name corresponds to a given HASP object ID
* @param obj an lv_obj_t* of the object to check its type
* @param haspobjtype the HASP object ID to check against
- * @return true or false wether the types match
+ * @return true or false whether the types match
* @note
*/
inline bool obj_check_type(const lv_obj_t* obj, lv_hasp_obj_type_t haspobjtype)
diff --git a/src/hasp_filesystem.cpp b/src/hasp_filesystem.cpp
index d5d510e7..56c96cc3 100644
--- a/src/hasp_filesystem.cpp
+++ b/src/hasp_filesystem.cpp
@@ -288,14 +288,14 @@ bool filesystemSetup(void)
// no SPIFFS settings, as settings depend on SPIFFS
// no Logging, because it depends on the configuration file
- // Logging is defered until debugging has started
+ // Logging is deferred until debugging has started
// FS success or failure is printed at that time !
#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0
#if defined(ARDUINO_ARCH_ESP8266)
if(!HASP_FS.begin()) {
#else
- if(HASP_FS.begin(false)) return true; // already formated
+ if(HASP_FS.begin(false)) return true; // already formatted
if(!HASP_FS.begin(true)) { // format partition
#endif
diff --git a/src/hasp_gui.cpp b/src/hasp_gui.cpp
index d2396e76..3d05a80e 100644
--- a/src/hasp_gui.cpp
+++ b/src/hasp_gui.cpp
@@ -209,7 +209,7 @@ static inline void gui_init_filesystems()
#if LV_USE_FS_IF != 0
//_lv_fs_init(); // lvgl File System -- not needed, it done in lv_init() when LV_USE_FILESYSTEM is set
LOG_VERBOSE(TAG_LVGL, F("Filesystem : " D_SETTING_ENABLED));
- lv_fs_if_init(); // auxilary file system drivers
+ lv_fs_if_init(); // auxiliary file system drivers
// filesystem_list_path("L:/");
lv_fs_file_t f;
@@ -532,7 +532,7 @@ bool guiGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
@@ -675,7 +675,7 @@ static void gui_screenshot_to_file(lv_disp_drv_t* disp, const lv_area_t* area, l
*
* Flush buffer into a binary file.
*
- * @note: data pixel should be formated to uint16_t RGB. Set by Bitmap header.
+ * @note: data pixel should be formatted to uint16_t RGB. Set by Bitmap header.
*
* @param[in] pFileName Output binary file name.
*
@@ -738,7 +738,7 @@ static void gui_screenshot_to_both(lv_disp_drv_t* disp, const lv_area_t* area, l
*
* Flush buffer into a http client.
*
- * @note: data pixel should be formated to uint16_t RGB. Set by Bitmap header.
+ * @note: data pixel should be formatted to uint16_t RGB. Set by Bitmap header.
*
**/
void guiTakeScreenshot()
diff --git a/src/log/hasp_debug.cpp b/src/log/hasp_debug.cpp
index 6898bb57..dafed245 100644
--- a/src/log/hasp_debug.cpp
+++ b/src/log/hasp_debug.cpp
@@ -4,7 +4,7 @@
/* ===========================================================================
- LOG_FATAL() - A fatal exception is caught, the program should halt with while(1){}
-- LOG_ERROR() - An important but non-fatal error occured, this error should be checked and not ignored
+- LOG_ERROR() - An important but non-fatal error occurred, this error should be checked and not ignored
- LOG_WARNING() - Send at the end of a function to indicate failure of the sub process, can be ignored
- LOG_TRACE() - Information at the START of an action to notify another function is now running
@@ -192,7 +192,7 @@ bool debugGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/mqtt/hasp_mqtt_esp.cpp b/src/mqtt/hasp_mqtt_esp.cpp
index 8018f766..74488f85 100644
--- a/src/mqtt/hasp_mqtt_esp.cpp
+++ b/src/mqtt/hasp_mqtt_esp.cpp
@@ -745,7 +745,7 @@ bool mqttGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/mqtt/hasp_mqtt_paho_single.cpp b/src/mqtt/hasp_mqtt_paho_single.cpp
index e0de3932..0811e29d 100644
--- a/src/mqtt/hasp_mqtt_paho_single.cpp
+++ b/src/mqtt/hasp_mqtt_paho_single.cpp
@@ -415,7 +415,7 @@ void mqtt_get_info(JsonDocument& doc)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp
index 2c04db2b..8821fc59 100644
--- a/src/mqtt/hasp_mqtt_pubsubclient.cpp
+++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp
@@ -459,7 +459,7 @@ bool mqttGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/sys/gpio/hasp_gpio.cpp b/src/sys/gpio/hasp_gpio.cpp
index a19084a5..b27e3594 100644
--- a/src/sys/gpio/hasp_gpio.cpp
+++ b/src/sys/gpio/hasp_gpio.cpp
@@ -673,7 +673,7 @@ void gpio_output_group_values(uint8_t group)
// SHOULD only by called from DISPATCH
// Update the normalized value of all group members
-// Does not procude logging output
+// Does not produce logging output
void gpio_set_normalized_group_values(hasp_update_value_t& value)
{
// Set all pins first, minimizes delays
@@ -1001,7 +1001,7 @@ bool gpioGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/sys/net/hasp_wifi.cpp b/src/sys/net/hasp_wifi.cpp
index 2df13e5d..36f69b26 100644
--- a/src/sys/net/hasp_wifi.cpp
+++ b/src/sys/net/hasp_wifi.cpp
@@ -676,7 +676,7 @@ bool wifiGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/sys/svc/hasp_ftp.cpp b/src/sys/svc/hasp_ftp.cpp
index 712cda7b..0e1e8ef3 100644
--- a/src/sys/svc/hasp_ftp.cpp
+++ b/src/sys/svc/hasp_ftp.cpp
@@ -194,7 +194,7 @@ bool ftpGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/sys/svc/hasp_http.cpp b/src/sys/svc/hasp_http.cpp
index 318d4efb..046c3831 100644
--- a/src/sys/svc/hasp_http.cpp
+++ b/src/sys/svc/hasp_http.cpp
@@ -2765,7 +2765,7 @@ bool httpGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/sys/svc/hasp_http_async.cpp b/src/sys/svc/hasp_http_async.cpp
index d9e70cf0..13d51d20 100644
--- a/src/sys/svc/hasp_http_async.cpp
+++ b/src/sys/svc/hasp_http_async.cpp
@@ -2359,7 +2359,7 @@ bool httpGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
diff --git a/src/sys/svc/hasp_mdns.cpp b/src/sys/svc/hasp_mdns.cpp
index 27fba8c1..0252fb9c 100644
--- a/src/sys/svc/hasp_mdns.cpp
+++ b/src/sys/svc/hasp_mdns.cpp
@@ -120,7 +120,7 @@ bool mdnsGetConfig(const JsonObject& settings)
/**
* Reads the settings from json and sets the application variables.
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
* @param[in] settings JsonObject with the config settings.
**/
bool mdnsSetConfig(const JsonObject& settings)
diff --git a/src/sys/svc/hasp_ota.cpp b/src/sys/svc/hasp_ota.cpp
index 179f62ff..48d9fb9e 100644
--- a/src/sys/svc/hasp_ota.cpp
+++ b/src/sys/svc/hasp_ota.cpp
@@ -201,7 +201,7 @@ void otaEverySecond(void)
void otaSetup(void)
{
#if ESP_ARDUINO_VERSION_MAJOR >= 2
- /* This method is similar to the single root certificate verfication, but it uses a standard set of root
+ /* This method is similar to the single root certificate verification, but it uses a standard set of root
* certificates from Mozilla to authenticate against. This allows the client to connect to all public SSL
* servers. */
secureClient.setCACertBundle(rootca_crt_bundle_start);
diff --git a/src/sys/svc/hasp_telnet.cpp b/src/sys/svc/hasp_telnet.cpp
index d68cb137..da8f2e85 100644
--- a/src/sys/svc/hasp_telnet.cpp
+++ b/src/sys/svc/hasp_telnet.cpp
@@ -209,7 +209,7 @@ static inline void telnetProcessData(char ch)
case 8: // Backspace
if(telnetInputIndex > 0) telnetInputIndex--;
break;
- case 13: // Cariage Return
+ case 13: // Carriage Return
telnetProcessLine("");
break;
case 32 ... 250:
@@ -444,7 +444,7 @@ bool telnetGetConfig(const JsonObject& settings)
*
* Read the settings from json and sets the application variables.
*
- * @note: data pixel should be formated to uint32_t RGBA. Imagemagick requirements.
+ * @note: data pixel should be formatted to uint32_t RGBA. Imagemagick requirements.
*
* @param[in] settings JsonObject with the config settings.
**/
From c1fa5a8cb12900eef027deff6475e0614e1b45f0 Mon Sep 17 00:00:00 2001
From: Faidon Liambotis
Date: Sun, 16 Jul 2023 15:55:14 +0300
Subject: [PATCH 32/90] Add 4MB variant for Makerfabs ESP32 TFT Touch
My Makerfabs ESP32 TFT Touch, v1.1 on the silkscreen, purchased in
October 2020, has a 4MB flash as reported by esptool flash_id:
Manufacturer: 20
Device: 4016
Detected flash size: 4MB
Add a makerfabs-tft35-cap_4MB variant, and rename makerfabs-tft35-cap to
makerfabs-tft35-cap_16MB.
---
.github/workflows/build.yaml | 2 +-
.github/workflows/release.yml | 2 +-
platformio_override-template.ini | 5 +++--
user_setups/esp32/makerfabs-tft35-cap.ini | 10 ++++++++--
4 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index cde8e064..3ff2e45c 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -47,7 +47,7 @@ jobs:
- out: m5stack
env: m5stack-core2
- out: makerfabs
- env: "makerfabs-tft35-cap -e makerfabs-s3-tft35-spi -e makerfabs-s3-tft40-rgb -e makerfabs-s3-tft43-rgb"
+ env: "makerfabs-tft35-cap_4MB -e makerfabs-tft35-cap_16MB -e makerfabs-s3-tft35-spi -e makerfabs-s3-tft40-rgb -e makerfabs-s3-tft43-rgb"
- out: panlee
env: "panlee-zw3d95ce01s-ar-4848_16MB -e panlee-zw3d95ce01s-ur-4848_16MB"
- out: sunton
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 934c53bb..b47c2d78 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -55,7 +55,7 @@ jobs:
- name: Run PlatformIO
run: pio run -e az-touch-mod-esp32_ili9341_4MB -e az-touch-mod-esp32_ili9341_8MB
- name: Run PlatformIO
- run: pio run -e makerfabs-tft35-cap
+ run: pio run -e makerfabs-tft35-cap_4MB -e makerfabs-tft35-cap_16MB
- name: Run PlatformIO
run: pio run -e yeacreate-nscreen32 -e
- name: Run PlatformIO
diff --git a/platformio_override-template.ini b/platformio_override-template.ini
index f7fc0a8a..c9ed61f1 100644
--- a/platformio_override-template.ini
+++ b/platformio_override-template.ini
@@ -53,7 +53,8 @@ extra_default_envs =
; m5stack-core2
; m5stack-tough
; makerfabs-s3-tft35-spi
- ; makerfabs-tft35-cap
+ ; makerfabs-tft35-cap_16MB
+ ; makerfabs-tft35-cap_4MB
; makerfabs-tft-s2_ili9488
; nodemcu32s-raspi
; s2-mini-esp32s2_ili9341
@@ -140,4 +141,4 @@ build_flags =
-D HASP_USE_TELNET=1
;endregion
-;endregion
\ No newline at end of file
+;endregion
diff --git a/user_setups/esp32/makerfabs-tft35-cap.ini b/user_setups/esp32/makerfabs-tft35-cap.ini
index 05d3ff69..343b94a2 100644
--- a/user_setups/esp32/makerfabs-tft35-cap.ini
+++ b/user_setups/esp32/makerfabs-tft35-cap.ini
@@ -4,8 +4,8 @@
; - FT6236 touch controller ;
;***************************************************;
-[env:makerfabs-tft35-cap]
-extends = arduino_esp32_v2, flash_16mb
+[makerfabs-tft35-cap]
+extends = arduino_esp32_v2
board = esp32dev
build_flags =
@@ -39,3 +39,9 @@ lib_deps =
${arduino_esp32_v2.lib_deps}
${tft_espi.lib_deps}
${ft6336.lib_deps}
+
+[env:makerfabs-tft35-cap_4MB]
+extends = makerfabs-tft35-cap, flash_4mb
+
+[env:makerfabs-tft35-cap_16MB]
+extends = makerfabs-tft35-cap, flash_16mb
From 76a0d54e96242f147544154aaa76d62c2e7c69b5 Mon Sep 17 00:00:00 2001
From: Faidon Liambotis
Date: Sun, 16 Jul 2023 17:13:38 +0300
Subject: [PATCH 33/90] Spelling fixes (changelog)
Fix some very minor issues with the changelog, the most important of
which is... the filename :)
---
CHANGLELOG.md => CHANGELOG.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
rename CHANGLELOG.md => CHANGELOG.md (97%)
diff --git a/CHANGLELOG.md b/CHANGELOG.md
similarity index 97%
rename from CHANGLELOG.md
rename to CHANGELOG.md
index 8dd900bb..d808285c 100644
--- a/CHANGLELOG.md
+++ b/CHANGELOG.md
@@ -31,7 +31,7 @@
- Make the MQTT topics configurable
- MQTT discovery now uses a subtopic of `hasp/discovery`. Discovery requires version 0.7.x of the Custom Component.
- Add service start/stop mqtt
-- Add SimpleFTPServer to easily upload and download files to the plate *(one simultanious connection only)*
+- Add SimpleFTPServer to easily upload and download files to the plate *(one simultaneous connection only)*
- Add service start/stop ftp
- Add configuration for NTP servers and timezone
@@ -51,7 +51,7 @@
- Moved to Tasmota Arduino 2.0.10 and ESP-IDF 4.4.5 (thanks @Jason2866)
- Add Arduino-GFX display driver
- Add support for ESP32-S3 devices
-- Deprication of support for ESP32-S2 devices due to lack of sRAM
+- Deprecation of support for ESP32-S2 devices due to lack of sRAM
Updated libraries to ArduinoJson 6.21.2, ArduinoStreamUtils 1.7.0, TFT_eSPI 2.5.0, LovyanGFX 1.1.7 and SimpleFTPServer 2.1.5
@@ -73,7 +73,7 @@ Updated libraries to ArduinoJson 6.21.2, ArduinoStreamUtils 1.7.0, TFT_eSPI 2.5.
### Web UI
- Updated to modern responsive design *(requires JavaScript)*
- Add `/api/info/` and `/api/config/*/` endpoints
-- Allow for a customizible `vars.css`, `style.css`, `script.js` and `edit.htm`
+- Allow for a customizable `vars.css`, `style.css`, `script.js` and `edit.htm`
- Display a message when the configuration is changed and a reboot is needed
- Add checkbox for backlight inversion to Display settings (thanks @wolffman122)
- Add checkbox to toggle ANSI codes #261 (thanks @geiseri)
@@ -139,7 +139,7 @@ Updated libraries to ArduinoJson 6.19.4, ArduinoStreamUtils 1.6.3, AceButton 1.9
- Add AZ-Touch MOD ESP32 with 2.4" or 2.8"
- Add Lilygo®Ttgo Pi ESP32 with TFT 3.5"
- Add Waveshare ESP32 One development board with Rpi MHS4001(B) or Waveshare RPi(C) LCD display
-- Add D1-R32 ESP32 development board with with Waveshare ILI9486 Touch Shield
+- Add D1-R32 ESP32 development board with Waveshare ILI9486 Touch Shield
### Bug fixes
- Fix bug that caused a crash when both `btnmatrix` and `msgbox` where used (thanks @AndreTeixeira1998)
@@ -192,7 +192,7 @@ Updated libraries to AceButton 1.9.1 and ArduinoJson 6.18.5
### Commands:
- Obsolete `dim` and `light` commands, use `backlight` command instead
- Add `discovery` command to facilitate HA CC discovery
-- Add `idle` command to retreive idle state, replaces `wakeup` command
+- Add `idle` command to retrieve idle state, replaces `wakeup` command
- Updated `moodlight` command with brightness support
- Rewrite `outputX` and add `inputX` command
From b18b72b90d6943c74ce33f3aef9e2c5eff6ea2e2 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:12 +0200
Subject: [PATCH 34/90] New translations en_US.h (Romanian)
---
src/lang/ro_RO.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/ro_RO.h b/src/lang/ro_RO.h
index 37558021..d9f83733 100644
--- a/src/lang/ro_RO.h
+++ b/src/lang/ro_RO.h
@@ -10,7 +10,7 @@
#define D_NO "No"
#define D_ERROR_OUT_OF_MEMORY "Out of memory"
-#define D_ERROR_UNKNOWN "Unkown error"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Settings did not change"
#define D_CONFIG_CHANGED "Settings changed"
From 5d9fecceaae722b90e590bf7b0040e08a779521e Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:13 +0200
Subject: [PATCH 35/90] New translations en_US.h (French)
---
src/lang/fr_FR.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/fr_FR.h b/src/lang/fr_FR.h
index 66416a90..0f246bfc 100644
--- a/src/lang/fr_FR.h
+++ b/src/lang/fr_FR.h
@@ -10,7 +10,7 @@
#define D_NO "Non"
#define D_ERROR_OUT_OF_MEMORY "Mémoire insuffisante "
-#define D_ERROR_UNKNOWN "Erreur inconnue"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Paramètres pas modifiés"
#define D_CONFIG_CHANGED "Paramètres modifiés"
From 35068e39cb7c15d8d6a8477aaef964d0beeea590 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:14 +0200
Subject: [PATCH 36/90] New translations en_US.h (Spanish)
---
src/lang/es_ES.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/es_ES.h b/src/lang/es_ES.h
index f5699a68..c293888b 100644
--- a/src/lang/es_ES.h
+++ b/src/lang/es_ES.h
@@ -10,7 +10,7 @@
#define D_NO "No" // New
#define D_ERROR_OUT_OF_MEMORY "Memory llena"
-#define D_ERROR_UNKNOWN "Error desconocido"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "No hay cambios en la configuración"
#define D_CONFIG_CHANGED "Configuración cambiada"
From 608e2efe6ad552c184c3801448a5fc421e11cff8 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:15 +0200
Subject: [PATCH 37/90] New translations en_US.h (Danish)
---
src/lang/da_DK.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/da_DK.h b/src/lang/da_DK.h
index 37558021..d9f83733 100644
--- a/src/lang/da_DK.h
+++ b/src/lang/da_DK.h
@@ -10,7 +10,7 @@
#define D_NO "No"
#define D_ERROR_OUT_OF_MEMORY "Out of memory"
-#define D_ERROR_UNKNOWN "Unkown error"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Settings did not change"
#define D_CONFIG_CHANGED "Settings changed"
From 081cb69b60c4f5f036ba4af7fccea32968072028 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:16 +0200
Subject: [PATCH 38/90] New translations en_US.h (German)
---
src/lang/de_DE.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/de_DE.h b/src/lang/de_DE.h
index 37558021..d9f83733 100644
--- a/src/lang/de_DE.h
+++ b/src/lang/de_DE.h
@@ -10,7 +10,7 @@
#define D_NO "No"
#define D_ERROR_OUT_OF_MEMORY "Out of memory"
-#define D_ERROR_UNKNOWN "Unkown error"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Settings did not change"
#define D_CONFIG_CHANGED "Settings changed"
From b7be2adaba4df92592b9bddabf168709a1eb9c98 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:17 +0200
Subject: [PATCH 39/90] New translations en_US.h (Hungarian)
---
src/lang/hu_HU.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/hu_HU.h b/src/lang/hu_HU.h
index 37558021..d9f83733 100644
--- a/src/lang/hu_HU.h
+++ b/src/lang/hu_HU.h
@@ -10,7 +10,7 @@
#define D_NO "No"
#define D_ERROR_OUT_OF_MEMORY "Out of memory"
-#define D_ERROR_UNKNOWN "Unkown error"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Settings did not change"
#define D_CONFIG_CHANGED "Settings changed"
From 1d35530cbe8408766bc86898298ce79044cd3ce0 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:18 +0200
Subject: [PATCH 40/90] New translations en_US.h (Dutch)
---
src/lang/nl_NL.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/nl_NL.h b/src/lang/nl_NL.h
index 429d0b5d..e05b7f08 100644
--- a/src/lang/nl_NL.h
+++ b/src/lang/nl_NL.h
@@ -10,7 +10,7 @@
#define D_NO "Nee"
#define D_ERROR_OUT_OF_MEMORY "Geen geheugen bechikbaar"
-#define D_ERROR_UNKNOWN "Onbekende fout"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Instellingen ongewijzigd"
#define D_CONFIG_CHANGED "Instellingen gewijzigd"
From 9b24d43aa3184e8f5ffe3dd2879e953ebb5d4c2a Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:19 +0200
Subject: [PATCH 41/90] New translations en_US.h (Portuguese)
---
src/lang/pt_PT.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/pt_PT.h b/src/lang/pt_PT.h
index 3fae3d94..5aec6427 100644
--- a/src/lang/pt_PT.h
+++ b/src/lang/pt_PT.h
@@ -10,7 +10,7 @@
#define D_NO "Não"
#define D_ERROR_OUT_OF_MEMORY "Memória Cheia"
-#define D_ERROR_UNKNOWN "Erro desconhecido"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Sem alterações na configuração"
#define D_CONFIG_CHANGED "Configuração alterada"
From 5511d5864bca6fdc74ebd620a25ddfc8feab6f7c Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:20 +0200
Subject: [PATCH 42/90] New translations en_US.h (Chinese Simplified)
---
src/lang/zh_CN.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/zh_CN.h b/src/lang/zh_CN.h
index 37558021..d9f83733 100644
--- a/src/lang/zh_CN.h
+++ b/src/lang/zh_CN.h
@@ -10,7 +10,7 @@
#define D_NO "No"
#define D_ERROR_OUT_OF_MEMORY "Out of memory"
-#define D_ERROR_UNKNOWN "Unkown error"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Settings did not change"
#define D_CONFIG_CHANGED "Settings changed"
From 46a8f6e3b9fcf2652b67447d2e6d01d278d3219b Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Sun, 16 Jul 2023 16:15:21 +0200
Subject: [PATCH 43/90] New translations en_US.h (Portuguese, Brazilian)
---
src/lang/pt_BR.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/pt_BR.h b/src/lang/pt_BR.h
index bbe134fc..b4fe9601 100644
--- a/src/lang/pt_BR.h
+++ b/src/lang/pt_BR.h
@@ -10,7 +10,7 @@
#define D_NO "No"
#define D_ERROR_OUT_OF_MEMORY "Out of memory"
-#define D_ERROR_UNKNOWN "Unkown error"
+#define D_ERROR_UNKNOWN "Unknown error"
#define D_CONFIG_NOT_CHANGED "Settings did not change"
#define D_CONFIG_CHANGED "Settings changed"
From a79067946656c600752d0de5a269df751459caa6 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Tue, 18 Jul 2023 15:18:33 +0200
Subject: [PATCH 44/90] Add Elecrow ESP-Terminal SPI and RGB
---
.github/workflows/build.yaml | 6 ++++--
src/drv/tft/tft_driver_lovyangfx.cpp | 28 ++++++++++++++++++----------
2 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 3ff2e45c..a3999b15 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -32,10 +32,10 @@ jobs:
out: d1-r32-espduino32
- env: d1-r32-unoshield_ili9486_adc
out: d1-r32-espduino32
- - out: waveshare
- env: "esp32-one_ili9486 -e esp32-one_st7796"
- out: dustinwatts
env: "freetouchdeck_4MB -e freetouchdeck_8MB -e esp32-touchdown"
+ - out: elecrow
+ env: "esp-terminal-rgb_16MB -e esp-terminal-spi_16MB"
- out: globalsecurity
env: gs-t3e_16MB
- out: lanbon
@@ -52,6 +52,8 @@ jobs:
env: "panlee-zw3d95ce01s-ar-4848_16MB -e panlee-zw3d95ce01s-ur-4848_16MB"
- out: sunton
env: "esp32-2432s028r_4MB -e esp32-3248s035c_4MB -e esp32-3248s035r_4MB -e sunton-4827s043c_16MB -e sunton-8048s043c_16MB -e sunton-8048s050c_16MB -e sunton-8048s070c_16MB"
+ - out: waveshare
+ env: "esp32-one_ili9486 -e esp32-one_st7796"
- out: wireless-tag
env: "wt32-sc01_4MB -e wt32-sc01_16MB -e wt-86-32-3zw1 -e wt32-sc01-plus_8MB -e wt32-sc01-plus_16MB"
- out: yeacreate
diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp
index 9469f603..d783a2d7 100644
--- a/src/drv/tft/tft_driver_lovyangfx.cpp
+++ b/src/drv/tft/tft_driver_lovyangfx.cpp
@@ -57,7 +57,7 @@ static uint32_t _read_panel_id(lgfx::Bus_SPI* bus, int32_t pin_cs, uint32_t cmd
return res;
}
-#if defined(ESP32S2) || defined(ESP32S3)
+#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
static lgfx::Bus_Parallel16* init_parallel_16_bus(Preferences* prefs, int8_t data_pins[], uint8_t num)
{
lgfx::Bus_Parallel16* bus = new lgfx::v1::Bus_Parallel16();
@@ -85,7 +85,7 @@ static lgfx::Bus_Parallel16* init_parallel_16_bus(Preferences* prefs, int8_t dat
LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__);
return bus;
}
-#endif // ESP32S2
+#endif // ESP32S2/S3
static lgfx::Bus_Parallel8* init_parallel_8_bus(Preferences* prefs, int8_t data_pins[], uint8_t num)
{
@@ -223,9 +223,17 @@ static void configure_panel(lgfx::Panel_Device* panel, Preferences* prefs)
#else
cfg.rgb_order = prefs->getBool("rgb_order", false); // true if the red and blue of the panel are swapped
#endif
- cfg.dlen_16bit = prefs->getBool("dlen_16bit", false); // true for panels that send data length in 16-bit units
- cfg.bus_shared = prefs->getBool("bus_shared", true); // true if the bus is shared with the SD card
- // (bus control is performed with drawJpgFile etc.)
+
+ bool dlen_16bit = false;
+#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
+ if(panel->getBus()) {
+ lgfx::v1::bus_type_t bus_type = panel->getBus()->busType();
+ if(bus_type == lgfx::v1::bus_parallel16) dlen_16bit = true;
+ }
+#endif
+ cfg.dlen_16bit = prefs->getBool("dlen_16bit", dlen_16bit); // true for panels that send data length in 16-bit units
+ cfg.bus_shared = prefs->getBool("bus_shared", true); // true if the bus is shared with the SD card
+ // (bus control is performed with drawJpgFile etc.)
panel->config(cfg);
}
@@ -240,7 +248,7 @@ lgfx::IBus* _init_bus(Preferences* preferences)
for(uint8_t i = 0; i < 16; i++) {
snprintf(key, sizeof(key), "d%d", i + 1);
data_pins[i] = preferences->getInt(key, data_pins[i]);
- LOG_DEBUG(TAG_TFT, F("D%d: %d"), i + 1, data_pins[i]);
+ LOG_DEBUG(TAG_TFT, F("D%d: %d"), i, data_pins[i]);
}
LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__);
@@ -252,13 +260,13 @@ lgfx::IBus* _init_bus(Preferences* preferences)
}
LOG_DEBUG(TAG_TFT, F("%s - %d"), __FILE__, __LINE__);
-#if defined(ESP32S2)
+#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
if(is_16bit) {
is_8bit = false;
LOG_VERBOSE(TAG_TFT, F("16-bit TFT bus"));
return init_parallel_16_bus(preferences, data_pins, 16);
} else
-#endif // ESP32S2
+#endif // ESP32S2/S3
if(is_8bit) {
is_16bit = false;
LOG_VERBOSE(TAG_TFT, F("8-bit TFT bus"));
@@ -1012,7 +1020,7 @@ void LovyanGfx::show_info()
tftPinInfo(F("TFT_D7"), cfg.pin_d7);
}
-#if defined(ESP32S2) || defined(ESP32S3)
+#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
if(bus_type == lgfx::v1::bus_parallel16) {
LOG_VERBOSE(TAG_TFT, F("Interface : Parallel 16bit"));
auto bus = (lgfx::v1::Bus_Parallel16*)panel->getBus();
@@ -1144,7 +1152,7 @@ bool LovyanGfx::is_driver_pin(uint8_t pin)
pin == cfg.pin_d7)
return true;
-#if defined(ESP32S2) || defined(ESP32S3)
+#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
} else if(bus_type == lgfx::v1::bus_parallel16) {
auto bus = (lgfx::v1::Bus_Parallel16*)panel->getBus();
auto cfg = bus->config(); // Get the structure for bus configuration.
From ed56d9ee42daab0888b84c2175de5d3ea8850a02 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Tue, 18 Jul 2023 15:51:13 +0200
Subject: [PATCH 45/90] Update CHANGELOG and libraries
---
CHANGELOG.md | 8 +++++---
include/lv_conf_v7.h | 2 +-
platformio.ini | 4 ++--
src/drv/touch/touch_driver_lovyangfx.h | 4 ++--
user_setups/esp32/_esp32.ini | 4 ++--
5 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d808285c..654822af 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -36,12 +36,14 @@
- Add configuration for NTP servers and timezone
### Devices
+- Add Elecrow ESP32-Terminal 3.5" SPI and RGB
- Add GS-T3E Smart Panel
- Add Lilygo Ttgo Lily Pi ESP32
- Add Makerfabs ESP32-S3 SPI
- Add Sunton ESP32-S3 TFT 4.3", 5.0" and 7.0"
- Add Sunton ESP32-2432S028R ESP32-3248S035C ESP32-3248S035R
-- Add support for Wireless-Tag WT32-SC01 Plus and WT-86-32-3ZW1
+- Add support for Wireless-Tag WT32-SC01 Plus and WT32S3-86V
+- Deprecate support for WT-86-32-3ZW1 with ESP32-S2
## Bug fixes
- Fix for first touch not working properly
@@ -50,10 +52,10 @@
### Architecture
- Moved to Tasmota Arduino 2.0.10 and ESP-IDF 4.4.5 (thanks @Jason2866)
- Add Arduino-GFX display driver
-- Add support for ESP32-S3 devices
+- Add support for ESP32-S3 and ESP32-C3 devices
- Deprecation of support for ESP32-S2 devices due to lack of sRAM
-Updated libraries to ArduinoJson 6.21.2, ArduinoStreamUtils 1.7.0, TFT_eSPI 2.5.0, LovyanGFX 1.1.7 and SimpleFTPServer 2.1.5
+Updated libraries to ArduinoJson 6.21.2, ArduinoStreamUtils 1.7.3, AceButton 1.10.1, TFT_eSPI 2.5.0, LovyanGFX 1.1.7 and Adafruit STMPE610 1.1.5 and SimpleFTPServer 2.1.5
## v0.6.3
diff --git a/include/lv_conf_v7.h b/include/lv_conf_v7.h
index 0c7945f6..489f0c80 100644
--- a/include/lv_conf_v7.h
+++ b/include/lv_conf_v7.h
@@ -254,7 +254,7 @@ typedef void* lv_fs_drv_user_data_t;
#define LV_IMG_CACHE_DEF_SIZE 1
#endif
#ifndef LV_IMG_CACHE_DEF_SIZE_PSRAM
-#define LV_IMG_CACHE_DEF_SIZE_PSRAM 20 // special openHASP setting when PSRAM is used
+#define LV_IMG_CACHE_DEF_SIZE_PSRAM 12 // special openHASP setting when PSRAM is used
#endif
/*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/
diff --git a/platformio.ini b/platformio.ini
index e62cc807..34ad2692 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -75,7 +75,7 @@ build_flags =
-D HASP_VER_MAJ=0
-D HASP_VER_MIN=7
;-D HASP_VER_REV=4
- -D HASP_VER_REV=0-rc5
+ -D HASP_VER_REV=0-rc6
;-D HASP_VER_REV=4-rc1
${override.build_flags}
@@ -130,4 +130,4 @@ lib_deps =
[stmpe610]
lib_deps =
- adafruit/Adafruit STMPE610@^1.1.4
\ No newline at end of file
+ adafruit/Adafruit STMPE610@^1.1.5
\ No newline at end of file
diff --git a/src/drv/touch/touch_driver_lovyangfx.h b/src/drv/touch/touch_driver_lovyangfx.h
index af6d56d4..21302165 100644
--- a/src/drv/touch/touch_driver_lovyangfx.h
+++ b/src/drv/touch/touch_driver_lovyangfx.h
@@ -48,8 +48,8 @@ class TouchLovyanGfx : public BaseTouch {
void init(int w, int h)
{
#if defined(TOUCH_SDA) && defined(TOUCH_SCL) && defined(I2C_TOUCH_FREQUENCY)
- Wire.begin(TOUCH_SDA, TOUCH_SCL, (uint32_t)I2C_TOUCH_FREQUENCY);
- touch_scan(Wire);
+ // Wire.begin(TOUCH_SDA, TOUCH_SCL, (uint32_t)I2C_TOUCH_FREQUENCY);
+ // touch_scan(Wire);
#endif
}
diff --git a/user_setups/esp32/_esp32.ini b/user_setups/esp32/_esp32.ini
index 78ce0d70..4f0a6f24 100644
--- a/user_setups/esp32/_esp32.ini
+++ b/user_setups/esp32/_esp32.ini
@@ -94,8 +94,8 @@ lib_deps =
${env.lib_deps}
git+https://github.com/fvanroie/ConsoleInput.git#dev
; lorol/LittleFS_esp32@^1.0.6 ; for Arduino v1 only
- bxparks/AceButton@^1.9.2 ; GPIO button library
- bblanchon/StreamUtils@^1.6.3 ; for EEPromStream and BufferedTelnetClient
+ bxparks/AceButton@^1.10.1 ; GPIO button library
+ bblanchon/StreamUtils@^1.7.3 ; for EEPromStream and BufferedTelnetClient
; knolleary/PubSubClient@^2.8.0 ; MQTT client
extra_scripts =
From dbe3d7e5fb10bba05a8fa33170f2152ccb3bc844 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Tue, 18 Jul 2023 16:14:48 +0200
Subject: [PATCH 46/90] Revent Adafruit STMPE610 to v1.1.4
---
CHANGELOG.md | 2 +-
platformio.ini | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 654822af..62f496a7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -55,7 +55,7 @@
- Add support for ESP32-S3 and ESP32-C3 devices
- Deprecation of support for ESP32-S2 devices due to lack of sRAM
-Updated libraries to ArduinoJson 6.21.2, ArduinoStreamUtils 1.7.3, AceButton 1.10.1, TFT_eSPI 2.5.0, LovyanGFX 1.1.7 and Adafruit STMPE610 1.1.5 and SimpleFTPServer 2.1.5
+Updated libraries to ArduinoJson 6.21.2, ArduinoStreamUtils 1.7.3, AceButton 1.10.1, TFT_eSPI 2.5.0, LovyanGFX 1.1.7 and SimpleFTPServer 2.1.5
## v0.6.3
diff --git a/platformio.ini b/platformio.ini
index 34ad2692..398280df 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -130,4 +130,4 @@ lib_deps =
[stmpe610]
lib_deps =
- adafruit/Adafruit STMPE610@^1.1.5
\ No newline at end of file
+ adafruit/Adafruit STMPE610@^1.1.4
\ No newline at end of file
From 2e5324192bbc0fd169c747320def654966ac900a Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Tue, 18 Jul 2023 17:35:16 +0200
Subject: [PATCH 47/90] Rename to ESP32-Terminal
---
.github/workflows/build.yaml | 2 +-
user_setups/esp32s3/esp-terminal.ini | 89 ----------------------------
2 files changed, 1 insertion(+), 90 deletions(-)
delete mode 100644 user_setups/esp32s3/esp-terminal.ini
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index a3999b15..ec57bec6 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -35,7 +35,7 @@ jobs:
- out: dustinwatts
env: "freetouchdeck_4MB -e freetouchdeck_8MB -e esp32-touchdown"
- out: elecrow
- env: "esp-terminal-rgb_16MB -e esp-terminal-spi_16MB"
+ env: "esp32-terminal-rgb_16MB -e esp32-terminal-spi_16MB"
- out: globalsecurity
env: gs-t3e_16MB
- out: lanbon
diff --git a/user_setups/esp32s3/esp-terminal.ini b/user_setups/esp32s3/esp-terminal.ini
deleted file mode 100644
index e6615021..00000000
--- a/user_setups/esp32s3/esp-terminal.ini
+++ /dev/null
@@ -1,89 +0,0 @@
-;***************************************************;
-; Elecrow ESP32-S3 Terminal ;
-; - ili9488 TFT SPI 4-WIRE or 16-bit RGB ;
-; - ft6236 touch controller ;
-;***************************************************;
-
-[esp-terminal]
-extends = arduino_esp32s3_v2
-board = esp32-s3-devkitc-1
-board_build.arduino.memory_type = qio_opi
-
-build_flags =
- ${arduino_esp32s3_v2.build_flags}
- ${esp32s3.ps_ram}
-
-;region -- TFT_eSPI build options ------------------------
- ;-D USER_SETUP_LOADED=1
- -D LGFX_USE_V1=1
- -D ILI9488_DRIVER=1
- -D TFT_ROTATION=0 ; 0=0, 1=90, 2=180 or 3=270 degree
- -D TFT_WIDTH=320
- -D TFT_HEIGHT=480
- -D TFT_RST=-1 ;// Reset pin (could connect to RST pin)
- -D TFT_BCKL=46 ; Configurable via web UI (e.g. 2 for D4)
- -D HASP_USE_LGFX_TOUCH=1
- -D TOUCH_DRIVER=0x6336
- -D TOUCH_IRQ=-1
- -D I2C_TOUCH_PORT=0
- -D I2C_TOUCH_ADDRESS=0x38
- -D I2C_TOUCH_FREQUENCY=400000
- -D SPI_TOUCH_FREQUENCY=0
-;endregion
-
-lib_deps =
- ${arduino_esp32s3_v2.lib_deps}
- ${lovyangfx.lib_deps}
-
-[esp-terminal-spi]
-extends = esp-terminal
-
-build_flags =
- -D HASP_MODEL="ESP32-S3 Terminal SPI"
- ${esp-terminal.build_flags}
- -D TFT_MISO=14
- -D TFT_MOSI=13
- -D TFT_SCLK=12
- -D TFT_CS=03 ;// Chip select control pin
- -D TFT_DC=42 ;// Data Command control pin
- -D SPI_FREQUENCY=60000000
- -D SPI_READ_FREQUENCY=16000000
- -D TFT_DMA_CHANNEL=1
- -D TOUCH_SDA=02
- -D TOUCH_SCL=01
-
-[esp-terminal-rgb]
-extends = esp-terminal
-
-build_flags =
- -D HASP_MODEL="ESP32-S3 Terminal RGB"
- ${esp-terminal.build_flags}
-
- -D TFT_WR=18
- -D TFT_RD=48
- -D TFT_DC=45
- -D TFT_D0=47
- -D TFT_D1=21
- -D TFT_D2=14
- -D TFT_D3=13
- -D TFT_D4=12
- -D TFT_D5=11
- -D TFT_D6=10
- -D TFT_D7=9
- -D TFT_D8=3
- -D TFT_D9=8
- -D TFT_D10=16
- -D TFT_D11=15
- -D TFT_D12=7
- -D TFT_D13=6
- -D TFT_D14=5
- -D TFT_D15=4
- -D SPI_FREQUENCY=80000000
- -D TOUCH_SDA=38
- -D TOUCH_SCL=39
-
-[env:esp-terminal-spi_16MB]
-extends = esp-terminal-spi, flash_16mb
-
-[env:esp-terminal-rgb_16MB]
-extends = esp-terminal-rgb, flash_16mb
From 2f4092b39e49bab659d825cf0e1d3e078e57f148 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Tue, 18 Jul 2023 17:35:30 +0200
Subject: [PATCH 48/90] Rename to ESP32-Terminal
---
user_setups/esp32s3/esp32-terminal.ini | 89 ++++++++++++++++++++++++++
1 file changed, 89 insertions(+)
create mode 100644 user_setups/esp32s3/esp32-terminal.ini
diff --git a/user_setups/esp32s3/esp32-terminal.ini b/user_setups/esp32s3/esp32-terminal.ini
new file mode 100644
index 00000000..5a2babe2
--- /dev/null
+++ b/user_setups/esp32s3/esp32-terminal.ini
@@ -0,0 +1,89 @@
+;***************************************************;
+; Elecrow ESP32-S3 Terminal ;
+; - ili9488 TFT SPI 4-WIRE or 16-bit RGB ;
+; - ft6236 touch controller ;
+;***************************************************;
+
+[esp32-terminal]
+extends = arduino_esp32s3_v2
+board = esp32-s3-devkitc-1
+board_build.arduino.memory_type = qio_opi
+
+build_flags =
+ ${arduino_esp32s3_v2.build_flags}
+ ${esp32s3.ps_ram}
+
+;region -- TFT_eSPI build options ------------------------
+ ;-D USER_SETUP_LOADED=1
+ -D LGFX_USE_V1=1
+ -D ILI9488_DRIVER=1
+ -D TFT_ROTATION=0 ; 0=0, 1=90, 2=180 or 3=270 degree
+ -D TFT_WIDTH=320
+ -D TFT_HEIGHT=480
+ -D TFT_RST=-1 ;// Reset pin (could connect to RST pin)
+ -D TFT_BCKL=46 ; Configurable via web UI (e.g. 2 for D4)
+ -D HASP_USE_LGFX_TOUCH=1
+ -D TOUCH_DRIVER=0x6336
+ -D TOUCH_IRQ=-1
+ -D I2C_TOUCH_PORT=0
+ -D I2C_TOUCH_ADDRESS=0x38
+ -D I2C_TOUCH_FREQUENCY=400000
+ -D SPI_TOUCH_FREQUENCY=0
+;endregion
+
+lib_deps =
+ ${arduino_esp32s3_v2.lib_deps}
+ ${lovyangfx.lib_deps}
+
+[esp32-terminal-spi]
+extends = esp32-terminal
+
+build_flags =
+ -D HASP_MODEL="ESP32-Terminal SPI"
+ ${esp32-terminal.build_flags}
+ -D TFT_MISO=14
+ -D TFT_MOSI=13
+ -D TFT_SCLK=12
+ -D TFT_CS=03 ;// Chip select control pin
+ -D TFT_DC=42 ;// Data Command control pin
+ -D SPI_FREQUENCY=60000000
+ -D SPI_READ_FREQUENCY=16000000
+ -D TFT_DMA_CHANNEL=1
+ -D TOUCH_SDA=02
+ -D TOUCH_SCL=01
+
+[esp32-terminal-rgb]
+extends = esp32-terminal
+
+build_flags =
+ -D HASP_MODEL="ESP32-Terminal RGB"
+ ${esp32-terminal.build_flags}
+
+ -D TFT_WR=18
+ -D TFT_RD=48
+ -D TFT_DC=45
+ -D TFT_D0=47
+ -D TFT_D1=21
+ -D TFT_D2=14
+ -D TFT_D3=13
+ -D TFT_D4=12
+ -D TFT_D5=11
+ -D TFT_D6=10
+ -D TFT_D7=9
+ -D TFT_D8=3
+ -D TFT_D9=8
+ -D TFT_D10=16
+ -D TFT_D11=15
+ -D TFT_D12=7
+ -D TFT_D13=6
+ -D TFT_D14=5
+ -D TFT_D15=4
+ -D SPI_FREQUENCY=80000000
+ -D TOUCH_SDA=38
+ -D TOUCH_SCL=39
+
+[env:esp32-terminal-spi_16MB]
+extends = esp32-terminal-spi, flash_16mb
+
+[env:esp32-terminal-rgb_16MB]
+extends = esp32-terminal-rgb, flash_16mb
From 4e5114a01b3aa2e24e9be842b69cc7a81b54da5c Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sun, 23 Jul 2023 16:20:39 +0200
Subject: [PATCH 49/90] Add SenseCAP Indicator D1
---
.../Arduino_RGB_Display_mod.h | 136 +++++++++
.../Arduino_PCA9535SWSPI.cpp | 269 ++++++++++++++++++
.../Arduino_PCA9535SWSPI.h | 57 ++++
src/drv/tft/tft_defines.h | 4 +
src/drv/tft/tft_driver_arduinogfx.cpp | 20 +-
src/drv/touch/touch_driver_ft6336u.h | 26 +-
user_setups/esp32s3/sensecap-indicator.ini | 92 ++++++
7 files changed, 600 insertions(+), 4 deletions(-)
create mode 100644 src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
create mode 100644 src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h
create mode 100644 user_setups/esp32s3/sensecap-indicator.ini
diff --git a/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h b/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h
index 7aa1e8e0..f0cea72f 100644
--- a/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h
+++ b/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h
@@ -11,6 +11,142 @@
#include "Arduino_GFX.h"
#include "Arduino_RGBPanel_mod.h"
+
+static const uint8_t st7701_sensecap_indicator_init_operations[] = {
+ BEGIN_WRITE,
+ WRITE_COMMAND_8, 0xFF,
+ WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x10,
+
+ WRITE_C8_D16, 0xC0, 0x3B, 0x00,
+ WRITE_C8_D16, 0xC1, 0x0D, 0x02,
+ WRITE_C8_D16, 0xC2, 0x31, 0x05,
+ WRITE_C8_D8, 0xC7, 0x04,
+ WRITE_C8_D8, 0xCD, 0x08,
+
+ WRITE_COMMAND_8, 0xB0, // Positive Voltage Gamma Control
+ WRITE_BYTES, 16,
+ 0x00, 0x11, 0x18, 0x0E,
+ 0x11, 0x06, 0x07, 0x08,
+ 0x07, 0x22, 0x04, 0x12,
+ 0x0F, 0xAA, 0x31, 0x18,
+
+ END_WRITE,
+ BEGIN_WRITE,
+
+ WRITE_COMMAND_8, 0xB1, // Negative Voltage Gamma Control
+ WRITE_BYTES, 16,
+ 0x00, 0x11, 0x19, 0x0E,
+ 0x12, 0x07, 0x08, 0x08,
+ 0x08, 0x22, 0x04, 0x11,
+ 0x11, 0xA9, 0x32, 0x18,
+
+ // PAGE1
+ WRITE_COMMAND_8, 0xFF,
+ WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x11,
+
+ WRITE_C8_D8, 0xB0, 0x60, // Vop=4.7375v
+ WRITE_C8_D8, 0xB1, 0x32, // VCOM=32
+ WRITE_C8_D8, 0xB2, 0x07, // VGH=15v
+ WRITE_C8_D8, 0xB3, 0x80,
+ WRITE_C8_D8, 0xB5, 0x49, // VGL=-10.17v
+ WRITE_C8_D8, 0xB7, 0x85,
+ WRITE_C8_D8, 0xB8, 0x21, // AVDD=6.6 & AVCL=-4.6
+ WRITE_C8_D8, 0xC1, 0x78,
+ WRITE_C8_D8, 0xC2, 0x78,
+
+ END_WRITE,
+ DELAY, 20,
+ BEGIN_WRITE,
+
+ WRITE_COMMAND_8, 0xE0,
+ WRITE_BYTES, 3, 0x00, 0x1B, 0x02,
+
+ WRITE_COMMAND_8, 0xE1,
+ WRITE_BYTES, 11,
+ 0x08, 0xA0, 0x00, 0x00,
+ 0x07, 0xA0, 0x00, 0x00,
+ 0x00, 0x44, 0x44,
+
+ WRITE_COMMAND_8, 0xE2,
+ WRITE_BYTES, 12,
+ 0x11, 0x11, 0x44, 0x44,
+ 0xED, 0xA0, 0x00, 0x00,
+ 0xEC, 0xA0, 0x00, 0x00,
+
+ END_WRITE,
+ BEGIN_WRITE,
+
+ WRITE_COMMAND_8, 0xE3,
+ WRITE_BYTES, 4, 0x00, 0x00, 0x11, 0x11,
+
+ WRITE_C8_D16, 0xE4, 0x44, 0x44,
+
+ WRITE_COMMAND_8, 0xE5,
+ WRITE_BYTES, 16,
+ 0x0A, 0xE9, 0xD8, 0xA0,
+ 0x0C, 0xEB, 0xD8, 0xA0,
+ 0x0E, 0xED, 0xD8, 0xA0,
+ 0x10, 0xEF, 0xD8, 0xA0,
+
+ WRITE_COMMAND_8, 0xE6,
+ WRITE_BYTES, 4, 0x00, 0x00, 0x11, 0x11,
+
+ WRITE_C8_D16, 0xE7, 0x44, 0x44,
+
+ END_WRITE,
+ BEGIN_WRITE,
+
+ WRITE_COMMAND_8, 0xE8,
+ WRITE_BYTES, 16,
+ 0x09, 0xE8, 0xD8, 0xA0,
+ 0x0B, 0xEA, 0xD8, 0xA0,
+ 0x0D, 0xEC, 0xD8, 0xA0,
+ 0x0F, 0xEE, 0xD8, 0xA0,
+
+ WRITE_COMMAND_8, 0xEB,
+ WRITE_BYTES, 7,
+ 0x02, 0x00, 0xE4, 0xE4,
+ 0x88, 0x00, 0x40,
+
+ WRITE_C8_D16, 0xEC, 0x3C, 0x00,
+
+ WRITE_COMMAND_8, 0xED,
+ WRITE_BYTES, 16,
+ 0xAB, 0x89, 0x76, 0x54,
+ 0x02, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x20,
+ 0x45, 0x67, 0x98, 0xBA,
+
+ WRITE_C8_D8, 0x36, 0x10,
+
+ END_WRITE,
+ BEGIN_WRITE,
+
+ //-----------VAP & VAN---------------
+ WRITE_COMMAND_8, 0xFF,
+ WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x13,
+
+ WRITE_C8_D8, 0xE5, 0xE4,
+
+ WRITE_COMMAND_8, 0xFF,
+ WRITE_BYTES, 5, 0x77, 0x01, 0x00, 0x00, 0x00,
+
+ WRITE_COMMAND_8, 0x21, // 0x20 normal, 0x21 IPS
+ WRITE_C8_D8, 0x3A, 0x60, // 0x70 RGB888, 0x60 RGB666, 0x50 RGB565
+
+ WRITE_COMMAND_8, 0x11, // Sleep Out
+ END_WRITE,
+
+ DELAY, 120,
+
+ BEGIN_WRITE,
+ WRITE_COMMAND_8, 0x29, // Display On
+ END_WRITE,
+
+ DELAY, 120,
+};
+
+
class Arduino_RGB_Display_Mod : public Arduino_GFX{
public:
Arduino_RGB_Display_Mod(
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
new file mode 100644
index 00000000..28463861
--- /dev/null
+++ b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
@@ -0,0 +1,269 @@
+#include "Arduino_PCA9535SWSPI.h"
+#include "driver/gpio.h"
+#include "hasplib.h"
+
+Arduino_PCA9535SWSPI::Arduino_PCA9535SWSPI(int8_t sda, int8_t scl, int8_t pwd, int8_t cs, int8_t sck, int8_t mosi, TwoWire *wire)
+ : _sda(sda), _scl(scl), _pwd(pwd), _cs(cs), _sck(sck), _mosi(mosi), _wire(wire)
+{
+}
+
+bool Arduino_PCA9535SWSPI::begin(int32_t speed, int8_t dataMode)
+{
+ UNUSED(speed);
+ UNUSED(dataMode);
+
+ _address = PCA9535_IIC_ADDRESS;
+ _wire->beginTransmission(_address);
+ if (!_wire->endTransmission())
+ {
+ LOG_INFO(TAG_DRVR, "Found xl9535");
+ is_found = true;
+ // this->pinMode8(0, 0xFF, OUTPUT);
+ if (_pwd != GFX_NOT_DEFINED)
+ {
+ this->pinMode(_pwd, OUTPUT);
+ this->digitalWrite(_pwd, 1);
+ }
+ this->pinMode(_cs, OUTPUT);
+ this->digitalWrite(_cs, 1);
+ this->pinMode(_sck, OUTPUT);
+ this->digitalWrite(_sck, 1);
+ this->pinMode(_mosi, OUTPUT);
+ this->digitalWrite(_mosi, 1);
+ }
+ else
+ {
+ LOG_INFO(TAG_DRVR, "xl9535 not found");
+ is_found = false;
+ }
+
+ return is_found;
+}
+
+void Arduino_PCA9535SWSPI::beginWrite()
+{
+ this->digitalWrite(_cs, 0);
+}
+
+void Arduino_PCA9535SWSPI::endWrite()
+{
+ this->digitalWrite(_cs, 1);
+}
+
+void Arduino_PCA9535SWSPI::writeCommand(uint8_t c)
+{
+ // D/C bit, command
+ this->digitalWrite(_mosi, 0);
+ this->digitalWrite(_sck, 0);
+ this->digitalWrite(_sck, 1);
+
+ uint8_t bit = 0x80;
+ while (bit)
+ {
+ if (c & bit)
+ {
+ this->digitalWrite(_mosi, 1);
+ }
+ else
+ {
+ this->digitalWrite(_mosi, 0);
+ }
+ this->digitalWrite(_sck, 0);
+ bit >>= 1;
+ this->digitalWrite(_sck, 1);
+ }
+}
+
+void Arduino_PCA9535SWSPI::writeCommand16(uint16_t)
+{
+}
+
+void Arduino_PCA9535SWSPI::write(uint8_t d)
+{
+ // D/C bit, data
+ this->digitalWrite(_mosi, 1);
+ this->digitalWrite(_sck, 0);
+ this->digitalWrite(_sck, 1);
+
+ uint8_t bit = 0x80;
+ while (bit)
+ {
+ if (d & bit)
+ {
+ this->digitalWrite(_mosi, 1);
+ }
+ else
+ {
+ this->digitalWrite(_mosi, 0);
+ }
+ this->digitalWrite(_sck, 0);
+ bit >>= 1;
+ this->digitalWrite(_sck, 1);
+ }
+}
+
+void Arduino_PCA9535SWSPI::write16(uint16_t)
+{
+ // not implemented
+}
+
+void Arduino_PCA9535SWSPI::writeRepeat(uint16_t p, uint32_t len)
+{
+ // not implemented
+}
+
+void Arduino_PCA9535SWSPI::writePixels(uint16_t *data, uint32_t len)
+{
+ // not implemented
+}
+
+#if !defined(LITTLE_FOOT_PRINT)
+void Arduino_PCA9535SWSPI::writeBytes(uint8_t *data, uint32_t len)
+{
+ // not implemented
+}
+#endif // !defined(LITTLE_FOOT_PRINT)
+
+void Arduino_PCA9535SWSPI::writeRegister(uint8_t reg, uint8_t *data, size_t len)
+{
+ _wire->beginTransmission(_address);
+ _wire->write(reg);
+ for (size_t i = 0; i < len; i++)
+ {
+ _wire->write(data[i]);
+ }
+ _wire->endTransmission();
+}
+
+uint8_t Arduino_PCA9535SWSPI::readRegister(uint8_t reg, uint8_t *data, size_t len)
+{
+ _wire->beginTransmission(_address);
+ _wire->write(reg);
+ _wire->endTransmission();
+ _wire->requestFrom(_address, len);
+ size_t index = 0;
+ while (index < len)
+ data[index++] = _wire->read();
+ return 0;
+}
+
+void Arduino_PCA9535SWSPI::pinMode(uint8_t pin, uint8_t mode)
+{
+ if (is_found)
+ {
+ uint8_t port = 0;
+ if (pin > 15)
+ {
+ gpio_set_direction((gpio_num_t)pin, mode == OUTPUT ? GPIO_MODE_OUTPUT : GPIO_MODE_INPUT);
+ }
+ else if (pin > 7)
+ {
+ this->readRegister(PCA9535_CONFIG_PORT_1_REG, &port, 1);
+ if (mode == OUTPUT)
+ {
+ port = port & (~(1 << (pin - 10)));
+ }
+ else
+ {
+ port = port | (1 << (pin - 10));
+ }
+ this->writeRegister(PCA9535_CONFIG_PORT_1_REG, &port, 1);
+ }
+ else
+ {
+ this->readRegister(PCA9535_CONFIG_PORT_0_REG, &port, 1);
+ if (mode == OUTPUT)
+ {
+ port = port & (~(1 << pin));
+ }
+ else
+ {
+ port = port | (1 << pin);
+ }
+ this->writeRegister(PCA9535_CONFIG_PORT_0_REG, &port, 1);
+ }
+ }
+ else
+ {
+ LOG_INFO(TAG_DRVR, "xl9535 not found");
+ }
+}
+void Arduino_PCA9535SWSPI::pinMode8(uint8_t port, uint8_t pin, uint8_t mode)
+{
+ if (is_found)
+ {
+ uint8_t _pin = (mode != OUTPUT) ? pin : ~pin;
+ if (port)
+ {
+ this->writeRegister(PCA9535_CONFIG_PORT_1_REG, &_pin, 1);
+ }
+ else
+ {
+ this->writeRegister(PCA9535_CONFIG_PORT_0_REG, &_pin, 1);
+ }
+ }
+ else
+ {
+ LOG_INFO(TAG_DRVR, "xl9535 not found");
+ }
+}
+
+void Arduino_PCA9535SWSPI::digitalWrite(uint8_t pin, uint8_t val)
+{
+ if (is_found)
+ {
+ uint8_t port = 0;
+ uint8_t reg_data = 0;
+ if (pin > 15)
+ {
+ gpio_set_level((gpio_num_t)pin, val);
+ }
+ else if (pin > 7)
+ {
+ this->readRegister(PCA9535_OUTPUT_PORT_1_REG, ®_data, 1);
+ reg_data = reg_data & (~(1 << (pin - 10)));
+ port = reg_data | val << (pin - 10);
+ this->writeRegister(PCA9535_OUTPUT_PORT_1_REG, &port, 1);
+ }
+ else
+ {
+ this->readRegister(PCA9535_OUTPUT_PORT_0_REG, ®_data, 1);
+ reg_data = reg_data & (~(1 << pin));
+ port = reg_data | val << pin;
+ this->writeRegister(PCA9535_OUTPUT_PORT_0_REG, &port, 1);
+ }
+ }
+ else
+ {
+ LOG_INFO(TAG_DRVR, "xl9535 not found");
+ }
+}
+
+int Arduino_PCA9535SWSPI::digitalRead(uint8_t pin)
+{
+ if (is_found)
+ {
+ int state = 0;
+ uint8_t port = 0;
+ if (pin > 15)
+ {
+ state = gpio_get_level((gpio_num_t)pin);
+ }
+ else if (pin > 7)
+ {
+ this->readRegister(PCA9535_INPUT_PORT_1_REG, &port, 1);
+ state = port & (pin - 10) ? 1 : 0;
+ }
+ else
+ {
+ this->readRegister(PCA9535_INPUT_PORT_0_REG, &port, 1);
+ state = port & pin ? 1 : 0;
+ }
+ return state;
+ }
+ else
+ {
+ LOG_INFO(TAG_DRVR, "xl9535 not found");
+ }
+ return 0;
+}
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h
new file mode 100644
index 00000000..1a60a076
--- /dev/null
+++ b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h
@@ -0,0 +1,57 @@
+#ifndef _Arduino_PCA9535SWSPI_H_
+#define _Arduino_PCA9535SWSPI_H_
+
+#include
+
+#include "Arduino_DataBus.h"
+
+#define PCA9535_IIC_ADDRESS 0X20
+
+#define PCA9535_INPUT_PORT_0_REG 0X00
+#define PCA9535_INPUT_PORT_1_REG 0X01
+#define PCA9535_OUTPUT_PORT_0_REG 0X02
+#define PCA9535_OUTPUT_PORT_1_REG 0X03
+#define PCA9535_INVERSION_PORT_0_REG 0X04
+#define PCA9535_INVERSION_PORT_1_REG 0X05
+#define PCA9535_CONFIG_PORT_0_REG 0X06
+#define PCA9535_CONFIG_PORT_1_REG 0X07
+
+class Arduino_PCA9535SWSPI : public Arduino_DataBus
+{
+public:
+ Arduino_PCA9535SWSPI(int8_t sda, int8_t scl, int8_t pwd, int8_t cs, int8_t sck, int8_t mosi, TwoWire *wire = &Wire);
+
+ bool begin(int32_t speed = GFX_NOT_DEFINED, int8_t dataMode = GFX_NOT_DEFINED) override;
+ void beginWrite() override;
+ void endWrite() override;
+ void writeCommand(uint8_t) override;
+ void writeCommand16(uint16_t) override;
+ void write(uint8_t) override;
+ void write16(uint16_t) override;
+ void writeRepeat(uint16_t p, uint32_t len) override;
+ void writePixels(uint16_t *data, uint32_t len) override;
+
+#if !defined(LITTLE_FOOT_PRINT)
+ void writeBytes(uint8_t *data, uint32_t len) override;
+#endif // !defined(LITTLE_FOOT_PRINT)
+
+ void pinMode(uint8_t pin, uint8_t mode);
+ void pinMode8(uint8_t port, uint8_t pin, uint8_t mode);
+
+ void digitalWrite(uint8_t pin, uint8_t val);
+ int digitalRead(uint8_t pin);
+
+protected:
+ void writeRegister(uint8_t reg, uint8_t *data, size_t len);
+ uint8_t readRegister(uint8_t reg, uint8_t *data, size_t len);
+
+ uint8_t _address;
+ bool is_found;
+
+ int8_t _sda, _scl, _pwd, _cs, _sck, _mosi;
+ TwoWire *_wire;
+
+private:
+};
+
+#endif // _Arduino_PCA9535SWSPI_H_
diff --git a/src/drv/tft/tft_defines.h b/src/drv/tft/tft_defines.h
index cb589eb1..b886f8f9 100644
--- a/src/drv/tft/tft_defines.h
+++ b/src/drv/tft/tft_defines.h
@@ -14,6 +14,10 @@
#define TOUCH_IRQ -1
#endif
+#ifndef TOUCH_RST
+#define TOUCH_RST -1
+#endif
+
#ifndef TFT_DMA_CHANNEL
#define TFT_DMA_CHANNEL 0
#endif
diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp
index fc596422..1d0ad7d7 100644
--- a/src/drv/tft/tft_driver_arduinogfx.cpp
+++ b/src/drv/tft/tft_driver_arduinogfx.cpp
@@ -1,4 +1,4 @@
-/* MIT License - Copyright (c) 2019-2022 Francis Van Roie
+/* MIT License - Copyright (c) 2019-2023 Francis Van Roie
For full license information read the LICENSE file in the project folder */
#if defined(ARDUINO) && defined(HASP_USE_ARDUINOGFX)
@@ -7,6 +7,7 @@
#include "Arduino_RGBPanel_mod.h"
#include "Arduino_RGB_Display_mod.h"
+#include "Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h"
namespace dev {
@@ -34,9 +35,24 @@ void ArduinoGfx::init(int w, int h)
6 /* B1 */, 5 /* B2 */, 3 /* B3 */, 2 /* B4 */, 1 /* hsync_polarity */, 50 /* hsync_front_porch */,
1 /* hsync_pulse_width */, 30 /* hsync_back_porch */, 1 /* vsync_polarity */, 20 /* vsync_front_porch */,
1 /* vsync_pulse_width */, 30 /* vsync_back_porch */, 1 /* pclk_active_neg */);
- tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST,
+ tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST,
st7701_type4_init_operations, sizeof(st7701_type4_init_operations));
+#elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(SENSECAP_INDICATOR_D1)
+ Wire.begin(TOUCH_SDA, TOUCH_SCL, I2C_TOUCH_FREQUENCY);
+ pinMode(TFT_SCLK, OUTPUT);
+ pinMode(TFT_MOSI, OUTPUT);
+ pinMode(TFT_MISO, OUTPUT);
+ Arduino_DataBus* bus = new Arduino_PCA9535SWSPI(TOUCH_SDA, TOUCH_SCL, 5 /* XL PWD */, 4 /* XL CS */,
+ TFT_SCLK /* XL SCK */, TFT_MOSI /* XL MOSI */, &Wire);
+ Arduino_ESP32RGBPanel* rgbpanel = new Arduino_ESP32RGBPanel(
+ TFT_DE, TFT_VSYNC, TFT_HSYNC, TFT_PCLK, TFT_R0, TFT_R1, TFT_R2, TFT_R3, TFT_R4, TFT_G0, TFT_G1, TFT_G2, TFT_G3,
+ TFT_G4, TFT_G5, TFT_B0, TFT_B1, TFT_B2, TFT_B3, TFT_B4, TFT_HSYNC_POLARITY, TFT_HSYNC_FRONT_PORCH,
+ TFT_HSYNC_PULSE_WIDTH, TFT_HSYNC_BACK_PORCH, TFT_VSYNC_POLARITY, TFT_VSYNC_FRONT_PORCH, TFT_VSYNC_PULSE_WIDTH,
+ TFT_VSYNC_BACK_PORCH);
+ tft = new Arduino_RGB_Display(w, h, rgbpanel, 0 /* rotation */, TFT_AUTO_FLUSH, bus, TFT_RST,
+ st7701_sensecap_indicator_init_operations, sizeof(st7701_sensecap_indicator_init_operations));
+
#elif(TFT_WIDTH == 480) && (TFT_HEIGHT == 480) && defined(GC9503V_DRIVER)
Arduino_DataBus* bus = new Arduino_SWSPI(TFT_DC, TFT_CS, TFT_SCLK, TFT_MOSI, TFT_MISO);
Arduino_ESP32RGBPanel* rgbpanel = new Arduino_ESP32RGBPanel(
diff --git a/src/drv/touch/touch_driver_ft6336u.h b/src/drv/touch/touch_driver_ft6336u.h
index 0935781b..efc419cf 100644
--- a/src/drv/touch/touch_driver_ft6336u.h
+++ b/src/drv/touch/touch_driver_ft6336u.h
@@ -12,8 +12,8 @@
#include
#include "FT6336U.h"
-#include "touch_driver.h" // base class
-#include "touch_helper.h" // i2c scanner
+#include "touch_driver.h" // base class
+#include "touch_helper.h" // i2c scanner
#include "../../hasp/hasp.h" // for hasp_sleep_state
extern uint8_t hasp_sleep_state;
@@ -67,6 +67,21 @@ class TouchFt6336u : public BaseTouch {
data->state = LV_INDEV_STATE_PR;
hasp_set_sleep_offset(0); // Reset the offset
+#if defined(TOUCH_SWAP_XY) && (TOUCH_SWAP_XY)
+ data->point.x = ft6336u_touch->read_touch1_y();
+ data->point.y = ft6336u_touch->read_touch1_x();
+#else
+ data->point.x = ft6336u_touch->read_touch1_x();
+ data->point.y = ft6336u_touch->read_touch1_y();
+#endif
+
+#if defined(TOUCH_INVERSE_X) && (TOUCH_INVERSE_X)
+ data->point.x = _width_max - data->point.x;
+#endif
+#if defined(TOUCH_INVERSE_Y) && (TOUCH_INVERSE_Y)
+ data->point.y = _height_max - data->point.y;
+#endif
+
} else {
data->state = LV_INDEV_STATE_REL;
}
@@ -77,6 +92,9 @@ class TouchFt6336u : public BaseTouch {
void init(int w, int h)
{
+ _height_max = h - 1;
+ _width_max = w - 1;
+
LOG_INFO(TAG_DRVR, F("Touch SDA : %d"), TOUCH_SDA);
LOG_INFO(TAG_DRVR, F("Touch SCL : %d"), TOUCH_SCL);
LOG_INFO(TAG_DRVR, F("Touch freq. : %d"), I2C_TOUCH_FREQUENCY);
@@ -110,6 +128,10 @@ class TouchFt6336u : public BaseTouch {
LOG_ERROR(TAG_DRVR, F("FT6336U touch driver failed to start"));
}
}
+
+ private:
+ uint16_t _width_max;
+ uint16_t _height_max;
};
} // namespace dev
diff --git a/user_setups/esp32s3/sensecap-indicator.ini b/user_setups/esp32s3/sensecap-indicator.ini
new file mode 100644
index 00000000..a2a5b03d
--- /dev/null
+++ b/user_setups/esp32s3/sensecap-indicator.ini
@@ -0,0 +1,92 @@
+;***************************************************;
+; SenseCAP Indicator D1, 4-Inch Touch Screen ;
+; - Custom esp32-s3 board ;
+; - st7701s TFT ;
+; - ft6336u touch controller ;
+;***************************************************;
+
+[sensecap-indicator-d1]
+extends = arduino_esp32s3_v2
+board = esp32-s3-devkitc-1
+board_build.arduino.memory_type = qio_opi
+
+build_flags =
+ -D HASP_MODEL="SenseCAP Indicator D1"
+ ${arduino_esp32s3_v2.build_flags}
+ ${esp32s3.ps_ram}
+ -DSENSECAP_INDICATOR_D1
+ ;-DARDUINO_USB_CDC_ON_BOOT
+ ;-DUSE_USB_CDC_CONSOLE
+
+;region -- ArduinoGFX build options ------------------------
+ -D HASP_USE_ARDUINOGFX=1
+ -D HASP_LV_USE_SW_ROTATE=1
+ -D ST7701_DRIVER=1
+ -D TFT_WIDTH=480
+ -D TFT_HEIGHT=480
+ ; Bus Settings
+ -D TFT_HSYNC=16
+ -D TFT_VSYNC=17
+ -D TFT_DE=18
+ -D TFT_PCLK=21
+ -D TFT_R0=4
+ -D TFT_R1=3
+ -D TFT_R2=2
+ -D TFT_R3=1
+ -D TFT_R4=0
+ -D TFT_G0=10
+ -D TFT_G1=9
+ -D TFT_G2=8
+ -D TFT_G3=7
+ -D TFT_G4=6
+ -D TFT_G5=5
+ -D TFT_B0=15
+ -D TFT_B1=14
+ -D TFT_B2=13
+ -D TFT_B3=12
+ -D TFT_B4=11
+ -D TFT_DC=-1
+ -D TFT_CS=-1
+ -D TFT_SCLK=41
+ -D TFT_MOSI=48
+ -D TFT_MISO=47
+ -D TFT_RST=-1
+ -D TFT_BUSY=-1
+ -D TFT_BCKL=45
+ ; Panel Settings
+ -D TFT_HSYNC_POLARITY=1
+ -D TFT_HSYNC_FRONT_PORCH=10
+ -D TFT_HSYNC_PULSE_WIDTH=8
+ -D TFT_HSYNC_BACK_PORCH=50
+ -D TFT_VSYNC_POLARITY=1
+ -D TFT_VSYNC_FRONT_PORCH=10
+ -D TFT_VSYNC_PULSE_WIDTH=8
+ -D TFT_VSYNC_BACK_PORCH=20
+ -D TFT_PCLK_ACTIVE_NEG=1 ; 0
+ -D TFT_PREFER_SPEED=18000000
+ -D TFT_AUTO_FLUSH=1
+ ; Touch Settings
+ -D TOUCH_DRIVER=0x6336
+ -D TOUCH_WIDTH=480
+ -D TOUCH_HEIGHT=480
+ -D TOUCH_SWAP_XY=0
+ -D TOUCH_INVERSE_X=1
+ -D TOUCH_INVERSE_Y=1
+ -D TOUCH_SDA=39
+ -D TOUCH_SCL=40
+ -D TOUCH_RST=-1
+ -D TOUCH_IRQ=-1
+ -D I2C_TOUCH_FREQUENCY=400000
+ -D I2C_TOUCH_ADDRESS=0x48
+ -D I2C_TOUCH_PORT=1
+;endregion
+
+lib_deps =
+ ${arduino_esp32s3_v2.lib_deps}
+ ${arduinogfx.lib_deps}
+ ; ${ft6336.lib_deps}
+ git+https://github.com/RobTillaart/TCA9555.git
+
+
+[env:sensecap-indicator-d1_8MB]
+extends = sensecap-indicator-d1, flash_8mb
From 7682eea7b0b3ed1ffdad8e8d4ff882d43a575b09 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sun, 23 Jul 2023 16:28:36 +0200
Subject: [PATCH 50/90] Add sensecap-indicator-d1_8MB
---
.github/workflows/build.yaml | 2 ++
src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp | 4 ++++
src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h | 4 ++++
3 files changed, 10 insertions(+)
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index ec57bec6..0aca63bf 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -50,6 +50,8 @@ jobs:
env: "makerfabs-tft35-cap_4MB -e makerfabs-tft35-cap_16MB -e makerfabs-s3-tft35-spi -e makerfabs-s3-tft40-rgb -e makerfabs-s3-tft43-rgb"
- out: panlee
env: "panlee-zw3d95ce01s-ar-4848_16MB -e panlee-zw3d95ce01s-ur-4848_16MB"
+ - out: seeed-studios
+ env: "sensecap-indicator-d1_8MB"
- out: sunton
env: "esp32-2432s028r_4MB -e esp32-3248s035c_4MB -e esp32-3248s035r_4MB -e sunton-4827s043c_16MB -e sunton-8048s043c_16MB -e sunton-8048s050c_16MB -e sunton-8048s070c_16MB"
- out: waveshare
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
index 28463861..cba3e648 100644
--- a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
+++ b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
@@ -2,6 +2,8 @@
#include "driver/gpio.h"
#include "hasplib.h"
+#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
+
Arduino_PCA9535SWSPI::Arduino_PCA9535SWSPI(int8_t sda, int8_t scl, int8_t pwd, int8_t cs, int8_t sck, int8_t mosi, TwoWire *wire)
: _sda(sda), _scl(scl), _pwd(pwd), _cs(cs), _sck(sck), _mosi(mosi), _wire(wire)
{
@@ -267,3 +269,5 @@ int Arduino_PCA9535SWSPI::digitalRead(uint8_t pin)
}
return 0;
}
+
+#endif
\ No newline at end of file
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h
index 1a60a076..8e3ca06c 100644
--- a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h
+++ b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h
@@ -1,6 +1,8 @@
#ifndef _Arduino_PCA9535SWSPI_H_
#define _Arduino_PCA9535SWSPI_H_
+#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
+
#include
#include "Arduino_DataBus.h"
@@ -54,4 +56,6 @@ protected:
private:
};
+#endif
+
#endif // _Arduino_PCA9535SWSPI_H_
From 124a97956973704b933332aa939137e70a130da1 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sun, 23 Jul 2023 17:12:48 +0200
Subject: [PATCH 51/90] Add sensecap-indicator-d1_8MB
---
src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp | 6 +++---
user_setups/esp32s3/sensecap-indicator.ini | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
index cba3e648..29153b26 100644
--- a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
+++ b/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
@@ -1,9 +1,9 @@
-#include "Arduino_PCA9535SWSPI.h"
+#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
+
+#include "Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h"
#include "driver/gpio.h"
#include "hasplib.h"
-#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
-
Arduino_PCA9535SWSPI::Arduino_PCA9535SWSPI(int8_t sda, int8_t scl, int8_t pwd, int8_t cs, int8_t sck, int8_t mosi, TwoWire *wire)
: _sda(sda), _scl(scl), _pwd(pwd), _cs(cs), _sck(sck), _mosi(mosi), _wire(wire)
{
diff --git a/user_setups/esp32s3/sensecap-indicator.ini b/user_setups/esp32s3/sensecap-indicator.ini
index a2a5b03d..ef64e18d 100644
--- a/user_setups/esp32s3/sensecap-indicator.ini
+++ b/user_setups/esp32s3/sensecap-indicator.ini
@@ -85,7 +85,7 @@ lib_deps =
${arduino_esp32s3_v2.lib_deps}
${arduinogfx.lib_deps}
; ${ft6336.lib_deps}
- git+https://github.com/RobTillaart/TCA9555.git
+ ; git+https://github.com/RobTillaart/TCA9555.git
[env:sensecap-indicator-d1_8MB]
From 7625d688be48a67cabd0ccdb9f9909483e943b5c Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sun, 23 Jul 2023 20:10:01 +0200
Subject: [PATCH 52/90] Add FT6336U
---
lib/FT6336U/.gitignore | 38 +++
lib/FT6336U/LICENSE | 21 ++
lib/FT6336U/README.md | 5 +
.../ReadTouchParam/ReadTouchParam.ino | 40 +++
.../ScanMultiTouch/ScanMultiTouch.ino | 57 ++++
lib/FT6336U/library.properties | 10 +
lib/FT6336U/src/FT6336U.cpp | 271 ++++++++++++++++++
lib/FT6336U/src/FT6336U.h | 201 +++++++++++++
.../Arduino_PCA9535SWSPI.cpp | 2 +-
.../Arduino_PCA9535SWSPI.h | 0
src/drv/tft/tft_driver_arduinogfx.cpp | 2 +-
11 files changed, 645 insertions(+), 2 deletions(-)
create mode 100644 lib/FT6336U/.gitignore
create mode 100644 lib/FT6336U/LICENSE
create mode 100644 lib/FT6336U/README.md
create mode 100644 lib/FT6336U/examples/ReadTouchParam/ReadTouchParam.ino
create mode 100644 lib/FT6336U/examples/ScanMultiTouch/ScanMultiTouch.ino
create mode 100644 lib/FT6336U/library.properties
create mode 100644 lib/FT6336U/src/FT6336U.cpp
create mode 100644 lib/FT6336U/src/FT6336U.h
rename src/drv/tft/{Arduino_PCA9535SWSPI => }/Arduino_PCA9535SWSPI.cpp (99%)
rename src/drv/tft/{Arduino_PCA9535SWSPI => }/Arduino_PCA9535SWSPI.h (100%)
diff --git a/lib/FT6336U/.gitignore b/lib/FT6336U/.gitignore
new file mode 100644
index 00000000..eb207a4b
--- /dev/null
+++ b/lib/FT6336U/.gitignore
@@ -0,0 +1,38 @@
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+# VS Code Setting
+.vscode/
+
+# Build Folder
+build/
\ No newline at end of file
diff --git a/lib/FT6336U/LICENSE b/lib/FT6336U/LICENSE
new file mode 100644
index 00000000..40a27320
--- /dev/null
+++ b/lib/FT6336U/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 aselectroworks
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/lib/FT6336U/README.md b/lib/FT6336U/README.md
new file mode 100644
index 00000000..409232c4
--- /dev/null
+++ b/lib/FT6336U/README.md
@@ -0,0 +1,5 @@
+# FT6336U Library
+FocalTech FT6336U (Self-Capacitive Touch Panel Controller) library for Arduino.
+
+## License
+This code is released under the MIT License. Please see [LICENSE](https://github.com/aselectroworks/Arduino-FT6336U/blob/master/LICENSE) for the full text.
\ No newline at end of file
diff --git a/lib/FT6336U/examples/ReadTouchParam/ReadTouchParam.ino b/lib/FT6336U/examples/ReadTouchParam/ReadTouchParam.ino
new file mode 100644
index 00000000..d7a7265c
--- /dev/null
+++ b/lib/FT6336U/examples/ReadTouchParam/ReadTouchParam.ino
@@ -0,0 +1,40 @@
+#include "FT6336U.h"
+
+#define I2C_SDA 22
+#define I2C_SCL 23
+#define RST_N_PIN 21
+#define INT_N_PIN 34
+
+FT6336U ft6336u(I2C_SDA, I2C_SCL, RST_N_PIN, INT_N_PIN);
+
+void setup() {
+ Serial.begin(115200);
+
+ ft6336u.begin();
+
+ Serial.print("FT6336U Firmware Version: ");
+ Serial.println(ft6336u.read_firmware_id());
+ Serial.print("FT6336U Device Mode: ");
+ Serial.println(ft6336u.read_device_mode());
+}
+
+void loop() {
+ if(digitalRead(INT_N_PIN) != -1) {
+ Serial.print("FT6336U TD Status: ");
+ Serial.println(ft6336u.read_td_status());
+ Serial.print("FT6336U Touch Event/ID 1: (");
+ Serial.print(ft6336u.read_touch1_event()); Serial.print(" / "); Serial.print(ft6336u.read_touch1_id()); Serial.println(")");
+ Serial.print("FT6336U Touch Position 1: (");
+ Serial.print(ft6336u.read_touch1_x()); Serial.print(" , "); Serial.print(ft6336u.read_touch1_y()); Serial.println(")");
+ Serial.print("FT6336U Touch Weight/MISC 1: (");
+ Serial.print(ft6336u.read_touch1_weight()); Serial.print(" / "); Serial.print(ft6336u.read_touch1_misc()); Serial.println(")");
+ Serial.print("FT6336U Touch Event/ID 2: (");
+ Serial.print(ft6336u.read_touch2_event()); Serial.print(" / "); Serial.print(ft6336u.read_touch2_id()); Serial.println(")");
+ Serial.print("FT6336U Touch Position 2: (");
+ Serial.print(ft6336u.read_touch2_x()); Serial.print(" , "); Serial.print(ft6336u.read_touch2_y()); Serial.println(")");
+ Serial.print("FT6336U Touch Weight/MISC 2: (");
+ Serial.print(ft6336u.read_touch2_weight()); Serial.print(" / "); Serial.print(ft6336u.read_touch2_misc()); Serial.println(")");
+ }
+
+}
+
diff --git a/lib/FT6336U/examples/ScanMultiTouch/ScanMultiTouch.ino b/lib/FT6336U/examples/ScanMultiTouch/ScanMultiTouch.ino
new file mode 100644
index 00000000..5a1a8204
--- /dev/null
+++ b/lib/FT6336U/examples/ScanMultiTouch/ScanMultiTouch.ino
@@ -0,0 +1,57 @@
+#include "FT6336U.h"
+#include
+
+#define I2C_SDA 22
+#define I2C_SCL 23
+#define RST_N_PIN 21
+#define INT_N_PIN 34
+
+FT6336U ft6336u(I2C_SDA, I2C_SCL, RST_N_PIN, INT_N_PIN);
+
+void setup() {
+ Serial.begin(115200);
+
+ ft6336u.begin();
+
+// ft6336u.write_device_mode(factory_mode);
+ Serial.print("FT6336U Device Mode: ");
+ Serial.println(ft6336u.read_device_mode());
+ Serial.print("FT6336U Threshold: 0x");
+ Serial.println(ft6336u.read_touch_threshold(), HEX);
+ Serial.print("FT6336U Filter Coefficient: 0x");
+ Serial.println(ft6336u.read_filter_coefficient(), HEX);
+ Serial.print("FT6336U Control Mode: 0x");
+ Serial.println(ft6336u.read_ctrl_mode(), HEX);
+ Serial.print("FT6336U Time Period for enter to Monitor Mode: 0x");
+ Serial.println(ft6336u.read_time_period_enter_monitor(), HEX);
+ Serial.print("FT6336U Active Rate: 0x");
+ Serial.println(ft6336u.read_active_rate(), HEX);
+ Serial.print("FT6336U Monitor Rate: 0x");
+ Serial.println(ft6336u.read_monitor_rate(), HEX);
+
+ Serial.print("FT6336U LIB Ver: 0x");
+ Serial.println(ft6336u.read_library_version(), HEX);
+ Serial.print("FT6336U Chip ID: 0x");
+ Serial.println(ft6336u.read_chip_id(), HEX);
+ Serial.print("FT6336U G Mode: 0x");
+ Serial.println(ft6336u.read_g_mode(), HEX);
+ Serial.print("FT6336U POWER Mode: 0x");
+ Serial.println(ft6336u.read_pwrmode(), HEX);
+ Serial.print("FT6336U Firm ID: 0x");
+ Serial.println(ft6336u.read_firmware_id(), HEX);
+ Serial.print("FT6336U Focal Tehc ID: 0x");
+ Serial.println(ft6336u.read_focaltech_id(), HEX);
+ Serial.print("FT6336U Release Code ID: 0x");
+ Serial.println(ft6336u.read_release_code_id(), HEX);
+ Serial.print("FT6336U State: 0x");
+ Serial.println(ft6336u.read_state(), HEX);
+
+}
+
+FT6336U_TouchPointType tp;
+void loop() {
+ tp = ft6336u.scan();
+ char tempString[128];
+ sprintf(tempString, "FT6336U TD Count %d / TD1 (%d, %4d, %4d) / TD2 (%d, %4d, %4d)\r", tp.touch_count, tp.tp[0].status, tp.tp[0].x, tp.tp[0].y, tp.tp[1].status, tp.tp[1].x, tp.tp[1].y);
+ Serial.print(tempString);
+}
diff --git a/lib/FT6336U/library.properties b/lib/FT6336U/library.properties
new file mode 100644
index 00000000..3082f3a9
--- /dev/null
+++ b/lib/FT6336U/library.properties
@@ -0,0 +1,10 @@
+name=FT6336U CTP Controller
+version=1.0.2
+author=Atsushi Sasaki
+maintainer=Atsushi Sasaki
+sentence=Arduino FT6336U CTP Controller library
+paragraph=Arduino FT6336U CTP Controller library
+category=Sensors
+url=
+architectures=*
+includes=FT6336U.h
\ No newline at end of file
diff --git a/lib/FT6336U/src/FT6336U.cpp b/lib/FT6336U/src/FT6336U.cpp
new file mode 100644
index 00000000..17dde2c2
--- /dev/null
+++ b/lib/FT6336U/src/FT6336U.cpp
@@ -0,0 +1,271 @@
+/**************************************************************************/
+/*!
+ @file FT6336U.cpp
+ Author: Atsushi Sasaki (https://github.com/aselectroworks)
+ License: MIT (see LICENSE)
+*/
+/**************************************************************************/
+
+#include "FT6336U.h"
+
+#include
+
+FT6336U::FT6336U(uint8_t rst_n, uint8_t int_n)
+: rst_n(rst_n), int_n(int_n) {
+}
+#if defined(ESP32) || defined(ESP8266)
+FT6336U::FT6336U(int8_t sda, int8_t scl, uint8_t rst_n, uint8_t int_n)
+: sda(sda), scl(scl), rst_n(rst_n), int_n(int_n) {
+}
+#endif
+FT6336U::~FT6336U() {
+}
+
+
+void FT6336U::begin(void) {
+ // Initialize I2C
+#if defined(ESP32) || defined(ESP8266)
+ if(sda != -1 && scl != -1) {
+ Wire.begin(sda, scl);
+ }
+ else {
+ Wire.begin();
+ }
+#else
+ Wire.begin();
+#endif
+ // Int Pin Configuration
+ pinMode(int_n, INPUT);
+ // Reset Pin Configuration
+ pinMode(rst_n, OUTPUT);
+ digitalWrite(rst_n, LOW);
+ delay(10);
+ digitalWrite(rst_n, HIGH);
+ delay(500);
+}
+uint8_t FT6336U::read_device_mode(void) {
+ return (readByte(FT6336U_ADDR_DEVICE_MODE) & 0x70) >> 4;
+}
+void FT6336U::write_device_mode(DEVICE_MODE_Enum mode) {
+ writeByte(FT6336U_ADDR_DEVICE_MODE, (mode & 0x07) << 4);
+}
+uint8_t FT6336U::read_gesture_id(void) {
+ return readByte(FT6336U_ADDR_GESTURE_ID);
+}
+uint8_t FT6336U::read_td_status(void) {
+ return readByte(FT6336U_ADDR_TD_STATUS);
+}
+uint8_t FT6336U::read_touch_number(void) {
+ return readByte(FT6336U_ADDR_TD_STATUS) & 0x0F;
+}
+// Touch 1 functions
+uint16_t FT6336U::read_touch1_x(void) {
+ uint8_t read_buf[2];
+ read_buf[0] = readByte(FT6336U_ADDR_TOUCH1_X);
+ read_buf[1] = readByte(FT6336U_ADDR_TOUCH1_X + 1);
+ return ((read_buf[0] & 0x0f) << 8) | read_buf[1];
+}
+uint16_t FT6336U::read_touch1_y(void) {
+ uint8_t read_buf[2];
+ read_buf[0] = readByte(FT6336U_ADDR_TOUCH1_Y);
+ read_buf[1] = readByte(FT6336U_ADDR_TOUCH1_Y + 1);
+ return ((read_buf[0] & 0x0f) << 8) | read_buf[1];
+}
+uint8_t FT6336U::read_touch1_event(void) {
+ return readByte(FT6336U_ADDR_TOUCH1_EVENT) >> 6;
+}
+uint8_t FT6336U::read_touch1_id(void) {
+ return readByte(FT6336U_ADDR_TOUCH1_ID) >> 4;
+}
+uint8_t FT6336U::read_touch1_weight(void) {
+ return readByte(FT6336U_ADDR_TOUCH1_WEIGHT);
+}
+uint8_t FT6336U::read_touch1_misc(void) {
+ return readByte(FT6336U_ADDR_TOUCH1_MISC) >> 4;
+}
+// Touch 2 functions
+uint16_t FT6336U::read_touch2_x(void) {
+ uint8_t read_buf[2];
+ read_buf[0] = readByte(FT6336U_ADDR_TOUCH2_X);
+ read_buf[1] = readByte(FT6336U_ADDR_TOUCH2_X + 1);
+ return ((read_buf[0] & 0x0f) << 8) | read_buf[1];
+}
+uint16_t FT6336U::read_touch2_y(void) {
+ uint8_t read_buf[2];
+ read_buf[0] = readByte(FT6336U_ADDR_TOUCH2_Y);
+ read_buf[1] = readByte(FT6336U_ADDR_TOUCH2_Y + 1);
+ return ((read_buf[0] & 0x0f) << 8) | read_buf[1];
+}
+uint8_t FT6336U::read_touch2_event(void) {
+ return readByte(FT6336U_ADDR_TOUCH2_EVENT) >> 6;
+}
+uint8_t FT6336U::read_touch2_id(void) {
+ return readByte(FT6336U_ADDR_TOUCH2_ID) >> 4;
+}
+uint8_t FT6336U::read_touch2_weight(void) {
+ return readByte(FT6336U_ADDR_TOUCH2_WEIGHT);
+}
+uint8_t FT6336U::read_touch2_misc(void) {
+ return readByte(FT6336U_ADDR_TOUCH2_MISC) >> 4;
+}
+
+// Mode Parameter Register
+uint8_t FT6336U::read_touch_threshold(void) {
+ return readByte(FT6336U_ADDR_THRESHOLD);
+}
+uint8_t FT6336U::read_filter_coefficient(void) {
+ return readByte(FT6336U_ADDR_FILTER_COE);
+}
+uint8_t FT6336U::read_ctrl_mode(void) {
+ return readByte(FT6336U_ADDR_CTRL);
+}
+void FT6336U::write_ctrl_mode(CTRL_MODE_Enum mode) {
+ writeByte(FT6336U_ADDR_CTRL, mode);
+}
+uint8_t FT6336U::read_time_period_enter_monitor(void) {
+ return readByte(FT6336U_ADDR_TIME_ENTER_MONITOR);
+}
+uint8_t FT6336U::read_active_rate(void) {
+ return readByte(FT6336U_ADDR_ACTIVE_MODE_RATE);
+}
+uint8_t FT6336U::read_monitor_rate(void) {
+ return readByte(FT6336U_ADDR_MONITOR_MODE_RATE);
+}
+
+// Gesture Parameters
+uint8_t FT6336U::read_radian_value(void) {
+ return readByte(FT6336U_ADDR_RADIAN_VALUE);
+}
+void FT6336U::write_radian_value(uint8_t val) {
+ writeByte(FT6336U_ADDR_RADIAN_VALUE, val);
+}
+uint8_t FT6336U::read_offset_left_right(void) {
+ return readByte(FT6336U_ADDR_OFFSET_LEFT_RIGHT);
+}
+void FT6336U::write_offset_left_right(uint8_t val) {
+ writeByte(FT6336U_ADDR_OFFSET_LEFT_RIGHT, val);
+}
+uint8_t FT6336U::read_offset_up_down(void) {
+ return readByte(FT6336U_ADDR_OFFSET_UP_DOWN);
+}
+void FT6336U::write_offset_up_down(uint8_t val) {
+ writeByte(FT6336U_ADDR_OFFSET_UP_DOWN, val);
+}
+uint8_t FT6336U::read_distance_left_right(void) {
+ return readByte(FT6336U_ADDR_DISTANCE_LEFT_RIGHT);
+}
+void FT6336U::write_distance_left_right(uint8_t val) {
+ writeByte(FT6336U_ADDR_DISTANCE_LEFT_RIGHT, val);
+}
+uint8_t FT6336U::read_distance_up_down(void) {
+ return readByte(FT6336U_ADDR_DISTANCE_UP_DOWN);
+}
+void FT6336U::write_distance_up_down(uint8_t val) {
+ writeByte(FT6336U_ADDR_DISTANCE_UP_DOWN, val);
+}
+uint8_t FT6336U::read_distance_zoom(void) {
+ return readByte(FT6336U_ADDR_DISTANCE_ZOOM);
+}
+void FT6336U::write_distance_zoom(uint8_t val) {
+ writeByte(FT6336U_ADDR_DISTANCE_ZOOM, val);
+}
+
+
+// System Information
+uint16_t FT6336U::read_library_version(void) {
+ uint8_t read_buf[2];
+ read_buf[0] = readByte(FT6336U_ADDR_LIBRARY_VERSION_H);
+ read_buf[1] = readByte(FT6336U_ADDR_LIBRARY_VERSION_L);
+ return ((read_buf[0] & 0x0f) << 8) | read_buf[1];
+}
+uint8_t FT6336U::read_chip_id(void) {
+ return readByte(FT6336U_ADDR_CHIP_ID);
+}
+uint8_t FT6336U::read_g_mode(void) {
+ return readByte(FT6336U_ADDR_G_MODE);
+}
+void FT6336U::write_g_mode(G_MODE_Enum mode){
+ writeByte(FT6336U_ADDR_G_MODE, mode);
+}
+uint8_t FT6336U::read_pwrmode(void) {
+ return readByte(FT6336U_ADDR_POWER_MODE);
+}
+uint8_t FT6336U::read_firmware_id(void) {
+ return readByte(FT6336U_ADDR_FIRMARE_ID);
+}
+uint8_t FT6336U::read_focaltech_id(void) {
+ return readByte(FT6336U_ADDR_FOCALTECH_ID);
+}
+uint8_t FT6336U::read_release_code_id(void) {
+ return readByte(FT6336U_ADDR_RELEASE_CODE_ID);
+}
+uint8_t FT6336U::read_state(void) {
+ return readByte(FT6336U_ADDR_STATE);
+}
+
+
+//coordinate diagram(FPC downwards)
+////y ////////////////////264x176
+ //
+ //
+ //x
+ //
+ //
+FT6336U_TouchPointType FT6336U::scan(void){
+ touchPoint.touch_count = read_td_status();
+
+ if(touchPoint.touch_count == 0) {
+ touchPoint.tp[0].status = release;
+ touchPoint.tp[1].status = release;
+ }
+ else if(touchPoint.touch_count == 1) {
+ uint8_t id1 = read_touch1_id(); // id1 = 0 or 1
+ touchPoint.tp[id1].status = (touchPoint.tp[id1].status == release) ? touch : stream;
+ touchPoint.tp[id1].x = read_touch1_x();
+ touchPoint.tp[id1].y = read_touch1_y();
+ touchPoint.tp[~id1 & 0x01].status = release;
+ }
+ else {
+ uint8_t id1 = read_touch1_id(); // id1 = 0 or 1
+ touchPoint.tp[id1].status = (touchPoint.tp[id1].status == release) ? touch : stream;
+ touchPoint.tp[id1].x = read_touch1_x();
+ touchPoint.tp[id1].y = read_touch1_y();
+ uint8_t id2 = read_touch2_id(); // id2 = 0 or 1(~id1 & 0x01)
+ touchPoint.tp[id2].status = (touchPoint.tp[id2].status == release) ? touch : stream;
+ touchPoint.tp[id2].x = read_touch2_x();
+ touchPoint.tp[id2].y = read_touch2_y();
+ }
+
+ return touchPoint;
+
+}
+
+
+// Private Function
+uint8_t FT6336U::readByte(uint8_t addr) {
+ uint8_t rdData = 0;
+ uint8_t rdDataCount;
+ do {
+ Wire.beginTransmission(I2C_ADDR_FT6336U);
+ Wire.write(addr);
+ Wire.endTransmission(false); // Restart
+ delay(10);
+ rdDataCount = Wire.requestFrom(I2C_ADDR_FT6336U, 1);
+ } while(rdDataCount == 0);
+ while(Wire.available()) {
+ rdData = Wire.read();
+ }
+ return rdData;
+
+}
+void FT6336U::writeByte(uint8_t addr, uint8_t data) {
+ DEBUG_PRINTLN("")
+ DEBUG_PRINT("writeI2C reg 0x")
+ DEBUG_PRINT(addr, HEX)
+ DEBUG_PRINT(" -> 0x") DEBUG_PRINTLN(data, HEX)
+
+ Wire.beginTransmission(I2C_ADDR_FT6336U);
+ Wire.write(addr);
+ Wire.write(data);
+ Wire.endTransmission();
+}
\ No newline at end of file
diff --git a/lib/FT6336U/src/FT6336U.h b/lib/FT6336U/src/FT6336U.h
new file mode 100644
index 00000000..19f11f47
--- /dev/null
+++ b/lib/FT6336U/src/FT6336U.h
@@ -0,0 +1,201 @@
+/**************************************************************************/
+/*!
+ @file FT6336U.h
+ Author: Atsushi Sasaki(https://github.com/aselectroworks)
+ License: MIT (see LICENSE)
+*/
+/**************************************************************************/
+
+#ifndef _FT6336U_H
+#define _FT6336U_H
+
+#include
+#include
+#include
+
+#define I2C_ADDR_FT6336U 0x48
+
+// Touch Parameter
+#define FT6336U_PRES_DOWN 0x2
+#define FT6336U_COORD_UD 0x1
+
+// Registers
+#define FT6336U_ADDR_DEVICE_MODE 0x00
+typedef enum {
+ working_mode = 0b000,
+ factory_mode = 0b100,
+} DEVICE_MODE_Enum;
+#define FT6336U_ADDR_GESTURE_ID 0x01
+#define FT6336U_ADDR_TD_STATUS 0x02
+
+#define FT6336U_ADDR_TOUCH1_EVENT 0x03
+#define FT6336U_ADDR_TOUCH1_ID 0x05
+#define FT6336U_ADDR_TOUCH1_X 0x03
+#define FT6336U_ADDR_TOUCH1_Y 0x05
+#define FT6336U_ADDR_TOUCH1_WEIGHT 0x07
+#define FT6336U_ADDR_TOUCH1_MISC 0x08
+
+#define FT6336U_ADDR_TOUCH2_EVENT 0x09
+#define FT6336U_ADDR_TOUCH2_ID 0x0B
+#define FT6336U_ADDR_TOUCH2_X 0x09
+#define FT6336U_ADDR_TOUCH2_Y 0x0B
+#define FT6336U_ADDR_TOUCH2_WEIGHT 0x0D
+#define FT6336U_ADDR_TOUCH2_MISC 0x0E
+
+#define FT6336U_ADDR_THRESHOLD 0x80
+#define FT6336U_ADDR_FILTER_COE 0x85
+#define FT6336U_ADDR_CTRL 0x86
+typedef enum {
+ keep_active_mode = 0,
+ switch_to_monitor_mode = 1,
+} CTRL_MODE_Enum;
+#define FT6336U_ADDR_TIME_ENTER_MONITOR 0x87
+#define FT6336U_ADDR_ACTIVE_MODE_RATE 0x88
+#define FT6336U_ADDR_MONITOR_MODE_RATE 0x89
+
+#define FT6336U_ADDR_RADIAN_VALUE 0x91
+#define FT6336U_ADDR_OFFSET_LEFT_RIGHT 0x92
+#define FT6336U_ADDR_OFFSET_UP_DOWN 0x93
+#define FT6336U_ADDR_DISTANCE_LEFT_RIGHT 0x94
+#define FT6336U_ADDR_DISTANCE_UP_DOWN 0x95
+#define FT6336U_ADDR_DISTANCE_ZOOM 0x96
+
+#define FT6336U_ADDR_LIBRARY_VERSION_H 0xA1
+#define FT6336U_ADDR_LIBRARY_VERSION_L 0xA2
+#define FT6336U_ADDR_CHIP_ID 0xA3
+#define FT6336U_ADDR_G_MODE 0xA4
+typedef enum {
+ pollingMode = 0,
+ triggerMode = 1,
+} G_MODE_Enum;
+#define FT6336U_ADDR_POWER_MODE 0xA5
+#define FT6336U_ADDR_FIRMARE_ID 0xA6
+#define FT6336U_ADDR_FOCALTECH_ID 0xA8
+#define FT6336U_ADDR_RELEASE_CODE_ID 0xAF
+#define FT6336U_ADDR_STATE 0xBC
+
+// Function Specific Type
+typedef enum {
+ touch = 0,
+ stream,
+ release,
+} TouchStatusEnum;
+typedef struct {
+ TouchStatusEnum status;
+ uint16_t x;
+ uint16_t y;
+} TouchPointType;
+typedef struct {
+ uint8_t touch_count;
+ TouchPointType tp[2];
+} FT6336U_TouchPointType;
+
+
+// Uncomment to enable debug messages
+//#define FT6336U_DEBUG
+
+// Define where debug output will be printed
+#define DEBUG_PRINTER Serial
+
+// Setup debug printing macros
+#ifdef FT6336U_DEBUG
+#define DEBUG_PRINT(...) \
+ { \
+ DEBUG_PRINTER.print(__VA_ARGS__); \
+ }
+#define DEBUG_PRINTLN(...) \
+ { \
+ DEBUG_PRINTER.println(__VA_ARGS__); \
+ }
+#else
+#define DEBUG_PRINT(...) \
+ { \
+ }
+#define DEBUG_PRINTLN(...) \
+ { \
+ }
+#endif
+
+/**************************************************************************/
+/*!
+ @brief FT6336U I2C CTP controller driver
+*/
+/**************************************************************************/
+class FT6336U
+{
+public:
+ FT6336U(uint8_t rst_n, uint8_t int_n);
+#if defined(ESP32) || defined(ESP8266)
+ FT6336U(int8_t sda, int8_t scl, uint8_t rst_n, uint8_t int_n);
+#endif
+ virtual ~FT6336U();
+
+ void begin(void);
+
+ uint8_t read_device_mode(void);
+ void write_device_mode(DEVICE_MODE_Enum);
+ uint8_t read_gesture_id(void);
+ uint8_t read_td_status(void);
+ uint8_t read_touch_number(void);
+ uint16_t read_touch1_x(void);
+ uint16_t read_touch1_y(void);
+ uint8_t read_touch1_event(void);
+ uint8_t read_touch1_id(void);
+ uint8_t read_touch1_weight(void);
+ uint8_t read_touch1_misc(void);
+ uint16_t read_touch2_x(void);
+ uint16_t read_touch2_y(void);
+ uint8_t read_touch2_event(void);
+ uint8_t read_touch2_id(void);
+ uint8_t read_touch2_weight(void);
+ uint8_t read_touch2_misc(void);
+
+ // Mode Parameter Register
+ uint8_t read_touch_threshold(void);
+ uint8_t read_filter_coefficient(void);
+ uint8_t read_ctrl_mode(void);
+ void write_ctrl_mode(CTRL_MODE_Enum mode);
+ uint8_t read_time_period_enter_monitor(void);
+ uint8_t read_active_rate(void);
+ uint8_t read_monitor_rate(void);
+
+ // Gestrue Parameter Register
+ uint8_t read_radian_value(void);
+ void write_radian_value(uint8_t val);
+ uint8_t read_offset_left_right(void);
+ void write_offset_left_right(uint8_t val);
+ uint8_t read_offset_up_down(void);
+ void write_offset_up_down(uint8_t val);
+ uint8_t read_distance_left_right(void);
+ void write_distance_left_right(uint8_t val);
+ uint8_t read_distance_up_down(void);
+ void write_distance_up_down(uint8_t val);
+ uint8_t read_distance_zoom(void);
+ void write_distance_zoom(uint8_t val);
+
+ // System Information
+ uint16_t read_library_version(void);
+ uint8_t read_chip_id(void);
+ uint8_t read_g_mode(void);
+ void write_g_mode(G_MODE_Enum mode);
+ uint8_t read_pwrmode(void);
+ uint8_t read_firmware_id(void);
+ uint8_t read_focaltech_id(void);
+ uint8_t read_release_code_id(void);
+ uint8_t read_state(void);
+
+ // Scan Function
+ FT6336U_TouchPointType scan(void);
+
+private:
+ int8_t sda = -1;
+ int8_t scl = -1;
+ uint8_t rst_n = -1;
+ uint8_t int_n = -1;
+
+ uint8_t readByte(uint8_t addr);
+ void writeByte(uint8_t addr, uint8_t data);
+
+ FT6336U_TouchPointType touchPoint;
+};
+#endif
\ No newline at end of file
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp b/src/drv/tft/Arduino_PCA9535SWSPI.cpp
similarity index 99%
rename from src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
rename to src/drv/tft/Arduino_PCA9535SWSPI.cpp
index 29153b26..226c43f6 100644
--- a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.cpp
+++ b/src/drv/tft/Arduino_PCA9535SWSPI.cpp
@@ -1,6 +1,6 @@
#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
-#include "Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h"
+#include "Arduino_PCA9535SWSPI.h"
#include "driver/gpio.h"
#include "hasplib.h"
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h b/src/drv/tft/Arduino_PCA9535SWSPI.h
similarity index 100%
rename from src/drv/tft/Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h
rename to src/drv/tft/Arduino_PCA9535SWSPI.h
diff --git a/src/drv/tft/tft_driver_arduinogfx.cpp b/src/drv/tft/tft_driver_arduinogfx.cpp
index 1d0ad7d7..69084b6a 100644
--- a/src/drv/tft/tft_driver_arduinogfx.cpp
+++ b/src/drv/tft/tft_driver_arduinogfx.cpp
@@ -7,7 +7,7 @@
#include "Arduino_RGBPanel_mod.h"
#include "Arduino_RGB_Display_mod.h"
-#include "Arduino_PCA9535SWSPI/Arduino_PCA9535SWSPI.h"
+#include "Arduino_PCA9535SWSPI.h"
namespace dev {
From 37b3e488a4e77dd383bc12f89e619fa32dc123f0 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sun, 23 Jul 2023 21:36:17 +0200
Subject: [PATCH 53/90] Update defined(CONFIG_IDF_TARGET_ESP32S3)
---
lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.cpp | 2 +-
lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h | 2 +-
src/drv/tft/Arduino_PCA9535SWSPI.cpp | 2 +-
src/drv/tft/Arduino_PCA9535SWSPI.h | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.cpp b/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.cpp
index 9f500edc..0b997a9e 100644
--- a/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.cpp
+++ b/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.cpp
@@ -1,6 +1,6 @@
#include "Arduino_RGB_Display_mod.h"
-#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
+#if defined(ESP32) && defined(CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
#include "Arduino_GFX.h"
#include "Arduino_DataBus.h"
diff --git a/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h b/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h
index f0cea72f..982da439 100644
--- a/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h
+++ b/lib/Arduino_RPi_DPI_RGBPanel_mod/Arduino_RGB_Display_mod.h
@@ -3,7 +3,7 @@
#include "Arduino_DataBus.h"
#endif
-#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
+#if defined(ESP32) && defined(CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
#ifndef _ARDUINO_RGB_DISPLAY_MOD_H_
#define _ARDUINO_RGB_DISPLAY_MOD_H_
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI.cpp b/src/drv/tft/Arduino_PCA9535SWSPI.cpp
index 226c43f6..b09e55c2 100644
--- a/src/drv/tft/Arduino_PCA9535SWSPI.cpp
+++ b/src/drv/tft/Arduino_PCA9535SWSPI.cpp
@@ -1,4 +1,4 @@
-#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
+#if defined(ESP32) && defined(CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
#include "Arduino_PCA9535SWSPI.h"
#include "driver/gpio.h"
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI.h b/src/drv/tft/Arduino_PCA9535SWSPI.h
index 8e3ca06c..a963240a 100644
--- a/src/drv/tft/Arduino_PCA9535SWSPI.h
+++ b/src/drv/tft/Arduino_PCA9535SWSPI.h
@@ -1,7 +1,7 @@
#ifndef _Arduino_PCA9535SWSPI_H_
#define _Arduino_PCA9535SWSPI_H_
-#if defined(ESP32) && (CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
+#if defined(ESP32) && defined(CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
#include
From 4d6860ff43f8992f33afe816819ab442e25943ab Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sun, 23 Jul 2023 22:00:15 +0200
Subject: [PATCH 54/90] Update Arduino_PCA9535SWSPI
---
src/drv/tft/Arduino_PCA9535SWSPI.cpp | 6 ++++--
src/drv/tft/Arduino_PCA9535SWSPI.h | 4 +++-
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI.cpp b/src/drv/tft/Arduino_PCA9535SWSPI.cpp
index b09e55c2..a6a5d83a 100644
--- a/src/drv/tft/Arduino_PCA9535SWSPI.cpp
+++ b/src/drv/tft/Arduino_PCA9535SWSPI.cpp
@@ -1,6 +1,8 @@
-#if defined(ESP32) && defined(CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
-
#include "Arduino_PCA9535SWSPI.h"
+
+#if defined(HASP_USE_ARDUINOGFX)
+#warning Arduino_PCA9535SWSPI.cpp
+
#include "driver/gpio.h"
#include "hasplib.h"
diff --git a/src/drv/tft/Arduino_PCA9535SWSPI.h b/src/drv/tft/Arduino_PCA9535SWSPI.h
index a963240a..c54c7904 100644
--- a/src/drv/tft/Arduino_PCA9535SWSPI.h
+++ b/src/drv/tft/Arduino_PCA9535SWSPI.h
@@ -1,10 +1,12 @@
#ifndef _Arduino_PCA9535SWSPI_H_
#define _Arduino_PCA9535SWSPI_H_
-#if defined(ESP32) && defined(CONFIG_IDF_TARGET_ESP32S3) && defined(HASP_USE_ARDUINOGFX)
+#if defined(HASP_USE_ARDUINOGFX)
+#warning Arduino_PCA9535SWSPI.h
#include
+#include
#include "Arduino_DataBus.h"
#define PCA9535_IIC_ADDRESS 0X20
From 9c3e28f6541f73971292ce0caab47171e6418147 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Mon, 24 Jul 2023 11:47:19 +0200
Subject: [PATCH 55/90] Update to ArduinoJson 6.21.3
---
CHANGELOG.md | 2 +-
platformio.ini | 2 +-
user_setups/darwin_sdl/darwin_sdl_64bits.ini | 2 +-
user_setups/linux_sdl/linux_sdl_64bits.ini | 2 +-
user_setups/win32/windows_sdl_64bits.ini | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 62f496a7..a391bb38 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -55,7 +55,7 @@
- Add support for ESP32-S3 and ESP32-C3 devices
- Deprecation of support for ESP32-S2 devices due to lack of sRAM
-Updated libraries to ArduinoJson 6.21.2, ArduinoStreamUtils 1.7.3, AceButton 1.10.1, TFT_eSPI 2.5.0, LovyanGFX 1.1.7 and SimpleFTPServer 2.1.5
+Updated libraries to ArduinoJson 6.21.3, ArduinoStreamUtils 1.7.3, AceButton 1.10.1, TFT_eSPI 2.5.0, LovyanGFX 1.1.7 and SimpleFTPServer 2.1.5
## v0.6.3
diff --git a/platformio.ini b/platformio.ini
index 398280df..610fb149 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -82,7 +82,7 @@ build_flags =
; -- Shared library dependencies in all environments
; Warning : don't put comments after github links => causes infinite download loop
lib_deps =
- bblanchon/ArduinoJson@^6.21.2
+ bblanchon/ArduinoJson@^6.21.3
;git+https://github.com/fvanroie/ConsoleInput.git
;git+https://github.com/andrethomas/TasmotaSlave.git
;git+https://github.com/lvgl/lvgl.git
diff --git a/user_setups/darwin_sdl/darwin_sdl_64bits.ini b/user_setups/darwin_sdl/darwin_sdl_64bits.ini
index 0ecd5203..25f8d593 100644
--- a/user_setups/darwin_sdl/darwin_sdl_64bits.ini
+++ b/user_setups/darwin_sdl/darwin_sdl_64bits.ini
@@ -67,7 +67,7 @@ lib_deps =
; lv_drivers@~7.9.1
;lv_drivers=https://github.com/littlevgl/lv_drivers/archive/7d71907c1d6b02797d066f50984b866e080ebeed.zip
https://github.com/eclipse/paho.mqtt.c.git
- bblanchon/ArduinoJson@^6.21.2 ; Json(l) parser
+ bblanchon/ArduinoJson@^6.21.3 ; Json(l) parser
https://github.com/fvanroie/lv_drivers
git+https://github.com/lvgl/lv_lib_png.git#release/v7
diff --git a/user_setups/linux_sdl/linux_sdl_64bits.ini b/user_setups/linux_sdl/linux_sdl_64bits.ini
index b63f61c6..e49d3447 100644
--- a/user_setups/linux_sdl/linux_sdl_64bits.ini
+++ b/user_setups/linux_sdl/linux_sdl_64bits.ini
@@ -62,7 +62,7 @@ lib_deps =
;lv_drivers@~7.9.0
;lv_drivers=https://github.com/littlevgl/lv_drivers/archive/7d71907c1d6b02797d066f50984b866e080ebeed.zip
https://github.com/eclipse/paho.mqtt.c.git
- bblanchon/ArduinoJson@^6.21.2 ; Json(l) parser
+ bblanchon/ArduinoJson@^6.21.3 ; Json(l) parser
https://github.com/fvanroie/lv_drivers
lib_ignore =
diff --git a/user_setups/win32/windows_sdl_64bits.ini b/user_setups/win32/windows_sdl_64bits.ini
index 3ce84888..9bc1f7c7 100644
--- a/user_setups/win32/windows_sdl_64bits.ini
+++ b/user_setups/win32/windows_sdl_64bits.ini
@@ -93,7 +93,7 @@ lib_deps =
;lv_drivers@~7.9.0
;lv_drivers=https://github.com/littlevgl/lv_drivers/archive/7d71907c1d6b02797d066f50984b866e080ebeed.zip
https://github.com/eclipse/paho.mqtt.c.git
- bblanchon/ArduinoJson@^6.21.2 ; Json(l) parser
+ bblanchon/ArduinoJson@^6.21.3 ; Json(l) parser
https://github.com/fvanroie/lv_drivers
lib_ignore =
From 146c94063bf8f3ca0d8c85926c7bf413cdf73f52 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Mon, 24 Jul 2023 18:53:33 +0200
Subject: [PATCH 56/90] Update to Tasmota Arduino Core 2.0.11
---
CHANGELOG.md | 2 +-
platformio.ini | 2 +-
user_setups/esp32/_esp32.ini | 2 +-
user_setups/esp32c3/_esp32c3.ini | 2 +-
user_setups/esp32s2/_esp32s2.ini | 4 ++--
user_setups/esp32s3/_esp32s3.ini | 2 +-
6 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a391bb38..e10dc2f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -50,7 +50,7 @@
- Add button GPIOs to input discovery message
### Architecture
-- Moved to Tasmota Arduino 2.0.10 and ESP-IDF 4.4.5 (thanks @Jason2866)
+- Moved to Tasmota Arduino 2.0.11 and ESP-IDF 4.4.5 (thanks @Jason2866)
- Add Arduino-GFX display driver
- Add support for ESP32-S3 and ESP32-C3 devices
- Deprecation of support for ESP32-S2 devices due to lack of sRAM
diff --git a/platformio.ini b/platformio.ini
index 610fb149..c17da6b3 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -75,7 +75,7 @@ build_flags =
-D HASP_VER_MAJ=0
-D HASP_VER_MIN=7
;-D HASP_VER_REV=4
- -D HASP_VER_REV=0-rc6
+ -D HASP_VER_REV=0-rc7
;-D HASP_VER_REV=4-rc1
${override.build_flags}
diff --git a/user_setups/esp32/_esp32.ini b/user_setups/esp32/_esp32.ini
index 4f0a6f24..ba5df96b 100644
--- a/user_setups/esp32/_esp32.ini
+++ b/user_setups/esp32/_esp32.ini
@@ -140,7 +140,7 @@ lib_deps =
extends = esp32
framework = arduino
; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.01.01/platform-espressif32.zip
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip
lib_ignore =
${esp32.lib_ignore}
diff --git a/user_setups/esp32c3/_esp32c3.ini b/user_setups/esp32c3/_esp32c3.ini
index 20811d99..2053ab5d 100644
--- a/user_setups/esp32c3/_esp32c3.ini
+++ b/user_setups/esp32c3/_esp32c3.ini
@@ -17,6 +17,6 @@ no_ps_ram =
extends = esp32c3
framework = arduino
;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.01.01/platform-espressif32.zip
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip
;platform = espressif32@5.3.0
diff --git a/user_setups/esp32s2/_esp32s2.ini b/user_setups/esp32s2/_esp32s2.ini
index 7aa564fb..82f1d9df 100644
--- a/user_setups/esp32s2/_esp32s2.ini
+++ b/user_setups/esp32s2/_esp32s2.ini
@@ -75,7 +75,7 @@ fspi =
extends = esp32s2
framework = arduino
;platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.4.1/platform-espressif32-2.0.4.1.zip
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip
; =========================== SOLO ==============================================
@@ -83,7 +83,7 @@ platform = https://github.com/tasmota/platform-espressif32/releases/download/202
[arduino_esp32s2-solo_v2]
framework = arduino
; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.01.01/platform-espressif32.zip
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip
board_build.embed_files = ${esp32.board_build.embed_files}
board_build.filesystem = littlefs
; ----- crash reporter
diff --git a/user_setups/esp32s3/_esp32s3.ini b/user_setups/esp32s3/_esp32s3.ini
index 1874ba83..ec88eb84 100644
--- a/user_setups/esp32s3/_esp32s3.ini
+++ b/user_setups/esp32s3/_esp32s3.ini
@@ -16,6 +16,6 @@ no_ps_ram =
extends = esp32s3
framework = arduino
;platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.01.01/platform-espressif32.zip
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip
;platform = espressif32@5.3.0
From 4142adafab265d3511e2de71def80e06676680fd Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Thu, 3 Aug 2023 16:25:25 +0200
Subject: [PATCH 57/90] Update to LovyanGFX 1.1.8
---
CHANGELOG.md | 2 +-
platformio.ini | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e10dc2f1..53b160ca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -55,7 +55,7 @@
- Add support for ESP32-S3 and ESP32-C3 devices
- Deprecation of support for ESP32-S2 devices due to lack of sRAM
-Updated libraries to ArduinoJson 6.21.3, ArduinoStreamUtils 1.7.3, AceButton 1.10.1, TFT_eSPI 2.5.0, LovyanGFX 1.1.7 and SimpleFTPServer 2.1.5
+Updated libraries to ArduinoJson 6.21.3, ArduinoStreamUtils 1.7.3, AceButton 1.10.1, TFT_eSPI 2.5.0, LovyanGFX 1.1.8 and SimpleFTPServer 2.1.5
## v0.6.3
diff --git a/platformio.ini b/platformio.ini
index c17da6b3..dc2b741d 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -104,7 +104,7 @@ build_src_filter = +<*> -<.git/> - - - - -
Date: Sat, 5 Aug 2023 20:47:44 +1000
Subject: [PATCH 58/90] Support ESP-BOX
---
src/drv/tft/tft_driver_lovyangfx.cpp | 25 ++++++++++++++++
user_setups/esp32s3/esp-box.ini | 45 ++++++++++++++++++++++++++++
2 files changed, 70 insertions(+)
create mode 100644 user_setups/esp32s3/esp-box.ini
diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp
index d783a2d7..6794a4ec 100644
--- a/src/drv/tft/tft_driver_lovyangfx.cpp
+++ b/src/drv/tft/tft_driver_lovyangfx.cpp
@@ -425,6 +425,31 @@ lgfx::ITouch* _init_touch(Preferences* preferences)
}
#endif
+#if TOUCH_DRIVER == 0x21100
+ {
+ auto touch = new lgfx::Touch_TT21xxx();
+ auto cfg = touch->config();
+
+ cfg.x_min = 0;
+ cfg.x_max = TFT_WIDTH - 1;
+ cfg.y_min = 0;
+ cfg.y_max = TFT_HEIGHT - 1;
+ cfg.pin_int = TOUCH_IRQ;
+ cfg.bus_shared = true;
+ cfg.offset_rotation = TOUCH_OFFSET_ROTATION;
+
+ // I2C接続の場合
+ cfg.i2c_port = I2C_TOUCH_PORT;
+ cfg.i2c_addr = I2C_TOUCH_ADDRESS;
+ cfg.pin_sda = TOUCH_SDA;
+ cfg.pin_scl = TOUCH_SCL;
+ cfg.freq = I2C_TOUCH_FREQUENCY;
+
+ touch->config(cfg);
+ return touch;
+ }
+#endif
+
#endif // HASP_USE_LGFX_TOUCH
return nullptr;
diff --git a/user_setups/esp32s3/esp-box.ini b/user_setups/esp32s3/esp-box.ini
new file mode 100644
index 00000000..aff0848e
--- /dev/null
+++ b/user_setups/esp32s3/esp-box.ini
@@ -0,0 +1,45 @@
+;***************************************************;
+; ESP-BOX ;
+; - ILI9342 TFT ;
+; - TT21100 touch controller ;
+;***************************************************;
+
+[env:esp-box]
+extends = arduino_esp32s3_v2, flash_16mb
+board = esp32s3box
+board_build.arduino.memory_type = qio_opi
+
+build_flags =
+ -D HASP_MODEL="ESP-BOX"
+ ${arduino_esp32s3_v2.build_flags}
+ ${esp32s3.ps_ram}
+
+;region -- TFT_eSPI build options ------------------------
+ -D LGFX_USE_V1=1
+ -D HASP_USE_LGFX_TOUCH=1
+ -D TOUCH_DRIVER=0x21100
+ -D ILI9341_DRIVER=1
+ -D INVERT_COLORS=0
+ -D TFT_ROTATION=2
+ -D TFT_WIDTH=320
+ -D TFT_HEIGHT=240
+ -D TOUCH_SDA=8
+ -D TOUCH_SCL=18
+ -D TOUCH_OFFSET_ROTATION=4 ; 1=swap xy, 2=invert x, 4=inverty
+ -D TOUCH_IRQ=3
+ -D I2C_TOUCH_FREQUENCY=400000
+ -D I2C_TOUCH_PORT=1
+ -D I2C_TOUCH_ADDRESS=0x24
+ -D TFT_DC=4
+ -D TFT_CS=5
+ -D TFT_MOSI=6
+ -D TFT_SCLK=7
+ -D TFT_RST=48
+ -D TFT_BCKL=45
+ -D SPI_FREQUENCY=40000000
+;endregion
+
+lib_deps =
+ ${arduino_esp32s3_v2.lib_deps}
+ ${lovyangfx.lib_deps}
+ ${tft_espi.lib_deps}
From 1b56f3de0b10ed1f62b08dd749484eb577a618de Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Wed, 9 Aug 2023 13:32:09 +0200
Subject: [PATCH 59/90] Update ace.js to v1.24.0
---
data/edit.htm | 2 +-
data/script.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/edit.htm b/data/edit.htm
index 60aa40e9..a69d5a40 100644
--- a/data/edit.htm
+++ b/data/edit.htm
@@ -1 +1 @@
-openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
+openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
diff --git a/data/script.js b/data/script.js
index 39a83573..f690c4f8 100644
--- a/data/script.js
+++ b/data/script.js
@@ -1 +1 @@
-var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.4")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
+var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.24.0")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
From 5b436b61597e83f067d539d6cb4163aae0a0e635 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Wed, 16 Aug 2023 01:36:38 +0200
Subject: [PATCH 60/90] Update to ace.js v1.24.1
---
data/edit.htm | 2 +-
data/script.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/edit.htm b/data/edit.htm
index a69d5a40..87ec8cb5 100644
--- a/data/edit.htm
+++ b/data/edit.htm
@@ -1 +1 @@
-openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
+openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
diff --git a/data/script.js b/data/script.js
index f690c4f8..feb3e04f 100644
--- a/data/script.js
+++ b/data/script.js
@@ -1 +1 @@
-var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.24.0")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
+var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.24.1")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
From 5869f88f759183e66ef298b2738eb9046873c21f Mon Sep 17 00:00:00 2001
From: marsman7
Date: Mon, 21 Aug 2023 23:14:08 +0200
Subject: [PATCH 61/90] change german language de_DE.h
---
include/user_config_override-template.h | 1 +
src/lang/de_DE.h | 340 ++++++++++++------------
2 files changed, 171 insertions(+), 170 deletions(-)
diff --git a/include/user_config_override-template.h b/include/user_config_override-template.h
index db8490fc..83f4e3a3 100644
--- a/include/user_config_override-template.h
+++ b/include/user_config_override-template.h
@@ -77,6 +77,7 @@
// #define HASP_LANGUAGE pt_BR // Brazilian Portuguese
// #define HASP_LANGUAGE pt_PT // Portuguese
// #define HASP_LANGUAGE ro_RO // Romanian
+// #define HASP_LANGUAGE de_DE // German
/***************************************************
* Web interface coloring
diff --git a/src/lang/de_DE.h b/src/lang/de_DE.h
index d9f83733..0db41294 100644
--- a/src/lang/de_DE.h
+++ b/src/lang/de_DE.h
@@ -1,232 +1,232 @@
-#ifndef HASP_LANG_EN_US_H
-#define HASP_LANG_EN_US_H
+#ifndef HASP_LANG_DE_DE_H
+#define HASP_LANG_DE_DE_H
-#define D_ISO_LANG_CODE "en-US"
+#define D_ISO_LANG_CODE "de-DE"
-#define D_USERNAME "Username:"
-#define D_PASSWORD "Password:"
+#define D_USERNAME "Benutzer:"
+#define D_PASSWORD "Kennwort:"
#define D_SSID "Ssid:"
-#define D_YES "Yes"
-#define D_NO "No"
+#define D_YES "Ja"
+#define D_NO "Nein"
-#define D_ERROR_OUT_OF_MEMORY "Out of memory"
-#define D_ERROR_UNKNOWN "Unknown error"
+#define D_ERROR_OUT_OF_MEMORY "Nicht genug Speicher"
+#define D_ERROR_UNKNOWN "Unbekannter Fehler"
-#define D_CONFIG_NOT_CHANGED "Settings did not change"
-#define D_CONFIG_CHANGED "Settings changed"
-#define D_CONFIG_LOADED "Settings loaded"
+#define D_CONFIG_NOT_CHANGED "Einstellungen nicht geändert"
+#define D_CONFIG_CHANGED "Einstellungen geändert"
+#define D_CONFIG_LOADED "Einstellungen geladen"
-#define D_FILE_LOADING "Loading %s"
-#define D_FILE_LOADED "Loaded %s"
-#define D_FILE_LOAD_FAILED "Failed to load %s"
-#define D_FILE_SAVING "Saving %s"
-#define D_FILE_SAVED "Saved %s"
-#define D_FILE_SAVE_FAILED "Failed to save %s"
-#define D_FILE_NOT_FOUND "File not found"
-#define D_FILE_SIZE_BYTES "bytes"
+#define D_FILE_LOADING "Laden %s"
+#define D_FILE_LOADED "Geladen %s"
+#define D_FILE_LOAD_FAILED "Fehler beim Laden %s"
+#define D_FILE_SAVING "Speichern %s"
+#define D_FILE_SAVED "Gespeichert %s"
+#define D_FILE_SAVE_FAILED "Fehler beim Speichern %s"
+#define D_FILE_NOT_FOUND "Datei nicht gefunden"
+#define D_FILE_SIZE_BYTES "Bytes"
#define D_FILE_SIZE_KILOBYTES "KiB"
#define D_FILE_SIZE_MEGABYTES "MiB"
#define D_FILE_SIZE_GIGABYTES "GiB"
#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
-#define D_DECIMAL_POINT "." // decimal comma or point
+#define D_DECIMAL_POINT "," // decimal comma or point
-#define D_SERVICE_STARTING "Starting..."
-#define D_SERVICE_STARTED "Started"
-#define D_SERVICE_START_FAILED "Failed to start"
-#define D_SERVICE_STOPPED "Stopped"
-#define D_SERVICE_DISABLED "Disabled"
-#define D_SERVICE_CONNECTED "Connected"
-#define D_SERVICE_DISCONNECTED "Disconnected"
+#define D_SERVICE_STARTING "Starten..."
+#define D_SERVICE_STARTED "Gestartet"
+#define D_SERVICE_START_FAILED "Fehler beim Start"
+#define D_SERVICE_STOPPED "Angehalten"
+#define D_SERVICE_DISABLED "Deaktiviert"
+#define D_SERVICE_CONNECTED "Verbunden"
+#define D_SERVICE_DISCONNECTED "Getrennt"
-#define D_SETTING_ENABLED "Enabled"
-#define D_SETTING_DISABLED "Disabled"
-#define D_SETTING_DEFAULT "Default"
+#define D_SETTING_ENABLED "Aktiviert"
+#define D_SETTING_DISABLED "Deaktiviert"
+#define D_SETTING_DEFAULT "Standard"
-#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s"
+#define D_NETWORK_IP_ADDRESS_RECEIVED "IP Addresse empfangen %s"
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
-#define D_NETWORK_CONNECTION_FAILED "Connection failed"
-#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
+#define D_NETWORK_CONNECTION_FAILED "Verbinden fehlgeschlagen"
+#define D_NETWORK_CONNECTION_UNAUTHORIZED "Autorisieren fehlgeschlagen"
#define D_MQTT_DEFAULT_NAME "plate_%s"
-#define D_MQTT_CONNECTING "Connecting..."
-#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s"
-#define D_MQTT_NOT_CONNECTED "Not connected ???"
-#define D_MQTT_DISCONNECTING "Disconnecting..."
-#define D_MQTT_DISCONNECTED "Disconnected"
-#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..."
-#define D_MQTT_NOT_CONFIGURED "Broker not configured"
-#define D_MQTT_STARTED "Started: %d bytes"
-#define D_MQTT_FAILED "Failed:"
-#define D_MQTT_INVALID_TOPIC "Message has invalid topic"
-#define D_MQTT_SUBSCRIBED "Subscribed to %s"
-#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s"
-#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery"
-#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)"
+#define D_MQTT_CONNECTING "Verbinden..."
+#define D_MQTT_CONNECTED "Verbunden mit Broker %s mit ClientID %s"
+#define D_MQTT_NOT_CONNECTED "Nicht verbunden ???"
+#define D_MQTT_DISCONNECTING "Trennen..."
+#define D_MQTT_DISCONNECTED "Getrennt"
+#define D_MQTT_RECONNECTING "Getrennt vom Broker, erneut verbinden..."
+#define D_MQTT_NOT_CONFIGURED "Broker nicht konfiguriert"
+#define D_MQTT_STARTED "Gestartet: %d Bytes"
+#define D_MQTT_FAILED "Fehlgeschlagen:"
+#define D_MQTT_INVALID_TOPIC "Nachricht hat ungültigen Topic"
+#define D_MQTT_SUBSCRIBED "Abboniert von %s"
+#define D_MQTT_NOT_SUBSCRIBED "Abbonieren von %s fehlgeschlagen"
+#define D_MQTT_HA_AUTO_DISCOVERY "Registriere HA auto-discovery"
+#define D_MQTT_PAYLOAD_TOO_LONG "Nutzdaten zu lang (%u Bytes)"
-#define D_TELNET_CLOSING_CONNECTION "Closing session from %s"
-#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
-#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
-#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
-#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
-#define D_TELNET_STARTED "Telnet console started"
-#define D_TELNET_FAILED "Failed to start telnet console"
-#define D_TELNET_CLIENT_CONNECTED "Client connected"
-#define D_TELNET_CLIENT_REJECTED "Client rejected"
+#define D_TELNET_CLOSING_CONNECTION "Schließe Sitzung von %s"
+#define D_TELNET_CLIENT_LOGIN_FROM "Client Login von %s"
+#define D_TELNET_CLIENT_CONNECT_FROM "Client verbunden von %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Client nicht verbunden"
+#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Fehlerhafter Anmeldeversuch von %s"
+#define D_TELNET_STARTED "Telnet-Konsole gestartet"
+#define D_TELNET_FAILED "Fehler beim Start der Telnet-Konsole"
+#define D_TELNET_CLIENT_CONNECTED "CClient verbunden"
+#define D_TELNET_CLIENT_REJECTED "Client abgewiesen"
-#define D_HASP_INVALID_PAGE "Invalid page %u"
-#define D_HASP_INVALID_LAYER "Cannot clear system layer"
-#define D_HASP_CHANGE_PAGE "Changing page to %u"
-#define D_HASP_CLEAR_PAGE "Clearing page %u"
+#define D_HASP_INVALID_PAGE "Ungültige Seite %u"
+#define D_HASP_INVALID_LAYER "System-Layer kann nicht gelöscht werden"
+#define D_HASP_CHANGE_PAGE "Seite gewechselt zu %u"
+#define D_HASP_CLEAR_PAGE "Seite %u gelöscht"
-#define D_OBJECT_DELETED "Object deleted"
-#define D_OBJECT_UNKNOWN "Unknown object"
-#define D_OBJECT_MISMATCH "Objects DO NOT match!"
-#define D_OBJECT_LOST "Lost object!"
-#define D_OBJECT_CREATE_FAILED "Failed to create object id %u"
-#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined"
-#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d"
+#define D_OBJECT_DELETED "Objekt entfernt"
+#define D_OBJECT_UNKNOWN "Ungekanntes Objekt"
+#define D_OBJECT_MISMATCH "Objekte stimmen nicht überein!"
+#define D_OBJECT_LOST "Objekt verloren!"
+#define D_OBJECT_CREATE_FAILED "Fehler beim erstellen der Objekt ID %u"
+#define D_OBJECT_PAGE_UNKNOWN "Seiten ID %u nicht bekannt"
+#define D_OBJECT_EVENT_UNKNOWN "Unbekanntes Ereignis %d"
-#define D_ATTRIBUTE_UNKNOWN "Unknown property %s"
+#define D_ATTRIBUTE_UNKNOWN "Unbekannte Eigenschaft %s"
// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
-#define D_ATTRIBUTE_OBSOLETE "%s is obsolete"
-#define D_ATTRIBUTE_INSTEAD ", use %s instead"
-#define D_ATTRIBUTE_READ_ONLY "%s is read-only"
-#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page"
-#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s"
-#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s"
-#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s"
+#define D_ATTRIBUTE_OBSOLETE "%s ist veraltet"
+#define D_ATTRIBUTE_INSTEAD ", benutze %s stattdessen"
+#define D_ATTRIBUTE_READ_ONLY "%s kann nur gelesen werden"
+#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Aufruf auf Seite %s nicht möglich"
+#define D_ATTRIBUTE_ALIGN_INVALID "Ungültige Ausrichtung: %s"
+#define D_ATTRIBUTE_COLOR_INVALID "Ungültige Farbe: %s"
+#define D_ATTRIBUTE_LONG_MODE_INVALID "Ungültiger long mode: %s"
-#define D_OOBE_SSID_VALIDATED "SSID %s validated"
-#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled"
-#define D_OOBE_CALIBRATED "Already calibrated"
+#define D_OOBE_SSID_VALIDATED "SSID %s überprüft"
+#define D_OOBE_AUTO_CALIBRATE "Autokalibrierung aktiviert"
+#define D_OOBE_CALIBRATED "Bereits kalibriert"
-#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found"
-#define D_DISPATCH_INVALID_PAGE "Invalid page %s"
-#define D_DISPATCH_REBOOT "Rebooting the MCU now!"
+#define D_DISPATCH_COMMAND_NOT_FOUND "Kommando '%s' nicht gefunden"
+#define D_DISPATCH_INVALID_PAGE "Ungültige Seite %s"
+#define D_DISPATCH_REBOOT "Neustart der MCU jetzt!"
-#define D_JSON_FAILED "JSON parsing failed:"
-#define D_JSONL_FAILED "JSONL parsing failed at line %u"
-#define D_JSONL_SUCCEEDED "Jsonl fully parsed"
+#define D_JSON_FAILED "JSON-Analyse fehlgeschlagen:"
+#define D_JSONL_FAILED "JSONL-Analyse fehlgeschlagen in Zeile %u"
+#define D_JSONL_SUCCEEDED "Jsonl-Analyse komplett"
-#define D_OTA_CHECK_UPDATE "Trying update URL: %s"
-#define D_OTA_CHECK_COMPLETE "Update check complete"
-#define D_OTA_CHECK_FAILED "Update check failed: %s"
+#define D_OTA_CHECK_UPDATE "Probiere Update URL: %s"
+#define D_OTA_CHECK_COMPLETE "Update-Test komplett"
+#define D_OTA_CHECK_FAILED "Update-Test fehlerhaft: %s"
#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update"
-#define D_OTA_UPDATE_COMPLETE "OTA Update complete"
-#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot"
-#define D_OTA_UPDATE_FAILED "OTA Update failed"
-#define D_OTA_UPDATING_FIRMWARE "Updating firmware..."
-#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..."
+#define D_OTA_UPDATE_COMPLETE "OTA Update komplett"
+#define D_OTA_UPDATE_APPLY "Firmware anwenden & Neustart"
+#define D_OTA_UPDATE_FAILED "OTA Update fehlerhaft"
+#define D_OTA_UPDATING_FIRMWARE "Aktualisiere Firmware..."
+#define D_OTA_UPDATING_FILESYSTEM "Aktualisiere Dateisystem..."
#define D_HTTP_HASP_DESIGN "HASP Design"
#define D_HTTP_INFORMATION "Information"
-#define D_HTTP_HTTP_SETTINGS "HTTP Settings"
-#define D_HTTP_FTP_SETTINGS "FTP Settings"
-#define D_HTTP_WIFI_SETTINGS "Wifi Settings"
-#define D_HTTP_MQTT_SETTINGS "MQTT Settings"
-#define D_HTTP_GPIO_SETTINGS "GPIO Settings"
-#define D_HTTP_MDNS_SETTINGS "mDNS Settings"
-#define D_HTTP_TELNET_SETTINGS "Telnet Settings"
-#define D_HTTP_DEBUG_SETTINGS "Debug Settings"
-#define D_HTTP_GUI_SETTINGS "Display Settings"
-#define D_HTTP_SAVE_SETTINGS "Save Settings"
-#define D_HTTP_UPLOAD_FILE "Upload File"
-#define D_HTTP_ERASE_DEVICE "Reset All Settings"
-#define D_HTTP_ADD_GPIO "Add New Pin"
-#define D_HTTP_BACK "Back"
-#define D_HTTP_REFRESH "Refresh"
-#define D_HTTP_PREV_PAGE "Prev Page"
-#define D_HTTP_NEXT_PAGE "Next Page"
-#define D_HTTP_CALIBRATE "Calibrate"
+#define D_HTTP_HTTP_SETTINGS "HTTP Einstellungen"
+#define D_HTTP_FTP_SETTINGS "FTP Einstellungen"
+#define D_HTTP_WIFI_SETTINGS "Wifi Einstellungen"
+#define D_HTTP_MQTT_SETTINGS "MQTT Einstellungen"
+#define D_HTTP_GPIO_SETTINGS "GPIO Einstellungen"
+#define D_HTTP_MDNS_SETTINGS "mDNS Einstellungen"
+#define D_HTTP_TELNET_SETTINGS "Telnet Einstellungen"
+#define D_HTTP_DEBUG_SETTINGS "Debug Einstellungen"
+#define D_HTTP_GUI_SETTINGS "Display Einstellungen"
+#define D_HTTP_SAVE_SETTINGS "Save Einstellungen"
+#define D_HTTP_UPLOAD_FILE "Datei hochladen"
+#define D_HTTP_ERASE_DEVICE "Alle Einstellungen zurücksetzten"
+#define D_HTTP_ADD_GPIO "Neuen Pin hinzufügen"
+#define D_HTTP_BACK "Zurück"
+#define D_HTTP_REFRESH "Auffrischen"
+#define D_HTTP_PREV_PAGE "Vorherige Seite"
+#define D_HTTP_NEXT_PAGE "Nächste Seite"
+#define D_HTTP_CALIBRATE "Kalibrieren"
#define D_HTTP_ANTIBURN "Run Anti Burn-in"
-#define D_HTTP_SCREENSHOT "Screenshot"
-#define D_HTTP_FILE_BROWSER "File Editor"
+#define D_HTTP_SCREENSHOT "Bildschirm Foto"
+#define D_HTTP_FILE_BROWSER "Datei-Editor"
#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade"
#define D_HTTP_UPDATE_FIRMWARE "Update Firmware"
-#define D_HTTP_FACTORY_RESET "Factory Reset"
-#define D_HTTP_MAIN_MENU "Main Menu"
-#define D_HTTP_REBOOT "Restart"
-#define D_HTTP_CONFIGURATION "Configuration"
+#define D_HTTP_FACTORY_RESET "Werkseinstellung"
+#define D_HTTP_MAIN_MENU "Hauptmenü"
+#define D_HTTP_REBOOT "Neustart"
+#define D_HTTP_CONFIGURATION "Konfiguration"
#define D_HTTP_CONFIG_CHANGED \
- "The configuration has changed, please click Restart to save changes to flash."
-#define D_HTTP_SENDING_PAGE "Sent %S page to %s"
-#define D_HTTP_FOOTER "by Francis Van Roie"
+ "Konfiguration wurde geändert, bitte klicke Neustart zum Speichern der Änderen im Flash."
+#define D_HTTP_SENDING_PAGE "Sende %S Seiten an %s"
+#define D_HTTP_FOOTER "von Francis Van Roie"
#define D_INFO_VERSION "Version"
-#define D_INFO_BUILD_DATETIME "Build DateTime"
-#define D_INFO_ENVIRONMENT "Environment"
-#define D_INFO_UPTIME "Uptime"
+#define D_INFO_BUILD_DATETIME "Erstellungsdatum/-zeit"
+#define D_INFO_ENVIRONMENT "Umgebung"
+#define D_INFO_UPTIME "Betriebszeit"
#define D_INFO_FREE_HEAP "Free Heap"
#define D_INFO_FREE_BLOCK "Free Block"
-#define D_INFO_DEVICE_MEMORY "Device Memory"
-#define D_INFO_LVGL_MEMORY "LVGL Memory"
-#define D_INFO_TOTAL_MEMORY "Total"
-#define D_INFO_FREE_MEMORY "Free"
+#define D_INFO_DEVICE_MEMORY "Geräte Speicher"
+#define D_INFO_LVGL_MEMORY "LVGL Speicher"
+#define D_INFO_TOTAL_MEMORY "Gesamt"
+#define D_INFO_FREE_MEMORY "Frei"
#define D_INFO_FRAGMENTATION "Fragmentation"
-#define D_INFO_PSRAM_FREE "PSRam Free"
-#define D_INFO_PSRAM_SIZE "PSRam Size"
-#define D_INFO_FLASH_SIZE "Flash Size"
-#define D_INFO_SKETCH_USED "Program Size Used"
-#define D_INFO_SKETCH_FREE "Program Size Free"
-#define D_INFO_FS_SIZE "Filesystem Size"
-#define D_INFO_FS_USED "Filesystem Used"
-#define D_INFO_FS_FREE "Filesystem Free"
+#define D_INFO_PSRAM_FREE "PSRam Frei"
+#define D_INFO_PSRAM_SIZE "PSRam Größe"
+#define D_INFO_FLASH_SIZE "Flash Größe"
+#define D_INFO_SKETCH_USED "Programmspeicher genutzt"
+#define D_INFO_SKETCH_FREE "Programmspeicher frei"
+#define D_INFO_FS_SIZE "Dateisystem Größe"
+#define D_INFO_FS_USED "Dateisystem genutzt"
+#define D_INFO_FS_FREE "Dateisystem frei"
#define D_INFO_MODULE "Module"
#define D_INFO_MODEL "Model"
-#define D_INFO_FREQUENCY "Frequency"
+#define D_INFO_FREQUENCY "Frequenz"
#define D_INFO_CORE_VERSION "Core Version"
-#define D_INFO_RESET_REASON "Reset Reason"
+#define D_INFO_RESET_REASON "Neustart Ursache"
#define D_INFO_STATUS "Status"
#define D_INFO_SERVER "Server"
-#define D_INFO_USERNAME "Username"
+#define D_INFO_USERNAME "Benutzer"
#define D_INFO_CLIENTID "Client ID"
-// #define D_INFO_CONNECTED "Connected"
-// #define D_INFO_DISCONNECTED "Disconnected"
-#define D_INFO_RECEIVED "Received"
-#define D_INFO_PUBLISHED "Published"
-#define D_INFO_FAILED "Failed"
+// #define D_INFO_CONNECTED "Verbunden"
+// #define D_INFO_DISCONNECTED "Getrennt"
+#define D_INFO_RECEIVED "Empfangen"
+#define D_INFO_PUBLISHED "Publiziert"
+#define D_INFO_FAILED "Fehlerhaft"
#define D_INFO_ETHERNET "Ethernet"
#define D_INFO_WIFI "Wifi"
-#define D_INFO_LINK_SPEED "Link Speed"
+#define D_INFO_LINK_SPEED "Datenrate"
#define D_INFO_FULL_DUPLEX "Full Duplex"
#define D_INFO_BSSID "BSSID"
#define D_INFO_SSID "SSID"
-#define D_INFO_RSSI "Signal Strength"
-#define D_INFO_IP_ADDRESS "IP Address"
-#define D_INFO_MAC_ADDRESS "MAC Address"
+#define D_INFO_RSSI "Signal Stärke"
+#define D_INFO_IP_ADDRESS "IP Addresse"
+#define D_INFO_MAC_ADDRESS "MAC Addresse"
#define D_INFO_GATEWAY "Gateway"
#define D_INFO_DNS_SERVER "DNS Server"
-#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:"
-#define D_OOBE_SCAN_TO_CONNECT "Scan to connect"
+#define D_OOBE_MSG "Tippen Sie auf den Bildschirm, um WiFi einzurichten oder zum verbindem mit dem Access Point:"
+#define D_OOBE_SCAN_TO_CONNECT "Suche zum verbinden"
-#define D_WIFI_CONNECTING_TO "Connecting to %s"
-#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..."
-#define D_WIFI_RSSI_EXCELLENT "Excellent"
-#define D_WIFI_RSSI_GOOD "Good"
-#define D_WIFI_RSSI_FAIR "Fair"
-#define D_WIFI_RSSI_WEAK "Weak"
-#define D_WIFI_RSSI_BAD "Very bad"
+#define D_WIFI_CONNECTING_TO "Verbinden mit %s"
+#define D_WIFI_CONNECTED_TO "Verbinden mit %s, IP anfordern..."
+#define D_WIFI_RSSI_EXCELLENT "Exzellent"
+#define D_WIFI_RSSI_GOOD "Gut"
+#define D_WIFI_RSSI_FAIR "Durchschnittlich"
+#define D_WIFI_RSSI_WEAK "Schwach"
+#define D_WIFI_RSSI_BAD "Sehr schlecht"
// new
-#define D_GPIO_SWITCH "Switch"
-#define D_GPIO_BUTTON "Push Button"
-#define D_GPIO_TOUCH "Capacitive Touch"
-#define D_GPIO_LED "Led"
-#define D_GPIO_LED_R "Mood Red"
-#define D_GPIO_LED_G "Mood Green"
-#define D_GPIO_LED_B "Mood Blue"
-#define D_GPIO_POWER_RELAY "Power Relay"
-#define D_GPIO_LIGHT_RELAY "Light Relay"
+#define D_GPIO_SWITCH "Schalter"
+#define D_GPIO_BUTTON "Druckknopf"
+#define D_GPIO_TOUCH "Kapazitiver Touch"
+#define D_GPIO_LED "LED"
+#define D_GPIO_LED_R "Stimmung Rot"
+#define D_GPIO_LED_G "Stimmung Grün"
+#define D_GPIO_LED_B "Stimmung Blau"
+#define D_GPIO_POWER_RELAY "Last Relay"
+#define D_GPIO_LIGHT_RELAY "Licht Relay"
#define D_GPIO_PWM "PWM"
#define D_GPIO_DAC "DAC"
-#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
-#define D_GPIO_UNKNOWN "Unknown"
+#define D_GPIO_SERIAL_DIMMER "Serieller Dimmer"
+#define D_GPIO_UNKNOWN "Unbekannt"
#define D_GPIO_PIN "Pin"
-#define D_GPIO_GROUP "Group"
-#define D_GPIO_GROUP_NONE "None"
+#define D_GPIO_GROUP "Gruppe"
+#define D_GPIO_GROUP_NONE "Keine"
#define D_GPIO_STATE_NORMAL "Normal"
-#define D_GPIO_STATE_INVERTED "Inverted"
+#define D_GPIO_STATE_INVERTED "Invertiert"
#endif
\ No newline at end of file
From c0edb143c386aa22e72e0e1dc64d94bf4065c4ad Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Tue, 22 Aug 2023 16:41:12 +0200
Subject: [PATCH 62/90] Updatre translation en_US
---
src/lang/en_US.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/lang/en_US.h b/src/lang/en_US.h
index d9f83733..4e606669 100644
--- a/src/lang/en_US.h
+++ b/src/lang/en_US.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_EN_US_H
#define HASP_LANG_EN_US_H
From 97c4f7550d2c927e6491e86d22a8c3db985baca3 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Tue, 22 Aug 2023 16:43:46 +0200
Subject: [PATCH 63/90] Update translations en_US
---
src/lang/en_US.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/lang/en_US.h b/src/lang/en_US.h
index 4e606669..b24d806d 100644
--- a/src/lang/en_US.h
+++ b/src/lang/en_US.h
@@ -212,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Weak"
#define D_WIFI_RSSI_BAD "Very bad"
-// new
#define D_GPIO_SWITCH "Switch"
#define D_GPIO_BUTTON "Push Button"
#define D_GPIO_TOUCH "Capacitive Touch"
From 598bfb06ca724cadc69f93bb0e67773631342aee Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:19 +0200
Subject: [PATCH 64/90] New translations en_US.h (Romanian)
---
src/lang/ro_RO.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/lang/ro_RO.h b/src/lang/ro_RO.h
index d9f83733..b24d806d 100644
--- a/src/lang/ro_RO.h
+++ b/src/lang/ro_RO.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_EN_US_H
#define HASP_LANG_EN_US_H
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Weak"
#define D_WIFI_RSSI_BAD "Very bad"
-// new
#define D_GPIO_SWITCH "Switch"
#define D_GPIO_BUTTON "Push Button"
#define D_GPIO_TOUCH "Capacitive Touch"
From e7f57e24054dcf0dd87601bc62e0e9e2df78975f Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:20 +0200
Subject: [PATCH 65/90] New translations en_US.h (French)
---
src/lang/fr_FR.h | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/lang/fr_FR.h b/src/lang/fr_FR.h
index 0f246bfc..aa5748a1 100644
--- a/src/lang/fr_FR.h
+++ b/src/lang/fr_FR.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_FR_FR_H
#define HASP_LANG_FR_FR_H
@@ -10,7 +13,7 @@
#define D_NO "Non"
#define D_ERROR_OUT_OF_MEMORY "Mémoire insuffisante "
-#define D_ERROR_UNKNOWN "Unknown error"
+#define D_ERROR_UNKNOWN "Erreur inconnue"
#define D_CONFIG_NOT_CHANGED "Paramètres pas modifiés"
#define D_CONFIG_CHANGED "Paramètres modifiés"
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Faible"
#define D_WIFI_RSSI_BAD "Très mauvais"
-// new
#define D_GPIO_SWITCH "Interrupteur"
#define D_GPIO_BUTTON "Bouton"
#define D_GPIO_TOUCH "Touche Capacitive"
From a3e2f8dbbbc7dcfd359b90ab6822c9ff0baad343 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:21 +0200
Subject: [PATCH 66/90] New translations en_US.h (Spanish)
---
src/lang/es_ES.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/lang/es_ES.h b/src/lang/es_ES.h
index c293888b..45938eb1 100644
--- a/src/lang/es_ES.h
+++ b/src/lang/es_ES.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_ES_ES_H
#define HASP_LANG_ES_ES_H
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Débil"
#define D_WIFI_RSSI_BAD "Muy baka"
-// new
#define D_GPIO_SWITCH "Switch"
#define D_GPIO_BUTTON "Botón"
#define D_GPIO_TOUCH "Capacitive Touch" // new
From 06131f4171c9773f9bb67ea01e329e7f52d1f189 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:22 +0200
Subject: [PATCH 67/90] New translations en_US.h (Danish)
---
src/lang/da_DK.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/lang/da_DK.h b/src/lang/da_DK.h
index d9f83733..b24d806d 100644
--- a/src/lang/da_DK.h
+++ b/src/lang/da_DK.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_EN_US_H
#define HASP_LANG_EN_US_H
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Weak"
#define D_WIFI_RSSI_BAD "Very bad"
-// new
#define D_GPIO_SWITCH "Switch"
#define D_GPIO_BUTTON "Push Button"
#define D_GPIO_TOUCH "Capacitive Touch"
From da39d2b37aa76d5736fb13787d00436400fcab0f Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:23 +0200
Subject: [PATCH 68/90] New translations en_US.h (German)
---
src/lang/de_DE.h | 344 ++++++++++++++++++++++++-----------------------
1 file changed, 173 insertions(+), 171 deletions(-)
diff --git a/src/lang/de_DE.h b/src/lang/de_DE.h
index 0db41294..b24d806d 100644
--- a/src/lang/de_DE.h
+++ b/src/lang/de_DE.h
@@ -1,232 +1,234 @@
-#ifndef HASP_LANG_DE_DE_H
-#define HASP_LANG_DE_DE_H
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
-#define D_ISO_LANG_CODE "de-DE"
+#ifndef HASP_LANG_EN_US_H
+#define HASP_LANG_EN_US_H
-#define D_USERNAME "Benutzer:"
-#define D_PASSWORD "Kennwort:"
+#define D_ISO_LANG_CODE "en-US"
+
+#define D_USERNAME "Username:"
+#define D_PASSWORD "Password:"
#define D_SSID "Ssid:"
-#define D_YES "Ja"
-#define D_NO "Nein"
+#define D_YES "Yes"
+#define D_NO "No"
-#define D_ERROR_OUT_OF_MEMORY "Nicht genug Speicher"
-#define D_ERROR_UNKNOWN "Unbekannter Fehler"
+#define D_ERROR_OUT_OF_MEMORY "Out of memory"
+#define D_ERROR_UNKNOWN "Unknown error"
-#define D_CONFIG_NOT_CHANGED "Einstellungen nicht geändert"
-#define D_CONFIG_CHANGED "Einstellungen geändert"
-#define D_CONFIG_LOADED "Einstellungen geladen"
+#define D_CONFIG_NOT_CHANGED "Settings did not change"
+#define D_CONFIG_CHANGED "Settings changed"
+#define D_CONFIG_LOADED "Settings loaded"
-#define D_FILE_LOADING "Laden %s"
-#define D_FILE_LOADED "Geladen %s"
-#define D_FILE_LOAD_FAILED "Fehler beim Laden %s"
-#define D_FILE_SAVING "Speichern %s"
-#define D_FILE_SAVED "Gespeichert %s"
-#define D_FILE_SAVE_FAILED "Fehler beim Speichern %s"
-#define D_FILE_NOT_FOUND "Datei nicht gefunden"
-#define D_FILE_SIZE_BYTES "Bytes"
+#define D_FILE_LOADING "Loading %s"
+#define D_FILE_LOADED "Loaded %s"
+#define D_FILE_LOAD_FAILED "Failed to load %s"
+#define D_FILE_SAVING "Saving %s"
+#define D_FILE_SAVED "Saved %s"
+#define D_FILE_SAVE_FAILED "Failed to save %s"
+#define D_FILE_NOT_FOUND "File not found"
+#define D_FILE_SIZE_BYTES "bytes"
#define D_FILE_SIZE_KILOBYTES "KiB"
#define D_FILE_SIZE_MEGABYTES "MiB"
#define D_FILE_SIZE_GIGABYTES "GiB"
#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
-#define D_DECIMAL_POINT "," // decimal comma or point
+#define D_DECIMAL_POINT "." // decimal comma or point
-#define D_SERVICE_STARTING "Starten..."
-#define D_SERVICE_STARTED "Gestartet"
-#define D_SERVICE_START_FAILED "Fehler beim Start"
-#define D_SERVICE_STOPPED "Angehalten"
-#define D_SERVICE_DISABLED "Deaktiviert"
-#define D_SERVICE_CONNECTED "Verbunden"
-#define D_SERVICE_DISCONNECTED "Getrennt"
+#define D_SERVICE_STARTING "Starting..."
+#define D_SERVICE_STARTED "Started"
+#define D_SERVICE_START_FAILED "Failed to start"
+#define D_SERVICE_STOPPED "Stopped"
+#define D_SERVICE_DISABLED "Disabled"
+#define D_SERVICE_CONNECTED "Connected"
+#define D_SERVICE_DISCONNECTED "Disconnected"
-#define D_SETTING_ENABLED "Aktiviert"
-#define D_SETTING_DISABLED "Deaktiviert"
-#define D_SETTING_DEFAULT "Standard"
+#define D_SETTING_ENABLED "Enabled"
+#define D_SETTING_DISABLED "Disabled"
+#define D_SETTING_DEFAULT "Default"
-#define D_NETWORK_IP_ADDRESS_RECEIVED "IP Addresse empfangen %s"
+#define D_NETWORK_IP_ADDRESS_RECEIVED "Received IP address %s"
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
-#define D_NETWORK_CONNECTION_FAILED "Verbinden fehlgeschlagen"
-#define D_NETWORK_CONNECTION_UNAUTHORIZED "Autorisieren fehlgeschlagen"
+#define D_NETWORK_CONNECTION_FAILED "Connection failed"
+#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
#define D_MQTT_DEFAULT_NAME "plate_%s"
-#define D_MQTT_CONNECTING "Verbinden..."
-#define D_MQTT_CONNECTED "Verbunden mit Broker %s mit ClientID %s"
-#define D_MQTT_NOT_CONNECTED "Nicht verbunden ???"
-#define D_MQTT_DISCONNECTING "Trennen..."
-#define D_MQTT_DISCONNECTED "Getrennt"
-#define D_MQTT_RECONNECTING "Getrennt vom Broker, erneut verbinden..."
-#define D_MQTT_NOT_CONFIGURED "Broker nicht konfiguriert"
-#define D_MQTT_STARTED "Gestartet: %d Bytes"
-#define D_MQTT_FAILED "Fehlgeschlagen:"
-#define D_MQTT_INVALID_TOPIC "Nachricht hat ungültigen Topic"
-#define D_MQTT_SUBSCRIBED "Abboniert von %s"
-#define D_MQTT_NOT_SUBSCRIBED "Abbonieren von %s fehlgeschlagen"
-#define D_MQTT_HA_AUTO_DISCOVERY "Registriere HA auto-discovery"
-#define D_MQTT_PAYLOAD_TOO_LONG "Nutzdaten zu lang (%u Bytes)"
+#define D_MQTT_CONNECTING "Connecting..."
+#define D_MQTT_CONNECTED "Connected to broker %s as clientID %s"
+#define D_MQTT_NOT_CONNECTED "Not connected ???"
+#define D_MQTT_DISCONNECTING "Disconnecting..."
+#define D_MQTT_DISCONNECTED "Disconnected"
+#define D_MQTT_RECONNECTING "Disconnected from broker, reconnection..."
+#define D_MQTT_NOT_CONFIGURED "Broker not configured"
+#define D_MQTT_STARTED "Started: %d bytes"
+#define D_MQTT_FAILED "Failed:"
+#define D_MQTT_INVALID_TOPIC "Message has invalid topic"
+#define D_MQTT_SUBSCRIBED "Subscribed to %s"
+#define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s"
+#define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery"
+#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%u bytes)"
-#define D_TELNET_CLOSING_CONNECTION "Schließe Sitzung von %s"
-#define D_TELNET_CLIENT_LOGIN_FROM "Client Login von %s"
-#define D_TELNET_CLIENT_CONNECT_FROM "Client verbunden von %s"
-#define D_TELNET_CLIENT_NOT_CONNECTED "Client nicht verbunden"
-#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Fehlerhafter Anmeldeversuch von %s"
-#define D_TELNET_STARTED "Telnet-Konsole gestartet"
-#define D_TELNET_FAILED "Fehler beim Start der Telnet-Konsole"
-#define D_TELNET_CLIENT_CONNECTED "CClient verbunden"
-#define D_TELNET_CLIENT_REJECTED "Client abgewiesen"
+#define D_TELNET_CLOSING_CONNECTION "Closing session from %s"
+#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
+#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
+#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
+#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
+#define D_TELNET_STARTED "Telnet console started"
+#define D_TELNET_FAILED "Failed to start telnet console"
+#define D_TELNET_CLIENT_CONNECTED "Client connected"
+#define D_TELNET_CLIENT_REJECTED "Client rejected"
-#define D_HASP_INVALID_PAGE "Ungültige Seite %u"
-#define D_HASP_INVALID_LAYER "System-Layer kann nicht gelöscht werden"
-#define D_HASP_CHANGE_PAGE "Seite gewechselt zu %u"
-#define D_HASP_CLEAR_PAGE "Seite %u gelöscht"
+#define D_HASP_INVALID_PAGE "Invalid page %u"
+#define D_HASP_INVALID_LAYER "Cannot clear system layer"
+#define D_HASP_CHANGE_PAGE "Changing page to %u"
+#define D_HASP_CLEAR_PAGE "Clearing page %u"
-#define D_OBJECT_DELETED "Objekt entfernt"
-#define D_OBJECT_UNKNOWN "Ungekanntes Objekt"
-#define D_OBJECT_MISMATCH "Objekte stimmen nicht überein!"
-#define D_OBJECT_LOST "Objekt verloren!"
-#define D_OBJECT_CREATE_FAILED "Fehler beim erstellen der Objekt ID %u"
-#define D_OBJECT_PAGE_UNKNOWN "Seiten ID %u nicht bekannt"
-#define D_OBJECT_EVENT_UNKNOWN "Unbekanntes Ereignis %d"
+#define D_OBJECT_DELETED "Object deleted"
+#define D_OBJECT_UNKNOWN "Unknown object"
+#define D_OBJECT_MISMATCH "Objects DO NOT match!"
+#define D_OBJECT_LOST "Lost object!"
+#define D_OBJECT_CREATE_FAILED "Failed to create object id %u"
+#define D_OBJECT_PAGE_UNKNOWN "Page ID %u not defined"
+#define D_OBJECT_EVENT_UNKNOWN "Unknown Event %d"
-#define D_ATTRIBUTE_UNKNOWN "Unbekannte Eigenschaft %s"
+#define D_ATTRIBUTE_UNKNOWN "Unknown property %s"
// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
-#define D_ATTRIBUTE_OBSOLETE "%s ist veraltet"
-#define D_ATTRIBUTE_INSTEAD ", benutze %s stattdessen"
-#define D_ATTRIBUTE_READ_ONLY "%s kann nur gelesen werden"
-#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Aufruf auf Seite %s nicht möglich"
-#define D_ATTRIBUTE_ALIGN_INVALID "Ungültige Ausrichtung: %s"
-#define D_ATTRIBUTE_COLOR_INVALID "Ungültige Farbe: %s"
-#define D_ATTRIBUTE_LONG_MODE_INVALID "Ungültiger long mode: %s"
+#define D_ATTRIBUTE_OBSOLETE "%s is obsolete"
+#define D_ATTRIBUTE_INSTEAD ", use %s instead"
+#define D_ATTRIBUTE_READ_ONLY "%s is read-only"
+#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Unable to call %s on a page"
+#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s"
+#define D_ATTRIBUTE_COLOR_INVALID "Invalid color property: %s"
+#define D_ATTRIBUTE_LONG_MODE_INVALID "Invalid long mode: %s"
-#define D_OOBE_SSID_VALIDATED "SSID %s überprüft"
-#define D_OOBE_AUTO_CALIBRATE "Autokalibrierung aktiviert"
-#define D_OOBE_CALIBRATED "Bereits kalibriert"
+#define D_OOBE_SSID_VALIDATED "SSID %s validated"
+#define D_OOBE_AUTO_CALIBRATE "Auto calibrate enabled"
+#define D_OOBE_CALIBRATED "Already calibrated"
-#define D_DISPATCH_COMMAND_NOT_FOUND "Kommando '%s' nicht gefunden"
-#define D_DISPATCH_INVALID_PAGE "Ungültige Seite %s"
-#define D_DISPATCH_REBOOT "Neustart der MCU jetzt!"
+#define D_DISPATCH_COMMAND_NOT_FOUND "Command '%s' not found"
+#define D_DISPATCH_INVALID_PAGE "Invalid page %s"
+#define D_DISPATCH_REBOOT "Rebooting the MCU now!"
-#define D_JSON_FAILED "JSON-Analyse fehlgeschlagen:"
-#define D_JSONL_FAILED "JSONL-Analyse fehlgeschlagen in Zeile %u"
-#define D_JSONL_SUCCEEDED "Jsonl-Analyse komplett"
+#define D_JSON_FAILED "JSON parsing failed:"
+#define D_JSONL_FAILED "JSONL parsing failed at line %u"
+#define D_JSONL_SUCCEEDED "Jsonl fully parsed"
-#define D_OTA_CHECK_UPDATE "Probiere Update URL: %s"
-#define D_OTA_CHECK_COMPLETE "Update-Test komplett"
-#define D_OTA_CHECK_FAILED "Update-Test fehlerhaft: %s"
+#define D_OTA_CHECK_UPDATE "Trying update URL: %s"
+#define D_OTA_CHECK_COMPLETE "Update check complete"
+#define D_OTA_CHECK_FAILED "Update check failed: %s"
#define D_OTA_UPDATE_FIRMWARE "OTA Firmware Update"
-#define D_OTA_UPDATE_COMPLETE "OTA Update komplett"
-#define D_OTA_UPDATE_APPLY "Firmware anwenden & Neustart"
-#define D_OTA_UPDATE_FAILED "OTA Update fehlerhaft"
-#define D_OTA_UPDATING_FIRMWARE "Aktualisiere Firmware..."
-#define D_OTA_UPDATING_FILESYSTEM "Aktualisiere Dateisystem..."
+#define D_OTA_UPDATE_COMPLETE "OTA Update complete"
+#define D_OTA_UPDATE_APPLY "Applying Firmware & Reboot"
+#define D_OTA_UPDATE_FAILED "OTA Update failed"
+#define D_OTA_UPDATING_FIRMWARE "Updating firmware..."
+#define D_OTA_UPDATING_FILESYSTEM "Updating filesystem..."
#define D_HTTP_HASP_DESIGN "HASP Design"
#define D_HTTP_INFORMATION "Information"
-#define D_HTTP_HTTP_SETTINGS "HTTP Einstellungen"
-#define D_HTTP_FTP_SETTINGS "FTP Einstellungen"
-#define D_HTTP_WIFI_SETTINGS "Wifi Einstellungen"
-#define D_HTTP_MQTT_SETTINGS "MQTT Einstellungen"
-#define D_HTTP_GPIO_SETTINGS "GPIO Einstellungen"
-#define D_HTTP_MDNS_SETTINGS "mDNS Einstellungen"
-#define D_HTTP_TELNET_SETTINGS "Telnet Einstellungen"
-#define D_HTTP_DEBUG_SETTINGS "Debug Einstellungen"
-#define D_HTTP_GUI_SETTINGS "Display Einstellungen"
-#define D_HTTP_SAVE_SETTINGS "Save Einstellungen"
-#define D_HTTP_UPLOAD_FILE "Datei hochladen"
-#define D_HTTP_ERASE_DEVICE "Alle Einstellungen zurücksetzten"
-#define D_HTTP_ADD_GPIO "Neuen Pin hinzufügen"
-#define D_HTTP_BACK "Zurück"
-#define D_HTTP_REFRESH "Auffrischen"
-#define D_HTTP_PREV_PAGE "Vorherige Seite"
-#define D_HTTP_NEXT_PAGE "Nächste Seite"
-#define D_HTTP_CALIBRATE "Kalibrieren"
+#define D_HTTP_HTTP_SETTINGS "HTTP Settings"
+#define D_HTTP_FTP_SETTINGS "FTP Settings"
+#define D_HTTP_WIFI_SETTINGS "Wifi Settings"
+#define D_HTTP_MQTT_SETTINGS "MQTT Settings"
+#define D_HTTP_GPIO_SETTINGS "GPIO Settings"
+#define D_HTTP_MDNS_SETTINGS "mDNS Settings"
+#define D_HTTP_TELNET_SETTINGS "Telnet Settings"
+#define D_HTTP_DEBUG_SETTINGS "Debug Settings"
+#define D_HTTP_GUI_SETTINGS "Display Settings"
+#define D_HTTP_SAVE_SETTINGS "Save Settings"
+#define D_HTTP_UPLOAD_FILE "Upload File"
+#define D_HTTP_ERASE_DEVICE "Reset All Settings"
+#define D_HTTP_ADD_GPIO "Add New Pin"
+#define D_HTTP_BACK "Back"
+#define D_HTTP_REFRESH "Refresh"
+#define D_HTTP_PREV_PAGE "Prev Page"
+#define D_HTTP_NEXT_PAGE "Next Page"
+#define D_HTTP_CALIBRATE "Calibrate"
#define D_HTTP_ANTIBURN "Run Anti Burn-in"
-#define D_HTTP_SCREENSHOT "Bildschirm Foto"
-#define D_HTTP_FILE_BROWSER "Datei-Editor"
+#define D_HTTP_SCREENSHOT "Screenshot"
+#define D_HTTP_FILE_BROWSER "File Editor"
#define D_HTTP_FIRMWARE_UPGRADE "Firmware Upgrade"
#define D_HTTP_UPDATE_FIRMWARE "Update Firmware"
-#define D_HTTP_FACTORY_RESET "Werkseinstellung"
-#define D_HTTP_MAIN_MENU "Hauptmenü"
-#define D_HTTP_REBOOT "Neustart"
-#define D_HTTP_CONFIGURATION "Konfiguration"
+#define D_HTTP_FACTORY_RESET "Factory Reset"
+#define D_HTTP_MAIN_MENU "Main Menu"
+#define D_HTTP_REBOOT "Restart"
+#define D_HTTP_CONFIGURATION "Configuration"
#define D_HTTP_CONFIG_CHANGED \
- "Konfiguration wurde geändert, bitte klicke Neustart zum Speichern der Änderen im Flash."
-#define D_HTTP_SENDING_PAGE "Sende %S Seiten an %s"
-#define D_HTTP_FOOTER "von Francis Van Roie"
+ "The configuration has changed, please click Restart to save changes to flash."
+#define D_HTTP_SENDING_PAGE "Sent %S page to %s"
+#define D_HTTP_FOOTER "by Francis Van Roie"
#define D_INFO_VERSION "Version"
-#define D_INFO_BUILD_DATETIME "Erstellungsdatum/-zeit"
-#define D_INFO_ENVIRONMENT "Umgebung"
-#define D_INFO_UPTIME "Betriebszeit"
+#define D_INFO_BUILD_DATETIME "Build DateTime"
+#define D_INFO_ENVIRONMENT "Environment"
+#define D_INFO_UPTIME "Uptime"
#define D_INFO_FREE_HEAP "Free Heap"
#define D_INFO_FREE_BLOCK "Free Block"
-#define D_INFO_DEVICE_MEMORY "Geräte Speicher"
-#define D_INFO_LVGL_MEMORY "LVGL Speicher"
-#define D_INFO_TOTAL_MEMORY "Gesamt"
-#define D_INFO_FREE_MEMORY "Frei"
+#define D_INFO_DEVICE_MEMORY "Device Memory"
+#define D_INFO_LVGL_MEMORY "LVGL Memory"
+#define D_INFO_TOTAL_MEMORY "Total"
+#define D_INFO_FREE_MEMORY "Free"
#define D_INFO_FRAGMENTATION "Fragmentation"
-#define D_INFO_PSRAM_FREE "PSRam Frei"
-#define D_INFO_PSRAM_SIZE "PSRam Größe"
-#define D_INFO_FLASH_SIZE "Flash Größe"
-#define D_INFO_SKETCH_USED "Programmspeicher genutzt"
-#define D_INFO_SKETCH_FREE "Programmspeicher frei"
-#define D_INFO_FS_SIZE "Dateisystem Größe"
-#define D_INFO_FS_USED "Dateisystem genutzt"
-#define D_INFO_FS_FREE "Dateisystem frei"
+#define D_INFO_PSRAM_FREE "PSRam Free"
+#define D_INFO_PSRAM_SIZE "PSRam Size"
+#define D_INFO_FLASH_SIZE "Flash Size"
+#define D_INFO_SKETCH_USED "Program Size Used"
+#define D_INFO_SKETCH_FREE "Program Size Free"
+#define D_INFO_FS_SIZE "Filesystem Size"
+#define D_INFO_FS_USED "Filesystem Used"
+#define D_INFO_FS_FREE "Filesystem Free"
#define D_INFO_MODULE "Module"
#define D_INFO_MODEL "Model"
-#define D_INFO_FREQUENCY "Frequenz"
+#define D_INFO_FREQUENCY "Frequency"
#define D_INFO_CORE_VERSION "Core Version"
-#define D_INFO_RESET_REASON "Neustart Ursache"
+#define D_INFO_RESET_REASON "Reset Reason"
#define D_INFO_STATUS "Status"
#define D_INFO_SERVER "Server"
-#define D_INFO_USERNAME "Benutzer"
+#define D_INFO_USERNAME "Username"
#define D_INFO_CLIENTID "Client ID"
-// #define D_INFO_CONNECTED "Verbunden"
-// #define D_INFO_DISCONNECTED "Getrennt"
-#define D_INFO_RECEIVED "Empfangen"
-#define D_INFO_PUBLISHED "Publiziert"
-#define D_INFO_FAILED "Fehlerhaft"
+// #define D_INFO_CONNECTED "Connected"
+// #define D_INFO_DISCONNECTED "Disconnected"
+#define D_INFO_RECEIVED "Received"
+#define D_INFO_PUBLISHED "Published"
+#define D_INFO_FAILED "Failed"
#define D_INFO_ETHERNET "Ethernet"
#define D_INFO_WIFI "Wifi"
-#define D_INFO_LINK_SPEED "Datenrate"
+#define D_INFO_LINK_SPEED "Link Speed"
#define D_INFO_FULL_DUPLEX "Full Duplex"
#define D_INFO_BSSID "BSSID"
#define D_INFO_SSID "SSID"
-#define D_INFO_RSSI "Signal Stärke"
-#define D_INFO_IP_ADDRESS "IP Addresse"
-#define D_INFO_MAC_ADDRESS "MAC Addresse"
+#define D_INFO_RSSI "Signal Strength"
+#define D_INFO_IP_ADDRESS "IP Address"
+#define D_INFO_MAC_ADDRESS "MAC Address"
#define D_INFO_GATEWAY "Gateway"
#define D_INFO_DNS_SERVER "DNS Server"
-#define D_OOBE_MSG "Tippen Sie auf den Bildschirm, um WiFi einzurichten oder zum verbindem mit dem Access Point:"
-#define D_OOBE_SCAN_TO_CONNECT "Suche zum verbinden"
+#define D_OOBE_MSG "Tap the screen to setup WiFi or connect to this Access Point:"
+#define D_OOBE_SCAN_TO_CONNECT "Scan to connect"
-#define D_WIFI_CONNECTING_TO "Verbinden mit %s"
-#define D_WIFI_CONNECTED_TO "Verbinden mit %s, IP anfordern..."
-#define D_WIFI_RSSI_EXCELLENT "Exzellent"
-#define D_WIFI_RSSI_GOOD "Gut"
-#define D_WIFI_RSSI_FAIR "Durchschnittlich"
-#define D_WIFI_RSSI_WEAK "Schwach"
-#define D_WIFI_RSSI_BAD "Sehr schlecht"
+#define D_WIFI_CONNECTING_TO "Connecting to %s"
+#define D_WIFI_CONNECTED_TO "Connected to %s, requesting IP..."
+#define D_WIFI_RSSI_EXCELLENT "Excellent"
+#define D_WIFI_RSSI_GOOD "Good"
+#define D_WIFI_RSSI_FAIR "Fair"
+#define D_WIFI_RSSI_WEAK "Weak"
+#define D_WIFI_RSSI_BAD "Very bad"
-// new
-#define D_GPIO_SWITCH "Schalter"
-#define D_GPIO_BUTTON "Druckknopf"
-#define D_GPIO_TOUCH "Kapazitiver Touch"
-#define D_GPIO_LED "LED"
-#define D_GPIO_LED_R "Stimmung Rot"
-#define D_GPIO_LED_G "Stimmung Grün"
-#define D_GPIO_LED_B "Stimmung Blau"
-#define D_GPIO_POWER_RELAY "Last Relay"
-#define D_GPIO_LIGHT_RELAY "Licht Relay"
+#define D_GPIO_SWITCH "Switch"
+#define D_GPIO_BUTTON "Push Button"
+#define D_GPIO_TOUCH "Capacitive Touch"
+#define D_GPIO_LED "Led"
+#define D_GPIO_LED_R "Mood Red"
+#define D_GPIO_LED_G "Mood Green"
+#define D_GPIO_LED_B "Mood Blue"
+#define D_GPIO_POWER_RELAY "Power Relay"
+#define D_GPIO_LIGHT_RELAY "Light Relay"
#define D_GPIO_PWM "PWM"
#define D_GPIO_DAC "DAC"
-#define D_GPIO_SERIAL_DIMMER "Serieller Dimmer"
-#define D_GPIO_UNKNOWN "Unbekannt"
+#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
+#define D_GPIO_UNKNOWN "Unknown"
#define D_GPIO_PIN "Pin"
-#define D_GPIO_GROUP "Gruppe"
-#define D_GPIO_GROUP_NONE "Keine"
+#define D_GPIO_GROUP "Group"
+#define D_GPIO_GROUP_NONE "None"
#define D_GPIO_STATE_NORMAL "Normal"
-#define D_GPIO_STATE_INVERTED "Invertiert"
+#define D_GPIO_STATE_INVERTED "Inverted"
#endif
\ No newline at end of file
From 49e1b83aaef49e97b79106f012bdcd6c0c1a5bc4 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:24 +0200
Subject: [PATCH 69/90] New translations en_US.h (Hungarian)
---
src/lang/hu_HU.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/lang/hu_HU.h b/src/lang/hu_HU.h
index d9f83733..b24d806d 100644
--- a/src/lang/hu_HU.h
+++ b/src/lang/hu_HU.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_EN_US_H
#define HASP_LANG_EN_US_H
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Weak"
#define D_WIFI_RSSI_BAD "Very bad"
-// new
#define D_GPIO_SWITCH "Switch"
#define D_GPIO_BUTTON "Push Button"
#define D_GPIO_TOUCH "Capacitive Touch"
From 80e29daa65fcb462986f90709d48dfd9010e083b Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:25 +0200
Subject: [PATCH 70/90] New translations en_US.h (Dutch)
---
src/lang/nl_NL.h | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/lang/nl_NL.h b/src/lang/nl_NL.h
index e05b7f08..cafb4be1 100644
--- a/src/lang/nl_NL.h
+++ b/src/lang/nl_NL.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_NL_NL_H
#define HASP_LANG_NL_NL_H
@@ -10,7 +13,7 @@
#define D_NO "Nee"
#define D_ERROR_OUT_OF_MEMORY "Geen geheugen bechikbaar"
-#define D_ERROR_UNKNOWN "Unknown error"
+#define D_ERROR_UNKNOWN "Onbekende fout"
#define D_CONFIG_NOT_CHANGED "Instellingen ongewijzigd"
#define D_CONFIG_CHANGED "Instellingen gewijzigd"
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Zwak"
#define D_WIFI_RSSI_BAD "Zeer Slecht"
-// new
#define D_GPIO_SWITCH "Schakelaar"
#define D_GPIO_BUTTON "Drukknop"
#define D_GPIO_TOUCH "Aanraakknop"
From 0a2feee6eda6e77d83284cca9aed24f9b371fdb2 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:26 +0200
Subject: [PATCH 71/90] New translations en_US.h (Portuguese)
---
src/lang/pt_PT.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/lang/pt_PT.h b/src/lang/pt_PT.h
index 5aec6427..4143e798 100644
--- a/src/lang/pt_PT.h
+++ b/src/lang/pt_PT.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_PT_PT_H
#define HASP_LANG_PT_PT_H
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_BAD "Muito baixo"
#define D_WIFI_RSSI_FAIR "Decente"
-// new
#define D_GPIO_SWITCH "Interruptor"
#define D_GPIO_BUTTON "Botão"
#define D_GPIO_TOUCH "Capacitive Touch" // new
From d7793049bd9214954d7936f112a5a001f917bfa0 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:27 +0200
Subject: [PATCH 72/90] New translations en_US.h (Chinese Simplified)
---
src/lang/zh_CN.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/lang/zh_CN.h b/src/lang/zh_CN.h
index d9f83733..b24d806d 100644
--- a/src/lang/zh_CN.h
+++ b/src/lang/zh_CN.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_EN_US_H
#define HASP_LANG_EN_US_H
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Weak"
#define D_WIFI_RSSI_BAD "Very bad"
-// new
#define D_GPIO_SWITCH "Switch"
#define D_GPIO_BUTTON "Push Button"
#define D_GPIO_TOUCH "Capacitive Touch"
From 7cd9c9496cbb4ba8984768462dd453bd906efa8e Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Tue, 22 Aug 2023 17:59:28 +0200
Subject: [PATCH 73/90] New translations en_US.h (Portuguese, Brazilian)
---
src/lang/pt_BR.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/lang/pt_BR.h b/src/lang/pt_BR.h
index b4fe9601..3c765fb9 100644
--- a/src/lang/pt_BR.h
+++ b/src/lang/pt_BR.h
@@ -1,3 +1,6 @@
+// This translation file is maintained on https://crowdin.com/project/openhasp/
+// Do not edit directly!
+
#ifndef HASP_LANG_PT_BR_H
#define HASP_LANG_PT_BR_H
@@ -209,7 +212,6 @@
#define D_WIFI_RSSI_WEAK "Weak"
#define D_WIFI_RSSI_BAD "Very bad"
-// Overrides
#define D_GPIO_SWITCH "Switch"
#define D_GPIO_BUTTON "Push Button"
#define D_GPIO_TOUCH "Capacitive Touch"
From fff79aabab209ea0b407ff98fbf5879f54ed2bfd Mon Sep 17 00:00:00 2001
From: marsman7
Date: Tue, 22 Aug 2023 22:56:27 +0200
Subject: [PATCH 74/90] fix compile error : 'lv_font_montserrat_14' was not
declared in this scope
---
include/lv_conf_v7.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/include/lv_conf_v7.h b/include/lv_conf_v7.h
index 489f0c80..0b094c3f 100644
--- a/include/lv_conf_v7.h
+++ b/include/lv_conf_v7.h
@@ -758,6 +758,10 @@ typedef void* lv_font_user_data_t;
#endif
#endif // LV_FONT_DEFAULT
+#ifndef LV_THEME_DEFAULT_FONT_SMALL
+ #define LV_THEME_DEFAULT_FONT_SMALL LV_FONT_DEFAULT
+#endif
+
#define LV_THEME_DEFAULT_FONT_NORMAL LV_FONT_DEFAULT
#define LV_THEME_DEFAULT_FONT_SUBTITLE LV_FONT_DEFAULT
#define LV_THEME_DEFAULT_FONT_TITLE LV_FONT_DEFAULT
From 47e97605009c27bb3e4f57f2a9e844fa2b97cba6 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Fri, 25 Aug 2023 00:32:45 +0200
Subject: [PATCH 75/90] Fix Makerfabs S3 tft35 spi display issues #528
---
user_setups/esp32s3/makerfabs-s3-tft35-spi.ini | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/user_setups/esp32s3/makerfabs-s3-tft35-spi.ini b/user_setups/esp32s3/makerfabs-s3-tft35-spi.ini
index 2073c3e1..61f58473 100644
--- a/user_setups/esp32s3/makerfabs-s3-tft35-spi.ini
+++ b/user_setups/esp32s3/makerfabs-s3-tft35-spi.ini
@@ -27,9 +27,10 @@ build_flags =
-D TFT_CS=15
-D TFT_RST=-1
-D TFT_DC=21
- -D TFT_BCKL=-1
+ -D TFT_BCKL=48
-D SPI_FREQUENCY=40000000
-D SPI_READ_FREQUENCY=16000000
+ -D TFT_DMA_CHANNEL=1
-D TOUCH_DRIVER=0x6336
-D HASP_USE_LGFX_TOUCH=1
-D TOUCH_SDA=38
From 4ae1e665a1e9d605a55837a5216963e083697267 Mon Sep 17 00:00:00 2001
From: marsman7
Date: Fri, 25 Aug 2023 22:50:55 +0200
Subject: [PATCH 76/90] Adding additional system scripts that are automatically
executed when the idle level is changed.
* idle_off.cmd
* idle_short.cmd
* idle_long.cmd
In example this scripts can use to easy control the backlight or change page
* idle_off.cmd
```
backlight {"state": true, "brightness": 255}
moodlight {"state": false}
```
* idle_short.cmd
```
backlight {"state": "on", "brightness": 50}
```
* idle_long.cmd
```
backlight {"state": false, "brightness": 5}
moodlight {"state": true, "color":"green"}
```
---
src/hasp/hasp_dispatch.cpp | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp
index 587e7fca..2c25fc8c 100644
--- a/src/hasp/hasp_dispatch.cpp
+++ b/src/hasp/hasp_dispatch.cpp
@@ -1357,10 +1357,19 @@ void dispatch_idle(const char*, const char* payload, uint8_t source)
uint8_t state = HASP_SLEEP_LAST;
if(!strcmp_P(payload, "off")) {
hasp_set_sleep_state(HASP_SLEEP_OFF);
+ if(HASP_FS.exists("L:/idle_off.cmd")) {
+ dispatch_run_script(NULL, "L:/idle_off.cmd", TAG_HASP);
+ };
} else if(!strcmp_P(payload, "short")) {
hasp_set_sleep_state(HASP_SLEEP_SHORT);
+ if(HASP_FS.exists("L:/idle_short.cmd")) {
+ dispatch_run_script(NULL, "L:/idle_short.cmd", TAG_HASP);
+ };
} else if(!strcmp_P(payload, "long")) {
hasp_set_sleep_state(HASP_SLEEP_LONG);
+ if(HASP_FS.exists("L:/idle_long.cmd")) {
+ dispatch_run_script(NULL, "L:/idle_long.cmd", TAG_HASP);
+ };
} else {
LOG_WARNING(TAG_MSGR, F("Invalid idle value %s"), payload);
return;
From c5ce7c6a9fe110873ce5470d828cc772208b354f Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sat, 26 Aug 2023 02:21:22 +0200
Subject: [PATCH 77/90] dispatch_run_script already checks if file exists
---
src/hasp/hasp_dispatch.cpp | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp
index 2c25fc8c..86ca9818 100644
--- a/src/hasp/hasp_dispatch.cpp
+++ b/src/hasp/hasp_dispatch.cpp
@@ -1357,19 +1357,13 @@ void dispatch_idle(const char*, const char* payload, uint8_t source)
uint8_t state = HASP_SLEEP_LAST;
if(!strcmp_P(payload, "off")) {
hasp_set_sleep_state(HASP_SLEEP_OFF);
- if(HASP_FS.exists("L:/idle_off.cmd")) {
- dispatch_run_script(NULL, "L:/idle_off.cmd", TAG_HASP);
- };
+ dispatch_run_script(NULL, "L:/idle_off.cmd", source);
} else if(!strcmp_P(payload, "short")) {
hasp_set_sleep_state(HASP_SLEEP_SHORT);
- if(HASP_FS.exists("L:/idle_short.cmd")) {
- dispatch_run_script(NULL, "L:/idle_short.cmd", TAG_HASP);
- };
+ dispatch_run_script(NULL, "L:/idle_short.cmd", source);
} else if(!strcmp_P(payload, "long")) {
hasp_set_sleep_state(HASP_SLEEP_LONG);
- if(HASP_FS.exists("L:/idle_long.cmd")) {
- dispatch_run_script(NULL, "L:/idle_long.cmd", TAG_HASP);
- };
+ dispatch_run_script(NULL, "L:/idle_long.cmd", source);
} else {
LOG_WARNING(TAG_MSGR, F("Invalid idle value %s"), payload);
return;
From 1e5a281b226cef529acc9aabb9be5e636a834abe Mon Sep 17 00:00:00 2001
From: marsman7
Date: Sat, 26 Aug 2023 11:09:41 +0200
Subject: [PATCH 78/90] Update CHANGELOG.md - idle level system scripts
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53b160ca..e6c213e8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -34,6 +34,7 @@
- Add SimpleFTPServer to easily upload and download files to the plate *(one simultaneous connection only)*
- Add service start/stop ftp
- Add configuration for NTP servers and timezone
+- Add support system scripts executed when the idle level is changed
### Devices
- Add Elecrow ESP32-Terminal 3.5" SPI and RGB
From e2910604a2ce4d979c47fea352b2d586b5b9ca64 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Wed, 30 Aug 2023 01:38:03 +0200
Subject: [PATCH 79/90] Update to rc8 with Tasmota Core 2023.08.01 #513
---
platformio.ini | 2 +-
user_setups/esp32/_esp32.ini | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/platformio.ini b/platformio.ini
index dc2b741d..3aa92a4b 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -75,7 +75,7 @@ build_flags =
-D HASP_VER_MAJ=0
-D HASP_VER_MIN=7
;-D HASP_VER_REV=4
- -D HASP_VER_REV=0-rc7
+ -D HASP_VER_REV=0-rc8
;-D HASP_VER_REV=4-rc1
${override.build_flags}
diff --git a/user_setups/esp32/_esp32.ini b/user_setups/esp32/_esp32.ini
index ba5df96b..93d581ff 100644
--- a/user_setups/esp32/_esp32.ini
+++ b/user_setups/esp32/_esp32.ini
@@ -139,8 +139,8 @@ lib_deps =
[arduino_esp32_v2]
extends = esp32
framework = arduino
-; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.01.01/platform-espressif32.zip
-platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip
+; platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.01/platform-espressif32.zip
+platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.08.01/platform-espressif32.zip
lib_ignore =
${esp32.lib_ignore}
From f326f48cd08dc27af79fd73fa4d89148c54db112 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Sun, 10 Sep 2023 13:22:13 +0200
Subject: [PATCH 80/90] Update to ace.js v1.24.2
---
data/edit.htm | 2 +-
data/script.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/edit.htm b/data/edit.htm
index 87ec8cb5..5811afc4 100644
--- a/data/edit.htm
+++ b/data/edit.htm
@@ -1 +1 @@
-openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
+openHASP File Editor- New File
- Upload Files
- Edit
- Preview
- Download
- Delete
\ No newline at end of file
diff --git a/data/script.js b/data/script.js
index feb3e04f..f38d076c 100644
--- a/data/script.js
+++ b/data/script.js
@@ -1 +1 @@
-var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.24.1")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
+var ctx_el;function _(e){return document.getElementById(e)}function hidectx(){_("ctx").style.display="none",ctx_el&&ctx_el.classList.remove("selitem"),ctx_el=void 0}function doesFontExist(e){var t=document.createElement("canvas"),n=t.getContext("2d"),o="abcdefghijklmnopqrstuvwxyz0123456789";n.font="72px monospace";var a=n.measureText(o).width;return n.font="72px '"+e+"', monospace",t=null,n.measureText(o).width!=a}function createEditor(e,t,n,o,a){function i(e){let t=/(?:\.([^.]+))?$/.exec(e)[1];if(void 0!==typeof t)switch(t){case"htm":case"html":return"html";case"js":return"javascript";case"cmd":case"json":case"jsonl":return"json";case"css":case"svg":case"xml":return t}return"plain_text"}void 0===n&&(n=i(t)),void 0===a&&(a="text/"+n);["basePath","modePath","themePath"].forEach((e=>{ace.config.set(e,"https://cdnjs.cloudflare.com/ajax/libs/ace/1.24.2")}));var c=ace.edit(e,{useWorker:!1,wrap:!0,indentedSoftWrap:!1,showPrintMargin:!1,highlightGutterLine:!0,useSoftTabs:!0,tabSize:2});c.setFontSize(parseFloat(getComputedStyle(document.documentElement).fontSize)),c.setReadOnly(!0),c.getSession().setUndoManager(new ace.UndoManager),void 0===o&&(o=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"monokai":"textmate");var s=_("save"),l=_("undo"),r=_("redo"),d=_("cut"),m=_("copy"),u=_("paste"),p=_("font"),f=_("fontsize"),g="none"!==_(e).display;f.value=parseFloat(c.getFontSize()).toFixed(1),p.onchange=function(){c.setOption("fontFamily","'"+p.value+"',monospace")},f.onchange=function(){var e=parseFloat(f.value);!isNaN(e)&&e>=9&&e<=40&&c.setFontSize(e),f.value=parseFloat(c.getFontSize()).toFixed(1)};function h(){let e=!g||c.session.getSelection().isEmpty();d.disabled=e,m.disabled=e}function y(){let e=c.session.getUndoManager();s.disabled=!g||e.isClean(),l.disabled=!g||!e.hasUndo(),r.disabled=!g||!e.hasRedo()}function v(){if(void 0===t)return;const e=function(e){var t=e.getValue();try{var n=JSON.parse(t);return JSON.stringify(n)}catch(e){return t+""}}(c),n=new FormData;n.append("data",new Blob([e],{type:a}),t),fetch("/edit",{method:"POST",body:n}).then((e=>e.ok?e.text().then((e=>{console.log("Save OK /edit "+e)})):e.text().then((e=>{throw console.log("Save FAIL /edit"),new Error(e)})))).then((e=>{console.log(e),generateToast({message:"Saved "+t,background:"#ddd",color:"#000"})})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{y()}))}function x(){var e=c.getCopyText();if(window.clipboardData&&window.clipboardData.setData)return window.clipboardData.setData("Text",e);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){c.focus();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),prompt("Copy to clipboard: Ctrl+C, Enter",e)}}}function w(e){_("name").innerHTML=e;fetch(e).then((t=>t.ok?(console.log("OK "+e),t.text()):t.text().then((e=>{throw console.log("ERROR "+url),new Error(e)})))).then((e=>{try{var t=JSON.parse(e);c.setValue(JSON.stringify(t,null,4)),console.log("parse json OK")}catch(t){c.setValue(e),console.log("parse json FAIL")}null!==_("editor")&&(_("editor").style.display="block"),null!==_("preview")&&(_("preview").style.display="none"),g=!0,c.setReadOnly(!1),c.focus(),y()})).catch((e=>{console.log(e),alert(e),c.setReadOnly(!0)})).finally((()=>{c.resize(!0),c.scrollToLine(1,!0,!0,(function(){})),c.gotoLine(1,0,!0),c.clearSelection(),c.session.getUndoManager().reset()}))}return["Courier New","Monaco","Lucida Console","Monospace","ui-monospace","Roboto Mono","Inconsolata","IBM Plex Mono","Space Mono","PT Mono","Ubuntu Mono","Nanum Gothic Coding","Cousine","Fira Mono","Share Tech Mono","Courier Prime","Anonymous Pro","Cutive Mono","Overpass Mono","Fira Code","VT323","DM Mono","Oxygen Mono","Nova Mono","B612 Mono","Spline Sans Mono","Noto Sans Mono","Major Mono Display","Azeret Mono","Red Hat Mono","Syne Mono","Xanh Mono"].sort().forEach((function(e,t){if(doesFontExist(e)){var n=document.createElement("option");n.text=e,p.add(n)}})),null!==s&&null!==l&&null!==r&&c.on("input",y),c.session.selection.on("changeCursor",h),s.onclick=v,l.onclick=e=>{c.undo()&&c.focus()},r.onclick=e=>{c.redo()&&c.focus()},d.onclick=e=>{x()&&c.execCommand("cut")},m.onclick=e=>{x()&&c.execCommand("copy")},u.onclick=function(){try{navigator.clipboard.readText().then((e=>{c.execCommand("paste",e)})).catch((e=>{u.disabled=!0}))}catch{u.disabled=!0}},c.loadUrl=(e,o)=>{n=i(t=e+o),a="text/"+n,"plain"!==n&&c.getSession().setMode("ace/mode/"+n),w(e+o)},c.hide=()=>{g=!1,y(),h(),_("editor").style.display="none"},"plain"!==n&&c.getSession().setMode("ace/mode/"+n),c.setTheme("ace/theme/"+o),c.$blockScrolling=1/0,c.commands.addCommand({name:"save",bindKey:{win:"Ctrl-S",mac:"Command-S"},exec:v,readOnly:!1}),c.commands.addCommand({name:"undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec:function(){c.undo()}}),c.commands.addCommand({name:"redo",bindKey:{win:"Ctrl-Y",mac:"Command-Y"},exec:function(){c.redo()}}),void 0!==t&&w(t),c.resize(),c}function uploadFileAsync(e,t,n,o,a,i){fetchData("/edit","POST",e).then((e=>{generateToast({message:"Upload "+n+"/"+o+" "+t+" done.",background:"#ddd",color:"#000"}),n==o&&listFiles(a,i)}))}function doUpload(e,t){const n=_("upload"),o=n.files.length;if(0!==o)for(let a=0;a=0}function isText(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"txt":case"cmd":case"json":case"jsonl":case"htm":case"html":case"js":case"c":case"cpp":case"css":case"svg":case"xml":return!0}return!1}function isImage(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"bmp":case"png":case"jpg":case"gif":case"svg":return!0}return!1}function isAudio(e){if(isFolder(e))return!1;var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"wav":case"mp3":case"aac":case"m4a":case"wma":return!0}return!1}function icon(e){if(isFolder(e))return"dir";if(isImage(e))return"image";if(isAudio(e))return"audio";var t=/(?:\.([^.]+))?$/.exec(e.name)[1];if(void 0!==typeof t)switch(t){case"cmd":case"css":case"json":case"jsonl":case"ttf":return t;case"zip":case"gz":return"zip";case"html":case"htm":return"html"}return"file"}function preview(e,t){if(isImage(e)){let n=t+e.name;const o=_("preview");o.innerHTML='
',o.style.display="block",ace.edit("editor").hide(),_("name").innerHTML=n}}function edit(e,t){isText(e)&&(ace.edit("editor").loadUrl(t,e.name),_("preview").style.display="none")}function url(e,t){console.log("click "+t+e.name),isImage(e)?preview(e,t):isText(e)&&edit(e,t)}async function fetchData(e,t,n,o){await fetch(e,{method:t,body:n}).then((n=>n.ok?(console.log(t+" OK "+e),n.text()):n.text().then((n=>{throw console.log(t+" FAIL "+e),new Error(n)})))).then((e=>{o&&o.remove(),console.log(e)})).catch((e=>{console.warn("AbortError"===e.name?"Promise Aborted":"Promise Rejected"),alert(e)})).finally((()=>{}))}function download(e,t){console.log("download "+t+e.name),document.getElementById("download-frame").src=t+e.name+"?download=true"}function remove(e,t,n){let o=t+e.name;isFolder(e)&&(o+="/"),console.log("remove "+o);const a=new FormData;a.append("path",o),fetchData("/edit","DELETE",a,n)}function create(e,t,n){var o=window.prompt("Create File in "+e,"");if(null==o||""==o||o.includes("/"))return;const a=new FormData;a.append("path",e+o),fetchData("/edit","PUT",a),fetch("/api/files/").then((e=>e.json())).then((o=>{t&&t.remove(),listFiles(n,e),console.log(o)}))}function upload(e,t){_("upload").onchange=()=>{doUpload(e,t)},_("upload").click()}function ctx(e,t,n,o){e.preventDefault(),ctx_el=o;let a,i=isFolder(t),c=_("ctx");c.style.display="block",a=c.getElementsByTagName("li")[0],a.onclick=i?function(){hidectx(),create(n+t.name+"/",o.children.item(1),o)}:function(){hidectx(),create(n,o.parentNode,o.parentNode.parentNode)},a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[1],i&&(a.onclick=function(){hidectx(),upload(o,n+t.name+"/")}),a.style.display=i?"block":"none",a=c.getElementsByTagName("li")[2],a.onclick=function(){edit(t,n),hidectx()},a.style.display=isText(t)?"block":"none",a=c.getElementsByTagName("li")[3],a.onclick=function(){preview(t,n),hidectx()},a.style.display=isImage(t)?"block":"none",a=c.getElementsByTagName("li")[4],a.onclick=function(){download(t,n),hidectx()},a.style.display=i?"none":"block",a=c.getElementsByTagName("li")[5],a.onclick=function(){remove(t,n,o),hidectx()},a.style.display=n?"block":"none";var s=document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop,l=document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft,r=e.clientX+l+10,d=e.clientY+s-20,m=(c.offsetWidth,c.offsetHeight),u=document.documentElement.clientHeight;d+m>u&&(d=u-m-20),c.style.left=r+"px",c.style.top=d+"px",o&&o.classList.add("selitem")}function drag(e,t,n){let o=n+t.name;isFolder(t)&&(o+="/"),e.dataTransfer.setData("text",o),console.log("drag start "+o)}function drop(e,t){let n=e.dataTransfer.getData("text");n.startsWith(t)||(e.preventDefault(),console.log("Move "+n+" to "+t))}function listFiles(e,t){return console.log("listFiles"),fetch("/api/files/?dir="+t).then((e=>e.json())).then((n=>{if(0==n.length)return!1;let o=e.getElementsByTagName("div")[0];o&&(o.onclick=n=>{i.remove(),o.onclick=()=>{listFiles(e,t)},n.stopPropagation()});let a=e.getElementsByTagName("ul");for(let e=0;e{drag(event,e,t)},a.appendChild(s),s.innerHTML=''+o+"",isFolder(e)){let n=t+e.name+"/";s.classList.add("bold"),s.onclick=function(e){listFiles(a,n)},s.ondragover=e=>{e.preventDefault()},s.ondrop=e=>{drop(e,n)}}else(isText(e)||isImage(e)||isAudio(e))&&(s.onclick=function(n){url(e,t)});s.oncontextmenu=n=>{ctx(n,e,t,a)}}return e.scrollIntoView(),!0}))}function generateToast({message:e,background:t="#00214d",color:n="#fffffe",length:o="7000ms"}){_("toast").insertAdjacentHTML("afterbegin",`\n ${e}\n
`);const a=_("toast").firstElementChild;a.addEventListener("animationend",(()=>a.remove()))}document.addEventListener("blur",(function(){hidectx()})),document.addEventListener("DOMContentLoaded",(function(){createEditor("editor",void 0,void 0,void 0);listFiles(_("tree"),"/"),_("tree").getElementsByTagName("div")[0].oncontextmenu=e=>{ctx(e,{name:"",children:[]},"",_("tree"))},_("load").onclick=function(e){const t=new FormData;t.append("load",""),fetchData("/edit","PUT",t)},_("init").onclick=function(e){const t=new FormData;t.append("init",""),fetchData("/edit","PUT",t)},_("home").onclick=function(e){window.location.href="/"},_("page").onchange=function(e){const t=new FormData;t.append("page",_("page").value),fetchData("/edit","PUT",t)}})),document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("dragMe"),t=e.previousElementSibling,n=e.nextElementSibling;let o=0,a=0,i=0;const c=function(a){const c=a.clientX-o,s=(a.clientY,100*(i+c)/e.parentNode.getBoundingClientRect().width);t.style.width=`${s}%`,t.style.right=t.style.width,e.style.cursor="col-resize",document.body.style.cursor="col-resize",t.style.userSelect="none",t.style.pointerEvents="none",n.style.userSelect="none",n.style.pointerEvents="none",ace.edit("editor").resize()},s=function(){e.style.removeProperty("cursor"),document.body.style.removeProperty("cursor"),t.style.removeProperty("user-select"),t.style.removeProperty("pointer-events"),n.style.removeProperty("user-select"),n.style.removeProperty("pointer-events"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};e.addEventListener("mousedown",(function(e){o=e.clientX,a=e.clientY,i=t.getBoundingClientRect().width,document.addEventListener("mousemove",c),document.addEventListener("mouseup",s)})),e.addEventListener("dblclick",(()=>{var e=t.style.visibility="hidden"===t.style.visibility;t.style.visibility=e?"unset":"hidden",t.style.position=e?"unset":"absolute",ace.edit("editor").resize()}))}));
\ No newline at end of file
From b7578182e6eca18f316dcd139f5bfc7f6783fa64 Mon Sep 17 00:00:00 2001
From: 7IN0SAN9
Date: Tue, 12 Sep 2023 22:56:26 +0800
Subject: [PATCH 81/90] swip up to page back by default
---
src/hasp/hasp_attribute_helper.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/hasp/hasp_attribute_helper.h b/src/hasp/hasp_attribute_helper.h
index dbdae43c..2b48bcbd 100644
--- a/src/hasp/hasp_attribute_helper.h
+++ b/src/hasp/hasp_attribute_helper.h
@@ -237,7 +237,7 @@ const char* my_obj_get_action(lv_obj_t* obj)
void my_obj_set_swipe(lv_obj_t* obj, const char* payload)
{
hasp_ext_user_data_t* ext = (hasp_ext_user_data_t*)obj->user_data.ext;
- static const char* _swipejson = R"({"down":"page back","left":"page next","right":"page prev"})";
+ static const char* _swipejson = R"({"down":"page back","left":"page next","right":"page prev","up":"page back"})";
// extended tag exists, free old tag if it's not the const _swipejson
if(ext) {
From e1371899bfedb230c460571c19eb7c636ff51463 Mon Sep 17 00:00:00 2001
From: 7IN0SAN9
Date: Tue, 12 Sep 2023 23:00:00 +0800
Subject: [PATCH 82/90] add panlee-zw3d95ce01s-tr-4848_16MB ref #435
---
user_setups/esp32s3/zw3d95ce01s_ar.ini | 45 +++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)
diff --git a/user_setups/esp32s3/zw3d95ce01s_ar.ini b/user_setups/esp32s3/zw3d95ce01s_ar.ini
index 8c84ee65..31b2482a 100644
--- a/user_setups/esp32s3/zw3d95ce01s_ar.ini
+++ b/user_setups/esp32s3/zw3d95ce01s_ar.ini
@@ -124,4 +124,47 @@ build_flags =
-D I2S_SDO=21 ; I2S bus SDO
-D I2S_SDI=39 ; I2S bus SDI
-D I2C_SCL=6 ; I2C bus, used to configure CODEC, multiplexed peripherals
- -D I2C_SDA=7 ; I2C bus, used to configure CODEC, multiplexed peripherals
\ No newline at end of file
+ -D I2C_SDA=7 ; I2C bus, used to configure CODEC, multiplexed peripherals
+
+[env:panlee-zw3d95ce01s-tr-4848_16MB]
+extends = panlee-zw3d95ce01s, flash_16mb
+build_flags =
+ -D HASP_MODEL="ZX3D95CE01S-TR-4848"
+ ${panlee-zw3d95ce01s.build_flags}
+ -D TOUCH_RST=-1 ; Using RC reset
+ -D TOUCH_SCL=6 ; touch I2C bus clock, multiplexed with external interface
+ -D TOUCH_SDA=15 ; Touch I2C bus data, multiplexed with external interface
+ -D TOUCH_INT=4 ; Touch interrupt
+ -D TFT_RST=41 ; LCD autoreset, use RGB_VS (TFT_VSYNC) signal to keep working
+ -D TFT_DC=-1
+ -D TFT_CS=38 ; LCD SPI bus CS
+ -D TFT_SCLK=45 ; LCD SPI bus SCLK
+ -D TFT_MOSI=48 ; LCD SPI bus MOSI
+ -D TFT_MISO=-1 ; LCD SPI bus MISO
+ -D TFT_DE=40 ; LCD RGB interface DE
+ -D TFT_VSYNC=41 ; LCD RGB interface VS
+ -D TFT_HSYNC=42 ; LCD RGB interface HS
+ -D TFT_PCLK=39 ; LCD RGB interface PCLK
+ -D TFT_B0=45 ; LCD RGB interface D0
+ -D TFT_B1=48 ; LCD RGB interface D1
+ -D TFT_B2=47 ; LCD RGB interface D2
+ -D TFT_B3=0 ; LCD RGB interface D3
+ -D TFT_B4=21 ; LCD RGB interface D4
+ -D TFT_G0=14 ; LCD RGB interface D5
+ -D TFT_G1=13 ; LCD RGB interface D6
+ -D TFT_G2=12 ; LCD RGB interface D7
+ -D TFT_G3=11 ; LCD RGB interface D8
+ -D TFT_G4=16 ; LCD RGB interface D9
+ -D TFT_G5=17 ; LCD RGB interface D10
+ -D TFT_R0=18 ; LCD RGB interface D11
+ -D TFT_R1=8 ; LCD RGB interface D12
+ -D TFT_R2=3 ; LCD RGB interface D13
+ -D TFT_R3=46 ; LCD RGB interface D14
+ -D TFT_R4=10 ; LCD RGB interface D15
+ -D TFT_BCKL=5 ; LCD backlight control, high level enable (datasheet states: 4, schematics states: 5 )
+ -D TFT_HSYNC_PULSE_WIDTH=10
+ -D TFT_HSYNC_BACK_PORCH=40
+ -D TFT_HSYNC_FRONT_PORCH=8
+ -D TFT_VSYNC_PULSE_WIDTH=10
+ -D TFT_VSYNC_BACK_PORCH=40
+ -D TFT_VSYNC_FRONT_PORCH=10
From 16ae10255cc67480f069be318a6749c94fda3ff4 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 13 Sep 2023 16:00:15 +0200
Subject: [PATCH 83/90] New translations en.json (Hungarian)
---
data/hu_HU.json | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/data/hu_HU.json b/data/hu_HU.json
index 9912460c..3b7c6033 100644
--- a/data/hu_HU.json
+++ b/data/hu_HU.json
@@ -15,10 +15,10 @@
"theme": "UI téma",
"color1": "Elsődleges szín",
"color2": "Szekunder szín",
- "pages": "Start Layout",
+ "pages": "Betöltendő oldalak",
"font": "Alapértelmezett font",
- "startpage": "Startup Page",
- "startdim": "Startup Dim"
+ "startpage": "Kezdő oldal",
+ "startdim": "Kezdeti fényerő"
},
"screenshot": {
"title": "Képernyőkép",
@@ -58,9 +58,9 @@
"reset": {
"title": "Gyári beállítások visszaállítása",
"btn": "Gyári beállítások visszaállítása",
- "warning": "Warning",
- "message": "This process will reset all settings to the default values. The internal flash will be erased and the device is restarted. You may need to connect to the WiFi AP displayed on the panel to reconfigure the device before accessing it again.",
- "fileloss": "ALL FILES WILL BE LOST!"
+ "warning": "Képernyőkép",
+ "message": "Ez a folyamat az összes beállítást visszaállítja az alapértelmezett értékekre. A belső memória törlődik, majd a készülék újraindul. Előfordulhat, hogy csatlakoznia kell a panelen megjelenő WiFi hozzáférési ponthoz az eszköz újrakonfigurálásához, mielőtt ismét hozzá tudna férni.",
+ "fileloss": "AZ ÖSSZES FÁJL TÖRLŐDIK!"
},
"reboot": {
"title": "Újraindítás...",
@@ -88,7 +88,7 @@
"mqtt": {
"title": "MQTT beállítások",
"btn": "MQTT beállítások",
- "name": "Gazdagépnév",
+ "name": "Név",
"group": "Csoportnév",
"host": "Broker",
"port": "Port",
From c3e9fe14a456ba99c60900420a6bf8e1b3aaa4e8 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 13 Sep 2023 16:08:10 +0200
Subject: [PATCH 84/90] New translations en.json (Hungarian)
---
data/hu_HU.json | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/data/hu_HU.json b/data/hu_HU.json
index 3b7c6033..ca1bd3dc 100644
--- a/data/hu_HU.json
+++ b/data/hu_HU.json
@@ -90,12 +90,12 @@
"btn": "MQTT beállítások",
"name": "Név",
"group": "Csoportnév",
- "host": "Broker",
+ "host": "Szerver",
"port": "Port",
- "node_t": "Node Topic",
- "group_t": "Group Topic",
- "broadcast_t": "Broadcast Topic",
- "hass_t": "HA LWT Topic"
+ "node_t": "Eszköz topik",
+ "group_t": "Csoport topik",
+ "broadcast_t": "Mindenki topik",
+ "hass_t": "HA LWT topik"
},
"http": {
"title": "HTTP beállítások",
@@ -110,18 +110,18 @@
"gui": {
"title": "Képernyő beállítások",
"btn": "Képernyő beállítások",
- "antiburn": "Beégésvédelem futtatás",
+ "antiburn": "Beégésvédelem futtatása",
"calibrate": "Kalibrálás"
},
"gpio": "GPIO beállítások",
"debug": {
"title": "Hibakeresési beállítások",
"btn": "Hibakeresési beállítások",
- "baud": "Baudrate",
- "tele": "Tele Period",
- "ansi": "Use ANSI codes",
- "host": "Syslog Server",
- "port": "Syslog Port",
+ "baud": "Baud ráta",
+ "tele": "Tele- periódus",
+ "ansi": "ANSI kódolás",
+ "host": "Syslog szerver",
+ "port": "Syslog port",
"ietf": "IETF (RFC 5424)",
"bsd": "BSD (RFC 3164)",
"log": "Facility"
From 50308777cb22684e35b42aa11f6cc04f9f38be62 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 13 Sep 2023 16:41:56 +0200
Subject: [PATCH 85/90] New translations en.json (Hungarian)
---
data/hu_HU.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/data/hu_HU.json b/data/hu_HU.json
index ca1bd3dc..7700a9f9 100644
--- a/data/hu_HU.json
+++ b/data/hu_HU.json
@@ -14,7 +14,7 @@
"btn": "Képernyő dizájn",
"theme": "UI téma",
"color1": "Elsődleges szín",
- "color2": "Szekunder szín",
+ "color2": "Másodlagos szín",
"pages": "Betöltendő oldalak",
"font": "Alapértelmezett font",
"startpage": "Kezdő oldal",
@@ -89,7 +89,7 @@
"title": "MQTT beállítások",
"btn": "MQTT beállítások",
"name": "Név",
- "group": "Csoportnév",
+ "group": "Csoport",
"host": "Szerver",
"port": "Port",
"node_t": "Eszköz topik",
From da1305df76da69597d2892a25735b0fb62a2b4af Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Wed, 13 Sep 2023 17:02:04 +0200
Subject: [PATCH 86/90] Add panlee-zw3d95ce01s-tr
---
.github/workflows/build.yaml | 2 +-
user_setups/esp32s3/zw3d95ce01s_ar.ini | 18 ++++++++++++------
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 0aca63bf..3f8ea833 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -49,7 +49,7 @@ jobs:
- out: makerfabs
env: "makerfabs-tft35-cap_4MB -e makerfabs-tft35-cap_16MB -e makerfabs-s3-tft35-spi -e makerfabs-s3-tft40-rgb -e makerfabs-s3-tft43-rgb"
- out: panlee
- env: "panlee-zw3d95ce01s-ar-4848_16MB -e panlee-zw3d95ce01s-ur-4848_16MB"
+ env: "panlee-zw3d95ce01s-ar-4848_16MB -e panlee-zw3d95ce01s-ur-4848_16MB -e panlee-zw3d95ce01s-tr-4848_16MB"
- out: seeed-studios
env: "sensecap-indicator-d1_8MB"
- out: sunton
diff --git a/user_setups/esp32s3/zw3d95ce01s_ar.ini b/user_setups/esp32s3/zw3d95ce01s_ar.ini
index 31b2482a..9297ba89 100644
--- a/user_setups/esp32s3/zw3d95ce01s_ar.ini
+++ b/user_setups/esp32s3/zw3d95ce01s_ar.ini
@@ -23,13 +23,7 @@ build_flags =
-D TFT_WIDTH=480
-D TFT_HEIGHT=480
-D TFT_HSYNC_POLARITY=1
- -D TFT_HSYNC_FRONT_PORCH=10
- -D TFT_HSYNC_PULSE_WIDTH=8
- -D TFT_HSYNC_BACK_PORCH=50
-D TFT_VSYNC_POLARITY=1
- -D TFT_VSYNC_FRONT_PORCH=10
- -D TFT_VSYNC_PULSE_WIDTH=8
- -D TFT_VSYNC_BACK_PORCH=20
;-D TFT_PCLK_ACTIVE_NEG=1
;-D TFT_PREFER_SPEED=9000000
-D TFT_AUTO_FLUSH=1
@@ -81,6 +75,12 @@ build_flags =
-D TFT_R3=46 ; LCD RGB interface D14
-D TFT_R4=9 ; LCD RGB interface D15
-D TFT_BCKL=4 ; LCD backlight control, high level enable
+ -D TFT_HSYNC_FRONT_PORCH=10
+ -D TFT_HSYNC_PULSE_WIDTH=8
+ -D TFT_HSYNC_BACK_PORCH=50
+ -D TFT_VSYNC_FRONT_PORCH=10
+ -D TFT_VSYNC_PULSE_WIDTH=8
+ -D TFT_VSYNC_BACK_PORCH=20
[env:panlee-zw3d95ce01s-ar-4848_16MB]
extends = panlee-zw3d95ce01s, flash_16mb
@@ -118,6 +118,12 @@ build_flags =
-D TFT_R3=1 ; LCD RGB interface D14
-D TFT_R4=15 ; LCD RGB interface D15
-D TFT_BCKL=45 ; LCD backlight control, high level enable
+ -D TFT_HSYNC_FRONT_PORCH=10
+ -D TFT_HSYNC_PULSE_WIDTH=8
+ -D TFT_HSYNC_BACK_PORCH=50
+ -D TFT_VSYNC_FRONT_PORCH=10
+ -D TFT_VSYNC_PULSE_WIDTH=8
+ -D TFT_VSYNC_BACK_PORCH=20
-D I2S_MCLK=38 ; I2S bus MCLK
-D I2S_SCLK=48 ; I2S bus SCLK
-D I2S_LRCK=47 ; I2S bus LRCK
From cedb130b75ce05456014a924423857f1e683e16b Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Wed, 13 Sep 2023 17:18:57 +0200
Subject: [PATCH 87/90] Fix invalif override
---
src/drv/tft/M5Stack.hpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/drv/tft/M5Stack.hpp b/src/drv/tft/M5Stack.hpp
index d89d85da..14f599e1 100644
--- a/src/drv/tft/M5Stack.hpp
+++ b/src/drv/tft/M5Stack.hpp
@@ -44,7 +44,7 @@ struct Panel_M5Stack : public lgfx::Panel_ILI9342
_rotation = 1;
}
- bool init(bool use_reset) override
+ bool init(bool use_reset)
{
lgfx::gpio_hi(_cfg.pin_rst);
lgfx::pinMode(_cfg.pin_rst, lgfx::pin_mode_t::input_pulldown);
From f28627c14d73bf23cc3a768743b929dbc0546d97 Mon Sep 17 00:00:00 2001
From: fvanroie
Date: Wed, 13 Sep 2023 17:29:08 +0200
Subject: [PATCH 88/90] Fix invalid override
---
src/drv/tft/M5Stack.hpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/drv/tft/M5Stack.hpp b/src/drv/tft/M5Stack.hpp
index 14f599e1..8822d724 100644
--- a/src/drv/tft/M5Stack.hpp
+++ b/src/drv/tft/M5Stack.hpp
@@ -44,7 +44,7 @@ struct Panel_M5Stack : public lgfx::Panel_ILI9342
_rotation = 1;
}
- bool init(bool use_reset)
+ bool init(bool use_reset) override
{
lgfx::gpio_hi(_cfg.pin_rst);
lgfx::pinMode(_cfg.pin_rst, lgfx::pin_mode_t::input_pulldown);
@@ -66,7 +66,7 @@ struct Panel_M5StackCore2 : public lgfx::Panel_ILI9342
_rotation = 1; // default rotation
}
- void reset(void) override
+ void reset(void)
{
using namespace m5stack;
// AXP192 reg 0x96 = GPIO3&4 control
From cabfce64c858d3e979d4956f5b26be7e3059aa42 Mon Sep 17 00:00:00 2001
From: fvanroie <15969459+fvanroie@users.noreply.github.com>
Date: Wed, 13 Sep 2023 20:02:59 +0200
Subject: [PATCH 89/90] New translations en_US.h (Portuguese)
---
src/lang/pt_PT.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lang/pt_PT.h b/src/lang/pt_PT.h
index 4143e798..56414b1b 100644
--- a/src/lang/pt_PT.h
+++ b/src/lang/pt_PT.h
@@ -13,7 +13,7 @@
#define D_NO "Não"
#define D_ERROR_OUT_OF_MEMORY "Memória Cheia"
-#define D_ERROR_UNKNOWN "Unknown error"
+#define D_ERROR_UNKNOWN "Erro desconhecido"
#define D_CONFIG_NOT_CHANGED "Sem alterações na configuração"
#define D_CONFIG_CHANGED "Configuração alterada"
From ad0f69f68ebf49018bc6be25f7d1cb299a7fb072 Mon Sep 17 00:00:00 2001
From: dfsx1
Date: Sun, 1 Oct 2023 18:44:01 +0200
Subject: [PATCH 90/90] Fix #534 ILI9486 Failed to start:
src/drv/tft/tft_driver_lovyangfx.cpp
---
src/drv/tft/tft_driver_lovyangfx.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/drv/tft/tft_driver_lovyangfx.cpp b/src/drv/tft/tft_driver_lovyangfx.cpp
index 6794a4ec..d6ba0892 100644
--- a/src/drv/tft/tft_driver_lovyangfx.cpp
+++ b/src/drv/tft/tft_driver_lovyangfx.cpp
@@ -298,6 +298,11 @@ lgfx::Panel_Device* LovyanGfx::_init_panel(lgfx::IBus* bus)
LOG_VERBOSE(TAG_TFT, F("Panel_ILI9481_b"));
break;
}
+ case TFT_PANEL_ILI9486: {
+ panel = new lgfx::Panel_ILI9486();
+ LOG_VERBOSE(TAG_TFT, F("Panel_ILI9486"));
+ break;
+ }
case TFT_PANEL_ILI9488: {
panel = new lgfx::Panel_ILI9488();
LOG_VERBOSE(TAG_TFT, F("Panel_ILI9488"));