Garmin: Remove maxPacketSize from GFDIMessage

This commit is contained in:
José Rebelo
2026-01-07 18:20:33 +01:00
committed by José Rebelo
parent 6fcd6cc636
commit 377917eb0f
5 changed files with 44 additions and 21 deletions
@@ -59,8 +59,9 @@ public class FileTransferHandler implements MessageHandler {
private final GarminSupport deviceSupport;
private final Download download;
private final Upload upload;
private int maxPacketSize = 375;
private static final Set<FileType.FILETYPE> FILE_TYPES_TO_PROCESS = new HashSet<FileType.FILETYPE>() {{
private static final Set<FileType.FILETYPE> FILE_TYPES_TO_PROCESS = new HashSet<>() {{
add(FileType.FILETYPE.DIRECTORY);
add(FileType.FILETYPE.ACTIVITY);
add(FileType.FILETYPE.MONITOR);
@@ -85,6 +86,10 @@ public class FileTransferHandler implements MessageHandler {
return upload.getCurrentlyUploading() != null;
}
public void setMaxPacketSize(final int maxPacketSize) {
this.maxPacketSize = maxPacketSize;
}
@Override
public GFDIMessage handle(GFDIMessage message) {
if (message instanceof DownloadRequestStatusMessage)
@@ -353,9 +358,8 @@ public CreateFileMessage initiateUpload(byte[] fileAsByteArray, FileType.FILETYP
}
public static class FileFragment {
public class FileFragment {
private final DirectoryEntry directoryEntry;
private final int maxBlockSize = 500; //TODO: why 500?
private int dataSize;
private ByteBuffer dataHolder;
private int runningCrc;
@@ -374,10 +378,6 @@ public CreateFileMessage initiateUpload(byte[] fileAsByteArray, FileType.FILETYP
this.setRunningCrc(0);
}
private int getMaxBlockSize() {
return Math.min(maxBlockSize, GFDIMessage.getMaxPacketSize()); //TODO: can we use GFDIMessage.getMaxPacketSize() directly?
}
private void setSize(DownloadRequestStatusMessage downloadRequestStatusMessage) {
if (0 != getDataSize())
throw new IllegalStateException("Data size already set");
@@ -400,7 +400,7 @@ public CreateFileMessage initiateUpload(byte[] fileAsByteArray, FileType.FILETYP
private FileTransferDataMessage take() {
final int currentOffset = this.dataHolder.position();
final byte[] chunk = new byte[Math.min(this.dataHolder.remaining(), getMaxBlockSize() - 13)]; //actual payload in FileTransferDataMessage
final byte[] chunk = new byte[Math.min(this.dataHolder.remaining(), maxPacketSize - 13)]; //actual payload in FileTransferDataMessage
this.dataHolder.get(chunk);
setRunningCrc(ChecksumCalculator.computeCrc(getRunningCrc(), chunk, 0, chunk.length));
return new FileTransferDataMessage(chunk, currentOffset, getRunningCrc());
@@ -88,6 +88,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.communicator.
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.CapabilitiesDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.FileDownloadedDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.IncomingFitDefinitionDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.MaxPacketSizeDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.NotificationSubscriptionDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.SupportedFileTypesDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.WeatherRequestDeviceEvent;
@@ -422,6 +423,9 @@ public class GarminSupport extends AbstractBTLESingleDeviceSupport implements IC
enable,
0
));
} else if (deviceEvent instanceof MaxPacketSizeDeviceEvent maxPacketSizeDeviceEvent) {
LOG.debug("Got new max packet size of {}", maxPacketSizeDeviceEvent.getMaxPacketSize());
fileTransferHandler.setMaxPacketSize(maxPacketSizeDeviceEvent.getMaxPacketSize());
} else if (deviceEvent instanceof SupportedFileTypesDeviceEvent) {
this.supportedFileTypeList.clear();
this.supportedFileTypeList.addAll(((SupportedFileTypesDeviceEvent) deviceEvent).getSupportedFileTypes());
@@ -0,0 +1,23 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents;
import android.content.Context;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public class MaxPacketSizeDeviceEvent extends GBDeviceEvent {
private final int maxPacketSize;
public MaxPacketSizeDeviceEvent(final int maxPacketSize) {
this.maxPacketSize = maxPacketSize;
}
public int getMaxPacketSize() {
return maxPacketSize;
}
@Override
public void evaluate(final Context context, final GBDevice device) {
// Handled in support class
}
}
@@ -4,12 +4,13 @@ import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.os.Build;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.MaxPacketSizeDeviceEvent;
public class DeviceInformationMessage extends GFDIMessage {
@@ -39,8 +40,6 @@ public class DeviceInformationMessage extends GFDIMessage {
this.bluetoothFriendlyName = bluetoothFriendlyName;
this.deviceName = deviceName;
this.deviceModel = deviceModel;
GFDIMessage.setMaxPacketSize(maxPacketSize);
this.statusMessage = getStatusMessage();
this.generateOutgoing = generateOutgoing;
}
@@ -109,7 +108,13 @@ public class DeviceInformationMessage extends GFDIMessage {
versionCmd.fwVersion = getSoftwareVersionStr();
versionCmd.fwVersion2 = incomingUnitNumber;
versionCmd.hwVersion = deviceModel;
return Collections.singletonList(versionCmd);
final MaxPacketSizeDeviceEvent maxPacketSizeDeviceEvent = new MaxPacketSizeDeviceEvent(incomingMaxPacketSize);
return Arrays.asList(
versionCmd,
maxPacketSizeDeviceEvent
);
}
private String getSoftwareVersionStr() {
@@ -20,19 +20,10 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
public abstract class GFDIMessage {
protected static final Logger LOG = LoggerFactory.getLogger(GFDIMessage.class);
private static int maxPacketSize = 375; //safe default?
protected final ByteBuffer response = ByteBuffer.allocate(10 * 1024); // FIXME we should allocate the minimum necessary for each message
protected GFDIStatusMessage statusMessage;
protected GarminMessage garminMessage;
public static int getMaxPacketSize() {
return maxPacketSize;
}
public static void setMaxPacketSize(int maxPacketSize) {
GFDIMessage.maxPacketSize = maxPacketSize;
}
public static GFDIMessage parseIncoming(byte[] message) {
final MessageReader messageReader = new MessageReader(message);