altosdroid: fixup fetching active device address
[fw/altos] / micropeak / MicroData.java
index 71919ddb625098fc0ea35f9cc9ca201c9e7deb04..c38ada9151868a8e69e704cec6d6f42f01dabe1f 100644 (file)
@@ -20,7 +20,8 @@ package org.altusmetrum.micropeak;
 import java.lang.*;
 import java.io.*;
 import java.util.*;
-import org.altusmetrum.AltosLib.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 class MicroIterator implements Iterator<MicroDataPoint> {
        int             i;
@@ -56,23 +57,62 @@ class MicroIterable implements Iterable<MicroDataPoint> {
        }
 }
 
-public class MicroData {
+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;
+       public int              log_id;
        String                  name;
-       
+       MicroStats              stats;
 
-       class FileEndedException extends Exception {
+       public static final int LOG_ID_MICROPEAK = 0;
+       public static final int LOG_ID_MICROKITE = 1;
+
+       public static final double CLOCK = 0.096;
+
+       public class FileEndedException extends Exception {
        }
 
-       class NonHexcharException extends Exception {
+       public class NonHexcharException extends Exception {
        }
 
-       class InvalidCrcException extends Exception {
+       public class InvalidCrcException extends Exception {
        }
 
        private int getc(InputStream f) throws IOException, FileEndedException {
@@ -133,16 +173,12 @@ public class MicroData {
                return h;
        }
 
-       private boolean find_header(InputStream f) throws IOException {
-               try {
-                       for (;;) {
-                               if (get_nonwhite(f) == 'M' && get_nonwhite(f) == 'P')
-                                       return true;
-                       }
-               } catch (FileEndedException fe) {
-                       return false;
+       private boolean find_header(InputStream f) throws IOException, FileEndedException {
+               for (;;) {
+                       if (get_nonwhite(f) == 'M' && get_nonwhite(f) == 'P')
+                               return true;
                }
-       } 
+       }
 
        private int get_32(InputStream f)  throws IOException, FileEndedException, NonHexcharException {
                int     v = 0;
@@ -178,6 +214,14 @@ 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);
        }
@@ -297,7 +341,7 @@ public class MicroData {
                this.name = name;
        }
 
-       public MicroData (InputStream f, String name) throws IOException, InterruptedException {
+       public MicroData (InputStream f, String name) throws IOException, InterruptedException, NonHexcharException, FileEndedException {
                this.name = name;
                bytes = new ArrayList<Integer>();
                if (!find_header(f))
@@ -307,6 +351,9 @@ public class MicroData {
                        ground_pressure = get_32(f);
                        min_pressure = get_32(f);
                        int nsamples = get_16(f);
+
+                       log_id = nsamples >> 12;
+                       nsamples &= 0xfff;
                        pressures = new int[nsamples + 1];
 
                        ground_altitude = AltosConvert.pressure_to_altitude(ground_pressure);
@@ -329,7 +376,7 @@ public class MicroData {
                                        else
                                                cur = down;
                                }
-                               
+
                                pressures[i+1] = cur;
                        }
 
@@ -338,11 +385,17 @@ public class MicroData {
 
                        crc_valid = crc == current_crc;
 
-                       time_step = 0.192;
+                       switch (log_id) {
+                       case LOG_ID_MICROPEAK:
+                               time_step = 2 * CLOCK;
+                               break;
+                       case LOG_ID_MICROKITE:
+                               time_step = 200 * CLOCK;
+                               break;
+                       }
+                       stats = new MicroStats(this);
                } catch (FileEndedException fe) {
                        throw new IOException("File Ended Unexpectedly");
-               } catch (NonHexcharException ne) {
-                       throw new IOException("Non hexadecimal character found");
                }
        }
 
@@ -352,5 +405,5 @@ public class MicroData {
                pressures = new int[1];
                pressures[0] = 101000;
        }
-       
+
 }