From 746cb0046023f680179abf5d8cdeeddb7327fa38 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 12 May 2018 00:05:30 +0200 Subject: [PATCH] Amazfit Cor: Fix recogition of new firmwares Newer Cor and Bip firmwares seem to be indistinguishable, What we do for now is use the version we already search for say Bip firmwares are valid from 0.0.8.00 to < 1.0.5.00 (lastest as of today is 0.1.0.39) Cor firmwares are valid from 1.0.5.00 This should work for a while. Fixes #1095 --- .../amazfitbip/AmazfitBipFirmwareInfo.java | 27 +++++++--------- .../amazfitcor/AmazfitCorFirmwareInfo.java | 31 +++++++++++-------- 2 files changed, 30 insertions(+), 28 deletions(-) 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 3a5875f7f..000bc9121 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 @@ -24,6 +24,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareInfo; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareType; import nodomain.freeyourgadget.gadgetbridge.util.ArrayUtils; +import nodomain.freeyourgadget.gadgetbridge.util.Version; public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { // gps detection is totally bogus, just the first 16 bytes @@ -45,21 +46,11 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { (byte) 0x8c, 0x36, 0x2e, (byte) 0x8c, (byte) 0x9c, 0x08, 0x54, (byte) 0xa6 }; - // guessed - at least it is the same across versions from 0.0.7.x to 0.0.9.x - // and different from other devices + // this is the same as Cor private static final byte[] FW_HEADER = new byte[]{ - 0x68, 0x46, 0x70, 0x47, 0x68, 0x46, 0x70, 0x47, - 0x68, 0x46, 0x70, 0x47, 0x68, 0x46, 0x70, 0x47 + 0x00, (byte) 0x98, 0x00, 0x20, (byte) 0xA5, 0x04, 0x00, 0x20, (byte) 0xAD, 0x04, 0x00, 0x20, (byte) 0xC5, 0x04, 0x00, 0x20 }; - // guessed - this is true for 0.1.0.11 - private static final byte[] FW_HEADER_NEW = new byte[]{ - 0x60, (byte) 0xeb, 0x03, 0x0c, 0x70, 0x46, 0x31, 0x46, - 0x3a, 0x46, 0x63, 0x46, (byte) 0xbd, (byte) 0xe8, (byte) 0xf0, (byte) 0x81 - }; - - private static final int FW_HEADER_OFFSET = 0x9330; - private static final byte[] GPS_ALMANAC_HEADER = new byte[]{ // probably wrong (byte) 0xa0, (byte) 0x80, 0x08, 0x00, (byte) 0x8b, 0x07 }; @@ -152,9 +143,15 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { if (ArrayUtils.startsWith(bytes, GPS_CEP_HEADER)) { return HuamiFirmwareType.GPS_CEP; } - if (ArrayUtils.equals(bytes, FW_HEADER, FW_HEADER_OFFSET) || ArrayUtils.equals(bytes, FW_HEADER_NEW, FW_HEADER_OFFSET)) { - // TODO: this is certainly not a correct validation, but it works for now - return HuamiFirmwareType.FIRMWARE; + if (ArrayUtils.startsWith(bytes, FW_HEADER)) { + String foundVersion = searchFirmwareVersion(bytes); + if (foundVersion != null) { + Version version = new Version(foundVersion); + if ((version.compareTo(new Version("0.0.8.00")) >= 0) && (version.compareTo(new Version("1.0.5.00")) < 0)) { + return HuamiFirmwareType.FIRMWARE; + } + } + return HuamiFirmwareType.INVALID; } if (ArrayUtils.startsWith(bytes, WATCHFACE_HEADER)) { return HuamiFirmwareType.WATCHFACE; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitcor/AmazfitCorFirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitcor/AmazfitCorFirmwareInfo.java index 70c0e80bb..a7d7ca3f8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitcor/AmazfitCorFirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitcor/AmazfitCorFirmwareInfo.java @@ -24,19 +24,14 @@ import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareInfo; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFirmwareType; import nodomain.freeyourgadget.gadgetbridge.util.ArrayUtils; +import nodomain.freeyourgadget.gadgetbridge.util.Version; public class AmazfitCorFirmwareInfo extends HuamiFirmwareInfo { - // guessed - at least it is the same accross current versions and different from other devices + // this is the same as Bip private static final byte[] FW_HEADER = new byte[]{ - (byte) 0x06, (byte) 0x48, (byte) 0x00, (byte) 0x47, (byte) 0xfe, (byte) 0xe7, (byte) 0xfe, (byte) 0xe7, - (byte) 0xfe, (byte) 0xe7, (byte) 0xfe, (byte) 0xe7, (byte) 0xfe, (byte) 0xe7, (byte) 0xfe, (byte) 0xe7 + 0x00, (byte) 0x98, 0x00, 0x20, (byte) 0xA5, 0x04, 0x00, 0x20, (byte) 0xAD, 0x04, 0x00, 0x20, (byte) 0xC5, 0x04, 0x00, 0x20 }; - //FIXME: this is a moving target :/ - private static final int FW_HEADER_OFFSET = 0x9330; - private static final int FW_HEADER_OFFSET_2 = 0x9340; - private static final int FW_HEADER_OFFSET_3 = 0x9288; - private static final int COMPRESSED_RES_HEADER_OFFSET = 0x9; private static Map crcToVersion = new HashMap<>(); @@ -65,14 +60,24 @@ public class AmazfitCorFirmwareInfo extends HuamiFirmwareInfo { return HuamiFirmwareType.INVALID; } return HuamiFirmwareType.RES; - } else if (ArrayUtils.equals(bytes, RES_HEADER, COMPRESSED_RES_HEADER_OFFSET) || ArrayUtils.equals(bytes, NEWRES_HEADER, COMPRESSED_RES_HEADER_OFFSET)) { + } + if (ArrayUtils.equals(bytes, RES_HEADER, COMPRESSED_RES_HEADER_OFFSET) || ArrayUtils.equals(bytes, NEWRES_HEADER, COMPRESSED_RES_HEADER_OFFSET)) { return HuamiFirmwareType.RES_COMPRESSED; - } else if (ArrayUtils.equals(bytes, FW_HEADER, FW_HEADER_OFFSET) || ArrayUtils.equals(bytes, FW_HEADER, FW_HEADER_OFFSET_2) || ArrayUtils.equals(bytes, FW_HEADER, FW_HEADER_OFFSET_3)) { - // TODO: this is certainly not a correct validation, but it works for now - return HuamiFirmwareType.FIRMWARE; - } else if (ArrayUtils.startsWith(bytes, WATCHFACE_HEADER)) { + } + if (ArrayUtils.startsWith(bytes, FW_HEADER)) { + String foundVersion = searchFirmwareVersion(bytes); + if (foundVersion != null) { + Version version = new Version(foundVersion); + if (version.compareTo(new Version("1.0.5.00")) >= 0) { + return HuamiFirmwareType.FIRMWARE; + } + } + return HuamiFirmwareType.INVALID; + } + if (ArrayUtils.startsWith(bytes, WATCHFACE_HEADER)) { return HuamiFirmwareType.WATCHFACE; } + return HuamiFirmwareType.INVALID; }