mirror of https://github.com/jeelabs/esp-link.git
parent
6153c29c8d
commit
e8964de1d3
@ -1,43 +1,56 @@ |
|||||||
#! /usr/bin/python3 |
#! /usr/bin/python3 |
||||||
|
# Given a directory name as argument, this script generates an espfs filesystem image |
||||||
|
# with all the html, js, css, png, and ico files found in the directory tree. |
||||||
|
# Each file is compressed with gzip so it can be served up in compressed form from the esp8266. |
||||||
|
|
||||||
from sys import argv, exit, stderr, stdout |
from sys import argv, exit, stderr, stdout |
||||||
from pathlib import Path |
from pathlib import Path |
||||||
import re, gzip, struct |
import re, gzip, struct |
||||||
|
|
||||||
MAGIC = 0x73665345 |
def mkespfs(dir, outbuf): |
||||||
FL_GZIP = 2 # gzipped file flag |
MAGIC = 0x73665345 |
||||||
FL_LAST = 1 # last entry file flag |
FL_GZIP = 2 # gzipped file flag |
||||||
|
FL_LAST = 1 # last entry file flag |
||||||
if len(argv) != 2 or not Path(argv[1]).is_dir(): |
|
||||||
print("Usage: {} directory".format(argv[0]), file=stderr) |
f_html = list(Path(dir).rglob('*.html')) |
||||||
exit(1) |
f_css = list(Path(dir).rglob('*.css')) |
||||||
dir = argv[1] |
f_js = list(Path(dir).rglob('*.js')) |
||||||
|
f_img = list(Path(dir).rglob('*.ico')) + list(Path(dir).rglob('*.png')) |
||||||
f_html = list(Path(dir).rglob('*.html')) |
f_all = f_html + f_css + f_js + f_img |
||||||
f_css = list(Path(dir).rglob('*.css')) |
sz = 0 |
||||||
f_js = list(Path(dir).rglob('*.js')) |
|
||||||
f_img = list(Path(dir).rglob('*.ico')) + list(Path(dir).rglob('*.png')) |
for fn in f_all: |
||||||
f_all = f_html + f_css + f_js + f_img |
if not fn.is_file(): continue |
||||||
|
out_path = fn.relative_to(dir).as_posix().encode('ascii') |
||||||
for fn in f_all: |
info = fn.stat() |
||||||
if not fn.is_file(): continue |
data_un = fn.read_bytes() |
||||||
out_path = fn.relative_to(dir).as_posix().encode('ascii') |
data_comp = gzip.compress(data_un) |
||||||
info = fn.stat() |
|
||||||
data_un = fn.read_bytes() |
#print("Processing {} -> {}[{}], {}->{} bytes".format(fn, out_path, len(out_path), info.st_size, |
||||||
data_comp = gzip.compress(data_un) |
# len(data_comp)), file=stderr) |
||||||
|
|
||||||
print("Processing {} -> {}[{}], {}->{} bytes".format(fn, out_path, len(out_path), info.st_size, |
header = struct.pack('<IBBHII', MAGIC, FL_GZIP, 0, len(out_path), len(data_comp), info.st_size) |
||||||
len(data_comp)), file=stderr) |
outbuf.write(header) |
||||||
|
sz += len(header) |
||||||
header = struct.pack('<IBBHII', MAGIC, FL_GZIP, 0, len(out_path), len(data_comp), info.st_size) |
outbuf.write(out_path) |
||||||
stdout.buffer.write(header) |
sz = (sz+len(out_path)+3) // 4 * 4 |
||||||
stdout.buffer.write(out_path) |
if len(out_path)%4 != 0: |
||||||
if len(out_path)%4 != 0: |
outbuf.write(bytes(4)[:4-len(out_path)%4]) |
||||||
stdout.buffer.write(bytes(4)[:4-len(out_path)%4]) |
outbuf.write(data_comp) |
||||||
stdout.buffer.write(data_comp) |
sz += len(data_comp) |
||||||
if len(data_comp)%4 != 0: |
if len(data_comp)%4 != 0: |
||||||
stdout.buffer.write(bytes(4)[:4-len(data_comp)%4]) |
outbuf.write(bytes(4)[:4-len(data_comp)%4]) |
||||||
|
sz = (sz+3) // 4 * 4 |
||||||
trailer = struct.pack('<IBBHII', MAGIC, FL_LAST, 0, 0, 0, 0) |
|
||||||
|
trailer = struct.pack('<IBBHII', MAGIC, FL_LAST, 0, 0, 0, 0) |
||||||
print("DONE", file=stderr) |
outbuf.write(trailer) |
||||||
|
sz += len(trailer) |
||||||
|
|
||||||
|
print("espfs image: {} bytes".format(sz), file=stderr) |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
if len(argv) != 2 or not Path(argv[1]).is_dir(): |
||||||
|
print("Usage: {} directory".format(argv[0]), file=stderr) |
||||||
|
exit(1) |
||||||
|
mkespfs(argv[1], stdout.buffer) |
||||||
|
|
||||||
|
@ -0,0 +1,23 @@ |
|||||||
|
# pio-genespfs is a platformio extra script that uses mkespfs to generate a filesystem image |
||||||
|
# that it then converts into a C file so all the data can be included into the flash image. |
||||||
|
|
||||||
|
Import("env") |
||||||
|
#Import("projenv") |
||||||
|
|
||||||
|
from mkespfs import mkespfs |
||||||
|
from io import BytesIO |
||||||
|
from pathlib import Path |
||||||
|
|
||||||
|
dir = "html" |
||||||
|
espfile = "src/espfs_img.c" |
||||||
|
|
||||||
|
buf = BytesIO() |
||||||
|
espfsimg = mkespfs(dir, buf) |
||||||
|
|
||||||
|
fd = Path(espfile).open(mode='w') |
||||||
|
fd.write("unsigned char espfs_image[] __attribute__((section(\".irom.text\"))) = {"); |
||||||
|
for i, b in enumerate(buf.getbuffer()): |
||||||
|
if i%16 == 0: fd.write("\n") |
||||||
|
fd.write(" 0x{:02x},".format(b)) |
||||||
|
fd.write("\n};\n"); |
||||||
|
fd.close() |
Loading…
Reference in new issue