109 lines
3.9 KiB
Java
109 lines
3.9 KiB
Java
package com.eveningoutpost.dexdrip.ImportedLibraries.dexcom;
|
|
|
|
import com.eveningoutpost.dexdrip.Models.UserError.Log;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
// This code and this particular library are from the NightScout android uploader
|
|
// Check them out here: https://github.com/nightscout/android-uploader
|
|
// Some of this code may have been modified for use in this project
|
|
|
|
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;
|
|
public ArrayList<Byte> packet;
|
|
public int command;
|
|
public ArrayList<Byte> payload;
|
|
|
|
public PacketBuilder(int command) {
|
|
this.command = command;
|
|
}
|
|
|
|
public PacketBuilder(int command, ArrayList<Byte> payload) {
|
|
this.command = command;
|
|
this.payload = payload;
|
|
}
|
|
|
|
public byte[] compose() {
|
|
packet = new ArrayList<Byte>();
|
|
packet.add(OFFSET_SOF, SOF);
|
|
packet.add(OFFSET_LENGTH, getLength());
|
|
packet.add(OFFSET_NULL, NULL);
|
|
packet.add(OFFSET_CMD, (byte) command);
|
|
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]);
|
|
Log.d("ShareTest", "About to start adding to Byte, size: " + this.packet.size());
|
|
return this.toBytes();
|
|
}
|
|
|
|
public List<byte[]> composeList() {
|
|
packet = new ArrayList<Byte>();
|
|
packet.add(OFFSET_SOF, SOF);
|
|
packet.add(OFFSET_LENGTH, getLength());
|
|
packet.add(OFFSET_NULL, NULL);
|
|
packet.add(OFFSET_CMD, (byte) command);
|
|
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]);
|
|
Log.d("ShareTest", "About to start adding to ByteList, size: " + this.packet.size());
|
|
return this.toBytesList();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
public byte[] toBytes() {
|
|
byte[] b = new byte[this.packet.size()];
|
|
for (int i = 0; i < this.packet.size(); i++) {
|
|
b[i] = this.packet.get(i).byteValue();
|
|
}
|
|
return b;
|
|
}
|
|
|
|
public List<byte[]> toBytesList() {
|
|
List<byte[]> byteMessages = new ArrayList<byte[]>();
|
|
double totalPacketSize = packet.size();
|
|
int messages =(int) Math.ceil(totalPacketSize/18);
|
|
for(int m = 0; m < messages; m++) {
|
|
int thisPacketSize;
|
|
if (m == messages - 1) {
|
|
thisPacketSize = ((this.packet.size()+2) % 18);
|
|
} else {
|
|
thisPacketSize = (20);
|
|
}
|
|
int offset = m * 18;
|
|
Log.d("ShareTest", "This packet size: " + thisPacketSize);
|
|
byte[] b = new byte[thisPacketSize];
|
|
b[0] = (byte) (m + 1);
|
|
b[1] = (byte) (messages);
|
|
for (int i = 2; i < thisPacketSize; i++) {
|
|
b[i] = packet.get(offset + i - 2).byteValue();
|
|
}
|
|
byteMessages.add(b);
|
|
}
|
|
return byteMessages;
|
|
}
|
|
}
|