mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Garmin: Remove maxPacketSize from GFDIMessage
This commit is contained in:
+8
-8
@@ -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());
|
||||
|
||||
+4
@@ -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());
|
||||
|
||||
+23
@@ -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
|
||||
}
|
||||
}
|
||||
+9
-4
@@ -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() {
|
||||
|
||||
-9
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user