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

193 lines
6.4 KiB
Java

package com.eveningoutpost.dexdrip.Models;
import android.provider.BaseColumns;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import com.activeandroid.query.Select;
import com.eveningoutpost.dexdrip.Models.UserError.Log;
import com.eveningoutpost.dexdrip.UtilityModels.Constants;
import com.eveningoutpost.dexdrip.UtilityModels.UploaderQueue;
import com.google.gson.annotations.Expose;
import java.text.DecimalFormat;
import java.util.List;
import java.util.UUID;
/**
* Created by jamorham on 19/10/2017.
*/
@Table(name = "LibreBlock", id = BaseColumns._ID)
public class LibreBlock extends PlusModel {
private static final String TAG = "LibreBlock";
static final String[] schema = {
"CREATE TABLE LibreBlock (_id INTEGER PRIMARY KEY AUTOINCREMENT);",
"ALTER TABLE LibreBlock ADD COLUMN timestamp INTEGER;",
"ALTER TABLE LibreBlock ADD COLUMN reference TEXT;",
"ALTER TABLE LibreBlock ADD COLUMN blockbytes BLOB;",
"ALTER TABLE LibreBlock ADD COLUMN bytestart INTEGER;",
"ALTER TABLE LibreBlock ADD COLUMN byteend INTEGER;",
"ALTER TABLE LibreBlock ADD COLUMN calculatedbg REAL;",
"ALTER TABLE LibreBlock ADD COLUMN uuid TEXT;",
"ALTER TABLE LibreBlock ADD COLUMN patchUid BLOB;",
"ALTER TABLE LibreBlock ADD COLUMN patchInfo BLOB;",
"CREATE INDEX index_LibreBlock_timestamp on LibreBlock(timestamp);",
"CREATE INDEX index_LibreBlock_bytestart on LibreBlock(bytestart);",
"CREATE INDEX index_LibreBlock_byteend on LibreBlock(byteend);",
"CREATE INDEX index_LibreBlock_uuid on LibreBlock(uuid);"
};
@Expose
@Column(name = "timestamp", index = true)
public long timestamp;
@Expose
@Column(name = "bytestart", index = true)
public long byte_start;
@Expose
@Column(name = "byteend", index = true)
public long byte_end;
@Expose
@Column(name = "reference", index = true)
public String reference;
@Expose
@Column(name = "blockbytes")
public byte[] blockbytes;
@Expose
@Column(name = "calculatedbg")
public double calculated_bg;
@Expose
@Column(name = "uuid", index = true)
public String uuid;
@Expose
@Column(name = "patchUid")
public byte[] patchUid;
@Expose
@Column(name = "patchInfo")
public byte[] patchInfo;
public static LibreBlock createAndSave(String reference, long timestamp, byte[] blocks, int byte_start) {
return createAndSave(reference, timestamp, blocks, byte_start, false, null, null);
}
// if you are indexing by block then just * 8 to get byte start
public static LibreBlock createAndSave(String reference, long timestamp, byte[] blocks, int byte_start, boolean allowUpload, byte[] patchUid, byte[] patchInfo) {
final LibreBlock lb = create(reference, timestamp, blocks, byte_start, patchUid, patchInfo);
if (lb != null) {
lb.save();
if(byte_start == 0 && blocks.length == 344 && allowUpload) {
Log.d(TAG, "sending new item to queue");
UploaderQueue.newTransmitterDataEntry("create" ,lb);
}
}
return lb;
}
private static LibreBlock create(String reference, long timestamp, byte[] blocks, int byte_start, byte[] patchUid, byte[] patchInfo) {
UserError.Log.e(TAG,"Backtrack: "+JoH.backTrace());
if (reference == null) {
UserError.Log.e(TAG, "Cannot save block with null reference");
return null;
}
if (blocks == null) {
UserError.Log.e(TAG, "Cannot save block with null data");
return null;
}
final LibreBlock lb = new LibreBlock();
lb.reference = reference;
lb.blockbytes = blocks;
lb.byte_start = byte_start;
lb.byte_end = byte_start + blocks.length;
lb.timestamp = timestamp;
lb.patchUid = patchUid;
lb.patchInfo = patchInfo;
lb.uuid = UUID.randomUUID().toString();
return lb;
}
public static LibreBlock getLatestForTrend() {
return getLatestForTrend(JoH.tsl() - Constants.DAY_IN_MS, JoH.tsl() );
}
public static LibreBlock getLatestForTrend(long start_time, long end_time) {
return new Select()
.from(LibreBlock.class)
.where("bytestart == 0")
.where("byteend >= 344")
.where("timestamp >= ?", start_time)
.where("timestamp <= ?", end_time)
.orderBy("timestamp desc")
.executeSingle();
}
public static List<LibreBlock> getForTrend(long start_time, long end_time) {
return new Select()
.from(LibreBlock.class)
.where("bytestart == 0")
.where("byteend >= 344")
.where("timestamp >= ?", start_time)
.where("timestamp <= ?", end_time)
.orderBy("timestamp asc")
.execute();
}
public static LibreBlock getForTimestamp(long timestamp) {
final long margin = (3 * 1000);
return new Select()
.from(LibreBlock.class)
.where("timestamp >= ?", (timestamp - margin))
.where("timestamp <= ?", (timestamp + margin))
.executeSingle();
}
public static void UpdateBgVal(long timestamp, double calculated_value) {
LibreBlock libreBlock = getForTimestamp(timestamp);
if (libreBlock == null) {
return;
}
Log.e(TAG, "Updating bg for timestamp " + timestamp);
libreBlock.calculated_bg = calculated_value;
libreBlock.save();
}
public static LibreBlock findByUuid(String uuid) {
try {
return new Select()
.from(LibreBlock.class)
.where("uuid = ?", uuid)
.executeSingle();
} catch (Exception e) {
Log.e(TAG,"findByUuid() Got exception on Select : "+e.toString());
return null;
}
}
private static final boolean d = false;
public static void updateDB() {
fixUpTable(schema, false);
}
public static LibreBlock byid(long id) {
return new Select()
.from(LibreBlock.class)
.where("_ID = ?", id)
.executeSingle();
}
}