X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=micropeak%2FMicroData.java;h=1001a370e3e6a5df0e701f5c096d98a96643c268;hp=8ccd5fd8a88e21ec9ef592777d4c8e03e210e1dd;hb=cb23b992be8ba40c97d8988c134a814a13ccd58c;hpb=d83587c3c66b730cc54ca153714eee520ee40b2c diff --git a/micropeak/MicroData.java b/micropeak/MicroData.java index 8ccd5fd8..1001a370 100644 --- a/micropeak/MicroData.java +++ b/micropeak/MicroData.java @@ -20,9 +20,10 @@ package org.altusmetrum.micropeak; import java.lang.*; import java.io.*; import java.util.*; -import org.altusmetrum.AltosLib.*; +import org.altusmetrum.altoslib_7.*; +import org.altusmetrum.altosuilib_7.*; -abstract class MicroIterator implements Iterator { +class MicroIterator implements Iterator { int i; MicroData data; @@ -30,6 +31,10 @@ abstract class MicroIterator implements Iterator { return i < data.pressures.length; } + public MicroDataPoint next() { + return new MicroDataPoint(data, i++); + } + public MicroIterator (MicroData data) { this.data = data; i = 0; @@ -39,87 +44,75 @@ abstract class MicroIterator implements Iterator { } } -class MicroHeightIterator extends MicroIterator { - public Double next() { - return data.height(i++); - } - - public MicroHeightIterator(MicroData data) { - super(data); - } -} +class MicroIterable implements Iterable { -class MicroHeightIterable implements Iterable { MicroData data; - public Iterator iterator() { - return new MicroHeightIterator(data); + public Iterator iterator() { + return new MicroIterator(data); } - public MicroHeightIterable(MicroData data) { + public MicroIterable(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 { +class MicroUIIterator implements Iterator { + int i; MicroData data; - public Iterator iterator() { - return new MicroSpeedIterator(data); + public boolean hasNext() { + return i < data.pressures.length; } - public MicroSpeedIterable(MicroData data) { - this.data = data; + public AltosUIDataPoint next() { + return new MicroDataPoint(data, i++); } -} -class MicroAccelIterator extends MicroIterator { - public Double next() { - return data.acceleration(i++); + public MicroUIIterator (MicroData data) { + this.data = data; + i = 0; } - public MicroAccelIterator(MicroData data) { - super(data); + + public void remove() { } } -class MicroAccelIterable implements Iterable { +class MicroUIIterable implements Iterable { MicroData data; - public Iterator iterator() { - return new MicroAccelIterator(data); + public Iterator iterator() { + return new MicroUIIterator(data); } - public MicroAccelIterable(MicroData data) { + public MicroUIIterable(MicroData data) { this.data = data; } } -public class MicroData { +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 bytes; + public int log_id; String name; - + MicroStats stats; + + public static final int LOG_ID_MICROPEAK = 0; + public static final int LOG_ID_MICROKITE = 1; + + public static final double CLOCK = 0.096; - class FileEndedException extends Exception { + 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 { @@ -180,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; @@ -225,16 +214,16 @@ public class MicroData { return AltosConvert.pressure_to_altitude(pressures[i]); } - public Iterable heights() { - return new MicroHeightIterable(this); + public String name() { + return name; } - public Iterable speeds() { - return new MicroSpeedIterable(this); + public Iterable dataPoints() { + return new MicroUIIterable(this); } - public Iterable accels() { - return new MicroAccelIterable(this); + public Iterable points() { + return new MicroIterable(this); } int fact(int n) { @@ -276,10 +265,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; @@ -314,11 +319,29 @@ public class MicroData { f.write('\n'); } + 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 { + public MicroData (InputStream f, String name) throws IOException, InterruptedException, NonHexcharException, FileEndedException { this.name = name; bytes = new ArrayList(); if (!find_header(f)) @@ -328,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); @@ -350,7 +376,7 @@ public class MicroData { else cur = down; } - + pressures[i+1] = cur; } @@ -359,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"); } } @@ -373,5 +405,5 @@ public class MicroData { pressures = new int[1]; pressures[0] = 101000; } - + }