package com.nightscout.core.dexcom; import net.tribe7.common.base.Optional; import java.io.IOException; import java.util.Arrays; public class ReadPacket { private Command command; private byte[] data; private byte[] crc; private int OFFSET_CMD = 3; private int OFFSET_DATA = 4; private int CRC_LEN = 2; public ReadPacket(byte[] readPacket) throws IOException { if (readPacket.length <= OFFSET_CMD) { throw new IOException("Insufficient data in reading"); } Optional<Command> optCmd = Command.getCommandByValue(readPacket[OFFSET_CMD]); if (optCmd.isPresent()) { this.command = optCmd.get(); } else { throw new IllegalArgumentException("Unknown command: " + readPacket[OFFSET_CMD]); } this.data = Arrays.copyOfRange(readPacket, OFFSET_DATA, readPacket.length - CRC_LEN); this.crc = Arrays.copyOfRange(readPacket, readPacket.length - CRC_LEN, readPacket.length); byte[] crc_calc = CRC16.calculate(readPacket, 0, readPacket.length - 2); if (!Arrays.equals(this.crc, crc_calc)) { throw new CRCFailError("CRC check failed. Was: " + Utils.bytesToHex(this.crc) + " Expected: " + Utils.bytesToHex(crc_calc)); } } public Command getCommand() { return command; } public byte[] getData() { return data; } }