diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 0000000..2d9bd4f --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,65 @@ +'use strict'; + +exports.and = () => { + let state = 0; // idle + let total = 0; + let start = 0; + + return { + onA: (time, cmd) => { + switch(state) { + case 0: if (cmd === 15) { state = 1; } break; + case 1: if (cmd === 14) { state = 0; } break; + case 2: if (cmd === 15) { state = 3; start = time; } break; + case 3: if (cmd === 14) { state = 2; total += (time - start); start = 0; } break; + default: throw new Error(); + } + }, + onNotA: (time, cmd) => { + switch(state) { + case 0: if (cmd === 14) { state = 1; } break; + case 1: if (cmd === 15) { state = 0; } break; + case 2: if (cmd === 14) { state = 3; start = time; } break; + case 3: if (cmd === 15) { state = 2; total += (time - start); start = 0; } break; + default: throw new Error(); + } + }, + onB: (time, cmd) => { + switch(state) { + case 0: if (cmd === 15) { state = 2; } break; + case 1: if (cmd === 15) { state = 3; start = time; } break; + case 2: if (cmd === 14) { state = 0; } break; + case 3: if (cmd === 14) { state = 1; total += (time - start); start = 0; } break; + default: throw new Error(); + } + }, + onNotB: (time, cmd) => { + switch(state) { + case 0: if (cmd === 14) { state = 2; } break; + case 1: if (cmd === 14) { state = 3; start = time; } break; + case 2: if (cmd === 15) { state = 0; } break; + case 3: if (cmd === 15) { state = 1; total += (time - start); start = 0; } break; + default: throw new Error(); + } + }, + time: () => total + start + }; +}; + + +exports.activity = skip => { + let start = 0; + let stop = 0; + return { + on: time => { + if (time > skip) { + if (start == 0) { + start = time; + } else { + stop = time; + } + } + }, + time: () => stop - start + }; +};