espruino-web-ide
Version:
A Terminal and Graphical code Editor for Espruino JavaScript Microcontrollers
232 lines (212 loc) • 7.19 kB
JavaScript
require('es6-shim');
/* Entrypoint for node module. Not used for Web IDE */
var fs = require("fs");
/* load all files in EspruinoTools... we do this so we can still
use these files normally in the Web IDE */
function loadJS(filePath) {
console.log("Found "+filePath);
var contents = fs.readFileSync(filePath, {encoding:"utf8"});
var realExports = exports;
exports = undefined;
var r = eval(contents);
exports = realExports; // utf8 lib somehow breaks this
return r;
/* the code below would be better, but it doesn't seem to work when running
CLI - works fine when running as a module. */
//return require("vm").runInThisContext(contents, filePath );
}
function loadDir(dir) {
var files = fs.readdirSync(dir);
for (var i in files) {
var filePath = dir+"/"+files[i];
if (files[i].substr(-3)==".js" && files[i][0]!="_")
loadJS(filePath);
/*else if (fs.lstatSync(filePath).isDirectory())
loadDir(filePath); // recursive */
}
}
// ---------------
// Horrible jQuery stubs. We don't want to pull in jQuery itself because it drags in a million other
// modules that we don't care about, and needs jsDom which has nasty dependency problems
// ---------------
var jqReady = [];
var jqShim = {
ready : function(cb) { jqReady.push(cb); },
css : function() {},
html : function() {},
width : function() {},
height : function() {},
addClass : function() {},
removeClass : function() {},
appendTo : function() { return jqShim; },
show : function() {},
hide : function() {},
};
global.$ = function() { return jqShim; };
// ---------------
var espruinoInitialised = false;
function init(callback) {
if (espruinoInitialised) {
console.log("Already initialised.");
return callback();
}
espruinoInitialised = true;
global.navigator = { userAgent : "node" };
global.document = {};
global.document = undefined;
global.Espruino = undefined;
try {
global.acorn = require("acorn");
acorn.walk = require("acorn/util/walk");
} catch(e) {
console.log("Acorn library not found - you'll need it for compiled code");
}
try {
global.esprima = require("esprima");
} catch(e) {
console.log("esprima library not found - you'll need it to minify code");
}
try {
global.esmangle = require("esmangle");
} catch(e) {
console.log("esmangle library not found - you'll need it to minify code");
}
try {
global.escodegen = require("escodegen");
} catch(e) {
console.log("escodegen library not found - you'll need it to minify code");
}
// Load each JS file...
// libraries needed by the tools
loadDir(__dirname+"/libs");
/* NOTE: we have libs/esprima that we're not parsing here.
it's got some detection for node.js and loading this way
doesn't work - instead we require it using NPM below. */
// the 'main' file
Espruino = loadJS(__dirname+"/espruino.js");
// Core features
loadDir(__dirname+"/core");
// Various plugins
loadDir(__dirname+"/plugins");
// Bodge up notifications
Espruino.Core.Notifications = {
success : function(e) { console.log(e); },
error : function(e) { console.error(e); },
warning : function(e) { console.warn(e); },
info : function(e) { console.log(e); },
};
Espruino.Core.Status = {
setStatus : function(e,len) { console.log(e); },
hasProgress : function() { return false; },
incrementProgress : function(amt) {}
};
// Finally init everything
jqReady.forEach(function(cb){cb();});
Espruino.init();
callback();
};
/** Initialise EspruinoTools and call the callback.
When the callback is called, the global variable 'Espruino'
will then contain everything that's needed to use EspruinoTools */
exports.init = init;
/** Send a file to an Espruino on the given port, call the callback when done */
exports.sendFile = function(port, filename, callback) {
var code = fs.readFileSync(filename, {encoding:"utf8"});
sendCode(port, code, callback);
};
exports.sendCode = sendCode;
function sendCode(port, code, callback) {
var response = "";
init(function() {
Espruino.Core.Serial.startListening(function(data) {
data = new Uint8Array(data);
for (var i=0;i<data.length;i++)
response += String.fromCharCode(data[i]);
});
Espruino.Core.Serial.open(port, function(status) {
if (status === undefined) {
console.error("Unable to connect!");
return callback();
}
Espruino.callProcessor("transformForEspruino", code, function(code) {
Espruino.Core.CodeWriter.writeToEspruino(code, function() {
setTimeout(function() {
Espruino.Core.Serial.close();
}, 500);
});
});
}, function() { // disconnected
if (callback)
callback(response);
});
});
};
/** Execute an expression on Espruino, call the callback with the result */
exports.expr = function(port, expr, callback) {
var exprResult = undefined;
init(function() {
Espruino.Core.Serial.startListening(function(data) { });
Espruino.Core.Serial.open(port, function(status) {
if (status === undefined) {
console.error("Unable to connect!");
return callback();
}
Espruino.Core.Utils.executeExpression(expr, function(result) {
setTimeout(function() {
Espruino.Core.Serial.close();
}, 500);
exprResult = result;
});
}, function() { // disconnected
if (callback) callback(exprResult);
});
});
};
/** Execute a statement on Espruino, call the callback with what is printed to the console */
exports.statement = function(port, expr, callback) {
var exprResult = undefined;
init(function() {
Espruino.Core.Serial.startListening(function(data) { });
Espruino.Core.Serial.open(port, function(status) {
if (status === undefined) {
console.error("Unable to connect!");
return callback();
}
Espruino.Core.Utils.executeStatement(expr, function(result) {
setTimeout(function() {
Espruino.Core.Serial.close();
}, 500);
exprResult = result;
});
}, function() { // disconnected
if (callback) callback(exprResult);
});
});
};
/** Flash the given firmware file to an Espruino board. */
exports.flash = function(port, filename, flashOffset, callback) {
if (typeof flashOffset === 'function') {
// backward compatibility if flashOffset is missed
callback = flashOffset;
flashOffset = null;
}
var code = fs.readFileSync(filename, {encoding:"utf8"});
init(function() {
Espruino.Core.Serial.startListening(function(data) { });
Espruino.Core.Serial.open(port, function(status) {
if (status === undefined) {
console.error("Unable to connect!");
return callback();
}
var bin = fs.readFileSync(filename, {encoding:"binary"});
Espruino.Core.Flasher.flashBinaryToDevice(bin, flashOffset, function(err) {
console.log(err ? "Error!" : "Success!");
setTimeout(function() {
Espruino.Core.Serial.close();
}, 500);
});
}, function() { // disconnected
if (callback) callback();
});
});
};