wip implementing 'STOP' button as an interrupt

This commit is contained in:
minjaesong
2021-04-23 12:14:50 +09:00
parent 82b021edd7
commit 6902cb27ec
3 changed files with 20 additions and 7 deletions

1
assets/disk0/inttest.js Normal file
View File

@@ -0,0 +1 @@
throw new InterruptedException("lol");

View File

@@ -128,7 +128,18 @@ var GL = eval(filesystem.readAll("A"));
// @param args arguments for the program, must be Array, and args[0] is always the name of the program, e.g. // @param args arguments for the program, must be Array, and args[0] is always the name of the program, e.g.
// for command line 'echo foo bar', args[0] must be 'echo' // for command line 'echo foo bar', args[0] must be 'echo'
var execApp = (cmdsrc, args) => { var execApp = (cmdsrc, args) => {
var execAppPrg = eval("var _appStub=function(exec_args){\n"+cmdsrc+"\n};_appStub;"); // making 'exec_args' a app-level global var execAppPrg = eval(
`function InterruptedException(m){this.message=m;this.stack=(new Error()).stack;};` +
`InterruptedException.prototype=Object.create(Error.prototype);` +
`InterruptedException.prototype.name='InterruptedException';` +
`InterruptedException.prototype.constructor=InterruptedException;` +
`var _appStub=function(exec_args){${cmdsrc}
};try {_appStub;}
catch (e){
if (e instanceof InterruptedException) 'SIGTERM';
else 1;
}`); // making 'exec_args' a app-level global
return execAppPrg(args); return execAppPrg(args);
} }

View File

@@ -380,13 +380,13 @@ shell.execute = function(line) {
sendLcdMsg(_G.shellProgramTitles[_G.shellProgramTitles.length - 1]); sendLcdMsg(_G.shellProgramTitles[_G.shellProgramTitles.length - 1]);
//serial.println(_G.shellProgramTitles); //serial.println(_G.shellProgramTitles);
let ret = execApp(programCode, tokens)|0; // return value of undefined will cast into 0 let ret = execApp(programCode, tokens); // return value of undefined will cast into 0
_G.shellProgramTitles.pop(); _G.shellProgramTitles.pop();
sendLcdMsg(_G.shellProgramTitles[_G.shellProgramTitles.length - 1]); sendLcdMsg(_G.shellProgramTitles[_G.shellProgramTitles.length - 1]);
//serial.println(_G.shellProgramTitles); //serial.println(_G.shellProgramTitles);
return ret; return (ret == undefined) ? 0 : ret;
} }
} }
} }
@@ -457,13 +457,14 @@ if (goInteractive) {
try { try {
errorlevel = 0; // reset the number errorlevel = 0; // reset the number
errorlevel = shell.execute(cmdbuf); errorlevel = shell.execute(cmdbuf);
if (isNaN(errorlevel)) errorlevel = 2; //if (isNaN(errorlevel)) errorlevel = 2;
serial.printerr(`errorlevel: ${errorlevel}`);
} }
catch (e) { catch (e) {
printerrln("\n"+(e.stack || e)); printerrln("\n"+(e.stack || e));
if (errorlevel === 0 || isNaN(errorlevel)) { //if (errorlevel === 0 || isNaN(errorlevel)) {
errorlevel = 1; // generic failure // errorlevel = 1; // generic failure
} //}
} }
finally { finally {
if (cmdbuf.trim().length > 0) if (cmdbuf.trim().length > 0)