11package mobi .omegacentauri .brainflex ;
22
33import java .awt .SystemColor ;
4+ import java .io .BufferedWriter ;
45import java .io .File ;
56import java .io .FileInputStream ;
67import java .io .FileOutputStream ;
8+ import java .io .FileWriter ;
79import java .io .IOException ;
810import java .util .ArrayList ;
911import java .util .Arrays ;
1012import java .util .List ;
13+ import java .util .Scanner ;
1114
1215public class MindFlexReader {
1316 static final int PACKET_NO = -1 ;
@@ -26,6 +29,7 @@ public class MindFlexReader {
2629 private long lastPaintTime ;
2730 public static final int MODE_NORMAL = 0 ;
2831 public static final int MODE_RAW = 0x02 ; // 0x02;
32+ private BufferedWriter out = null ;
2933 public boolean done ;
3034 // in MODE_RAW, the hardware sends 512 raw packets followed by one processed packet
3135 // There are ~512 raw packets received per second.
@@ -41,7 +45,9 @@ public class MindFlexReader {
4145 private int mode ;
4246 private File saveFile ;
4347 private Thread dataReadThread = null ;
44- private File tempSaveFile ;
48+ private static final String MARKER_RAW = "R" ;
49+ private static final String MARKER_POWER = "P" ;
50+ static final String MARKER_MARK = "M" ;
4551
4652 public MindFlexReader (BrainFlexGUI gui , DataLink dataLink , int mode , File saveFile ) {
4753 this .mode = mode ;
@@ -58,13 +64,10 @@ public MindFlexReader(BrainFlexGUI gui, DataLink dataLink, int mode, File saveFi
5864
5965 void readData () throws IOException {
6066 dataReadThread = Thread .currentThread ();
61- FileOutputStream out = null ;
6267 if (saveFile != null ) {
63- tempSaveFile = new File (saveFile .getPath ()+".tmp" );
6468 saveFile .delete ();
65- tempSaveFile .delete ();
66- tempSaveFile .createNewFile ();
67- out = new FileOutputStream (saveFile );
69+ saveFile .createNewFile ();
70+ out = new BufferedWriter (new FileWriter (saveFile ));
6871 }
6972 byte [] buffer = new byte [0 ];
7073
@@ -97,57 +100,76 @@ else if (mode == 0x01)
97100 // sleep(100);
98101 gui .log ("Connected" );
99102
100- t0 = System .currentTimeMillis ();
101-
102- while (!done && !dataLink .eof ()) {
103- try {
104- byte [] data = dataLink .receiveBytes ();
105- if (data != null ) {
106- if (out != null )
107- out .write (data );
108- buffer = concat (buffer , data );
103+ if (dataLink .isRaw ()) {
104+ t0 = System .currentTimeMillis ();
109105
110- int i ;
111- int n = buffer .length ;
112-
113- for (i = 0 ; i < n ; i ++) {
114- if (buffer [i ] == (byte )0xAA ) {
115- int length = detectPacket0 (buffer , i );
116- if (length == PACKET_MAYBE ) {
117- // possible start of unfinished packet
118- byte [] newBuffer = new byte [n - i ];
119- System .arraycopy (buffer , i , newBuffer , 0 , buffer .length - i );
120- buffer = newBuffer ;
121- break ;
122- }
123- else if (length > 0 ) {
124- parsePacket (buffer , i , length );
125- i += length - 1 ;
106+ while (!done && !dataLink .eof ()) {
107+ try {
108+ byte [] data = dataLink .receiveBytes ();
109+ if (data != null ) {
110+ buffer = concat (buffer , data );
111+
112+ int i ;
113+ int n = buffer .length ;
114+
115+ for (i = 0 ; i < n ; i ++) {
116+ if (buffer [i ] == (byte )0xAA ) {
117+ int length = detectPacket0 (buffer , i );
118+ if (length == PACKET_MAYBE ) {
119+ // possible start of unfinished packet
120+ byte [] newBuffer = new byte [n - i ];
121+ System .arraycopy (buffer , i , newBuffer , 0 , buffer .length - i );
122+ buffer = newBuffer ;
123+ break ;
124+ }
125+ else if (length > 0 ) {
126+ parsePacket (buffer , i , length );
127+ i += length - 1 ;
128+ }
126129 }
127130 }
131+
132+ if (i >= n )
133+ buffer = new byte [0 ];
128134 }
129-
130- if (i >= n )
131- buffer = new byte [0 ];
132135 }
136+ catch (Exception e ) {
137+ }
138+ }
139+
140+ if (gui != null ) {
141+ gui .updateGraphs ();
133142 }
134- catch (Exception e ) {
143+
144+ if (curPowerData != null ) {
145+ gui .log ("Received " +rawData .size ()+" raw packets over " +curPowerData .t /1000. +" sec: " +(1000. *rawData .size ()/curPowerData .t )+"/sec" );
146+ gui .log ("Received " +powerData .size ()+" processed packets over " +curPowerData .t /1000. +" sec: " +(1000. *powerData .size ()/curPowerData .t )+"/sec" );
147+ gui .log ("Received " +badPacketCount +" bad packets over " +curPowerData .t /1000. +" sec: " +(1000. *badPacketCount /curPowerData .t )+"/sec" );
148+ System .out .println ("Received " +rawData .size ()+" raw packets over " +curPowerData .t /1000. +" sec: " +(1000. *rawData .size ()/curPowerData .t )+"/sec" );
149+ System .out .println ("Received " +powerData .size ()+" processed packets over " +curPowerData .t /1000. +" sec: " +(1000. *powerData .size ()/curPowerData .t )+"/sec" );
150+ System .out .println ("Received " +badPacketCount +" bad packets over " +curPowerData .t /1000. +" sec: " +(1000. *badPacketCount /curPowerData .t )+"/sec" );
135151 }
136- }
137-
138- if (gui != null ) {
139- gui .updateGraphs ();
152+
140153 }
154+ else {
155+ t0 = 0 ;
156+ String line ;
157+ while (null != (line = dataLink .readLine ())) {
158+ if (line .startsWith (MARKER_MARK )) {
159+ gui .addMark (line .substring (MARKER_MARK .length ()));
160+ }
161+ else if (line .startsWith (MARKER_RAW )) {
162+ rawData .add (Integer .parseInt (line .substring (MARKER_RAW .length ())));
163+ }
164+ else if (line .startsWith (MARKER_POWER )) {
165+ powerData .add (new PowerData (line .substring (MARKER_POWER .length ())));
166+ }
141167
142- if (curPowerData != null ) {
143- gui .log ("Received " +rawData .size ()+" raw packets over " +curPowerData .t /1000. +" sec: " +(1000. *rawData .size ()/curPowerData .t )+"/sec" );
144- gui .log ("Received " +powerData .size ()+" processed packets over " +curPowerData .t /1000. +" sec: " +(1000. *powerData .size ()/curPowerData .t )+"/sec" );
145- gui .log ("Received " +badPacketCount +" bad packets over " +curPowerData .t /1000. +" sec: " +(1000. *badPacketCount /curPowerData .t )+"/sec" );
146- System .out .println ("Received " +rawData .size ()+" raw packets over " +curPowerData .t /1000. +" sec: " +(1000. *rawData .size ()/curPowerData .t )+"/sec" );
147- System .out .println ("Received " +powerData .size ()+" processed packets over " +curPowerData .t /1000. +" sec: " +(1000. *powerData .size ()/curPowerData .t )+"/sec" );
148- System .out .println ("Received " +badPacketCount +" bad packets over " +curPowerData .t /1000. +" sec: " +(1000. *badPacketCount /curPowerData .t )+"/sec" );
168+ if (gui != null ) {
169+ gui .updateGraphs ();
170+ }
171+ }
149172 }
150-
151173 if (!done ) {
152174 gui .log ("End of data" );
153175 while (!done ) {
@@ -165,17 +187,7 @@ else if (length > 0) {
165187 dataLink = null ;
166188 }
167189 if (out != null ) {
168- out .close ();
169- FileInputStream in = new FileInputStream (tempSaveFile );
170- saveFile .createNewFile ();
171- out = new FileOutputStream (saveFile );
172190 gui .writeMarks (out );
173- byte [] outBuf = new byte [16384 ];
174- int len ;
175- while (0 <= (len = in .read (outBuf ))) {
176- out .write (outBuf , 0 , len );
177- }
178- in .close ();
179191 out .close ();
180192 }
181193 if (gui !=null )
@@ -195,6 +207,11 @@ private void parsePacket(byte[] buffer, int pos, int packetLength) {
195207 if (haveRaw ) {
196208 synchronized (rawData ) {
197209 rawData .add (curRaw );
210+ if (out != null )
211+ try {
212+ out .write (MARKER_RAW +curRaw +"\n " );
213+ } catch (IOException e ) {
214+ }
198215 }
199216 }
200217
@@ -203,6 +220,11 @@ private void parsePacket(byte[] buffer, int pos, int packetLength) {
203220 if (! dataLink .isRealTime ())
204221 curPowerData .t = (int )(powerData .size () * PROCESSED_PER_SECOND );
205222 powerData .add (curPowerData );
223+ if (out != null )
224+ try {
225+ out .write (MARKER_POWER +curPowerData .toString ()+"\n " );
226+ } catch (IOException e ) {
227+ }
206228 gui .log ("TIME " +curPowerData .t );
207229 }
208230 }
@@ -403,6 +425,28 @@ public class PowerData {
403425 public PowerData (int t ) {
404426 this .t = t ;
405427 }
428+
429+ @ Override
430+ public String toString () {
431+ String s = "" +t +" " +(havePower ?1 :0 )+" " ;
432+ for (int i = 0 ; i < MindFlexReader .POWER_NAMES .length ; i ++)
433+ s += "" +power [i ]+" " ;
434+ return s + (haveMeditation ?1 :0 )+" " +meditation +" " +(haveAttention ?1 :0 )+" " +attention ;
435+ }
436+
437+ public PowerData (String s ) {
438+ System .out .println ("Scanning " +s );
439+ Scanner scan = new Scanner (s );
440+ t = scan .nextInt ();
441+ havePower = 0 != scan .nextInt ();
442+ for (int i = 0 ; i < MindFlexReader .POWER_NAMES .length ; i ++)
443+ power [i ] = scan .nextDouble ();
444+ haveMeditation = 0 != scan .nextInt ();
445+ meditation = scan .nextDouble ();
446+ haveAttention = 0 != scan .nextInt ();
447+ attention = scan .nextDouble ();
448+ scan .close ();
449+ }
406450 }
407451
408452 public void stop () {
0 commit comments