mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-06-07 05:38:13 +02:00
57 lines
2.4 KiB
Java
57 lines
2.4 KiB
Java
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages;
|
|
|
|
|
|
import org.threeten.bp.Instant;
|
|
import org.threeten.bp.ZoneId;
|
|
import org.threeten.bp.zone.ZoneOffsetTransition;
|
|
import org.threeten.bp.zone.ZoneRules;
|
|
|
|
import java.util.TimeZone;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.GarminTimeUtils;
|
|
|
|
public class CurrentTimeRequestMessage extends GFDIMessage {
|
|
private final int referenceID;
|
|
|
|
public CurrentTimeRequestMessage(int referenceID, GarminMessage garminMessage) {
|
|
this.garminMessage = garminMessage;
|
|
this.referenceID = referenceID;
|
|
this.statusMessage = this.getStatusMessage();
|
|
}
|
|
|
|
public static CurrentTimeRequestMessage parseIncoming(MessageReader reader, GarminMessage garminMessage) {
|
|
final int referenceID = reader.readInt();
|
|
|
|
return new CurrentTimeRequestMessage(referenceID, garminMessage);
|
|
}
|
|
|
|
@Override
|
|
protected boolean generateOutgoing() {
|
|
|
|
final Instant now = Instant.now();
|
|
final ZoneRules zoneRules = ZoneId.systemDefault().getRules();
|
|
final int dstOffset = (int) zoneRules.getDaylightSavings(now).getSeconds();
|
|
final int timeZoneOffset = TimeZone.getDefault().getOffset(now.toEpochMilli()) / 1000;
|
|
final int garminTimestamp = GarminTimeUtils.unixTimeToGarminTimestamp((int) now.getEpochSecond());
|
|
final ZoneOffsetTransition nextTransitionStart = zoneRules.nextTransition(now);
|
|
|
|
final int nextTransitionStartsTs = (int) nextTransitionStart.toEpochSecond();
|
|
final int nextTransitionEndsTs = (int) zoneRules.nextTransition(nextTransitionStart.getInstant()).toEpochSecond();
|
|
|
|
|
|
LOG.info("Processing current time request #{}: time={}, DST={}, ofs={}", referenceID, garminTimestamp, dstOffset, timeZoneOffset);
|
|
|
|
final MessageWriter writer = new MessageWriter(response);
|
|
writer.writeShort(0); // packet size will be filled below
|
|
writer.writeShort(GarminMessage.RESPONSE.getId());
|
|
writer.writeShort(this.garminMessage.getId());
|
|
writer.writeByte(Status.ACK.ordinal());
|
|
writer.writeInt(referenceID);
|
|
writer.writeInt(garminTimestamp);
|
|
writer.writeInt(timeZoneOffset);
|
|
writer.writeInt(GarminTimeUtils.unixTimeToGarminTimestamp(nextTransitionEndsTs));
|
|
writer.writeInt(GarminTimeUtils.unixTimeToGarminTimestamp(nextTransitionStartsTs));
|
|
return true;
|
|
}
|
|
}
|