From f9ea2ad1053cd0df15ed99af30077e7ffa1c3758 Mon Sep 17 00:00:00 2001 From: Alex Castillo Date: Fri, 8 Apr 2016 15:21:29 -0400 Subject: [PATCH] Initial draft --- README.md | 18 ++++++++++++ experiment.js | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 21 ++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 README.md create mode 100644 experiment.js create mode 100644 package.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..cdf387c --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# OpenBCI Experimenter + +Node.js app for recording experiments based on OpenBCI Data samples + +This project is under development, this is just a first draft. + +## Setup + +* npm install +* Plug in OpenBCI dongle +* Turn on OpenBCI board +* Run: + +``` bash +node experimenter with [subject_name] about [keyword] for [time_milliseconds] +``` + +The recorded JSON data for experiments can be found at ./data/[keyword].json \ No newline at end of file diff --git a/experiment.js b/experiment.js new file mode 100644 index 0000000..c101a6b --- /dev/null +++ b/experiment.js @@ -0,0 +1,77 @@ +var path = require('path'); +var fs = require('fs'); +var argv = require('yargs').argv; +var jsonfile = require('jsonfile'); +var OpenBCIBoard = require('openbci-sdk'); + +// Experiment Model +var experiment = { + name: argv._[3], + subject: argv._[1], + duration: argv._[5], + filePath: path.join(__dirname, 'data', argv._[3] + '-' + argv._[1] + '.json'), + patternsTotal: 0, + patterns: [] +}; + +console.log(experiment); + +// OpenBCI + +const board = new OpenBCIBoard.OpenBCIBoard(); + +board.autoFindOpenBCIBoard() + .then(onBoardFind); + +// Board find handler +function onBoardFind (portName) { + if (portName) { + console.log('board found', portName); + board.connect(portName) + .then(onBoardConnect); + } +} + +// Board connect handler +function onBoardConnect () { + board.on('ready', onBoardReady); +} + +// Board ready handler +function onBoardReady () { + console.log(experiment.name + ' experiment started'); + board.streamStart(); + board.on('sample', addPattern); + setTimeout(endExperiment, experiment.duration); +} + +// Add pattern +function addPattern (sample) { + var pattern = { + input: {}, + output: {} + }; + sample.channelData.forEach(function (channel, index) { + pattern.input[index + 1] = channel; + }); + pattern.output[experiment.name] = 1; + experiment.patternsTotal++; + experiment.patterns.push(pattern); + console.log('pattern', pattern); +} + +// End Experiment +function endExperiment () { + board.streamStop() + .then(board.disconnect()); + jsonfile.writeFile(experiment.filePath, experiment, { spaces: 2 }, function (error) { + if (!error) { + console.log(experiment.name + ' experiment finished with ' + experiment.patternsTotal + ' patterns'); + console.log('Experiment path: ' + experiment.filePath); + } else { + console.log(experiment.name + ' experiment failed. sucks to be you.'); + } + }); +} + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..e34b938 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "openbci-experimenter", + "private": false, + "version": "0.0.1", + "description": "Node.js app for recording experiments based on OpenBCI data samples", + "main": "experimenter.js", + "license": "MIT", + "keywords": [ + "openbci", + "experiment", + "machine-learning" + ], + "author": "Alex Castillo", + "scripts": { + }, + "dependencies": { + "jsonfile": "^2.2.3", + "openbci-sdk": "^0.2.0", + "yargs": "^4.3.2" + } +}