81 lines
2.8 KiB
Java
81 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.OK.equals(transferStatus)) {
|
|
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;
|
|
}
|
|
}
|
|
}
|