micropeak: Add command line export option
[fw/altos] / micropeak / MicroData.java
index ec9b83d8179e0902bc82c74de968bfac996b9e54..fdfb2dc4e67fef8354b2130eb69e0bfb25ba4d37 100644 (file)
@@ -22,7 +22,7 @@ import java.io.*;
 import java.util.*;
 import org.altusmetrum.AltosLib.*;
 
-abstract class MicroIterator implements Iterator<Double> {
+class MicroIterator implements Iterator<MicroDataPoint> {
        int             i;
        MicroData       data;
 
@@ -30,6 +30,10 @@ abstract class MicroIterator implements Iterator<Double> {
                return i < data.pressures.length;
        }
 
+       public MicroDataPoint next() {
+               return new MicroDataPoint(data, i++);
+       }
+
        public MicroIterator (MicroData data) {
                this.data = data;
                i = 0;
@@ -39,66 +43,15 @@ abstract class MicroIterator implements Iterator<Double> {
        }
 }
 
-class MicroHeightIterator extends MicroIterator {
-       public Double next() {
-               return data.height(i++);
-       }
-
-       public MicroHeightIterator(MicroData data) {
-               super(data);
-       }
-}
+class MicroIterable implements Iterable<MicroDataPoint> {
 
-class MicroHeightIterable implements Iterable<Double> {
        MicroData       data;
 
-       public Iterator<Double> iterator() {
-               return new MicroHeightIterator(data);
+       public Iterator<MicroDataPoint> iterator() {
+               return new MicroIterator(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) {
+       public MicroIterable(MicroData data) {
                this.data = data;
        }
 }
@@ -110,6 +63,7 @@ public class MicroData {
        private double          time_step;
        private double          ground_altitude;
        private ArrayList<Integer>      bytes;
+       String                  name;
        
 
        class FileEndedException extends Exception {
@@ -224,16 +178,8 @@ 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);
+       public Iterable<MicroDataPoint> points() {
+               return new MicroIterable(this);
        }
 
        int fact(int n) {
@@ -275,6 +221,10 @@ public class MicroData {
                return alt;
        }
 
+       public double pressure(int i) {
+               return pressures[i];
+       }
+
        public double height(int i) {
                return altitude(i) - ground_altitude;
        }
@@ -310,12 +260,27 @@ public class MicroData {
        public void save (OutputStream f) throws IOException {
                for (int c : bytes)
                        f.write(c);
+               f.write('\n');
+       }
+
+       public void export (Writer f) throws IOException {
+               PrintWriter     pw = new PrintWriter(f);
+               pw.printf("  Time, Press, Height,  Speed,  Accel\n");
+               for (MicroDataPoint point : points()) {
+                       pw.printf("%6.3f,%6.0f,%7.1f,%7.2f,%7.2f\n",
+                                 point.time, point.pressure, point.height, point.speed, point.accel);
+               }
+       }
+
+       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);
@@ -354,9 +319,9 @@ 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");
                }
        }