altosdroid: stop sending device name, just send config data
authorMike Beattie <mike@ethernal.org>
Tue, 28 Aug 2012 10:07:39 +0000 (22:07 +1200)
committerMike Beattie <mike@ethernal.org>
Tue, 28 Aug 2012 10:07:39 +0000 (22:07 +1200)
* Kinda complicated, but ultimately more sensible
* Just send the config data as an arg to MSG_CONNECTED
* keep retrying connection till we actually get config data

Signed-off-by: Mike Beattie <mike@ethernal.org>
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java

index bbb2970f44d0aa676e8cbb6120fda68274a71dfc..df2263ce93f79d0b5e72afae84d72a9acacc4272 100644 (file)
@@ -43,6 +43,8 @@ import android.view.Window;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import org.altusmetrum.AltosLib.*;
+
 /**
  * This is the main Activity that displays the current chat session.
  */
@@ -71,8 +73,8 @@ public class AltosDroid extends Activity {
        private Messenger mService = null;
        final Messenger mMessenger = new Messenger(new IncomingHandler(this));
 
-       // Name of the connected device
-       private String mConnectedDeviceName = null;
+       // TeleBT Config data
+       private AltosConfigData mConfigData = null;
        // Local Bluetooth adapter
        private BluetoothAdapter mBluetoothAdapter = null;
 
@@ -93,16 +95,20 @@ public class AltosDroid extends Activity {
                                if(D) Log.d(TAG, "MSG_STATE_CHANGE: " + msg.arg1);
                                switch (msg.arg1) {
                                case TelemetryService.STATE_CONNECTED:
+                                       ad.mConfigData = (AltosConfigData) msg.obj;
+                                       String str = String.format(" %s S/N: %d", ad.mConfigData.product, ad.mConfigData.serial);
                                        ad.mTitle.setText(R.string.title_connected_to);
-                                       ad.mTitle.append(ad.mConnectedDeviceName);
-                                       ad.mSerialView.setText("");
+                                       ad.mTitle.append(str);
+                                       Toast.makeText(ad.getApplicationContext(), "Connected to " + str, Toast.LENGTH_SHORT).show();
                                        break;
                                case TelemetryService.STATE_CONNECTING:
                                        ad.mTitle.setText(R.string.title_connecting);
                                        break;
                                case TelemetryService.STATE_READY:
                                case TelemetryService.STATE_NONE:
+                                       ad.mConfigData = null;
                                        ad.mTitle.setText(R.string.title_not_connected);
+                                       ad.mSerialView.setText("");
                                        break;
                                }
                                break;
index cd47c6f9587b0e833b9d7a455327a7860f819603..d11fc53a8c47df6a6273b526fa4a13322af9425b 100644 (file)
@@ -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 {
 
@@ -68,6 +68,7 @@ public class TelemetryService extends Service {
        // Name of the connected device
        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() {
@@ -176,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();
        }