first cut at turnon scripts for EasyTimer v2
[fw/altos] / altoslib / AltosConfigData.java
index 48dab421b148c391e74fb03ed2240e7f0140cc18..6b980be6b641dd784e06c020d07a743eea036b0c 100644 (file)
@@ -16,7 +16,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_13;
+package org.altusmetrum.altoslib_14;
 
 import java.util.*;
 import java.text.*;
@@ -78,16 +78,26 @@ public class AltosConfigData {
        public int              aprs_interval;
        public int              aprs_ssid;
        public int              aprs_format;
+       public int              aprs_offset;
 
        /* HAS_BEEP */
        public int              beep;
 
+       /* HAS_RADIO_10MW */
+       public int              radio_10mw;
+
+       public int              report_feet;
+
+       /* HAS_GPS_MOSAIC */
+       public int              gps_receiver;
+
        /* Storage info replies */
        public int      storage_size;
        public int      storage_erase_unit;
 
        /* Log listing replies */
        public int      stored_flight;
+       public AltosEepromFlight[] flights;
 
        /* HAS_TRACKER */
        public int      tracker_motion;
@@ -161,7 +171,7 @@ public class AltosConfigData {
        public int log_available() {
                switch (log_format) {
                case AltosLib.AO_LOG_FORMAT_TINY:
-                       if (stored_flight == 0)
+                       if (flights == null)
                                return 1;
                        return 0;
                case AltosLib.AO_LOG_FORMAT_TELEMETRY:
@@ -174,10 +184,10 @@ public class AltosConfigData {
                        int     log_space = log_space();
                        int     log_used;
 
-                       if (stored_flight <= 0)
+                       if (flights == null)
                                log_used = 0;
                        else
-                               log_used = stored_flight * log_max;
+                               log_used = flights.length * log_max;
                        int     log_avail;
 
                        if (log_used >= log_space)
@@ -197,16 +207,39 @@ public class AltosConfigData {
                case AltosLib.AO_LOG_FORMAT_FULL:
                        return 0x7fff - value;
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
-               case AltosLib.AO_LOG_FORMAT_TELEMETRUM:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
                        return 4095 - value;
+               case AltosLib.AO_LOG_FORMAT_TELEMETRUM:
+                       /*
+                        * TeleMetrum v2 and later use the same log format, but
+                        * have different accelerometers. This is the only place
+                        * it matters in altoslib.
+                        */
+                       if (product.startsWith("TeleMetrum-v2"))
+                               return 4095 - value;
+                       /* fall through */
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_EASYMOTOR:
+                       /* ADXL375 */
+                       return -value;
+               case AltosLib.AO_LOG_FORMAT_EASYTIMER_2:
+                       /* BMI088 */
+                       return -value;
                default:
+                       if (product.startsWith("EasyTimer-"))
+                               return -value;
                        return AltosLib.MISSING;
                }
        }
 
        public boolean has_monitor_battery() {
+               if (product == null)
+                       return false;
                if (product.startsWith("TeleBT"))
                        return true;
                return false;
@@ -293,15 +326,23 @@ public class AltosConfigData {
                aprs_interval = AltosLib.MISSING;
                aprs_ssid = AltosLib.MISSING;
                aprs_format = AltosLib.MISSING;
+               aprs_offset = AltosLib.MISSING;
 
                beep = AltosLib.MISSING;
 
+               radio_10mw = AltosLib.MISSING;
+
+               report_feet = AltosLib.MISSING;
+
+               gps_receiver = AltosLib.MISSING;
+
                tracker_motion = AltosLib.MISSING;
                tracker_interval = AltosLib.MISSING;
 
                storage_size = AltosLib.MISSING;
                storage_erase_unit = AltosLib.MISSING;
-               stored_flight = AltosLib.MISSING;
+               stored_flight = 0;
+               flights = null;
 
                accel_zero_along = AltosLib.MISSING;
                accel_zero_across = AltosLib.MISSING;
@@ -311,10 +352,17 @@ public class AltosConfigData {
        /* Return + accel calibration relative to a specific pad orientation */
        public int accel_cal_plus(int pad_orientation) {
                adjust_accel_cal();
+               if (!accel_cal_adjusted)
+                       return AltosLib.MISSING;
+
                switch (pad_orientation) {
                case AltosLib.AO_PAD_ORIENTATION_ANTENNA_UP:
+               case AltosLib.AO_PAD_ORIENTATION_WORDS_UPRIGHT:
+               case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_UP:
                        return accel_cal_plus_cooked;
                case AltosLib.AO_PAD_ORIENTATION_ANTENNA_DOWN:
+               case AltosLib.AO_PAD_ORIENTATION_WORDS_UPSIDEDOWN:
+               case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_DOWN:
                        return invert_accel_value(accel_cal_minus_cooked);
                default:
                        return AltosLib.MISSING;
@@ -324,10 +372,17 @@ public class AltosConfigData {
        /* Return - accel calibration relative to a specific pad orientation */
        public int accel_cal_minus(int pad_orientation) {
                adjust_accel_cal();
+               if (!accel_cal_adjusted)
+                       return AltosLib.MISSING;
+
                switch (pad_orientation) {
                case AltosLib.AO_PAD_ORIENTATION_ANTENNA_UP:
+               case AltosLib.AO_PAD_ORIENTATION_WORDS_UPRIGHT:
+               case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_UP:
                        return accel_cal_minus_cooked;
                case AltosLib.AO_PAD_ORIENTATION_ANTENNA_DOWN:
+               case AltosLib.AO_PAD_ORIENTATION_WORDS_UPSIDEDOWN:
+               case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_DOWN:
                        return invert_accel_value(accel_cal_plus_cooked);
                default:
                        return AltosLib.MISSING;
@@ -339,18 +394,22 @@ public class AltosConfigData {
         */
        private void adjust_accel_cal() {
                if (!accel_cal_adjusted &&
+                   product != null &&
                    pad_orientation != AltosLib.MISSING &&
                    accel_cal_plus != AltosLib.MISSING &&
-                   accel_cal_minus != AltosLib.MISSING &&
-                   log_format != AltosLib.AO_LOG_FORMAT_UNKNOWN)
+                   accel_cal_minus != AltosLib.MISSING)
                {
                        switch (pad_orientation) {
                        case AltosLib.AO_PAD_ORIENTATION_ANTENNA_UP:
+                       case AltosLib.AO_PAD_ORIENTATION_WORDS_UPRIGHT:
+                       case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_UP:
                                accel_cal_plus_cooked = accel_cal_plus;
                                accel_cal_minus_cooked = accel_cal_minus;
                                accel_cal_adjusted = true;
                                break;
                        case AltosLib.AO_PAD_ORIENTATION_ANTENNA_DOWN:
+                       case AltosLib.AO_PAD_ORIENTATION_WORDS_UPSIDEDOWN:
+                       case AltosLib.AO_PAD_ORIENTATION_BIG_PARTS_DOWN:
                                accel_cal_plus_cooked = invert_accel_value(accel_cal_minus);
                                accel_cal_minus_cooked = invert_accel_value(accel_cal_plus);
                                accel_cal_adjusted = true;
@@ -462,10 +521,18 @@ public class AltosConfigData {
                try { aprs_interval = get_int(line, "APRS interval:"); } catch (Exception e) {}
                try { aprs_ssid = get_int(line, "APRS SSID:"); } catch (Exception e) {}
                try { aprs_format = get_int(line, "APRS format:"); } catch (Exception e) {}
+               try { aprs_offset = get_int(line, "APRS offset:"); } catch (Exception e) {}
 
                /* HAS_BEEP */
                try { beep = get_int(line, "Beeper setting:"); } catch (Exception e) {}
 
+               /* HAS_RADIO_10MW */
+               try { radio_10mw = get_int(line, "Radio 10mw limit:"); } catch (Exception e) {}
+
+               try { report_feet = get_int(line, "Report in feet:"); } catch (Exception e) {}
+
+               try { gps_receiver = get_int(line, "GPS receiver:"); } catch (Exception e) {}
+
                /* HAS_TRACKER */
                try {
                        int[] values = get_values(line, "Tracker setting:");
@@ -478,7 +545,32 @@ public class AltosConfigData {
                try { storage_erase_unit = get_int(line, "Storage erase unit:"); } catch (Exception e) {}
 
                /* Log listing replies */
-               try { get_int(line, "flight"); stored_flight++; }  catch (Exception e) {}
+               try {
+                       int flight = get_int(line, "flight");
+                       String[] tokens = line.split("\\s+");
+                       if (tokens.length >= 6) {
+                               int     start = -1, end = -1;
+                               try {
+                                       if (tokens[2].equals("start"))
+                                               start = AltosParse.parse_hex(tokens[3]);
+                                       if (tokens[4].equals("end"))
+                                               end = AltosParse.parse_hex(tokens[5]);
+                                       if (flight != 0 && start >= 0 && end > 0) {
+                                               int len;
+                                               if (flights == null)
+                                                       len = 0;
+                                               else
+                                                       len = flights.length;
+                                               AltosEepromFlight [] new_flights = new AltosEepromFlight[len + 1];
+                                               for (int i = 0; i < len; i++)
+                                                       new_flights[i] = flights[i];
+                                               new_flights[len] = new AltosEepromFlight(flight, start, end);
+                                               flights = new_flights;
+                                               stored_flight = flights.length;
+                                       }
+                               } catch (ParseException pe) { System.out.printf("Parse error %s\n", pe.toString()); }
+                       }
+               }  catch (Exception e) {}
 
                /* HAS_GYRO */
                try {
@@ -491,9 +583,6 @@ public class AltosConfigData {
                                }
                        }
                } catch (Exception e) {}
-
-               /* Fix accel cal as soon as all of the necessary values appear */
-               adjust_accel_cal();
        }
 
        public AltosConfigData() {
@@ -561,6 +650,10 @@ public class AltosConfigData {
                        return false;
                if (product.startsWith("TeleMetrum-v2"))
                        return false;
+               if (product.startsWith("TeleMetrum-v3"))
+                       return false;
+               if (product.startsWith("TeleMetrum-v4"))
+                       return true;
                if (product.startsWith("EasyMega"))
                        return false;
                return true;
@@ -581,6 +674,51 @@ public class AltosConfigData {
                throw new AltosUnknownProduct(product);
        }
 
+       public boolean adxl375_inverted() throws AltosUnknownProduct {
+               if (product != null) {
+                       if (product.startsWith("EasyMega-v2"))
+                               return true;
+                       if (product.startsWith("TeleMetrum-v3"))
+                               return true;
+                       if (product.startsWith("TeleMetrum-v4"))
+                               return true;
+                       if (product.startsWith("TeleMega-v4"))
+                               return true;
+                       if (product.startsWith("TeleMega-v5"))
+                               return true;
+                       if (product.startsWith("TeleMega-v6"))
+                               return true;
+                       if (product.startsWith("EasyMotor-v2"))
+                               return true;
+                       if (product.startsWith("EasyMotor-v3"))
+                               return true;
+               }
+               throw new AltosUnknownProduct(product);
+       }
+
+       public int adxl375_axis() throws AltosUnknownProduct {
+               if (product != null) {
+                       if (product.startsWith("EasyMega-v2"))
+                               return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("TeleMetrum-v3"))
+                               return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("TeleMetrum-v4"))
+                               return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("TeleMega-v4"))
+                               return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("TeleMega-v5"))
+                               return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("TeleMega-v6"))
+                               return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("EasyMotor-v2"))
+                               return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("EasyMotor-v3"))
+                               return AltosAdxl375.X_AXIS;
+
+               }
+               throw new AltosUnknownProduct(product);
+       }
+
        public void get_values(AltosConfigValues source) throws AltosConfigDataException {
 
                /* HAS_FLIGHT */
@@ -632,10 +770,23 @@ public class AltosConfigData {
                        aprs_ssid = source.aprs_ssid();
                if (aprs_format != AltosLib.MISSING)
                        aprs_format = source.aprs_format();
+               if (aprs_offset != AltosLib.MISSING)
+                       aprs_offset = source.aprs_offset();
 
                /* HAS_BEEP */
                if (beep != AltosLib.MISSING)
                        beep = source.beep();
+
+               /* HAS_RADIO_10MW */
+               if (radio_10mw != AltosLib.MISSING)
+                       radio_10mw = source.radio_10mw();
+
+               if (report_feet != AltosLib.MISSING)
+                       report_feet = source.report_feet();
+
+               if (gps_receiver != AltosLib.MISSING)
+                       gps_receiver = source.gps_receiver();
+
                /* HAS_TRACKER */
                if (tracker_motion != AltosLib.MISSING)
                        tracker_motion = source.tracker_motion();
@@ -667,14 +818,14 @@ public class AltosConfigData {
                        max_enabled = false;
                        break;
                default:
-                       if (stored_flight != AltosLib.MISSING)
+                       if (flights != null)
                                max_enabled = false;
                        break;
                }
 
                dest.set_flight_log_max_enabled(max_enabled);
                dest.set_radio_enable(radio_enable);
-               dest.set_flight_log_max_limit(log_space() / 1024);
+               dest.set_flight_log_max_limit(log_space() >> 10, storage_erase_unit >> 10);
                dest.set_flight_log_max(flight_log_max);
                dest.set_ignite_mode(ignite_mode);
                dest.set_pad_orientation(pad_orientation);
@@ -689,7 +840,11 @@ public class AltosConfigData {
                dest.set_aprs_interval(aprs_interval);
                dest.set_aprs_ssid(aprs_ssid);
                dest.set_aprs_format(aprs_format);
+               dest.set_aprs_offset(aprs_offset);
                dest.set_beep(beep);
+               dest.set_radio_10mw(radio_10mw);
+               dest.set_report_feet(report_feet);
+               dest.set_gps_receiver(gps_receiver);
                dest.set_tracker_motion(tracker_motion);
                dest.set_tracker_interval(tracker_interval);
        }
@@ -722,33 +877,28 @@ public class AltosConfigData {
                                                        has_setting,
                                                        radio_calibration);
                        /* When remote, reset the dongle frequency at the same time */
-                       if (remote) {
-                               link.flush_output();
+                       if (remote && frequency != link.frequency) {
                                link.stop_remote();
                                link.set_radio_frequency(frequency);
-                               link.flush_output();
                                link.start_remote();
                        }
                }
 
                if (telemetry_rate != AltosLib.MISSING) {
                        link.printf("c T %d\n", telemetry_rate);
-                       if (remote) {
-                               link.flush_output();
+                       if (remote && telemetry_rate != link.telemetry_rate) {
                                link.stop_remote();
                                link.set_telemetry_rate(telemetry_rate);
-                               link.flush_output();
                                link.start_remote();
                        }
                }
 
                if (callsign != null) {
                        link.printf("c c %s\n", callsign);
-                       if (remote) {
-                               link.flush_output();
+                       if (remote && !callsign.equals(link.callsign)) {
+                               System.out.printf("changing link callsign from %s to %s\n", link.callsign, callsign);
                                link.stop_remote();
                                link.set_callsign(callsign);
-                               link.flush_output();
                                link.start_remote();
                        }
                }
@@ -762,11 +912,25 @@ public class AltosConfigData {
                        link.printf("c o %d\n", pad_orientation);
                int plus = accel_cal_plus(pad_orientation);
                int minus = accel_cal_minus(pad_orientation);
-               if (plus != AltosLib.MISSING && minus != AltosLib.MISSING)
-                       link.printf("c a %d %d\n", plus, minus);
+               if (plus != AltosLib.MISSING && minus != AltosLib.MISSING) {
+                       if (plus < 0)
+                               plus = 65536 + plus;
+                       if (minus < 0)
+                               minus = 65536 + minus;
+                       if (accel_zero_along != AltosLib.MISSING &&
+                           accel_zero_across != AltosLib.MISSING &&
+                           accel_zero_through != AltosLib.MISSING)
+                               link.printf("c a %d %d %d %d %d\n",
+                                           plus, minus,
+                                           accel_zero_along,
+                                           accel_zero_across,
+                                           accel_zero_through);
+                       else
+                               link.printf("c a %d %d\n", plus, minus);
+               }
 
                /* HAS_LOG */
-               if (flight_log_max != 0)
+               if (flight_log_max != 0 && flight_log_max != AltosLib.MISSING)
                        link.printf("c l %d\n", flight_log_max);
 
                /* HAS_IGNITE */
@@ -793,11 +957,24 @@ public class AltosConfigData {
                        link.printf("c S %d\n", aprs_ssid);
                if (aprs_format != AltosLib.MISSING)
                        link.printf("c C %d\n", aprs_format);
+               if (aprs_offset != AltosLib.MISSING)
+                       link.printf("c O %d\n", aprs_offset);
 
                /* HAS_BEEP */
                if (beep != AltosLib.MISSING)
                        link.printf("c b %d\n", beep);
 
+               /* HAS_RADIO_10MW */
+               if (radio_10mw != AltosLib.MISSING)
+                       link.printf("c p %d\n", radio_10mw);
+
+               if (report_feet != AltosLib.MISSING)
+                       link.printf("c u %d\n", report_feet);
+
+               /* HAS_GPS_MOSAIC */
+               if (gps_receiver != AltosLib.MISSING)
+                       link.printf("c g %d\n", gps_receiver);
+
                /* HAS_TRACKER */
                if (tracker_motion != AltosLib.MISSING && tracker_interval != AltosLib.MISSING)
                        link.printf("c t %d %d\n", tracker_motion, tracker_interval);
@@ -806,7 +983,7 @@ public class AltosConfigData {
                /* UI doesn't support accel cal */
 
                link.printf("c w\n");
-               link.flush_output();
+               read_link(link, "Saved");
        }
 
        public AltosConfigData(AltosLink link) throws InterruptedException, TimeoutException {
@@ -822,5 +999,6 @@ public class AltosConfigData {
                        read_link(link, "done");
                        break;
                }
+               adjust_accel_cal();
        }
 }