Comparar commits

...

9 Commits

Autor SHA1 Mensagem Data
AJ Keller 70a6165366 Merge pull request #135 from OpenBCI/development
Development
2017-01-02 12:22:49 -05:00
AJ Keller 2d7547ce79 Merge pull request #134 from aj-ptw/16-chan-bug
Addresses #131 - 16 channels not always working
2017-01-02 11:59:03 -05:00
AJ Keller de381a80de Addresses #131 - 16 channels not always working 2016-12-28 16:43:43 -05:00
AJ Keller 888be5d60f Merge pull request #132 from aj-ptw/add-exp-python
Remove simulator line from python example
2016-12-05 10:29:56 -05:00
AJ Keller 57e6d9f7c2 Remove simulator line from python example 2016-12-05 10:26:39 -05:00
AJ Keller fb3d722fc8 Update package.json 2016-12-02 02:34:29 -05:00
AJ Keller 2728617126 Update readme.md 2016-12-02 02:34:09 -05:00
AJ Keller dd7639829a Update readme.md 2016-12-02 02:33:27 -05:00
AJ Keller b11775ecde Update README.md 2016-12-02 02:16:56 -05:00
9 arquivos alterados com 209 adições e 16 exclusões
+38
Ver Arquivo
@@ -14,6 +14,8 @@ We are proud to support all functionality of the OpenBCI 8 and 16 Channel boards
The purpose of this module is to **get connected** and **start streaming** as fast as possible.
Python researcher or developer? Check out how easy it is to [get access to the entire API in the Python example](examples/python)!
### Table of Contents:
---
@@ -73,6 +75,8 @@ Still not satisfied it works?? Check out this [detailed report](http://s13234284
How are you still doubting and not using this already? Fine, go look at some of the [700 **_automatic_** tests](https://codecov.io/gh/OpenBCI/OpenBCI_NodeJS) written for it!
Python researcher or developer? Check out how easy it is to [get access to the entire API in the Python example](examples/python)!
### <a name="general-overview"></a> General Overview:
Initialization
@@ -510,6 +514,12 @@ Closes the serial port opened by [`.connect()`](#method-connect). Waits for sto
**_Returns_** a promise, fulfilled by a successful close of the serial port object, rejected otherwise.
### <a name="method-get-info"></a> .getInfo()
Get the core info object. It's the object that actually drives the parsing of data.
**_Returns_** Object - {{boardType: string, sampleRate: number, firmware: string, numberOfChannels: number, missedPackets: number}}
### <a name="method-get-settings-for-channel"></a> .getSettingsForChannel(channelNumber)
Gets the specified channelSettings register data from printRegisterSettings call.
@@ -837,6 +847,34 @@ Stop logging to the SD card and close any open file. If you are not streaming wh
**_Returns_** resolves if the command was added to the write queue.
### <a name="method-set-info-for-board-type"></a> .setInfoForBoardType(boardType)
Set the info property for board type.
**Note: This has the potential to change the way data is parsed**
**_boardType_**
A String indicating the number of channels.
* `default` - Default board: Sample rate is `250Hz` and number of channels is `8`.
* `daisy` - Daisy board: Sample rate is `125Hz` and number of channels is `16`.
**_Returns_** a promise, fulfilled if the command was sent to the write queue. Rejects if input is not `8` or `16`.
### <a name="method-set-max-channels"></a> .setMaxChannels(numberOfChannels)
Sends a command to the board to set the max channels. If you have a daisy attached, calling this function will re-sniff for the daisy ADS and attempt to use it.
**_numberOfChannels_**
A Number indicating the number of channels.
* `8` - Default number of channels.
* `16` - Daisy number of channels.
**_Returns_** a promise, fulfilled if the command was sent to the write queue. Rejects if input is not `8` or `16`.
### <a name="method-simulator-enable"></a> .simulatorEnable()
To enter simulate mode. Must call [`.connect()`](#method-connect) after.
+15
Ver Arquivo
@@ -1,3 +1,18 @@
# 1.4.4
### New Features
* Set max number of channels for the board to use with `.setMaxChannels()` see readme.md
* Set the core info object that drives the module with `.setInfoForBoardType()` see readme.md
* Get info for the core obhect that drives the module with `.getInfo()` see readme.md
### Work In Progress
* Bug where daisy would sometimes not be recognized which destroyed all data.
# 1.4.3
### New examples
* Add example of node to python
# 1.4.2
### New examples
+1 -1
Ver Arquivo
@@ -18,7 +18,7 @@ var debug = false; // Pretty print any bytes in and out... it's amazing...
var verbose = true; // Adds verbosity to functions
var ourBoard = new OpenBCIBoard({
simulate: simulate,
// simulate: simulate, // Uncomment to see how it works with simulator!
simulatorFirmwareVersion: 'v2',
debug: debug,
verbose: verbose
-1
Ver Arquivo
@@ -6,7 +6,6 @@
"scripts": {
"start": "concurrently --kill-others \"python handoff.py\" \"node index.js\"",
"start-node": "node index.js",
"start-verbose": "concurrently --kill-others \"python handoff.py -v\" \"node index.js\"",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
+3 -6
Ver Arquivo
@@ -10,7 +10,8 @@ This module has every feature available on the OpenBCI Board.
* [Python 2.7](https://www.python.org/downloads/)
* [ZeroMQ](http://zeromq.org/bindings:python)
```python
```py
pip install pyzmq
```
* [Node.js LTS](https://nodejs.org/en/)
@@ -30,14 +31,10 @@ npm install
```
npm start
```
Verbose:
```
npm run start-verbose
```
For running just the node, for example if you were running the python in a separate ide and debugging, it's useful.
```python
npm run start-node
```
## Contributing
Please PR if you have code to contribute!
Please PR if you have code to contribute!
+39
Ver Arquivo
@@ -29,6 +29,7 @@ ourBoard.autoFindOpenBCIBoard().then(portName => {
});
} else {
/** Unable to auto find OpenBCI board */
console.log('Unable to auto find OpenBCI board');
}
});
@@ -86,3 +87,41 @@ var sampleFunc = sample => {
// Subscribe to your functions
ourBoard.on('ready', readyFunc);
ourBoard.on('sample', sampleFunc);
function exitHandler (options, err) {
if (options.cleanup) {
if (verbose) console.log('clean');
/** Do additional clean up here */
}
if (err) console.log(err.stack);
if (options.exit) {
if (verbose) console.log('exit');
ourBoard.disconnect().catch(console.log);
}
}
if (process.platform === "win32") {
const rl = require("readline").createInterface({
input: process.stdin,
output: process.stdout
});
rl.on("SIGINT", function () {
process.emit("SIGINT");
});
}
// do something when app is closing
process.on('exit', exitHandler.bind(null, {
cleanup: true
}));
// catches ctrl+c event
process.on('SIGINT', exitHandler.bind(null, {
exit: true
}));
// catches uncaught exceptions
process.on('uncaughtException', exitHandler.bind(null, {
exit: true
}));
+49 -6
Ver Arquivo
@@ -1012,6 +1012,53 @@ function OpenBCIFactory () {
});
};
/**
* Get the core info object.
* @return {{boardType: string, sampleRate: number, firmware: string, numberOfChannels: number, missedPackets: number}}
*/
OpenBCIBoard.prototype.getInfo = function() {
return this.info;
};
/**
* Set the info property for board type.
* @param boardType {String}
* `default` or `daisy`. Defaults to `default`.
*/
OpenBCIBoard.prototype.setInfoForBoardType = function(boardType) {
switch (boardType) {
case k.OBCIBoardDaisy:
this.info.boardType = k.OBCIBoardDaisy;
this.info.numberOfChannels = k.OBCINumberOfChannelsDaisy;
this.info.sampleRate = k.OBCISampleRate125;
break;
case k.OBCIBoardDefault:
default:
this.info.boardType = k.OBCIBoardDefault;
this.info.numberOfChannels = k.OBCINumberOfChannelsDefault;
this.info.sampleRate = k.OBCISampleRate250;
break;
}
};
/**
* Used to set the max number of channels on the Cyton board.
* @param numberOfChannels {number}
* Either 8 or 16
* @return {Promise}
*/
OpenBCIBoard.prototype.setMaxChannels = function (numberOfChannels) {
if (numberOfChannels === k.OBCINumberOfChannelsDefault) {
this.curParsingMode = k.OBCIParsingEOT;
return this.write(k.OBCIChannelMaxNumber8);
} else if (numberOfChannels === k.OBCINumberOfChannelsDaisy) {
this.curParsingMode = k.OBCIParsingEOT;
return this.write(k.OBCIChannelMaxNumber16);
} else {
return Promise.reject('invalid number of channels');
}
};
/**
* @description Sends a soft reset command to the board
* @returns {Promise}
@@ -1807,13 +1854,9 @@ function OpenBCIFactory () {
*/
OpenBCIBoard.prototype._processParseBufferForReset = function (dataBuffer) {
if (openBCISample.countADSPresent(dataBuffer) === 2) {
this.info.boardType = k.OBCIBoardDaisy;
this.info.numberOfChannels = k.OBCINumberOfChannelsDaisy;
this.info.sampleRate = k.OBCISampleRate125;
this.setInfoForBoardType(k.OBCIBoardDaisy);
} else {
this.info.boardType = k.OBCIBoardDefault;
this.info.numberOfChannels = k.OBCINumberOfChannelsDefault;
this.info.sampleRate = k.OBCISampleRate250;
this.setInfoForBoardType(k.OBCIBoardDefault);
}
if (openBCISample.findV2Firmware(dataBuffer)) {
+2 -1
Ver Arquivo
@@ -1,6 +1,6 @@
{
"name": "openbci",
"version": "1.4.2",
"version": "1.4.4",
"description": "The official Node.js SDK for the OpenBCI Biosensor Board.",
"main": "openBCIBoard",
"scripts": {
@@ -36,6 +36,7 @@
"sandboxed-module": "^2.0.3",
"semistandard": "^9.0.0",
"sinon": "^1.17.2",
"sinon-as-promised": "^4.0.2",
"sinon-chai": "^2.8.0",
"snazzy": "^5.0.0"
},
+62 -1
Ver Arquivo
@@ -9,6 +9,7 @@ var openBCISample = openBCIBoard.OpenBCISample;
var k = openBCISample.k;
var chaiAsPromised = require('chai-as-promised');
var sinonChai = require('sinon-chai');
var sinonAsPromised = require('sinon-as-promised')(bluebirdChecks.BluebirdPromise);
var bufferEqual = require('buffer-equal');
var fs = require('fs');
var math = require('mathjs');
@@ -451,6 +452,34 @@ describe('openbci-sdk', function () {
});
}).catch(err => done(err));
});
it('should be able to set info for default board', function () {
ourBoard.info.boardType = 'burrito';
ourBoard.info.sampleRate = 60;
ourBoard.info.numberOfChannels = 200;
ourBoard.setInfoForBoardType('default');
expect(ourBoard.getInfo().boardType).to.be.equal(k.OBCIBoardDefault);
expect(ourBoard.getInfo().numberOfChannels).to.be.equal(k.OBCINumberOfChannelsDefault);
expect(ourBoard.getInfo().sampleRate).to.be.equal(k.OBCISampleRate250);
});
it('should be able to set info for daisy board', function () {
ourBoard.info.boardType = 'burrito';
ourBoard.info.sampleRate = 60;
ourBoard.info.numberOfChannels = 200;
ourBoard.setInfoForBoardType('daisy');
expect(ourBoard.getInfo().boardType).to.be.equal(k.OBCIBoardDaisy);
expect(ourBoard.getInfo().numberOfChannels).to.be.equal(k.OBCINumberOfChannelsDaisy);
expect(ourBoard.getInfo().sampleRate).to.be.equal(k.OBCISampleRate125);
});
it('should set info to default on bad input string', function () {
ourBoard.info.boardType = 'burrito';
ourBoard.info.sampleRate = 60;
ourBoard.info.numberOfChannels = 200;
ourBoard.setInfoForBoardType('taco');
expect(ourBoard.getInfo().boardType).to.be.equal(k.OBCIBoardDefault);
expect(ourBoard.getInfo().numberOfChannels).to.be.equal(k.OBCINumberOfChannelsDefault);
expect(ourBoard.getInfo().sampleRate).to.be.equal(k.OBCISampleRate250);
});
});
describe('#debug', function () {
before(function (done) {
@@ -664,7 +693,7 @@ describe('openbci-sdk', function () {
ourBoard.write(k.OBCISDLogStop).should.have.been.rejected,
ourBoard.write(k.OBCISDLogStop).should.have.been.rejected,
ourBoard.disconnect()
]).then(() => {+
]).then(() => {
writeSpy.should.have.not.been.called;
writeSpy.restore();
});
@@ -785,6 +814,38 @@ describe('openbci-sdk', function () {
});
});
});
describe('#setMaxChannels', function () {
before(function (done) {
if (!ourBoard.isConnected()) {
ourBoard.connect(masterPortName)
.then(done)
.catch(err => done(err));
} else {
done();
}
});
it('should write the command to set channels to 8', function (done) {
ourBoard.setMaxChannels(8)
.then(() => {
setTimeout(() => {
spy.should.have.been.calledWith(k.OBCIChannelMaxNumber8);
done();
}, 5 * k.OBCIWriteIntervalDelayMSShort);
}).catch(done);
});
it('should write the command to set channels to 16', function (done) {
ourBoard.setMaxChannels(16)
.then(() => {
setTimeout(() => {
spy.should.have.been.calledWith(k.OBCIChannelMaxNumber16);
done();
}, 5 * k.OBCIWriteIntervalDelayMSShort);
}).catch(done);
});
it('should not write a command if invalid channel number', function (done) {
ourBoard.setMaxChannels(0).should.be.rejected.and.notify(done);
});
});
// bad
describe('#channelOff', function () {
before(function (done) {