summaryrefslogtreecommitdiff
path: root/ao-tools/altosui/AltosCsvReader.java
blob: 600788f43e9d527270f4797d8da4c49b9eeec080 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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"); }
    }
}