diff --git a/openBCICyton.js b/openBCICyton.js index 8effd2b..b367ec4 100644 --- a/openBCICyton.js +++ b/openBCICyton.js @@ -2164,20 +2164,14 @@ Cyton.prototype._finalizeNewSample = function (sampleObject) { if (!sampleObject.valid) { this.badPackets++; this.emit(k.OBCIEmitterDroppedPacket, [this.previousSampleNumber + 1]); - } else if (this.impedanceTest.active) { - if (_.eq(this.getBoardType(), k.OBCIBoardDaisy)) { - this._finalizeNewSampleForDaisy(sampleObject, true); - } else { - this._processImpedanceTest(sampleObject); - this.emit(k.OBCIEmitterSample, sampleObject); - } } else { - // With the daisy board attached, lower channels (1-8) come in packets with odd sample numbers and upper - // channels (9-16) come in packets with even sample numbers if (_.eq(this.getBoardType(), k.OBCIBoardDaisy)) { // Send the sample for downstream sample compaction - this._finalizeNewSampleForDaisy(sampleObject, false); + // With the daisy board attached, lower channels (1-8) come in packets with odd sample numbers and upper + // channels (9-16) come in packets with even sample numbers + this._finalizeNewSampleForDaisy(sampleObject); } else { + if (this.impedanceTest.active) this._processImpedanceTest(sampleObject); this.emit(k.OBCIEmitterSample, sampleObject); } } @@ -2193,7 +2187,7 @@ Cyton.prototype._finalizeNewSample = function (sampleObject) { * @private * @author AJ Keller (@pushtheworldllc) */ -Cyton.prototype._finalizeNewSampleForDaisy = function (sampleObject, impedance) { +Cyton.prototype._finalizeNewSampleForDaisy = function (sampleObject) { if (obciUtils.isOdd(sampleObject.sampleNumber)) { // Check for the skipped packet condition if (this._lowerChannelsSampleObject) { @@ -2209,8 +2203,8 @@ Cyton.prototype._finalizeNewSampleForDaisy = function (sampleObject, impedance) // Set the _lowerChannelsSampleObject object to null this._lowerChannelsSampleObject = null; // Emite the new merged sample and if relevant process impedance - if (impedance) this._processImpedanceTest(mergedSample); - this.emit('sample', mergedSample); + if (this.impedanceTest.active) this._processImpedanceTest(mergedSample); + this.emit(k.OBCIEmitterSample, mergedSample); } else { // Missed the odd packet, i.e. two evens in a row this.info.missedPackets++; diff --git a/openBCISimulator.js b/openBCISimulator.js index cac1aa3..f623570 100644 --- a/openBCISimulator.js +++ b/openBCISimulator.js @@ -2,9 +2,9 @@ const EventEmitter = require('events').EventEmitter; const util = require('util'); const stream = require('stream'); - -const obciUtilities = require('openbci-utilities').Utilities; -const k = require('openbci-utilities').Constants; +const OpenBCIUtilities = require('openbci-utilities'); +const obciUtilities = OpenBCIUtilities.Utilities; +const k = OpenBCIUtilities.Constants; const now = require('performance-now'); const Buffer = require('safe-buffer').Buffer; diff --git a/test/openBCICyton-test.js b/test/openBCICyton-test.js index 79215bf..49a3e42 100644 --- a/test/openBCICyton-test.js +++ b/test/openBCICyton-test.js @@ -2463,11 +2463,83 @@ $$$`); }); }); + describe('#_finalizeNewSample', function () { + let ourBoard; + + before(() => { + ourBoard = new Cyton({ + verbose: true, + simulate: true + }); + }); + + it('should emit dropped packet on bad packet', function (done) { + const sample = openBCIUtilities.newSample(0); + sample.valid = false; + sample._count = 52; + + const expectedBadPackets = 1; + const expectedInternalCount = 3; + const expectedPreviousSampleNumber = 2; + + ourBoard.badPackets = expectedBadPackets - 1; + ourBoard.previousSampleNumber = expectedPreviousSampleNumber - 1; + ourBoard.sampleCount = expectedInternalCount; + + ourBoard.once('droppedPacket', (droppedPacketArray) => { + expect(droppedPacketArray).to.deep.equal([expectedPreviousSampleNumber]); + expect(ourBoard.badPackets).to.equal(expectedBadPackets); + done(); + }); + ourBoard._finalizeNewSample(sample); + }); + + it('will send sample to processing if daisy', function () { + const sample = openBCIUtilities.newSample(0); + + ourBoard.overrideInfoForBoardType(k.OBCIBoardDaisy); + + let finalizeNewSampleForDaisySpy = sinon.spy(ourBoard, '_finalizeNewSampleForDaisy'); + + ourBoard._finalizeNewSample(sample); + + finalizeNewSampleForDaisySpy.should.have.been.calledOnce(); + finalizeNewSampleForDaisySpy.restore(); + }); + + it('will send sample to process impedance test', function () { + const sample = openBCIUtilities.newSample(0); + + ourBoard.overrideInfoForBoardType(k.OBCIBoardCyton); + ourBoard.impedanceTest.active = true; + + let processImpedanceTestSpy = sinon.spy(ourBoard, '_processImpedanceTest'); + + ourBoard._finalizeNewSample(sample); + + processImpedanceTestSpy.should.have.been.calledOnce(); + processImpedanceTestSpy.restore(); + }); + + it('will emit sample whtn process impedance test active', function (done) { + const sample = openBCIUtilities.newSample(0); + + ourBoard.overrideInfoForBoardType(k.OBCIBoardCyton); + ourBoard.impedanceTest.active = true; + + ourBoard.once('sample', () => { + done(); + }); + + ourBoard._finalizeNewSample(sample); + }); + }); describe('#_finalizeNewSampleForDaisy', function () { let ourBoard, randomSampleGenerator, sampleEvent, failTimeout; before(() => { ourBoard = new Cyton({ - verbose: true + verbose: true, + simulate: true }); randomSampleGenerator = openBCIUtilities.randomSample(k.OBCINumberOfChannelsCyton, k.OBCISampleRate250, false, 'none'); }); @@ -2503,12 +2575,17 @@ $$$`); // The function to be called when sample event is fired let sampleEvent = (sample) => { // test pass here + processImpedanceTestSpy.should.have.been.calledOnce(); + processImpedanceTestSpy.restore(); done(); }; // Subscribe to the sample event ourBoard.once('sample', sampleEvent); + ourBoard.impedanceTest.active = true; + let processImpedanceTestSpy = sinon.spy(ourBoard, '_processImpedanceTest'); + // Call the function under test twice ourBoard._finalizeNewSampleForDaisy(oddSample); ourBoard._finalizeNewSampleForDaisy(evenSample);