summaryrefslogtreecommitdiff
path: root/altoslib
diff options
context:
space:
mode:
authorBdale Garbee <bdale@gag.com>2012-08-28 23:39:53 -0600
committerBdale Garbee <bdale@gag.com>2012-08-28 23:39:53 -0600
commit5ed88fb72c3e3ecf3333c700d838667db71cfbdc (patch)
tree3b371f563c0f7607f2fe53242673adb352b48514 /altoslib
parentadbe64c5a9402b7c5075a444a12629131b663877 (diff)
parent621d0930244f25165d2ac5da596dcc87e253b965 (diff)
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
Conflicts: debian/control
Diffstat (limited to 'altoslib')
-rw-r--r--altoslib/AltosIdleMonitor.java67
-rw-r--r--altoslib/AltosIgnite.java180
-rw-r--r--altoslib/AltosLink.java22
-rw-r--r--altoslib/AltosRecord.java2
-rw-r--r--altoslib/AltosRecordTM.java16
-rw-r--r--altoslib/AltosState.java2
-rw-r--r--altoslib/Makefile.am1
7 files changed, 238 insertions, 52 deletions
diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java
index 57c4da71..27ea3a2b 100644
--- a/altoslib/AltosIdleMonitor.java
+++ b/altoslib/AltosIdleMonitor.java
@@ -23,16 +23,10 @@ import java.text.*;
import java.util.prefs.*;
import java.util.concurrent.*;
-class AltosSensorTM {
- int tick;
- int accel;
- int pres;
- int temp;
- int batt;
- int drogue;
- int main;
+class AltosSensorTM extends AltosRecordTM {
- public AltosSensorTM(AltosLink link) throws InterruptedException, TimeoutException {
+ public AltosSensorTM(AltosLink link, AltosConfigData config_data) throws InterruptedException, TimeoutException {
+ super();
link.printf("a\n");
for (;;) {
String line = link.get_reply_no_dialog(5000);
@@ -82,6 +76,10 @@ class AltosSensorTM {
}
break;
}
+ ground_accel = config_data.accel_cal_plus;
+ ground_pres = pres;
+ accel_plus_g = config_data.accel_cal_plus;
+ accel_minus_g = config_data.accel_cal_minus;
}
}
@@ -253,7 +251,7 @@ class AltosGPSQuery extends AltosGPS {
if (line.startsWith("Date:")) {
if (bits.length < 2)
continue;
- String[] d = bits[1].split(":");
+ String[] d = bits[1].split("/");
if (d.length < 3)
continue;
year = Integer.parseInt(d[0]) + 2000;
@@ -264,7 +262,7 @@ class AltosGPSQuery extends AltosGPS {
if (line.startsWith("Time:")) {
if (bits.length < 2)
continue;
- String[] d = bits[1].split("/");
+ String[] d = bits[1].split(":");
if (d.length < 3)
continue;
hour = Integer.parseInt(d[0]);
@@ -339,8 +337,7 @@ public class AltosIdleMonitor extends Thread {
}
void update_state() throws InterruptedException, TimeoutException {
- AltosRecord record;
- int rssi;
+ AltosRecord record = null;
try {
if (remote) {
@@ -350,20 +347,7 @@ public class AltosIdleMonitor extends Thread {
link.flush_input();
config_data = new AltosConfigData(link);
if (config_data.product.startsWith("TeleMetrum")) {
- AltosRecordTM record_tm = new AltosRecordTM();
- AltosSensorTM sensor = new AltosSensorTM(link);
- record_tm.accel = sensor.accel;
- record_tm.pres = sensor.pres;
- record_tm.batt = sensor.batt;
- record_tm.temp = sensor.temp;
- record_tm.drogue = sensor.drogue;
- record_tm.main = sensor.main;
- record_tm.ground_accel = record_tm.accel;
- record_tm.ground_pres = record_tm.pres;
- record_tm.accel_plus_g = config_data.accel_cal_plus;
- record_tm.accel_minus_g = config_data.accel_cal_minus;
- record_tm.tick = sensor.tick;
- record = record_tm;
+ record = new AltosSensorTM(link, config_data);
} else if (config_data.product.startsWith("MegaMetrum")) {
AltosRecordMM record_mm = new AltosRecordMM();
AltosSensorMM sensor = new AltosSensorMM(link);
@@ -390,24 +374,27 @@ public class AltosIdleMonitor extends Thread {
record = new AltosRecord();
gps = new AltosGPSQuery(link, config_data);
+
+ record.version = 0;
+ record.callsign = config_data.callsign;
+ record.serial = config_data.serial;
+ record.flight = config_data.log_available() > 0 ? 255 : 0;
+ record.status = 0;
+ record.state = AltosLib.ao_flight_idle;
+ record.gps = gps;
+ record.new_gps = true;
+ state = new AltosState (record, state);
} finally {
if (remote) {
link.stop_remote();
- rssi = AltosRSSI();
- } else
- rssi = 0;
+ if (record != null)
+ record.rssi = AltosRSSI();
+ } else {
+ if (record != null)
+ record.rssi = 0;
+ }
}
- record.version = 0;
- record.callsign = config_data.callsign;
- record.serial = config_data.serial;
- record.flight = config_data.log_available() > 0 ? 255 : 0;
- record.rssi = rssi;
- record.status = 0;
- record.state = AltosLib.ao_flight_idle;
-
- record.gps = gps;
- state = new AltosState (record, state);
}
public void set_frequency(double in_frequency) {
diff --git a/altoslib/AltosIgnite.java b/altoslib/AltosIgnite.java
new file mode 100644
index 00000000..cc814337
--- /dev/null
+++ b/altoslib/AltosIgnite.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright © 2010 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.concurrent.*;
+
+public class AltosIgnite {
+ AltosLink link;
+ boolean remote;
+ boolean link_started;
+
+ public final static int None = 0;
+ public final static int Apogee = 1;
+ public final static int Main = 2;
+
+ public final static int Unknown = 0;
+ public final static int Ready = 1;
+ public final static int Active = 2;
+ public final static int Open = 3;
+
+ private void start_link() throws InterruptedException, TimeoutException {
+ link_started = true;
+ if (remote)
+ link.start_remote();
+ }
+
+ private void stop_link() throws InterruptedException {
+ if (!link_started)
+ return;
+ link_started = false;
+ if (link == null)
+ return;
+ if (remote)
+ link.stop_remote();
+ }
+
+ class string_ref {
+ String value;
+
+ public String get() {
+ return value;
+ }
+ public void set(String i) {
+ value = i;
+ }
+ public string_ref() {
+ value = null;
+ }
+ }
+
+ private boolean get_string(String line, String label, string_ref s) {
+ 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);
+ s.set(quoted);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private int status(String status_name) {
+ if (status_name.equals("unknown"))
+ return Unknown;
+ if (status_name.equals("ready"))
+ return Ready;
+ if (status_name.equals("active"))
+ return Active;
+ if (status_name.equals("open"))
+ return Open;
+ return Unknown;
+ }
+
+ public int status(int igniter) throws InterruptedException, TimeoutException {
+ int status = Unknown;
+ if (link == null)
+ return status;
+ string_ref status_name = new string_ref();
+ try {
+ start_link();
+ link.printf("t\n");
+ for (;;) {
+ String line = link.get_reply(5000);
+ if (line == null)
+ throw new TimeoutException();
+ String[] items = line.split("\\s+");
+
+ if (items.length < 4)
+ continue;
+
+ if (!items[0].equals("Igniter:"))
+ continue;
+
+ if (!items[2].equals("Status:"))
+ continue;
+
+ if (items[1].equals("drogue")) {
+ if (igniter == Apogee)
+ status = status(items[3]);
+ } else if (items[1].equals("main")) {
+ if (igniter == Main)
+ status = status(items[3]);
+ break;
+ }
+ }
+ } finally {
+ stop_link();
+ }
+ return status;
+ }
+
+ public static String status_string(int status) {
+ switch (status) {
+ case Unknown: return "Unknown";
+ case Ready: return "Ready";
+ case Active: return "Active";
+ case Open: return "Open";
+ default: return "Unknown";
+ }
+ }
+
+ public void fire(int igniter) {
+ if (link == null)
+ return;
+ try {
+ start_link();
+ switch (igniter) {
+ case Main:
+ link.printf("i DoIt main\n");
+ break;
+ case Apogee:
+ link.printf("i DoIt drogue\n");
+ break;
+ }
+ } catch (InterruptedException ie) {
+ } catch (TimeoutException te) {
+ } finally {
+ try {
+ stop_link();
+ } catch (InterruptedException ie) {
+ }
+ }
+ }
+
+ public void close() {
+ try {
+ stop_link();
+ } catch (InterruptedException ie) {
+ }
+ link.close();
+ link = null;
+ }
+
+ public AltosIgnite(AltosLink in_link, boolean in_remote)
+ throws FileNotFoundException, TimeoutException, InterruptedException {
+
+ link = in_link;
+ remote = in_remote;
+ }
+} \ No newline at end of file
diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java
index d59e73ba..415c3c64 100644
--- a/altoslib/AltosLink.java
+++ b/altoslib/AltosLink.java
@@ -23,7 +23,7 @@ import java.util.concurrent.*;
import java.util.*;
import java.text.*;
-public abstract class AltosLink {
+public abstract class AltosLink implements Runnable {
public final static int ERROR = -1;
public final static int TIMEOUT = -2;
@@ -101,15 +101,23 @@ public abstract class AltosLink {
try {
for (;;) {
c = getchar();
- if (Thread.interrupted())
+ if (Thread.interrupted()) {
+ if (debug)
+ System.out.printf("INTERRUPTED\n");
break;
+ }
if (c == ERROR) {
+ if (debug)
+ System.out.printf("ERROR\n");
add_telem (new AltosLine());
add_reply (new AltosLine());
break;
}
- if (c == TIMEOUT)
+ if (c == TIMEOUT) {
+ if (debug)
+ System.out.printf("TIMEOUT\n");
continue;
+ }
if (c == '\r')
continue;
synchronized(this) {
@@ -180,6 +188,14 @@ public abstract class AltosLink {
reply_queue.put (line);
}
+ public void abort_reply() {
+ try {
+ add_telem (new AltosLine());
+ add_reply (new AltosLine());
+ } catch (InterruptedException e) {
+ }
+ }
+
public void add_string(String line) throws InterruptedException {
if (line.startsWith("TELEM") || line.startsWith("VERSION") || line.startsWith("CRC")) {
add_telem(new AltosLine(line));
diff --git a/altoslib/AltosRecord.java b/altoslib/AltosRecord.java
index e468f84b..8722bc05 100644
--- a/altoslib/AltosRecord.java
+++ b/altoslib/AltosRecord.java
@@ -127,7 +127,7 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
double p = filtered_pressure();
if (p == MISSING)
- return MISSING;
+ return raw_altitude();
return AltosConvert.pressure_to_altitude(p);
}
diff --git a/altoslib/AltosRecordTM.java b/altoslib/AltosRecordTM.java
index afb70790..37accef6 100644
--- a/altoslib/AltosRecordTM.java
+++ b/altoslib/AltosRecordTM.java
@@ -177,14 +177,14 @@ public class AltosRecordTM extends AltosRecord {
drogue = MISSING;
main = MISSING;
- flight_accel = 0;
- flight_vel = 0;
- flight_pres = 0;
-
- ground_accel = 0;
- ground_pres = 0;
- accel_plus_g = 0;
- accel_minus_g = 0;
+ flight_accel = MISSING;
+ flight_vel = MISSING;
+ flight_pres = MISSING;
+
+ ground_accel = MISSING;
+ ground_pres = MISSING;
+ accel_plus_g = MISSING;
+ accel_minus_g = MISSING;
}
public AltosRecordTM(AltosRecord old) {
diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java
index e20ec9a7..3b37a3d4 100644
--- a/altoslib/AltosState.java
+++ b/altoslib/AltosState.java
@@ -38,6 +38,7 @@ public class AltosState {
public boolean boost; /* under power */
public double ground_altitude;
+ public double altitude;
public double height;
public double speed;
public double acceleration;
@@ -82,6 +83,7 @@ public class AltosState {
data = cur;
ground_altitude = data.ground_altitude();
+ altitude = data.raw_altitude();
height = data.filtered_height();
report_time = System.currentTimeMillis();
diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am
index a39623ee..1f42140b 100644
--- a/altoslib/Makefile.am
+++ b/altoslib/Makefile.am
@@ -29,6 +29,7 @@ AltosLib_JAVA = \
$(SRC)/AltosGreatCircle.java \
$(SRC)/AltosIdleMonitor.java \
$(SRC)/AltosIdleMonitorListener.java \
+ $(SRC)/AltosIgnite.java \
$(SRC)/AltosLine.java \
$(SRC)/AltosLink.java \
$(SRC)/AltosLog.java \