X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=altosdroid%2Fsrc%2Forg%2Faltusmetrum%2FAltosDroid%2FTelemetryService.java;h=d11fc53a8c47df6a6273b526fa4a13322af9425b;hb=5c7370dcd7a65c81a3c903a71167e07cfcbade53;hp=10c2e26fdd26f87d5111cda99c0d2e986468b33b;hpb=c7bef83fd553987f83c0bf7ff37ef941872564fe;p=fw%2Faltos diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index 10c2e26f..d11fc53a 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -36,7 +36,7 @@ import android.os.RemoteException; import android.util.Log; import android.widget.Toast; -//import org.altusmetrum.AltosLib.*; +import org.altusmetrum.AltosLib.*; public class TelemetryService extends Service { @@ -66,8 +66,9 @@ public class TelemetryService extends Service { final Messenger mMessenger = new Messenger(mHandler); // Target we publish for clients to send messages to IncomingHandler. // Name of the connected device - private BluetoothDevice device = null; - private AltosBluetooth mAltosBluetooth = null; + private BluetoothDevice device = null; + private AltosBluetooth mAltosBluetooth = null; + private AltosConfigData mConfigData = null; private TelemetryReader mTelemetryReader = null; // internally track state of bluetooth connection @@ -85,8 +86,9 @@ public class TelemetryService extends Service { case MSG_REGISTER_CLIENT: s.mClients.add(msg.replyTo); try { - msg.replyTo.send(Message.obtain(null, AltosDroid.MSG_DEVNAME, s.device.getName())); - msg.replyTo.send(Message.obtain(null, AltosDroid.MSG_STATE_CHANGE, s.state, -1)); + // Now we try to send the freshly connected UI any relavant information about what + // we're talking to - Basically state and Config Data. + msg.replyTo.send(Message.obtain(null, AltosDroid.MSG_STATE_CHANGE, s.state, -1, s.mConfigData)); } catch (RemoteException e) { s.mClients.remove(msg.replyTo); } @@ -153,6 +155,7 @@ public class TelemetryService extends Service { mAltosBluetooth = null; } device = null; + mConfigData = null; } private void startAltosBluetooth() { @@ -161,8 +164,14 @@ public class TelemetryService extends Service { mAltosBluetooth = new AltosBluetooth(device, mHandler); setState(STATE_CONNECTING); } else { + // This is a bit of a hack - if it appears we're still connected, we treat this as a restart. + // So, to give a suitable delay to teardown/bringup, we just schedule a resend of a message + // to ourselves in a few seconds time that will ultimately call this method again. + // ... then we tear down the existing connection. + // We do it this way around so that we don't lose a reference to the device when this method + // is called on reception of MSG_CONNECT_FAILED in the handler above. + mHandler.sendMessageDelayed(Message.obtain(null, MSG_CONNECT, device), 3000); stopAltosBluetooth(); - mHandler.sendMessageDelayed(Message.obtain(null, MSG_CONNECT, device), 1000); } } @@ -170,17 +179,26 @@ public class TelemetryService extends Service { if (D) Log.d(TAG, "setState(): " + state + " -> " + s); state = s; - sendMessageToClients(Message.obtain(null, AltosDroid.MSG_STATE_CHANGE, state, -1)); + // This shouldn't be required - mConfigData should be null for any non-connected + // state, but to be safe and to reduce message size + AltosConfigData acd = (state == STATE_CONNECTED) ? mConfigData : null; + + sendMessageToClients(Message.obtain(null, AltosDroid.MSG_STATE_CHANGE, state, -1, acd)); } private void connected() { - sendMessageToClients(Message.obtain(null, AltosDroid.MSG_DEVNAME, device.getName())); - setState(STATE_CONNECTED); try { - sendMessageToClients(Message.obtain(null, AltosDroid.MSG_DEVCONFIG, mAltosBluetooth.config_data())); + mConfigData = mAltosBluetooth.config_data(); } catch (InterruptedException e) { } catch (TimeoutException e) { + // If this timed out, then we really want to retry it, but + // probably safer to just retry the connection from scratch. + mHandler.obtainMessage(MSG_CONNECT_FAILED).sendToTarget(); + return; } + + setState(STATE_CONNECTED); + mTelemetryReader = new TelemetryReader(mAltosBluetooth, mHandler); mTelemetryReader.start(); }