#15 support for reading firmware version and battery info
This commit is contained in:
parent
28272714aa
commit
2dcd95a1f5
|
@ -3,10 +3,12 @@ package nodomain.freeyourgadget.gadgetbridge;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.support.v4.content.LocalBroadcastManager;
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
public class GBDevice {
|
public class GBDevice {
|
||||||
public static final String ACTION_DEVICE_CHANGED
|
public static final String ACTION_DEVICE_CHANGED
|
||||||
= "nodomain.freeyourgadget.gadgetbride.gbdevice.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 name;
|
||||||
private final String address;
|
private final String address;
|
||||||
|
@ -14,6 +16,11 @@ public class GBDevice {
|
||||||
private String firmwareVersion = null;
|
private String firmwareVersion = null;
|
||||||
private State state = State.NOT_CONNECTED;
|
private State state = State.NOT_CONNECTED;
|
||||||
|
|
||||||
|
private short mBatteryLevel = 50; // unknown
|
||||||
|
|
||||||
|
private String mBatteryState;
|
||||||
|
|
||||||
|
|
||||||
public GBDevice(String address, String name, Type type) {
|
public GBDevice(String address, String name, Type type) {
|
||||||
this.address = address;
|
this.address = address;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -101,4 +108,31 @@ public class GBDevice {
|
||||||
PEBBLE,
|
PEBBLE,
|
||||||
MIBAND
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)";
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,5 @@
|
||||||
package nodomain.freeyourgadget.gadgetbridge.miband;
|
package nodomain.freeyourgadget.gadgetbridge.miband;
|
||||||
|
|
||||||
import android.bluetooth.BluetoothGatt;
|
|
||||||
import android.bluetooth.BluetoothGattCharacteristic;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@ -11,6 +7,9 @@ import nodomain.freeyourgadget.gadgetbridge.GBCommand;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBDevice.State;
|
import nodomain.freeyourgadget.gadgetbridge.GBDevice.State;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.btle.AbstractBTLEDeviceSupport;
|
import nodomain.freeyourgadget.gadgetbridge.btle.AbstractBTLEDeviceSupport;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.btle.TransactionBuilder;
|
||||||
|
import android.bluetooth.BluetoothGatt;
|
||||||
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||||
|
|
||||||
|
@ -142,8 +141,13 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFirmwareVersionReq() {
|
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
|
@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
|
@Override
|
||||||
public void onCharacteristicWrite(BluetoothGatt gatt,
|
public void onCharacteristicWrite(BluetoothGatt gatt,
|
||||||
BluetoothGattCharacteristic characteristic, int status) {
|
BluetoothGattCharacteristic characteristic, int status) {
|
||||||
|
@ -198,7 +219,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||||
if (pairResult.length == 1) {
|
if (pairResult.length == 1) {
|
||||||
try {
|
try {
|
||||||
byte b = pairResult[0];
|
byte b = pairResult[0];
|
||||||
Integer intValue = Integer.valueOf((int) b);
|
Integer intValue = Integer.valueOf(b);
|
||||||
if (intValue.intValue() == 2) {
|
if (intValue.intValue() == 2) {
|
||||||
Log.i(TAG, "Successfully paired MI device");
|
Log.i(TAG, "Successfully paired MI device");
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue