]> git.gag.com Git - fw/altos/blobdiff - altoslib/AltosConvert.java
doc: Add 1.9.22 release notes
[fw/altos] / altoslib / AltosConvert.java
index 3e1796b2c194bfbeb212a9adbe675a0917642201..a478881ea585d3031ee2372a6a88e5268e0d8b9b 100644 (file)
@@ -49,21 +49,21 @@ public class AltosConvert {
 
        private static final double GRAVITATIONAL_ACCELERATION = -gravity;
        private static final double AIR_GAS_CONSTANT            = 287.053;
 
        private static final double GRAVITATIONAL_ACCELERATION = -gravity;
        private static final double AIR_GAS_CONSTANT            = 287.053;
-       private static final double NUMBER_OF_LAYERS            = 7;
-       private static final double MAXIMUM_ALTITUDE            = 84852.0;
-       private static final double MINIMUM_PRESSURE            = 0.3734;
+       private static final double MAXIMUM_ALTITUDE            = 100000.0;
+       private static final double MINIMUM_PRESSURE            = 0.023439;
        private static final double LAYER0_BASE_TEMPERATURE     = 288.15;
        private static final double LAYER0_BASE_PRESSURE        = 101325;
 
        /* lapse rate and base altitude for each layer in the atmosphere */
        private static final double[] lapse_rate = {
        private static final double LAYER0_BASE_TEMPERATURE     = 288.15;
        private static final double LAYER0_BASE_PRESSURE        = 101325;
 
        /* lapse rate and base altitude for each layer in the atmosphere */
        private static final double[] lapse_rate = {
-               -0.0065, 0.0, 0.001, 0.0028, 0.0, -0.0028, -0.002
+               -0.0065, 0.0, 0.001, 0.0028, 0.0, -0.0028, -0.002, 0,
        };
 
        };
 
-       private static final int[] base_altitude = {
-               0, 11000, 20000, 32000, 47000, 51000, 71000
+       private static final double[] base_altitude = {
+               0, 11000, 20000, 32000, 47000, 51000, 71000, 84852,
        };
 
        };
 
+       private static final int NUMBER_OF_LAYERS               = base_altitude.length;
        /* outputs atmospheric pressure associated with the given altitude.
         * altitudes are measured with respect to the mean sea level
         */
        /* outputs atmospheric pressure associated with the given altitude.
         * altitudes are measured with respect to the mean sea level
         */
@@ -128,25 +128,21 @@ public class AltosConvert {
                double next_base_pressure = LAYER0_BASE_PRESSURE;
 
                double altitude;
                double next_base_pressure = LAYER0_BASE_PRESSURE;
 
                double altitude;
-               double base_pressure;
-               double base_temperature;
+               double base_pressure = 0;
+               double base_temperature = 0;
                double base; /* base for function to determine base pressure of next layer */
                double exponent; /* exponent for function to determine base pressure
                                    of next layer */
                double coefficient;
                int layer_number; /* identifies layer in the atmosphere */
                double base; /* base for function to determine base pressure of next layer */
                double exponent; /* exponent for function to determine base pressure
                                    of next layer */
                double coefficient;
                int layer_number; /* identifies layer in the atmosphere */
-               int delta_z; /* difference between two altitudes */
+               double delta_z; /* difference between two altitudes */
 
 
-               if (pressure < 0)  /* illegal pressure */
-                       return -1;
                if (pressure < MINIMUM_PRESSURE) /* FIX ME: use sensor data to improve model */
                if (pressure < MINIMUM_PRESSURE) /* FIX ME: use sensor data to improve model */
-                       return MAXIMUM_ALTITUDE;
+                       pressure = MINIMUM_PRESSURE;
 
                /* calculate the base temperature and pressure for the atmospheric layer
                   associated with the inputted pressure. */
 
                /* calculate the base temperature and pressure for the atmospheric layer
                   associated with the inputted pressure. */
-               layer_number = -1;
-               do {
-                       layer_number++;
+               for (layer_number = 0; layer_number < NUMBER_OF_LAYERS - 1; layer_number++) {
                        base_pressure = next_base_pressure;
                        base_temperature = next_base_temperature;
                        delta_z = base_altitude[layer_number + 1] - base_altitude[layer_number];
                        base_pressure = next_base_pressure;
                        base_temperature = next_base_temperature;
                        delta_z = base_altitude[layer_number + 1] - base_altitude[layer_number];
@@ -162,8 +158,9 @@ public class AltosConvert {
                                next_base_pressure *= Math.pow(base, exponent);
                        }
                        next_base_temperature += delta_z * lapse_rate[layer_number];
                                next_base_pressure *= Math.pow(base, exponent);
                        }
                        next_base_temperature += delta_z * lapse_rate[layer_number];
+                       if (pressure >= next_base_pressure)
+                               break;
                }
                }
-               while(layer_number < NUMBER_OF_LAYERS - 1 && pressure < next_base_pressure);
 
                /* calculate the altitude associated with the inputted pressure */
                if (lapse_rate[layer_number] == 0.0) {
 
                /* calculate the altitude associated with the inputted pressure */
                if (lapse_rate[layer_number] == 0.0) {
@@ -181,6 +178,9 @@ public class AltosConvert {
                                + coefficient * (Math.pow(base, exponent) - 1);
                }
 
                                + coefficient * (Math.pow(base, exponent) - 1);
                }
 
+               if (altitude > MAXIMUM_ALTITUDE)
+                       altitude = MAXIMUM_ALTITUDE;
+
                return altitude;
        }
 
                return altitude;
        }
 
@@ -224,15 +224,49 @@ public class AltosConvert {
                return raw / 4095.0;
        }
 
                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)
        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;
        }
 
                return AltosLib.MISSING;
        }
 
-       static double mega_pyro_voltage(int raw) {
+       static double mega_pyro_voltage_30v(int raw) {
                if (raw != AltosLib.MISSING)
                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;
        }
 
                return AltosLib.MISSING;
        }
 
@@ -270,6 +304,19 @@ public class AltosConvert {
                return sensor / 4095.0 * supply * (5.6 + 10.0) / 10.0;
        }
 
                return sensor / 4095.0 * supply * (5.6 + 10.0) / 10.0;
        }
 
+       static double tele_gps_3_voltage(int sensor) {
+               double  supply = 3.3;
+
+               return sensor / 32767.0 * supply * (5.6 + 10.0) / 10.0;
+       }
+
+       /* STM32F042 */
+       static double tele_gps_4_voltage(int sensor) {
+               double  supply = 3.3;
+
+               return sensor / 4095.0 * supply * (5.6 + 10.0) / 10.0;
+       }
+
        static double tele_bt_3_battery(int raw) {
                if (raw == AltosLib.MISSING)
                        return AltosLib.MISSING;
        static double tele_bt_3_battery(int raw) {
                if (raw == AltosLib.MISSING)
                        return AltosLib.MISSING;
@@ -311,6 +358,10 @@ public class AltosConvert {
                return easy_mini_2_adc(sensor) * supply * 127/27;
        }
 
                return easy_mini_2_adc(sensor) * supply * 127/27;
        }
 
+       static double easy_mini_3_voltage(int sensor) {
+               return easy_mini_1_voltage(sensor, 10000);
+       }
+
        static double motor_pressure(double voltage) {
                double  base = 0.5;
                double  max = 4.5;
        static double motor_pressure(double voltage) {
                double  base = 0.5;
                double  max = 4.5;
@@ -549,7 +600,7 @@ public class AltosConvert {
 
        public static int beep_freq_to_value(double freq) {
                if (freq == 0)
 
        public static int beep_freq_to_value(double freq) {
                if (freq == 0)
-                       return 94;
+                       return 0;
                return (int) Math.floor (1.0/2.0 * (24.0e6/32.0) / freq + 0.5);
        }
 
                return (int) Math.floor (1.0/2.0 * (24.0e6/32.0) / freq + 0.5);
        }