X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altoslib%2FAltosConvert.java;h=ded4b36527cbfc92e6ba7beefbadcc9a31a3cbb1;hp=8617a12cea7a5def8d7062cde0f3aea11e4561d6;hb=HEAD;hpb=6804ead7f7e54ff34b257e10e381dc52d5a61b06 diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java index 8617a12c..a478881e 100644 --- a/altoslib/AltosConvert.java +++ b/altoslib/AltosConvert.java @@ -19,9 +19,14 @@ /* * Sensor data conversion functions */ -package org.altusmetrum.altoslib_11; +package org.altusmetrum.altoslib_14; + +import java.util.*; public class AltosConvert { + + public static final double gravity = 9.80665; + /* * Pressure Sensor Model, version 1.1 * @@ -42,23 +47,23 @@ public class AltosConvert { * in Joules/(kilogram-Kelvin). */ - public static final double GRAVITATIONAL_ACCELERATION = -9.80665; - public static final double AIR_GAS_CONSTANT = 287.053; - public static final double NUMBER_OF_LAYERS = 7; - public static final double MAXIMUM_ALTITUDE = 84852.0; - public static final double MINIMUM_PRESSURE = 0.3734; - public static final double LAYER0_BASE_TEMPERATURE = 288.15; - public static final double LAYER0_BASE_PRESSURE = 101325; + private static final double GRAVITATIONAL_ACCELERATION = -gravity; + private static final double AIR_GAS_CONSTANT = 287.053; + 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 */ - public static final double[] lapse_rate = { - -0.0065, 0.0, 0.001, 0.0028, 0.0, -0.0028, -0.002 + private static final double[] lapse_rate = { + -0.0065, 0.0, 0.001, 0.0028, 0.0, -0.0028, -0.002, 0, }; - public 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 */ @@ -123,25 +128,21 @@ public class AltosConvert { 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 */ - 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 */ - return MAXIMUM_ALTITUDE; + pressure = MINIMUM_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]; @@ -157,8 +158,9 @@ public class AltosConvert { 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) { @@ -176,9 +178,24 @@ public class AltosConvert { + coefficient * (Math.pow(base, exponent) - 1); } + if (altitude > MAXIMUM_ALTITUDE) + altitude = MAXIMUM_ALTITUDE; + return altitude; } + public static double degrees_to_radians(double degrees) { + if (degrees == AltosLib.MISSING) + return AltosLib.MISSING; + return degrees * (Math.PI / 180.0); + } + + public static double radians_to_degrees(double radians) { + if (radians == AltosLib.MISSING) + return AltosLib.MISSING; + return radians * (180.0 / Math.PI); + } + public static double cc_battery_to_voltage(double battery) { @@ -186,7 +203,7 @@ public class AltosConvert { } public static double - cc_ignitor_to_voltage(double ignite) + cc_igniter_to_voltage(double ignite) { return ignite / 32767 * 15.0; } @@ -207,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; } @@ -241,19 +292,50 @@ public class AltosConvert { return sensor / 32767.0 * supply * 127/27; } - static double tele_gps_voltage(int sensor) { + static double tele_gps_1_voltage(int sensor) { double supply = 3.3; return sensor / 32767.0 * supply * (5.6 + 10.0) / 10.0; } + static double tele_gps_2_voltage(int sensor) { + double supply = 3.3; + + 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; return 3.3 * mega_adc(raw) * (5.1 + 10.0) / 10.0; } - static double easy_mini_voltage(int sensor, int serial) { + static double easy_timer_voltage(int sensor) { + return 3.3 * mega_adc(sensor) * (100.0 + 27.0) / 27.0; + } + + static double easy_mini_2_adc(double raw) { + return raw / 4095.0; + } + + static double easy_mini_1_adc(double raw) { + return raw / 32767.0; + } + + static double easy_mini_1_voltage(int sensor, int serial) { double supply = 3.3; double diode_offset = 0.0; @@ -267,7 +349,55 @@ public class AltosConvert { if (serial < 1665) diode_offset = 0.150; - return sensor / 32767.0 * supply * 127/27 + diode_offset; + return easy_mini_1_adc(sensor) * supply * 127/27 + diode_offset; + } + + static double easy_mini_2_voltage(int sensor) { + double supply = 3.3; + + 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; + double full_scale_pressure = psi_to_pa(1600); + + if (voltage < base) + voltage = base; + if (voltage > max) + voltage = max; + return (voltage - base) / (max - base) * full_scale_pressure; + } + + static double easy_motor_3_adc(double raw) { + return raw / 32767.0; + } + + static double easy_motor_3_voltage(int sensor) { + double supply = 3.3; + + return easy_motor_3_adc(sensor) * supply * 15.6 / 10.0; + } + + static double easy_motor_2_motor_pressure(int sensor, double ground_sensor) { + double supply = 3.3; + double ground_voltage = easy_mini_2_adc(ground_sensor) * supply * 15.6 / 10.0; + double voltage = easy_mini_2_adc(sensor) * supply * 15.6 / 10.0; + + return motor_pressure(voltage) - motor_pressure(ground_voltage); + } + + static double easy_motor_3_motor_pressure(int sensor, double ground_sensor) { + double supply = 3.3; + double ground_voltage = easy_motor_3_adc(ground_sensor) * supply * 15.6 / 10.0; + double voltage = easy_motor_3_adc(sensor) * supply * 15.6 / 10.0; + + return motor_pressure(voltage) - motor_pressure(ground_voltage); } public static double radio_to_frequency(int freq, int setting, int cal, int channel) { @@ -305,6 +435,10 @@ public class AltosConvert { return 434.550 + channel * 0.100; } + public static int telem_to_rssi(int telem) { + return telem / 2 - 74; + } + public static int[] ParseHex(String line) { String[] tokens = line.split("\\s+"); int[] array = new int[tokens.length]; @@ -370,12 +504,48 @@ public class AltosConvert { return psi * 6894.76; } + public static double pa_to_psi(double pa) { + return pa / 6894.76; + } + + public static double n_to_lb(double n) { + return n * 0.22480894; + } + + public static double lb_to_n(double lb) { + return lb / 0.22480894; + } + + public static double acceleration_from_sensor(double sensor, double plus_g, double minus_g, double ground) { + + if (sensor == AltosLib.MISSING) + return AltosLib.MISSING; + + if (plus_g == AltosLib.MISSING || minus_g == AltosLib.MISSING) + return AltosLib.MISSING; + + if (ground == AltosLib.MISSING) + ground = plus_g; + + double counts_per_g = (plus_g - minus_g) / 2.0; + double counts_per_mss = counts_per_g / gravity; + + if (counts_per_mss == 0) + return AltosLib.MISSING; + + return (sensor - ground) / counts_per_mss; + } + public static boolean imperial_units = false; public static AltosDistance distance = new AltosDistance(); public static AltosHeight height = new AltosHeight(); + public static AltosPressure pressure = new AltosPressure(); + + public static AltosForce force = new AltosForce(); + public static AltosSpeed speed = new AltosSpeed(); public static AltosAccel accel = new AltosAccel(); @@ -390,6 +560,14 @@ public class AltosConvert { public static AltosLongitude longitude = new AltosLongitude(); + public static AltosRotationRate rotation_rate = new AltosRotationRate(); + + public static AltosStateName state_name = new AltosStateName(); + + public static AltosPyroName pyro_name = new AltosPyroName(); + + public static AltosUnits magnetic_field = new AltosGauss(); + public static String show_gs(String format, double a) { a = meters_to_g(a); format = format.concat(" g"); @@ -407,6 +585,13 @@ public class AltosConvert { return csum & 0xff; } + public static int checksum(List data, int start, int length) { + int csum = 0x5a; + for (int i = 0; i < length; i++) + csum += data.get(i+start); + return csum & 0xff; + } + public static double beep_value_to_freq(int value) { if (value == 0) return 4000; @@ -415,7 +600,7 @@ public class AltosConvert { 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); }