Update java library versions
[fw/altos] / altoslib / AltosEepromTM.java
index fc7ec32108a653978b689c30fbc9f90059bba036..316058e2141b1adc4079057fd17865fbe479a42c 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_1;
+package org.altusmetrum.altoslib_9;
 
+import java.io.*;
+import java.util.*;
 import java.text.*;
 
-public class AltosEepromTM implements AltosStateUpdate {
-       public int      cmd;
-       public int      tick;
+public class AltosEepromTM extends AltosEeprom {
        public int      a;
        public int      b;
-       public String   data;
-       public boolean  tick_valid;
 
        public static final int record_length = 8;
 
+       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) {
-               state.set_tick(tick);
+               super.update_state(state);
+
+               AltosGPS        gps;
+
+               /* Flush any pending GPS changes */
+               if (state.gps_pending) {
+                       switch (cmd) {
+                       case AltosLib.AO_LOG_GPS_LAT:
+                       case AltosLib.AO_LOG_GPS_LON:
+                       case AltosLib.AO_LOG_GPS_ALT:
+                       case AltosLib.AO_LOG_GPS_SAT:
+                       case AltosLib.AO_LOG_GPS_DATE:
+                               break;
+                       default:
+                               state.set_temp_gps();
+                               break;
+                       }
+               }
+
                switch (cmd) {
                case AltosLib.AO_LOG_FLIGHT:
-                       state.ground_accel = a;
-                       state.flight = b;
+                       state.set_state(AltosLib.ao_flight_pad);
+                       state.set_ground_accel(a);
+                       state.set_flight(b);
                        state.set_boost_tick(tick);
-                       state.time = 0;
                        break;
                case AltosLib.AO_LOG_SENSOR:
-                       state.set_telemetrum(a, b);
+                       state.set_accel(a);
+                       state.set_pressure(AltosConvert.barometer_to_pressure(b));
                        break;
                case AltosLib.AO_LOG_PRESSURE:
-                       state.set_telemetrum(AltosState.MISSING, b);
+                       state.set_pressure(AltosConvert.barometer_to_pressure(b));
                        break;
                case AltosLib.AO_LOG_TEMP_VOLT:
-/*
-                       
-                       record.temp = a;
-                       record.batt = b;
-                       eeprom_state.seen |= AltosRecord.seen_temp_volt;
-*/
+                       state.set_temperature(AltosConvert.thermometer_to_temperature(a));
+                       state.set_battery_voltage(AltosConvert.cc_battery_to_voltage(b));
                        break;
                case AltosLib.AO_LOG_DEPLOY:
-/*
-                       record.drogue = a;
-                       record.main = b;
-                       eeprom_state.seen |= AltosRecord.seen_deploy;
-                       has_ignite = true;
-*/
+                       state.set_apogee_voltage(AltosConvert.cc_ignitor_to_voltage(a));
+                       state.set_main_voltage(AltosConvert.cc_ignitor_to_voltage(b));
                        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:
+                       state.set_state(a);
                        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;
+               case AltosLib.AO_LOG_GPS_TIME:
+                       gps = state.make_temp_gps(false);
+
+                       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;
                        break;
-               case AltosLib.AO_LOG_RADIO_CAL:
+               case AltosLib.AO_LOG_GPS_LAT:
+                       gps = state.make_temp_gps(false);
+
+                       int lat32 = a | (b << 16);
+                       gps.lat = (double) lat32 / 1e7;
                        break;
-               case AltosLib.AO_LOG_MANUFACTURER:
+               case AltosLib.AO_LOG_GPS_LON:
+                       gps = state.make_temp_gps(false);
+
+                       int lon32 = a | (b << 16);
+                       gps.lon = (double) lon32 / 1e7;
                        break;
-               case AltosLib.AO_LOG_PRODUCT:
+               case AltosLib.AO_LOG_GPS_ALT:
+                       gps = state.make_temp_gps(false);
+                       gps.alt = a;
                        break;
-               case AltosLib.AO_LOG_SERIAL_NUMBER:
-                       state.serial = a;
+               case AltosLib.AO_LOG_GPS_SAT:
+                       gps = state.make_temp_gps(true);
+                       int svid = a;
+                       int c_n0 = b >> 8;
+                       gps.add_sat(svid, c_n0);
                        break;
-               case AltosLib.AO_LOG_SOFTWARE_VERSION:
+               case AltosLib.AO_LOG_GPS_DATE:
+                       gps = state.make_temp_gps(false);
+                       gps.year = (a & 0xff) + 2000;
+                       gps.month = a >> 8;
+                       gps.day = b & 0xff;
                        break;
                }
        }
@@ -152,10 +130,10 @@ public class AltosEepromTM implements AltosStateUpdate {
        public AltosEepromTM (AltosEepromChunk chunk, int start) throws ParseException {
 
                cmd = chunk.data(start);
-               tick_valid = true;
+               valid = true;
 
-               tick_valid = !chunk.erased(start, record_length);
-               if (tick_valid) {
+               valid = !chunk.erased(start, record_length);
+               if (valid) {
                        if (AltosConvert.checksum(chunk.data, start, record_length) != 0)
                                throw new ParseException(String.format("invalid checksum at 0x%x",
                                                                       chunk.address + start), 0);
@@ -166,19 +144,15 @@ public class AltosEepromTM implements AltosStateUpdate {
                tick = chunk.data16(start + 2);
                a = chunk.data16(start + 4);
                b = chunk.data16(start + 6);
-
-               data = null;
        }
 
        public AltosEepromTM (String line) {
-               tick_valid = false;
+               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+");
@@ -186,70 +160,46 @@ public class AltosEepromTM implements AltosStateUpdate {
                                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;
+                                               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;
+                               cmd = AltosLib.AO_LOG_INVALID;
                        }
                }
        }
 
        public AltosEepromTM(int in_cmd, int in_tick, int in_a, int in_b) {
-               tick_valid = true;
+               valid = true;
                cmd = in_cmd;
                tick = in_tick;
                a = in_a;
                b = in_b;
        }
+
+       static public LinkedList<AltosEeprom> read(FileInputStream input) {
+               LinkedList<AltosEeprom> tms = new LinkedList<AltosEeprom>();
+
+               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;
+       }
+
 }