package com.nightscout.core.dexcom; //import com.google.common.primitives.Bytes; import net.tribe7.common.primitives.Bytes; import java.util.ArrayList; import java.util.List; public class PacketBuilder { public static final int MAX_PAYLOAD = 1584; public static final int MIN_LEN = 6; public static final int MAX_LEN = MAX_PAYLOAD + MIN_LEN; public static final byte SOF = 0x01; public static final int OFFSET_SOF = 0; public static final int OFFSET_LENGTH = 1; public static final int OFFSET_NULL = 2; public static final byte NULL = 0x00; public static final int OFFSET_CMD = 3; public static final int OFFSET_PAYLOAD = 4; public static final int CRC_LEN = 2; public static final int HEADER_LEN = 4; private List<Byte> packet; private Command command; private List<Byte> payload; public PacketBuilder(Command command) { this.command = command; } public PacketBuilder(Command command, List<Byte> payload) { this.command = command; this.payload = payload; } public byte[] build() { packet = new ArrayList<>(); packet.add(OFFSET_SOF, SOF); packet.add(OFFSET_LENGTH, getLength()); packet.add(OFFSET_NULL, NULL); packet.add(OFFSET_CMD, command.getValue()); if (this.payload != null) { this.packet.addAll(OFFSET_PAYLOAD, this.payload); } byte[] crc16 = CRC16.calculate(toBytes(), 0, this.packet.size()); this.packet.add(crc16[0]); this.packet.add(crc16[1]); return this.toBytes(); } private byte getLength() { int packetSize = payload == null ? MIN_LEN : payload.size() + CRC_LEN + HEADER_LEN; if (packetSize > MAX_LEN) { throw new IndexOutOfBoundsException(packetSize + " bytes, but packet must between " + MIN_LEN + " and " + MAX_LEN + " bytes."); } return (byte) packetSize; } private byte[] toBytes() { return Bytes.toArray(this.packet); } }