From c9559961b4077e20e9a9bdfbd897c230c8869f5b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 8 Jul 2021 11:12:49 +0100 Subject: [PATCH] ability to package all files up into a binary blob --- bin/build_bangle2_c.js | 98 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100755 bin/build_bangle2_c.js diff --git a/bin/build_bangle2_c.js b/bin/build_bangle2_c.js new file mode 100755 index 000000000..5e086b980 --- /dev/null +++ b/bin/build_bangle2_c.js @@ -0,0 +1,98 @@ +#!/usr/bin/nodejs +/* +Mashes together a bunch of different apps into a big binary blob. +We then store this *inside* the Bangle.js firmware and can use it +to populate Storage initially. + +Bangle.js 1 doesn't really have anough flash space for this, +but we have enough on v2. +*/ +var SETTINGS = { + pretokenise : true +}; + +var path = require('path'); +var ROOTDIR = path.join(__dirname, '..'); +var APPDIR = ROOTDIR+'/apps'; +var APPJSON = ROOTDIR+'/apps.json'; +var OUTFILE = path.join(ROOTDIR, '../Espruino/libs/banglejs/banglejs2_storage_default.c'); +var APPS = [ // IDs of apps to install + "boot","launchb2","s7clk","setting", + "about","alarm","widlock","widbat","widbt" +]; +var MINIFY = true; + +var fs = require("fs"); +global.Const = { + /* Are we only putting a single app on a device? If so + apps should all be saved as .bootcde and we write info + about the current app into app.info */ + SINGLE_APP_ONLY : false, +}; + +var AppInfo = require(ROOTDIR+"/core/js/appinfo.js"); +var appjson = JSON.parse(fs.readFileSync(APPJSON).toString()); +var appfiles = []; + +function fileGetter(url) { + console.log("Loading "+url) + if (MINIFY) { + if (url.endsWith(".json")) { + var f = url.slice(0,-5); + console.log("MINIFYING JSON "+f); + var j = eval("("+fs.readFileSync(url).toString("binary")+")"); + var code = JSON.stringify(j); + //console.log(code); + url = f+".min.json"; + fs.writeFileSync(url, code); + } + } + return Promise.resolve(fs.readFileSync(url).toString("binary")); +} + +Promise.all(APPS.map(appid => { + var app = appjson.find(app=>app.id==appid); + if (app===undefined) throw new Error(`App ${appid} not found`); + return AppInfo.getFiles(app, { + fileGetter : fileGetter, + settings : SETTINGS + }).then(files => { + appfiles = appfiles.concat(files); + }); +})).then(() => { + // work out what goes in storage + var storageContent = ""; + appfiles.forEach((file) => { + var fileLength = file.content.length; + console.log(file.name+" -> "+fileLength+"b"); + // set up header + var header = new Uint8Array(32); + header.fill(0); + header.set([fileLength,fileLength>>8,fileLength>>16,fileLength>>24],0); // length + for (var i=0;ic.charCodeAt()).join(",")+",\n"; +} +cfile += `}; +`; + fs.writeFileSync(OUTFILE, cfile); + console.log("Output written to "+OUTFILE); +});