diff --git a/CHANGELOG.md b/CHANGELOG.md index b30d83cb..77e42b24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ All notable changes to this project will be documented in this file. + ## WIP ### Added diff --git a/interface/package-lock.json b/interface/package-lock.json index 42bae2e2..ea41596f 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -2008,6 +2008,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -2028,6 +2034,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3656,6 +3668,16 @@ "node": ">=0.8" } }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/interface/src/lib/components/spinner.svelte b/interface/src/lib/components/Spinner.svelte similarity index 100% rename from interface/src/lib/components/spinner.svelte rename to interface/src/lib/components/Spinner.svelte diff --git a/platformio.ini b/platformio.ini index 018b6ff4..ef576e76 100644 --- a/platformio.ini +++ b/platformio.ini @@ -95,3 +95,7 @@ board_build.partitions = default_8MB.csv ; -DARDUINO_USB_CDC_ON_BOOT=1 ; -DARDUINO_USB_MODE=1 +[env:nodemcu-32s] +board = nodemcu-32s +board_build.partitions = min_spiffs.csv +;build_type = debug \ No newline at end of file diff --git a/scripts/build_interface.py b/scripts/build_interface.py index 968f90d9..2e585f82 100644 --- a/scripts/build_interface.py +++ b/scripts/build_interface.py @@ -1,4 +1,4 @@ -# ESP32 SvelteKit +# ESP32 SvelteKit -- # # A simple, secure and extensible framework for IoT projects for ESP32 platforms # with responsive Sveltekit front-end built with TailwindCSS and DaisyUI. @@ -6,6 +6,7 @@ # # Copyright (C) 2018 - 2023 rjwats # Copyright (C) 2023 theelims +# Copyright (C) 2023 Maxtrium B.V. [ code available under dual license ] # # All Rights Reserved. This software may be modified and distributed under # the terms of the LGPL v3 license. See the LICENSE file for details. @@ -13,12 +14,57 @@ from pathlib import Path from shutil import copytree, rmtree, copyfileobj from subprocess import check_output, Popen, PIPE, STDOUT, CalledProcessError +from os.path import exists +from typing import Final import os import gzip import mimetypes +import glob Import("env") +#print("Current CLI targets", COMMAND_LINE_TARGETS) +#print("Current Build targets", BUILD_TARGETS) + +OUTPUTFILE: Final[str] = env["PROJECT_DIR"] + "/lib/framework/WWWData.h" +SOURCEWWWDIR: Final[str] = env["PROJECT_DIR"] + "/interface/src" + +def OutputFileExits(): + return os.path.exists(OUTPUTFILE) + +def findLastestTimeStampWWWInterface(): + list_of_files = glob.glob(SOURCEWWWDIR+'/**/*', recursive=True) + #print(list_of_files) + latest_file = max(list_of_files, key=os.path.getctime) + #print(latest_file) + return os.path.getctime(latest_file) + +def timestampOutputFile(): + return os.path.getctime(OUTPUTFILE) + +def needtoRegenerateOutputFile(): + if not flagExists("PROGMEM_WWW"): + return True + else: + if (OutputFileExits()): + if not flagExists("SKIP_BUILDING_PROGMEM_WWW"): + #x=findLastestTimeStampWWWInterface() + #print(f'My value is: {x:.2f}') + sourceEdited=( timestampOutputFile()\n') + progmem = open(OUTPUTFILE,"w") + + progmem.write("#include \n") + progmem.write("\n") + progmem.write("#if defined(ARDUINO)\n") + progmem.write(" #include \n") + progmem.write("#else\n") + progmem.write(" #define PROGMEM\n") + progmem.write("#endif\n") progmemCounter = 0 @@ -66,6 +119,7 @@ def buildProgMem(): progmem.write('\n};\n\n') assetMap[asset_path] = { "name": asset_var, "mime": asset_mime, "size": size } + progmem.write("#if defined(ARDUINO)\n") progmem.write('typedef std::function RouteRegistrationHandler;\n\n') progmem.write('class WWWData {\n') progmem.write(' public:\n') @@ -76,9 +130,31 @@ def buildProgMem(): progmem.write(' }\n') progmem.write('};\n') - + progmem.write("#endif\n") + if (False): + progmem.write('\n') + progmem.write('#define WWW_NR_PAGES ('+ str(len(assetMap.items())) + ')\n') + progmem.write('\n') + progmem.write('\n') + progmem.write('typedef struct {\n') + progmem.write(' const char* szUrl;\n') + progmem.write(' const char* szcontentType;\n') + progmem.write(' const uint8_t* pData;\n') + progmem.write(' const uint32_t uiLength;\n') + progmem.write('} page_entry_t;\n') + progmem.write('\n') + progmem.write('\n') + + progmem.write('const page_entry_t wwwpages[] = {\n') + for asset_path, asset in assetMap.items(): + progmem.write(' {"/' + str(asset_path) + '", "' + asset['mime'] + '", ' + asset['name'] + ', ' + str(asset['size']) + '} ,\n') + + progmem.write('};\n') + progmem.write('\n') + progmem.write('const uint16_t WWW_NR_PAGES (sizeof(wwwpages)/sizeof(page_entry_t));') + def buildWeb(): os.chdir("interface") print("Building interface with npm") @@ -104,9 +180,22 @@ def buildWeb(): if not flagExists("PROGMEM_WWW"): print("Build LittleFS file system image and upload to ESP32") env.Execute("pio run --target uploadfs") - -if ("upload" in BUILD_TARGETS): - print(BUILD_TARGETS) + +print("running: build_interface.py") + +# Dump global construction environment (for debug purpose) +#print(env.Dump()) + +# Dump project construction environment (for debug purpose) +#print(projenv.Dump()) + +if (needtoRegenerateOutputFile()): buildWeb() -else: - print("Skipping build interface step for target(s): " + ", ".join(BUILD_TARGETS)) + +#env.AddPreAction("${BUILD_DIR}/src/HTTPServer.o", buildWebInterface) + +#if ("upload" in BUILD_TARGETS): +# print(BUILD_TARGETS) +# #buildWeb() +#else: +# print("Skipping build interface step for target(s): " + ", ".join(BUILD_TARGETS))