summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-04-12 00:19:24 -0700
committerKeith Packard <keithp@keithp.com>2013-04-12 00:19:24 -0700
commit9212ce268f3a4a9f3f019f23f6eef8b57207d340 (patch)
treed5980ee07ce335d0f5f0d938310db17f57dc78ce
parentf02bb1df132443fc27b69f23f382ea87e610f533 (diff)
altosdroid: Compute course from android device to rocket, display it
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java28
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java4
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java4
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java23
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java10
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java2
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java2
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java8
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java29
9 files changed, 73 insertions, 37 deletions
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
index c9ce46a0..b1d080db 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
@@ -47,6 +47,7 @@ import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;
import android.app.AlertDialog;
+import android.location.Location;
import org.altusmetrum.altoslib_1.*;
@@ -59,6 +60,8 @@ public class AltosDroid extends FragmentActivity {
public static final int MSG_STATE_CHANGE = 1;
public static final int MSG_TELEMETRY = 2;
public static final int MSG_UPDATE_AGE = 3;
+ public static final int MSG_LOCATION = 4;
+ public static final int MSG_CRC_ERROR = 5;
// Intent request codes
private static final int REQUEST_CONNECT_DEVICE = 1;
@@ -87,6 +90,7 @@ public class AltosDroid extends FragmentActivity {
// Timer and Saved flight state for Age calculation
private Timer timer = new Timer();
AltosState saved_state;
+ Location saved_location;
// Service
private boolean mIsBound = false;
@@ -137,6 +141,10 @@ public class AltosDroid extends FragmentActivity {
case MSG_TELEMETRY:
ad.update_ui((AltosState) msg.obj);
break;
+ case MSG_LOCATION:
+ ad.set_location((Location) msg.obj);
+ break;
+ case MSG_CRC_ERROR:
case MSG_UPDATE_AGE:
if (ad.saved_state != null) {
ad.mAgeView.setText(String.format("%d", (System.currentTimeMillis() - ad.saved_state.report_time + 500) / 1000));
@@ -196,6 +204,13 @@ public class AltosDroid extends FragmentActivity {
mTabs.remove(mTab);
}
+ void set_location(Location location) {
+ saved_location = location;
+ if (saved_state != null) {
+ update_ui(saved_state);
+ }
+ }
+
void update_ui(AltosState state) {
if (saved_state != null) {
if (saved_state.state != state.state) {
@@ -215,6 +230,17 @@ public class AltosDroid extends FragmentActivity {
}
saved_state = state;
+ AltosGreatCircle from_receiver = null;
+
+ if (saved_location != null && state.gps != null && state.gps.locked) {
+ from_receiver = new AltosGreatCircle(saved_location.getLatitude(),
+ saved_location.getLongitude(),
+ saved_location.getAltitude(),
+ state.gps.lat,
+ state.gps.lon,
+ state.gps.alt);
+ }
+
mCallsignView.setText(state.data.callsign);
mSerialView.setText(String.format("%d", state.data.serial));
mFlightView.setText(String.format("%d", state.data.flight));
@@ -222,7 +248,7 @@ public class AltosDroid extends FragmentActivity {
mRSSIView.setText(String.format("%d", state.data.rssi));
for (AltosDroidTab mTab : mTabs)
- mTab.update_ui(state);
+ mTab.update_ui(state, from_receiver);
mAltosVoice.tell(state);
}
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java
index 68bbe593..2b5cdae7 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java
@@ -17,8 +17,8 @@
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_1.AltosState;
+import org.altusmetrum.altoslib_1.*;
public interface AltosDroidTab {
- public void update_ui(AltosState state);
+ public void update_ui(AltosState state, AltosGreatCircle from_receiver);
}
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java
index bda6b1fd..ce677c57 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java
@@ -17,7 +17,7 @@
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_1.AltosState;
+import org.altusmetrum.altoslib_1.*;
import android.app.Activity;
import android.os.Bundle;
@@ -84,7 +84,7 @@ public class TabAscent extends Fragment implements AltosDroidTab {
mAltosDroid = null;
}
- public void update_ui(AltosState state) {
+ public void update_ui(AltosState state, AltosGreatCircle from_receiver) {
mHeightView.setText(String.format("%6.0f m", state.height));
mMaxHeightView.setText(String.format("%6.0f m", state.max_height));
mSpeedView.setText(String.format("%6.0f m/s", state.speed()));
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java
index 3805b7e7..b0c6539c 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java
@@ -17,8 +17,7 @@
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_1.AltosGreatCircle;
-import org.altusmetrum.altoslib_1.AltosState;
+import org.altusmetrum.altoslib_1.*;
import android.app.Activity;
import android.os.Bundle;
@@ -89,16 +88,22 @@ public class TabDescent extends Fragment implements AltosDroidTab {
mAltosDroid = null;
}
- public void update_ui(AltosState state) {
+ public void update_ui(AltosState state, AltosGreatCircle from_receiver) {
mSpeedView.setText(String.format("%6.0f m/s", state.speed()));
mHeightView.setText(String.format("%6.0f m", state.height));
- mElevationView.setText(String.format("%3.0f°", state.elevation));
- mRangeView.setText(String.format("%6.0f m", state.range));
- if (state.from_pad != null) {
- mBearingView.setText(String.format("%3.0f°", state.from_pad.bearing));
- mCompassView.setText(state.from_pad.bearing_words(AltosGreatCircle.BEARING_LONG));
+ if (from_receiver != null) {
+ mElevationView.setText(String.format("%3.0f°", from_receiver.elevation));
+ mRangeView.setText(String.format("%6.0f m", from_receiver.range));
+ mBearingView.setText(String.format("%3.0f°", from_receiver.bearing));
+ mCompassView.setText(from_receiver.bearing_words(AltosGreatCircle.BEARING_LONG));
+ mDistanceView.setText(String.format("%6.0f m", from_receiver.distance));
+ } else {
+ mElevationView.setText("<unknown>");
+ mRangeView.setText("<unknown>");
+ mBearingView.setText("<unknown>");
+ mCompassView.setText("<unknown>");
+ mDistanceView.setText("<unknown>");
}
- mDistanceView.setText(String.format("%6.0f m", state.range));
mLatitudeView.setText(AltosDroid.pos(state.gps.lat, "N", "S"));
mLongitudeView.setText(AltosDroid.pos(state.gps.lon, "W", "E"));
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java
index a95e9145..93a42334 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java
@@ -17,7 +17,7 @@
package org.altusmetrum.AltosDroid;
-import org.altusmetrum.altoslib_1.AltosState;
+import org.altusmetrum.altoslib_1.*;
import android.app.Activity;
import android.os.Bundle;
@@ -68,10 +68,10 @@ public class TabLanded extends Fragment implements AltosDroidTab {
mAltosDroid = null;
}
- public void update_ui(AltosState state) {
- if (state.from_pad != null) {
- mBearingView.setText(String.format("%3.0f°", state.from_pad.bearing));
- mDistanceView.setText(String.format("%6.0f m", state.from_pad.distance));
+ public void update_ui(AltosState state, AltosGreatCircle from_receiver) {
+ if (from_receiver != null) {
+ mBearingView.setText(String.format("%3.0f°", from_receiver.bearing));
+ mDistanceView.setText(String.format("%6.0f m", from_receiver.distance));
}
mLatitudeView.setText(AltosDroid.pos(state.gps.lat, "N", "S"));
mLongitudeView.setText(AltosDroid.pos(state.gps.lon, "W", "E"));
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java
index 8fc8f592..607ded46 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java
@@ -139,7 +139,7 @@ public class TabMap extends Fragment implements AltosDroidTab {
}
}
- public void update_ui(AltosState state) {
+ public void update_ui(AltosState state, AltosGreatCircle from_receiver) {
if (state.from_pad != null) {
mDistanceView.setText(String.format("%6.0f m", state.from_pad.distance));
mBearingView.setText(String.format("%3.0f°", state.from_pad.bearing));
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java
index 41776c10..6906324d 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java
@@ -100,7 +100,7 @@ public class TabPad extends Fragment implements AltosDroidTab {
mAltosDroid = null;
}
- public void update_ui(AltosState state) {
+ public void update_ui(AltosState state, AltosGreatCircle from_receiver) {
mBatteryVoltageView.setText(String.format("%4.2f V", state.battery));
mBatteryLights.set(state.battery > 3.7);
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java
index fb07442e..716ec589 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java
@@ -36,7 +36,6 @@ public class TelemetryReader extends Thread {
Handler handler;
- TelemetryService service;
AltosLink link;
AltosRecord previous;
@@ -69,12 +68,12 @@ public class TelemetryReader extends Thread {
if (record == null)
break;
state = new AltosState(record, state);
- service.sendTelemetry(state);
+ handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget();
} catch (ParseException pp) {
Log.e(TAG, String.format("Parse error: %d \"%s\"", pp.getErrorOffset(), pp.getMessage()));
} catch (AltosCRCException ce) {
++crc_errors;
- service.sendCrcErrors(crc_errors);
+ handler.obtainMessage(TelemetryService.MSG_CRC_ERROR, new Integer(crc_errors)).sendToTarget();
}
}
} catch (InterruptedException ee) {
@@ -84,8 +83,7 @@ public class TelemetryReader extends Thread {
}
}
- public TelemetryReader (TelemetryService in_service, AltosLink in_link, Handler in_handler) {
- service = in_service;
+ public TelemetryReader (AltosLink in_link, Handler in_handler) {
link = in_link;
handler = in_handler;
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java
index e6854585..0ddfdfc3 100644
--- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java
+++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java
@@ -45,10 +45,10 @@ import android.location.LocationListener;
import org.altusmetrum.altoslib_1.*;
class AltosLocationListener implements LocationListener {
- TelemetryService service;
+ Handler handler;
public void onLocationChanged(Location location) {
- service.sendLocation(location);
+ handler.obtainMessage(TelemetryService.MSG_LOCATION, location).sendToTarget();
}
public void onStatusChanged(String provider, int status, Bundle extras) {
@@ -60,8 +60,8 @@ class AltosLocationListener implements LocationListener {
public void onProviderDisabled(String provider) {
}
- public AltosLocationListener(TelemetryService service) {
- this.service = service;
+ public AltosLocationListener(Handler handler) {
+ this.handler = handler;
}
}
@@ -169,8 +169,20 @@ public class TelemetryService extends Service {
}
break;
case MSG_TELEMETRY:
+ // forward telemetry messages
+ s.last_state = (AltosState) msg.obj;
s.sendMessageToClients(Message.obtain(null, AltosDroid.MSG_TELEMETRY, msg.obj));
break;
+ case MSG_LOCATION:
+ // forward location messages
+ s.last_location = (Location) msg.obj;
+ s.sendMessageToClients(Message.obtain(null, AltosDroid.MSG_LOCATION, msg.obj));
+ break;
+ case MSG_CRC_ERROR:
+ // forward crc error messages
+ s.last_crc_errors = (Integer) msg.obj;
+ s.sendMessageToClients(Message.obtain(null, AltosDroid.MSG_CRC_ERROR, msg.obj));
+ break;
case MSG_SETFREQUENCY:
if (s.state == STATE_CONNECTED) {
try {
@@ -187,18 +199,13 @@ public class TelemetryService extends Service {
}
public void sendTelemetry(AltosState state) {
- last_state = state;
- mHandler.obtainMessage(MSG_TELEMETRY, state).sendToTarget();
}
public void sendLocation(Location location) {
- last_location = location;
mHandler.obtainMessage(MSG_LOCATION, location).sendToTarget();
}
public void sendCrcErrors(int crc_errors) {
- last_crc_errors = crc_errors;
- mHandler.obtainMessage(MSG_CRC_ERROR, new Integer(crc_errors)).sendToTarget();
}
private void sendMessageToClients(Message m) {
@@ -278,7 +285,7 @@ public class TelemetryService extends Service {
setState(STATE_CONNECTED);
- mTelemetryReader = new TelemetryReader(this, mAltosBluetooth, mHandler);
+ mTelemetryReader = new TelemetryReader(mAltosBluetooth, mHandler);
mTelemetryReader.start();
mTelemetryLogger = new TelemetryLogger(this, mAltosBluetooth);
@@ -308,7 +315,7 @@ public class TelemetryService extends Service {
timer.scheduleAtFixedRate(new TimerTask(){ public void run() {onTimerTick();}}, 10000L, 10000L);
// Listen for GPS and Network position updates
- locationListener = new AltosLocationListener(this);
+ locationListener = new AltosLocationListener(mHandler);
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);