From a51aac1066754032a7fda0db12172861eebb8e0e Mon Sep 17 00:00:00 2001 From: debenben Date: Wed, 30 Dec 2020 20:54:24 +0100 Subject: [PATCH] possible fix for #118, always return resolve * changed _finished pointer to array to not overwrite callbacks * all completed and discarded commands get resolved * 0x10 bitset exists in documentation only? -> not implemented --- src/devices/absolutemotor.ts | 5 ++--- src/devices/device.ts | 14 ++++++++------ src/devices/tachomotor.ts | 10 ++++------ src/hubs/lpf2hub.ts | 5 +---- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/devices/absolutemotor.ts b/src/devices/absolutemotor.ts index 41178c4..4ed895d 100644 --- a/src/devices/absolutemotor.ts +++ b/src/devices/absolutemotor.ts @@ -51,7 +51,6 @@ export class AbsoluteMotor extends TachoMotor { } this.cancelEventTimer(); return new Promise((resolve) => { - this._busy = true; if (speed === undefined || speed === null) { speed = 100; } @@ -65,9 +64,9 @@ export class AbsoluteMotor extends TachoMotor { message.writeInt32LE(normalizeAngle(angle), 4); } this.send(message); - this._finished = () => { + this._finishedCallbacks.push(() => { return resolve(); - }; + }); }); } diff --git a/src/devices/device.ts b/src/devices/device.ts index dfd8647..734aa95 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -15,7 +15,7 @@ export class Device extends EventEmitter { protected _mode: number | undefined; protected _busy: boolean = false; - protected _finished: (() => void) | undefined; + protected _finishedCallbacks: (() => void)[] = []; private _hub: IDeviceInterface; private _portId: number; @@ -167,11 +167,13 @@ export class Device extends EventEmitter { this.send(Buffer.from([0x21, this.portId, 0x00])); } - public finish () { - this._busy = false; - if (this._finished) { - this._finished(); - this._finished = undefined; + public finish (message: number) { + this._busy = (message & 0x01) === 0x01; + while(this._finishedCallbacks.length > Number(this._busy)) { + const callback = this._finishedCallbacks.shift(); + if(callback) { + callback(); + } } } diff --git a/src/devices/tachomotor.ts b/src/devices/tachomotor.ts index d54ca79..357eff4 100644 --- a/src/devices/tachomotor.ts +++ b/src/devices/tachomotor.ts @@ -104,7 +104,6 @@ export class TachoMotor extends BasicMotor { } this.cancelEventTimer(); return new Promise((resolve) => { - this._busy = true; if (speed === undefined || speed === null) { speed = 100; } @@ -124,9 +123,9 @@ export class TachoMotor extends BasicMotor { } } this.send(message); - this._finished = () => { + this._finishedCallbacks.push(() => { return resolve(); - }; + }); }); } @@ -146,7 +145,6 @@ export class TachoMotor extends BasicMotor { } this.cancelEventTimer(); return new Promise((resolve) => { - this._busy = true; if (speed === undefined || speed === null) { speed = 100; } @@ -158,9 +156,9 @@ export class TachoMotor extends BasicMotor { } message.writeUInt32LE(degrees, 4); this.send(message); - this._finished = () => { + this._finishedCallbacks.push(() => { return resolve(); - }; + }); }); } diff --git a/src/hubs/lpf2hub.ts b/src/hubs/lpf2hub.ts index 743d1ec..806fb47 100644 --- a/src/hubs/lpf2hub.ts +++ b/src/hubs/lpf2hub.ts @@ -353,10 +353,7 @@ export class LPF2Hub extends BaseHub { const device = this._getDeviceByPortId(portId); if (device) { - const finished = (message[4] === 0x0a); - if (finished) { - device.finish(); - } + device.finish(message[4]); } }