Files
DexcomBluetoothUploader/lib/nightscout/com/eveningoutpost/dexdrip/G5Model/BackFillStream.java
2020-07-18 21:44:27 -04:00

132 lines
3.9 KiB
Java

package com.eveningoutpost.dexdrip.G5Model;
// created by jamorham
import com.eveningoutpost.dexdrip.Models.JoH;
import com.eveningoutpost.dexdrip.Models.UserError;
import com.eveningoutpost.dexdrip.UtilityModels.Pref;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.LinkedList;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import static com.eveningoutpost.dexdrip.G5Model.DexTimeKeeper.fromDexTimeCached;
public class BackFillStream extends BaseMessage {
private int last_sequence = 0;
BackFillStream() {
data = ByteBuffer.allocate(1000);
data.order(ByteOrder.LITTLE_ENDIAN);
}
public synchronized void push(byte[] packet) {
if (packet == null) return;
final int this_sequence = (int) packet[0];
if (this_sequence == last_sequence + 1) {
last_sequence++;
for (int i = 2; i < packet.length; i++) {
if (data.position() < data.limit()) {
data.put(packet[i]);
} else {
UserError.Log.wtf(TAG, "Reached limit for backfill stream size");
}
}
} else {
UserError.Log.wtf(TAG, "Received backfill packet out of sequence: " + this_sequence + " vs " + (last_sequence + 1));
}
}
public List<Backsie> decode() {
final List<Backsie> backsies = new LinkedList<>();
int extent = data.position();
data.rewind();
final int length = data.getInt();
// TODO check length
while (data.position() < extent) {
final int dexTime = data.getInt();
final int glucose = data.getShort();
final byte type = data.get();
final byte trend = data.get();
final CalibrationState state = CalibrationState.parse(type);
switch (state) {
case Ok:
case NeedsCalibration:
insertBackfillItem(backsies, dexTime, glucose, trend);
break;
case WarmingUp:
break;
case Errors:
/* This preference option has never been available outside of unit testing
and can now be removed.
if (Pref.getBooleanDefaultFalse("ob1_g5_use_errored_data")) {
insertBackfillItem(backsies, dexTime, glucose, trend);
}
*/
break;
case InsufficientCalibration:
if (Pref.getBoolean("ob1_g5_use_insufficiently_calibrated", true)) {
insertBackfillItem(backsies, dexTime, glucose, trend);
}
break;
case NeedsFirstCalibration:
case NeedsSecondCalibration:
case Unknown:
break;
default:
UserError.Log.wtf(TAG, "Encountered backfill data we don't recognise: " + type + " " + glucose + " " + trend + " " + " " + JoH.dateTimeText(fromDexTimeCached(dexTime)));
break;
}
}
return backsies;
}
private void insertBackfillItem(List<Backsie> backsies, int dexTime, int glucose, byte trend) {
if (dexTime != 0) {
backsies.add(new Backsie(glucose, trend, dexTime));
}
}
public void enumerate(int size) {
System.out.println("Size:" + size);
byte[] output = data.array();
int i = 4;
while (i < data.position()) {
if ((i - 4) % size == 0) {
System.out.println("");
}
System.out.print(JoH.bytesToHex(new byte[]{output[i]}));
i++;
}
System.out.println("\n");
}
@Data
@AllArgsConstructor()
public class Backsie {
private final int glucose;
private final int trend;
private final int dextime;
}
}