1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-02 19:36:14 +02:00
Gadgetbridge/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/messages/status/FileTransferDataStatusMessage.java
Daniele Gobbetti b3da377b34 Garmin protocol: basic file transfer and notification handling
adds synchronization of supported files from watch to external directory
adds support for Activity and Monitoring files (workouts and activity samples), but those are not integrated yet
adds upload functionality (not used ATM and not tested)
adds notification support without actions
introduces centralized processing of "messageHandlers" (protobuf, file transfer, notifications)

also properly dispose of the music timer when disconnecting
2024-04-25 18:09:35 +02:00

82 lines
2.8 KiB
Java

package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.status;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.MessageWriter;
public class FileTransferDataStatusMessage extends GFDIStatusMessage {
private final Status status;
private final TransferStatus transferStatus;
private final int dataOffset;
private final boolean sendOutgoing;
public FileTransferDataStatusMessage(GarminMessage garminMessage, Status status, TransferStatus transferStatus, int dataOffset) {
this(garminMessage, status, transferStatus, dataOffset, true);
}
public FileTransferDataStatusMessage(GarminMessage garminMessage, Status status, TransferStatus transferStatus, int dataOffset, boolean sendOutgoing) {
this.garminMessage = garminMessage;
this.status = status;
this.transferStatus = transferStatus;
this.dataOffset = dataOffset;
this.sendOutgoing = sendOutgoing;
}
public static FileTransferDataStatusMessage parseIncoming(MessageReader reader, GarminMessage garminMessage) {
final Status status = Status.fromCode(reader.readByte());
if (!status.equals(Status.ACK)) {
return null;
}
final TransferStatus transferStatus = TransferStatus.fromId(reader.readByte());
final int dataOffset = reader.readInt();
if (!transferStatus.equals(TransferStatus.OK)) {
LOG.warn("Received {} / {} for message {}", status, transferStatus, garminMessage);
} else {
LOG.info("Received {} / {} for message {}", status, transferStatus, garminMessage);
}
return new FileTransferDataStatusMessage(garminMessage, status, transferStatus, dataOffset, false);
}
public int getDataOffset() {
return dataOffset;
}
public boolean canProceed() {
return status.equals(Status.ACK) && transferStatus.equals(TransferStatus.OK);
}
@Override
protected boolean generateOutgoing() {
final MessageWriter writer = new MessageWriter(response);
writer.writeShort(0); // packet size will be filled below
writer.writeShort(GarminMessage.RESPONSE.getId());
writer.writeShort(garminMessage.getId());
writer.writeByte(status.ordinal());
writer.writeByte(transferStatus.ordinal());
writer.writeInt(dataOffset);
return sendOutgoing;
}
public enum TransferStatus {
OK,
RESEND,
ABORT,
CRC_MISMATCH,
OFFSET_MISMATCH,
SYNC_PAUSED,
;
public static TransferStatus fromId(int id) {
for (TransferStatus transferStatus :
TransferStatus.values()) {
if (transferStatus.ordinal() == id) {
return transferStatus;
}
}
return null;
}
}
}