diff options
Diffstat (limited to 'ao-tools/altosui/AltosCsvReader.java')
-rw-r--r-- | ao-tools/altosui/AltosCsvReader.java | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/ao-tools/altosui/AltosCsvReader.java b/ao-tools/altosui/AltosCsvReader.java new file mode 100644 index 00000000..600788f4 --- /dev/null +++ b/ao-tools/altosui/AltosCsvReader.java @@ -0,0 +1,113 @@ + +// Copyright (c) 2010 Anthony Towns +// GPL v2 or later + +package altosui; + +import java.lang.UnsupportedOperationException; +import java.util.HashMap; +import java.util.NoSuchElementException; +import java.util.Iterator; +import java.io.*; +import com.csvreader.CsvReader; + +import altosui.AltosDataPoint; + +class AltosCsvReader implements Iterable<AltosDataPoint> +{ + public CsvReader csv; + public AltosDataPoint next = null; + + static protected String [] headers = "version serial flight call time rssi state state_name acceleration pressure altitude height accel_speed baro_speed temperature battery_voltage drogue_voltage main_voltage connected locked nsat latitude longitude altitude year month day hour minute second pad_dist pad_range pad_az pad_el".split(" "); + + AltosCsvReader(Reader stream) { + csv = new CsvReader(stream); + csv.setComment('#'); + csv.setUseComments(true); + csv.setHeaders(headers); + } + AltosCsvReader(String filename) throws FileNotFoundException { + csv = new CsvReader(filename); + csv.setComment('#'); + csv.setUseComments(true); + csv.setHeaders(headers); + } + + public Iterator<AltosDataPoint> iterator() { + return new Iterator<AltosDataPoint>() { + public void remove() { + throw new UnsupportedOperationException(); + } + public boolean hasNext() { + if (next == null) { + try { + if (csv.readRecord()) { + next = new CsvRow(); + } else { + close(); + return false; + } + } catch (IOException e) { + close(); + return false; + } + } + return true; + } + public AltosDataPoint next() { + if (!hasNext()) + throw new NoSuchElementException(); + AltosDataPoint res = next; + next = null; + return res; + } + }; + } + + public void close() { + csv.close(); + } + + private class CsvRow extends HashMap<String,String> + implements AltosDataPoint + { + CsvRow() throws IOException { + for (int i = 0; i < headers.length; i++) { + this.put(headers[i], csv.get(headers[i]).trim()); + } + } + + private int intField(String name) { + return Integer.parseInt(get(name).trim()); + } + private double doubleField(String name) { + return Double.valueOf(get(name)).doubleValue(); + } + private String stringField(String name) { + return get(name); + } + + public int version() { return intField("version"); } + public int serial() { return intField("serial"); } + public int flight() { return intField("flight"); } + public String callsign() { return stringField("call"); } + public double time() { return doubleField("time"); } + public double rssi() { return doubleField("rssi"); } + + public int state() { return intField("state"); } + public String state_name() { return stringField("state_name"); } + + public double acceleration() { return doubleField("acceleration"); } + public double pressure() { return doubleField("pressure"); } + public double altitude() { return doubleField("altitude"); } + public double height() { return doubleField("height"); } + public double accel_speed() { return doubleField("accel_speed"); } + public double baro_speed() { return doubleField("baro_speed"); } + public double temperature() { return doubleField("temperature"); } + public double battery_voltage() { + return doubleField("battery_voltage"); + } + public double drogue_voltage() { return doubleField("drogue_voltage"); } + public double main_voltage() { return doubleField("main_voltage"); } + } +} |