X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altoslib%2FAltosConfigData.java;h=9462ae6f4d62f8b9eae3b01a442436d711e53ee3;hp=515ff480e705a41452040e86bd4514fa97f9f6e2;hb=ae1174317fc476e39077f7dc257ec08709c6b301;hpb=b26e837a6f18641aae9372aab22168849ff10812 diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 515ff480..9462ae6f 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.AltosLib; +package org.altusmetrum.altoslib_4; import java.util.*; import java.text.*; @@ -29,6 +29,7 @@ public class AltosConfigData implements Iterable { public int serial; public int flight; public int log_format; + public int log_space; public String version; /* Strings returned */ @@ -67,6 +68,12 @@ public class AltosConfigData implements Iterable { public int npyro; public int pyro; + /* HAS_APRS */ + public int aprs_interval; + + /* HAS_BEEP */ + public int beep; + /* Storage info replies */ public int storage_size; public int storage_erase_unit; @@ -74,6 +81,9 @@ public class AltosConfigData implements Iterable { /* Log listing replies */ public int stored_flight; + /* HAS_TRACKER */ + public int[] tracker_distances; + public static String get_string(String line, String label) throws ParseException { if (line.startsWith(label)) { String quoted = line.substring(label.length()).trim(); @@ -97,10 +107,40 @@ public class AltosConfigData implements Iterable { throw new ParseException("mismatch", 0); } + public static int[] get_distances(String line, String label) throws NumberFormatException, ParseException { + if (line.startsWith(label)) { + String tail = line.substring(label.length()).trim(); + String[] tokens = tail.split("\\s+"); + if (tokens.length > 1) { + int[] distances = new int[2]; + distances[0] = Integer.parseInt(tokens[0]); + distances[1] = Integer.parseInt(tokens[1]); + return distances; + } + } + throw new ParseException("mismatch", 0); + } + public Iterator iterator() { return lines.iterator(); } + public int log_space() { + if (log_space > 0) + return log_space; + + if (storage_size > 0) { + int space = storage_size; + + if (storage_erase_unit > 0 && use_flash_for_config()) + space -= storage_erase_unit; + + if (space > 0) + return space; + } + return 0; + } + public int log_available() { switch (log_format) { case AltosLib.AO_LOG_FORMAT_TINY: @@ -113,15 +153,31 @@ public class AltosConfigData implements Iterable { default: if (flight_log_max <= 0) return 1; - int log_space = storage_size - storage_erase_unit; - int log_used = stored_flight * flight_log_max; + int log_max = flight_log_max * 1024; + int log_space = log_space(); + int log_used; + + if (stored_flight <= 0) + log_used = 0; + else + log_used = stored_flight * log_max; + int log_avail; if (log_used >= log_space) - return 0; - return (log_space - log_used) / flight_log_max; + log_avail = 0; + else + log_avail = (log_space - log_used) / log_max; + + return log_avail; } } + public boolean has_monitor_battery() { + if (product.startsWith("TeleBT")) + return true; + return false; + } + int[] parse_version(String v) { String[] parts = v.split("\\."); int r[] = new int[parts.length]; @@ -163,6 +219,7 @@ public class AltosConfigData implements Iterable { serial = 0; flight = 0; log_format = AltosLib.AO_LOG_FORMAT_UNKNOWN; + log_space = -1; version = "unknown"; main_deploy = -1; @@ -189,9 +246,15 @@ public class AltosConfigData implements Iterable { npyro = 0; pyros = null; + aprs_interval = -1; + + beep = -1; + + tracker_distances = null; + storage_size = -1; storage_erase_unit = -1; - stored_flight = -1; + stored_flight = 0; } public void parse_line(String line) { @@ -202,6 +265,7 @@ public class AltosConfigData implements Iterable { try { serial = get_int(line, "serial-number"); } catch (Exception e) {} try { flight = get_int(line, "current-flight"); } catch (Exception e) {} try { log_format = get_int(line, "log-format"); } catch (Exception e) {} + try { log_space = get_int(line, "log-space"); } catch (Exception e) {} try { version = get_string(line, "software-version"); } catch (Exception e) {} /* Version also contains MS5607 info, which we ignore here */ @@ -262,9 +326,18 @@ public class AltosConfigData implements Iterable { } catch (Exception e) {} } + /* HAS_APRS */ + try { aprs_interval = get_int(line, "APRS interval:"); } catch (Exception e) {} + + /* HAS_BEEP */ + try { beep = get_int(line, "Beeper setting:"); } catch (Exception e) {} + + /* HAS_TRACKER */ + try { tracker_distances = get_distances(line, "Tracker setting:"); } catch (Exception e) {} + /* Storage info replies */ try { storage_size = get_int(line, "Storage size:"); } catch (Exception e) {} - try { storage_erase_unit = get_int(line, "Storage erase unit"); } catch (Exception e) {} + 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) {} @@ -312,6 +385,10 @@ public class AltosConfigData implements Iterable { public double frequency() { int channel = radio_channel; int setting = radio_setting; + + if (radio_frequency < 0 && channel < 0 && setting < 0) + return -1; + if (channel < 0) channel = 0; if (setting < 0) @@ -323,16 +400,16 @@ public class AltosConfigData implements Iterable { channel); } - public int log_limit() { - if (storage_size > 0 && storage_erase_unit > 0) { - int log_limit = storage_size - storage_erase_unit; - if (log_limit > 0) - return log_limit / 1024; - } - return 1024; + boolean use_flash_for_config() { + if (product.startsWith("TeleMega")) + return false; + if (product.startsWith("TeleMetrum-v2")) + return false; + return true; } - public void get_values(AltosConfigValues source) { + + public void get_values(AltosConfigValues source) throws AltosConfigDataException { /* HAS_FLIGHT */ if (main_deploy >= 0) @@ -367,6 +444,17 @@ public class AltosConfigData implements Iterable { /* AO_PYRO_NUM */ if (npyro > 0) pyros = source.pyros(); + + /* HAS_APRS */ + if (aprs_interval >= 0) + aprs_interval = source.aprs_interval(); + + /* HAS_BEEP */ + if (beep >= 0) + beep = source.beep(); + /* HAS_TRACKER */ + if (tracker_distances != null) + tracker_distances = source.tracker_distances(); } public void set_values(AltosConfigValues dest) { @@ -379,18 +467,23 @@ public class AltosConfigData implements Iterable { dest.set_radio_calibration(radio_calibration); dest.set_radio_frequency(frequency()); boolean max_enabled = true; + + if (log_space() == 0) + max_enabled = false; + switch (log_format) { case AltosLib.AO_LOG_FORMAT_TINY: max_enabled = false; break; default: - if (stored_flight >= 0) + if (stored_flight > 0) 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_limit()); + dest.set_flight_log_max_limit(log_space() / 1024); dest.set_flight_log_max(flight_log_max); dest.set_ignite_mode(ignite_mode); dest.set_pad_orientation(pad_orientation); @@ -399,6 +492,9 @@ public class AltosConfigData implements Iterable { dest.set_pyros(pyros); else dest.set_pyros(null); + dest.set_aprs_interval(aprs_interval); + dest.set_beep(beep); + dest.set_tracker_distances(tracker_distances); } public void save(AltosLink link, boolean remote) throws InterruptedException, TimeoutException { @@ -454,13 +550,25 @@ public class AltosConfigData implements Iterable { /* UI doesn't support AES key config */ /* AO_PYRO_NUM */ - if (pyros.length > 0) { + if (npyro > 0) { for (int p = 0; p < pyros.length; p++) { link.printf("c P %s\n", pyros[p].toString()); } } + /* HAS_APRS */ + if (aprs_interval >= 0) + link.printf("c A %d\n", aprs_interval); + + /* HAS_BEEP */ + if (beep >= 0) + link.printf("c b %d\n", beep); + + /* HAS_TRACKER */ + if (tracker_distances != null) + link.printf("c t %d %d\n", tracker_distances[0], tracker_distances[1]); + link.printf("c w\n"); link.flush_output(); } @@ -470,13 +578,14 @@ public class AltosConfigData implements Iterable { link.printf("c s\nf\nv\n"); read_link(link, "software-version"); switch (log_format) { - case AltosLib.AO_LOG_FORMAT_TELEMETRY: - case AltosLib.AO_LOG_FORMAT_TELESCIENCE: + case AltosLib.AO_LOG_FORMAT_UNKNOWN: + case AltosLib.AO_LOG_FORMAT_NONE: break; default: link.printf("l\n"); read_link(link, "done"); + break; } } -} \ No newline at end of file +}