Skip to content

Commit b82fc27

Browse files
author
AJ Keller
committed
FIX: makeDaisySampleObject in utilities to add support for daisy with accelDataCounts
1 parent a164843 commit b82fc27

File tree

3 files changed

+78
-21
lines changed

3 files changed

+78
-21
lines changed

changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# 0.2.1
22

3+
### Bug Fixes
4+
5+
* Accel data with counts did not work for cyton with daisy. Also fixed up some test errors with the effected functions.
6+
37
### New Features
48

59
* Add features for `openbci-ganglion`

openBCIUtilities.js

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ let utilitiesModule = {
383383
}
384384
},
385385
newSample,
386+
newSampleNoScale,
386387
/**
387388
* @description Create a configurable function to return samples for a simulator. This implements 1/f filtering injection to create more brain like data.
388389
* @param numberOfChannels {Number} - The number of channels in the sample... either 8 or 16
@@ -1049,8 +1050,8 @@ function transformRawDataPacketToSample (o) {
10491050
*/
10501051
function convertGanglionArrayToBuffer (arr, data) {
10511052
for (let i = 0; i < k.OBCINumberOfChannelsGanglion; i++) {
1052-
let threeByteBuffer = floatTo3ByteBuffer(arr[i]);
1053-
threeByteBuffer.copy(data, (i * 3));
1053+
data.writeInt16BE(arr[i] >> 8, (i * 3));
1054+
data.writeInt8(arr[i] & 255, (i * 3) + 2);
10541055
}
10551056
}
10561057

@@ -1656,6 +1657,26 @@ function newSample (sampleNumber) {
16561657
};
16571658
}
16581659

1660+
function newSampleNoScale (sampleNumber) {
1661+
if (sampleNumber || sampleNumber === 0) {
1662+
if (sampleNumber > 255) {
1663+
sampleNumber = 255;
1664+
}
1665+
} else {
1666+
sampleNumber = 0;
1667+
}
1668+
return {
1669+
startByte: k.OBCIByteStart,
1670+
sampleNumber: sampleNumber,
1671+
channelDataCounts: [],
1672+
accelDataCounts: [],
1673+
auxData: null,
1674+
stopByte: k.OBCIByteStop,
1675+
boardTime: 0,
1676+
timestamp: 0
1677+
};
1678+
}
1679+
16591680
/**
16601681
* @description Convert float number into three byte buffer. This is the opposite of .interpret24bitAsInt32()
16611682
* @param float - The number you want to convert
@@ -1718,34 +1739,42 @@ function makeDaisySampleObject (lowerSampleObject, upperSampleObject) {
17181739
let daisySampleObject = {};
17191740

17201741
if (lowerSampleObject.hasOwnProperty('channelData')) {
1721-
daisySampleObject['channelData'] = lowerSampleObject.channelData.concat(upperSampleObject.channelData);
1742+
daisySampleObject.channelData = lowerSampleObject.channelData.concat(upperSampleObject.channelData);
17221743
}
17231744

17241745
if (lowerSampleObject.hasOwnProperty('channelDataCounts')) {
1725-
daisySampleObject['channelDataCounts'] = lowerSampleObject.channelDataCounts.concat(upperSampleObject.channelDataCounts);
1746+
daisySampleObject.channelDataCounts = lowerSampleObject.channelDataCounts.concat(upperSampleObject.channelDataCounts);
17261747
}
17271748

1728-
daisySampleObject['sampleNumber'] = Math.floor(upperSampleObject.sampleNumber / 2);
1749+
daisySampleObject.sampleNumber = Math.floor(upperSampleObject.sampleNumber / 2);
17291750

1730-
daisySampleObject['auxData'] = {
1751+
daisySampleObject.auxData = {
17311752
'lower': lowerSampleObject.auxData,
17321753
'upper': upperSampleObject.auxData
17331754
};
17341755

1735-
daisySampleObject['timestamp'] = (lowerSampleObject.timestamp + upperSampleObject.timestamp) / 2;
1756+
daisySampleObject.timestamp = (lowerSampleObject.timestamp + upperSampleObject.timestamp) / 2;
17361757

17371758
daisySampleObject['_timestamps'] = {
17381759
'lower': lowerSampleObject.timestamp,
17391760
'upper': upperSampleObject.timestamp
17401761
};
17411762

1742-
if (lowerSampleObject.accelData) {
1743-
daisySampleObject['accelData'] = lowerSampleObject.accelData;
1744-
} else if (upperSampleObject.accelData) {
1745-
daisySampleObject['accelData'] = upperSampleObject.accelData;
1763+
if (lowerSampleObject.hasOwnProperty('accelData')) {
1764+
if (lowerSampleObject.accelData[0] > 0 || lowerSampleObject.accelData[1] > 0 || lowerSampleObject.accelData[2] > 0) {
1765+
daisySampleObject.accelData = lowerSampleObject.accelData;
1766+
} else {
1767+
daisySampleObject.accelData = upperSampleObject.accelData;
1768+
}
1769+
} else if (lowerSampleObject.hasOwnProperty('accelDataCounts')) {
1770+
if (lowerSampleObject.accelDataCounts[0] > 0 || lowerSampleObject.accelDataCounts[1] > 0 || lowerSampleObject.accelDataCounts[2] > 0) {
1771+
daisySampleObject.accelDataCounts = lowerSampleObject.accelDataCounts;
1772+
} else {
1773+
daisySampleObject.accelDataCounts = upperSampleObject.accelDataCounts;
1774+
}
17461775
}
17471776

1748-
daisySampleObject['valid'] = true;
1777+
daisySampleObject.valid = true;
17491778

17501779
return daisySampleObject;
17511780
}

test/openBCIUtilities-test.js

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,18 @@ describe('openBCIUtilities', function () {
4040
describe('#convertGanglionArrayToBuffer', function () {
4141
it('should fill the packet with values from data', function () {
4242
const numChannels = k.numberOfChannelsForBoardType(k.OBCIBoardGanglion);
43-
let arr = [0,1,2,3];
43+
let arr = [0, 1, 2, 3];
4444
let rawDataPacket = k.rawDataToSampleObjectDefault(numChannels).rawDataPacket;
4545
rawDataPacket.fill(0); // fill with zeros
46-
let bleRawBuf = openBCIUtilities.convertGanglionArrayToBuffer(arr, data);
46+
let data = Buffer.alloc(k.OBCIPacketSizeBLERaw);
47+
openBCIUtilities.convertGanglionArrayToBuffer(arr, data);
4748
const sampleNumber = 23;
4849
openBCIUtilities.ganglionFillRawDataPacket({
49-
data: bleRawBuf,
50+
data,
5051
rawDataPacket,
5152
sampleNumber
5253
});
53-
expect(bufferEqual(rawDataPacket.slice(2, 2 + k.OBCIPacketSizeBLERaw), bleRawBuf), `expected ${bleRawBuf.toString('hex')} but got ${rawDataPacket.slice(2, 2 + k.OBCIPacketSizeBLERaw).toString('hex')}`).to.be.true();
54+
expect(bufferEqual(rawDataPacket.slice(2, 2 + k.OBCIPacketSizeBLERaw), data), `expected ${data.toString('hex')} but got ${rawDataPacket.slice(2, 2 + k.OBCIPacketSizeBLERaw).toString('hex')}`).to.be.true();
5455
expect(rawDataPacket[k.OBCIPacketPositionSampleNumber]).to.equal(sampleNumber);
5556
expect(rawDataPacket[k.OBCIPacketPositionStartByte]).to.equal(k.OBCIByteStart);
5657
expect(rawDataPacket[k.OBCIPacketPositionStopByte]).to.equal(k.OBCIStreamPacketStandardRawAux);
@@ -1520,24 +1521,26 @@ describe('openBCIUtilities', function () {
15201521
lowerSampleObject = openBCIUtilities.newSample(1);
15211522
lowerSampleObject.channelData = [1, 2, 3, 4, 5, 6, 7, 8];
15221523
lowerSampleObject.auxData = [0, 1, 2];
1524+
lowerSampleObject.accelData = [0, 0, 0];
15231525
lowerSampleObject.timestamp = 4;
1524-
lowerSampleObject.accelData = [0.5, -0.5, 1];
15251526
// Make the upper sample (channels 9-16)
15261527
upperSampleObject = openBCIUtilities.newSample(2);
15271528
upperSampleObject.channelData = [9, 10, 11, 12, 13, 14, 15, 16];
15281529
upperSampleObject.auxData = [3, 4, 5];
1530+
upperSampleObject.accelData = [0, 1, 2];
15291531
upperSampleObject.timestamp = 8;
15301532

15311533
daisySampleObject = openBCIUtilities.makeDaisySampleObject(lowerSampleObject, upperSampleObject);
15321534

1533-
lowerSampleObjectNoScale = openBCIUtilities.newSample(1);
1535+
lowerSampleObjectNoScale = openBCIUtilities.newSampleNoScale(1);
15341536
lowerSampleObjectNoScale.channelDataCounts = [1, 2, 3, 4, 5, 6, 7, 8];
1537+
lowerSampleObjectNoScale.accelDataCounts = [0, 0, 0];
15351538
lowerSampleObjectNoScale.auxData = [0, 1, 2];
15361539
lowerSampleObjectNoScale.timestamp = 4;
1537-
lowerSampleObjectNoScale.accelData = [0.5, -0.5, 1];
15381540
// Make the upper sample (channels 9-16)
1539-
upperSampleObjectNoScale = openBCIUtilities.newSample(2);
1541+
upperSampleObjectNoScale = openBCIUtilities.newSampleNoScale(2);
15401542
upperSampleObjectNoScale.channelDataCounts = [9, 10, 11, 12, 13, 14, 15, 16];
1543+
upperSampleObjectNoScale.accelDataCounts = [0, 1, 2];
15411544
upperSampleObjectNoScale.auxData = [3, 4, 5];
15421545
upperSampleObjectNoScale.timestamp = 8;
15431546

@@ -1589,7 +1592,28 @@ describe('openBCIUtilities', function () {
15891592
});
15901593
it('should store an accelerometer value if present', function () {
15911594
expect(daisySampleObject).to.have.property('accelData');
1592-
expect(daisySampleObjectNoScale).to.have.property('accelData');
1595+
expect(daisySampleObject.accelData).to.deep.equal([0, 1, 2]);
1596+
expect(daisySampleObjectNoScale).to.have.property('accelDataCounts');
1597+
expect(daisySampleObjectNoScale.accelDataCounts).to.deep.equal([0, 1, 2]);
1598+
});
1599+
it('should work for all accel cases to extract the non-zero values', function () {
1600+
let lowerSample = openBCIUtilities.newSample(1);
1601+
lowerSample.accelData = [0, 1, 2];
1602+
let upperSample = openBCIUtilities.newSample(2);
1603+
upperSample.accelData = [0, 0, 0];
1604+
1605+
let lowerSampleNoScale = openBCIUtilities.newSampleNoScale(1);
1606+
lowerSampleNoScale.accelDataCounts = [0, 1, 2];
1607+
let upperSampleNoScale = openBCIUtilities.newSampleNoScale(2);
1608+
upperSampleNoScale.accelDataCounts = [0, 0, 0];
1609+
1610+
// Call the function under test
1611+
let daisySample = openBCIUtilities.makeDaisySampleObject(lowerSample, upperSample);
1612+
let daisySampleNoScale = openBCIUtilities.makeDaisySampleObject(lowerSampleNoScale, upperSampleNoScale);
1613+
expect(daisySample).to.have.property('accelData');
1614+
expect(daisySample.accelData).to.deep.equal([0, 1, 2]);
1615+
expect(daisySampleNoScale).to.have.property('accelDataCounts');
1616+
expect(daisySampleNoScale.accelDataCounts).to.deep.equal([0, 1, 2]);
15931617
});
15941618
});
15951619
describe('#makeDaisySampleObjectWifi', function () {

0 commit comments

Comments
 (0)