From: Keith Packard Date: Fri, 6 Sep 2013 23:48:52 +0000 (-0700) Subject: altoslib/altosui: Add TeleMini-v1.0 eeprom support X-Git-Tag: 1.2.9.4~80 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=a299a5a9a1b89c7ebc00ebd33a789793a6835181 altoslib/altosui: Add TeleMini-v1.0 eeprom support Got lost in the AltosState transition Signed-off-by: Keith Packard --- diff --git a/altoslib/AltosEepromChunk.java b/altoslib/AltosEepromChunk.java index 918481fa..48d29e1b 100644 --- a/altoslib/AltosEepromChunk.java +++ b/altoslib/AltosEepromChunk.java @@ -62,7 +62,7 @@ public class AltosEepromChunk { return true; } - public AltosEeprom eeprom(int offset, int log_format) { + public AltosEeprom eeprom(int offset, int log_format, AltosState state) { AltosEeprom eeprom = null; try { switch (log_format) { @@ -70,8 +70,11 @@ public class AltosEepromChunk { eeprom = new AltosEepromTM(this, offset); break; case AltosLib.AO_LOG_FORMAT_TINY: + eeprom = new AltosEepromTm(this, offset, state); + break; case AltosLib.AO_LOG_FORMAT_TELEMETRY: case AltosLib.AO_LOG_FORMAT_TELESCIENCE: + break; case AltosLib.AO_LOG_FORMAT_TELEMEGA: eeprom = new AltosEepromMega(this, offset); break; diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java index f87bf916..60ab2573 100644 --- a/altoslib/AltosEepromFile.java +++ b/altoslib/AltosEepromFile.java @@ -79,6 +79,8 @@ public class AltosEepromFile extends AltosStateIterable { body = new AltosEepromIterable(AltosEepromTM.read(input)); break; case AltosLib.AO_LOG_FORMAT_TINY: + body = new AltosEepromIterable(AltosEepromTm.read(input)); + break; case AltosLib.AO_LOG_FORMAT_TELEMETRY: case AltosLib.AO_LOG_FORMAT_TELESCIENCE: case AltosLib.AO_LOG_FORMAT_TELEMEGA: diff --git a/altoslib/AltosEepromTm.java b/altoslib/AltosEepromTm.java new file mode 100644 index 00000000..b8914131 --- /dev/null +++ b/altoslib/AltosEepromTm.java @@ -0,0 +1,159 @@ +/* + * Copyright © 2010 Keith Packard + * + * 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; version 2 of the License. + * + * 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. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altoslib_2; + +import java.io.*; +import java.util.*; +import java.text.*; + +public class AltosEepromTm extends AltosEeprom { + public int i; + public int a; + public int b; + + public static final int record_length = 2; + + public void write(PrintStream out) { + out.printf("%c %4x %4x %4x\n", cmd, tick, a, b); + } + + public int record_length() { return record_length; } + + public String string() { + return String.format("%c %4x %4x %4x\n", cmd, tick, a, b); + } + + public void update_state(AltosState state) { + super.update_state(state); + + switch (cmd) { + case AltosLib.AO_LOG_FLIGHT: + state.set_state(AltosLib.ao_flight_boost); + state.set_flight(b); + break; + case AltosLib.AO_LOG_PRESSURE: + if (tick == 0) + state.set_ground_pressure(AltosConvert.barometer_to_pressure(b)); + else + state.set_pressure(AltosConvert.barometer_to_pressure(b)); + break; + case AltosLib.AO_LOG_STATE: + state.set_state(a); + break; + } + } + + public AltosEepromTm (AltosEepromChunk chunk, int start, AltosState state) throws ParseException { + int value = chunk.data16(start); + + int i = (chunk.address + start) / record_length; + + cmd = chunk.data(start); + valid = true; + + valid = !chunk.erased(start, record_length); + + switch (i) { + case 0: + cmd = AltosLib.AO_LOG_FLIGHT; + tick = 0; + a = 0; + b = value; + break; + case 1: + cmd = AltosLib.AO_LOG_PRESSURE; + tick = 0; + a = 0; + b = value; + break; + default: + if ((value & 0x8000) != 0) { + cmd = AltosLib.AO_LOG_STATE; + tick = state.tick; + a = value & 0x7fff; + b = 0; + } else { + if (state.ascent) + tick = state.tick + 10; + else + tick = state.tick + 100; + cmd = AltosLib.AO_LOG_PRESSURE; + a = 0; + b = value; + } + break; + } + } + + public AltosEepromTm (String line) { + valid = false; + tick = 0; + a = 0; + b = 0; + if (line == null) { + cmd = AltosLib.AO_LOG_INVALID; + } else { + try { + String[] tokens = line.split("\\s+"); + + if (tokens[0].length() == 1) { + if (tokens.length != 4) { + cmd = AltosLib.AO_LOG_INVALID; + } else { + cmd = tokens[0].codePointAt(0); + tick = Integer.parseInt(tokens[1],16); + valid = true; + a = Integer.parseInt(tokens[2],16); + b = Integer.parseInt(tokens[3],16); + } + } else { + cmd = AltosLib.AO_LOG_INVALID; + } + } catch (NumberFormatException ne) { + cmd = AltosLib.AO_LOG_INVALID; + } + } + } + + public AltosEepromTm(int in_cmd, int in_tick, int in_a, int in_b) { + valid = true; + cmd = in_cmd; + tick = in_tick; + a = in_a; + b = in_b; + } + + static public LinkedList read(FileInputStream input) { + LinkedList tms = new LinkedList(); + + for (;;) { + try { + String line = AltosLib.gets(input); + if (line == null) + break; + AltosEepromTm tm = new AltosEepromTm(line); + tms.add(tm); + } catch (IOException ie) { + break; + } + } + + return tms; + } + +} diff --git a/altosui/AltosEepromDownload.java b/altosui/AltosEepromDownload.java index c3bdd159..f034d73c 100644 --- a/altosui/AltosEepromDownload.java +++ b/altosui/AltosEepromDownload.java @@ -100,7 +100,10 @@ public class AltosEepromDownload implements Runnable { state.set_serial(flights.config_data.serial); for (int i = 0; i < AltosEepromChunk.chunk_size && !done; i += record_length) { - AltosEeprom r = eechunk.eeprom(i, log_format); + AltosEeprom r = eechunk.eeprom(i, log_format, state); + + if (r == null) + continue; record_length = r.record_length();