firmware maker

master
Gordon Williams 2019-11-10 10:22:33 +00:00
parent cad2427c20
commit e7a6cbedfd
5 changed files with 138 additions and 47 deletions

48
appinfo.js Normal file
View File

@ -0,0 +1,48 @@
function toJS(txt) {
return JSON.stringify(txt);
}
var AppInfo = {
getFiles : (app,fileGetter) => {
return new Promise((resolve,reject) => {
// Load all files
Promise.all(app.storage.map(storageFile => {
if (storageFile.content)
return Promise.resolve(storageFile);
else if (storageFile.url)
return fileGetter("apps/"+storageFile.url).then(content => {
return {
name : storageFile.name,
content : content,
evaluate : storageFile.evaluate
}});
else return Promise.resolve();
})).then(fileContents => { // now we just have a list of files + contents...
// filter out empty files
fileContents = fileContents.filter(x=>x!==undefined);
// then map each file to a command to load into storage
fileContents.forEach(storageFile => {
// check if this is the JSON file
if (storageFile.name[0]=="+") {
storageFile.evaluate = true;
var json = {};
try {
json = JSON.parse(storageFile.content);
} catch (e) {
reject(storageFile.name+" is not valid JSON");
}
json.files = fileContents.map(storageFile=>storageFile.name).join(",");
storageFile.content = JSON.stringify(json);
}
// format ready for Espruino
var js = storageFile.evaluate ? storageFile.content.trim() : toJS(storageFile.content);
storageFile.cmd = `\x10require('Storage').write(${toJS(storageFile.name)},${js});`;
});
resolve(fileContents);
});
});
},
};
if ("undefined"!=typeof module)
module.exports = AppInfo;

52
bin/firmwaremaker.js Normal file
View File

@ -0,0 +1,52 @@
#!/usr/bin/nodejs
/*
Mashes together a bunch of different apps to make
a single firmware JS file which can be uploaded.
*/
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",
"mclock",
"setting",
"trex",
"gpstime",
"compass",
"sbat",
"funrun5",
"nceuwid",
//"start"
];
var fs = require("fs");
var AppInfo = require(ROOTDIR+"/appinfo.js");
var appjson = JSON.parse(fs.readFileSync(APPJSON).toString());
var appfiles = [];
function fileGetter(url) {
console.log("Loading "+url)
if (url.endsWith(".js")) {
// minify?
}
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).then(files => {
appfiles = appfiles.concat(files);
});
})).then(() => {
//console.log(appfiles);
var js = "";
appfiles.forEach((file) => {
js += file.cmd+"\n";
});
fs.writeFileSync(OUTFILE, js);
console.log("Output written to "+OUTFILE);
});

View File

@ -1,55 +1,10 @@
Puck.debug=3; Puck.debug=3;
/* 'app' is of the form:
{ name: "T-Rex",
icon: "trex.png",
description: "T-Rex game in the style of Chrome's offline game",
storage: [
{name:"+trex",file:"trex.json"},
{name:"-trex",file:"trex.js"},
{name:"*trex",file:"trex-icon.js"}
]
}
*/
// FIXME: use UART lib so that we handle errors properly // FIXME: use UART lib so that we handle errors properly
var Comms = { var Comms = {
uploadApp : app => { uploadApp : app => {
return AppInfo.getFiles(app, httpGet).then(fileContents => {
return new Promise((resolve,reject) => { return new Promise((resolve,reject) => {
// Load all files
Promise.all(app.storage.map(storageFile => {
if (storageFile.content)
return Promise.resolve(storageFile);
else if (storageFile.url)
return httpGet("apps/"+storageFile.url).then(content => {
return {
name : storageFile.name,
content : content,
evaluate : storageFile.evaluate
}});
else return Promise.resolve();
})).then(fileContents => { // now we just have a list of files + contents...
// filter out empty files
fileContents = fileContents.filter(x=>x!==undefined);
// then map each file to a command to load into storage
fileContents.forEach(storageFile => {
// check if this is the JSON file
if (storageFile.name[0]=="+") {
storageFile.evaluate = true;
var json = {};
try {
json = JSON.parse(storageFile.content);
} catch (e) {
reject(storageFile.name+" is not valid JSON");
}
json.files = fileContents.map(storageFile=>storageFile.name).join(",");
storageFile.content = JSON.stringify(json);
}
// format ready for Espruino
var js = storageFile.evaluate ? storageFile.content.trim() : toJS(storageFile.content);
storageFile.cmd = `\x10require('Storage').write(${toJS(storageFile.name)},${js});`;
});
fileContents = fileContents.map(storageFile=>storageFile.cmd).join("\n")+"\n"; fileContents = fileContents.map(storageFile=>storageFile.cmd).join("\n")+"\n";
console.log("uploadApp",fileContents); console.log("uploadApp",fileContents);
// reset to ensure we have enough memory to upload what we need to // reset to ensure we have enough memory to upload what we need to

35
firmware.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -108,6 +108,7 @@
<script src="https://www.puck-js.com/puck.js"></script> <script src="https://www.puck-js.com/puck.js"></script>
<script src="utils.js"></script> <script src="utils.js"></script>
<script src="comms.js"></script> <script src="comms.js"></script>
<script src="appinfo.js"></script>
<script src="index.js"></script> <script src="index.js"></script>
</body> </body>
</html> </html>