Extract checksum implementations into separate class CheckSums
This commit is contained in:
parent
9dc945a406
commit
e6a0c35f73
|
@ -67,19 +67,4 @@ public class MiBandFWHelper {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//thanks http://stackoverflow.com/questions/13209364/convert-c-crc16-to-java-crc16
|
|
||||||
public int getCRC16(byte[] seq) {
|
|
||||||
int crc = 0xFFFF;
|
|
||||||
|
|
||||||
for (int j = 0; j < seq.length; j++) {
|
|
||||||
crc = ((crc >>> 8) | (crc << 8)) & 0xffff;
|
|
||||||
crc ^= (seq[j] & 0xff);//byte to int, trunc sign
|
|
||||||
crc ^= ((crc & 0xff) >> 4);
|
|
||||||
crc ^= (crc << 12) & 0xffff;
|
|
||||||
crc ^= ((crc & 0xFF) << 5) & 0xffff;
|
|
||||||
}
|
|
||||||
crc &= 0xffff;
|
|
||||||
return crc;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package nodomain.freeyourgadget.gadgetbridge.devices.miband;
|
package nodomain.freeyourgadget.gadgetbridge.devices.miband;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.CheckSums;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by UgoRaffaele on 30/01/2015.
|
* Created by UgoRaffaele on 30/01/2015.
|
||||||
*/
|
*/
|
||||||
|
@ -76,7 +78,7 @@ public class UserInfo {
|
||||||
byte[] crcSequence = new byte[19];
|
byte[] crcSequence = new byte[19];
|
||||||
System.arraycopy(sequence, 0, crcSequence, 0, crcSequence.length);
|
System.arraycopy(sequence, 0, crcSequence, 0, crcSequence.length);
|
||||||
|
|
||||||
sequence[19] = (byte) ((getCRC8(crcSequence) ^ Integer.parseInt(address.substring(address.length() - 2), 16)) & 0xff);
|
sequence[19] = (byte) ((CheckSums.getCRC8(crcSequence) ^ Integer.parseInt(address.substring(address.length() - 2), 16)) & 0xff);
|
||||||
|
|
||||||
this.data = sequence;
|
this.data = sequence;
|
||||||
}
|
}
|
||||||
|
@ -109,24 +111,4 @@ public class UserInfo {
|
||||||
public byte[] getData() {
|
public byte[] getData() {
|
||||||
return this.data;
|
return this.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int getCRC8(byte[] seq) {
|
|
||||||
int len = seq.length;
|
|
||||||
int i = 0;
|
|
||||||
byte crc = 0x00;
|
|
||||||
|
|
||||||
while (len-- > 0) {
|
|
||||||
byte extract = seq[i++];
|
|
||||||
for (byte tempI = 8; tempI != 0; tempI--) {
|
|
||||||
byte sum = (byte) ((crc & 0xff) ^ (extract & 0xff));
|
|
||||||
sum = (byte) ((sum & 0xff) & 0x01);
|
|
||||||
crc = (byte) ((crc & 0xff) >>> 1);
|
|
||||||
if (sum != 0) {
|
|
||||||
crc = (byte) ((crc & 0xff) ^ 0x8c);
|
|
||||||
}
|
|
||||||
extract = (byte) ((extract & 0xff) >>> 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (crc & 0xff);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.AbortTransactio
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceBusyAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceBusyAction;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetProgressAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetProgressAction;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.CheckSums;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
|
@ -602,7 +603,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||||
|
|
||||||
int newFwVersion = mFwHelper.getFirmwareVersion();
|
int newFwVersion = mFwHelper.getFirmwareVersion();
|
||||||
int oldFwVersion = mDeviceInfo.getFirmwareVersion();
|
int oldFwVersion = mDeviceInfo.getFirmwareVersion();
|
||||||
int checksum = (Integer.decode("0x" + mMacOctets[4]) << 8 | Integer.decode("0x" + mMacOctets[5])) ^ mFwHelper.getCRC16(mFwHelper.getFw());
|
int checksum = (Integer.decode("0x" + mMacOctets[4]) << 8 | Integer.decode("0x" + mMacOctets[5])) ^ CheckSums.getCRC16(mFwHelper.getFw());
|
||||||
|
|
||||||
if (sendFirmwareInfo(oldFwVersion, newFwVersion, mFwHelper.getFw().length, checksum)) {
|
if (sendFirmwareInfo(oldFwVersion, newFwVersion, mFwHelper.getFw().length, checksum)) {
|
||||||
firmwareInfoSent = true;
|
firmwareInfoSent = true;
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.util;
|
||||||
|
|
||||||
|
public class CheckSums {
|
||||||
|
public static int getCRC8(byte[] seq) {
|
||||||
|
int len = seq.length;
|
||||||
|
int i = 0;
|
||||||
|
byte crc = 0x00;
|
||||||
|
|
||||||
|
while (len-- > 0) {
|
||||||
|
byte extract = seq[i++];
|
||||||
|
for (byte tempI = 8; tempI != 0; tempI--) {
|
||||||
|
byte sum = (byte) ((crc & 0xff) ^ (extract & 0xff));
|
||||||
|
sum = (byte) ((sum & 0xff) & 0x01);
|
||||||
|
crc = (byte) ((crc & 0xff) >>> 1);
|
||||||
|
if (sum != 0) {
|
||||||
|
crc = (byte) ((crc & 0xff) ^ 0x8c);
|
||||||
|
}
|
||||||
|
extract = (byte) ((extract & 0xff) >>> 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (crc & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
//thanks http://stackoverflow.com/questions/13209364/convert-c-crc16-to-java-crc16
|
||||||
|
public static int getCRC16(byte[] seq) {
|
||||||
|
int crc = 0xFFFF;
|
||||||
|
|
||||||
|
for (int j = 0; j < seq.length; j++) {
|
||||||
|
crc = ((crc >>> 8) | (crc << 8)) & 0xffff;
|
||||||
|
crc ^= (seq[j] & 0xff);//byte to int, trunc sign
|
||||||
|
crc ^= ((crc & 0xff) >> 4);
|
||||||
|
crc ^= (crc << 12) & 0xffff;
|
||||||
|
crc ^= ((crc & 0xFF) << 5) & 0xffff;
|
||||||
|
}
|
||||||
|
crc &= 0xffff;
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue