package me.drton.flightplot.export;
import me.drton.jmavlib.log.FormatErrorException;
import me.drton.jmavlib.log.ulog.ULogReader;
import java.io.EOFException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by ada on 23.12.13.
*/
public class ULogTrackReader extends AbstractTrackReader {
private static final String POS_VALID = "ATTITUDE_POSITION.valid_pos";
private static final String POS_LAT = "ATTITUDE_POSITION.lat";
private static final String POS_LON = "ATTITUDE_POSITION.lon";
private static final String POS_ALT = "ATTITUDE_POSITION.alt_msl";
private static final String MODE = "SYSTEM_STATUS.mode";
private String flightMode = null;
public ULogTrackReader(ULogReader reader, TrackReaderConfiguration config) throws IOException, FormatErrorException {
super(reader, config);
}
@Override
public TrackPoint readNextPoint() throws IOException, FormatErrorException {
Map<String, Object> data = new HashMap<String, Object>();
while (true) {
data.clear();
long t;
try {
t = readUpdate(data);
} catch (EOFException e) {
break; // End of file
}
String currentFlightMode = getFlightMode(data);
if (currentFlightMode != null) {
flightMode = currentFlightMode;
}
Number valid = (Number) data.get(POS_VALID);
Number lat = (Number) data.get(POS_LAT);
Number lon = (Number) data.get(POS_LON);
Number alt = (Number) data.get(POS_ALT);
if (valid != null && lat != null && lon != null && alt != null && valid.intValue() != 0) {
return new TrackPoint(lat.doubleValue(), lon.doubleValue(), alt.doubleValue() + config.getAltitudeOffset(),
t + reader.getUTCTimeReferenceMicroseconds(), flightMode);
}
}
return null;
}
private String getFlightMode(Map<String, Object> data) {
Number flightMode = (Number) data.get(MODE);
if (flightMode != null) {
switch (flightMode.intValue()) {
case 1:
return "MANUAL";
case 2:
return "ALTCTL";
case 3:
return "POSCTL";
case 4:
return "RTH";
default:
return String.format("UNKNOWN(%s)", flightMode.intValue());
}
}
return null; // Not supported
}
}