Initial project commit
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
package com.eveningoutpost.dexdrip.Models;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.eveningoutpost.dexdrip.ImportedLibraries.usbserial.util.HexDump;
|
||||
import com.eveningoutpost.dexdrip.LibreAlarmReceiver;
|
||||
import com.eveningoutpost.dexdrip.Models.UserError.Log;
|
||||
import com.eveningoutpost.dexdrip.UtilityModels.CompatibleApps;
|
||||
import com.eveningoutpost.dexdrip.UtilityModels.Constants;
|
||||
import com.eveningoutpost.dexdrip.UtilityModels.Intents;
|
||||
import com.eveningoutpost.dexdrip.UtilityModels.PersistentStore;
|
||||
import com.eveningoutpost.dexdrip.UtilityModels.Pref;
|
||||
import com.eveningoutpost.dexdrip.xdrip;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class LibreOOPAlgorithm {
|
||||
private static final String TAG = "LibreOOPAlgorithm";
|
||||
|
||||
static public void SendData(byte[] fullData, long timestamp) {
|
||||
SendData(fullData, timestamp, null, null);
|
||||
}
|
||||
|
||||
static public void SendData(byte[] fullData, long timestamp, byte []patchUid, byte []patchInfo) {
|
||||
if(fullData == null) {
|
||||
Log.e(TAG, "SendData called with null data");
|
||||
return;
|
||||
}
|
||||
|
||||
if(fullData.length < 344) {
|
||||
Log.e(TAG, "SendData called with data size too small. " + fullData.length);
|
||||
return;
|
||||
}
|
||||
Log.i(TAG, "Sending full data to OOP Algorithm data-len = " + fullData.length);
|
||||
|
||||
fullData = java.util.Arrays.copyOfRange(fullData, 0, 0x158);
|
||||
Log.i(TAG, "Data that will be sent is " + HexDump.dumpHexString(fullData));
|
||||
|
||||
Intent intent = new Intent(Intents.XDRIP_PLUS_LIBRE_DATA);
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putByteArray(Intents.LIBRE_DATA_BUFFER, fullData);
|
||||
bundle.putLong(Intents.LIBRE_DATA_TIMESTAMP, timestamp);
|
||||
bundle.putString(Intents.LIBRE_SN, PersistentStore.getString("LibreSN"));
|
||||
bundle.putInt(Intents.LIBRE_RAW_ID, android.os.Process.myPid());
|
||||
|
||||
if(patchUid != null) {
|
||||
bundle.putByteArray(Intents.LIBRE_PATCH_UID_BUFFER, patchUid);
|
||||
}
|
||||
if(patchInfo != null) {
|
||||
bundle.putByteArray(Intents.LIBRE_PATCH_INFO_BUFFER, patchInfo);
|
||||
}
|
||||
|
||||
intent.putExtras(bundle);
|
||||
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
|
||||
|
||||
final String packages = PersistentStore.getString(CompatibleApps.EXTERNAL_ALG_PACKAGES);
|
||||
if (packages.length() > 0) {
|
||||
final String[] packagesE = packages.split(",");
|
||||
for (final String destination : packagesE) {
|
||||
if (destination.length() > 3) {
|
||||
intent.setPackage(destination);
|
||||
Log.d(TAG, "Sending to package: " + destination);
|
||||
xdrip.getAppContext().sendBroadcast(intent);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Log.d(TAG, "Sending to generic package");
|
||||
xdrip.getAppContext().sendBroadcast(intent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static public void HandleData(String oopData) {
|
||||
Log.e(TAG, "HandleData called with " + oopData);
|
||||
OOPResults oOPResults = null;
|
||||
try {
|
||||
final Gson gson = new GsonBuilder().create();
|
||||
OOPResultsContainer oOPResultsContainer = gson.fromJson(oopData, OOPResultsContainer.class);
|
||||
|
||||
if(oOPResultsContainer.Message != null) {
|
||||
Log.e(TAG, "recieved a message from oop algorithm:" + oOPResultsContainer.Message);
|
||||
}
|
||||
|
||||
if(oOPResultsContainer.oOPResultsArray.length > 0) {
|
||||
oOPResults = oOPResultsContainer.oOPResultsArray[0];
|
||||
} else {
|
||||
Log.e(TAG, "oOPResultsArray exists, but size is zero");
|
||||
return;
|
||||
}
|
||||
} catch (Exception e) { //TODO: what exception should we catch here.
|
||||
Log.e(TAG, "HandleData cought exception ", e);
|
||||
return;
|
||||
}
|
||||
boolean use_raw = Pref.getBooleanDefaultFalse("calibrate_external_libre_algorithm");
|
||||
ReadingData.TransferObject libreAlarmObject = new ReadingData.TransferObject();
|
||||
libreAlarmObject.data = new ReadingData();
|
||||
libreAlarmObject.data.trend = new ArrayList<GlucoseData>();
|
||||
|
||||
double factor = 1;
|
||||
if(use_raw) {
|
||||
// When handeling raw, data is expected to be bigger in a factor of 1000 and
|
||||
// is then devided by Constants.LIBRE_MULTIPLIER
|
||||
factor = 1000 / Constants.LIBRE_MULTIPLIER;
|
||||
}
|
||||
|
||||
// Add the first object, that is the current time
|
||||
GlucoseData glucoseData = new GlucoseData();
|
||||
glucoseData.sensorTime = oOPResults.currentTime;
|
||||
glucoseData.realDate = oOPResults.timestamp;
|
||||
glucoseData.glucoseLevel = (int)(oOPResults.currentBg * factor);
|
||||
glucoseData.glucoseLevelRaw = (int)(oOPResults.currentBg * factor);
|
||||
|
||||
libreAlarmObject.data.trend.add(glucoseData);
|
||||
|
||||
// TODO: Add here data of last 10 minutes or whatever.
|
||||
|
||||
|
||||
// Add the historic data
|
||||
libreAlarmObject.data.history = new ArrayList<GlucoseData>();
|
||||
for(HistoricBg historicBg : oOPResults.historicBg) {
|
||||
if(historicBg.quality == 0) {
|
||||
glucoseData = new GlucoseData();
|
||||
glucoseData.realDate = oOPResults.timestamp + (historicBg.time - oOPResults.currentTime) * 60000;
|
||||
glucoseData.glucoseLevel = (int)(historicBg.bg * factor);
|
||||
glucoseData.glucoseLevelRaw = (int)(historicBg.bg * factor);
|
||||
libreAlarmObject.data.history.add(glucoseData);
|
||||
}
|
||||
}
|
||||
|
||||
// Add the current point again. This is needed in order to have the last gaps closed.
|
||||
// TODO: Base this on real BG values.
|
||||
glucoseData = new GlucoseData();
|
||||
glucoseData.realDate = oOPResults.timestamp;
|
||||
glucoseData.glucoseLevel = (int)(oOPResults.currentBg * factor);
|
||||
glucoseData.glucoseLevelRaw = (int)(oOPResults.currentBg * factor);
|
||||
libreAlarmObject.data.history.add(glucoseData);
|
||||
|
||||
Log.e(TAG, "HandleData Created the following object " + libreAlarmObject.toString());
|
||||
LibreAlarmReceiver.CalculateFromDataTransferObject(libreAlarmObject, use_raw);
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user