import java.util.*;
import org.altusmetrum.AltosLib.*;
-abstract class MicroIterator implements Iterator<Double> {
+class MicroIterator implements Iterator<MicroDataPoint> {
int i;
MicroData data;
return i < data.pressures.length;
}
+ public MicroDataPoint next() {
+ return new MicroDataPoint(data, i++);
+ }
+
public MicroIterator (MicroData data) {
this.data = data;
i = 0;
}
}
-class MicroHeightIterator extends MicroIterator {
- public Double next() {
- return data.height(i++);
- }
-
- public MicroHeightIterator(MicroData data) {
- super(data);
- }
-}
+class MicroIterable implements Iterable<MicroDataPoint> {
-class MicroHeightIterable implements Iterable<Double> {
MicroData data;
- public Iterator<Double> iterator() {
- return new MicroHeightIterator(data);
+ public Iterator<MicroDataPoint> iterator() {
+ return new MicroIterator(data);
}
- public MicroHeightIterable(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<Double> {
- MicroData data;
-
- public Iterator<Double> iterator() {
- return new MicroSpeedIterator(data);
- }
-
- public MicroSpeedIterable(MicroData data) {
- this.data = data;
- }
-}
-
-class MicroAccelIterator extends MicroIterator {
- public Double next() {
- return data.acceleration(i++);
- }
- public MicroAccelIterator(MicroData data) {
- super(data);
- }
-}
-
-class MicroAccelIterable implements Iterable<Double> {
- MicroData data;
-
- public Iterator<Double> iterator() {
- return new MicroAccelIterator(data);
- }
-
- public MicroAccelIterable(MicroData data) {
+ public MicroIterable(MicroData data) {
this.data = data;
}
}
private double time_step;
private double ground_altitude;
private ArrayList<Integer> bytes;
+ String name;
class FileEndedException extends Exception {
return AltosConvert.pressure_to_altitude(pressures[i]);
}
- public Iterable<Double> heights() {
- return new MicroHeightIterable(this);
- }
-
- public Iterable<Double> speeds() {
- return new MicroSpeedIterable(this);
- }
-
- public Iterable<Double> accels() {
- return new MicroAccelIterable(this);
+ public Iterable<MicroDataPoint> points() {
+ return new MicroIterable(this);
}
int fact(int n) {
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;
public void save (OutputStream f) throws IOException {
for (int c : bytes)
f.write(c);
+ 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) throws IOException {
+ public MicroData (InputStream f, String name) throws IOException, InterruptedException {
+ this.name = name;
bytes = new ArrayList<Integer>();
if (!find_header(f))
- throw new IOException();
+ throw new IOException("No MicroPeak data header found");
try {
file_crc = 0xffff;
ground_pressure = get_32(f);
time_step = 0.192;
} catch (FileEndedException fe) {
- throw new IOException();
+ throw new IOException("File Ended Unexpectedly");
} catch (NonHexcharException ne) {
- throw new IOException();
+ throw new IOException("Non hexadecimal character found");
}
}