altoslib: Start restructuring AltosState harder
[fw/altos] / altoslib / AltosEepromTM.java
diff --git a/altoslib/AltosEepromTM.java b/altoslib/AltosEepromTM.java
new file mode 100644 (file)
index 0000000..fc7ec32
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * 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;
+       }
+}