X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=micropeak%2FMicroData.java;h=96053ac55ca712c8e8c45f12441eff8ed5779c7d;hb=refs%2Fheads%2Fmaster;hp=70492a07abbebf5e95eaf4ac128ba1f03227590c;hpb=a61217f0a6d0ef48b6471f632c4600255867e831;p=fw%2Faltos diff --git a/micropeak/MicroData.java b/micropeak/MicroData.java index 70492a07..4a53482c 100644 --- a/micropeak/MicroData.java +++ b/micropeak/MicroData.java @@ -21,8 +21,8 @@ package org.altusmetrum.micropeak; import java.lang.*; import java.io.*; import java.util.*; -import org.altusmetrum.altoslib_12.*; -import org.altusmetrum.altosuilib_12.*; +import org.altusmetrum.altoslib_14.*; +import org.altusmetrum.altosuilib_14.*; public class MicroData { public int ground_pressure; @@ -34,8 +34,10 @@ public class MicroData { private double time_step; private ArrayList bytes; + public int nsamples; public int log_id; String name; + String unique_id; public static final int LOG_ID_MICROPEAK = 0; public static final int LOG_ID_MICROKITE = 1; @@ -134,12 +136,29 @@ public class MicroData { return v; } + private String get_line(InputStream f) throws IOException, FileEndedException, NonHexcharException { + int c; + StringBuffer line = new StringBuffer(); + + do { + c = f.read(); + } while (Character.isWhitespace(c)); + + do { + line.append((char) c); + c = f.read(); + } while (!Character.isWhitespace(c)); + return new String(line); + } + private int swap16(int i) { return ((i << 8) & 0xff00) | ((i >> 8) & 0xff); } public boolean crc_valid; + public boolean log_empty; + int mix_in (int high, int low) { return high - (high & 0xffff) + low; } @@ -229,6 +248,15 @@ public class MicroData { f.write('\n'); } + public boolean is_empty() { + boolean empty = true; + for (int c : bytes) { + if (!Character.isWhitespace(c) && c != 'f') + empty = false; + } + return empty; + } + 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"); @@ -277,10 +305,14 @@ public class MicroData { file_crc = 0xffff; ground_pressure = get_32(f); min_pressure = get_32(f); - int nsamples = get_16(f); + nsamples = get_16(f); log_id = nsamples >> 12; nsamples &= 0xfff; + if (log_id == LOG_ID_MICROPEAK2) { + int nsamples_high = get_16(f); + nsamples |= (nsamples_high << 12); + } cal_data.set_ground_pressure(ground_pressure); @@ -328,6 +360,20 @@ public class MicroData { flight_series.set_pressure(cur); } + int current_crc = swap16(~file_crc & 0xffff); + int crc = get_16(f); + + crc_valid = (crc == current_crc); + + if (!crc_valid && is_empty()) { + crc_valid = true; + nsamples = 0; + } + + if (log_id == LOG_ID_MICROPEAK2) { + unique_id = get_line(f); + } + flight_series.finish(); /* Build states */ @@ -335,8 +381,10 @@ public class MicroData { flight_series.set_time(0); flight_series.set_state(AltosLib.ao_flight_boost); - flight_series.set_time(flight_series.speed_series.max().time); - flight_series.set_state(AltosLib.ao_flight_coast); + if (flight_series.speed_series != null && flight_series.speed_series.max() != null) { + flight_series.set_time(flight_series.speed_series.max().time); + flight_series.set_state(AltosLib.ao_flight_coast); + } flight_series.set_time(flight_series.height_series.max().time); flight_series.set_state(AltosLib.ao_flight_drogue); @@ -345,14 +393,12 @@ public class MicroData { flight_series.set_time(cal_data.time()); flight_series.set_state(AltosLib.ao_flight_landed); + flight_series.set_min_pressure(min_pressure); + flight_series.finish(); flight_stats = new AltosFlightStats(flight_series); - int current_crc = swap16(~file_crc & 0xffff); - int crc = get_16(f); - - crc_valid = crc == current_crc; } catch (FileEndedException fe) { throw new IOException("File Ended Unexpectedly");