diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/actions/SetProgressAction.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/actions/SetProgressAction.java index 8f3a826b..7a3e2d20 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/actions/SetProgressAction.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/actions/SetProgressAction.java @@ -3,9 +3,13 @@ package nodomain.freeyourgadget.gadgetbridge.service.btle.actions; import android.bluetooth.BluetoothGatt; import android.content.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import nodomain.freeyourgadget.gadgetbridge.util.GB; public class SetProgressAction extends PlainAction { + private static final Logger LOG = LoggerFactory.getLogger(SetProgressAction.class); private final String text; private final boolean ongoing; @@ -30,6 +34,7 @@ public class SetProgressAction extends PlainAction { @Override public boolean run(BluetoothGatt gatt) { + LOG.info(toString()); GB.updateInstallNotification(this.text, this.ongoing, this.percentage, this.context); return true; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/UpdateFirmwareOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/UpdateFirmwareOperation.java index f2de50d9..3acff6e6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/UpdateFirmwareOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/UpdateFirmwareOperation.java @@ -52,7 +52,6 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { } updateCoordinator.initNextOperation(); -// updateCoordinator.initNextOperation(); // FIXME: remove, just testing mi band 1s fw update if (!updateCoordinator.sendFwInfo()) { GB.toast(getContext(), "Error sending firmware info, aborting.", Toast.LENGTH_LONG, GB.ERROR); done(); @@ -103,7 +102,6 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { if (firmwareInfoSent) { GB.toast(getContext(), "Firmware metadata successfully sent.", Toast.LENGTH_LONG, GB.INFO); if (!updateCoordinator.sendFwData()) { - //TODO: the firmware transfer failed, but the miband should be still functional with the old firmware. What should we do? GB.toast(getContext().getString(R.string.updatefirmwareoperation_updateproblem_do_not_reboot), Toast.LENGTH_LONG, GB.ERROR); done(); } @@ -119,7 +117,7 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { if (updateCoordinator.initNextOperation()) { GB.toast(getContext(), "Heart Rate Firmware successfully updated, now updating Mi Band Firmware", Toast.LENGTH_LONG, GB.INFO); if (!updateCoordinator.sendFwInfo()) { - GB.toast(getContext(), "Sending Mi Band Firmware failed, aborting. Do NOT reboot your Mi Band!", Toast.LENGTH_LONG, GB.INFO); + GB.toast(getContext(), "Error sending firmware info, aborting.", Toast.LENGTH_LONG, GB.ERROR); done(); } break; @@ -256,10 +254,10 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { /** - * Method that uploads a firmware (fwbytes) to the MiBand. - * The firmware has to be splitted into chunks of 20 bytes each, and periodically a COMMAND_SYNC comand has to be issued to the MiBand. + * Method that uploads a firmware (fwbytes) to the Mi Band. + * The firmware has to be split into chunks of 20 bytes each, and periodically a COMMAND_SYNC command has to be issued to the Mi Band. *

- * The Mi Band will send a notification after receiving these data to confirm if the firmware looks good to it. + * The Mi Band will send a notification after receiving this data to confirm if the firmware looks good to it. * * @param fwbytes * @return whether the transfer succeeded or not. Only a BT layer exception will cause the transmission to fail. @@ -270,6 +268,7 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { final int packetLength = 20; int packets = len / packetLength; + // going from 0 to len int firmwareProgress = 0; try { @@ -280,32 +279,25 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { builder.write(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_FIRMWARE_DATA), fwChunk); firmwareProgress += packetLength; + int progressPercent = (int) (((float) firmwareProgress) / len) * 100; if ((i > 0) && (i % 50 == 0)) { builder.write(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT), new byte[]{MiBandService.COMMAND_SYNC}); - builder.add(new SetProgressAction(getContext().getString(R.string.updatefirmwareoperation_update_in_progress), true, (int) (((float) firmwareProgress) / len * 100), getContext())); + builder.add(new SetProgressAction(getContext().getString(R.string.updatefirmwareoperation_update_in_progress), true, progressPercent, getContext())); } - - LOG.info("Firmware update progress:" + firmwareProgress + " total len:" + len + " progress:" + (int) (((float) firmwareProgress) / len * 100)); } - if (!(len % packetLength == 0)) { + if (firmwareProgress < len) { byte[] lastChunk = Arrays.copyOfRange(fwbytes, packets * packetLength, len); builder.write(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_FIRMWARE_DATA), lastChunk); - firmwareProgress += len % packetLength; - } - - LOG.info("Firmware update progress:" + firmwareProgress + " total len:" + len + " progress:" + (firmwareProgress / len)); - if (firmwareProgress >= len) { - builder.write(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT), new byte[]{MiBandService.COMMAND_SYNC}); - } else { - GB.updateInstallNotification(getContext().getString(R.string.updatefirmwareoperation_write_failed), false, 0, getContext()); + firmwareProgress = len; } + builder.write(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT), new byte[]{MiBandService.COMMAND_SYNC}); builder.queue(getQueue()); } catch (IOException ex) { LOG.error("Unable to send fw to MI", ex); - GB.updateInstallNotification(getContext().getString(R.string.updatefirmwareoperation_write_failed), false, 0, getContext()); + GB.updateInstallNotification(getContext().getString(R.string.updatefirmwareoperation_firmware_not_sent), false, 0, getContext()); return false; } return true; @@ -381,7 +373,8 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { INITIAL, SEND_FW2, SEND_FW1, - FINISHED, UNKNOWN + FINISHED, + UNKNOWN } private class DoubleUpdateCoordinator extends UpdateCoordinator { @@ -389,7 +382,7 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { private final byte[] fw1Info; private final byte[] fw1Data; - private final byte[] fw21nfo; + private final byte[] fw2Info; private final byte[] fw2Data; private byte[] currentFwInfo; @@ -401,7 +394,7 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { super(reboot); this.fw1Info = fw1Info; this.fw1Data = fw1Data; - this.fw21nfo = fw2Info; + this.fw2Info = fw2Info; this.fw2Data = fw2Data; // start with fw2 (heart rate) @@ -423,7 +416,7 @@ public class UpdateFirmwareOperation extends AbstractMiBandOperation { public boolean initNextOperation() { switch (state) { case INITIAL: - currentFwInfo = fw21nfo; + currentFwInfo = fw2Info; currentFwData = fw2Data; state = State.SEND_FW2; return true; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 25a6f77e..3bcbddd8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -236,5 +236,6 @@ Error creating directory for log files: %1$s "HR: " Firmware update in progress + Firmware not sent