1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-29 05:16:51 +01:00

Huami: implement reassably of alarm configuration chunks for low mtu and fix situation when all alarms get deleted on the watch

This commit is contained in:
Andreas Shimokawa 2022-01-21 12:48:36 +01:00
parent 7697b588d1
commit d67771ccc3

View File

@ -1800,6 +1800,8 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
} }
} }
byte[] alarmConfigurationReassemblyBuffer;
private void handleConfigurationInfo(byte[] value) { private void handleConfigurationInfo(byte[] value) {
if (value == null || value.length < 4) { if (value == null || value.length < 4) {
return; return;
@ -1815,12 +1817,29 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
} else { } else {
LOG.warn("got configuration info we do not handle yet " + GB.hexdump(value, 3, -1)); LOG.warn("got configuration info we do not handle yet " + GB.hexdump(value, 3, -1));
} }
} else if (value[0] == ((byte) 0x80) && value[1] == 0x01 && value[2] == (byte) 0xc0 && value[3] == 0x00 && } else if (value[0] == ((byte) 0x80) && value[1] == 0x01) {
value[4] == 0x01 && value[5] == 0x00 && value[6] == 0x00 && value[7] == 0x00 && value[8] == 0x01) { boolean done = false;
LOG.info("got full alarm configuration."); // TODO: with low mtu they come in chunks if (value[2] == 0x00 || value[2] == (byte) 0xc0 && (value[4] == 0x01 && value[5] == 0x00 && value[6] == 0x00 && value[7] == 0x00 && value[8] == 0x01)) { // first chunk or complete data
byte[] alarmData = new byte[value.length - 9]; alarmConfigurationReassemblyBuffer = new byte[value.length - 8];
System.arraycopy(value, 9, alarmData, 0, alarmData.length); System.arraycopy(value, 8, alarmConfigurationReassemblyBuffer, 0, alarmConfigurationReassemblyBuffer.length);
decodeAndUpdateAlarmStatus(alarmData, true); if (value[2] == (byte) 0xc0) {
done = true;
}
} else if (alarmConfigurationReassemblyBuffer != null && (value[2] == 0x40 || value[2] == (byte) 0x80)) {
byte[] payload = new byte[value.length - 4];
System.arraycopy(value, 4, payload, 0, payload.length);
alarmConfigurationReassemblyBuffer = ArrayUtils.addAll(alarmConfigurationReassemblyBuffer, payload);
if (value[2] == (byte) 0x80) {
done = true;
}
}
if (!done) {
LOG.info("got chunk of alarm configuration data");
} else {
LOG.info("got full/reassembled configuration data");
decodeAndUpdateAlarmStatus(alarmConfigurationReassemblyBuffer, true);
alarmConfigurationReassemblyBuffer = null;
}
} else { } else {
LOG.warn("unknown response got from configuration request " + GB.hexdump(value, 0, -1)); LOG.warn("unknown response got from configuration request " + GB.hexdump(value, 0, -1));
} }
@ -1840,7 +1859,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
int nr_alarms; int nr_alarms;
byte enable_flag; byte enable_flag;
if (withTimes) { if (withTimes) {
nr_alarms = response.length / 4; nr_alarms = (response.length - 1) / 4;
enable_flag = (byte) 0x80; enable_flag = (byte) 0x80;
} else { } else {
nr_alarms = response[8]; nr_alarms = response[8];
@ -1849,7 +1868,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
for (int i = 0; i < nr_alarms; i++) { for (int i = 0; i < nr_alarms; i++) {
int offset; int offset;
if (withTimes) { if (withTimes) {
offset = i * 4; offset = i * 4 + 1;
} else { } else {
offset = 9 + i; offset = 9 + i;
} }
@ -2239,6 +2258,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
@Override @Override
public void onTestNewFunction() { public void onTestNewFunction() {
//requestMTU(23);
/* /*
try { try {
boolean test = false; boolean test = false;
@ -3179,7 +3199,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport {
private HuamiSupport requestAlarms(TransactionBuilder builder) { private HuamiSupport requestAlarms(TransactionBuilder builder) {
LOG.info("Requesting alarms"); LOG.info("Requesting alarms");
//FIXME: on older devices only the first one works, and on newer only the last is sufficiant //FIXME: on older devices only the first one works, and on newer only the last is sufficient
writeToConfiguration(builder, HuamiService.COMMAND_REQUEST_ALARMS); writeToConfiguration(builder, HuamiService.COMMAND_REQUEST_ALARMS);
writeToConfiguration(builder, HuamiService.COMMAND_REQUEST_ALARMS_WITH_TIMES); writeToConfiguration(builder, HuamiService.COMMAND_REQUEST_ALARMS_WITH_TIMES);
return this; return this;