2019-03-20 02:33:15 +00:00
|
|
|
'use strict';
|
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
import uuid from 'uuid/v4';
|
2019-03-22 07:22:33 +00:00
|
|
|
import Log = require('log');
|
|
|
|
|
2019-03-22 08:33:53 +00:00
|
|
|
let seq : Sequencer;
|
2019-03-20 02:33:15 +00:00
|
|
|
|
2019-03-22 08:33:53 +00:00
|
|
|
class Sequencer {
|
2019-03-20 02:33:15 +00:00
|
|
|
private time : number;
|
2019-03-22 21:06:57 +00:00
|
|
|
private running : boolean = false;
|
|
|
|
private paused : boolean = false;
|
2019-03-20 02:33:15 +00:00
|
|
|
|
2019-03-30 00:44:12 +00:00
|
|
|
private grid : any[] = [];
|
|
|
|
private gridLoops : number = 1;
|
|
|
|
|
|
|
|
private arr : any[] = []; //store sequence from gui
|
2019-03-22 07:22:33 +00:00
|
|
|
private loops : number = 1;
|
|
|
|
|
2019-03-20 02:33:15 +00:00
|
|
|
private cfg : any;
|
|
|
|
private cmd : any;
|
2019-03-22 07:22:33 +00:00
|
|
|
private CMDS : any = {};
|
|
|
|
private ipc : any;
|
2019-03-24 01:58:22 +00:00
|
|
|
private ui : any;
|
2019-03-22 07:22:33 +00:00
|
|
|
private log : any;
|
2019-03-22 08:33:53 +00:00
|
|
|
private id : string = 'sequence';
|
2019-03-22 07:22:33 +00:00
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
constructor (cfg : any, cmd : any, ui : any) {
|
2019-03-20 02:33:15 +00:00
|
|
|
this.cfg = cfg;
|
|
|
|
this.cmd = cmd;
|
2019-03-24 01:58:22 +00:00
|
|
|
this.ui = ui;
|
2019-03-22 07:22:33 +00:00
|
|
|
this.cmds(cfg.cmd);
|
|
|
|
this.init();
|
|
|
|
}
|
|
|
|
|
|
|
|
private cmds (obj : any) {
|
|
|
|
let keys : string[] = Object.keys(obj);
|
2019-03-24 01:58:22 +00:00
|
|
|
for (let key of keys) {
|
|
|
|
this.CMDS[obj[key]] = key;
|
2019-03-22 07:22:33 +00:00
|
|
|
}
|
2019-03-20 02:33:15 +00:00
|
|
|
}
|
2019-03-22 07:22:33 +00:00
|
|
|
|
2019-03-20 02:33:15 +00:00
|
|
|
//currently called by ui
|
2019-03-22 07:22:33 +00:00
|
|
|
private async init () {
|
2019-03-24 01:58:22 +00:00
|
|
|
this.log = await Log({ label : this.id })
|
2019-03-22 07:22:33 +00:00
|
|
|
this.ipc = require('electron').ipcMain;
|
|
|
|
this.listen();
|
|
|
|
}
|
|
|
|
|
|
|
|
private listen () {
|
2019-03-22 08:33:53 +00:00
|
|
|
this.ipc.on(this.id, this.listener.bind(this));
|
2019-03-22 07:22:33 +00:00
|
|
|
}
|
2019-03-20 02:33:15 +00:00
|
|
|
|
2019-03-22 07:22:33 +00:00
|
|
|
private async listener (event : any, arg : any) {
|
2019-03-22 21:06:57 +00:00
|
|
|
if (arg && arg.start) {
|
|
|
|
this.start(arg);
|
|
|
|
} else if (arg && arg.stop) {
|
|
|
|
this.stop();
|
|
|
|
} else if (arg && arg.pause) {
|
|
|
|
this.pause();
|
|
|
|
} else if (arg && arg.set) {
|
2019-03-22 08:33:53 +00:00
|
|
|
this.setSteps(arg.set);
|
2019-03-22 21:06:57 +00:00
|
|
|
} else if (arg && arg.unset) {
|
|
|
|
this.unsetSteps(arg.unset);
|
2019-03-22 07:22:33 +00:00
|
|
|
} else if (arg && arg.loops) {
|
2019-03-24 01:58:22 +00:00
|
|
|
this.setLoops(arg.loops);
|
2019-03-22 07:22:33 +00:00
|
|
|
}
|
|
|
|
event.returnValue = true;
|
|
|
|
}
|
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
public setLoops (count : number) {
|
2019-03-30 00:44:12 +00:00
|
|
|
this.gridLoops = count;
|
2019-03-24 01:58:22 +00:00
|
|
|
this.log.info(`Set loop count to ${count}`);
|
2019-03-20 02:33:15 +00:00
|
|
|
}
|
2019-03-22 21:06:57 +00:00
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
public setSteps (steps : any[]) {
|
|
|
|
for (let step of steps) {
|
2019-03-30 00:44:12 +00:00
|
|
|
this.grid[step.x] = step;
|
2019-03-24 01:58:22 +00:00
|
|
|
}
|
2019-03-22 21:06:57 +00:00
|
|
|
}
|
2019-03-24 01:58:22 +00:00
|
|
|
|
|
|
|
public unsetSteps (steps : number[]) {
|
|
|
|
for (let x of steps) {
|
2019-03-30 00:44:12 +00:00
|
|
|
this.grid[x] = undefined;
|
2019-03-24 01:58:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-22 21:06:57 +00:00
|
|
|
//new, replaces exec and init
|
2019-03-22 07:22:33 +00:00
|
|
|
public async start (arg : any) {
|
|
|
|
if (arg && arg.arr) {
|
2019-03-22 21:06:57 +00:00
|
|
|
this.arr = arg.arr; //overwrite sequence
|
2019-03-30 00:44:12 +00:00
|
|
|
} else {
|
|
|
|
this.arr = this.grid;
|
2019-03-22 07:22:33 +00:00
|
|
|
}
|
2019-03-31 00:29:01 +00:00
|
|
|
|
2019-03-22 07:22:33 +00:00
|
|
|
if (arg && arg.loops) {
|
2019-03-22 21:06:57 +00:00
|
|
|
this.loops = arg.loops; //overwrite loops
|
2019-03-30 00:44:12 +00:00
|
|
|
} else {
|
|
|
|
this.loops = this.gridLoops;
|
2019-03-22 07:22:33 +00:00
|
|
|
}
|
2019-03-22 21:06:57 +00:00
|
|
|
|
|
|
|
this.running = true;
|
|
|
|
this.paused = false;
|
2019-03-20 02:33:15 +00:00
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
//start sequence
|
|
|
|
this.log.info(`Starting sequence...`)
|
2019-03-31 00:29:01 +00:00
|
|
|
this.ui.send(this.id, { start : true })
|
2019-03-24 01:58:22 +00:00
|
|
|
|
2019-03-22 07:22:33 +00:00
|
|
|
for (let x = 0; x < this.loops; x++) {
|
2019-03-22 21:06:57 +00:00
|
|
|
//start loop
|
2019-03-24 01:58:22 +00:00
|
|
|
this.log.info(`Starting loop ${x + 1}`)
|
|
|
|
this.ui.send(this.id, { loop : x, start : true });
|
|
|
|
|
2019-03-22 07:22:33 +00:00
|
|
|
for (let y = 0; y < this.arr.length; y++) {
|
2019-03-22 21:06:57 +00:00
|
|
|
//start step
|
2019-03-24 04:25:16 +00:00
|
|
|
if (!this.running) {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
while (this.paused) {
|
|
|
|
await delay(42);
|
|
|
|
}
|
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
this.log.info(`Starting step ${y + 1} of loop ${x + 1}`)
|
2019-03-31 00:29:01 +00:00
|
|
|
this.ui.send(this.id, { step : y, loop : x, start : true });
|
2019-03-24 04:25:16 +00:00
|
|
|
|
|
|
|
await this.step(y);
|
2019-03-24 01:58:22 +00:00
|
|
|
|
2019-03-22 21:06:57 +00:00
|
|
|
//end step
|
2019-03-24 01:58:22 +00:00
|
|
|
this.log.info(`Ended step ${y + 1} of loop ${x + 1}`)
|
2019-03-31 00:29:01 +00:00
|
|
|
this.ui.send(this.id, { step : y, loop : x, stop : true });
|
2019-03-22 07:22:33 +00:00
|
|
|
}
|
2019-03-24 04:25:16 +00:00
|
|
|
if (!this.running) {
|
|
|
|
break
|
|
|
|
}
|
2019-03-22 21:06:57 +00:00
|
|
|
//end loop
|
2019-03-24 01:58:22 +00:00
|
|
|
this.log.info(`Ended loop ${x + 1}`)
|
|
|
|
this.ui.send(this.id, { loop : x, stop : true });
|
2019-03-22 07:22:33 +00:00
|
|
|
}
|
2019-03-24 01:58:22 +00:00
|
|
|
//end sequence
|
|
|
|
this.log.info(`Ended sequence`)
|
2019-03-31 00:29:01 +00:00
|
|
|
this.ui.send(this.id, { stop : true })
|
2019-03-20 02:33:15 +00:00
|
|
|
}
|
2019-03-24 01:58:22 +00:00
|
|
|
|
2019-03-20 02:33:15 +00:00
|
|
|
//new
|
|
|
|
public pause () {
|
2019-03-22 21:06:57 +00:00
|
|
|
this.paused = true;
|
2019-03-20 02:33:15 +00:00
|
|
|
}
|
2019-03-24 01:58:22 +00:00
|
|
|
|
2019-03-20 02:33:15 +00:00
|
|
|
/**
|
|
|
|
* Stop the sequence
|
|
|
|
**/
|
|
|
|
public stop () {
|
2019-03-22 01:02:28 +00:00
|
|
|
this.running = false;
|
2019-03-22 07:22:33 +00:00
|
|
|
//clear?
|
2019-03-20 19:30:45 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
private async step (x: number) {
|
2019-03-22 07:22:33 +00:00
|
|
|
try {
|
2019-03-24 01:58:22 +00:00
|
|
|
await this.cmdMap(x)
|
2019-03-22 07:22:33 +00:00
|
|
|
} catch (err) {
|
|
|
|
throw err;
|
|
|
|
}
|
2019-03-20 19:30:45 +00:00
|
|
|
}
|
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
private async cmdMap (x : number) {
|
|
|
|
const cmdOriginal : string = this.arr[x].cmd;
|
2019-03-22 07:22:33 +00:00
|
|
|
const cmd : string = this.CMDS[cmdOriginal];
|
2019-03-24 01:58:22 +00:00
|
|
|
this.log.info(`CMD: '${cmdOriginal}' -> ${cmd}`);
|
|
|
|
//I wrote this when I was very tired and delirious
|
|
|
|
return await this.cmd[cmd]();
|
2019-03-20 19:30:45 +00:00
|
|
|
}
|
2019-03-20 02:33:15 +00:00
|
|
|
}
|
|
|
|
|
2019-03-24 01:58:22 +00:00
|
|
|
module.exports = function (cfg : any, cmd : any, ui : any) {
|
|
|
|
return new Sequencer(cfg, cmd, ui);
|
2019-03-20 02:33:15 +00:00
|
|
|
}
|