From dff6da9a5f82e7931129064a4b95c09c623e0464 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Thu, 23 Nov 2023 22:32:01 +0100 Subject: [PATCH] Feature: High resolution Icon and PWA (Progressive Web App) functionality Fix: #1289 --- platformio.ini | 9 ++++++++- src/WebApi_webapp.cpp | 9 ++++++++- webapp/index.html | 1 + webapp/public/favicon.png | Bin 682 -> 4590 bytes webapp/public/site.webmanifest | 13 +++++++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 webapp/public/site.webmanifest diff --git a/platformio.ini b/platformio.ini index 6fcbb88..10ce457 100644 --- a/platformio.ini +++ b/platformio.ini @@ -22,7 +22,6 @@ framework = arduino platform = espressif32@6.3.2 build_flags = - -DCOMPONENT_EMBED_FILES=webapp_dist/index.html.gz:webapp_dist/zones.json.gz:webapp_dist/favicon.ico:webapp_dist/favicon.png:webapp_dist/js/app.js.gz -DPIOENV=\"$PIOENV\" -Wall -Wextra -Werror -std=c++17 @@ -45,6 +44,14 @@ extra_scripts = board_build.partitions = partitions_custom.csv board_build.filesystem = littlefs +board_build.embed_files = + webapp_dist/index.html.gz + webapp_dist/zones.json.gz + webapp_dist/favicon.ico + webapp_dist/favicon.png + webapp_dist/js/app.js.gz + webapp_dist/site.webmanifest + monitor_filters = esp32_exception_decoder, time, log2file, colorize monitor_speed = 115200 upload_protocol = esptool diff --git a/src/WebApi_webapp.cpp b/src/WebApi_webapp.cpp index 90516ad..a471299 100644 --- a/src/WebApi_webapp.cpp +++ b/src/WebApi_webapp.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022 Thomas Basler and others + * Copyright (C) 2022-2023 Thomas Basler and others */ #include "WebApi_webapp.h" @@ -9,12 +9,14 @@ extern const uint8_t file_favicon_ico_start[] asm("_binary_webapp_dist_favicon_i extern const uint8_t file_favicon_png_start[] asm("_binary_webapp_dist_favicon_png_start"); extern const uint8_t file_zones_json_start[] asm("_binary_webapp_dist_zones_json_gz_start"); extern const uint8_t file_app_js_start[] asm("_binary_webapp_dist_js_app_js_gz_start"); +extern const uint8_t file_site_webmanifest_start[] asm("_binary_webapp_dist_site_webmanifest_start"); extern const uint8_t file_index_html_end[] asm("_binary_webapp_dist_index_html_gz_end"); extern const uint8_t file_favicon_ico_end[] asm("_binary_webapp_dist_favicon_ico_end"); extern const uint8_t file_favicon_png_end[] asm("_binary_webapp_dist_favicon_png_end"); extern const uint8_t file_zones_json_end[] asm("_binary_webapp_dist_zones_json_gz_end"); extern const uint8_t file_app_js_end[] asm("_binary_webapp_dist_js_app_js_gz_end"); +extern const uint8_t file_site_webmanifest_end[] asm("_binary_webapp_dist_site_webmanifest_end"); void WebApiWebappClass::init(AsyncWebServer* server) { @@ -54,6 +56,11 @@ void WebApiWebappClass::init(AsyncWebServer* server) request->send(response); }); + _server->on("/site.webmanifest", HTTP_GET, [](AsyncWebServerRequest* request) { + AsyncWebServerResponse* response = request->beginResponse_P(200, "application/json", file_site_webmanifest_start, file_site_webmanifest_end - file_site_webmanifest_start); + request->send(response); + }); + _server->on("/js/app.js", HTTP_GET, [](AsyncWebServerRequest* request) { #ifdef AUTO_GIT_HASH // check client If-None-Match header vs ETag/AUTO_GIT_HASH diff --git a/webapp/index.html b/webapp/index.html index 39a94a0..2d84d6f 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -5,6 +5,7 @@ + OpenDTU diff --git a/webapp/public/favicon.png b/webapp/public/favicon.png index 3378b661323215355b212542a9fe59b610adeae1..278aac84f197d64e420e057aa7ba62c94c82e512 100644 GIT binary patch literal 4590 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 Qz5oCK07*qoM6N<$f~lH1Y5)KL diff --git a/webapp/public/site.webmanifest b/webapp/public/site.webmanifest new file mode 100644 index 0000000..3be2460 --- /dev/null +++ b/webapp/public/site.webmanifest @@ -0,0 +1,13 @@ +{ + "name": "OpenDTU", + "short_name": "OpenDTU", + "display": "standalone", + "orientation": "portrait", + "icons": [ + { + "src": "/favicon.png", + "sizes": "144x144", + "type": "image/png" + } + ] +} \ No newline at end of file