From 6276dc0c563263b65558c1983abae8d48d41a1ed Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 22 Mar 2025 15:24:01 -0700 Subject: [PATCH] Add 30v pyro voltage range support 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 --- altoslib/AltosConvert.java | 40 ++++++++++++++++++++++-- altoslib/AltosEepromRecordMega.java | 17 +++++++--- altoslib/AltosEepromRecordMetrum.java | 6 ++-- altoslib/AltosEepromRecordTimer.java | 10 +++--- altoslib/AltosIdleFetch.java | 6 ++++ altoslib/AltosLib.java | 1 + altoslib/AltosSensorMega.java | 23 +++++++++++--- altoslib/AltosSensorMetrum.java | 6 ++-- altoslib/AltosTelemetry.java | 3 +- altoslib/AltosTelemetryMegaData.java | 17 +++++++--- altoslib/AltosTelemetryMetrumSensor.java | 6 ++-- altoslib/AltosTelemetryStandard.java | 3 +- 12 files changed, 107 insertions(+), 31 deletions(-) diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java index e692cbf0..9ffb37c7 100644 --- a/altoslib/AltosConvert.java +++ b/altoslib/AltosConvert.java @@ -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; } diff --git a/altoslib/AltosEepromRecordMega.java b/altoslib/AltosEepromRecordMega.java index bf94b676..fab17b49 100644 --- a/altoslib/AltosEepromRecordMega.java +++ b/altoslib/AltosEepromRecordMega.java @@ -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()); diff --git a/altoslib/AltosEepromRecordMetrum.java b/altoslib/AltosEepromRecordMetrum.java index 848f4fb1..13cc6982 100644 --- a/altoslib/AltosEepromRecordMetrum.java +++ b/altoslib/AltosEepromRecordMetrum.java @@ -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); diff --git a/altoslib/AltosEepromRecordTimer.java b/altoslib/AltosEepromRecordTimer.java index 91dcb6a3..1d3f733a 100644 --- a/altoslib/AltosEepromRecordTimer.java +++ b/altoslib/AltosEepromRecordTimer.java @@ -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()); diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java index 2f230923..65b329d4 100644 --- a/altoslib/AltosIdleFetch.java +++ b/altoslib/AltosIdleFetch.java @@ -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, diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index dd2a4bae..af945165 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -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; diff --git a/altoslib/AltosSensorMega.java b/altoslib/AltosSensorMega.java index 076acc62..e4211781 100644 --- a/altoslib/AltosSensorMega.java +++ b/altoslib/AltosSensorMega.java @@ -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) { diff --git a/altoslib/AltosSensorMetrum.java b/altoslib/AltosSensorMetrum.java index 591be15b..420e51b8 100644 --- a/altoslib/AltosSensorMetrum.java +++ b/altoslib/AltosSensorMetrum.java @@ -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) { } } diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 5fa5fc3b..8dbb939c 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -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; diff --git a/altoslib/AltosTelemetryMegaData.java b/altoslib/AltosTelemetryMegaData.java index 3e1e3c95..33ca648e 100644 --- a/altoslib/AltosTelemetryMegaData.java +++ b/altoslib/AltosTelemetryMegaData.java @@ -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); diff --git a/altoslib/AltosTelemetryMetrumSensor.java b/altoslib/AltosTelemetryMetrumSensor.java index b26bff64..d1abd6db 100644 --- a/altoslib/AltosTelemetryMetrumSensor.java +++ b/altoslib/AltosTelemetryMetrumSensor.java @@ -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())); } } diff --git a/altoslib/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java index bea217c8..0cb0066b 100644 --- a/altoslib/AltosTelemetryStandard.java +++ b/altoslib/AltosTelemetryStandard.java @@ -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: -- 2.47.2