--- /dev/null
+/*
+ * Copyright © 2010 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; 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_1;
+
+import java.text.*;
+
+public class AltosEepromTM implements AltosStateUpdate {
+ public int cmd;
+ public int tick;
+ public int a;
+ public int b;
+ public String data;
+ public boolean tick_valid;
+
+ public static final int record_length = 8;
+
+ public void update_state(AltosState state) {
+ state.set_tick(tick);
+ switch (cmd) {
+ case AltosLib.AO_LOG_FLIGHT:
+ state.ground_accel = a;
+ state.flight = b;
+ state.set_boost_tick(tick);
+ state.time = 0;
+ break;
+ case AltosLib.AO_LOG_SENSOR:
+ state.set_telemetrum(a, b);
+ break;
+ case AltosLib.AO_LOG_PRESSURE:
+ state.set_telemetrum(AltosState.MISSING, b);
+ break;
+ case AltosLib.AO_LOG_TEMP_VOLT:
+/*
+
+ record.temp = a;
+ record.batt = b;
+ eeprom_state.seen |= AltosRecord.seen_temp_volt;
+*/
+ break;
+ case AltosLib.AO_LOG_DEPLOY:
+/*
+ record.drogue = a;
+ record.main = b;
+ eeprom_state.seen |= AltosRecord.seen_deploy;
+ has_ignite = true;
+*/
+ break;
+ case AltosLib.AO_LOG_STATE:
+ state.state = a;
+ break;
+// case AltosLib.AO_LOG_GPS_TIME:
+// eeprom_state.gps_tick = record.tick;
+// eeprom_state.seen |= AltosRecord.seen_gps_time;
+// AltosGPS old = state.gps;
+// AltosGPS gps = new AltosGPS();
+//
+// /* GPS date doesn't get repeated through the file */
+// if (old != null) {
+// gps.year = old.year;
+// gps.month = old.month;
+// gps.day = old.day;
+// }
+// gps.hour = (a & 0xff);
+// gps.minute = (a >> 8);
+// gps.second = (b & 0xff);
+//
+// int flags = (b >> 8);
+// gps.connected = (flags & AltosLib.AO_GPS_RUNNING) != 0;
+// gps.locked = (flags & AltosLib.AO_GPS_VALID) != 0;
+// gps.nsat = (flags & AltosLib.AO_GPS_NUM_SAT_MASK) >>
+// AltosLib.AO_GPS_NUM_SAT_SHIFT;
+// state.temp_gps = gps;
+// break;
+// case AltosLib.AO_LOG_GPS_LAT:
+// int lat32 = a | (b << 16);
+// if (state.temp_gps == null)
+// state.temp_gps = new AltosGPS();
+// state.temp_gps.lat = (double) lat32 / 1e7;
+// break;
+// case AltosLib.AO_LOG_GPS_LON:
+// int lon32 = a | (b << 16);
+// if (state.temp_gps == null)
+// state.temp_gps = new AltosGPS();
+// state.temp_gps.lon = (double) lon32 / 1e7;
+// break;
+// case AltosLib.AO_LOG_GPS_ALT:
+// if (state.temp_gps == null)
+// state.temp_gps = new AltosGPS();
+// state.temp_gps.alt = a;
+// break;
+// case AltosLib.AO_LOG_GPS_SAT:
+// if (record.tick == eeprom_state.gps_tick) {
+// int svid = a;
+// int c_n0 = b >> 8;
+// if (record.gps == null)
+// record.gps = new AltosGPS();
+// record.gps.add_sat(svid, c_n0);
+// }
+// break;
+// case AltosLib.AO_LOG_GPS_DATE:
+// if (record.gps == null)
+// record.gps = new AltosGPS();
+// record.gps.year = (a & 0xff) + 2000;
+// record.gps.month = a >> 8;
+// record.gps.day = b & 0xff;
+// break;
+
+ case AltosLib.AO_LOG_CONFIG_VERSION:
+ break;
+ case AltosLib.AO_LOG_MAIN_DEPLOY:
+ break;
+ case AltosLib.AO_LOG_APOGEE_DELAY:
+ break;
+ case AltosLib.AO_LOG_RADIO_CHANNEL:
+ break;
+ case AltosLib.AO_LOG_CALLSIGN:
+ state.callsign = data;
+ break;
+ case AltosLib.AO_LOG_ACCEL_CAL:
+ state.accel_plus_g = a;
+ state.accel_minus_g = b;
+ break;
+ case AltosLib.AO_LOG_RADIO_CAL:
+ break;
+ case AltosLib.AO_LOG_MANUFACTURER:
+ break;
+ case AltosLib.AO_LOG_PRODUCT:
+ break;
+ case AltosLib.AO_LOG_SERIAL_NUMBER:
+ state.serial = a;
+ break;
+ case AltosLib.AO_LOG_SOFTWARE_VERSION:
+ break;
+ }
+ }
+
+ public AltosEepromTM (AltosEepromChunk chunk, int start) throws ParseException {
+
+ cmd = chunk.data(start);
+ tick_valid = true;
+
+ tick_valid = !chunk.erased(start, record_length);
+ if (tick_valid) {
+ if (AltosConvert.checksum(chunk.data, start, record_length) != 0)
+ throw new ParseException(String.format("invalid checksum at 0x%x",
+ chunk.address + start), 0);
+ } else {
+ cmd = AltosLib.AO_LOG_INVALID;
+ }
+
+ tick = chunk.data16(start + 2);
+ a = chunk.data16(start + 4);
+ b = chunk.data16(start + 6);
+
+ data = null;
+ }
+
+ public AltosEepromTM (String line) {
+ tick_valid = false;
+ tick = 0;
+ a = 0;
+ b = 0;
+ data = null;
+ if (line == null) {
+ cmd = AltosLib.AO_LOG_INVALID;
+ data = "";
+ } else {
+ try {
+ String[] tokens = line.split("\\s+");
+
+ if (tokens[0].length() == 1) {
+ if (tokens.length != 4) {
+ cmd = AltosLib.AO_LOG_INVALID;
+ data = line;
+ } else {
+ cmd = tokens[0].codePointAt(0);
+ tick = Integer.parseInt(tokens[1],16);
+ tick_valid = true;
+ a = Integer.parseInt(tokens[2],16);
+ b = Integer.parseInt(tokens[3],16);
+ }
+ } else if (tokens[0].equals("Config") && tokens[1].equals("version:")) {
+ cmd = AltosLib.AO_LOG_CONFIG_VERSION;
+ data = tokens[2];
+ } else if (tokens[0].equals("Main") && tokens[1].equals("deploy:")) {
+ cmd = AltosLib.AO_LOG_MAIN_DEPLOY;
+ a = Integer.parseInt(tokens[2]);
+ } else if (tokens[0].equals("Apogee") && tokens[1].equals("delay:")) {
+ cmd = AltosLib.AO_LOG_APOGEE_DELAY;
+ a = Integer.parseInt(tokens[2]);
+ } else if (tokens[0].equals("Radio") && tokens[1].equals("channel:")) {
+ cmd = AltosLib.AO_LOG_RADIO_CHANNEL;
+ a = Integer.parseInt(tokens[2]);
+ } else if (tokens[0].equals("Callsign:")) {
+ cmd = AltosLib.AO_LOG_CALLSIGN;
+ data = tokens[1].replaceAll("\"","");
+ } else if (tokens[0].equals("Accel") && tokens[1].equals("cal")) {
+ cmd = AltosLib.AO_LOG_ACCEL_CAL;
+ a = Integer.parseInt(tokens[3]);
+ b = Integer.parseInt(tokens[5]);
+ } else if (tokens[0].equals("Radio") && tokens[1].equals("cal:")) {
+ cmd = AltosLib.AO_LOG_RADIO_CAL;
+ a = Integer.parseInt(tokens[2]);
+ } else if (tokens[0].equals("Max") && tokens[1].equals("flight") && tokens[2].equals("log:")) {
+ cmd = AltosLib.AO_LOG_MAX_FLIGHT_LOG;
+ a = Integer.parseInt(tokens[3]);
+ } else if (tokens[0].equals("manufacturer")) {
+ cmd = AltosLib.AO_LOG_MANUFACTURER;
+ data = tokens[1];
+ } else if (tokens[0].equals("product")) {
+ cmd = AltosLib.AO_LOG_PRODUCT;
+ data = tokens[1];
+ } else if (tokens[0].equals("serial-number")) {
+ cmd = AltosLib.AO_LOG_SERIAL_NUMBER;
+ a = Integer.parseInt(tokens[1]);
+ } else if (tokens[0].equals("log-format")) {
+ cmd = AltosLib.AO_LOG_LOG_FORMAT;
+ a = Integer.parseInt(tokens[1]);
+ } else if (tokens[0].equals("software-version")) {
+ cmd = AltosLib.AO_LOG_SOFTWARE_VERSION;
+ data = tokens[1];
+ } else {
+ cmd = AltosLib.AO_LOG_INVALID;
+ data = line;
+ }
+ } catch (NumberFormatException ne) {
+v cmd = AltosLib.AO_LOG_INVALID;
+ data = line;
+ }
+ }
+ }
+
+ public AltosEepromTM(int in_cmd, int in_tick, int in_a, int in_b) {
+ tick_valid = true;
+ cmd = in_cmd;
+ tick = in_tick;
+ a = in_a;
+ b = in_b;
+ }
+}