]> git.gag.com Git - fw/altos/commitdiff
Add 30v pyro voltage range support
authorKeith Packard <keithp@keithp.com>
Sat, 22 Mar 2025 22:24:01 +0000 (15:24 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 22 Mar 2025 22:24:01 +0000 (15:24 -0700)
TeleMega v7.0 uses new voltage dividers so that the pyro voltage can
range up to 30v. This means there are new telemetry and log formats.

Split out easy timer, telemetrum and telemega voltage conversion funcs
and use the as appropriate.

Signed-off-by: Keith Packard <keithp@keithp.com>
12 files changed:
altoslib/AltosConvert.java
altoslib/AltosEepromRecordMega.java
altoslib/AltosEepromRecordMetrum.java
altoslib/AltosEepromRecordTimer.java
altoslib/AltosIdleFetch.java
altoslib/AltosLib.java
altoslib/AltosSensorMega.java
altoslib/AltosSensorMetrum.java
altoslib/AltosTelemetry.java
altoslib/AltosTelemetryMegaData.java
altoslib/AltosTelemetryMetrumSensor.java
altoslib/AltosTelemetryStandard.java

index e692cbf044a969f6be15d6b596d2f4808d27761a..9ffb37c7beeb21739a0e389a3baf1ab3a6b6b5e1 100644 (file)
@@ -224,15 +224,49 @@ public class AltosConvert {
                return raw / 4095.0;
        }
 
+       static double stm_adc(int raw) {
+               return raw / 4095.0;
+       }
+
+       static public double easy_timer_battery_voltage(int v_batt) {
+               if (v_batt != AltosLib.MISSING)
+                       return 3.3 * stm_adc(v_batt) * (5.6 + 10.0) / 10.0;
+               return AltosLib.MISSING;
+       }
+
+       static double easy_timer_pyro_voltage_15v(int raw) {
+               if (raw != AltosLib.MISSING)
+                       return 3.3 * stm_adc(raw) * (100.0 + 27.0) / 27.0;
+               return AltosLib.MISSING;
+       }
+
+       static public double metrum_battery_voltage(int v_batt) {
+               if (v_batt != AltosLib.MISSING)
+                       return 3.3 * stm_adc(v_batt) * (5.6 + 10.0) / 10.0;
+               return AltosLib.MISSING;
+       }
+
+       static double metrum_pyro_voltage(int raw) {
+               if (raw != AltosLib.MISSING)
+                       return 3.3 * stm_adc(raw) * (100.0 + 27.0) / 27.0;
+               return AltosLib.MISSING;
+       }
+
        static public double mega_battery_voltage(int v_batt) {
                if (v_batt != AltosLib.MISSING)
-                       return 3.3 * mega_adc(v_batt) * (5.6 + 10.0) / 10.0;
+                       return 3.3 * stm_adc(v_batt) * (5.6 + 10.0) / 10.0;
+               return AltosLib.MISSING;
+       }
+
+       static double mega_pyro_voltage_15v(int raw) {
+               if (raw != AltosLib.MISSING)
+                       return 3.3 * stm_adc(raw) * (100.0 + 27.0) / 27.0;
                return AltosLib.MISSING;
        }
 
-       static double mega_pyro_voltage(int raw) {
+       static double mega_pyro_voltage_30v(int raw) {
                if (raw != AltosLib.MISSING)
-                       return 3.3 * mega_adc(raw) * (100.0 + 27.0) / 27.0;
+                       return 3.3 * stm_adc(raw) * (100.0 + 12.0) / 12.0;
                return AltosLib.MISSING;
        }
 
index bf94b676c4bf795738effd637d54350f93375223..fab17b49819b5ce2270f34092f10ecb7fc5457f5 100644 (file)
@@ -290,6 +290,15 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
        private int sense(int i) { return data16(6 + i * 2); }
        private int pyro() { return data16(26); }
 
+       private double pyro_voltage(int sense) {
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_7:
+                       return AltosConvert.mega_pyro_voltage_30v(sense);
+               default:
+                       return AltosConvert.mega_pyro_voltage_15v(sense);
+               }
+       }
+
        /* AO_LOG_GPS_TIME elements */
        private int latitude() { return data32(0); }
        private int longitude() { return data32(4); }
@@ -374,16 +383,16 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                        break;
                case AltosLib.AO_LOG_TEMP_VOLT:
                        listener.set_battery_voltage(AltosConvert.mega_battery_voltage(v_batt()));
-                       listener.set_pyro_voltage(AltosConvert.mega_pyro_voltage(v_pbatt()));
+                       listener.set_pyro_voltage(pyro_voltage(v_pbatt()));
 
                        int nsense = nsense();
 
-                       listener.set_apogee_voltage(AltosConvert.mega_pyro_voltage(sense(nsense-2)));
-                       listener.set_main_voltage(AltosConvert.mega_pyro_voltage(sense(nsense-1)));
+                       listener.set_apogee_voltage(pyro_voltage(sense(nsense-2)));
+                       listener.set_main_voltage(pyro_voltage(sense(nsense-1)));
 
                        double voltages[] = new double[nsense-2];
                        for (int i = 0; i < nsense-2; i++)
-                               voltages[i] = AltosConvert.mega_pyro_voltage(sense(i));
+                               voltages[i] = pyro_voltage(sense(i));
 
                        listener.set_igniter_voltage(voltages);
                        listener.set_pyro_fired(pyro());
index 848f4fb16eecd682d530ec20a976a7efa9bf2ba8..13cc6982eea64aa306b95fefae82c7264eefc3ce 100644 (file)
@@ -86,9 +86,9 @@ public class AltosEepromRecordMetrum extends AltosEepromRecord {
                        listener.set_acceleration(cal_data.acceleration(accel()));
                        break;
                case AltosLib.AO_LOG_TEMP_VOLT:
-                       listener.set_battery_voltage(AltosConvert.mega_battery_voltage(v_batt()));
-                       listener.set_apogee_voltage(AltosConvert.mega_pyro_voltage(sense_a()));
-                       listener.set_main_voltage(AltosConvert.mega_pyro_voltage(sense_m()));
+                       listener.set_battery_voltage(AltosConvert.metrum_battery_voltage(v_batt()));
+                       listener.set_apogee_voltage(AltosConvert.metrum_pyro_voltage(sense_a()));
+                       listener.set_main_voltage(AltosConvert.metrum_pyro_voltage(sense_m()));
                        break;
                case AltosLib.AO_LOG_GPS_POS:
                        gps = listener.make_temp_gps(false);
index 91dcb6a3346bcb2df40db7820024dc28cab3646c..1d3f733ae86eda570f9074412a293eb97f81328b 100644 (file)
@@ -135,17 +135,17 @@ public class AltosEepromRecordTimer extends AltosEepromRecord {
 
                        listener.set_acceleration(cal_data.acceleration(accel()));
 
-                       listener.set_battery_voltage(AltosConvert.mega_battery_voltage(v_batt()));
-                       listener.set_pyro_voltage(AltosConvert.mega_pyro_voltage(v_pbatt()));
+                       listener.set_battery_voltage(AltosConvert.easy_timer_battery_voltage(v_batt()));
+                       listener.set_pyro_voltage(AltosConvert.easy_timer_pyro_voltage_15v(v_pbatt()));
 
                        int nsense = nsense();
 
-                       listener.set_apogee_voltage(AltosConvert.mega_pyro_voltage(sense(nsense-2)));
-                       listener.set_main_voltage(AltosConvert.mega_pyro_voltage(sense(nsense-1)));
+                       listener.set_apogee_voltage(AltosConvert.easy_timer_pyro_voltage_15v(sense(nsense-2)));
+                       listener.set_main_voltage(AltosConvert.easy_timer_pyro_voltage_15v(sense(nsense-1)));
 
                        double voltages[] = new double[nsense-2];
                        for (int i = 0; i < nsense-2; i++)
-                               voltages[i] = AltosConvert.mega_pyro_voltage(sense(i));
+                               voltages[i] = AltosConvert.easy_timer_pyro_voltage_15v(sense(i));
 
                        listener.set_igniter_voltage(voltages);
                        listener.set_pyro_fired(pyro());
index 2f230923587e95c474a5b0b510c18ae4e992222b..65b329d4e821d8fba7bcbb090def1f2c60bcb9c2 100644 (file)
@@ -253,6 +253,12 @@ public class AltosIdleFetch implements AltosDataProvider {
                               AltosIdler.idle_ms5607,
                               AltosIdler.idle_imu, AltosIdler.idle_mag,
                               AltosIdler.idle_sensor_mega),
+               new AltosIdler("TeleMega-v7",
+                              AltosIdler.idle_gps,
+                              AltosIdler.idle_adxl375,
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_imu, AltosIdler.idle_mag,
+                              AltosIdler.idle_sensor_mega),
                new AltosIdler("EasyMega-v1",
                               AltosIdler.idle_mma655x,
                               AltosIdler.idle_ms5607,
index dd2a4baea86563e24ad5a305e8f649dd84ba1d5c..af945165dcb9b329effa03d58065c8867708a6f4 100644 (file)
@@ -420,6 +420,7 @@ public class AltosLib {
        public static final int AO_LOG_FORMAT_TELEMEGA_6 = 22;
        public static final int AO_LOG_FORMAT_EASYTIMER_2 = 23;
        public static final int AO_LOG_FORMAT_EASYMEGA_3 = 24;
+       public static final int AO_LOG_FORMAT_TELEMEGA_7 = 25;
        public static final int AO_LOG_FORMAT_NONE = 127;
 
        public static final int model_mpu6000 = 0;
index 076acc6252dec7b97c93fac5215954ee5af874c9..e42117814a07ff5016061d25c254b3e0a176929c 100644 (file)
@@ -21,6 +21,7 @@ package org.altusmetrum.altoslib_14;
 import java.util.concurrent.TimeoutException;
 
 class AltosSensorMega {
+       int             log_format;
        int             tick;
        int[]           sense;
        int             v_batt;
@@ -33,6 +34,7 @@ class AltosSensorMega {
 
        public AltosSensorMega(AltosLink link) throws InterruptedException, TimeoutException {
                this();
+               log_format = link.config_data().log_format;
                String[] items = link.adc();
                for (int i = 0; i < items.length;) {
                        if (items[i].equals("tick:")) {
@@ -89,17 +91,30 @@ class AltosSensorMega {
                }
        }
 
+       double pyro_voltage(int sense) {
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_7:
+                       return AltosConvert.mega_pyro_voltage_30v(sense);
+               default:
+                       return AltosConvert.mega_pyro_voltage_15v(sense);
+               }
+       }
+
+       double battery_voltage(int sense) {
+               return AltosConvert.mega_battery_voltage(sense);
+       }
+
        static public void provide_data(AltosDataListener listener, AltosLink link) throws InterruptedException {
                try {
                        AltosSensorMega sensor_mega = new AltosSensorMega(link);
 
-                       listener.set_battery_voltage(AltosConvert.mega_battery_voltage(sensor_mega.v_batt));
-                       listener.set_apogee_voltage(AltosConvert.mega_pyro_voltage(sensor_mega.sense[4]));
-                       listener.set_main_voltage(AltosConvert.mega_pyro_voltage(sensor_mega.sense[5]));
+                       listener.set_battery_voltage(sensor_mega.battery_voltage(sensor_mega.v_batt));
+                       listener.set_apogee_voltage(sensor_mega.pyro_voltage(sensor_mega.sense[4]));
+                       listener.set_main_voltage(sensor_mega.pyro_voltage(sensor_mega.sense[5]));
 
                        double[]        igniter_voltage = new double[4];
                        for (int i = 0; i < 4; i++)
-                               igniter_voltage[i] = AltosConvert.mega_pyro_voltage(sensor_mega.sense[i]);
+                               igniter_voltage[i] = sensor_mega.pyro_voltage(sensor_mega.sense[i]);
                        listener.set_igniter_voltage(igniter_voltage);
 
                } catch (TimeoutException te) {
index 591be15bebb289cafce2b26c4d4cf503e888e333..420e51b8cfa8e2ad5fb548b5dea6a113b7781553 100644 (file)
@@ -56,9 +56,9 @@ class AltosSensorMetrum {
        static public void provide_data(AltosDataListener listener, AltosLink link) throws InterruptedException {
                try {
                        AltosSensorMetrum       sensor_metrum = new AltosSensorMetrum(link);
-                       listener.set_battery_voltage(AltosConvert.mega_battery_voltage(sensor_metrum.v_batt));
-                       listener.set_apogee_voltage(AltosConvert.mega_pyro_voltage(sensor_metrum.sense_a));
-                       listener.set_main_voltage(AltosConvert.mega_pyro_voltage(sensor_metrum.sense_m));
+                       listener.set_battery_voltage(AltosConvert.metrum_battery_voltage(sensor_metrum.v_batt));
+                       listener.set_apogee_voltage(AltosConvert.metrum_pyro_voltage(sensor_metrum.sense_a));
+                       listener.set_main_voltage(AltosConvert.metrum_pyro_voltage(sensor_metrum.sense_m));
                } catch (TimeoutException te) {
                }
        }
index 5fa5fc3bbb9955676dfa96c3391ace005bccd808..8dbb939c56dffd84e2fc0af9842ab4fd52236cc1 100644 (file)
@@ -75,7 +75,7 @@ public abstract class AltosTelemetry implements AltosDataProvider {
        final static int packet_type_satellite = 0x06;
        final static int packet_type_companion = 0x07;
        final static int packet_type_mega_sensor_mpu = 0x08;
-       final static int packet_type_mega_data = 0x09;
+       final static int packet_type_mega_data_15v = 0x09;
        final static int packet_type_metrum_sensor = 0x0a;
        final static int packet_type_metrum_data = 0x0b;
        final static int packet_type_mini2 = 0x10;
@@ -83,6 +83,7 @@ public abstract class AltosTelemetry implements AltosDataProvider {
        final static int packet_type_mega_sensor_bmx160 = 0x12;
        final static int packet_type_mega_norm_mpu6000_mmc5983 = 0x13;
        final static int packet_type_mega_norm_bmi088_mmc5983 = 0x14;
+       final static int packet_type_mega_data_30v = 0x15;
 
        static AltosTelemetry parse_hex(String hex)  throws ParseException, AltosCRCException {
                AltosTelemetry  telem = null;
index 3e1e3c95d1fff00cb8958088803a204e79b61bc6..33ca648e3bc867e048a5697662b95f1eb0d68c82 100644 (file)
@@ -41,20 +41,29 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {
                super(bytes);
        }
 
+       double pyro_voltage(int sense) {
+               switch (type()) {
+               case AltosTelemetry.packet_type_mega_data_30v:
+                       return AltosConvert.mega_pyro_voltage_30v(sense);
+               default:
+                       return AltosConvert.mega_pyro_voltage_15v(sense);
+               }
+       }
+
        public void provide_data(AltosDataListener listener) {
                super.provide_data(listener);
 
                listener.set_state(state());
 
                listener.set_battery_voltage(AltosConvert.mega_battery_voltage(v_batt()));
-               listener.set_pyro_voltage(AltosConvert.mega_pyro_voltage(v_pyro()));
+               listener.set_pyro_voltage(pyro_voltage(v_pyro()));
 
-               listener.set_apogee_voltage(AltosConvert.mega_pyro_voltage(sense(4)));
-               listener.set_main_voltage(AltosConvert.mega_pyro_voltage(sense(5)));
+               listener.set_apogee_voltage(pyro_voltage(sense(4)));
+               listener.set_main_voltage(pyro_voltage(sense(5)));
 
                double voltages[] = new double[4];
                for (int i = 0; i < 4; i++)
-                       voltages[i] = AltosConvert.mega_pyro_voltage(sense(i));
+                       voltages[i] = pyro_voltage(sense(i));
 
                listener.set_igniter_voltage(voltages);
 
index b26bff64e2f842365e8f35c056fa2e906a20089f..d1abd6dba260332efdb4d78bbf2c3994d4aec31a 100644 (file)
@@ -49,9 +49,9 @@ public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {
 
                listener.set_kalman(height_16(), speed()/16.0, acceleration()/16.0);
 
-               listener.set_battery_voltage(AltosConvert.mega_battery_voltage(v_batt()));
+               listener.set_battery_voltage(AltosConvert.metrum_battery_voltage(v_batt()));
 
-               listener.set_apogee_voltage(AltosConvert.mega_pyro_voltage(sense_a()));
-               listener.set_main_voltage(AltosConvert.mega_pyro_voltage(sense_m()));
+               listener.set_apogee_voltage(AltosConvert.metrum_pyro_voltage(sense_a()));
+               listener.set_main_voltage(AltosConvert.metrum_pyro_voltage(sense_m()));
        }
 }
index bea217c82dcbe10ad00497df323018a226ec5536..0cb0066b9bf28520142dfd907aa65e4c5f1e3b50 100644 (file)
@@ -81,7 +81,8 @@ public abstract class AltosTelemetryStandard extends AltosTelemetry {
                case packet_type_mega_sensor_bmx160:
                        telem = new AltosTelemetryMegaSensor(bytes, AltosIMU.imu_type_telemega_v4);
                        break;
-               case packet_type_mega_data:
+               case packet_type_mega_data_15v:
+               case packet_type_mega_data_30v:
                        telem = new AltosTelemetryMegaData(bytes);
                        break;
                case packet_type_metrum_sensor: