2015-08-03 23:51:53 +02:00
|
|
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.miband;
|
2015-04-19 22:20:47 +02:00
|
|
|
|
2015-05-01 01:26:12 +02:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
2015-12-07 01:11:07 +01:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst;
|
2015-10-18 20:54:22 +02:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.util.CheckSums;
|
|
|
|
|
2015-04-19 22:20:47 +02:00
|
|
|
public class DeviceInfo extends AbstractInfo {
|
2015-10-18 20:54:22 +02:00
|
|
|
public final String deviceId;
|
|
|
|
public final int profileVersion;
|
|
|
|
public final int fwVersion;
|
|
|
|
public final int hwVersion;
|
|
|
|
public final int feature;
|
|
|
|
public final int appearance;
|
|
|
|
|
|
|
|
|
|
|
|
private boolean isChecksumCorrect(byte[] data) {
|
|
|
|
int crc8 = CheckSums.getCRC8(new byte[]{data[0], data[1], data[2], data[3], data[4], data[5], data[6]});
|
2015-10-19 14:02:56 +02:00
|
|
|
return (data[7] & 255) == (crc8 ^ data[3] & 255);
|
2015-10-18 20:54:22 +02:00
|
|
|
}
|
|
|
|
|
2015-04-19 22:20:47 +02:00
|
|
|
public DeviceInfo(byte[] data) {
|
|
|
|
super(data);
|
2015-10-18 20:54:22 +02:00
|
|
|
|
|
|
|
if ((data.length == 16 || data.length == 20) && isChecksumCorrect(data)) {
|
|
|
|
deviceId = String.format("%02X%02X%02X%02X%02X%02X%02X%02X", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
|
|
|
|
profileVersion = getInt(data, 8);
|
|
|
|
fwVersion = getInt(data, 12);
|
2015-10-19 14:02:56 +02:00
|
|
|
hwVersion = data[6] & 255;
|
|
|
|
appearance = data[5] & 255;
|
|
|
|
feature = data[4] & 255;
|
2015-10-18 20:54:22 +02:00
|
|
|
} else {
|
|
|
|
deviceId = "crc error";
|
|
|
|
profileVersion = -1;
|
|
|
|
fwVersion = -1;
|
|
|
|
hwVersion = -1;
|
|
|
|
feature = -1;
|
|
|
|
appearance = -1;
|
|
|
|
}
|
2015-04-19 22:20:47 +02:00
|
|
|
}
|
|
|
|
|
2015-10-18 20:54:22 +02:00
|
|
|
public static int getInt(byte[] data, int from, int len) {
|
|
|
|
int ret = 0;
|
|
|
|
for(int i = 0; i < len; ++i) {
|
|
|
|
ret |= (data[from + i] & 255) << i * 8;
|
2015-04-19 22:20:47 +02:00
|
|
|
}
|
2015-10-18 20:54:22 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
private int getInt(byte[] data, int from) {
|
|
|
|
return getInt(data, from, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getHumanFirmwareVersion() {
|
|
|
|
if (fwVersion == -1)
|
|
|
|
return GBApplication.getContext().getString(R.string._unknown_);
|
|
|
|
|
2015-10-19 14:02:56 +02:00
|
|
|
return String.format("%d.%d.%d.%d",
|
2015-10-18 20:54:22 +02:00
|
|
|
fwVersion >> 24 & 255,
|
|
|
|
fwVersion >> 16 & 255,
|
|
|
|
fwVersion >> 8 & 255,
|
|
|
|
fwVersion & 255);
|
2015-04-19 22:20:47 +02:00
|
|
|
}
|
2015-07-23 17:14:51 +02:00
|
|
|
|
|
|
|
public int getFirmwareVersion() {
|
2015-10-18 20:54:22 +02:00
|
|
|
return fwVersion;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
|
|
|
return "DeviceInfo{" +
|
|
|
|
"deviceId='" + deviceId + '\'' +
|
|
|
|
", profileVersion=" + profileVersion +
|
|
|
|
", fwVersion=" + fwVersion +
|
|
|
|
", hwVersion=" + hwVersion +
|
2015-12-09 17:54:54 +01:00
|
|
|
", feature=" + feature +
|
|
|
|
", appearance=" + appearance +
|
2015-10-18 20:54:22 +02:00
|
|
|
'}';
|
|
|
|
}
|
|
|
|
|
2015-12-07 01:11:07 +01:00
|
|
|
public boolean isMili1() {
|
|
|
|
return hwVersion == 2;
|
|
|
|
}
|
|
|
|
|
2015-10-18 20:54:22 +02:00
|
|
|
public boolean isMili1A() {
|
2015-10-19 14:02:56 +02:00
|
|
|
return feature == 5 && appearance == 0 || feature == 0 && hwVersion == 208;
|
2015-07-23 17:14:51 +02:00
|
|
|
}
|
|
|
|
|
2015-12-07 01:11:07 +01:00
|
|
|
public boolean isMilli1S() {
|
2015-12-09 17:54:54 +01:00
|
|
|
// TODO: this is probably not quite correct, but hopefully sufficient for early 1S support
|
|
|
|
return feature == 4 && appearance == 0 || feature == 4 && hwVersion == 4;
|
2015-12-07 01:11:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public String getHwVersion() {
|
|
|
|
if (isMili1()) {
|
|
|
|
return MiBandConst.MI_1;
|
|
|
|
}
|
|
|
|
if (isMili1A()) {
|
|
|
|
return MiBandConst.MI_1A;
|
|
|
|
}
|
|
|
|
if (isMilli1S()) {
|
|
|
|
return MiBandConst.MI_1S;
|
|
|
|
}
|
|
|
|
return "?";
|
|
|
|
}
|
2015-04-19 22:20:47 +02:00
|
|
|
}
|