altosuilib/micropeak: Add state markers to micropeak graph
[fw/altos] / micropeak / MicroData.java
index 783ae40f7a459c5f1d6f22f024c3d4045bd35482..4c0ed4c3312bf1de84e5a6947f5d1e1865e9837b 100644 (file)
@@ -20,17 +20,86 @@ package org.altusmetrum.micropeak;
 import java.lang.*;
 import java.io.*;
 import java.util.*;
-import org.altusmetrum.AltosLib.*;
+import org.altusmetrum.altoslib_1.*;
+import org.altusmetrum.altosuilib_1.*;
 
-public class MicroData {
+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;
+       }
+}
+
+class MicroUIIterator implements Iterator<AltosUIDataPoint> {
+       int             i;
+       MicroData       data;
+
+       public boolean hasNext() {
+               return i < data.pressures.length;
+       }
+
+       public AltosUIDataPoint next() {
+               return new MicroDataPoint(data, i++);
+       }
+
+       public MicroUIIterator (MicroData data) {
+               this.data = data;
+               i = 0;
+       }
+
+       public void remove() {
+       }
+}
+
+class MicroUIIterable implements Iterable<AltosUIDataPoint> {
+       MicroData       data;
+
+       public Iterator<AltosUIDataPoint> iterator() {
+               return new MicroUIIterator(data);
+       }
+
+       public MicroUIIterable(MicroData data) {
+               this.data = data;
+       }
+}
+
+public class MicroData implements AltosUIDataSet {
        public int              ground_pressure;
        public int              min_pressure;
        public int[]            pressures;
        private double          time_step;
        private double          ground_altitude;
        private ArrayList<Integer>      bytes;
+       String                  name;
+       MicroStats              stats;
        
-
        class FileEndedException extends Exception {
        }
 
@@ -143,6 +212,18 @@ public class MicroData {
                return AltosConvert.pressure_to_altitude(pressures[i]);
        }
 
+       public String name() {
+               return name;
+       }
+
+       public Iterable<AltosUIDataPoint> dataPoints() {
+               return new MicroUIIterable(this);
+       }
+
+       public Iterable<MicroDataPoint> points() {
+               return new MicroIterable(this);
+       }
+
        int fact(int n) {
                if (n == 0)
                        return 1;
@@ -182,10 +263,26 @@ public class MicroData {
                return alt;
        }
 
+       public double pressure(int i) {
+               return pressures[i];
+       }
+
        public double height(int i) {
                return altitude(i) - ground_altitude;
        }
 
+       public double apogee_pressure() {
+               return min_pressure;
+       }
+
+       public double apogee_altitude() {
+               return AltosConvert.pressure_to_altitude(apogee_pressure());
+       }
+
+       public double apogee_height() {
+               return apogee_altitude() - ground_altitude;
+       }
+
        static final int speed_avg = 3;
        static final int accel_avg = 5;
 
@@ -217,12 +314,36 @@ public class MicroData {
        public void save (OutputStream f) throws IOException {
                for (int c : bytes)
                        f.write(c);
+               f.write('\n');
        }
 
-       public MicroData (InputStream f) throws IOException {
+       public void export (Writer f) throws IOException {
+               PrintWriter     pw = new PrintWriter(f);
+               pw.printf("  Time, Press(Pa), Height(m), Height(f), Speed(m/s), Speed(mph), Speed(mach), Accel(m/s²), Accel(ft/s²),  Accel(g)\n");
+               for (MicroDataPoint point : points()) {
+                       pw.printf("%6.3f,%10.0f,%10.1f,%10.1f,%11.2f,%11.2f,%12.4f,%12.2f,%13.2f,%10.4f\n",
+                                 point.time,
+                                 point.pressure,
+                                 point.height,
+                                 AltosConvert.meters_to_feet(point.height),
+                                 point.speed,
+                                 AltosConvert.meters_to_mph(point.speed),
+                                 AltosConvert.meters_to_mach(point.speed),
+                                 point.accel,
+                                 AltosConvert.meters_to_feet(point.accel),
+                                 AltosConvert.meters_to_g(point.accel));
+               }
+       }
+
+       public void set_name(String name) {
+               this.name = name;
+       }
+
+       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);
@@ -260,11 +381,19 @@ public class MicroData {
                        crc_valid = crc == current_crc;
 
                        time_step = 0.192;
+                       stats = new MicroStats(this);
                } 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;
+       }
        
 }