diff options
| -rw-r--r-- | altoslib/AltosConfigData.java | 30 | ||||
| -rw-r--r-- | altoslib/AltosConfigValues.java | 4 | ||||
| -rw-r--r-- | altosui/AltosConfigUI.java | 171 | ||||
| -rw-r--r-- | telegps/TeleGPSConfigUI.java | 199 | 
4 files changed, 381 insertions, 23 deletions
diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index e5c546ff..83c184cd 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -80,6 +80,9 @@ public class AltosConfigData implements Iterable<String> {  	/* 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(); @@ -103,6 +106,20 @@ public class AltosConfigData implements Iterable<String> {  		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<String> iterator() {  		return lines.iterator();  	} @@ -215,6 +232,8 @@ public class AltosConfigData implements Iterable<String> {  		beep = -1; +		tracker_distances = null; +  		storage_size = -1;  		storage_erase_unit = -1;  		stored_flight = 0; @@ -294,6 +313,9 @@ public class AltosConfigData implements Iterable<String> {  		/* 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) {} @@ -424,6 +446,9 @@ public class AltosConfigData implements Iterable<String> {  		/* 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) { @@ -463,6 +488,7 @@ public class AltosConfigData implements Iterable<String> {  			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 { @@ -533,6 +559,10 @@ public class AltosConfigData implements Iterable<String> {  		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();  	} diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index b7c0c6ed..37af2ed5 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -80,4 +80,8 @@ public interface AltosConfigValues {  	public abstract int beep();  	public abstract void set_beep(int new_beep); + +	public abstract int[] tracker_distances(); + +	public abstract void set_tracker_distances(int[] tracker_distances);  } diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java index 3ec3cdb0..2a9d727d 100644 --- a/altosui/AltosConfigUI.java +++ b/altosui/AltosConfigUI.java @@ -46,6 +46,8 @@ public class AltosConfigUI  	JLabel			pad_orientation_label;  	JLabel			callsign_label;  	JLabel			beep_label; +	JLabel			tracker_horiz_label; +	JLabel			tracker_vert_label;  	public boolean		dirty; @@ -65,6 +67,8 @@ public class AltosConfigUI  	JComboBox<String>	pad_orientation_value;  	JTextField		callsign_value;  	JComboBox<String>	beep_value; +	JComboBox<String>	tracker_horiz_value; +	JComboBox<String>	tracker_vert_value;  	JButton			pyro; @@ -125,6 +129,34 @@ public class AltosConfigUI  		"Antenna Down",  	}; +	static String[]		tracker_horiz_values_m = { +		"250", +		"500", +		"1000", +		"2000" +	}; + +	static String[]		tracker_horiz_values_ft = { +		"500", +		"1000", +		"2500", +		"5000" +	}; + +	static String[]		tracker_vert_values_m = { +		"25", +		"50", +		"100", +		"200" +	}; + +	static String[]		tracker_vert_values_ft = { +		"50", +		"100", +		"250", +		"500" +	}; +  	/* A window listener to catch closing events and tell the config code */  	class ConfigListener extends WindowAdapter {  		AltosConfigUI	ui; @@ -610,6 +642,57 @@ public class AltosConfigUI  		set_beep_tool_tip();  		row++; +		/* Tracker triger horiz distances */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = row; +		c.gridwidth = 4; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		c.ipady = 5; +		tracker_horiz_label = new JLabel(get_tracker_horiz_label()); +		pane.add(tracker_horiz_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 4; c.gridy = row; +		c.gridwidth = 4; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		c.ipady = 5; +		tracker_horiz_value = new JComboBox<String>(tracker_horiz_values()); +		tracker_horiz_value.setEditable(true); +		tracker_horiz_value.addItemListener(this); +		pane.add(tracker_horiz_value, c); +		row++; + +		/* Tracker triger vert distances */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = row; +		c.gridwidth = 4; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		c.ipady = 5; +		tracker_vert_label = new JLabel(get_tracker_vert_label()); +		pane.add(tracker_vert_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 4; c.gridy = row; +		c.gridwidth = 4; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		c.ipady = 5; +		tracker_vert_value = new JComboBox<String>(tracker_vert_values()); +		tracker_vert_value.setEditable(true); +		tracker_vert_value.addItemListener(this); +		pane.add(tracker_vert_value, c); +		set_tracker_tool_tip(); +		row++; +  		/* Pyro channels */  		c = new GridBagConstraints();  		c.gridx = 4; c.gridy = row; @@ -814,6 +897,20 @@ public class AltosConfigUI  		set_main_deploy_values();  		int m = (int) (AltosConvert.height.parse(v, !imperial_units) + 0.5);  		set_main_deploy(m); + +		if (tracker_horiz_value.isEnabled() && tracker_vert_value.isEnabled()) { +			String th = tracker_horiz_value.getSelectedItem().toString(); +			String tv = tracker_vert_value.getSelectedItem().toString(); +			tracker_horiz_label.setText(get_tracker_horiz_label()); +			tracker_vert_label.setText(get_tracker_vert_label()); +			set_tracker_horiz_values(); +			set_tracker_vert_values(); +			int[] t = { +				(int) (AltosConvert.height.parse(th, !imperial_units) + 0.5), +				(int) (AltosConvert.height.parse(tv, !imperial_units) + 0.5) +			}; +			set_tracker_distances(t); +		}  	}  	public void set_apogee_delay(int new_apogee_delay) { @@ -969,6 +1066,80 @@ public class AltosConfigUI  			return -1;  	} +	String[] tracker_horiz_values() { +		if (AltosConvert.imperial_units) +			return tracker_horiz_values_ft; +		else +			return tracker_horiz_values_m; +	} + +	void set_tracker_horiz_values() { +		String[]	v = tracker_horiz_values(); +		while (tracker_horiz_value.getItemCount() > 0) +			tracker_horiz_value.removeItemAt(0); +		for (int i = 0; i < v.length; i++) +			tracker_horiz_value.addItem(v[i]); +		tracker_horiz_value.setMaximumRowCount(v.length); +	} + +	String get_tracker_horiz_label() { +		return String.format("Logging Trigger Horizontal (%s):", AltosConvert.height.show_units()); +	} + +	String[] tracker_vert_values() { +		if (AltosConvert.imperial_units) +			return tracker_vert_values_ft; +		else +			return tracker_vert_values_m; +	} + +	void set_tracker_vert_values() { +		String[]	v = tracker_vert_values(); +		while (tracker_vert_value.getItemCount() > 0) +			tracker_vert_value.removeItemAt(0); +		for (int i = 0; i < v.length; i++) +			tracker_vert_value.addItem(v[i]); +		tracker_vert_value.setMaximumRowCount(v.length); +	} + +	void set_tracker_tool_tip() { +		if (tracker_horiz_value.isEnabled()) +			tracker_horiz_value.setToolTipText("How far the device must move before logging is enabled"); +		else +			tracker_horiz_value.setToolTipText("This device doesn't disable logging before motion"); +		if (tracker_vert_value.isEnabled()) +			tracker_vert_value.setToolTipText("How far the device must move before logging is enabled"); +		else +			tracker_vert_value.setToolTipText("This device doesn't disable logging before motion"); +	} + +	String get_tracker_vert_label() { +		return String.format("Logging Trigger Vertical (%s):", AltosConvert.height.show_units()); +	} + +	public void set_tracker_distances(int[] tracker_distances) { +		if (tracker_distances != null) { +			tracker_horiz_value.setSelectedItem(AltosConvert.height.say(tracker_distances[0])); +			tracker_vert_value.setSelectedItem(AltosConvert.height.say(tracker_distances[1])); +			tracker_horiz_value.setEnabled(true); +			tracker_vert_value.setEnabled(true); +		} else { +			tracker_horiz_value.setEnabled(false); +			tracker_vert_value.setEnabled(false); +		} +	} + +	public int[] tracker_distances() { +		if (tracker_horiz_value.isEnabled() && tracker_vert_value.isEnabled()) { +			int[] t = { +				(int) (AltosConvert.height.parse(tracker_horiz_value.getSelectedItem().toString()) + 0.5), +				(int) (AltosConvert.height.parse(tracker_vert_value.getSelectedItem().toString()) + 0.5), +			}; +			return t; +		} +		return null; +	} +  	public void set_pyros(AltosPyro[] new_pyros) {  		pyros = new_pyros;  		pyro.setVisible(pyros != null); diff --git a/telegps/TeleGPSConfigUI.java b/telegps/TeleGPSConfigUI.java index d1f66eef..863d61bb 100644 --- a/telegps/TeleGPSConfigUI.java +++ b/telegps/TeleGPSConfigUI.java @@ -26,7 +26,7 @@ import org.altusmetrum.altosuilib_2.*;  public class TeleGPSConfigUI  	extends AltosUIDialog -	implements ActionListener, ItemListener, DocumentListener, AltosConfigValues +	implements ActionListener, ItemListener, DocumentListener, AltosConfigValues, AltosUnitsListener  {  	Container		pane; @@ -40,6 +40,8 @@ public class TeleGPSConfigUI  	JLabel			aprs_interval_label;  	JLabel			flight_log_max_label;  	JLabel			callsign_label; +	JLabel			tracker_horiz_label; +	JLabel			tracker_vert_label;  	public boolean		dirty; @@ -53,6 +55,8 @@ public class TeleGPSConfigUI  	JComboBox<String>	aprs_interval_value;  	JComboBox<String>	flight_log_max_value;  	JTextField		callsign_value; +	JComboBox<String>	tracker_horiz_value; +	JComboBox<String>	tracker_vert_value;  	JButton			save;  	JButton			reset; @@ -74,6 +78,34 @@ public class TeleGPSConfigUI  		"10"  	}; +	static String[]		tracker_horiz_values_m = { +		"250", +		"500", +		"1000", +		"2000" +	}; + +	static String[]		tracker_horiz_values_ft = { +		"500", +		"1000", +		"2500", +		"5000" +	}; + +	static String[]		tracker_vert_values_m = { +		"25", +		"50", +		"100", +		"200" +	}; + +	static String[]		tracker_vert_values_ft = { +		"50", +		"100", +		"250", +		"500" +	}; +  	/* A window listener to catch closing events and tell the config code */  	class ConfigListener extends WindowAdapter {  		TeleGPSConfigUI	ui; @@ -362,6 +394,57 @@ public class TeleGPSConfigUI  		set_flight_log_max_tool_tip();  		row++; +		/* Tracker triger horiz distances */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = row; +		c.gridwidth = 4; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		c.ipady = 5; +		tracker_horiz_label = new JLabel(get_tracker_horiz_label()); +		pane.add(tracker_horiz_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 4; c.gridy = row; +		c.gridwidth = 4; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		c.ipady = 5; +		tracker_horiz_value = new JComboBox<String>(tracker_horiz_values()); +		tracker_horiz_value.setEditable(true); +		tracker_horiz_value.addItemListener(this); +		pane.add(tracker_horiz_value, c); +		row++; + +		/* Tracker triger vert distances */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = row; +		c.gridwidth = 4; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		c.ipady = 5; +		tracker_vert_label = new JLabel(get_tracker_vert_label()); +		pane.add(tracker_vert_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 4; c.gridy = row; +		c.gridwidth = 4; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		c.ipady = 5; +		tracker_vert_value = new JComboBox<String>(tracker_vert_values()); +		tracker_vert_value.setEditable(true); +		tracker_vert_value.addItemListener(this); +		pane.add(tracker_vert_value, c); +		set_tracker_tool_tip(); +		row++; +  		/* Buttons */  		c = new GridBagConstraints();  		c.gridx = 0; c.gridy = row; @@ -408,6 +491,7 @@ public class TeleGPSConfigUI  		close.setActionCommand("Close");  		addWindowListener(new ConfigListener(this)); +		AltosPreferences.register_units_listener(this);  	}  	/* Once the initial values are set, the config code will show the dialog */ @@ -445,6 +529,7 @@ public class TeleGPSConfigUI  	}  	public void dispose() { +		AltosPreferences.unregister_units_listener(this);  		super.dispose();  	} @@ -486,6 +571,22 @@ public class TeleGPSConfigUI  		listener = l;  	} +	public void units_changed(boolean imperial_units) { +		if (tracker_horiz_value.isEnabled() && tracker_vert_value.isEnabled()) { +			String th = tracker_horiz_value.getSelectedItem().toString(); +			String tv = tracker_vert_value.getSelectedItem().toString(); +			tracker_horiz_label.setText(get_tracker_horiz_label()); +			tracker_vert_label.setText(get_tracker_vert_label()); +			set_tracker_horiz_values(); +			set_tracker_vert_values(); +			int[] t = { +				(int) (AltosConvert.height.parse(th, !imperial_units) + 0.5), +				(int) (AltosConvert.height.parse(tv, !imperial_units) + 0.5) +			}; +			set_tracker_distances(t); +		} +	} +  	/* set and get all of the dialog values */  	public void set_product(String product) {  		radio_frequency_value.set_product(product); @@ -509,28 +610,6 @@ public class TeleGPSConfigUI  		return -1;  	} -/* -	String get_main_deploy_label() { -		return String.format("Main Deploy Altitude(%s):", AltosConvert.height.show_units()); -	} - -	String[] main_deploy_values() { -		if (AltosConvert.imperial_units) -			return main_deploy_values_ft; -		else -			return main_deploy_values_m; -	} - -	void set_main_deploy_values() { -		String[]	v = main_deploy_values(); -		while (main_deploy_value.getItemCount() > 0) -			main_deploy_value.removeItemAt(0); -		for (int i = 0; i < v.length; i++) -			main_deploy_value.addItem(v[i]); -		main_deploy_value.setMaximumRowCount(v.length); -	} -*/ -  	public void set_apogee_delay(int new_apogee_delay) { }  	public int apogee_delay() { @@ -626,6 +705,80 @@ public class TeleGPSConfigUI  	public int beep() { return -1; } +	String[] tracker_horiz_values() { +		if (AltosConvert.imperial_units) +			return tracker_horiz_values_ft; +		else +			return tracker_horiz_values_m; +	} + +	void set_tracker_horiz_values() { +		String[]	v = tracker_horiz_values(); +		while (tracker_horiz_value.getItemCount() > 0) +			tracker_horiz_value.removeItemAt(0); +		for (int i = 0; i < v.length; i++) +			tracker_horiz_value.addItem(v[i]); +		tracker_horiz_value.setMaximumRowCount(v.length); +	} + +	String get_tracker_horiz_label() { +		return String.format("Logging Trigger Horizontal (%s):", AltosConvert.height.show_units()); +	} + +	String[] tracker_vert_values() { +		if (AltosConvert.imperial_units) +			return tracker_vert_values_ft; +		else +			return tracker_vert_values_m; +	} + +	void set_tracker_vert_values() { +		String[]	v = tracker_vert_values(); +		while (tracker_vert_value.getItemCount() > 0) +			tracker_vert_value.removeItemAt(0); +		for (int i = 0; i < v.length; i++) +			tracker_vert_value.addItem(v[i]); +		tracker_vert_value.setMaximumRowCount(v.length); +	} + +	void set_tracker_tool_tip() { +		if (tracker_horiz_value.isEnabled()) +			tracker_horiz_value.setToolTipText("How far the device must move before logging is enabled"); +		else +			tracker_horiz_value.setToolTipText("This device doesn't disable logging before motion"); +		if (tracker_vert_value.isEnabled()) +			tracker_vert_value.setToolTipText("How far the device must move before logging is enabled"); +		else +			tracker_vert_value.setToolTipText("This device doesn't disable logging before motion"); +	} + +	String get_tracker_vert_label() { +		return String.format("Logging Trigger Vertical (%s):", AltosConvert.height.show_units()); +	} + +	public void set_tracker_distances(int[] tracker_distances) { +		if (tracker_distances != null) { +			tracker_horiz_value.setSelectedItem(AltosConvert.height.say(tracker_distances[0])); +			tracker_vert_value.setSelectedItem(AltosConvert.height.say(tracker_distances[1])); +			tracker_horiz_value.setEnabled(true); +			tracker_vert_value.setEnabled(true); +		} else { +			tracker_horiz_value.setEnabled(false); +			tracker_vert_value.setEnabled(false); +		} +	} + +	public int[] tracker_distances() { +		if (tracker_horiz_value.isEnabled() && tracker_vert_value.isEnabled()) { +			int[] t = { +				(int) (AltosConvert.height.parse(tracker_horiz_value.getSelectedItem().toString()) + 0.5), +				(int) (AltosConvert.height.parse(tracker_vert_value.getSelectedItem().toString()) + 0.5), +			}; +			return t; +		} +		return null; +	} +  	public void set_aprs_interval(int new_aprs_interval) {  		String	s;  | 
