summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-05-30 17:17:42 -0700
committerKeith Packard <keithp@keithp.com>2014-05-30 17:32:52 -0700
commit2d9842ee011139f5783a102ceb2b7f4c88b1a10f (patch)
treedffd6fda2aa961b23641a5171f2f35e69f4e8687
parent29d325f418b401f61580288b5947b0df8ac5b717 (diff)
telegps: Add config for tracker starting distances
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--altoslib/AltosConfigData.java30
-rw-r--r--altoslib/AltosConfigValues.java4
-rw-r--r--altosui/AltosConfigUI.java171
-rw-r--r--telegps/TeleGPSConfigUI.java199
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;