From 2dcd95a1f54849e707394eb9a41f8335b89e066d Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 19 Apr 2015 22:20:47 +0200 Subject: [PATCH] #15 support for reading firmware version and battery info --- .../freeyourgadget/gadgetbridge/GBDevice.java | 34 ++++++++++++++++++ .../gadgetbridge/miband/AbstractInfo.java | 10 ++++++ .../gadgetbridge/miband/BatteryInfo.java | 32 +++++++++++++++++ .../gadgetbridge/miband/DeviceInfo.java | 17 +++++++++ .../gadgetbridge/miband/MiBandSupport.java | 35 +++++++++++++++---- 5 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/AbstractInfo.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/BatteryInfo.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/DeviceInfo.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBDevice.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBDevice.java index 85160afda..00954f1da 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBDevice.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBDevice.java @@ -3,10 +3,12 @@ package nodomain.freeyourgadget.gadgetbridge; import android.content.Context; import android.content.Intent; import android.support.v4.content.LocalBroadcastManager; +import android.util.Log; public class GBDevice { public static final String ACTION_DEVICE_CHANGED = "nodomain.freeyourgadget.gadgetbride.gbdevice.action.device_changed"; + private static final String TAG = GBDevice.class.getSimpleName(); private final String name; private final String address; @@ -14,6 +16,11 @@ public class GBDevice { private String firmwareVersion = null; private State state = State.NOT_CONNECTED; + private short mBatteryLevel = 50; // unknown + + private String mBatteryState; + + public GBDevice(String address, String name, Type type) { this.address = address; this.name = name; @@ -101,4 +108,31 @@ public class GBDevice { PEBBLE, MIBAND } + + /** + * Ranges from 0-100 (percent) + * @return the battery level in range 0-100 + */ + public short getBatteryLevel() { + return mBatteryLevel; + } + + public void setBatteryLevel(short batteryLevel) { + if (mBatteryLevel >= 0 && mBatteryLevel <= 100) { + mBatteryLevel = batteryLevel; + } else { + Log.e(TAG, "Battery level musts be within range 0-100: " + batteryLevel); + } + } + + /** + * Returns a string representation of the battery state. + */ + public String getBatteryState() { + return mBatteryState != null ? mBatteryState : "(unknown)"; + } + + public void setBatteryState(String batteryState) { + mBatteryState = batteryState; + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/AbstractInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/AbstractInfo.java new file mode 100644 index 000000000..3ba068bb7 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/AbstractInfo.java @@ -0,0 +1,10 @@ +package nodomain.freeyourgadget.gadgetbridge.miband; + +public class AbstractInfo { + protected byte[] mData; + + public AbstractInfo(byte[] data) { + mData = new byte[data.length]; + System.arraycopy(data, 0, mData, 0, data.length); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/BatteryInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/BatteryInfo.java new file mode 100644 index 000000000..065debfe2 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/BatteryInfo.java @@ -0,0 +1,32 @@ +package nodomain.freeyourgadget.gadgetbridge.miband; + +public class BatteryInfo extends AbstractInfo { + public BatteryInfo(byte[] data) { + super(data); + } + + public int getLevelInPercent() { + if (mData.length >= 1) { + return mData[0]; + } + return 50; // actually unknown + } + + // TODO: localization + public String getStatus() { + if (mData.length >= 10) { + int value = mData[9]; + switch (value) { + case 1: + return "low"; + case 2: + return "medium"; + case 3: + return "full"; + case 4: + return "not charging"; + } + } + return "(unknown)"; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/DeviceInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/DeviceInfo.java new file mode 100644 index 000000000..2517a5d59 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/DeviceInfo.java @@ -0,0 +1,17 @@ +package nodomain.freeyourgadget.gadgetbridge.miband; + +import java.util.Locale; + +public class DeviceInfo extends AbstractInfo { + public DeviceInfo(byte[] data) { + super(data); + } + + public String getFirmwareVersion() { + if (mData.length == 16) { + int last = 15; + return String.format(Locale.US, "%d.%d.%d.%d", mData[last], mData[last-1], mData[last-2], mData[last-3]); + } + return "(unknown)"; // TODO: localization + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java index 937f0db66..d8040e2c2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java @@ -1,9 +1,5 @@ package nodomain.freeyourgadget.gadgetbridge.miband; -import android.bluetooth.BluetoothGatt; -import android.bluetooth.BluetoothGattCharacteristic; -import android.util.Log; - import java.io.IOException; import java.util.UUID; @@ -11,6 +7,9 @@ import nodomain.freeyourgadget.gadgetbridge.GBCommand; import nodomain.freeyourgadget.gadgetbridge.GBDevice.State; import nodomain.freeyourgadget.gadgetbridge.btle.AbstractBTLEDeviceSupport; import nodomain.freeyourgadget.gadgetbridge.btle.TransactionBuilder; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; +import android.util.Log; public class MiBandSupport extends AbstractBTLEDeviceSupport { @@ -142,8 +141,13 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { @Override public void onFirmwareVersionReq() { - // TODO Auto-generated method stub - + try { + TransactionBuilder builder = performInitialized("Get MI Band Device Info"); + BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_DEVICE_INFO); + builder.read(characteristic).queue(getQueue()); + } catch (IOException ex) { + Log.e(TAG, "Unable to read device info from MI", ex); + } } @Override @@ -164,6 +168,23 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { } + @Override + public void onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + super.onCharacteristicRead(gatt, characteristic, status); + + if (MiBandService.UUID_CHARACTERISTIC_DEVICE_INFO.equals(characteristic.getUuid())) { + handleDeviceInfo(characteristic.getValue(), status); + } + } + + private void handleDeviceInfo(byte[] value, int status) { + if (status == BluetoothGatt.GATT_SUCCESS) { + getDevice().setFirmwareVersion(value.length + ":" + new String(value)); + getDevice().sendDeviceUpdateIntent(getContext()); + } + } + @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { @@ -198,7 +219,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { if (pairResult.length == 1) { try { byte b = pairResult[0]; - Integer intValue = Integer.valueOf((int) b); + Integer intValue = Integer.valueOf(b); if (intValue.intValue() == 2) { Log.i(TAG, "Successfully paired MI device"); return;