package com.eveningoutpost.dexdrip.ImportedLibraries.dexcom.records; import android.util.Log; import com.eveningoutpost.dexdrip.ImportedLibraries.dexcom.CRC16; import com.eveningoutpost.dexdrip.ImportedLibraries.dexcom.CRCFailRuntimeException; import com.eveningoutpost.dexdrip.ImportedLibraries.dexcom.Constants; import com.eveningoutpost.dexdrip.ImportedLibraries.dexcom.Utils; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; // 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 PageHeader { protected final int HEADER_SIZE=28; protected final int FIRSTRECORDINDEX_OFFSET=0; protected final int NUMRECS_OFFSET=4; protected final int RECTYPE_OFFSET=8; protected final int REV_OFFSET=9; protected final int PAGENUMBER_OFFSET=10; protected final int RESERVED2_OFFSET=14; protected final int RESERVED3_OFFSET=18; protected final int RESERVED4_OFFSET=22; protected int firstRecordIndex; protected int numOfRecords; protected Constants.RECORD_TYPES recordType; protected byte revision; protected int pageNumber; protected int reserved2; protected int reserved3; protected int reserved4; protected byte[] crc=new byte[2]; public PageHeader(byte[] packet) { Log.d("ShareTest", "Header Packet Data Length: " + packet.length); firstRecordIndex = ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).getInt(FIRSTRECORDINDEX_OFFSET); numOfRecords = ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).getInt(NUMRECS_OFFSET); recordType = Constants.RECORD_TYPES.values()[packet[RECTYPE_OFFSET]]; revision = packet[REV_OFFSET]; pageNumber = ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).getInt(PAGENUMBER_OFFSET); reserved2 = ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).getInt(RESERVED2_OFFSET); reserved3 = ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).getInt(RESERVED3_OFFSET); reserved4 = ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).getInt(RESERVED4_OFFSET); System.arraycopy(packet,HEADER_SIZE-Constants.CRC_LEN,crc,0,Constants.CRC_LEN); byte[] crc_calc = CRC16.calculate(packet,0,HEADER_SIZE - Constants.CRC_LEN); if (!Arrays.equals(this.crc, crc_calc)) { throw new CRCFailRuntimeException("CRC check failed: " + Utils.bytesToHex(this.crc) + " vs " + Utils.bytesToHex(crc_calc)); } } public byte getRevision() { return revision; } public Constants.RECORD_TYPES getRecordType() { return recordType; } public int getFirstRecordIndex() { return firstRecordIndex; } public int getNumOfRecords() { return numOfRecords; } public int getPageNumber() { return pageNumber; } public int getReserved2() { return reserved2; } public int getReserved3() { return reserved3; } public int getReserved4() { return reserved4; } }