This works for me on OSX Catalina 10.15.4
Summary: If you wanted to automated include files, you can use the script shown to help automatically gzip, and convert bin to hex string representation for inclusion into C/C++ headers. Automating the process.
This post explains the process to take html/css/icon (what have you) compresses them to gzip, and converts them to c/c++ include files. This is extremely useful for ESP8266/ESP32 webservers.
FOLDER | Description |
<project root> | your project root |
+/data/ | temporary hold spot (making it compatible with spiffs/littlefs location, in case you want to use them later. |
+/workdata/ | where you actually edit/changes your working files. |
+/src/data/ | location of include files. |
+/src/html.h | generated file, that updates with the script. |
The bash script does the following (<project_root>/makeBinaryIncludeFiles.sh):
#!/usr/bin/env bash rm -rf data mkdir data rsync -a workdata/* data/ gzip -r data/* rm src/html.h touch src/html.h mkdir -p src/data find data -type f -print0 | while IFS= read -r -d '' filename; do xxd -i $filename > src/data/${filename##*/}.h sed -i .bak 's/unsigned char/const char/g; s/\] \=/] PROGMEM =/g' src/data/${filename##*/}.h rm src/data/${filename##*/}.h.bak echo "#include \"data/${filename##*/}.h\"" >> src/html.h done
Platformio doesn’t run bash scripts (or at least I noticed it didn’t like to work), but doesn’t have a problem with python. So I wrote a wrapper to run the bash script:
#makeBinarywrapper.py import subprocess rc = subprocess.Popen(['bash', './makeBinaryIncludeFiles.sh'])
Add the following line to your platform.ini
#platformio.ini extra_scripts = pre:makeBinaryWrapper.py
With that peices together… you have have HTML/CSS/JS files, being submitted with the following command:
// ... #include <html.h> // ... void handleHtmlGZ(const char *encodingString, const char *gzString, const int size) { digitalWrite(led, 0); server.sendHeader("content-encoding", "gzip"); server.sendHeader("Expires", "Mon, 1 Jan 2222 10:10:10 GMT"); server.send_P(200, encodingString, gzString, size); digitalWrite(led, 1); } void setup(){ ..... server.on("/", []{ handleHtmlGZ("text/html", data_index_html_gz, data_index_html_gz_len); }); server.on("/css/bootstrap.min.css", []{ handleHtmlGZ("text/css", data_css_bootstrap_min_css_gz, data_css_bootstrap_min_css_gz_len); }); server.on("/favicon.ico", []{ handleHtmlGZ("image/x-icon", data_favicon_ico_gz, data_favicon_ico_gz_len); }); .... }
Making your c/c++ code much cleaner, and separated.
Leave a Reply