import java.util.*;
import org.altusmetrum.AltosLib.*;
+abstract class MicroIterator implements Iterator<Double> {
+ int i;
+ MicroData data;
+
+ public boolean hasNext() {
+ return i < data.pressures.length;
+ }
+
+ public MicroIterator (MicroData data) {
+ this.data = data;
+ i = 0;
+ }
+
+ public void remove() {
+ }
+}
+
+class MicroHeightIterator extends MicroIterator {
+ public Double next() {
+ return data.height(i++);
+ }
+
+ public MicroHeightIterator(MicroData data) {
+ super(data);
+ }
+}
+
+class MicroHeightIterable implements Iterable<Double> {
+ MicroData data;
+
+ public Iterator<Double> iterator() {
+ return new MicroHeightIterator(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) {
+ this.data = data;
+ }
+}
+
public class MicroData {
public int ground_pressure;
public int min_pressure;
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);
+ }
+
int fact(int n) {
if (n == 0)
return 1;
public void save (OutputStream f) throws IOException {
for (int c : bytes)
f.write(c);
+ f.write('\n');
+ }
+
+ 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");
}
}
+
+ public MicroData() {
+ ground_pressure = 101000;
+ min_pressure = 101000;
+ pressures = new int[1];
+ pressures[0] = 101000;
+ }
}