Add support for the "kite" micropeak variant
[fw/altos] / micropeak / MicroData.java
index 4c0ed4c3312bf1de84e5a6947f5d1e1865e9837b..c38ada9151868a8e69e704cec6d6f42f01dabe1f 100644 (file)
@@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;
 import java.lang.*;
 import java.io.*;
 import java.util.*;
-import org.altusmetrum.altoslib_1.*;
-import org.altusmetrum.altosuilib_1.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 class MicroIterator implements Iterator<MicroDataPoint> {
        int             i;
@@ -97,16 +97,22 @@ public class MicroData implements AltosUIDataSet {
        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 {
@@ -167,16 +173,12 @@ public class MicroData implements AltosUIDataSet {
                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;
@@ -339,7 +341,7 @@ public class MicroData implements AltosUIDataSet {
                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))
@@ -349,6 +351,9 @@ public class MicroData implements AltosUIDataSet {
                        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);
@@ -371,7 +376,7 @@ public class MicroData implements AltosUIDataSet {
                                        else
                                                cur = down;
                                }
-                               
+
                                pressures[i+1] = cur;
                        }
 
@@ -380,12 +385,17 @@ public class MicroData implements AltosUIDataSet {
 
                        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");
                }
        }
 
@@ -395,5 +405,5 @@ public class MicroData implements AltosUIDataSet {
                pressures = new int[1];
                pressures[0] = 101000;
        }
-       
+
 }