Build installable versions of MicroPeak GUI
[fw/altos] / micropeak / MicroData.java
index 783ae40f7a459c5f1d6f22f024c3d4045bd35482..8ccd5fd8a88e21ec9ef592777d4c8e03e210e1dd 100644 (file)
@@ -22,6 +22,87 @@ import java.io.*;
 import java.util.*;
 import org.altusmetrum.AltosLib.*;
 
+abstract class MicroIterator implements Iterator<Double> {
+       int             i;
+       MicroData       data;
+
+       public boolean hasNext() {
+               return i < data.pressures.length;
+       }
+
+       public MicroIterator (MicroData data) {
+               this.data = data;
+               i = 0;
+       }
+
+       public void remove() {
+       }
+}
+
+class MicroHeightIterator extends MicroIterator {
+       public Double next() {
+               return data.height(i++);
+       }
+
+       public MicroHeightIterator(MicroData data) {
+               super(data);
+       }
+}
+
+class MicroHeightIterable implements Iterable<Double> {
+       MicroData       data;
+
+       public Iterator<Double> iterator() {
+               return new MicroHeightIterator(data);
+       }
+
+       public MicroHeightIterable(MicroData data) {
+               this.data = data;
+       }
+}
+
+class MicroSpeedIterator extends MicroIterator {
+       public Double next() {
+               return data.speed(i++);
+       }
+       public MicroSpeedIterator(MicroData data) {
+               super(data);
+       }
+}
+
+class MicroSpeedIterable implements Iterable<Double> {
+       MicroData       data;
+
+       public Iterator<Double> iterator() {
+               return new MicroSpeedIterator(data);
+       }
+
+       public MicroSpeedIterable(MicroData data) {
+               this.data = data;
+       }
+}
+
+class MicroAccelIterator extends MicroIterator {
+       public Double next() {
+               return data.acceleration(i++);
+       }
+       public MicroAccelIterator(MicroData data) {
+               super(data);
+       }
+}
+
+class MicroAccelIterable implements Iterable<Double> {
+       MicroData       data;
+
+       public Iterator<Double> iterator() {
+               return new MicroAccelIterator(data);
+       }
+
+       public MicroAccelIterable(MicroData data) {
+               this.data = data;
+       }
+}
+
 public class MicroData {
        public int              ground_pressure;
        public int              min_pressure;
@@ -29,6 +110,7 @@ public class MicroData {
        private double          time_step;
        private double          ground_altitude;
        private ArrayList<Integer>      bytes;
+       String                  name;
        
 
        class FileEndedException extends Exception {
@@ -143,6 +225,18 @@ public class MicroData {
                return AltosConvert.pressure_to_altitude(pressures[i]);
        }
 
+       public Iterable<Double> heights() {
+               return new MicroHeightIterable(this);
+       }
+
+       public Iterable<Double> speeds() {
+               return new MicroSpeedIterable(this);
+       }
+
+       public Iterable<Double> accels() {
+               return new MicroAccelIterable(this);
+       }
+
        int fact(int n) {
                if (n == 0)
                        return 1;
@@ -217,12 +311,18 @@ public class MicroData {
        public void save (OutputStream f) throws IOException {
                for (int c : bytes)
                        f.write(c);
+               f.write('\n');
+       }
+
+       public void set_name(String name) {
+               this.name = name;
        }
 
-       public MicroData (InputStream f) throws IOException {
+       public MicroData (InputStream f, String name) throws IOException, InterruptedException {
+               this.name = name;
                bytes = new ArrayList<Integer>();
                if (!find_header(f))
-                       throw new IOException();
+                       throw new IOException("No MicroPeak data header found");
                try {
                        file_crc = 0xffff;
                        ground_pressure = get_32(f);
@@ -261,10 +361,17 @@ public class MicroData {
 
                        time_step = 0.192;
                } catch (FileEndedException fe) {
-                       throw new IOException();
+                       throw new IOException("File Ended Unexpectedly");
                } catch (NonHexcharException ne) {
-                       throw new IOException();
+                       throw new IOException("Non hexadecimal character found");
                }
        }
+
+       public MicroData() {
+               ground_pressure = 101000;
+               min_pressure = 101000;
+               pressures = new int[1];
+               pressures[0] = 101000;
+       }
        
 }