From fe238450f161a503d61c5ae59ecdd82c60c0e9ec Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 18 Jan 2015 12:52:17 +0100 Subject: BtPromise: Adding a distinction between successful and failure. o Chain can now call fail() instead of stop() to signal failure. o The finally handlers can be changed to get this info later. o Should probably make all callbacks take the BtDevice as a callback instead of BluetoothGatt and make the gatt instance available through the device. This way state can be kept in the device's tag. BtPromise: always discover services when operating inside a connection. --- .../soilmoisture/DefaultSoilMoistureService.java | 63 ++++++++++++++-------- .../java/io/trygvis/soilmoisture/MainActivity.java | 16 +----- .../java/io/trygvis/soilmoisture/SmDevice.java | 21 ++++++++ .../trygvis/soilmoisture/SoilMoistureService.java | 4 +- 4 files changed, 66 insertions(+), 38 deletions(-) (limited to 'app/src/main/java/io/trygvis/soilmoisture') diff --git a/app/src/main/java/io/trygvis/soilmoisture/DefaultSoilMoistureService.java b/app/src/main/java/io/trygvis/soilmoisture/DefaultSoilMoistureService.java index 992bf97..25dac5c 100644 --- a/app/src/main/java/io/trygvis/soilmoisture/DefaultSoilMoistureService.java +++ b/app/src/main/java/io/trygvis/soilmoisture/DefaultSoilMoistureService.java @@ -1,7 +1,6 @@ package io.trygvis.soilmoisture; import android.app.Service; -import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCharacteristic; import android.bluetooth.BluetoothGattDescriptor; import android.bluetooth.BluetoothGattService; @@ -13,6 +12,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.IBinder; import android.util.Log; +import android.widget.Toast; import java.util.ArrayList; import java.util.Comparator; @@ -133,14 +133,7 @@ public class DefaultSoilMoistureService extends Service implements SoilMoistureS Log.i(TAG, "Probing " + address + ", name=" + btDevice.getName()); BtPromise executor = new BtPromise(). - onDirect(v -> { - Log.i(TAG, "Discovering services"); - BluetoothGatt gatt = (BluetoothGatt) v; - return gatt.discoverServices() ? waitForNextEvent() : stop(); - }). - onServicesDiscovered(gatt -> { - Log.i(TAG, "Services discovered"); - + onDirect(gatt -> { BluetoothGattService service = gatt.getService(TrygvisIoUuids.Services.SOIL_MOISTURE_SERVICE); if (service == null) { @@ -270,19 +263,44 @@ public class DefaultSoilMoistureService extends Service implements SoilMoistureS // ----------------------------------------------------------------------- private SmDevice createTag(SQLiteDatabase db, BtDevice btDevice) { - Cursor cursor = db.query(Tables.T_SM_DEVICE, new String[]{Tables.C_ID}, Tables.C_BT_DEVICE + "=?", - new String[]{valueOf(btDevice.getId())}, null, null, null); + Cursor cursor = null; + try { + cursor = db.query(Tables.T_SM_DEVICE, new String[]{Tables.C_ID}, Tables.C_BT_DEVICE + "=?", + new String[]{valueOf(btDevice.getId())}, null, null, null); + + long id; + if (cursor.moveToNext()) { + id = cursor.getLong(0); + } else { + ContentValues values = new ContentValues(); + values.put(Tables.C_BT_DEVICE, btDevice.getId()); + id = db.insert(Tables.T_SM_DEVICE, null, values); + } - long id; - if (cursor.moveToNext()) { - id = cursor.getLong(0); - } else { - ContentValues values = new ContentValues(); - values.put(Tables.C_BT_DEVICE, btDevice.getId()); - id = db.insert(Tables.T_SM_DEVICE, null, values); - } + cursor.close(); + + String[] sensorColumns = { + Tables.C_ID, + Tables.C_INDEX, + }; + cursor = db.query(Tables.T_SM_SENSOR, sensorColumns, Tables.C_SM_DEVICE + "=?", + new String[]{valueOf(id)}, null, null, Tables.C_INDEX); - return new SmDevice(this, btDevice, id); + SmDevice device = new SmDevice(this, btDevice, id); + + if (cursor.moveToNext()) { + device.setIsUseful(true); + do { + device.addSensor(new SmSensor(device, cursor.getLong(0), cursor.getInt(1))); + } while (cursor.moveToNext()); + } + + return device; + } finally { + if (cursor != null) { + cursor.close(); + } + } } void handleNewSensorValueReady(SmSensor sensor, int value) { @@ -302,8 +320,7 @@ public class DefaultSoilMoistureService extends Service implements SoilMoistureS void readCurrentValue(SmSensor sensor) { BtPromise promise = new BtPromise(). - onDirect(v -> { - BluetoothGatt gatt = (BluetoothGatt) v; + onDirect(gatt -> { BluetoothGattService service = gatt.getService(TrygvisIoUuids.Services.SOIL_MOISTURE_SERVICE); BluetoothGattCharacteristic soilMoisture = service.getCharacteristic(TrygvisIoUuids.Characteristics.SOIL_MOISTURE); @@ -328,6 +345,8 @@ public class DefaultSoilMoistureService extends Service implements SoilMoistureS return stop(); }). onFinally(() -> { + Toast.makeText(context, R.string.error_could_not_read_value, Toast.LENGTH_SHORT). + show(); }); sensor.getDevice().getBtDevice().withConnection(promise); diff --git a/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java b/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java index e9ecae2..c6293c6 100644 --- a/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java +++ b/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java @@ -219,12 +219,6 @@ public class MainActivity extends ListActivity { public static class BtDeviceDialogFragment extends DialogFragment { private MainActivity mainActivity; -// private final BtDevice device; -// -// public BtDeviceDialogFragment(MainActivity mainActivity, BtDevice device) { -// this.mainActivity = mainActivity; -// this.device = device; -// } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -472,7 +466,7 @@ public class MainActivity extends ListActivity { @Override public View getView(int position, View view, ViewGroup viewGroup) { - Log.i(TAG, "getView, position=" + position + ", view=" + view); +// Log.i(TAG, "getView, position=" + position + ", view=" + view); Object o = current.get(position); if (o instanceof BtDevice) { @@ -491,8 +485,6 @@ public class MainActivity extends ListActivity { if (view == null) { view = inflater.inflate(R.layout.fragment_device, null); view.setTag(new DeviceItem(view)); - view.setClickable(false); - view.setLongClickable(true); view.setOnLongClickListener(v -> MainActivity.this.onBtDeviceLongClick(device)); } @@ -584,11 +576,7 @@ public class MainActivity extends ListActivity { text += ", value: " + (value == null ? "Unknown" : value); item.description.setText(text); - if (value != null) { - item.sensorProgress.setProgress(value); - } else { - item.sensorProgress.setIndeterminate(true); - } + item.sensorProgress.setProgress(value != null ? value : 0); return view; } diff --git a/app/src/main/java/io/trygvis/soilmoisture/SmDevice.java b/app/src/main/java/io/trygvis/soilmoisture/SmDevice.java index 1074dd9..d56f33e 100644 --- a/app/src/main/java/io/trygvis/soilmoisture/SmDevice.java +++ b/app/src/main/java/io/trygvis/soilmoisture/SmDevice.java @@ -6,8 +6,11 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; +import io.trygvis.android.Optional; import io.trygvis.android.bt.BtDevice; +import static io.trygvis.android.Optional.empty; +import static io.trygvis.android.Optional.of; import static io.trygvis.soilmoisture.SmDevice.SmCmdCode.GET_SENSOR_COUNT; import static io.trygvis.soilmoisture.SmDevice.SmCmdCode.GET_SENSOR_NAME; import static io.trygvis.soilmoisture.SmDevice.SmCmdCode.GET_VALUE; @@ -75,7 +78,25 @@ class SmDevice { return sensors; } + public Optional getSensorByIndex(int index) { + if (!isUseful()) { + throw new IllegalStateException("Not a useful device"); + } + + for (SmSensor sensor : sensors) { + if (sensor.getIndex() == index) { + return of(sensor); + } + } + + return empty(); + } + void addSensor(SmSensor sensor) { + if (getSensorByIndex(sensor.index).isPresent()) { + throw new IllegalStateException("This device already contains a sensor with index=" + sensor.index); + } + sensors.add(sensor); } diff --git a/app/src/main/java/io/trygvis/soilmoisture/SoilMoistureService.java b/app/src/main/java/io/trygvis/soilmoisture/SoilMoistureService.java index a287c7b..5e3ddbb 100644 --- a/app/src/main/java/io/trygvis/soilmoisture/SoilMoistureService.java +++ b/app/src/main/java/io/trygvis/soilmoisture/SoilMoistureService.java @@ -41,10 +41,10 @@ public interface SoilMoistureService { public void onScanStarted() { } - public void onNewDevice(String address) { + public void onScanStopped() { } - public void onScanStopped() { + public void onNewDevice(String address) { } public void onNewSample(String address, int sensor) { -- cgit v1.2.3