micropoint: Add MicroDataPoint
[fw/altos] / micropeak / MicroData.java
index 783ae40f7a459c5f1d6f22f024c3d4045bd35482..2afd3cd7b3c9240f5a1baf6134526aeeb1d13b4e 100644 (file)
@@ -22,6 +22,40 @@ import java.io.*;
 import java.util.*;
 import org.altusmetrum.AltosLib.*;
 
+class MicroIterator implements Iterator<MicroDataPoint> {
+       int             i;
+       MicroData       data;
+
+       public boolean hasNext() {
+               return i < data.pressures.length;
+       }
+
+       public MicroDataPoint next() {
+               return new MicroDataPoint(data, i++);
+       }
+
+       public MicroIterator (MicroData data) {
+               this.data = data;
+               i = 0;
+       }
+
+       public void remove() {
+       }
+}
+
+class MicroIterable implements Iterable<MicroDataPoint> {
+
+       MicroData       data;
+
+       public Iterator<MicroDataPoint> iterator() {
+               return new MicroIterator(data);
+       }
+
+       public MicroIterable(MicroData data) {
+               this.data = data;
+       }
+}
+
 public class MicroData {
        public int              ground_pressure;
        public int              min_pressure;
@@ -29,6 +63,7 @@ public class MicroData {
        private double          time_step;
        private double          ground_altitude;
        private ArrayList<Integer>      bytes;
+       String                  name;
        
 
        class FileEndedException extends Exception {
@@ -143,6 +178,10 @@ public class MicroData {
                return AltosConvert.pressure_to_altitude(pressures[i]);
        }
 
+       public Iterable<MicroDataPoint> points() {
+               return new MicroIterable(this);
+       }
+
        int fact(int n) {
                if (n == 0)
                        return 1;
@@ -217,12 +256,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 +306,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;
+       }
        
 }