X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosdroid%2Fsrc%2Forg%2Faltusmetrum%2FAltosDroid%2FAltosBluetooth.java;h=18581142efc13679a24d1768af563e538a3e4ff2;hb=162c640d382b9f823573578fe97584adc94cd9b6;hp=3bfa3488c8a25337de736e0b8a4b022125531468;hpb=a9ec3c96288b7ea4e40586321a0a98edf0c8fee5;p=fw%2Faltos diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java index 3bfa3488..18581142 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java @@ -1,6 +1,6 @@ /* - * Copyright © 2011 Keith Packard - * Copyright © 2012 Mike Beattie + * Copyright © 2011 Keith Packard + * Copyright © 2012 Mike Beattie * * 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 @@ -26,7 +26,9 @@ import java.util.UUID; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; +//import android.os.Bundle; import android.os.Handler; +//import android.os.Message; import android.util.Log; import org.altusmetrum.AltosLib.*; @@ -76,45 +78,51 @@ public class AltosBluetooth extends AltosLink { } public void run() { - if (D) Log.i(TAG, "BEGIN ConnectThread"); + if (D) Log.i(TAG, "ConnectThread: BEGIN"); setName("ConnectThread"); // Always cancel discovery because it will slow down a connection adapter.cancelDiscovery(); - // Make a connection to the BluetoothSocket - try { - // This is a blocking call and will only return on a - // successful connection or an exception - socket.connect(); - } catch (IOException e) { - // Close the socket + synchronized (AltosBluetooth.this) { + // Make a connection to the BluetoothSocket try { - socket.close(); - } catch (IOException e2) { - if (D) Log.e(TAG, "unable to close() socket during connection failure", e2); - } - connection_failed(); - return; - } + // This is a blocking call and will only return on a + // successful connection or an exception + socket.connect(); - try { - synchronized (AltosBluetooth.this) { input = socket.getInputStream(); output = socket.getOutputStream(); + } catch (IOException e) { + // Close the socket + try { + socket.close(); + } catch (IOException e2) { + if (D) Log.e(TAG, "ConnectThread: Failed to close() socket after failed connection"); + } + input = null; + output = null; + AltosBluetooth.this.notifyAll(); + handler.obtainMessage(TelemetryService.MSG_CONNECT_FAILED).sendToTarget(); + if (D) Log.e(TAG, "ConnectThread: Failed to establish connection"); + return; + } - // Configure the newly connected device for telemetry - print("~\nE 0\n"); - set_monitor(false); + // Configure the newly connected device for telemetry + print("~\nE 0\n"); + set_monitor(false); - // Reset the ConnectThread because we're done - AltosBluetooth.this.notify(); - connect_thread = null; - if (D) Log.i(TAG, "Completed connect"); - } - } catch (Exception e) { - if (D) Log.e(TAG, "Failed to finish connection", e); - e.printStackTrace(); + // Reset the ConnectThread because we're done + connect_thread = null; + + // Send the device name back to the Telemetry Service + name = device.getName(); + handler.obtainMessage(TelemetryService.MSG_CONNECTED).sendToTarget(); + + // Notify other waiting threads, now that we're connected + AltosBluetooth.this.notifyAll(); + + if (D) Log.i(TAG, "ConnectThread: Connect completed"); } } @@ -123,28 +131,33 @@ public class AltosBluetooth extends AltosLink { if (socket != null) socket.close(); } catch (IOException e) { - if (D) Log.e(TAG, "close() of connect socket failed", e); + if (D) Log.e(TAG, "ConnectThread: close() of connect socket failed", e); } } } - private synchronized void wait_connected() throws InterruptedException { + private synchronized void wait_connected() throws InterruptedException, IOException { + if (D) Log.i(TAG, "wait_connected(): begin"); if (input == null) { + if (D) Log.i(TAG, "wait_connected(): waiting"); wait(); + if (D) Log.i(TAG, "wait_connected(): wait ended.."); + if (input == null) throw new IOException(); } } private void connection_failed() { - if (D) Log.i(TAG, "Bluetooth Connection failed!"); + if (D) Log.e(TAG, "Bluetooth Socket IO failed!"); + handler.obtainMessage(TelemetryService.MSG_DISCONNECTED).sendToTarget(); } - + public void print(String data) { byte[] bytes = data.getBytes(); + if (D) Log.i(TAG, "print(): begin"); try { - if (D) Log.i(TAG, "Entering print();"); wait_connected(); output.write(bytes); - if (D) Log.i(TAG, "Writing bytes: '" + data + "'"); + if (D) Log.i(TAG, "print(): Wrote bytes: '" + data.replace('\n', '\\') + "'"); } catch (IOException e) { connection_failed(); } catch (InterruptedException e) { @@ -153,8 +166,10 @@ public class AltosBluetooth extends AltosLink { } public int getchar() { + if (D) Log.i(TAG, "getchar(): begin"); try { wait_connected(); + if (D) Log.i(TAG, "getchar(): proceeding"); return input.read(); } catch (IOException e) { connection_failed(); @@ -163,20 +178,36 @@ public class AltosBluetooth extends AltosLink { } return AltosLink.ERROR; } - + public void close() { + if (D) Log.i(TAG, "close(): begin"); synchronized(this) { + if (D) Log.i(TAG, "close(): synched"); + if (connect_thread != null) { + if (D) Log.i(TAG, "close(): stopping connect_thread"); connect_thread.cancel(); connect_thread = null; } + if (D) Log.i(TAG, "close(): Closing socket"); + try { + socket.close(); + } catch (IOException e) { + if (D) Log.e(TAG, "close(): unable to close() socket"); + } if (input_thread != null) { + if (D) Log.i(TAG, "close(): stopping input_thread"); try { + if (D) Log.i(TAG, "close(): input_thread.interrupt()....."); input_thread.interrupt(); + if (D) Log.i(TAG, "close(): input_thread.join()....."); input_thread.join(); } catch (Exception e) {} input_thread = null; } + input = null; + output = null; + notifyAll(); } }