2020-02-10 13:49:36 +00:00
|
|
|
/* Library for 'interface' HTML files that are to
|
|
|
|
be used from within BangleApps
|
|
|
|
|
|
|
|
See: README.md / `apps.json`: `interface` element
|
|
|
|
|
2020-03-31 13:39:59 +00:00
|
|
|
This exposes a 'Puck' object (a simple version of
|
|
|
|
https://github.com/espruino/EspruinoWebTools/blob/master/puck.js)
|
|
|
|
and calls `onInit` when it's ready. `Puck` can be used for
|
|
|
|
sending/receiving data to the correctly connected
|
2020-02-10 13:49:36 +00:00
|
|
|
device with Puck.eval/write.
|
2020-03-31 13:39:59 +00:00
|
|
|
|
|
|
|
Puck.write(data,callback)
|
|
|
|
Puck.eval(data,callback)
|
|
|
|
|
|
|
|
There is also:
|
|
|
|
|
|
|
|
Util.readStorageFile(filename,callback)
|
|
|
|
Util.eraseStorageFile(filename,callback)
|
|
|
|
Util.showModal(title)
|
|
|
|
Util.hideModal()
|
2020-02-10 13:49:36 +00:00
|
|
|
*/
|
|
|
|
var __id = 0, __idlookup = [];
|
|
|
|
var Puck = {
|
|
|
|
eval : function(data,callback) {
|
|
|
|
__id++;
|
|
|
|
__idlookup[__id] = callback;
|
|
|
|
window.postMessage({type:"eval",data:data,id:__id});
|
|
|
|
},write : function(data,callback) {
|
|
|
|
__id++;
|
|
|
|
__idlookup[__id] = callback;
|
|
|
|
window.postMessage({type:"write",data:data,id:__id});
|
|
|
|
}
|
|
|
|
};
|
2020-03-31 13:39:59 +00:00
|
|
|
|
|
|
|
var Util = {
|
|
|
|
readStorageFile : function(filename,callback) {
|
|
|
|
__id++;
|
|
|
|
__idlookup[__id] = callback;
|
|
|
|
window.postMessage({type:"readstoragefile",data:filename,id:__id});
|
|
|
|
},
|
|
|
|
eraseStorageFile : function(filename,callback) {
|
2020-04-03 14:15:06 +00:00
|
|
|
Puck.write(`\x10require("Storage").open(${JSON.stringify(filename)},"r").erase()\n`,callback);
|
|
|
|
},
|
|
|
|
eraseStorage : function(filename,callback) {
|
|
|
|
Puck.write(`\x10require("Storage").erase(${JSON.stringify(filename)})\n`,callback);
|
2020-03-31 13:39:59 +00:00
|
|
|
},
|
|
|
|
showModal : function(title) {
|
|
|
|
if (!Util.domModal) {
|
|
|
|
Util.domModal = document.createElement('div');
|
|
|
|
Util.domModal.id = "status-modal";
|
|
|
|
Util.domModal.classList.add("modal");
|
|
|
|
Util.domModal.classList.add("active");
|
|
|
|
Util.domModal.innerHTML = `<div class="modal-overlay"></div>
|
|
|
|
<div class="modal-container">
|
|
|
|
<div class="modal-header">
|
|
|
|
<div class="modal-title h5">Please wait</div>
|
|
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
|
|
<div class="content">
|
|
|
|
Loading...
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>`;
|
|
|
|
document.body.appendChild(Util.domModal);
|
|
|
|
}
|
|
|
|
Util.domModal.querySelector(".content").innerHTML = title;
|
|
|
|
Util.domModal.classList.add("active");
|
|
|
|
},
|
|
|
|
hideModal : function() {
|
|
|
|
if (!Util.domModal) return;
|
|
|
|
Util.domModal.classList.remove("active");
|
2020-04-03 14:15:06 +00:00
|
|
|
},
|
|
|
|
saveCSV : function(filename, csvData) {
|
|
|
|
var a = document.createElement("a"),
|
|
|
|
file = new Blob([csvData], {type: "Comma-separated value file"});
|
|
|
|
var url = URL.createObjectURL(file);
|
|
|
|
a.href = url;
|
|
|
|
a.download = filename+".csv";
|
|
|
|
document.body.appendChild(a);
|
|
|
|
a.click();
|
|
|
|
setTimeout(function() {
|
|
|
|
document.body.removeChild(a);
|
|
|
|
window.URL.revokeObjectURL(url);
|
|
|
|
}, 0);
|
2020-03-31 13:39:59 +00:00
|
|
|
}
|
|
|
|
};
|
2020-02-10 13:49:36 +00:00
|
|
|
window.addEventListener("message", function(event) {
|
|
|
|
var msg = event.data;
|
|
|
|
if (msg.type=="init") {
|
|
|
|
onInit();
|
2020-03-31 13:39:59 +00:00
|
|
|
} else if (msg.type=="evalrsp" || msg.type=="writersp"|| msg.type=="readstoragefilersp") {
|
2020-02-10 13:49:36 +00:00
|
|
|
var cb = __idlookup[msg.id];
|
|
|
|
delete __idlookup[msg.id];
|
|
|
|
cb(msg.data);
|
|
|
|
}
|
|
|
|
}, false);
|