diff --git a/danar/src/main/java/info/nightscout/androidaps/danar/comm/MessageBase.java b/danar/src/main/java/info/nightscout/androidaps/danar/comm/MessageBase.java index 77d6f3d09b..54da53475c 100644 --- a/danar/src/main/java/info/nightscout/androidaps/danar/comm/MessageBase.java +++ b/danar/src/main/java/info/nightscout/androidaps/danar/comm/MessageBase.java @@ -4,6 +4,7 @@ import android.annotation.TargetApi; import android.os.Build; import org.joda.time.DateTime; +import org.joda.time.IllegalInstantException; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -144,8 +145,7 @@ public class MessageBase { } public int getCommand() { - int command = byteFromRawBuff(buffer, 5) | (byteFromRawBuff(buffer, 4) << 8); - return command; + return byteFromRawBuff(buffer, 5) | (byteFromRawBuff(buffer, 4) << 8); } public int byteFromRawBuff(byte[] buff, int offset) { @@ -180,15 +180,29 @@ public class MessageBase { } public synchronized long dateTimeSecFromBuff(byte[] buff, int offset) { - return - new DateTime( - 2000 + intFromBuff(buff, offset, 1), - intFromBuff(buff, offset + 1, 1), - intFromBuff(buff, offset + 2, 1), - intFromBuff(buff, offset + 3, 1), - intFromBuff(buff, offset + 4, 1), - intFromBuff(buff, offset + 5, 1) - ).getMillis(); + + try { + return new DateTime( + 2000 + intFromBuff(buff, offset, 1), + intFromBuff(buff, offset + 1, 1), + intFromBuff(buff, offset + 2, 1), + intFromBuff(buff, offset + 3, 1), + intFromBuff(buff, offset + 4, 1), + intFromBuff(buff, offset + 5, 1) + ).getMillis(); + } catch (IllegalInstantException e) { + // expect + // org.joda.time.IllegalInstantException: Illegal instant due to time zone offset transition (daylight savings time 'gap') + // add 1 hour + return new DateTime( + 2000 + intFromBuff(buff, offset, 1), + intFromBuff(buff, offset + 1, 1), + intFromBuff(buff, offset + 2, 1), + intFromBuff(buff, offset + 3, 1) + 1, + intFromBuff(buff, offset + 4, 1), + intFromBuff(buff, offset + 5, 1) + ).getMillis(); + } } public long dateFromBuff(byte[] buff, int offset) { @@ -204,18 +218,18 @@ public class MessageBase { @TargetApi(Build.VERSION_CODES.KITKAT) public static String stringFromBuff(byte[] buff, int offset, int length) { - byte[] strbuff = new byte[length]; - System.arraycopy(buff, offset + 6, strbuff, 0, length); - return new String(strbuff, StandardCharsets.UTF_8); + byte[] strBuff = new byte[length]; + System.arraycopy(buff, offset + 6, strBuff, 0, length); + return new String(strBuff, StandardCharsets.UTF_8); } @TargetApi(Build.VERSION_CODES.KITKAT) public static String asciiStringFromBuff(byte[] buff, int offset, int length) { - byte[] strbuff = new byte[length]; - System.arraycopy(buff, offset + 6, strbuff, 0, length); + byte[] strBuff = new byte[length]; + System.arraycopy(buff, offset + 6, strBuff, 0, length); for (int pos = 0; pos < length; pos++) - strbuff[pos] += 65; // "A" - return new String(strbuff, StandardCharsets.UTF_8); + strBuff[pos] += 65; // "A" + return new String(strBuff, StandardCharsets.UTF_8); } public static String toHexString(byte[] buff) { diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRSPacket.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRSPacket.kt index e5276c20d8..1978e61ba0 100644 --- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRSPacket.kt +++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRSPacket.kt @@ -5,6 +5,7 @@ import info.nightscout.androidaps.danars.encryption.BleEncryption import info.nightscout.shared.logging.AAPSLogger import info.nightscout.androidaps.utils.DateUtil import org.joda.time.DateTime +import org.joda.time.IllegalInstantException import java.nio.charset.StandardCharsets import javax.inject.Inject @@ -69,15 +70,30 @@ open class DanaRSPacket(protected var injector: HasAndroidInjector) { else -> -1 } - @Synchronized fun dateTimeSecFromBuff(buff: ByteArray, offset: Int): Long = - DateTime( - 2000 + intFromBuff(buff, offset, 1), - intFromBuff(buff, offset + 1, 1), - intFromBuff(buff, offset + 2, 1), - intFromBuff(buff, offset + 3, 1), - intFromBuff(buff, offset + 4, 1), - intFromBuff(buff, offset + 5, 1) - ).millis + @Synchronized + fun dateTimeSecFromBuff(buff: ByteArray, offset: Int): Long = + try { + DateTime( + 2000 + intFromBuff(buff, offset, 1), + intFromBuff(buff, offset + 1, 1), + intFromBuff(buff, offset + 2, 1), + intFromBuff(buff, offset + 3, 1), + intFromBuff(buff, offset + 4, 1), + intFromBuff(buff, offset + 5, 1) + ).millis + } catch (e: IllegalInstantException) { + // expect + // org.joda.time.IllegalInstantException: Illegal instant due to time zone offset transition (daylight savings time 'gap') + // add 1 hour + DateTime( + 2000 + intFromBuff(buff, offset, 1), + intFromBuff(buff, offset + 1, 1), + intFromBuff(buff, offset + 2, 1), + intFromBuff(buff, offset + 3, 1) + 1, + intFromBuff(buff, offset + 4, 1), + intFromBuff(buff, offset + 5, 1) + ).millis + } protected fun intFromBuff(b: ByteArray, srcStart: Int, srcLength: Int): Int = when (srcLength) {