From 23fa37d99d7b2c7b6f2cbab21c2e15118b9c9778 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 29 Aug 2017 22:16:59 +0200 Subject: [PATCH] Amazfit Bip: get and display gps version Currenty this is displayed as HR (heart rate firmware) --- .../devices/amazfitbip/AmazfitBipService.java | 3 ++ .../amazfitbip/AmazfitBipFirmwareInfo.java | 2 +- .../devices/amazfitbip/AmazfitBipSupport.java | 46 ++++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/amazfitbip/AmazfitBipService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/amazfitbip/AmazfitBipService.java index 4140c979..3d543f69 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/amazfitbip/AmazfitBipService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/amazfitbip/AmazfitBipService.java @@ -21,4 +21,7 @@ import java.util.UUID; public class AmazfitBipService { public static final UUID UUID_CHARACTERISTIC_WEATHER = UUID.fromString("0000000e-0000-3512-2118-0009af100700"); + + // goes to UUID_CHARACTERISTIC_3_CONFIGURATION, TODO: validate this for Mi Band 2, it maybe triggers more than only GPS version... + public static final byte[] COMMAND_REQUEST_GPS_VERSION = new byte[]{0x0e}; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipFirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipFirmwareInfo.java index 0a126309..c9dc6fa4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipFirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipFirmwareInfo.java @@ -50,7 +50,7 @@ public class AmazfitBipFirmwareInfo extends Mi2FirmwareInfo { crcToVersion.put(12586, "RES 0.0.8.74"); // gps - crcToVersion.put(61520, "GPS 0.0.8.xx"); + crcToVersion.put(61520, "GPS 9367,8f79a91,0,0,"); } public AmazfitBipFirmwareInfo(byte[] bytes) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipSupport.java index eb8157fc..fe23fa7c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/amazfitbip/AmazfitBipSupport.java @@ -16,6 +16,8 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.service.devices.amazfitbip; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; import android.net.Uri; import android.widget.Toast; @@ -26,11 +28,13 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.SimpleTimeZone; +import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl; import nodomain.freeyourgadget.gadgetbridge.devices.amazfitbip.AmazfitBipIcon; import nodomain.freeyourgadget.gadgetbridge.devices.amazfitbip.AmazfitBipService; import nodomain.freeyourgadget.gadgetbridge.devices.amazfitbip.AmazfitBipWeatherConditions; +import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service; import nodomain.freeyourgadget.gadgetbridge.model.CallSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationType; @@ -181,4 +185,44 @@ public class AmazfitBipSupport extends MiBand2Support { } catch (IOException ignore) { } } -} \ No newline at end of file + + @Override + public boolean onCharacteristicChanged(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic) { + boolean handled = super.onCharacteristicChanged(gatt, characteristic); + if (!handled) { + UUID characteristicUUID = characteristic.getUuid(); + if (MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION.equals(characteristicUUID)) { + return handleConfigurationInfo(characteristic.getValue()); + } + } + return false; + } + + private boolean handleConfigurationInfo(byte[] value) { + if (value == null || value.length < 4) { + return false; + } + if (value[0] == 0x10 && value[1] == 0x0e && value[2] == 0x01) { + String gpsVersion = new String(value, 3, value.length - 3); + LOG.info("got gps version = " + gpsVersion); + gbDevice.setFirmwareVersion2(gpsVersion); + return true; + } + return false; + } + + // this probably does more than only getting the GPS version... + private AmazfitBipSupport requestGPSVersion(TransactionBuilder builder) { + LOG.info("Requesting GPS version"); + builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), AmazfitBipService.COMMAND_REQUEST_GPS_VERSION); + return this; + } + + @Override + public void phase2Initialize(TransactionBuilder builder) { + super.phase2Initialize(builder); + LOG.info("phase2Initialize..."); + requestGPSVersion(builder); + } +}