Skip to content

Commit 90a2ca8

Browse files
committed
fix save to be nonraw
1 parent 54a3ce7 commit 90a2ca8

File tree

8 files changed

+296
-141
lines changed

8 files changed

+296
-141
lines changed

src/mobi/omegacentauri/brainflex/BrainFlex.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,8 @@ public BrainFlex(File saveFile) {
8181

8282
try {
8383
int inMode = pref.getInt(PREF_IN_MODE, 0);
84-
if (Options.LINKS[inMode] == FileDataLink.class) {
85-
DataInputStream in = new DataInputStream(new FileInputStream(new File(pref.get(PREF_FILE_NAME, null))));
86-
readMarks(in);
87-
dataLink = new FileDataLink(in);
84+
if (Options.LINKS[inMode] == NonrawDataLink.class) {
85+
dataLink = new NonrawDataLink(new File(pref.get(PREF_FILE_NAME, null)));
8886
}
8987
else if (Options.LINKS[inMode] == BrainLinkBridgeSerialLink.class){
9088
dataLink = new BrainLinkBridgeSerialLink(pref.get(PREF_SERIAL_PORT, null));

src/mobi/omegacentauri/brainflex/BrainFlexGUI.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package mobi.omegacentauri.brainflex;
22

3+
import java.io.BufferedWriter;
34
import java.io.DataInputStream;
45
import java.io.DataOutputStream;
56
import java.io.FileInputStream;
@@ -30,17 +31,12 @@ public void addMark(Mark mark) {
3031
marks.add(mark);
3132
}
3233
}
33-
public void writeMarks(FileOutputStream out) throws IOException {
34-
DataOutputStream dataOut = new DataOutputStream(out);
35-
dataOut.writeInt(marks.size());
34+
public void writeMarks(BufferedWriter out) throws IOException {
3635
for (Mark m : marks)
37-
m.write(dataOut);
38-
dataOut.flush();
36+
out.write(MindFlexReader.MARKER_MARK+m.toString()+"\n");
3937
}
4038

41-
public void readMarks(DataInputStream in) throws IOException {
42-
int count = in.readInt();
43-
for (int i = 0 ; i < count ; i++)
44-
marks.add(new Mark(in));
39+
public void addMark(String s) {
40+
addMark(new Mark(s));
4541
}
4642
}

src/mobi/omegacentauri/brainflex/DataLink.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ public void transmit(int... data) {
2525
}
2626
transmit(out);
2727
}
28+
29+
public boolean isRaw() {
30+
return true;
31+
}
32+
33+
public String readLine() {
34+
return null;
35+
}
2836

2937
public abstract void clearBuffer();
3038

src/mobi/omegacentauri/brainflex/Mark.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.DataInputStream;
44
import java.io.DataOutputStream;
55
import java.io.IOException;
6+
import java.util.Scanner;
67

78
public class Mark implements Comparable {
89
int t;
@@ -29,6 +30,20 @@ public Mark(DataInputStream dataIn) throws IOException {
2930
t = dataIn.readInt();
3031
rawCount = dataIn.readInt();
3132
descriptor = dataIn.readUTF();
33+
System.out.println("Mark read "+t+" "+rawCount+" "+descriptor);
34+
}
35+
36+
@Override
37+
public String toString() {
38+
return ""+t+" "+rawCount+" "+descriptor;
39+
}
40+
41+
public Mark(String s) {
42+
Scanner scan = new Scanner(s);
43+
t = scan.nextInt();
44+
rawCount = scan.nextInt();
45+
descriptor = scan.next();
46+
scan.close();
3247
}
3348

3449
@Override

src/mobi/omegacentauri/brainflex/MindFlexReader.java

Lines changed: 101 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package mobi.omegacentauri.brainflex;
22

33
import java.awt.SystemColor;
4+
import java.io.BufferedWriter;
45
import java.io.File;
56
import java.io.FileInputStream;
67
import java.io.FileOutputStream;
8+
import java.io.FileWriter;
79
import java.io.IOException;
810
import java.util.ArrayList;
911
import java.util.Arrays;
1012
import java.util.List;
13+
import java.util.Scanner;
1114

1215
public 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

Comments
 (0)