package com.nightscout.core.dexcom.records; import com.nightscout.core.dexcom.InvalidRecordLengthException; import com.nightscout.core.dexcom.Utils; import com.nightscout.core.model.GlucoseUnit; import com.nightscout.core.model.MeterEntry; import com.nightscout.core.utils.GlucoseReading; import org.joda.time.DateTime; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.List; public class MeterRecord extends GenericTimestampRecord { public final static int RECORD_SIZE = 15; private int meterTime; private GlucoseReading reading; public MeterRecord(byte[] packet, long rcvrTime, long refTime) { super(packet, rcvrTime, refTime); if (packet.length != RECORD_SIZE) { throw new InvalidRecordLengthException("Unexpected record size: " + packet.length + ". Expected size: " + RECORD_SIZE + " record: " + Utils.bytesToHex(packet)); } int meterBG = ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).getShort(8); reading = new GlucoseReading(meterBG, GlucoseUnit.MGDL); meterTime = ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).getInt(10); setRecordType(); } public MeterRecord(int meterBgMgdl, int meterTime, DateTime displayTime, DateTime systemTime, DateTime wallTime) { super(displayTime, systemTime, wallTime); this.reading = new GlucoseReading(meterBgMgdl, GlucoseUnit.MGDL); this.meterTime = meterTime; setRecordType(); } public MeterRecord(int meterBgMgdl, int meterTime, long displayTime, long systemTime, long rcvrTime, long refTime) { super(displayTime, systemTime, rcvrTime, refTime); this.reading = new GlucoseReading(meterBgMgdl, GlucoseUnit.MGDL); this.meterTime = meterTime; setRecordType(); } public MeterRecord(MeterEntry meter, long recieverTime, long refTime) { super(meter.disp_timestamp_sec, meter.sys_timestamp_sec, recieverTime, refTime); this.reading = new GlucoseReading(meter.meter_bg_mgdl, GlucoseUnit.MGDL); this.meterTime = meter.meter_time; setRecordType(); } public MeterRecord(int meterBgMgdl, int meterTime, long systemTime) { super(systemTime); this.reading = new GlucoseReading(meterBgMgdl, GlucoseUnit.MGDL); this.meterTime = meterTime; setRecordType(); } public static List<MeterEntry> toProtobufList(List<MeterRecord> list) { return toProtobufList(list, MeterEntry.class); } @Override protected void setRecordType() { this.recordType = "meter"; } public GlucoseReading getMeterBG() { return reading; } public int getBgMgdl() { return reading.asMgdl(); } public int getMeterTime() { return meterTime; } @Override public MeterEntry toProtobuf() { MeterEntry.Builder builder = new MeterEntry.Builder(); return builder.sys_timestamp_sec(rawSystemTimeSeconds) .disp_timestamp_sec(rawDisplayTimeSeconds) .meter_time(meterTime) .meter_bg_mgdl(reading.asMgdl()) .build(); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; MeterRecord that = (MeterRecord) o; if (meterTime != that.meterTime) return false; return reading.equals(that.reading); } @Override public int hashCode() { int result = super.hashCode(); result = 31 * result + meterTime; result = 31 * result + reading.hashCode(); return result; } }