diff options
Diffstat (limited to 'altoslib/AltosEepromRecordSet.java')
-rw-r--r-- | altoslib/AltosEepromRecordSet.java | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/altoslib/AltosEepromRecordSet.java b/altoslib/AltosEepromRecordSet.java new file mode 100644 index 00000000..48e90c05 --- /dev/null +++ b/altoslib/AltosEepromRecordSet.java @@ -0,0 +1,120 @@ +/* + * Copyright © 2017 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +package org.altusmetrum.altoslib_12; + +import java.io.*; +import java.util.*; + +public class AltosEepromRecordSet implements AltosRecordSet { + AltosEeprom eeprom; + TreeSet<AltosEepromRecord> ordered; + AltosCalData cal_data; + + public AltosConfigData config_data() { + return eeprom.config_data(); + } + + public AltosCalData cal_data() { + if (cal_data == null) { + cal_data = new AltosCalData(config_data()); + for (AltosEepromRecord record : ordered) { + if (record.cmd() == AltosLib.AO_LOG_FLIGHT) { + cal_data.set_tick(record.tick()); + cal_data.set_boost_tick(); + break; + } + } + } + return cal_data; + } + + public void capture_series(AltosDataListener listener) { + AltosCalData cal_data = cal_data(); + + cal_data.reset(); + for (AltosEepromRecord record : ordered) { + record.provide_data(listener, cal_data); + } + listener.finish(); + } + + public AltosEepromRecordSet(AltosEeprom eeprom) { + this.eeprom = eeprom; + + AltosConfigData config_data = eeprom.config_data(); + + AltosEepromRecord record = null; + + switch (config_data.log_format) { + case AltosLib.AO_LOG_FORMAT_FULL: + record = new AltosEepromRecordFull(eeprom); + break; + case AltosLib.AO_LOG_FORMAT_TINY: + record = new AltosEepromRecordTiny(eeprom); + break; + case AltosLib.AO_LOG_FORMAT_TELEMETRY: + case AltosLib.AO_LOG_FORMAT_TELESCIENCE: + case AltosLib.AO_LOG_FORMAT_TELEMEGA: + case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD: + record = new AltosEepromRecordMega(eeprom); + break; + case AltosLib.AO_LOG_FORMAT_TELEMETRUM: + record = new AltosEepromRecordMetrum(eeprom); + break; + case AltosLib.AO_LOG_FORMAT_TELEMINI2: + case AltosLib.AO_LOG_FORMAT_TELEMINI3: + case AltosLib.AO_LOG_FORMAT_EASYMINI1: + case AltosLib.AO_LOG_FORMAT_EASYMINI2: + record = new AltosEepromRecordMini(eeprom); + break; + case AltosLib.AO_LOG_FORMAT_TELEGPS: + record = new AltosEepromRecordGps(eeprom); + break; + case AltosLib.AO_LOG_FORMAT_TELEFIRETWO: + record = new AltosEepromRecordFireTwo(eeprom); + break; + } + + if (record == null) { + System.out.printf("failed to parse log format %d\n", config_data.log_format); + return; + } + ordered = new TreeSet<AltosEepromRecord>(); + int tick = 0; + boolean first = true; + + for (;;) { + int t = record.tick(); + + if (first) { + tick = t; + first = false; + } else { + while (t < tick - 32767) + t += 65536; + tick = t; + } + record.wide_tick = tick; + ordered.add(record); + if (!record.hasNext()) + break; + record = record.next(); + } + } + + public AltosEepromRecordSet(InputStream input) throws IOException { + this(new AltosEeprom(input)); + } +} |