summaryrefslogtreecommitdiff
path: root/altosui/AltosDataPointReader.java
blob: fa48013f3b1053a65678ee02f6535aa834cb5035 (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

// Copyright (c) 2010 Anthony Towns
// GPL v2 or later

package altosui;

import java.io.IOException;
import java.text.ParseException;
import java.lang.UnsupportedOperationException;
import java.util.NoSuchElementException;
import java.util.Iterator;

class AltosDataPointReader implements Iterable<AltosDataPoint> {
    Iterator<AltosRecord> iter;
    AltosState state;
    AltosRecord record;
    boolean has_gps;
    boolean has_accel;
    boolean has_ignite;

    final static int MISSING = AltosRecord.MISSING;

    public AltosDataPointReader(AltosRecordIterable reader) {
        this.iter = reader.iterator();
        this.state = null;
	has_accel = reader.has_accel();
	has_gps = reader.has_gps();
	has_ignite = reader.has_ignite();
    }

    private void read_next_record() 
        throws NoSuchElementException
    {
        record = iter.next();
        state = new AltosState(record, state);
    }

    private AltosDataPoint current_dp() {
        assert this.record != null;
        
        return new AltosDataPoint() {
            public int version() { return record.version; }
            public int serial() { return record.serial; }
            public int flight() { return record.flight; }
            public String callsign() { return record.callsign; }
            public double time() { return record.time; }
            public double rssi() { return record.rssi; }

            public int state() { return record.state; }
            public String state_name() { return record.state(); }

            public double acceleration() { return record.acceleration(); }
            public double pressure() { return record.raw_pressure(); }
            public double altitude() { return record.raw_altitude(); }
	    public double height() { return record.raw_height(); }
            public double accel_speed() { return record.accel_speed(); }
            public double baro_speed() { return state.baro_speed; }
            public double temperature() { return record.temperature(); }
            public double battery_voltage() { return record.battery_voltage(); }
            public double drogue_voltage() { return record.drogue_voltage(); }
            public double main_voltage() { return record.main_voltage(); }
	    public boolean has_accel() { return has_accel; }
        };
    }

    public Iterator<AltosDataPoint> iterator() {
        return new Iterator<AltosDataPoint>() {
            public void remove() { 
                throw new UnsupportedOperationException(); 
            }
            public boolean hasNext() {
                return iter.hasNext();
            }
            public AltosDataPoint next() {
                read_next_record();
                return current_dp();
            }
        };
    }
}