@@ -2,50 +2,64 @@ import React, { useState, useEffect } from 'react';
22import Head from 'next/head'
33import Link from 'next/link'
44import 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' ;
67import io from 'socket.io-client' ;
78import * as Papa from 'papaparse' ;
89
910const socket = io ( 'http://localhost:5000' ) ;
1011const museClient = new MuseClient ( ) ;
1112
1213function 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