From cb23b992be8ba40c97d8988c134a814a13ccd58c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 25 May 2015 20:34:05 -0700 Subject: altoslib/altosuilib: Update library version to 7 So many ABI/API changes Signed-off-by: Keith Packard --- altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java') diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java index 9764ab72..0cd9b2c1 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java @@ -1,6 +1,6 @@ package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_6.*; +import org.altusmetrum.altoslib_7.*; import android.content.BroadcastReceiver; import android.content.Context; -- cgit v1.2.3 From 2509b664df6a13e6ae9e6753dc9fa0d696a4f6c7 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 26 May 2015 23:05:11 -0700 Subject: altosdroid: Centralize debug printf code Create AltosDebug to hold the debug code, use it everywhere. Signed-off-by: Keith Packard --- .../org/altusmetrum/AltosDroid/AltosBluetooth.java | 36 +++++---- .../src/org/altusmetrum/AltosDroid/AltosDebug.java | 62 +++++++++++++++ .../src/org/altusmetrum/AltosDroid/AltosDroid.java | 48 ++++++----- .../org/altusmetrum/AltosDroid/AltosDroidLink.java | 35 ++++---- .../org/altusmetrum/AltosDroid/AltosDroidTab.java | 1 - .../src/org/altusmetrum/AltosDroid/AltosUsb.java | 25 +++--- .../altusmetrum/AltosDroid/DeviceListActivity.java | 8 +- .../org/altusmetrum/AltosDroid/TabMapOffline.java | 18 ++--- .../org/altusmetrum/AltosDroid/TabsAdapter.java | 5 +- .../altusmetrum/AltosDroid/TelemetryLogger.java | 10 +-- .../altusmetrum/AltosDroid/TelemetryReader.java | 14 ++-- .../altusmetrum/AltosDroid/TelemetryService.java | 92 +++++++++++----------- 12 files changed, 192 insertions(+), 162 deletions(-) create mode 100644 altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java') diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java index d506ff59..03ae5cb8 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java @@ -29,16 +29,11 @@ import android.bluetooth.BluetoothSocket; //import android.os.Bundle; import android.os.Handler; //import android.os.Message; -import android.util.Log; import org.altusmetrum.altoslib_7.*; public class AltosBluetooth extends AltosDroidLink { - // Debugging - private static final String TAG = "AltosBluetooth"; - private static final boolean D = true; - private ConnectThread connect_thread = null; private BluetoothDevice device; @@ -60,7 +55,7 @@ public class AltosBluetooth extends AltosDroidLink { void connected() { if (closed()) { - if (D) Log.d(TAG, "connected after closed"); + AltosDebug.debug("connected after closed"); return; } @@ -82,7 +77,7 @@ public class AltosBluetooth extends AltosDroidLink { private void connect_failed() { if (closed()) { - if (D) Log.d(TAG, "connect_failed after closed"); + AltosDebug.debug("connect_failed after closed"); return; } @@ -90,7 +85,7 @@ public class AltosBluetooth extends AltosDroidLink { input = null; output = null; handler.obtainMessage(TelemetryService.MSG_CONNECT_FAILED, this).sendToTarget(); - if (D) Log.e(TAG, "ConnectThread: Failed to establish connection"); + AltosDebug.error("ConnectThread: Failed to establish connection"); } void close_device() { @@ -105,7 +100,7 @@ public class AltosBluetooth extends AltosDroidLink { try { tmp_socket.close(); } catch (IOException e) { - if (D) Log.e(TAG, "close_socket failed"); + AltosDebug.error("close_socket failed"); } } } @@ -122,13 +117,14 @@ public class AltosBluetooth extends AltosDroidLink { BluetoothSocket tmp_socket = null; + AltosDebug.check_ui("create_socket\n"); try { tmp_socket = device.createInsecureRfcommSocketToServiceRecord(SPP_UUID); } catch (IOException e) { e.printStackTrace(); } if (socket != null) { - if (D) Log.d(TAG, String.format("Socket already allocated %s", socket.toString())); + AltosDebug.debug("Socket already allocated %s", socket.toString()); close_device(); } synchronized (this) { @@ -139,7 +135,7 @@ public class AltosBluetooth extends AltosDroidLink { private class ConnectThread extends Thread { public void run() { - if (D) Log.d(TAG, "ConnectThread: BEGIN"); + AltosDebug.debug("ConnectThread: BEGIN (pause %b)", pause); setName("ConnectThread"); if (pause) { @@ -154,7 +150,7 @@ public class AltosBluetooth extends AltosDroidLink { try { BluetoothAdapter.getDefaultAdapter().cancelDiscovery(); } catch (Exception e) { - if (D) Log.d(TAG, String.format("cancelDiscovery exception %s", e.toString())); + AltosDebug.debug("cancelDiscovery exception %s", e.toString()); } BluetoothSocket local_socket = null; @@ -170,8 +166,13 @@ public class AltosBluetooth extends AltosDroidLink { // This is a blocking call and will only return on a // successful connection or an exception local_socket.connect(); - } catch (IOException e) { - if (D) Log.d(TAG, String.format("Connect exception %s", e.toString())); + } catch (Exception e) { + AltosDebug.debug("Connect exception %s", e.toString()); + try { + local_socket.close(); + } catch (Exception ce) { + AltosDebug.debug("Close exception %s", ce.toString()); + } local_socket = null; } } @@ -182,15 +183,16 @@ public class AltosBluetooth extends AltosDroidLink { connect_failed(); } - if (D) Log.d(TAG, "ConnectThread: completed"); + AltosDebug.debug("ConnectThread: completed"); } } private synchronized void wait_connected() throws InterruptedException, IOException { + AltosDebug.check_ui("wait_connected\n"); if (input == null && socket != null) { - if (D) Log.d(TAG, "wait_connected..."); + AltosDebug.debug("wait_connected..."); wait(); - if (D) Log.d(TAG, "wait_connected done"); + AltosDebug.debug("wait_connected done"); } if (socket == null) throw new IOException(); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java new file mode 100644 index 00000000..80f1861b --- /dev/null +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java @@ -0,0 +1,62 @@ +/* + * Copyright © 2015 Keith Packard + * + * 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.AltosDroid; + +import java.util.Arrays; +import java.io.*; +import java.lang.*; + +import org.altusmetrum.altoslib_7.*; + +import android.app.Activity; +import android.graphics.*; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.view.*; +import android.widget.*; +import android.location.Location; +import android.content.*; +import android.util.Log; +import android.os.Looper; + +public class AltosDebug { + // Debugging + static final String TAG = "AltosDroid"; + public static final boolean D = true; + + static void info(String format, Object ... arguments) { + Log.i(TAG, String.format(format, arguments)); + } + + static void debug(String format, Object ... arguments) { + if (D) + Log.d(TAG, String.format(format, arguments)); + } + + static void error(String format, Object ... arguments) { + Log.e(TAG, String.format(format, arguments)); + } + + static void check_ui(String format, Object ... arguments) { + if (Looper.myLooper() == Looper.getMainLooper()) { + Log.e(TAG, String.format("ON UI THREAD " + format, arguments)); + for (StackTraceElement el : Thread.currentThread().getStackTrace()) + Log.e(TAG, "\t" + el.toString() + "\n"); + } + } +} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index dd87614b..65618646 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -42,7 +42,6 @@ import android.content.res.Resources; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.util.DisplayMetrics; -import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -60,9 +59,6 @@ import android.hardware.usb.*; import org.altusmetrum.altoslib_7.*; public class AltosDroid extends FragmentActivity implements AltosUnitsListener { - // Debugging - static final String TAG = "AltosDroid"; - static final boolean D = true; // Actions sent to the telemetry server at startup time @@ -133,17 +129,17 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { switch (msg.what) { case MSG_STATE: - if(D) Log.d(TAG, "MSG_STATE"); + AltosDebug.debug("MSG_STATE"); TelemetryState telemetry_state = (TelemetryState) msg.obj; if (telemetry_state == null) { - Log.d(TAG, "telemetry_state null!"); + AltosDebug.debug("telemetry_state null!"); return; } ad.update_state(telemetry_state); break; case MSG_UPDATE_AGE: - if(D) Log.d(TAG, "MSG_UPDATE_AGE"); + AltosDebug.debug("MSG_UPDATE_AGE"); ad.update_age(); break; } @@ -421,7 +417,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if(D) Log.e(TAG, "+++ ON CREATE +++"); + AltosDebug.debug("+++ ON CREATE +++"); fm = getSupportFragmentManager(); @@ -526,13 +522,13 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); boolean granted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true); - if (D) Log.e(TAG, "intent " + intent + " device " + device + " granted " + granted); + AltosDebug.debug("intent %s device %s granted %s", intent, device, granted); if (!granted) device = null; if (device != null) { - if (D) Log.d(TAG, "intent has usb device " + device.toString()); + AltosDebug.debug("intent has usb device " + device.toString()); connectUsb(device); } else { @@ -542,11 +538,11 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { * don't want to loop forever... */ if (granted) { - if (D) Log.d(TAG, "check for a USB device at startup"); + AltosDebug.debug("check for a USB device at startup"); if (check_usb()) return; } - if (D) Log.d(TAG, "Starting by looking for bluetooth devices"); + AltosDebug.debug("Starting by looking for bluetooth devices"); if (ensureBluetooth()) return; finish(); @@ -556,7 +552,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { @Override public void onStart() { super.onStart(); - if(D) Log.e(TAG, "++ ON START ++"); + AltosDebug.debug("++ ON START ++"); noticeIntent(getIntent()); @@ -575,26 +571,26 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); - if(D) Log.d(TAG, "onNewIntent"); + AltosDebug.debug("onNewIntent"); noticeIntent(intent); } @Override public void onResume() { super.onResume(); - if(D) Log.e(TAG, "+ ON RESUME +"); + AltosDebug.debug("+ ON RESUME +"); } @Override public void onPause() { super.onPause(); - if(D) Log.e(TAG, "- ON PAUSE -"); + AltosDebug.debug("- ON PAUSE -"); } @Override public void onStop() { super.onStop(); - if(D) Log.e(TAG, "-- ON STOP --"); + AltosDebug.debug("-- ON STOP --"); doUnbindService(); if (mAltosVoice != null) { @@ -606,14 +602,14 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { @Override public void onDestroy() { super.onDestroy(); - if(D) Log.e(TAG, "--- ON DESTROY ---"); + AltosDebug.debug("--- ON DESTROY ---"); if (mAltosVoice != null) mAltosVoice.stop(); stop_timer(); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if(D) Log.d(TAG, "onActivityResult " + resultCode); + AltosDebug.debug("onActivityResult " + resultCode); switch (requestCode) { case REQUEST_CONNECT_DEVICE: // When DeviceListActivity returns with a device to connect to @@ -628,7 +624,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { //setupChat(); } else { // User did not enable Bluetooth or an error occured - Log.e(TAG, "BT not enabled"); + AltosDebug.error("BT not enabled"); stopService(new Intent(AltosDroid.this, TelemetryService.class)); Toast.makeText(this, R.string.bt_not_enabled, Toast.LENGTH_SHORT).show(); finish(); @@ -644,9 +640,9 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { // Attempt to connect to the device try { mService.send(Message.obtain(null, TelemetryService.MSG_OPEN_USB, device)); - if (D) Log.d(TAG, "Sent OPEN_USB message"); + AltosDebug.debug("Sent OPEN_USB message"); } catch (RemoteException e) { - if (D) Log.e(TAG, "connect device message failed"); + AltosDebug.debug("connect device message failed"); } } } @@ -657,12 +653,12 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); String name = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_NAME); - if (D) Log.d(TAG, "Connecting to " + address + " " + name); + AltosDebug.debug("Connecting to " + address + " " + name); DeviceAddress a = new DeviceAddress(address, name); mService.send(Message.obtain(null, TelemetryService.MSG_CONNECT, a)); - if (D) Log.d(TAG, "Sent connecting message"); + AltosDebug.debug("Sent connecting message"); } catch (RemoteException e) { - if (D) Log.e(TAG, "connect device message failed"); + AltosDebug.debug("connect device message failed"); } } @@ -738,7 +734,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { disconnectDevice(); return true; case R.id.quit: - Log.d(TAG, "R.id.quit"); + AltosDebug.debug("R.id.quit"); disconnectDevice(); finish(); return true; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java index 62090774..c7230512 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java @@ -23,16 +23,11 @@ import java.io.OutputStream; import java.util.UUID; import android.os.Handler; -import android.util.Log; import org.altusmetrum.altoslib_7.*; public abstract class AltosDroidLink extends AltosLink { - // Debugging - private static final String TAG = "AltosDroidLink"; - private static final boolean D = true; - Handler handler; Thread input_thread = null; @@ -70,7 +65,7 @@ public abstract class AltosDroidLink extends AltosLink { // Configure the newly connected device for telemetry print("~\nE 0\n"); set_monitor(false); - if (D) Log.d(TAG, "ConnectThread: connected"); + AltosDebug.debug("ConnectThread: connected"); /* Let TelemetryService know we're connected */ @@ -83,7 +78,7 @@ public abstract class AltosDroidLink extends AltosLink { public void closing() { synchronized(closed_lock) { - if (D) Log.d(TAG, "Marked closing true"); + AltosDebug.debug("Marked closing true"); closing = true; } } @@ -97,14 +92,14 @@ public abstract class AltosDroidLink extends AltosLink { abstract void close_device(); public void close() { - if (D) Log.d(TAG, "close(): begin"); + AltosDebug.debug("close(): begin"); closing(); flush_output(); synchronized (closed_lock) { - if (D) Log.d(TAG, "Marked closed true"); + AltosDebug.debug("Marked closed true"); closed = true; } @@ -113,11 +108,11 @@ public abstract class AltosDroidLink extends AltosLink { synchronized(this) { if (input_thread != null) { - if (D) Log.d(TAG, "close(): stopping input_thread"); + AltosDebug.debug("close(): stopping input_thread"); try { - if (D) Log.d(TAG, "close(): input_thread.interrupt()....."); + AltosDebug.debug("close(): input_thread.interrupt()....."); input_thread.interrupt(); - if (D) Log.d(TAG, "close(): input_thread.join()....."); + AltosDebug.debug("close(): input_thread.join()....."); input_thread.join(); } catch (Exception e) {} input_thread = null; @@ -143,7 +138,7 @@ public abstract class AltosDroidLink extends AltosLink { private void debug_input(byte b) { if (b == '\n') { - Log.d(TAG, " " + new String(debug_chars, 0, debug_off)); + AltosDebug.debug(" " + new String(debug_chars, 0, debug_off)); debug_off = 0; } else { if (debug_off < buffer_size) @@ -153,11 +148,11 @@ public abstract class AltosDroidLink extends AltosLink { private void disconnected() { if (closed()) { - if (D) Log.d(TAG, "disconnected after closed"); + AltosDebug.debug("disconnected after closed"); return; } - if (D) Log.d(TAG, "Sending disconnected message"); + AltosDebug.debug("Sending disconnected message"); handler.obtainMessage(TelemetryService.MSG_DISCONNECTED, this).sendToTarget(); } @@ -169,13 +164,13 @@ public abstract class AltosDroidLink extends AltosLink { while (buffer_off == buffer_len) { buffer_len = read(in_buffer, buffer_size); if (buffer_len < 0) { - Log.d(TAG, "ERROR returned from getchar()"); + AltosDebug.debug("ERROR returned from getchar()"); disconnected(); return ERROR; } buffer_off = 0; } - if (D) + if (AltosDebug.D) debug_input(in_buffer[buffer_off]); return in_buffer[buffer_off++]; } @@ -192,7 +187,7 @@ public abstract class AltosDroidLink extends AltosLink { int sent = write(out_buffer, out_buffer_off); if (sent <= 0) { - Log.d(TAG, "flush_output() failed"); + AltosDebug.debug("flush_output() failed"); out_buffer_off = 0; break; } @@ -212,10 +207,10 @@ public abstract class AltosDroidLink extends AltosLink { public void print(String data) { byte[] bytes = data.getBytes(); - if (D) Log.d(TAG, "print(): begin"); + AltosDebug.debug("print(): begin"); for (byte b : bytes) putchar(b); - if (D) Log.d(TAG, "print(): Wrote bytes: '" + data.replace('\n', '\\') + "'"); + AltosDebug.debug("print(): Wrote bytes: '" + data.replace('\n', '\\') + "'"); } public AltosDroidLink(Handler handler) { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java index f91ddf58..d33ad05b 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java @@ -26,7 +26,6 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentManager; import android.location.Location; -import android.util.Log; import android.widget.TextView; public abstract class AltosDroidTab extends Fragment implements AltosUnitsListener { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java index 4685a824..e559f814 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java @@ -27,16 +27,11 @@ import android.content.Context; import android.hardware.usb.*; import android.app.*; import android.os.Handler; -import android.util.Log; import org.altusmetrum.altoslib_7.*; public class AltosUsb extends AltosDroidLink { - // Debugging - private static final String TAG = "AltosUsb"; - private static final boolean D = true; - private Thread input_thread = null; private Handler handler; @@ -91,19 +86,19 @@ public class AltosUsb extends AltosDroidLink { } if (in != null && out != null) { - Log.d(TAG, String.format("\tin %s out %s\n", in.toString(), out.toString())); + AltosDebug.debug("\tin %s out %s\n", in.toString(), out.toString()); manager = (UsbManager) context.getSystemService(Context.USB_SERVICE); if (manager == null) { - Log.d(TAG, "USB_SERVICE failed"); + AltosDebug.debug("USB_SERVICE failed"); return; } connection = manager.openDevice(device); if (connection == null) { - Log.d(TAG, "openDevice failed"); + AltosDebug.debug("openDevice failed"); return; } @@ -167,7 +162,7 @@ public class AltosUsb extends AltosDroidLink { // if (manager.hasPermission(device)) // return true; - Log.d(TAG, "request permission for USB device " + device.toString()); + AltosDebug.debug("request permission for USB device " + device.toString()); manager.requestPermission(device, pi); return false; @@ -183,7 +178,7 @@ public class AltosUsb extends AltosDroidLink { int product = device.getProductId(); if (matchProduct(match_product, device)) { - Log.d(TAG, "found USB device " + device.toString()); + AltosDebug.debug("found USB device " + device.toString()); return device; } } @@ -193,11 +188,11 @@ public class AltosUsb extends AltosDroidLink { private void disconnected() { if (closed()) { - if (D) Log.d(TAG, "disconnected after closed"); + AltosDebug.debug("disconnected after closed"); return; } - if (D) Log.d(TAG, "Sending disconnected message"); + AltosDebug.debug("Sending disconnected message"); handler.obtainMessage(TelemetryService.MSG_DISCONNECTED, this).sendToTarget(); } @@ -210,20 +205,20 @@ public class AltosUsb extends AltosDroidLink { } if (tmp_connection != null) { - if (D) Log.d(TAG, "Closing USB device"); + AltosDebug.debug("Closing USB device"); tmp_connection.close(); } } int read(byte[] buffer, int len) { int ret = connection.bulkTransfer(in, buffer, len, -1); - if (D) Log.d(TAG, String.format("read(%d) = %d\n", len, ret)); + AltosDebug.debug("read(%d) = %d\n", len, ret); return ret; } int write(byte[] buffer, int len) { int ret = connection.bulkTransfer(out, buffer, len, -1); - if (D) Log.d(TAG, String.format("write(%d) = %d\n", len, ret)); + AltosDebug.debug("write(%d) = %d\n", len, ret); return ret; } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java index fd6abe0f..4af117a2 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java @@ -27,7 +27,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; -import android.util.Log; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; @@ -45,9 +44,6 @@ import android.widget.AdapterView.OnItemClickListener; * Activity in the result Intent. */ public class DeviceListActivity extends Activity { - // Debugging - private static final String TAG = "DeviceListActivity"; - private static final boolean D = true; // Return Intent extra public static final String EXTRA_DEVICE_ADDRESS = "device_address"; @@ -137,7 +133,7 @@ public class DeviceListActivity extends Activity { * Start device discover with the BluetoothAdapter */ private void doDiscovery() { - if (D) Log.d(TAG, "doDiscovery()"); + AltosDebug.debug("doDiscovery()"); // Indicate scanning in the title setProgressBarIndeterminateVisibility(true); @@ -173,7 +169,7 @@ public class DeviceListActivity extends Activity { else name = info; - if (D) Log.d(TAG, String.format("******* selected item '%s'", info)); + AltosDebug.debug("******* selected item '%s'", info); // Create the result Intent and include the MAC address Intent intent = new Intent(); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java index 42d80ad5..ceabe7b4 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java @@ -31,12 +31,8 @@ import android.view.*; import android.widget.*; import android.location.Location; import android.content.*; -import android.util.Log; public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { - // Debugging - static final String TAG = "AltosDroid"; - static final boolean D = true; AltosDroid mAltosDroid; @@ -75,7 +71,7 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { public boolean onScale(ScaleGestureDetector detector) { float f = detector.getScaleFactor(); - if (D) Log.d(TAG, String.format("onScale %f\n", f)); + AltosDebug.debug("onScale %f\n", f); if (f <= 0.8) { map.set_zoom(map.get_zoom() - 1); return true; @@ -88,12 +84,12 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { } public boolean onScaleBegin(ScaleGestureDetector detector) { - if (D) Log.d(TAG, String.format("onScaleBegin %f\n", detector.getScaleFactor())); + AltosDebug.debug("onScaleBegin %f\n", detector.getScaleFactor()); return true; } public void onScaleEnd(ScaleGestureDetector detector) { - if (D) Log.d(TAG, String.format("onScaleEnd %f\n", detector.getScaleFactor())); + AltosDebug.debug("onScaleEnd %f\n", detector.getScaleFactor()); } @Override @@ -105,19 +101,19 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { } if (scaling) { - if(D) Log.d(TAG, "scale in progress\n"); + if(AltosDebug.D) AltosDebug.debug("scale in progress\n"); if (event.getAction() == MotionEvent.ACTION_UP) { - if (D) Log.d(TAG, "scale finished\n"); + AltosDebug.debug("scale finished\n"); scaling = false; } return true; } if (event.getAction() == MotionEvent.ACTION_DOWN) { - if(D) Log.d(TAG, String.format("down event %g %g\n", event.getX(), event.getY())); + AltosDebug.debug("down event %g %g\n", event.getX(), event.getY()); map.touch_start((int) event.getX(), (int) event.getY(), true); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { - if(D) Log.d(TAG, String.format("continue event %g %g\n", event.getX(), event.getY())); + AltosDebug.debug("continue event %g %g\n", event.getX(), event.getY()); map.touch_continue((int) event.getX(), (int) event.getY(), true); } return true; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabsAdapter.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabsAdapter.java index 1ac34f9d..b34a25b6 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabsAdapter.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabsAdapter.java @@ -29,7 +29,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TabHost; import android.widget.TabWidget; -import android.util.Log; /** * This is a helper class that implements the management of tabs and all @@ -106,7 +105,7 @@ public class TabsAdapter extends FragmentPagerAdapter @Override public Fragment getItem(int position) { TabInfo info = mTabs.get(position); - Log.d(AltosDroid.TAG, String.format("TabsAdapter.getItem(%d)", position)); + AltosDebug.debug("TabsAdapter.getItem(%d)", position); info.fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args); return info.fragment; } @@ -131,7 +130,7 @@ public class TabsAdapter extends FragmentPagerAdapter if (cur_frag != null) { cur_frag.set_visible(true); } - Log.d(AltosDroid.TAG, String.format("TabsAdapter.onTabChanged(%s) = %d", tabId, position)); + AltosDebug.debug("TabsAdapter.onTabChanged(%s) = %d", tabId, position); mViewPager.setCurrentItem(position); } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java index 0cd9b2c1..7c3c2268 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java @@ -7,12 +7,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Environment; -import android.util.Log; public class TelemetryLogger { - private static final String TAG = "TelemetryLogger"; - private static final boolean D = true; - private Context context = null; private AltosLink link = null; private AltosLog logger = null; @@ -33,7 +29,7 @@ public class TelemetryLogger { private void close() { if (logger != null) { - if (D) Log.d(TAG, "Shutting down Telemetry Logging"); + AltosDebug.debug("Shutting down Telemetry Logging"); logger.close(); logger = null; } @@ -43,11 +39,11 @@ public class TelemetryLogger { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { if (logger == null) { - if (D) Log.d(TAG, "Starting up Telemetry Logging"); + AltosDebug.debug("Starting up Telemetry Logging"); logger = new AltosLog(link); } } else { - if (D) Log.d(TAG, "External Storage not present - stopping"); + AltosDebug.debug("External Storage not present - stopping"); close(); } } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 3f31fa6b..7b29fe44 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -22,7 +22,6 @@ package org.altusmetrum.AltosDroid; import java.text.*; import java.io.*; import java.util.concurrent.*; -import android.util.Log; import android.os.Handler; import org.altusmetrum.altoslib_7.*; @@ -30,9 +29,6 @@ import org.altusmetrum.altoslib_7.*; public class TelemetryReader extends Thread { - private static final String TAG = "TelemetryReader"; - private static final boolean D = true; - int crc_errors; Handler handler; @@ -67,13 +63,13 @@ public class TelemetryReader extends Thread { AltosState state = null; try { - if (D) Log.d(TAG, "starting loop"); + AltosDebug.debug("starting loop"); while (telemQueue != null) { try { state = read(); handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); } catch (ParseException pp) { - Log.e(TAG, String.format("Parse error: %d \"%s\"", pp.getErrorOffset(), pp.getMessage())); + AltosDebug.error("Parse error: %d \"%s\"", pp.getErrorOffset(), pp.getMessage()); } catch (AltosCRCException ce) { ++crc_errors; handler.obtainMessage(TelemetryService.MSG_CRC_ERROR, new Integer(crc_errors)).sendToTarget(); @@ -81,7 +77,7 @@ public class TelemetryReader extends Thread { } } catch (InterruptedException ee) { } catch (IOException ie) { - Log.e(TAG, "IO exception in telemetry reader"); + AltosDebug.error("IO exception in telemetry reader"); handler.obtainMessage(TelemetryService.MSG_DISCONNECTED, link).sendToTarget(); } finally { close(); @@ -89,7 +85,7 @@ public class TelemetryReader extends Thread { } public TelemetryReader (AltosLink in_link, Handler in_handler, AltosState in_state) { - if (D) Log.d(TAG, "connected TelemetryReader create started"); + AltosDebug.debug("connected TelemetryReader create started"); link = in_link; handler = in_handler; @@ -98,6 +94,6 @@ public class TelemetryReader extends Thread { link.add_monitor(telemQueue); link.set_telemetry(AltosLib.ao_telemetry_standard); - if (D) Log.d(TAG, "connected TelemetryReader created"); + AltosDebug.debug("connected TelemetryReader created"); } } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index ed7b75a1..627f5957 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -39,7 +39,6 @@ import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.os.Looper; -import android.util.Log; import android.widget.Toast; import android.location.Location; import android.location.LocationManager; @@ -51,9 +50,6 @@ import org.altusmetrum.altoslib_7.*; public class TelemetryService extends Service implements LocationListener { - private static final String TAG = "TelemetryService"; - private static final boolean D = true; - static final int MSG_REGISTER_CLIENT = 1; static final int MSG_UNREGISTER_CLIENT = 2; static final int MSG_CONNECT = 3; @@ -109,23 +105,23 @@ public class TelemetryService extends Service implements LocationListener { s.remove_client(msg.replyTo); break; case MSG_CONNECT: - if (D) Log.d(TAG, "Connect command received"); + AltosDebug.debug("Connect command received"); DeviceAddress address = (DeviceAddress) msg.obj; AltosDroidPreferences.set_active_device(address); s.start_altos_bluetooth(address, false); break; case MSG_OPEN_USB: - if (D) Log.d(TAG, "Open USB command received"); + AltosDebug.debug("Open USB command received"); UsbDevice device = (UsbDevice) msg.obj; s.start_usb(device); break; case MSG_DISCONNECT: - if (D) Log.d(TAG, "Disconnect command received"); + AltosDebug.debug("Disconnect command received"); s.address = null; s.disconnect(true); break; case MSG_SETFREQUENCY: - if (D) Log.d(TAG, "MSG_SETFREQUENCY"); + AltosDebug.debug("MSG_SETFREQUENCY"); s.telemetry_state.frequency = (Double) msg.obj; if (s.telemetry_state.connect == TelemetryState.CONNECT_CONNECTED) { try { @@ -138,7 +134,7 @@ public class TelemetryService extends Service implements LocationListener { s.send_to_clients(); break; case MSG_SETBAUD: - if (D) Log.d(TAG, "MSG_SETBAUD"); + AltosDebug.debug("MSG_SETBAUD"); s.telemetry_state.telemetry_rate = (Integer) msg.obj; if (s.telemetry_state.connect == TelemetryState.CONNECT_CONNECTED) { s.altos_link.set_telemetry_rate(s.telemetry_state.telemetry_rate); @@ -151,29 +147,29 @@ public class TelemetryService extends Service implements LocationListener { *Messages from AltosBluetooth */ case MSG_CONNECTED: - Log.d(TAG, "MSG_CONNECTED"); + AltosDebug.debug("MSG_CONNECTED"); bt = (AltosDroidLink) msg.obj; if (bt != s.altos_link) { - if (D) Log.d(TAG, "Stale message"); + AltosDebug.debug("Stale message"); break; } - if (D) Log.d(TAG, "Connected to device"); + AltosDebug.debug("Connected to device"); try { s.connected(); } catch (InterruptedException ie) { } break; case MSG_CONNECT_FAILED: - Log.d(TAG, "MSG_CONNECT_FAILED"); + AltosDebug.debug("MSG_CONNECT_FAILED"); bt = (AltosDroidLink) msg.obj; if (bt != s.altos_link) { - if (D) Log.d(TAG, "Stale message"); + AltosDebug.debug("Stale message"); break; } if (s.address != null) { - if (D) Log.d(TAG, "Connection failed... retrying"); + AltosDebug.debug("Connection failed... retrying"); s.start_altos_bluetooth(s.address, true); } else { s.disconnect(true); @@ -182,15 +178,15 @@ public class TelemetryService extends Service implements LocationListener { case MSG_DISCONNECTED: /* This can be sent by either AltosDroidLink or TelemetryReader */ - Log.d(TAG, "MSG_DISCONNECTED"); + AltosDebug.debug("MSG_DISCONNECTED"); bt = (AltosDroidLink) msg.obj; if (bt != s.altos_link) { - if (D) Log.d(TAG, "Stale message"); + AltosDebug.debug("Stale message"); break; } if (s.address != null) { - if (D) Log.d(TAG, "Connection lost... retrying"); + AltosDebug.debug("Connection lost... retrying"); s.start_altos_bluetooth(s.address, true); } else { s.disconnect(true); @@ -203,16 +199,16 @@ public class TelemetryService extends Service implements LocationListener { case MSG_TELEMETRY: s.telemetry_state.state = (AltosState) msg.obj; if (s.telemetry_state.state != null) { - if (D) Log.d(TAG, "Save state"); + AltosDebug.debug("Save state"); AltosPreferences.set_state(0, s.telemetry_state.state, null); } - if (D) Log.d(TAG, "MSG_TELEMETRY"); + AltosDebug.debug("MSG_TELEMETRY"); s.send_to_clients(); break; case MSG_CRC_ERROR: // forward crc error messages s.telemetry_state.crc_errors = (Integer) msg.obj; - if (D) Log.d(TAG, "MSG_CRC_ERROR"); + AltosDebug.debug("MSG_CRC_ERROR"); s.send_to_clients(); break; default: @@ -225,9 +221,9 @@ public class TelemetryService extends Service implements LocationListener { */ private Message message() { if (telemetry_state == null) - Log.d(TAG, "telemetry_state null!"); + AltosDebug.debug("telemetry_state null!"); if (telemetry_state.state == null) - Log.d(TAG, "telemetry_state.state null!"); + AltosDebug.debug("telemetry_state.state null!"); return Message.obtain(null, AltosDroid.MSG_STATE, telemetry_state); } @@ -236,7 +232,7 @@ public class TelemetryService extends Service implements LocationListener { private void add_client(Messenger client) { clients.add(client); - if (D) Log.d(TAG, "Client bound to service"); + AltosDebug.debug("Client bound to service"); /* On connect, send the current state to the new client */ @@ -246,7 +242,7 @@ public class TelemetryService extends Service implements LocationListener { * go ahead and try to reconnect to the device */ if (address != null && telemetry_state.connect == TelemetryState.CONNECT_DISCONNECTED) { - if (D) Log.d(TAG, "Reconnecting now..."); + AltosDebug.debug("Reconnecting now..."); start_altos_bluetooth(address, false); } } @@ -255,37 +251,37 @@ public class TelemetryService extends Service implements LocationListener { */ private void remove_client(Messenger client) { clients.remove(client); - if (D) Log.d(TAG, "Client unbound from service"); + AltosDebug.debug("Client unbound from service"); /* When the list of clients is empty, stop the service if * we have no current telemetry source */ if (clients.isEmpty() && telemetry_state.connect == TelemetryState.CONNECT_DISCONNECTED) { - if (!D) Log.d(TAG, "No clients, no connection. Stopping\n"); + AltosDebug.debug("No clients, no connection. Stopping\n"); stopSelf(); } } private void send_to_client(Messenger client, Message m) { try { - if (D) Log.d(TAG, String.format("Send message to client %s", client.toString())); + AltosDebug.debug("Send message to client %s", client.toString()); client.send(m); } catch (RemoteException e) { - if (D) Log.e(TAG, String.format("Client %s disappeared", client.toString())); + AltosDebug.error("Client %s disappeared", client.toString()); remove_client(client); } } private void send_to_clients() { Message m = message(); - if (D) Log.d(TAG, String.format("Send message to %d clients", clients.size())); + AltosDebug.debug("Send message to %d clients", clients.size()); for (Messenger client : clients) send_to_client(client, m); } private void disconnect(boolean notify) { - if (D) Log.d(TAG, "disconnect(): begin"); + AltosDebug.debug("disconnect(): begin"); telemetry_state.connect = TelemetryState.CONNECT_DISCONNECTED; telemetry_state.address = null; @@ -294,7 +290,7 @@ public class TelemetryService extends Service implements LocationListener { altos_link.closing(); if (telemetry_reader != null) { - if (D) Log.d(TAG, "disconnect(): stopping TelemetryReader"); + AltosDebug.debug("disconnect(): stopping TelemetryReader"); telemetry_reader.interrupt(); try { telemetry_reader.join(); @@ -303,21 +299,21 @@ public class TelemetryService extends Service implements LocationListener { telemetry_reader = null; } if (telemetry_logger != null) { - if (D) Log.d(TAG, "disconnect(): stopping TelemetryLogger"); + AltosDebug.debug("disconnect(): stopping TelemetryLogger"); telemetry_logger.stop(); telemetry_logger = null; } if (altos_link != null) { - if (D) Log.d(TAG, "disconnect(): stopping AltosDroidLink"); + AltosDebug.debug("disconnect(): stopping AltosDroidLink"); altos_link.close(); altos_link = null; } telemetry_state.config = null; if (notify) { - if (D) Log.d(TAG, "disconnect(): send message to clients"); + AltosDebug.debug("disconnect(): send message to clients"); send_to_clients(); if (clients.isEmpty()) { - if (D) Log.d(TAG, "disconnect(): no clients, terminating"); + AltosDebug.debug("disconnect(): no clients, terminating"); stopSelf(); } } @@ -338,19 +334,21 @@ public class TelemetryService extends Service implements LocationListener { private void start_altos_bluetooth(DeviceAddress address, boolean pause) { // Get the BLuetoothDevice object + AltosDebug.check_ui("start_altos_bluetooth\n"); BluetoothDevice device = bluetooth_adapter.getRemoteDevice(address.address); disconnect(false); this.address = address; - if (D) Log.d(TAG, String.format("start_altos_bluetooth(): Connecting to %s (%s)", device.getName(), device.getAddress())); - altos_link = new AltosBluetooth(device, handler); + AltosDebug.debug("start_altos_bluetooth(): Connecting to %s (%s)", device.getName(), device.getAddress()); + altos_link = new AltosBluetooth(device, handler, pause); telemetry_state.connect = TelemetryState.CONNECT_CONNECTING; telemetry_state.address = address; send_to_clients(); } private void connected() throws InterruptedException { - if (D) Log.d(TAG, "connected top"); + AltosDebug.debug("connected top"); + AltosDebug.check_ui("connected\n"); try { if (altos_link == null) throw new InterruptedException("no bluetooth"); @@ -360,9 +358,9 @@ public class TelemetryService extends Service implements LocationListener { } catch (TimeoutException e) { // If this timed out, then we really want to retry it, but // probably safer to just retry the connection from scratch. - if (D) Log.d(TAG, "connected timeout"); + AltosDebug.debug("connected timeout"); if (address != null) { - if (D) Log.d(TAG, "connected timeout, retrying"); + AltosDebug.debug("connected timeout, retrying"); start_altos_bluetooth(address, true); } else { handler.obtainMessage(MSG_CONNECT_FAILED).sendToTarget(); @@ -371,18 +369,18 @@ public class TelemetryService extends Service implements LocationListener { return; } - if (D) Log.d(TAG, "connected bluetooth configured"); + AltosDebug.debug("connected bluetooth configured"); telemetry_state.connect = TelemetryState.CONNECT_CONNECTED; telemetry_state.address = address; telemetry_reader = new TelemetryReader(altos_link, handler, telemetry_state.state); telemetry_reader.start(); - if (D) Log.d(TAG, "connected TelemetryReader started"); + AltosDebug.debug("connected TelemetryReader started"); telemetry_logger = new TelemetryLogger(this, altos_link); - if (D) Log.d(TAG, "Notify UI of connection"); + AltosDebug.debug("Notify UI of connection"); send_to_clients(); } @@ -412,7 +410,7 @@ public class TelemetryService extends Service implements LocationListener { AltosSavedState saved_state = AltosPreferences.state(0); if (saved_state != null) { - if (D) Log.d(TAG, String.format("recovered old state flight %d\n", saved_state.state.flight)); + AltosDebug.debug("recovered old state flight %d\n", saved_state.state.flight); telemetry_state.state = saved_state.state; } @@ -424,7 +422,7 @@ public class TelemetryService extends Service implements LocationListener { @Override public int onStartCommand(Intent intent, int flags, int startId) { - Log.i("TelemetryService", "Received start id " + startId + ": " + intent); + AltosDebug.debug("Received start id %d: %s", startId, intent); CharSequence text = getText(R.string.telemetry_service_started); @@ -483,7 +481,7 @@ public class TelemetryService extends Service implements LocationListener { public void onLocationChanged(Location location) { telemetry_state.location = location; - if (D) Log.d(TAG, "location changed"); + AltosDebug.debug("location changed"); send_to_clients(); } -- cgit v1.2.3 From c813c2c8f71017a686128e06b5178fc99ece251c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 6 Jun 2015 20:36:18 -0700 Subject: altosdroid: Add multi-tracker support This lets you view multiple trackers in the offline maps tab (online maps not done yet), saves state of each tracker to preferences. Signed-off-by: Keith Packard --- .../src/org/altusmetrum/AltosDroid/AltosDroid.java | 161 +++++++++++++++++---- .../AltosDroid/AltosDroidPreferencesBackend.java | 8 +- .../org/altusmetrum/AltosDroid/AltosDroidTab.java | 36 +++-- .../altusmetrum/AltosDroid/DeviceListActivity.java | 20 ++- .../src/org/altusmetrum/AltosDroid/TabAscent.java | 18 +-- .../src/org/altusmetrum/AltosDroid/TabDescent.java | 20 +-- .../src/org/altusmetrum/AltosDroid/TabLanded.java | 19 +-- .../src/org/altusmetrum/AltosDroid/TabMap.java | 70 +++++---- .../org/altusmetrum/AltosDroid/TabMapOffline.java | 43 +++--- .../src/org/altusmetrum/AltosDroid/TabPad.java | 18 +-- .../altusmetrum/AltosDroid/TelemetryLogger.java | 2 +- .../altusmetrum/AltosDroid/TelemetryReader.java | 21 +-- .../altusmetrum/AltosDroid/TelemetryService.java | 75 ++++++++-- .../org/altusmetrum/AltosDroid/TelemetryState.java | 8 +- 14 files changed, 316 insertions(+), 203 deletions(-) (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java') diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index 8c9ff31f..942ebbd5 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -42,16 +42,8 @@ import android.content.res.Resources; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.util.DisplayMetrics; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.Window; -import android.view.View; -import android.view.LayoutInflater; -import android.widget.TabHost; -import android.widget.TextView; -import android.widget.RelativeLayout; -import android.widget.Toast; +import android.view.*; +import android.widget.*; import android.app.AlertDialog; import android.location.Location; import android.hardware.usb.*; @@ -112,6 +104,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { // Timer and Saved flight state for Age calculation private Timer timer; AltosState saved_state; + TelemetryState telemetry_state; + Integer[] serials; UsbDevice pending_usb_device; boolean start_with_usb; @@ -136,13 +130,11 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { switch (msg.what) { case MSG_STATE: AltosDebug.debug("MSG_STATE"); - TelemetryState telemetry_state = (TelemetryState) msg.obj; - if (telemetry_state == null) { + if (msg.obj == null) { AltosDebug.debug("telemetry_state null!"); return; } - - ad.update_state(telemetry_state); + ad.update_state((TelemetryState) msg.obj); break; case MSG_UPDATE_AGE: AltosDebug.debug("MSG_UPDATE_AGE"); @@ -258,17 +250,34 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { boolean registered_units_listener; - void update_state(TelemetryState telemetry_state) { + int current_serial; + + void update_state(TelemetryState new_telemetry_state) { + + if (new_telemetry_state != null) + telemetry_state = new_telemetry_state; + + if (current_serial == 0) + current_serial = telemetry_state.latest_serial; if (!registered_units_listener) { registered_units_listener = true; AltosPreferences.register_units_listener(this); } + serials = telemetry_state.states.keySet().toArray(new Integer[0]); + update_title(telemetry_state); - update_ui(telemetry_state.state, telemetry_state.location); - if (telemetry_state.connect == TelemetryState.CONNECT_CONNECTED) - start_timer(); + + AltosDebug.debug("update state current serial %d\n", current_serial); + + AltosState state = null; + if (telemetry_state.states.containsKey(current_serial)) + state = telemetry_state.states.get(current_serial); + + update_ui(telemetry_state, state, telemetry_state.location); + + start_timer(); } boolean same_string(String a, String b) { @@ -283,22 +292,55 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { } } + + private int blend_component(int a, int b, double r, int shift, int mask) { + return ((int) (((a >> shift) & mask) * r + ((b >> shift) & mask) * (1 - r)) & mask) << shift; + } + private int blend_color(int a, int b, double r) { + return (blend_component(a, b, r, 0, 0xff) | + blend_component(a, b, r, 8, 0xff) | + blend_component(a, b, r, 16, 0xff) | + blend_component(a, b, r, 24, 0xff)); + } + + int state_age(AltosState state) { + return (int) ((System.currentTimeMillis() - state.received_time + 500) / 1000); + } + + void set_screen_on(int age) { + if (age < 60) + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + else + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + void update_age() { if (saved_state != null) { - int age = (int) ((System.currentTimeMillis() - saved_state.received_time + 500) / 1000); - boolean old = age >= 10; - if (old != mAgeViewOld) { - if (old) - mAgeView.setTextColor(mAgeOldColor); - else - mAgeView.setTextColor(mAgeNewColor); - mAgeViewOld = old; - } - mAgeView.setText(String.format("%d", age)); + int age = state_age(saved_state); + + double age_scale = age / 100.0; + + if (age_scale > 1.0) + age_scale = 1.0; + + mAgeView.setTextColor(blend_color(mAgeOldColor, mAgeNewColor, age_scale)); + + set_screen_on(age); + + String text; + if (age < 60) + text = String.format("%ds", age); + else if (age < 60 * 60) + text = String.format("%dm", age / 60); + else if (age < 60 * 60 * 24) + text = String.format("%dh", age / (60 * 60)); + else + text = String.format("%dd", age / (24 * 60 * 60)); + mAgeView.setText(text); } } - void update_ui(AltosState state, Location location) { + void update_ui(TelemetryState telem_state, AltosState state, Location location) { int prev_state = AltosLib.ao_flight_invalid; @@ -308,6 +350,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { prev_state = saved_state.state; if (state != null) { + set_screen_on(state_age(state)); + if (state.state == AltosLib.ao_flight_stateless) { boolean prev_locked = false; boolean locked = false; @@ -382,7 +426,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { } for (AltosDroidTab mTab : mTabs) - mTab.update_ui(state, from_receiver, location, mTab == mTabsAdapter.currentItem()); + mTab.update_ui(telem_state, state, from_receiver, location, mTab == mTabsAdapter.currentItem()); if (state != null && mAltosVoice != null) mAltosVoice.tell(state, from_receiver); @@ -744,6 +788,26 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { } } + void select_tracker(int serial) { + int i; + for (i = 0; i < serials.length; i++) + if (serials[i] == serial) + break; + if (i == serials.length) + return; + + AltosDebug.debug("Switching to serial %d\n", serial); + current_serial = serial; + update_state(null); + } + + void delete_track(int serial) { + try { + mService.send(Message.obtain(null, TelemetryService.MSG_DELETE_SERIAL, (Integer) serial)); + } catch (Exception ex) { + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { Intent serverIntent = null; @@ -824,8 +888,43 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { serverIntent = new Intent(this, MapTypeActivity.class); startActivityForResult(serverIntent, REQUEST_MAP_TYPE); return true; + case R.id.select_tracker: + if (serials != null) { + String[] trackers = new String[serials.length]; + for (int i = 0; i < serials.length; i++) + trackers[i] = String.format("%d", serials[i]); + AlertDialog.Builder builder_serial = new AlertDialog.Builder(this); + builder_serial.setTitle("Select a tracker"); + builder_serial.setItems(trackers, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + select_tracker(serials[item]); + } + }); + AlertDialog alert_serial = builder_serial.create(); + alert_serial.show(); + + } + return true; + case R.id.delete_track: + if (serials != null) { + String[] trackers = new String[serials.length]; + for (int i = 0; i < serials.length; i++) + trackers[i] = String.format("%d", serials[i]); + AlertDialog.Builder builder_serial = new AlertDialog.Builder(this); + builder_serial.setTitle("Delete a track"); + builder_serial.setItems(trackers, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + delete_track(serials[item]); + } + }); + AlertDialog alert_serial = builder_serial.create(); + alert_serial.show(); + + } + return true; } return false; } - } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java index 75676e28..dfc37153 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java @@ -44,7 +44,12 @@ public class AltosDroidPreferencesBackend implements AltosPreferencesBackend { public String[] keys() { Map all = prefs.getAll(); - return (String[])all.keySet().toArray(); + Object[] ao = all.keySet().toArray(); + + String[] as = new String[ao.length]; + for (int i = 0; i < ao.length; i++) + as[i] = (String) ao[i]; + return as; } public AltosPreferencesBackend node(String key) { @@ -104,6 +109,7 @@ public class AltosDroidPreferencesBackend implements AltosPreferencesBackend { } public void remove(String key) { + AltosDebug.debug("remove preference %s\n", key); editor.remove(key); } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java index f1f1b6de..017315af 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java @@ -29,11 +29,13 @@ import android.location.Location; import android.widget.TextView; public abstract class AltosDroidTab extends Fragment implements AltosUnitsListener { + TelemetryState last_telem_state; AltosState last_state; AltosGreatCircle last_from_receiver; Location last_receiver; + AltosDroid altos_droid; - public abstract void show(AltosState state, AltosGreatCircle from_receiver, Location receiver); + public abstract void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver); public abstract String tab_name(); @@ -41,8 +43,8 @@ public abstract class AltosDroidTab extends Fragment implements AltosUnitsListen } public void units_changed(boolean imperial_units) { - if (!isHidden() && last_state != null) - show(last_state, last_from_receiver, last_receiver); + if (!isHidden()) + show(last_telem_state, last_state, last_from_receiver, last_receiver); } public void set_value(TextView text_view, @@ -59,17 +61,27 @@ public abstract class AltosDroidTab extends Fragment implements AltosUnitsListen FragmentTransaction ft = AltosDroid.fm.beginTransaction(); AltosDebug.debug("set visible %b %s\n", visible, tab_name()); if (visible) { - AltosState state = last_state; - AltosGreatCircle from_receiver = last_from_receiver; - Location receiver = last_receiver; - ft.show(this); - show(state, from_receiver, receiver); + show(last_telem_state, last_state, last_from_receiver, last_receiver); } else ft.hide(this); ft.commitAllowingStateLoss(); } + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + altos_droid = (AltosDroid) activity; + altos_droid.registerTab(this); + } + + @Override + public void onDetach() { + super.onDetach(); + altos_droid.unregisterTab(this); + altos_droid = null; + } + @Override public void onResume() { super.onResume(); @@ -77,12 +89,16 @@ public abstract class AltosDroidTab extends Fragment implements AltosUnitsListen set_visible(true); } - public void update_ui(AltosState state, AltosGreatCircle from_receiver, Location receiver, boolean is_current) { + public void update_ui(TelemetryState telem_state, AltosState state, + AltosGreatCircle from_receiver, Location receiver, boolean is_current) + { + last_telem_state = telem_state; last_state = state; last_from_receiver = from_receiver; last_receiver = receiver; + AltosDebug.debug("update_ui tab %s is_current %b\n", tab_name(), is_current); if (is_current) - show(state, from_receiver, receiver); + show(telem_state, state, from_receiver, receiver); else return; } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java index 4af117a2..f36ef267 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java @@ -191,14 +191,22 @@ public class DeviceListActivity extends Activity { // When discovery finds a device if (BluetoothDevice.ACTION_FOUND.equals(action)) { - // Get the BluetoothDevice object from the Intent + + /* Get the BluetoothDevice object from the Intent + */ BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - // If it's already paired, skip it, because it's been listed already - if ( device.getBondState() != BluetoothDevice.BOND_BONDED - && device.getName().startsWith("TeleBT") ) { - mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); + + /* If it's already paired, skip it, because it's been listed already + */ + if (device != null && device.getBondState() != BluetoothDevice.BOND_BONDED) + { + String name = device.getName(); + if (name != null && name.startsWith("TeleBT")) + mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); } - // When discovery is finished, change the Activity title + + /* When discovery is finished, change the Activity title + */ } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { setProgressBarIndeterminateVisibility(false); setTitle(R.string.select_device); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java index 797dc7c3..afce937f 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java @@ -30,8 +30,6 @@ import android.widget.TextView; import android.location.Location; public class TabAscent extends AltosDroidTab { - AltosDroid mAltosDroid; - private TextView mHeightView; private TextView mMaxHeightView; private TextView mSpeedView; @@ -45,13 +43,6 @@ public class TabAscent extends AltosDroidTab { private TextView mMainVoltageView; private GoNoGoLights mMainLights; - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_ascent, container, false); @@ -78,18 +69,11 @@ public class TabAscent extends AltosDroidTab { return v; } - @Override - public void onDestroy() { - super.onDestroy(); - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - } - public String tab_name() { return "ascent"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { set_value(mHeightView, AltosConvert.height, 6, state.height()); set_value(mHeightView, AltosConvert.height, 6, state.height()); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java index f3f5a0f1..3429ee72 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java @@ -30,8 +30,6 @@ import android.widget.TextView; import android.location.Location; public class TabDescent extends AltosDroidTab { - AltosDroid mAltosDroid; - private TextView mSpeedView; private TextView mHeightView; private TextView mElevationView; @@ -46,14 +44,6 @@ public class TabDescent extends AltosDroidTab { private TextView mMainVoltageView; private GoNoGoLights mMainLights; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_descent, container, false); @@ -81,17 +71,9 @@ public class TabDescent extends AltosDroidTab { return v; } - - @Override - public void onDestroy() { - super.onDestroy(); - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - } - public String tab_name() { return "descent"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { set_value(mSpeedView, AltosConvert.speed, 6, state.speed()); set_value(mHeightView, AltosConvert.height, 6, state.height()); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java index d37891f7..dd3f938e 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java @@ -29,8 +29,6 @@ import android.widget.TextView; import android.location.Location; public class TabLanded extends AltosDroidTab { - AltosDroid mAltosDroid; - private TextView mBearingView; private TextView mDistanceView; private TextView mTargetLatitudeView; @@ -41,14 +39,6 @@ public class TabLanded extends AltosDroidTab { private TextView mMaxSpeedView; private TextView mMaxAccelView; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_landed, container, false); @@ -66,16 +56,9 @@ public class TabLanded extends AltosDroidTab { return v; } - @Override - public void onDestroy() { - super.onDestroy(); - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - } - public String tab_name() { return "landed"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (from_receiver != null) { mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); set_value(mDistanceView, AltosConvert.distance, 6, from_receiver.distance); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index cea3cac6..ff36875d 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -33,6 +33,7 @@ import com.google.android.gms.maps.model.PolylineOptions; import android.app.Activity; import android.graphics.Color; +import android.graphics.*; import android.os.Bundle; import android.support.v4.app.Fragment; //import android.support.v4.app.FragmentTransaction; @@ -43,8 +44,6 @@ import android.widget.TextView; import android.location.Location; public class TabMap extends AltosDroidTab { - AltosDroid mAltosDroid; - private SupportMapFragment mMapFragment; private GoogleMap mMap; private boolean mapLoaded = false; @@ -63,11 +62,40 @@ public class TabMap extends AltosDroidTab { private double mapAccuracy = -1; - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); + private Bitmap rocket_bitmap(String text) { + + /* From: http://mapicons.nicolasmollet.com/markers/industry/military/missile-2/ + */ + Bitmap orig_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rocket); + Bitmap bitmap = orig_bitmap.copy(Bitmap.Config.ARGB_8888, true); + + Canvas canvas = new Canvas(bitmap); + Paint paint = new Paint(); + paint.setTextSize(40); + paint.setColor(0xff000000); + + Rect bounds = new Rect(); + paint.getTextBounds(text, 0, text.length(), bounds); + + int width = bounds.right - bounds.left; + int height = bounds.bottom - bounds.top; + + float x = bitmap.getWidth() / 2.0f - width / 2.0f; + float y = bitmap.getHeight() / 2.0f - height / 2.0f; + + AltosDebug.debug("map label x %f y %f\n", x, y); + + canvas.drawText(text, 0, text.length(), x, y, paint); + return bitmap; + } + + private Marker rocket_marker(int serial, double lat, double lon) { + Bitmap bitmap = rocket_bitmap(String.format("%d", serial)); + + return mMap.addMarker(new MarkerOptions() + .icon(BitmapDescriptorFactory.fromBitmap(bitmap)) + .position(new LatLng(lat, lon)) + .visible(false)); } @Override @@ -102,33 +130,17 @@ public class TabMap extends AltosDroidTab { getChildFragmentManager().beginTransaction().add(R.id.map, mMapFragment).commit(); } - @Override - public void onDestroyView() { - super.onDestroyView(); - - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - - //Fragment fragment = (getFragmentManager().findFragmentById(R.id.map)); - //FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); - //ft.remove(fragment); - //ft.commit(); - } - private void setupMap() { mMap = mMapFragment.getMap(); if (mMap != null) { - set_map_type(mAltosDroid.map_type); + set_map_type(altos_droid.map_type); mMap.setMyLocationEnabled(true); mMap.getUiSettings().setTiltGesturesEnabled(false); mMap.getUiSettings().setZoomControlsEnabled(false); - mRocketMarker = mMap.addMarker( - // From: http://mapicons.nicolasmollet.com/markers/industry/military/missile-2/ - new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.rocket)) - .position(new LatLng(0,0)) - .visible(false) - ); + Bitmap label_bitmap = rocket_bitmap("hello"); + + mRocketMarker = rocket_marker(1800,0,0); mPadMarker = mMap.addMarker( new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.pad)) @@ -156,7 +168,7 @@ public class TabMap extends AltosDroidTab { public String tab_name() { return "map"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (from_receiver != null) { mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); set_value(mDistanceView, AltosConvert.distance, 6, from_receiver.distance); @@ -166,6 +178,8 @@ public class TabMap extends AltosDroidTab { if (mapLoaded) { if (state.gps != null) { mRocketMarker.setPosition(new LatLng(state.gps.lat, state.gps.lon)); + mRocketMarker.setTitle("hello world"); + mRocketMarker.setSnippet("hello"); mRocketMarker.setVisible(true); mPolyline.setPoints(Arrays.asList(new LatLng(state.pad_lat, state.pad_lon), new LatLng(state.gps.lat, state.gps.lon))); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java index 56e296d9..4b728c23 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java @@ -54,8 +54,6 @@ class Rocket { public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { - AltosDroid mAltosDroid; - AltosMap map; AltosLatLon here; @@ -325,11 +323,9 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { @Override public void onAttach(Activity activity) { super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); map = new AltosMap(this); - map.set_maptype(mAltosDroid.map_type); + map.set_maptype(altos_droid.map_type); pad_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pad); /* arrow at the bottom of the launchpad image */ @@ -347,12 +343,6 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { here_off_y = here_bitmap.getHeight() / 2; } - @Override - public void onDetach() { - super.onDetach(); - mAltosDroid = null; - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -382,7 +372,6 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { public void onDestroyView() { super.onDestroyView(); - mAltosDroid.unregisterTab(this); } private void center(double lat, double lon, double accuracy) { @@ -395,7 +384,7 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { public String tab_name() { return "offmap"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (from_receiver != null) { mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); set_value(mDistanceView, AltosConvert.distance, 6, from_receiver.distance); @@ -411,20 +400,30 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { } if (state.pad_lat != AltosLib.MISSING && pad == null) pad = new AltosLatLon(state.pad_lat, state.pad_lon); + } - int serial = state.serial; - if (serial == AltosLib.MISSING) - serial = 0; + if (telem_state != null) { + Integer[] old_serial = rockets.keySet().toArray(new Integer[0]); + Integer[] new_serial = telem_state.states.keySet().toArray(new Integer[0]); - Rocket rocket = null; + /* remove deleted keys */ + for (int serial : old_serial) { + if (!telem_state.states.containsKey(serial)) + rockets.remove(serial); + } + + /* set remaining keys */ - if (state.gps != null && state.gps.locked) { - if (!rockets.containsKey(serial)) { + for (int serial : new_serial) { + Rocket rocket; + AltosState t_state = telem_state.states.get(serial); + if (rockets.containsKey(serial)) + rocket = rockets.get(serial); + else { rocket = new Rocket(String.format("%d", serial), this); rockets.put(serial, rocket); - } else - rocket = rockets.get(serial); - rocket.set_position(new AltosLatLon(state.gps.lat, state.gps.lon)); + } + rocket.set_position(new AltosLatLon(t_state.gps.lat, t_state.gps.lon)); } } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index f7eb43db..7a256963 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -30,8 +30,6 @@ import android.widget.TextView; import android.location.Location; public class TabPad extends AltosDroidTab { - AltosDroid mAltosDroid; - private TextView mBatteryVoltageView; private TextView mBatteryVoltageLabel; private GoNoGoLights mBatteryLights; @@ -51,13 +49,6 @@ public class TabPad extends AltosDroidTab { private TextView mPadLongitudeView; private TextView mPadAltitudeView; - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_pad, container, false); @@ -100,16 +91,9 @@ public class TabPad extends AltosDroidTab { return v; } - @Override - public void onDestroy() { - super.onDestroy(); - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - } - public String tab_name() { return "pad"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { mBatteryVoltageView.setText(AltosDroid.number("%4.2f V", state.battery_voltage)); mBatteryLights.set(state.battery_voltage >= AltosLib.ao_battery_good, state.battery_voltage == AltosLib.MISSING); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java index 7c3c2268..28bab401 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java @@ -34,7 +34,7 @@ public class TelemetryLogger { logger = null; } } - + void handleExternalStorageState() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 7b29fe44..4d4f0ed1 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -21,6 +21,7 @@ package org.altusmetrum.AltosDroid; import java.text.*; import java.io.*; +import java.util.*; import java.util.concurrent.*; import android.os.Handler; @@ -34,25 +35,18 @@ public class TelemetryReader extends Thread { Handler handler; AltosLink link; - AltosState state = null; LinkedBlockingQueue telemQueue; - public AltosState read() throws ParseException, AltosCRCException, InterruptedException, IOException { + public AltosTelemetry read() throws ParseException, AltosCRCException, InterruptedException, IOException { AltosLine l = telemQueue.take(); if (l.line == null) throw new IOException("IO error"); AltosTelemetry telem = AltosTelemetryLegacy.parse(l.line); - if (state == null) - state = new AltosState(); - else - state = state.clone(); - telem.update_state(state); - return state; + return telem; } public void close() { - state = null; link.remove_monitor(telemQueue); link = null; telemQueue.clear(); @@ -60,14 +54,12 @@ public class TelemetryReader extends Thread { } public void run() { - AltosState state = null; - try { AltosDebug.debug("starting loop"); while (telemQueue != null) { try { - state = read(); - handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); + AltosTelemetry telem = read(); + handler.obtainMessage(TelemetryService.MSG_TELEMETRY, telem).sendToTarget(); } catch (ParseException pp) { AltosDebug.error("Parse error: %d \"%s\"", pp.getErrorOffset(), pp.getMessage()); } catch (AltosCRCException ce) { @@ -84,12 +76,11 @@ public class TelemetryReader extends Thread { } } - public TelemetryReader (AltosLink in_link, Handler in_handler, AltosState in_state) { + public TelemetryReader (AltosLink in_link, Handler in_handler) { AltosDebug.debug("connected TelemetryReader create started"); link = in_link; handler = in_handler; - state = in_state; telemQueue = new LinkedBlockingQueue(); link.add_monitor(telemQueue); link.set_telemetry(AltosLib.ao_telemetry_standard); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index eae360db..80694ea7 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -18,10 +18,8 @@ package org.altusmetrum.AltosDroid; import java.lang.ref.WeakReference; -import java.util.ArrayList; import java.util.concurrent.TimeoutException; -import java.util.Timer; -import java.util.TimerTask; +import java.util.*; import android.app.Notification; //import android.app.NotificationManager; @@ -62,6 +60,7 @@ public class TelemetryService extends Service implements LocationListener { static final int MSG_CRC_ERROR = 10; static final int MSG_SETBAUD = 11; static final int MSG_DISCONNECT = 12; + static final int MSG_DELETE_SERIAL = 13; // Unique Identification Number for the Notification. // We use it on Notification start, and to cancel it. @@ -120,6 +119,10 @@ public class TelemetryService extends Service implements LocationListener { s.address = null; s.disconnect(true); break; + case MSG_DELETE_SERIAL: + AltosDebug.debug("Delete Serial command received"); + s.delete_serial((Integer) msg.obj); + break; case MSG_SETFREQUENCY: AltosDebug.debug("MSG_SETFREQUENCY"); s.telemetry_state.frequency = (Double) msg.obj; @@ -197,13 +200,8 @@ public class TelemetryService extends Service implements LocationListener { * Messages from TelemetryReader */ case MSG_TELEMETRY: - s.telemetry_state.state = (AltosState) msg.obj; - if (s.telemetry_state.state != null) { - AltosDebug.debug("Save state"); - AltosPreferences.set_state(0, s.telemetry_state.state, null); - } AltosDebug.debug("MSG_TELEMETRY"); - s.send_to_clients(); + s.telemetry((AltosTelemetry) msg.obj); break; case MSG_CRC_ERROR: // forward crc error messages @@ -217,13 +215,31 @@ public class TelemetryService extends Service implements LocationListener { } } + /* Handle telemetry packet + */ + private void telemetry(AltosTelemetry telem) { + AltosState state; + + if (telemetry_state.states.containsKey(telem.serial)) + state = telemetry_state.states.get(telem.serial).clone(); + else + state = new AltosState(); + telem.update_state(state); + telemetry_state.states.put(telem.serial, state); + if (state != null) { + AltosDebug.debug("Save state %d", telem.serial); + AltosPreferences.set_state(telem.serial, state, null); + } + send_to_clients(); + } + /* Construct the message to deliver to clients */ private Message message() { if (telemetry_state == null) AltosDebug.debug("telemetry_state null!"); - if (telemetry_state.state == null) - AltosDebug.debug("telemetry_state.state null!"); + if (telemetry_state.states == null) + AltosDebug.debug("telemetry_state.states null!"); return Message.obtain(null, AltosDroid.MSG_STATE, telemetry_state); } @@ -332,6 +348,12 @@ public class TelemetryService extends Service implements LocationListener { } } + private void delete_serial(int serial) { + telemetry_state.states.remove((Integer) serial); + AltosPreferences.remove_state(serial); + send_to_clients(); + } + private void start_altos_bluetooth(DeviceAddress address, boolean pause) { // Get the BLuetoothDevice object BluetoothDevice device = bluetooth_adapter.getRemoteDevice(address.address); @@ -372,7 +394,7 @@ public class TelemetryService extends Service implements LocationListener { telemetry_state.connect = TelemetryState.CONNECT_CONNECTED; telemetry_state.address = address; - telemetry_reader = new TelemetryReader(altos_link, handler, telemetry_state.state); + telemetry_reader = new TelemetryReader(altos_link, handler); telemetry_reader.start(); AltosDebug.debug("connected TelemetryReader started"); @@ -406,11 +428,32 @@ public class TelemetryService extends Service implements LocationListener { telemetry_state.connect = TelemetryState.CONNECT_DISCONNECTED; telemetry_state.address = null; - AltosSavedState saved_state = AltosPreferences.state(0); + /* Pull the saved state information out of the preferences database + */ + ArrayList serials = AltosPreferences.list_states(); - if (saved_state != null) { - AltosDebug.debug("recovered old state flight %d\n", saved_state.state.flight); - telemetry_state.state = saved_state.state; + telemetry_state.latest_serial = AltosPreferences.latest_state(); + + for (int serial : serials) { + AltosSavedState saved_state = AltosPreferences.state(serial); + if (saved_state != null) { + if (serial == 0) { + serial = saved_state.state.serial; + AltosPreferences.set_state(serial, saved_state.state, saved_state.listener_state); + AltosPreferences.remove_state(0); + } + if (telemetry_state.latest_serial == 0) + telemetry_state.latest_serial = serial; + + AltosDebug.debug("recovered old state serial %d flight %d\n", + serial, + saved_state.state.flight); + if (saved_state.state.gps != null) + AltosDebug.debug("\tposition %f,%f\n", + saved_state.state.gps.lat, + saved_state.state.gps.lon); + telemetry_state.states.put(serial, saved_state.state); + } } // Listen for GPS and Network position updates diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java index fb7e1893..d023128f 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java @@ -17,6 +17,7 @@ package org.altusmetrum.AltosDroid; +import java.util.*; import org.altusmetrum.altoslib_7.*; import android.location.Location; @@ -29,16 +30,19 @@ public class TelemetryState { int connect; DeviceAddress address; AltosConfigData config; - AltosState state; Location location; int crc_errors; double frequency; int telemetry_rate; + HashMap states; + + int latest_serial; + public TelemetryState() { connect = CONNECT_NONE; config = null; - state = null; + states = new HashMap(); location = null; crc_errors = 0; frequency = AltosPreferences.frequency(0); -- cgit v1.2.3