Skip to content

Commit 258e644

Browse files
Reformatted EEG recording structure and added ability to start, stop, and download recordings
1 parent 7b7c532 commit 258e644

File tree

3 files changed

+74
-42
lines changed

3 files changed

+74
-42
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"papaparse": "^5.3.0",
1919
"react": "16.13.1",
2020
"react-dom": "16.13.1",
21+
"rxjs": "^6.6.3",
2122
"socket.io": "^2.3.0",
2223
"socket.io-client": "^2.3.0",
2324
"typescript": "^4.0.2"

pages/visualizations.js

Lines changed: 70 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,64 @@ import React, { useState, useEffect } from 'react';
22
import Head from 'next/head'
33
import Link from 'next/link'
44
import Layout from '../components/layout'
5-
import { channelNames, EEGReading, MuseClient } from 'muse-js';
5+
import { channelNames, EEGReading, zipSamples, EEGSample, MuseClient } from 'muse-js';
6+
import { Observable, Subject } from 'rxjs';
67
import io from 'socket.io-client';
78
import * as Papa from 'papaparse';
89

910
const socket = io('http://localhost:5000');
1011
const museClient = new MuseClient();
1112

1213
function Visualizations() {
13-
const [testEEGData, setTestEEGData] = useState("");
1414
const [blink_state, setBlinkState] = useState("");
1515

16-
var fileList
16+
var fileList;
17+
18+
var recording = false;
19+
var recordingSamples;
20+
var subscription;
1721

1822
async function startMuseConnection(e) {
1923
await museClient.connect()
2024
await museClient.start()
21-
museClient.eegReadings.subscribe(reading => {
22-
socket.emit('eeg-stream', JSON.stringify(reading))
23-
console.log(reading);
24-
});
25-
museClient.telemetryData.subscribe(telemetry => {
26-
console.log(telemetry);
27-
});
28-
museClient.accelerometerData.subscribe(acceleration => {
29-
console.log(acceleration);
30-
});
25+
// zipSamples(museClient.eegReadings).subscribe(sample => {
26+
// socket.emit('eeg-stream', [sample.timestamp, ...sample.data]);
27+
// });
28+
// museClient.telemetryData.subscribe(telemetry => {
29+
// console.log(telemetry);
30+
// });
31+
// museClient.accelerometerData.subscribe(acceleration => {
32+
// console.log(acceleration);
33+
// });
3134
}
3235

33-
async function streamCSVData(e) {
34-
Papa.parse(fileList[0], {
35-
complete: function(results) {
36-
var rows = results.data
37-
var i = 0
38-
var interval = setInterval(function() {
39-
socket.emit('eeg-stream', rows[i]);
40-
i++;
41-
if(i >= rows.length) {
42-
clearInterval(interval)
43-
}
44-
}, 3.90625)
45-
}
36+
function startRecording() {
37+
recording = true;
38+
recordingSamples = [];
39+
subscription = zipSamples(museClient.eegReadings).subscribe(sample => {
40+
sample = [sample.timestamp, ...sample.data]
41+
recordingSamples.push(sample);
42+
socket.emit('eeg-stream', sample);
4643
});
4744
}
4845

46+
function stopRecording() {
47+
recording = false;
48+
subscription.unsubscribe();
49+
}
50+
51+
function downloadRecording(e) {
52+
const a = document.createElement('a');
53+
const headers = ['time', ...channelNames].join(',');
54+
const csvData = headers + '\n' + recordingSamples.map(item => item.join(',')).join('\n');
55+
const file = new Blob([csvData], { type: 'text/csv' });
56+
a.href = URL.createObjectURL(file);
57+
document.body.appendChild(a);
58+
a.download = 'recording.csv';
59+
a.click();
60+
document.body.removeChild(a);
61+
}
62+
4963
useEffect(() => {
5064
socket.on('connect', (msg) => {
5165
console.log("Connected!")
@@ -67,10 +81,20 @@ function Visualizations() {
6781
}, []);
6882

6983

70-
function sendTestEEGData(evt) {
71-
evt.preventDefault();
72-
const data = '{"data":"' + testEEGData + '"}'
73-
socket.emit('test', data);
84+
async function streamCSVData(e) {
85+
Papa.parse(fileList[0], {
86+
complete: function(results) {
87+
var rows = results.data
88+
var i = 0
89+
var interval = setInterval(function() {
90+
socket.emit('eeg-stream', rows[i]);
91+
i++;
92+
if(i >= rows.length) {
93+
clearInterval(interval)
94+
}
95+
}, 3.90625)
96+
}
97+
});
7498
}
7599

76100
return (
@@ -86,21 +110,28 @@ function Visualizations() {
86110
<br></br>
87111
<br></br>
88112

113+
<button onClick={startRecording}>
114+
Start Recording
115+
</button>
116+
117+
<button onClick={stopRecording}>
118+
Stop Recording
119+
</button>
120+
121+
<button onClick={downloadRecording}>
122+
Download Recording
123+
</button>
124+
125+
<br></br>
126+
<br></br>
127+
89128
<input type="file" id="file-selector"></input>
90129
<button onClick={streamCSVData}>
91130
TEST!
92131
</button>
93-
94-
<br></br>
132+
95133
<br></br>
96134

97-
<form onSubmit={sendTestEEGData}>
98-
<label>
99-
Send Test Message to Flask: <tab></tab>
100-
<input type="text" name={testEEGData} onChange={e => setTestEEGData(e.target.value)}/>
101-
</label>
102-
<input type="submit" value="Send"/>
103-
</form>
104135
<p>Blink State: {blink_state}</p>
105136
</Layout>
106137
);

0 commit comments

Comments
 (0)