#!/usr/bin/nodejs /* Mashes together a bunch of different apps to make a single firmware JS file which can be uploaded. */ var SETTINGS = { pretokenise : true }; var path = require('path'); var ROOTDIR = path.join(__dirname, '..'); var APPDIR = ROOTDIR+'/apps'; var APPJSON = ROOTDIR+'/apps.json'; var OUTFILE = ROOTDIR+'/firmware.js'; var APPS = [ // IDs of apps to install "boot","launch","mclock","setting", "about","alarm","widbat","widbt","welcome" ]; var MINIFY = true; var fs = require("fs"); var AppInfo = require(ROOTDIR+"/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(".js")) { var f = url.slice(0,-3); console.log("MINIFYING "+f); const execSync = require('child_process').execSync; // --config PRETOKENISE=true // --minify code = execSync(`espruino --config SET_TIME_ON_WRITE=false --minify --board BANGLEJS ${f}.js -o ${f}.min.js`); console.log(code.toString()); url = f+".min.js"; }*/ if (url.endsWith(".json")) { var f = url.slice(0,-5); console.log("MINIFYING JSON "+f); var j = eval("("+fs.readFileSync(url).toString()+")"); var code = JSON.stringify(j); //console.log(code); url = f+".min.json"; fs.writeFileSync(url, code); } } return Promise.resolve(fs.readFileSync(url).toString()); } 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(() => { //console.log(appfiles); var js = "// Generated by BangleApps/bin/firmwaremaker.js\n"; appfiles.forEach((file) => { js += file.cmd+"\n"; /*if (file.crc && file.evaluate!==true) { js += `\x10if (E.CRC32(require('Storage').read(${JSON.stringify(file.name)}))!=${file.crc}){console.log("${file.name} invalid");FAIL++}\n`; }*/ }); fs.writeFileSync(OUTFILE, js); console.log("Output written to "+OUTFILE); });