/* * Copyright © 2013 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_8; import java.io.*; import java.util.*; import java.text.*; public class AltosEepromHeader extends AltosEeprom { public int cmd; public String data; public int config_a, config_b, config_c; public boolean last; public boolean valid; public int record_length () { return 0; } /* XXX pull rest of config data to state */ public void update_state(AltosState state) { switch (cmd) { 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.set_callsign(data); break; case AltosLib.AO_LOG_ACCEL_CAL: state.set_accel_g(config_a, config_b); break; case AltosLib.AO_LOG_RADIO_CAL: break; case AltosLib.AO_LOG_MANUFACTURER: break; case AltosLib.AO_LOG_PRODUCT: state.product = data; break; case AltosLib.AO_LOG_LOG_FORMAT: state.set_log_format(config_a); break; case AltosLib.AO_LOG_SERIAL_NUMBER: state.set_serial(config_a); break; case AltosLib.AO_LOG_BARO_RESERVED: state.make_baro(); state.baro.reserved = config_a; break; case AltosLib.AO_LOG_BARO_SENS: state.make_baro(); state.baro.sens = config_a; break; case AltosLib.AO_LOG_BARO_OFF: state.make_baro(); state.baro.off = config_a; break; case AltosLib.AO_LOG_BARO_TCS: state.make_baro(); state.baro.tcs = config_a; break; case AltosLib.AO_LOG_BARO_TCO: state.make_baro(); state.baro.tco = config_a; break; case AltosLib.AO_LOG_BARO_TREF: state.make_baro(); state.baro.tref = config_a; break; case AltosLib.AO_LOG_BARO_TEMPSENS: state.make_baro(); state.baro.tempsens = config_a; break; case AltosLib.AO_LOG_BARO_CRC: state.make_baro(); state.baro.crc = config_a; break; case AltosLib.AO_LOG_IMU_CAL: state.set_accel_zero(config_a, config_b, config_c); break; case AltosLib.AO_LOG_SOFTWARE_VERSION: state.set_firmware_version(data); break; case AltosLib.AO_LOG_FREQUENCY: case AltosLib.AO_LOG_APOGEE_LOCKOUT: case AltosLib.AO_LOG_RADIO_RATE: case AltosLib.AO_LOG_IGNITE_MODE: break; case AltosLib.AO_LOG_PAD_ORIENTATION: state.set_pad_orientation(config_a); break; case AltosLib.AO_LOG_RADIO_ENABLE: case AltosLib.AO_LOG_AES_KEY: case AltosLib.AO_LOG_APRS: case AltosLib.AO_LOG_BEEP_SETTING: case AltosLib.AO_LOG_TRACKER_SETTING: case AltosLib.AO_LOG_PYRO_TIME: case AltosLib.AO_LOG_APRS_ID: break; case AltosLib.AO_LOG_ALTITUDE_32: state.set_altitude_32(config_a); break; } } public void write(PrintStream out) { switch (cmd) { case AltosLib.AO_LOG_CONFIG_VERSION: out.printf("# Config version: %s\n", data); break; case AltosLib.AO_LOG_MAIN_DEPLOY: out.printf("# Main deploy: %s\n", config_a); break; case AltosLib.AO_LOG_APOGEE_DELAY: out.printf("# Apogee delay: %s\n", config_a); break; case AltosLib.AO_LOG_RADIO_CHANNEL: out.printf("# Radio channel: %s\n", config_a); break; case AltosLib.AO_LOG_CALLSIGN: out.printf("# Callsign: %s\n", data); break; case AltosLib.AO_LOG_ACCEL_CAL: out.printf ("# Accel cal: %d %d\n", config_a, config_b); break; case AltosLib.AO_LOG_RADIO_CAL: out.printf ("# Radio cal: %d\n", config_a); break; case AltosLib.AO_LOG_MAX_FLIGHT_LOG: out.printf ("# Max flight log: %d\n", config_a); break; case AltosLib.AO_LOG_MANUFACTURER: out.printf ("# Manufacturer: %s\n", data); break; case AltosLib.AO_LOG_PRODUCT: out.printf ("# Product: %s\n", data); break; case AltosLib.AO_LOG_SERIAL_NUMBER: out.printf ("# Serial number: %d\n", config_a); break; case AltosLib.AO_LOG_SOFTWARE_VERSION: out.printf ("# Software version: %s\n", data); break; case AltosLib.AO_LOG_BARO_RESERVED: out.printf ("# Baro reserved: %d\n", config_a); break; case AltosLib.AO_LOG_BARO_SENS: out.printf ("# Baro sens: %d\n", config_a); break; case AltosLib.AO_LOG_BARO_OFF: out.printf ("# Baro off: %d\n", config_a); break; case AltosLib.AO_LOG_BARO_TCS: out.printf ("# Baro tcs: %d\n", config_a); break; case AltosLib.AO_LOG_BARO_TCO: out.printf ("# Baro tco: %d\n", config_a); break; case AltosLib.AO_LOG_BARO_TREF: out.printf ("# Baro tref: %d\n", config_a); break; case AltosLib.AO_LOG_BARO_TEMPSENS: out.printf ("# Baro tempsens: %d\n", config_a); break; case AltosLib.AO_LOG_BARO_CRC: out.printf ("# Baro crc: %d\n", config_a); break; case AltosLib.AO_LOG_IMU_CAL: out.printf ("# IMU cal: %d %d %d\n", config_a, config_b, config_c); break; case AltosLib.AO_LOG_FREQUENCY: case AltosLib.AO_LOG_APOGEE_LOCKOUT: case AltosLib.AO_LOG_RADIO_RATE: case AltosLib.AO_LOG_IGNITE_MODE: break; case AltosLib.AO_LOG_PAD_ORIENTATION: out.printf("# Pad orientation: %d\n", config_a); break; case AltosLib.AO_LOG_RADIO_ENABLE: case AltosLib.AO_LOG_AES_KEY: case AltosLib.AO_LOG_APRS: case AltosLib.AO_LOG_BEEP_SETTING: case AltosLib.AO_LOG_TRACKER_SETTING: case AltosLib.AO_LOG_PYRO_TIME: case AltosLib.AO_LOG_APRS_ID: break; case AltosLib.AO_LOG_ALTITUDE_32: out.printf("# Altitude-32: %d\n", config_a); break; } } public AltosEepromHeader (String[] tokens) { last = false; valid = true; try { 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; config_a = Integer.parseInt(tokens[2]); } else if (tokens[0].equals("Apogee") && tokens[1].equals("delay:")) { cmd = AltosLib.AO_LOG_APOGEE_DELAY; config_a = Integer.parseInt(tokens[2]); } else if (tokens[0].equals("Radio") && tokens[1].equals("channel:")) { cmd = AltosLib.AO_LOG_RADIO_CHANNEL; config_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; config_a = Integer.parseInt(tokens[3]); config_b = Integer.parseInt(tokens[5]); } else if (tokens[0].equals("Radio") && tokens[1].equals("cal:")) { cmd = AltosLib.AO_LOG_RADIO_CAL; config_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; config_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; config_a = Integer.parseInt(tokens[1]); } else if (tokens[0].equals("log-format")) { cmd = AltosLib.AO_LOG_LOG_FORMAT; config_a = Integer.parseInt(tokens[1]); } else if (tokens[0].equals("altitude-32")) { cmd = AltosLib.AO_LOG_ALTITUDE_32; config_a = Integer.parseInt(tokens[1]); } else if (tokens[0].equals("software-version")) { cmd = AltosLib.AO_LOG_SOFTWARE_VERSION; data = tokens[1]; last = true; } else if (tokens[0].equals("ms5607")) { if (tokens[1].equals("reserved:")) { cmd = AltosLib.AO_LOG_BARO_RESERVED; config_a = Integer.parseInt(tokens[2]); } else if (tokens[1].equals("sens:")) { cmd = AltosLib.AO_LOG_BARO_SENS; config_a = Integer.parseInt(tokens[2]); } else if (tokens[1].equals("off:")) { cmd = AltosLib.AO_LOG_BARO_OFF; config_a = Integer.parseInt(tokens[2]); } else if (tokens[1].equals("tcs:")) { cmd = AltosLib.AO_LOG_BARO_TCS; config_a = Integer.parseInt(tokens[2]); } else if (tokens[1].equals("tco:")) { cmd = AltosLib.AO_LOG_BARO_TCO; config_a = Integer.parseInt(tokens[2]); } else if (tokens[1].equals("tref:")) { cmd = AltosLib.AO_LOG_BARO_TREF; config_a = Integer.parseInt(tokens[2]); } else if (tokens[1].equals("tempsens:")) { cmd = AltosLib.AO_LOG_BARO_TEMPSENS; config_a = Integer.parseInt(tokens[2]); } else if (tokens[1].equals("crc:")) { cmd = AltosLib.AO_LOG_BARO_CRC; config_a = Integer.parseInt(tokens[2]); } else { cmd = AltosLib.AO_LOG_INVALID; data = tokens[2]; } } else if (tokens[0].equals("IMU") && tokens[1].equals("cal")) { cmd = AltosLib.AO_LOG_IMU_CAL; config_a = Integer.parseInt(tokens[3]); config_b = Integer.parseInt(tokens[5]); config_c = Integer.parseInt(tokens[7]); } else if (tokens[0].equals("Pad") && tokens[1].equals("orientation:")) { cmd = AltosLib.AO_LOG_PAD_ORIENTATION; config_a = Integer.parseInt(tokens[2]); } else valid = false; } catch (Exception e) { valid = false; } } static public LinkedList read(FileInputStream input) { LinkedList headers = new LinkedList(); for (;;) { try { String line = AltosLib.gets(input); if (line == null) break; AltosEepromHeader header = new AltosEepromHeader(line); headers.add(header); if (header.last) break; } catch (IOException ie) { break; } } return headers; } static public void write (PrintStream out, LinkedList headers) { out.printf("# Comments\n"); for (AltosEepromHeader header : headers) { header.write(out); } } public AltosEepromHeader (String line) { this(line.split("\\s+")); } }