diff options
Diffstat (limited to 'altoslib/AltosConfigData.java')
| -rw-r--r-- | altoslib/AltosConfigData.java | 184 | 
1 files changed, 184 insertions, 0 deletions
| diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java new file mode 100644 index 00000000..4ad4e58a --- /dev/null +++ b/altoslib/AltosConfigData.java @@ -0,0 +1,184 @@ +/* + * Copyright © 2011 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.AltosLib; + +import java.io.*; +import java.util.*; +import java.text.*; +import java.util.prefs.*; +import java.util.concurrent.*; +import org.altusmetrum.AltosLib.*; + +public class AltosConfigData implements Iterable<String> { + +	/* Version information */ +	public String	manufacturer; +	public String	product; +	public String	version; +	public int	log_format; +	public int	serial; + +	/* Strings returned */ +	public LinkedList<String>	lines; + +	/* Config information */ +	public int	config_major; +	public int	config_minor; +	public int	main_deploy; +	public int	apogee_delay; +	public int	radio_channel; +	public int	radio_setting; +	public int	radio_frequency; +	public String	callsign; +	public int	accel_cal_plus, accel_cal_minus; +	public int	radio_calibration; +	public int	flight_log_max; +	public int	ignite_mode; +	public int	stored_flight; +	public int	storage_size; +	public int	storage_erase_unit; + +	public static String get_string(String line, String label) throws  ParseException { +		if (line.startsWith(label)) { +			String	quoted = line.substring(label.length()).trim(); + +			if (quoted.startsWith("\"")) +				quoted = quoted.substring(1); +			if (quoted.endsWith("\"")) +				quoted = quoted.substring(0,quoted.length()-1); +			return quoted; +		} +		throw new ParseException("mismatch", 0); +	} + +	public static int get_int(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 > 0) +				return  Integer.parseInt(tokens[0]); +		} +		throw new ParseException("mismatch", 0); +	} + +	public Iterator<String> iterator() { +		return lines.iterator(); +	} + +	public int log_available() { +		switch (log_format) { +		case AltosLib.AO_LOG_FORMAT_TINY: +			if (stored_flight == 0) +				return 1; +			return 0; +		default: +			if (flight_log_max <= 0) +				return 1; +			int	log_space = storage_size - storage_erase_unit; +			int	log_used = stored_flight * flight_log_max; + +			if (log_used >= log_space) +				return 0; +			return (log_space - log_used) / flight_log_max; +		} +	} + +	int[] parse_version(String v) { +		String[] parts = v.split("\\."); +		int r[] = new int[parts.length]; + +		for (int i = 0; i < parts.length; i++) { +			try { +				r[i] = Altos.fromdec(parts[i]); +			} catch (NumberFormatException n) { +				r[i] = 0; +			} +		} + +		return r; +	} +	 +	public int compare_version(String other) { +		int[]	me = parse_version(version); +		int[]	them = parse_version(other); + +		int	l = Math.min(me.length, them.length); + +		for (int i = 0; i < l; i++) { +			int	d = me[i] - them[i]; +			if (d != 0) +				return d; +		} +		if (me.length > l) +			return 1; +		if (them.length > l) +			return -1; +		return 0; +	} + +	public AltosConfigData(AltosLink link) throws InterruptedException, TimeoutException { +		link.printf("c s\np\nf\nl\nv\n"); +		lines = new LinkedList<String>(); +		radio_setting = 0; +		radio_frequency = 0; +		stored_flight = 0; +		for (;;) { +			String line = link.get_reply(); +			if (line == null) +				throw new TimeoutException(); +			if (line.contains("Syntax error")) +				continue; +			lines.add(line); +			try { serial = get_int(line, "serial-number"); } catch (Exception e) {} +			try { log_format = get_int(line, "log-format"); } catch (Exception e) {} +			try { main_deploy = get_int(line, "Main deploy:"); } catch (Exception e) {} +			try { apogee_delay = get_int(line, "Apogee delay:"); } catch (Exception e) {} +			try { radio_channel = get_int(line, "Radio channel:"); } catch (Exception e) {} +			try { radio_setting = get_int(line, "Radio setting:"); } catch (Exception e) {} +			try { +				radio_frequency = get_int(line, "Frequency:"); +				if (radio_frequency < 0) +					radio_frequency = 434550; +			} catch (Exception e) {} +			try { +				if (line.startsWith("Accel cal")) { +					String[] bits = line.split("\\s+"); +					if (bits.length >= 6) { +						accel_cal_plus = Integer.parseInt(bits[3]); +						accel_cal_minus = Integer.parseInt(bits[5]); +					} +				} +			} catch (Exception e) {} +			try { radio_calibration = get_int(line, "Radio cal:"); } catch (Exception e) {} +			try { flight_log_max = get_int(line, "Max flight log:"); } catch (Exception e) {} +			try { ignite_mode = get_int(line, "Ignite mode:"); } catch (Exception e) {} +			try { callsign = get_string(line, "Callsign:"); } catch (Exception e) {} +			try { version = get_string(line,"software-version"); } catch (Exception e) {} +			try { product = get_string(line,"product"); } catch (Exception e) {} + +			try { get_int(line, "flight"); stored_flight++; }  catch (Exception e) {} +			try { storage_size = get_int(line, "Storage size:"); } catch (Exception e) {} +			try { storage_erase_unit = get_int(line, "Storage erase unit"); } catch (Exception e) {} + +			/* signals the end of the version info */ +			if (line.startsWith("software-version")) +				break; +		} +	} + +}
\ No newline at end of file | 
