commit
c90fc9eb80
353 changed files with 22375 additions and 9869 deletions
|
@ -43,8 +43,8 @@ android {
|
|||
applicationId "info.nightscout.androidaps"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 23
|
||||
versionCode 1100
|
||||
version "1.33"
|
||||
versionCode 1500
|
||||
version "1.5"
|
||||
buildConfigField "String", "VERSION", '"' + version + '"'
|
||||
buildConfigField "String", "BUILDVERSION", generateGitBuild()
|
||||
}
|
||||
|
@ -168,8 +168,8 @@ dependencies {
|
|||
compile 'com.google.android.gms:play-services-wearable:7.5.0'
|
||||
compile 'junit:junit:4.12'
|
||||
testCompile 'org.json:json:20140107'
|
||||
testCompile 'org.mockito:mockito-core:2.+'
|
||||
androidTestCompile 'org.mockito:mockito-core:2.+'
|
||||
testCompile 'org.mockito:mockito-core:2.7.22'
|
||||
androidTestCompile 'org.mockito:mockito-core:2.7.22'
|
||||
androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
|
||||
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
|
||||
compile(name: 'android-edittext-validator-v1.3.4-mod', ext: 'aar')
|
||||
|
@ -177,11 +177,7 @@ dependencies {
|
|||
// excluding org.json which is provided by Android
|
||||
exclude group: 'org.json', module: 'json'
|
||||
}
|
||||
compile 'com.google.code.gson:gson:2.4'
|
||||
compile 'com.google.guava:guava:18.0'
|
||||
compile 'com.google.code.gson:gson:2.7'
|
||||
compile 'com.google.guava:guava:20.0'
|
||||
|
||||
compile ('com.jakewharton:butterknife:8.5.1') {
|
||||
exclude module: 'support-compat'
|
||||
}
|
||||
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
|
||||
}
|
|
@ -41,10 +41,10 @@
|
|||
android:name=".plugins.Overview.Dialogs.BolusProgressHelperActivity"
|
||||
android:theme="@style/Theme.AppCompat.Translucent" />
|
||||
<activity android:name=".AgreementActivity" />
|
||||
<activity android:name=".plugins.DanaR.History.DanaRHistoryActivity" />
|
||||
<activity android:name=".plugins.DanaRKorean.History.DanaRHistoryActivity" />
|
||||
<activity android:name=".plugins.DanaR.History.DanaRStatsActivity" />
|
||||
<activity android:name=".plugins.DanaRKorean.History.DanaRStatsActivity" />
|
||||
<activity android:name=".plugins.PumpDanaR.History.DanaRHistoryActivity" />
|
||||
<activity android:name=".plugins.PumpDanaRKorean.History.DanaRHistoryActivity" />
|
||||
<activity android:name=".plugins.PumpDanaR.History.DanaRStatsActivity" />
|
||||
<activity android:name=".plugins.PumpDanaRKorean.History.DanaRStatsActivity" />
|
||||
<activity android:name=".plugins.Overview.activities.QuickWizardListActivity">
|
||||
<intent-filter>
|
||||
<action android:name="info.nightscout.androidaps.plugins.Overview.activities.QuickWizardListActivity" />
|
||||
|
@ -116,11 +116,16 @@
|
|||
android:name=".Services.DataService"
|
||||
android:exported="false" />
|
||||
<service
|
||||
android:name=".plugins.DanaR.Services.ExecutionService"
|
||||
android:name=".plugins.PumpDanaR.services.DanaRExecutionService"
|
||||
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<service
|
||||
android:name=".plugins.DanaRKorean.Services.ExecutionService"
|
||||
android:name=".plugins.PumpDanaRKorean.services.DanaRKoreanExecutionService"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<service
|
||||
android:name=".plugins.PumpDanaRv2.services.DanaRv2ExecutionService"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
<service
|
||||
|
|
|
@ -292,6 +292,8 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
|
|||
rT.COB=meal_data.mealCOB;
|
||||
rT.IOB=iob_data.iob;
|
||||
rT.reason="COB: " + meal_data.mealCOB + ", Dev: " + deviation + ", BGI: " + bgi + ", ISF: " + convert_bg(sens, profile) + ", Target: " + convert_bg(target_bg, profile) + "; ";
|
||||
if (typeof autosens_data !== 'undefined' && profile.autosens_adjust_targets && autosens_data.ratio != 1)
|
||||
rT.reason += "Autosens: " + autosens_data.ratio + "; ";
|
||||
if (bg < threshold) { // low glucose suspend mode: BG is < ~80
|
||||
rT.reason += "BG " + convert_bg(bg, profile) + "<" + convert_bg(threshold, profile);
|
||||
if ((glucose_status.delta <= 0 && minDelta <= 0) || (glucose_status.delta < expectedDelta && minDelta < expectedDelta) || bg < 60 ) {
|
||||
|
|
|
@ -11,15 +11,15 @@ public class Config {
|
|||
public static final boolean LOOPENABLED = APS;
|
||||
public static final boolean WEAR = BuildConfig.WEAR;
|
||||
|
||||
public static final boolean NSCLIENT = BuildConfig.NSCLIENTOLNY;
|
||||
|
||||
public static final boolean DANAR = true && BuildConfig.PUMPDRIVERS;
|
||||
public static final boolean DANARKOREAN = true && BuildConfig.PUMPDRIVERS;
|
||||
public static final boolean DANARv2 = true && BuildConfig.PUMPDRIVERS;
|
||||
|
||||
public static final boolean ACTION = !BuildConfig.NSCLIENTOLNY;
|
||||
public static final boolean VIRTUALPUMP = !BuildConfig.NSCLIENTOLNY;
|
||||
public static final boolean MDI = !BuildConfig.NSCLIENTOLNY;
|
||||
public static final boolean OTHERPROFILES = !BuildConfig.NSCLIENTOLNY;
|
||||
public static final boolean TEMPBASALS = !BuildConfig.NSCLIENTOLNY;
|
||||
public static final boolean SAFETY = !BuildConfig.NSCLIENTOLNY;
|
||||
|
||||
public static final boolean SMSCOMMUNICATORENABLED = !BuildConfig.NSCLIENTOLNY;
|
||||
|
@ -41,6 +41,7 @@ public class Config {
|
|||
public static final boolean logPumpActions = true;
|
||||
public static final boolean logSMSComm = true;
|
||||
public static final boolean logCongigBuilderActions = true;
|
||||
public static final boolean logAutosensData = false;
|
||||
|
||||
// DanaR specific
|
||||
public static final boolean logDanaBTComm = true;
|
||||
|
|
|
@ -12,6 +12,8 @@ public class Constants {
|
|||
public static final double MMOLL_TO_MGDL = 18; // 18.0182;
|
||||
public static final double MGDL_TO_MMOLL = 1 / MMOLL_TO_MGDL;
|
||||
|
||||
public static final double defaultDIA = 3d;
|
||||
|
||||
public static final double basalAbsoluteOnlyForCheckLimit = 10101010d;
|
||||
public static final Integer basalPercentOnlyForCheckLimit = 10101010;
|
||||
public static final double bolusOnlyForCheckLimit = 10101010d;
|
||||
|
@ -55,4 +57,11 @@ public class Constants {
|
|||
|
||||
//NSClientInternal
|
||||
public static final int MAX_LOG_LINES = 100;
|
||||
|
||||
//Screen: Threshold for width/height to go into small width/height layout
|
||||
public static final int SMALL_WIDTH = 320;
|
||||
public static final int SMALL_HEIGHT = 320;
|
||||
|
||||
//Autosens
|
||||
public static final double DEVIATION_TO_BE_EQUAL = 2.0;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package info.nightscout.androidaps;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
|
@ -17,13 +18,14 @@ import android.support.v4.content.ContextCompat;
|
|||
import android.support.v4.view.ViewPager;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.Menu;
|
||||
import android.support.v7.widget.PopupMenu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageButton;
|
||||
|
||||
import com.joanzapata.iconify.Iconify;
|
||||
import com.joanzapata.iconify.fonts.FontAwesomeModule;
|
||||
|
@ -46,7 +48,7 @@ import info.nightscout.utils.PasswordProtection;
|
|||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.ToastUtils;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
|
||||
private static Logger log = LoggerFactory.getLogger(MainActivity.class);
|
||||
|
||||
static final int CASE_STORAGE = 0x1;
|
||||
|
@ -54,12 +56,18 @@ public class MainActivity extends AppCompatActivity {
|
|||
|
||||
private boolean askForSMS = false;
|
||||
|
||||
ImageButton menuButton;
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
Iconify.with(new FontAwesomeModule());
|
||||
LocaleHelper.onCreate(this, "en");
|
||||
setContentView(R.layout.activity_main);
|
||||
menuButton = (ImageButton) findViewById(R.id.overview_menuButton);
|
||||
menuButton.setOnClickListener(this);
|
||||
|
||||
checkEula();
|
||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
|
||||
askForPermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||
|
@ -69,23 +77,7 @@ public class MainActivity extends AppCompatActivity {
|
|||
if (Config.logFunctionCalls)
|
||||
log.debug("onCreate");
|
||||
|
||||
// show version in toolbar
|
||||
setTitle(getString(R.string.app_name) + " " + BuildConfig.VERSION);
|
||||
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
registerBus();
|
||||
|
||||
try {
|
||||
getSupportActionBar().setDisplayShowHomeEnabled(true);
|
||||
if (BuildConfig.NSCLIENTOLNY)
|
||||
getSupportActionBar().setIcon(R.mipmap.yellowowl);
|
||||
else
|
||||
getSupportActionBar().setIcon(R.mipmap.blueowl);
|
||||
} catch (NullPointerException e) {
|
||||
// no action
|
||||
}
|
||||
|
||||
|
||||
setUpTabs(false);
|
||||
}
|
||||
|
||||
|
@ -119,79 +111,6 @@ public class MainActivity extends AppCompatActivity {
|
|||
mPager.setCurrentItem(pageAdapter.getCount() - 1, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.menu_main, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
switch (id) {
|
||||
case R.id.nav_preferences:
|
||||
PasswordProtection.QueryPassword(this, R.string.settings_password, "settings_password", new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Intent i = new Intent(getApplicationContext(), PreferencesActivity.class);
|
||||
startActivity(i);
|
||||
}
|
||||
}, null);
|
||||
break;
|
||||
case R.id.nav_resetdb:
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.nav_resetdb)
|
||||
.setMessage(R.string.reset_db_confirm)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
MainApp.getDbHelper().resetDatabases();
|
||||
}
|
||||
})
|
||||
.create()
|
||||
.show();
|
||||
break;
|
||||
case R.id.nav_export:
|
||||
ImportExportPrefs.verifyStoragePermissions(this);
|
||||
ImportExportPrefs.exportSharedPreferences(this);
|
||||
break;
|
||||
case R.id.nav_import:
|
||||
ImportExportPrefs.verifyStoragePermissions(this);
|
||||
ImportExportPrefs.importSharedPreferences(this);
|
||||
break;
|
||||
case R.id.nav_show_logcat:
|
||||
LogDialog.showLogcat(this);
|
||||
break;
|
||||
// case R.id.nav_test_alarm:
|
||||
// final int REQUEST_CODE_ASK_PERMISSIONS = 2355;
|
||||
// int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.SYSTEM_ALERT_WINDOW);
|
||||
// if (permission != PackageManager.PERMISSION_GRANTED) {
|
||||
// // We don't have permission so prompt the user
|
||||
// // On Android 6 give permission for alarming in Settings -> Apps -> Draw over other apps
|
||||
// ActivityCompat.requestPermissions(
|
||||
// this,
|
||||
// new String[]{Manifest.permission.SYSTEM_ALERT_WINDOW},
|
||||
// REQUEST_CODE_ASK_PERMISSIONS
|
||||
// );
|
||||
// }
|
||||
// Intent alertServiceIntent = new Intent(getApplicationContext(), AlertService.class);
|
||||
// alertServiceIntent.putExtra("alertText", getString(R.string.nav_test_alert));
|
||||
// getApplicationContext().startService(alertServiceIntent);
|
||||
// break;
|
||||
case R.id.nav_exit:
|
||||
log.debug("Exiting");
|
||||
MainApp.instance().stopKeepAliveService();
|
||||
MainApp.bus().post(new EventAppExit());
|
||||
MainApp.closeDbHelper();
|
||||
finish();
|
||||
System.runFinalization();
|
||||
System.exit(0);
|
||||
break;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void registerBus() {
|
||||
try {
|
||||
MainApp.bus().unregister(this);
|
||||
|
@ -243,7 +162,7 @@ public class MainActivity extends AppCompatActivity {
|
|||
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
|
||||
log.debug("Requesting ignore battery optimization");
|
||||
|
||||
OKDialog.show(this, getString(R.string.pleaseallowpermission), String.format(getString(R.string.needwhitelisting), getString(R.string.app_name)), new Runnable() {
|
||||
OKDialog.show(getParent(), getString(R.string.pleaseallowpermission), String.format(getString(R.string.needwhitelisting), getString(R.string.app_name)), new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
@ -325,4 +244,81 @@ public class MainActivity extends AppCompatActivity {
|
|||
}
|
||||
return super.dispatchTouchEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(final View v) {
|
||||
final Activity activity = this;
|
||||
switch (v.getId()) {
|
||||
case R.id.overview_menuButton:
|
||||
PopupMenu popup = new PopupMenu(v.getContext(), v);
|
||||
MenuInflater inflater = popup.getMenuInflater();
|
||||
inflater.inflate(R.menu.menu_main, popup.getMenu());
|
||||
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
switch (id) {
|
||||
case R.id.nav_preferences:
|
||||
PasswordProtection.QueryPassword(v.getContext(), R.string.settings_password, "settings_password", new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Intent i = new Intent(v.getContext(), PreferencesActivity.class);
|
||||
startActivity(i);
|
||||
}
|
||||
}, null);
|
||||
break;
|
||||
case R.id.nav_resetdb:
|
||||
new AlertDialog.Builder(v.getContext())
|
||||
.setTitle(R.string.nav_resetdb)
|
||||
.setMessage(R.string.reset_db_confirm)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
MainApp.getDbHelper().resetDatabases();
|
||||
}
|
||||
})
|
||||
.create()
|
||||
.show();
|
||||
break;
|
||||
case R.id.nav_export:
|
||||
ImportExportPrefs.verifyStoragePermissions(activity);
|
||||
ImportExportPrefs.exportSharedPreferences(activity);
|
||||
break;
|
||||
case R.id.nav_import:
|
||||
ImportExportPrefs.verifyStoragePermissions(activity);
|
||||
ImportExportPrefs.importSharedPreferences(activity);
|
||||
break;
|
||||
case R.id.nav_show_logcat:
|
||||
LogDialog.showLogcat(v.getContext());
|
||||
break;
|
||||
case R.id.nav_about:
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
|
||||
builder.setTitle(getString(R.string.app_name) + " " + BuildConfig.VERSION);
|
||||
if (Config.NSCLIENT)
|
||||
builder.setIcon(R.mipmap.yellowowl);
|
||||
else
|
||||
builder.setIcon(R.mipmap.blueowl);
|
||||
builder.setMessage("Build: " + BuildConfig.BUILDVERSION);
|
||||
builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null);
|
||||
AlertDialog alertDialog = builder.create();
|
||||
alertDialog.show();
|
||||
break;
|
||||
case R.id.nav_exit:
|
||||
log.debug("Exiting");
|
||||
MainApp.instance().stopKeepAliveService();
|
||||
MainApp.bus().post(new EventAppExit());
|
||||
MainApp.closeDbHelper();
|
||||
finish();
|
||||
System.runFinalization();
|
||||
System.exit(0);
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
popup.show();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,38 +18,47 @@ import org.slf4j.LoggerFactory;
|
|||
import java.util.ArrayList;
|
||||
|
||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.Actions.ActionsFragment;
|
||||
import info.nightscout.androidaps.plugins.Careportal.CareportalFragment;
|
||||
import info.nightscout.androidaps.plugins.CircadianPercentageProfile.CircadianPercentageProfileFragment;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRFragment;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanFragment;
|
||||
import info.nightscout.androidaps.plugins.LocalProfile.LocalProfileFragment;
|
||||
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesFragment;
|
||||
import info.nightscout.androidaps.plugins.ConstraintsSafety.SafetyFragment;
|
||||
import info.nightscout.androidaps.plugins.InsulinFastacting.InsulinFastactingFragment;
|
||||
import info.nightscout.androidaps.plugins.InsulinFastactingProlonged.InsulinFastactingProlongedFragment;
|
||||
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorFragment;
|
||||
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
|
||||
import info.nightscout.androidaps.plugins.MDI.MDIFragment;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSClientInternalFragment;
|
||||
import info.nightscout.androidaps.plugins.NSProfile.NSProfileFragment;
|
||||
import info.nightscout.androidaps.plugins.Objectives.ObjectivesFragment;
|
||||
import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAFragment;
|
||||
import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAFragment;
|
||||
import info.nightscout.androidaps.plugins.Overview.OverviewFragment;
|
||||
import info.nightscout.androidaps.plugins.SafetyFragment.SafetyFragment;
|
||||
import info.nightscout.androidaps.plugins.SimpleProfile.SimpleProfileFragment;
|
||||
import info.nightscout.androidaps.plugins.Persistentnotification.PersistentNotificationPlugin;
|
||||
import info.nightscout.androidaps.plugins.ProfileCircadianPercentage.CircadianPercentageProfileFragment;
|
||||
import info.nightscout.androidaps.plugins.ProfileLocal.LocalProfileFragment;
|
||||
import info.nightscout.androidaps.plugins.ProfileNS.NSProfileFragment;
|
||||
import info.nightscout.androidaps.plugins.ProfileSimple.SimpleProfileFragment;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRFragment;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.services.DanaRExecutionService;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanFragment;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRKorean.services.DanaRKoreanExecutionService;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Fragment;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.services.DanaRv2ExecutionService;
|
||||
import info.nightscout.androidaps.plugins.PumpMDI.MDIFragment;
|
||||
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpFragment;
|
||||
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorFragment;
|
||||
import info.nightscout.androidaps.plugins.SourceGlimp.SourceGlimpFragment;
|
||||
import info.nightscout.androidaps.plugins.SourceMM640g.SourceMM640gFragment;
|
||||
import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientFragment;
|
||||
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripFragment;
|
||||
import info.nightscout.androidaps.plugins.TempBasals.TempBasalsFragment;
|
||||
import info.nightscout.androidaps.plugins.TempTargetRange.TempTargetRangeFragment;
|
||||
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
|
||||
import info.nightscout.androidaps.plugins.VirtualPump.VirtualPumpFragment;
|
||||
import info.nightscout.androidaps.plugins.Wear.WearFragment;
|
||||
import info.nightscout.androidaps.plugins.persistentnotification.PersistentNotificationPlugin;
|
||||
import info.nightscout.androidaps.plugins.XDripStatusline.StatuslineFragment;
|
||||
import info.nightscout.androidaps.receivers.KeepAliveReceiver;
|
||||
import info.nightscout.utils.NSUpload;
|
||||
import io.fabric.sdk.android.Fabric;
|
||||
|
||||
|
||||
|
@ -85,31 +94,38 @@ public class MainApp extends Application {
|
|||
pluginsList = new ArrayList<>();
|
||||
// Register all tabs in app here
|
||||
pluginsList.add(OverviewFragment.getPlugin());
|
||||
pluginsList.add(IobCobCalculatorFragment.getPlugin());
|
||||
if (Config.ACTION) pluginsList.add(ActionsFragment.getPlugin());
|
||||
pluginsList.add(InsulinFastactingFragment.getPlugin());
|
||||
pluginsList.add(InsulinFastactingProlongedFragment.getPlugin());
|
||||
if (Config.DANAR) pluginsList.add(DanaRFragment.getPlugin());
|
||||
if (Config.DANARKOREAN) pluginsList.add(DanaRKoreanFragment.getPlugin());
|
||||
if (Config.DANAR) pluginsList.add(DanaRKoreanFragment.getPlugin());
|
||||
if (Config.DANARv2) pluginsList.add(DanaRv2Fragment.getPlugin());
|
||||
pluginsList.add(CareportalFragment.getPlugin());
|
||||
if (Config.MDI) pluginsList.add(MDIFragment.getPlugin());
|
||||
if (Config.VIRTUALPUMP) pluginsList.add(VirtualPumpFragment.getPlugin());
|
||||
if (Config.VIRTUALPUMP) pluginsList.add(VirtualPumpPlugin.getInstance());
|
||||
if (Config.LOOPENABLED) pluginsList.add(LoopFragment.getPlugin());
|
||||
if (Config.OPENAPSENABLED) pluginsList.add(OpenAPSMAFragment.getPlugin());
|
||||
if (Config.OPENAPSENABLED) pluginsList.add(OpenAPSAMAFragment.getPlugin());
|
||||
pluginsList.add(NSProfileFragment.getPlugin());
|
||||
if (Config.OTHERPROFILES) pluginsList.add(SimpleProfileFragment.getPlugin());
|
||||
if (Config.OTHERPROFILES) pluginsList.add(LocalProfileFragment.getPlugin());
|
||||
if (Config.OTHERPROFILES) pluginsList.add(CircadianPercentageProfileFragment.getPlugin());
|
||||
if (Config.APS) pluginsList.add(TempTargetRangeFragment.getPlugin());
|
||||
if (Config.OTHERPROFILES)
|
||||
pluginsList.add(CircadianPercentageProfileFragment.getPlugin());
|
||||
pluginsList.add(TreatmentsFragment.getPlugin());
|
||||
if (Config.TEMPBASALS) pluginsList.add(TempBasalsFragment.getPlugin());
|
||||
if (Config.SAFETY) pluginsList.add(SafetyFragment.getPlugin());
|
||||
if (Config.APS) pluginsList.add(ObjectivesFragment.getPlugin());
|
||||
pluginsList.add(SourceXdripFragment.getPlugin());
|
||||
if (!Config.NSCLIENT)
|
||||
pluginsList.add(SourceXdripFragment.getPlugin());
|
||||
pluginsList.add(SourceNSClientFragment.getPlugin());
|
||||
pluginsList.add(SourceMM640gFragment.getPlugin());
|
||||
pluginsList.add(SourceGlimpFragment.getPlugin());
|
||||
if (!Config.NSCLIENT)
|
||||
pluginsList.add(SourceMM640gFragment.getPlugin());
|
||||
if (!Config.NSCLIENT)
|
||||
pluginsList.add(SourceGlimpFragment.getPlugin());
|
||||
if (Config.SMSCOMMUNICATORENABLED) pluginsList.add(SmsCommunicatorFragment.getPlugin());
|
||||
|
||||
if (Config.WEAR) pluginsList.add(WearFragment.getPlugin(this));
|
||||
pluginsList.add(StatuslineFragment.getPlugin(this));
|
||||
pluginsList.add(new PersistentNotificationPlugin(this));
|
||||
pluginsList.add(NSClientInternalFragment.getPlugin());
|
||||
|
||||
|
@ -117,7 +133,7 @@ public class MainApp extends Application {
|
|||
|
||||
MainApp.getConfigBuilder().initialize();
|
||||
}
|
||||
MainApp.getConfigBuilder().uploadAppStart();
|
||||
NSUpload.uploadAppStart();
|
||||
|
||||
startKeepAliveService();
|
||||
|
||||
|
@ -140,18 +156,18 @@ public class MainApp extends Application {
|
|||
if (keepAliveReceiver == null) {
|
||||
keepAliveReceiver = new KeepAliveReceiver();
|
||||
if (Config.DANAR) {
|
||||
startService(new Intent(this, info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService.class));
|
||||
startService(new Intent(this, info.nightscout.androidaps.plugins.DanaRKorean.Services.ExecutionService.class));
|
||||
startService(new Intent(this, DanaRExecutionService.class));
|
||||
startService(new Intent(this, DanaRKoreanExecutionService.class));
|
||||
startService(new Intent(this, DanaRv2ExecutionService.class));
|
||||
}
|
||||
keepAliveReceiver.setAlarm(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void stopKeepAliveService(){
|
||||
if(keepAliveReceiver!=null)
|
||||
keepAliveReceiver.cancelAlarm(this);
|
||||
public void stopKeepAliveService() {
|
||||
if (keepAliveReceiver != null)
|
||||
keepAliveReceiver.cancelAlarm(this);
|
||||
}
|
||||
|
||||
public static Bus bus() {
|
||||
|
@ -198,6 +214,36 @@ public class MainApp extends Application {
|
|||
return newList;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static InsulinInterface getInsulinIterfaceById(int id) {
|
||||
ArrayList<PluginBase> newList = new ArrayList<>();
|
||||
|
||||
if (pluginsList != null) {
|
||||
for (PluginBase p : pluginsList) {
|
||||
if (p.getType() == PluginBase.INSULIN && ((InsulinInterface) p).getId() == id)
|
||||
return (InsulinInterface) p;
|
||||
}
|
||||
} else {
|
||||
log.error("InsulinInterface not found");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ArrayList<PluginBase> getSpecificPluginsVisibleInList(int type) {
|
||||
ArrayList<PluginBase> newList = new ArrayList<>();
|
||||
|
||||
if (pluginsList != null) {
|
||||
for (PluginBase p : pluginsList) {
|
||||
if (p.getType() == type)
|
||||
if (p.showInList(type))
|
||||
newList.add(p);
|
||||
}
|
||||
} else {
|
||||
log.error("pluginsList=null");
|
||||
}
|
||||
return newList;
|
||||
}
|
||||
|
||||
public static ArrayList<PluginBase> getSpecificPluginsListByInterface(Class interfaceClass) {
|
||||
ArrayList<PluginBase> newList = new ArrayList<>();
|
||||
|
||||
|
@ -212,6 +258,21 @@ public class MainApp extends Application {
|
|||
return newList;
|
||||
}
|
||||
|
||||
public static ArrayList<PluginBase> getSpecificPluginsVisibleInListByInterface(Class interfaceClass, int type) {
|
||||
ArrayList<PluginBase> newList = new ArrayList<>();
|
||||
|
||||
if (pluginsList != null) {
|
||||
for (PluginBase p : pluginsList) {
|
||||
if (p.getClass() != ConfigBuilderPlugin.class && interfaceClass.isAssignableFrom(p.getClass()))
|
||||
if (p.showInList(type))
|
||||
newList.add(p);
|
||||
}
|
||||
} else {
|
||||
log.error("pluginsList=null");
|
||||
}
|
||||
return newList;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static PluginBase getSpecificPlugin(Class pluginClass) {
|
||||
if (pluginsList != null) {
|
||||
|
|
|
@ -14,13 +14,15 @@ import android.preference.PreferenceManager;
|
|||
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||
import info.nightscout.androidaps.events.EventRefreshGui;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.plugins.DanaR.BluetoothDevicePreference;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.BluetoothDevicePreference;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.NSClientInternalPlugin;
|
||||
import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin;
|
||||
import info.nightscout.androidaps.plugins.VirtualPump.VirtualPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
|
||||
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.Wear.WearPlugin;
|
||||
import info.nightscout.androidaps.plugins.XDripStatusline.StatuslinePlugin;
|
||||
import info.nightscout.utils.LocaleHelper;
|
||||
|
||||
public class PreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
|
@ -109,10 +111,14 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
|
|||
if (Config.DANAR) {
|
||||
DanaRPlugin danaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class);
|
||||
DanaRKoreanPlugin danaRKoreanPlugin = (DanaRKoreanPlugin) MainApp.getSpecificPlugin(DanaRKoreanPlugin.class);
|
||||
DanaRv2Plugin danaRv2Plugin = (DanaRv2Plugin) MainApp.getSpecificPlugin(DanaRv2Plugin.class);
|
||||
if (danaRPlugin.isEnabled(PluginBase.PUMP) || danaRKoreanPlugin.isEnabled(PluginBase.PUMP)) {
|
||||
addPreferencesFromResource(R.xml.pref_danar);
|
||||
}
|
||||
if (danaRPlugin.isEnabled(PluginBase.PROFILE) || danaRKoreanPlugin.isEnabled(PluginBase.PROFILE)) {
|
||||
if (danaRv2Plugin != null && danaRv2Plugin.isEnabled(PluginBase.PUMP)) {
|
||||
addPreferencesFromResource(R.xml.pref_danarv2);
|
||||
}
|
||||
if (danaRPlugin.isEnabled(PluginBase.PROFILE) || danaRKoreanPlugin.isEnabled(PluginBase.PROFILE) || danaRv2Plugin != null && danaRv2Plugin.isEnabled(PluginBase.PROFILE)) {
|
||||
addPreferencesFromResource(R.xml.pref_danarprofile);
|
||||
}
|
||||
}
|
||||
|
@ -138,6 +144,11 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
|
|||
}
|
||||
}
|
||||
|
||||
StatuslinePlugin statuslinePlugin = (StatuslinePlugin) MainApp.getSpecificPlugin(StatuslinePlugin.class);
|
||||
if (statuslinePlugin != null && statuslinePlugin.isEnabled(PluginBase.GENERAL)) {
|
||||
addPreferencesFromResource(R.xml.pref_xdripstatus);
|
||||
}
|
||||
|
||||
initSummary(getPreferenceScreen());
|
||||
}
|
||||
|
||||
|
|
|
@ -2,56 +2,42 @@ package info.nightscout.androidaps.Services;
|
|||
|
||||
import android.app.IntentService;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.provider.Telephony;
|
||||
|
||||
import com.j256.ormlite.dao.Dao;
|
||||
import com.j256.ormlite.stmt.PreparedQuery;
|
||||
import com.j256.ormlite.stmt.QueryBuilder;
|
||||
import com.j256.ormlite.stmt.Where;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.db.BgReading;
|
||||
import info.nightscout.androidaps.db.DanaRHistoryRecord;
|
||||
import info.nightscout.androidaps.db.TempTarget;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
import info.nightscout.androidaps.events.EventNewBG;
|
||||
import info.nightscout.androidaps.db.CareportalEvent;
|
||||
import info.nightscout.androidaps.events.EventNewBasalProfile;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.History.DanaRNSHistorySync;
|
||||
import info.nightscout.androidaps.plugins.NSProfile.NSProfilePlugin;
|
||||
import info.nightscout.androidaps.plugins.Objectives.ObjectivesPlugin;
|
||||
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSMbg;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv;
|
||||
import info.nightscout.androidaps.data.ProfileStore;
|
||||
import info.nightscout.androidaps.plugins.Overview.Notification;
|
||||
import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||
import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorPlugin;
|
||||
import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaR.History.DanaRNSHistorySync;
|
||||
import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventNewSMS;
|
||||
import info.nightscout.androidaps.plugins.SourceGlimp.SourceGlimpPlugin;
|
||||
import info.nightscout.androidaps.plugins.SourceMM640g.SourceMM640gPlugin;
|
||||
import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientPlugin;
|
||||
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin;
|
||||
import info.nightscout.androidaps.plugins.TempTargetRange.events.EventTempTargetRangeChange;
|
||||
import info.nightscout.androidaps.receivers.DataReceiver;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
|
||||
public class DataService extends IntentService {
|
||||
|
@ -94,10 +80,9 @@ public class DataService extends IntentService {
|
|||
glimpEnabled = true;
|
||||
}
|
||||
|
||||
boolean isNSProfile = ConfigBuilderPlugin.getActiveProfile().getClass().equals(NSProfilePlugin.class);
|
||||
boolean isNSProfile = ConfigBuilderPlugin.getActiveProfileInterface().getClass().equals(NSProfilePlugin.class);
|
||||
|
||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
boolean nsUploadOnly = SP.getBoolean("ns_upload_only", false);
|
||||
boolean nsUploadOnly = SP.getBoolean(R.string.key_ns_upload_only, false);
|
||||
|
||||
if (intent != null) {
|
||||
final String action = intent.getAction();
|
||||
|
@ -121,7 +106,7 @@ public class DataService extends IntentService {
|
|||
// Objectives 0
|
||||
ObjectivesPlugin.bgIsAvailableInNS = true;
|
||||
ObjectivesPlugin.saveProgress();
|
||||
} else if (isNSProfile && Intents.ACTION_NEW_PROFILE.equals(action)) {
|
||||
} else if (isNSProfile && Intents.ACTION_NEW_PROFILE.equals(action) || Intents.ACTION_NEW_DEVICESTATUS.equals(action)) {
|
||||
// always handle Profile if NSProfile is enabled without looking at nsUploadOnly
|
||||
handleNewDataFromNSClient(intent);
|
||||
} else if (!nsUploadOnly &&
|
||||
|
@ -178,25 +163,10 @@ public class DataService extends IntentService {
|
|||
|
||||
bgReading.value = bundle.getDouble(Intents.EXTRA_BG_ESTIMATE);
|
||||
bgReading.direction = bundle.getString(Intents.EXTRA_BG_SLOPE_NAME);
|
||||
bgReading.battery_level = bundle.getInt(Intents.EXTRA_SENSOR_BATTERY);
|
||||
bgReading.timeIndex = bundle.getLong(Intents.EXTRA_TIMESTAMP);
|
||||
bgReading.date = bundle.getLong(Intents.EXTRA_TIMESTAMP);
|
||||
bgReading.raw = bundle.getDouble(Intents.EXTRA_RAW);
|
||||
|
||||
if (bgReading.timeIndex < new Date().getTime() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000L) {
|
||||
if (Config.logIncommingBG)
|
||||
log.debug("Ignoring old XDRIPREC BG " + bgReading.toString());
|
||||
return;
|
||||
}
|
||||
|
||||
if (Config.logIncommingBG)
|
||||
log.debug("XDRIPREC BG " + bgReading.toString());
|
||||
|
||||
try {
|
||||
MainApp.getDbHelper().getDaoBgReadings().createIfNotExists(bgReading);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
MainApp.bus().post(new EventNewBG());
|
||||
MainApp.getDbHelper().createIfNotExists(bgReading, "XDRIP");
|
||||
}
|
||||
|
||||
private void handleNewDataFromGlimp(Intent intent) {
|
||||
|
@ -207,20 +177,10 @@ public class DataService extends IntentService {
|
|||
|
||||
bgReading.value = bundle.getDouble("mySGV");
|
||||
bgReading.direction = bundle.getString("myTrend");
|
||||
bgReading.battery_level = bundle.getInt("myBatLvl");
|
||||
bgReading.timeIndex = bundle.getLong("myTimestamp");
|
||||
bgReading.date = bundle.getLong("myTimestamp");
|
||||
bgReading.raw = 0;
|
||||
|
||||
if (Config.logIncommingBG)
|
||||
log.debug(bundle.toString());
|
||||
log.debug("GLIMP BG " + bgReading.toString());
|
||||
|
||||
try {
|
||||
MainApp.getDbHelper().getDaoBgReadings().createIfNotExists(bgReading);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
MainApp.bus().post(new EventNewBG());
|
||||
MainApp.getDbHelper().createIfNotExists(bgReading, "GLIMP");
|
||||
}
|
||||
|
||||
private void handleNewDataFromMM640g(Intent intent) {
|
||||
|
@ -245,23 +205,10 @@ public class DataService extends IntentService {
|
|||
|
||||
bgReading.value = json_object.getDouble("sgv");
|
||||
bgReading.direction = json_object.getString("direction");
|
||||
bgReading.timeIndex = json_object.getLong("date");
|
||||
bgReading.date = json_object.getLong("date");
|
||||
bgReading.raw = json_object.getDouble("sgv");
|
||||
|
||||
if (bgReading.timeIndex < new Date().getTime() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000L) {
|
||||
if (Config.logIncommingBG)
|
||||
log.debug("Ignoring old MM640g BG " + bgReading.toString());
|
||||
return;
|
||||
}
|
||||
|
||||
if (Config.logIncommingBG)
|
||||
log.debug("MM640g BG " + bgReading.toString());
|
||||
|
||||
try {
|
||||
MainApp.getDbHelper().getDaoBgReadings().createIfNotExists(bgReading);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
MainApp.getDbHelper().createIfNotExists(bgReading, "MM640g");
|
||||
break;
|
||||
default:
|
||||
log.debug("Unknown entries type: " + type);
|
||||
|
@ -272,7 +219,6 @@ public class DataService extends IntentService {
|
|||
}
|
||||
}
|
||||
}
|
||||
MainApp.bus().post(new EventNewBG());
|
||||
}
|
||||
|
||||
private void handleNewDataFromNSClient(Intent intent) {
|
||||
|
@ -353,25 +299,12 @@ public class DataService extends IntentService {
|
|||
try {
|
||||
String activeProfile = bundles.getString("activeprofile");
|
||||
String profile = bundles.getString("profile");
|
||||
NSProfile nsProfile = new NSProfile(new JSONObject(profile), activeProfile);
|
||||
MainApp.bus().post(new EventNewBasalProfile(nsProfile));
|
||||
ProfileStore profileStore = new ProfileStore(new JSONObject(profile));
|
||||
NSProfilePlugin.storeNewProfile(profileStore);
|
||||
MainApp.bus().post(new EventNewBasalProfile());
|
||||
|
||||
PumpInterface pump = MainApp.getConfigBuilder();
|
||||
if (pump != null) {
|
||||
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||
if (SP.getBoolean("syncprofiletopump", false)) {
|
||||
if (pump.setNewBasalProfile(nsProfile) == PumpInterface.SUCCESS) {
|
||||
SmsCommunicatorPlugin smsCommunicatorPlugin = (SmsCommunicatorPlugin) MainApp.getSpecificPlugin(SmsCommunicatorPlugin.class);
|
||||
if (smsCommunicatorPlugin != null && smsCommunicatorPlugin.isEnabled(PluginBase.GENERAL)) {
|
||||
smsCommunicatorPlugin.sendNotificationToAllNumbers(MainApp.sResources.getString(R.string.profile_set_ok));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log.error("No active pump selected");
|
||||
}
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Received profile: " + activeProfile + " " + profile);
|
||||
log.debug("Received profileStore: " + activeProfile + " " + profile);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -380,7 +313,7 @@ public class DataService extends IntentService {
|
|||
try {
|
||||
if (bundles.containsKey("treatment")) {
|
||||
String trstring = bundles.getString("treatment");
|
||||
handleAddedTreatment(trstring);
|
||||
handleAddChangeDataFromNS(trstring);
|
||||
}
|
||||
if (bundles.containsKey("treatments")) {
|
||||
String trstring = bundles.getString("treatments");
|
||||
|
@ -388,7 +321,7 @@ public class DataService extends IntentService {
|
|||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
JSONObject trJson = jsonArray.getJSONObject(i);
|
||||
String trstr = trJson.toString();
|
||||
handleAddedTreatment(trstr);
|
||||
handleAddChangeDataFromNS(trstr);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
@ -401,7 +334,7 @@ public class DataService extends IntentService {
|
|||
try {
|
||||
if (bundles.containsKey("treatment")) {
|
||||
String trstring = bundles.getString("treatment");
|
||||
handleChangedTreatment(trstring);
|
||||
handleAddChangeDataFromNS(trstring);
|
||||
}
|
||||
if (bundles.containsKey("treatments")) {
|
||||
String trstring = bundles.getString("treatments");
|
||||
|
@ -409,7 +342,7 @@ public class DataService extends IntentService {
|
|||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
JSONObject trJson = jsonArray.getJSONObject(i);
|
||||
String trstr = trJson.toString();
|
||||
handleChangedTreatment(trstr);
|
||||
handleAddChangeDataFromNS(trstr);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
@ -423,8 +356,7 @@ public class DataService extends IntentService {
|
|||
String trstring = bundles.getString("treatment");
|
||||
JSONObject trJson = new JSONObject(trstring);
|
||||
String _id = trJson.getString("_id");
|
||||
MainApp.getDbHelper().delete(_id);
|
||||
handleRemoveTempTargetRecord(trJson);
|
||||
handleRemovedRecordFromNS(_id);
|
||||
}
|
||||
|
||||
if (bundles.containsKey("treatments")) {
|
||||
|
@ -433,8 +365,7 @@ public class DataService extends IntentService {
|
|||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
JSONObject trJson = jsonArray.getJSONObject(i);
|
||||
String _id = trJson.getString("_id");
|
||||
MainApp.getDbHelper().delete(_id);
|
||||
handleRemoveTempTargetRecord(trJson);
|
||||
handleRemovedRecordFromNS(_id);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
@ -449,14 +380,7 @@ public class DataService extends IntentService {
|
|||
JSONObject sgvJson = new JSONObject(sgvstring);
|
||||
NSSgv nsSgv = new NSSgv(sgvJson);
|
||||
BgReading bgReading = new BgReading(nsSgv);
|
||||
if (bgReading.timeIndex < new Date().getTime() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000l) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Ignoring old BG: " + bgReading.toString());
|
||||
return;
|
||||
}
|
||||
MainApp.getDbHelper().getDaoBgReadings().createIfNotExists(bgReading);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("ADD: Stored new BG: " + bgReading.toString());
|
||||
MainApp.getDbHelper().createIfNotExists(bgReading, "NS");
|
||||
}
|
||||
|
||||
if (bundles.containsKey("sgvs")) {
|
||||
|
@ -466,244 +390,129 @@ public class DataService extends IntentService {
|
|||
JSONObject sgvJson = jsonArray.getJSONObject(i);
|
||||
NSSgv nsSgv = new NSSgv(sgvJson);
|
||||
BgReading bgReading = new BgReading(nsSgv);
|
||||
if (bgReading.timeIndex < new Date().getTime() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000l) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Ignoring old BG: " + bgReading.toString());
|
||||
} else {
|
||||
MainApp.getDbHelper().getDaoBgReadings().createIfNotExists(bgReading);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("ADD: Stored new BG: " + bgReading.toString());
|
||||
}
|
||||
MainApp.getDbHelper().createIfNotExists(bgReading, "NS");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
MainApp.bus().post(new EventNewBG());
|
||||
}
|
||||
|
||||
if (intent.getAction().equals(Intents.ACTION_NEW_MBG)) {
|
||||
log.error("Not implemented yet"); // TODO implemeng MBGS
|
||||
}
|
||||
}
|
||||
try {
|
||||
if (bundles.containsKey("mbg")) {
|
||||
String mbgstring = bundles.getString("mbg");
|
||||
JSONObject mbgJson = new JSONObject(mbgstring);
|
||||
NSMbg nsMbg = new NSMbg(mbgJson);
|
||||
CareportalEvent careportalEvent = new CareportalEvent(nsMbg);
|
||||
MainApp.getDbHelper().createOrUpdate(careportalEvent);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Adding/Updating new MBG: " + careportalEvent.log());
|
||||
}
|
||||
|
||||
private void handleAddedTreatment(String trstring) throws JSONException, SQLException {
|
||||
JSONObject trJson = new JSONObject(trstring);
|
||||
handleDanaRHistoryRecords(trJson); // update record _id in history
|
||||
handleAddChangeTempTargetRecord(trJson);
|
||||
if (!trJson.has("insulin") && !trJson.has("carbs")) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("ADD: Uninterested treatment: " + trstring);
|
||||
return;
|
||||
}
|
||||
|
||||
Treatment stored = null;
|
||||
String _id = trJson.getString("_id");
|
||||
|
||||
if (trJson.has("timeIndex")) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("ADD: timeIndex found: " + trstring);
|
||||
stored = MainApp.getDbHelper().findTreatmentByTimeIndex(trJson.getLong("timeIndex"));
|
||||
} else {
|
||||
stored = MainApp.getDbHelper().findTreatmentById(_id);
|
||||
}
|
||||
|
||||
if (stored != null) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("ADD: Existing treatment: " + trstring);
|
||||
if (trJson.has("timeIndex")) {
|
||||
stored._id = _id;
|
||||
int updated = MainApp.getDbHelper().update(stored);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Records updated: " + updated);
|
||||
}
|
||||
} else {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("ADD: New treatment: " + trstring);
|
||||
Treatment treatment = new Treatment();
|
||||
treatment._id = _id;
|
||||
treatment.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0;
|
||||
treatment.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d;
|
||||
treatment.created_at = new Date(trJson.getLong("mills"));
|
||||
if (trJson.has("eventType")) {
|
||||
treatment.mealBolus = true;
|
||||
if (trJson.get("eventType").equals("Correction Bolus"))
|
||||
treatment.mealBolus = false;
|
||||
double carbs = treatment.carbs;
|
||||
if (trJson.has("boluscalc")) {
|
||||
JSONObject boluscalc = trJson.getJSONObject("boluscalc");
|
||||
if (boluscalc.has("carbs")) {
|
||||
carbs = Math.max(boluscalc.getDouble("carbs"), carbs);
|
||||
if (bundles.containsKey("mbgs")) {
|
||||
String sgvstring = bundles.getString("mbgs");
|
||||
JSONArray jsonArray = new JSONArray(sgvstring);
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
JSONObject mbgJson = jsonArray.getJSONObject(i);
|
||||
NSMbg nsMbg = new NSMbg(mbgJson);
|
||||
CareportalEvent careportalEvent = new CareportalEvent(nsMbg);
|
||||
MainApp.getDbHelper().createOrUpdate(careportalEvent);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Adding/Updating new MBG: " + careportalEvent.log());
|
||||
}
|
||||
}
|
||||
if (carbs <= 0)
|
||||
treatment.mealBolus = false;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
treatment.setTimeIndex(treatment.getTimeIndex());
|
||||
MainApp.getDbHelper().createOrUpdate(treatment);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("ADD: Stored treatment: " + treatment.log());
|
||||
}
|
||||
}
|
||||
|
||||
private void handleChangedTreatment(String trstring) throws JSONException, SQLException {
|
||||
private void handleRemovedRecordFromNS(String _id) {
|
||||
MainApp.getDbHelper().deleteTreatmentById(_id);
|
||||
MainApp.getDbHelper().deleteTempTargetById(_id);
|
||||
MainApp.getDbHelper().deleteTempBasalById(_id);
|
||||
MainApp.getDbHelper().deleteExtendedBolusById(_id);
|
||||
MainApp.getDbHelper().deleteCareportalEventById(_id);
|
||||
MainApp.getDbHelper().deleteProfileSwitchById(_id);
|
||||
}
|
||||
|
||||
private void handleAddChangeDataFromNS(String trstring) throws JSONException {
|
||||
JSONObject trJson = new JSONObject(trstring);
|
||||
handleDanaRHistoryRecords(trJson); // update record _id in history
|
||||
handleAddChangeTempTargetRecord(trJson);
|
||||
if (!trJson.has("insulin") && !trJson.has("carbs")) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("CHANGE: Uninterested treatment: " + trstring);
|
||||
handleAddChangeTempBasalRecord(trJson);
|
||||
handleAddChangeExtendedBolusRecord(trJson);
|
||||
handleAddChangeCareportalEventRecord(trJson);
|
||||
handleAddChangeTreatmentRecord(trJson);
|
||||
handleAddChangeProfileSwitchRecord(trJson);
|
||||
}
|
||||
|
||||
public void handleDanaRHistoryRecords(JSONObject trJson) {
|
||||
if (trJson.has(DanaRNSHistorySync.DANARSIGNATURE)) {
|
||||
MainApp.getDbHelper().updateDanaRHistoryRecordId(trJson);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleAddChangeTreatmentRecord(JSONObject trJson) throws JSONException {
|
||||
if (trJson.has("insulin") || trJson.has("carbs")) {
|
||||
MainApp.getDbHelper().createTreatmentFromJsonIfNotExists(trJson);
|
||||
return;
|
||||
}
|
||||
String _id = trJson.getString("_id");
|
||||
|
||||
Treatment stored;
|
||||
|
||||
if (trJson.has("timeIndex")) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("ADD: timeIndex found: " + trstring);
|
||||
stored = MainApp.getDbHelper().findTreatmentByTimeIndex(trJson.getLong("timeIndex"));
|
||||
} else {
|
||||
stored = MainApp.getDbHelper().findTreatmentById(_id);
|
||||
}
|
||||
|
||||
if (stored != null) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("CHANGE: Removing old: " + trstring);
|
||||
MainApp.getDbHelper().delete(_id);
|
||||
}
|
||||
|
||||
if (Config.logIncommingData)
|
||||
log.debug("CHANGE: Adding new treatment: " + trstring);
|
||||
Treatment treatment = new Treatment();
|
||||
treatment._id = _id;
|
||||
treatment.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0;
|
||||
treatment.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d;
|
||||
//treatment.created_at = DateUtil.fromISODateString(trJson.getString("created_at"));
|
||||
treatment.created_at = new Date(trJson.getLong("mills"));
|
||||
if (trJson.has("eventType")) {
|
||||
treatment.mealBolus = true;
|
||||
if (trJson.get("eventType").equals("Correction Bolus"))
|
||||
treatment.mealBolus = false;
|
||||
double carbs = treatment.carbs;
|
||||
if (trJson.has("boluscalc")) {
|
||||
JSONObject boluscalc = trJson.getJSONObject("boluscalc");
|
||||
if (boluscalc.has("carbs")) {
|
||||
carbs = Math.max(boluscalc.getDouble("carbs"), carbs);
|
||||
}
|
||||
}
|
||||
if (carbs <= 0)
|
||||
treatment.mealBolus = false;
|
||||
}
|
||||
treatment.setTimeIndex(treatment.getTimeIndex());
|
||||
Dao.CreateOrUpdateStatus status = MainApp.getDbHelper().createOrUpdate(treatment);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Records updated: " + status.getNumLinesChanged());
|
||||
if (Config.logIncommingData)
|
||||
log.debug("CHANGE: Stored treatment: " + treatment.log());
|
||||
}
|
||||
|
||||
public void handleDanaRHistoryRecords(JSONObject trJson) throws JSONException, SQLException {
|
||||
if (trJson.has(DanaRNSHistorySync.DANARSIGNATURE)) {
|
||||
Dao<DanaRHistoryRecord, String> daoHistoryRecords = MainApp.getDbHelper().getDaoDanaRHistory();
|
||||
QueryBuilder<DanaRHistoryRecord, String> queryBuilder = daoHistoryRecords.queryBuilder();
|
||||
Where where = queryBuilder.where();
|
||||
where.ge("bytes", trJson.get(DanaRNSHistorySync.DANARSIGNATURE));
|
||||
PreparedQuery<DanaRHistoryRecord> preparedQuery = queryBuilder.prepare();
|
||||
List<DanaRHistoryRecord> list = daoHistoryRecords.query(preparedQuery);
|
||||
if (list.size() == 0) {
|
||||
// Record does not exists. Ignore
|
||||
} else if (list.size() == 1) {
|
||||
DanaRHistoryRecord record = list.get(0);
|
||||
if (record.get_id() == null || record.get_id() != trJson.getString("_id")) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Updating _id in DanaR history database: " + trJson.getString("_id"));
|
||||
record.set_id(trJson.getString("_id"));
|
||||
daoHistoryRecords.update(record);
|
||||
} else {
|
||||
// already set
|
||||
}
|
||||
public void handleAddChangeTempTargetRecord(JSONObject trJson) throws JSONException {
|
||||
if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.TEMPORARYTARGET)) {
|
||||
MainApp.getDbHelper().createTemptargetFromJsonIfNotExists(trJson);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleAddChangeTempBasalRecord(JSONObject trJson) throws JSONException {
|
||||
if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.TEMPBASAL)) {
|
||||
MainApp.getDbHelper().createTempBasalFromJsonIfNotExists(trJson);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleAddChangeExtendedBolusRecord(JSONObject trJson) throws JSONException {
|
||||
if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.COMBOBOLUS)) {
|
||||
MainApp.getDbHelper().createExtendedBolusFromJsonIfNotExists(trJson);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleAddChangeCareportalEventRecord(JSONObject trJson) throws JSONException {
|
||||
if (trJson.has("insulin") && trJson.getDouble("insulin") > 0)
|
||||
return;
|
||||
if (trJson.has("carbs") && trJson.getDouble("carbs") > 0)
|
||||
return;
|
||||
if (trJson.has("eventType") && (
|
||||
trJson.getString("eventType").equals(CareportalEvent.SITECHANGE) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.INSULINCHANGE) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.SENSORCHANGE) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.BGCHECK) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.NOTE) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.NONE) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.ANNOUNCEMENT) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.QUESTION) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.EXERCISE) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.OPENAPSOFFLINE) ||
|
||||
trJson.getString("eventType").equals(CareportalEvent.PUMPBATTERYCHANGE)
|
||||
)) {
|
||||
MainApp.getDbHelper().createCareportalEventFromJsonIfNotExists(trJson);
|
||||
}
|
||||
|
||||
if (trJson.getString("eventType").equals(CareportalEvent.ANNOUNCEMENT)) {
|
||||
long date = trJson.getLong("mills");
|
||||
long now = new Date().getTime();
|
||||
if (date > now - 15 * 60 * 1000L && trJson.has("notes")) {
|
||||
Notification announcement = new Notification(Notification.ANNOUNCEMENT, trJson.getString("notes"), Notification.URGENT);
|
||||
MainApp.bus().post(new EventNewNotification(announcement));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
{
|
||||
"_id": "58795998aa86647ba4d68ce7",
|
||||
"enteredBy": "",
|
||||
"eventType": "Temporary Target",
|
||||
"reason": "Eating Soon",
|
||||
"targetTop": 80,
|
||||
"targetBottom": 80,
|
||||
"duration": 120,
|
||||
"created_at": "2017-01-13T22:50:00.782Z",
|
||||
"carbs": null,
|
||||
"insulin": null
|
||||
}
|
||||
*/
|
||||
|
||||
public void handleAddChangeTempTargetRecord(JSONObject trJson) throws JSONException, SQLException {
|
||||
if (trJson.has("eventType") && trJson.getString("eventType").equals("Temporary Target")) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Processing TempTarget record: " + trJson.toString());
|
||||
Dao<TempTarget, Long> daoTempTargets = MainApp.getDbHelper().getDaoTempTargets();
|
||||
QueryBuilder<TempTarget, Long> queryBuilder = daoTempTargets.queryBuilder();
|
||||
Where where = queryBuilder.where();
|
||||
where.eq("_id", trJson.getString("_id")).or().eq("timeIndex", trJson.getLong("mills"));
|
||||
PreparedQuery<TempTarget> preparedQuery = queryBuilder.prepare();
|
||||
List<TempTarget> list = daoTempTargets.query(preparedQuery);
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
if (profile == null) return; // no profile data, better ignore than do something wrong
|
||||
String units = profile.getUnits();
|
||||
if (list.size() == 0) {
|
||||
// Record does not exists. add
|
||||
TempTarget newRecord = new TempTarget();
|
||||
newRecord.timeStart = new Date(trJson.getLong("mills"));
|
||||
newRecord.duration = trJson.getInt("duration");
|
||||
newRecord.low = NSProfile.toMgdl(trJson.getDouble("targetBottom"), units);
|
||||
newRecord.high = NSProfile.toMgdl(trJson.getDouble("targetTop"), units);
|
||||
newRecord.reason = trJson.getString("reason");
|
||||
newRecord._id = trJson.getString("_id");
|
||||
newRecord.setTimeIndex(newRecord.getTimeIndex());
|
||||
daoTempTargets.createIfNotExists(newRecord);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Adding TempTarget record to database: " + newRecord.log());
|
||||
MainApp.bus().post(new EventTempTargetRangeChange());
|
||||
} else if (list.size() == 1) {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Updating TempTarget record in database: " + trJson.getString("_id"));
|
||||
TempTarget record = list.get(0);
|
||||
record.timeStart = new Date(trJson.getLong("mills"));
|
||||
record.duration = trJson.getInt("duration");
|
||||
record.low = NSProfile.toMgdl(trJson.getDouble("targetBottom"), units);
|
||||
record.high = NSProfile.toMgdl(trJson.getDouble("targetTop"), units);
|
||||
record.reason = trJson.getString("reason");
|
||||
record._id = trJson.getString("_id");
|
||||
daoTempTargets.update(record);
|
||||
MainApp.bus().post(new EventTempTargetRangeChange());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void handleRemoveTempTargetRecord(JSONObject trJson) throws JSONException, SQLException {
|
||||
if (trJson.has("_id")) {
|
||||
Dao<TempTarget, Long> daoTempTargets = MainApp.getDbHelper().getDaoTempTargets();
|
||||
QueryBuilder<TempTarget, Long> queryBuilder = daoTempTargets.queryBuilder();
|
||||
Where where = queryBuilder.where();
|
||||
where.eq("_id", trJson.getString("_id"));
|
||||
PreparedQuery<TempTarget> preparedQuery = queryBuilder.prepare();
|
||||
List<TempTarget> list = daoTempTargets.query(preparedQuery);
|
||||
|
||||
if (list.size() == 1) {
|
||||
TempTarget record = list.get(0);
|
||||
if (Config.logIncommingData)
|
||||
log.debug("Removing TempTarget record from database: " + record.log());
|
||||
daoTempTargets.delete(record);
|
||||
MainApp.bus().post(new EventTempTargetRangeChange());
|
||||
} else {
|
||||
if (Config.logIncommingData)
|
||||
log.debug("TempTarget not found database: " + trJson.toString());
|
||||
}
|
||||
public void handleAddChangeProfileSwitchRecord(JSONObject trJson) throws JSONException {
|
||||
if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.PROFILESWITCH)) {
|
||||
MainApp.getDbHelper().createProfileSwitchFromJsonIfNotExists(trJson);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
package info.nightscout.androidaps.data;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.db.CareportalEvent;
|
||||
import info.nightscout.androidaps.db.Source;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
|
||||
/**
|
||||
* Created by mike on 29.05.2017.
|
||||
*/
|
||||
|
||||
public class DetailedBolusInfo {
|
||||
public long date = new Date().getTime();
|
||||
public InsulinInterface insulinInterface = MainApp.getConfigBuilder().getActiveInsulin();
|
||||
public String eventType = CareportalEvent.MEALBOLUS;
|
||||
public double insulin = 0;
|
||||
public double carbs = 0;
|
||||
public int source = Source.NONE;
|
||||
public double glucose = 0; // Bg value in current units
|
||||
public String glucoseType = ""; // NS values: Manual, Finger, Sensor
|
||||
public int carbTime = 0; // time shift of carbs in minutes
|
||||
public JSONObject boluscalc = null; // additional bolus wizard info
|
||||
public Context context = null; // context for progress dialog
|
||||
public boolean addToTreatments = true;
|
||||
public long pumpId = 0; // id of record if comming from pump history (not a newly created treatment)
|
||||
}
|
|
@ -66,19 +66,17 @@ public class GlucoseStatus {
|
|||
|
||||
@Nullable
|
||||
public static GlucoseStatus getGlucoseStatusData() {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainApp.instance());
|
||||
|
||||
// load 45min
|
||||
long fromtime = (long) (new Date().getTime() - 60 * 1000L * 45);
|
||||
List<BgReading> data = MainApp.getDbHelper().getBgreadingsDataFromTime(fromtime, false);
|
||||
|
||||
int sizeRecords = data.size();
|
||||
if (sizeRecords < 1 || data.get(0).timeIndex < new Date().getTime() - 7 * 60 * 1000L) {
|
||||
if (sizeRecords < 1 || data.get(0).date < new Date().getTime() - 7 * 60 * 1000L) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BgReading now = data.get(0);
|
||||
long now_date = now.timeIndex;
|
||||
long now_date = now.date;
|
||||
double change;
|
||||
|
||||
if (sizeRecords < 2) {
|
||||
|
@ -98,7 +96,7 @@ public class GlucoseStatus {
|
|||
for (int i = 1; i < data.size(); i++) {
|
||||
if (data.get(i).value > 38) {
|
||||
BgReading then = data.get(i);
|
||||
long then_date = then.timeIndex;
|
||||
long then_date = then.date;
|
||||
double avgdelta = 0;
|
||||
long minutesago;
|
||||
|
||||
|
@ -131,7 +129,7 @@ public class GlucoseStatus {
|
|||
|
||||
status.short_avgdelta = average(short_deltas);
|
||||
|
||||
if (prefs.getBoolean("always_use_shortavg", false) || last_deltas.isEmpty()) {
|
||||
if (last_deltas.isEmpty()) {
|
||||
status.delta = status.short_avgdelta;
|
||||
} else {
|
||||
status.delta = average(last_deltas);
|
||||
|
@ -143,48 +141,6 @@ public class GlucoseStatus {
|
|||
return status.round();
|
||||
}
|
||||
|
||||
/*
|
||||
* Return last BgReading from database or null if db is empty
|
||||
*/
|
||||
@Nullable
|
||||
public static BgReading lastBg() {
|
||||
List<BgReading> bgList = null;
|
||||
|
||||
try {
|
||||
Dao<BgReading, Long> daoBgReadings = MainApp.getDbHelper().getDaoBgReadings();
|
||||
QueryBuilder<BgReading, Long> queryBuilder = daoBgReadings.queryBuilder();
|
||||
queryBuilder.orderBy("timeIndex", false);
|
||||
queryBuilder.limit(1L);
|
||||
queryBuilder.where().gt("value", 38);
|
||||
PreparedQuery<BgReading> preparedQuery = queryBuilder.prepare();
|
||||
bgList = daoBgReadings.query(preparedQuery);
|
||||
|
||||
} catch (SQLException e) {
|
||||
log.debug(e.getMessage(), e);
|
||||
}
|
||||
if (bgList != null && bgList.size() > 0)
|
||||
return bgList.get(0);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return bg reading if not old ( <9 min )
|
||||
* or null if older
|
||||
*/
|
||||
@Nullable
|
||||
public static BgReading actualBg() {
|
||||
BgReading lastBg = lastBg();
|
||||
|
||||
if (lastBg == null)
|
||||
return null;
|
||||
|
||||
if (lastBg.timeIndex > new Date().getTime() - 9 * 60 * 1000)
|
||||
return lastBg;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static double average(ArrayList<Double> array) {
|
||||
double sum = 0d;
|
||||
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
package info.nightscout.androidaps.data;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.Round;
|
||||
|
||||
|
@ -20,7 +17,9 @@ public class IobTotal {
|
|||
public Double hightempinsulin;
|
||||
|
||||
public Double netInsulin = 0d; // for calculations from temp basals only
|
||||
public Double netRatio = 0d; // for calculations from temp basals only
|
||||
public Double netRatio = 0d; // net ratio at start of temp basal
|
||||
|
||||
public Double extendedBolusInsulin = 0d; // total insulin for extended bolus
|
||||
|
||||
long time;
|
||||
|
||||
|
@ -42,7 +41,7 @@ public class IobTotal {
|
|||
netbasalinsulin += other.netbasalinsulin;
|
||||
hightempinsulin += other.hightempinsulin;
|
||||
netInsulin += other.netInsulin;
|
||||
netRatio += other.netRatio;
|
||||
extendedBolusInsulin += other.extendedBolusInsulin;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -94,43 +93,4 @@ public class IobTotal {
|
|||
return json;
|
||||
}
|
||||
|
||||
public static IobTotal calulateFromTreatmentsAndTemps() {
|
||||
ConfigBuilderPlugin.getActiveTreatments().updateTotalIOB();
|
||||
IobTotal bolusIob = ConfigBuilderPlugin.getActiveTreatments().getLastCalculation().round();
|
||||
ConfigBuilderPlugin.getActiveTempBasals().updateTotalIOB();
|
||||
IobTotal basalIob = ConfigBuilderPlugin.getActiveTempBasals().getLastCalculation().round();
|
||||
IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round();
|
||||
return iobTotal;
|
||||
}
|
||||
|
||||
public static IobTotal calulateFromTreatmentsAndTemps(long time) {
|
||||
IobTotal bolusIob = ConfigBuilderPlugin.getActiveTreatments().getCalculationToTime(time).round();
|
||||
IobTotal basalIob = ConfigBuilderPlugin.getActiveTempBasals().getCalculationToTime(time).round();
|
||||
IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round();
|
||||
return iobTotal;
|
||||
}
|
||||
|
||||
public static IobTotal[] calculateIobArrayInDia() {
|
||||
NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile();
|
||||
// predict IOB out to DIA plus 30m
|
||||
long time = new Date().getTime();
|
||||
int len = (int) ((profile.getDia() *60 + 30) / 5);
|
||||
IobTotal[] array = new IobTotal[len];
|
||||
int pos = 0;
|
||||
for (int i = 0; i < len; i++){
|
||||
long t = time + i * 5 * 60000;
|
||||
IobTotal iob = calulateFromTreatmentsAndTemps(t);
|
||||
array[pos] = iob;
|
||||
pos++;
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
public static JSONArray convertToJSONArray(IobTotal[] iobArray) {
|
||||
JSONArray array = new JSONArray();
|
||||
for (int i = 0; i < iobArray.length; i ++) {
|
||||
array.put(iobArray[i].determineBasalJson());
|
||||
}
|
||||
return array;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,17 +1,5 @@
|
|||
package info.nightscout.androidaps.data;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.db.BgReading;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.plugins.OpenAPSAMA.Autosens;
|
||||
import info.nightscout.androidaps.plugins.OpenAPSAMA.AutosensResult;
|
||||
import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
|
||||
/**
|
||||
* Created by mike on 04.01.2017.
|
||||
*/
|
||||
|
@ -19,30 +7,4 @@ public class MealData {
|
|||
public double boluses = 0d;
|
||||
public double carbs = 0d;
|
||||
public double mealCOB = 0.0d;
|
||||
|
||||
|
||||
public void addTreatment(Treatment treatment) {
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
if (profile == null) return;
|
||||
|
||||
List<BgReading> bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (new Date().getTime() - 60 * 60 * 1000L * profile.getDia() * 2), false);
|
||||
|
||||
long now = new Date().getTime();
|
||||
long dia_ago = now - (new Double(1.5d * profile.getDia() * 60 * 60 * 1000l)).longValue();
|
||||
long t = treatment.created_at.getTime();
|
||||
if (t > dia_ago && t <= now) {
|
||||
if (treatment.carbs >= 1) {
|
||||
carbs += treatment.carbs;
|
||||
if (MainApp.getSpecificPlugin(OpenAPSAMAPlugin.class).isEnabled(PluginBase.APS)) {
|
||||
AutosensResult result = Autosens.detectSensitivityandCarbAbsorption(bgReadings, t);
|
||||
double myCarbsAbsorbed = result.carbsAbsorbed;
|
||||
double myMealCOB = Math.max(0, carbs - myCarbsAbsorbed);
|
||||
mealCOB = Math.max(mealCOB, myMealCOB);
|
||||
}
|
||||
}
|
||||
if (treatment.insulin > 0 && treatment.mealBolus) {
|
||||
boluses += treatment.insulin;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
package info.nightscout.androidaps.data;
|
||||
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.util.LongSparseArray;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.interfaces.Interval;
|
||||
|
||||
/**
|
||||
* Created by mike on 09.05.2017.
|
||||
*/
|
||||
|
||||
// Zero duration means end of interval
|
||||
|
||||
public class OverlappingIntervals<T extends Interval> {
|
||||
|
||||
private LongSparseArray<T> rawData = new LongSparseArray<>(); // oldest at index 0
|
||||
|
||||
public OverlappingIntervals reset() {
|
||||
rawData = new LongSparseArray<>();
|
||||
return this;
|
||||
}
|
||||
|
||||
public void add(T newInterval) {
|
||||
rawData.put(newInterval.start(), newInterval);
|
||||
merge();
|
||||
}
|
||||
|
||||
public void add(List<T> list) {
|
||||
for (T interval : list) {
|
||||
rawData.put(interval.start(), interval);
|
||||
}
|
||||
merge();
|
||||
}
|
||||
|
||||
private void merge() {
|
||||
for (int index = 0; index < rawData.size() - 1; index++) {
|
||||
Interval i = rawData.valueAt(index);
|
||||
long startOfNewer = rawData.valueAt(index + 1).start();
|
||||
if (i.originalEnd() > startOfNewer) {
|
||||
i.cutEndTo(startOfNewer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Interval getValueByInterval(long time) {
|
||||
int index = binarySearch(time);
|
||||
if (index >= 0) return rawData.valueAt(index);
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<T> getList() {
|
||||
List<T> list = new ArrayList<>();
|
||||
for (int i = 0; i < rawData.size(); i++)
|
||||
list.add(rawData.valueAt(i));
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<T> getReversedList() {
|
||||
List<T> list = new ArrayList<>();
|
||||
for (int i = rawData.size() -1; i>=0; i--)
|
||||
list.add(rawData.valueAt(i));
|
||||
return list;
|
||||
}
|
||||
|
||||
private int binarySearch(long value) {
|
||||
int lo = 0;
|
||||
int hi = rawData.size() - 1;
|
||||
|
||||
while (lo <= hi) {
|
||||
final int mid = (lo + hi) >>> 1;
|
||||
final Interval midVal = rawData.valueAt(mid);
|
||||
|
||||
if (midVal.before(value)) {
|
||||
lo = mid + 1;
|
||||
} else if (midVal.after(value)) {
|
||||
hi = mid - 1;
|
||||
} else if (midVal.match(value)) {
|
||||
return mid; // value found
|
||||
}
|
||||
}
|
||||
return ~lo; // value not present
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return rawData.size();
|
||||
}
|
||||
|
||||
public T get(int index) {
|
||||
return rawData.valueAt(index);
|
||||
}
|
||||
|
||||
public T getReversed(int index) {
|
||||
return rawData.valueAt(size() - 1 - index);
|
||||
}
|
||||
}
|
347
app/src/main/java/info/nightscout/androidaps/data/Profile.java
Normal file
347
app/src/main/java/info/nightscout/androidaps/data/Profile.java
Normal file
|
@ -0,0 +1,347 @@
|
|||
package info.nightscout.androidaps.data;
|
||||
|
||||
import com.crashlytics.android.Crashlytics;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.Overview.Notification;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
import info.nightscout.utils.ToastUtils;
|
||||
|
||||
public class Profile {
|
||||
private static Logger log = LoggerFactory.getLogger(Profile.class);
|
||||
|
||||
private JSONObject json;
|
||||
private String units = null;
|
||||
double dia = Constants.defaultDIA;
|
||||
TimeZone timeZone = TimeZone.getDefault();
|
||||
JSONArray isf;
|
||||
JSONArray ic;
|
||||
JSONArray basal;
|
||||
JSONArray targetLow;
|
||||
JSONArray targetHigh;
|
||||
|
||||
public Profile(JSONObject json, String units) {
|
||||
this(json);
|
||||
if (this.units == null) {
|
||||
if (units != null)
|
||||
this.units = units;
|
||||
else {
|
||||
Crashlytics.log("Profile failover failed too");
|
||||
this.units = Constants.MGDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Profile(JSONObject json) {
|
||||
this.json = json;
|
||||
try {
|
||||
if (json.has("units"))
|
||||
units = json.getString("units").toLowerCase();
|
||||
if (json.has("dia"))
|
||||
dia = json.getDouble("dia");
|
||||
if (json.has("dia"))
|
||||
dia = json.getDouble("dia");
|
||||
if (json.has("timezone"))
|
||||
timeZone = TimeZone.getTimeZone(json.getString("timezone"));
|
||||
isf = json.getJSONArray("sens");
|
||||
if (getIsf(0) == null) {
|
||||
int defaultISF = units.equals(Constants.MGDL) ? 400 : 20;
|
||||
isf = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultISF + "\",\"timeAsSeconds\":\"0\"}]");
|
||||
Notification noisf = new Notification(Notification.ISF_MISSING, MainApp.sResources.getString(R.string.isfmissing), Notification.URGENT);
|
||||
MainApp.bus().post(new EventNewNotification(noisf));
|
||||
} else {
|
||||
MainApp.bus().post(new EventDismissNotification(Notification.ISF_MISSING));
|
||||
}
|
||||
ic = json.getJSONArray("carbratio");
|
||||
if (getIc(0) == null) {
|
||||
int defaultIC = 25;
|
||||
isf = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultIC + "\",\"timeAsSeconds\":\"0\"}]");
|
||||
Notification noic = new Notification(Notification.IC_MISSING, MainApp.sResources.getString(R.string.icmissing), Notification.URGENT);
|
||||
MainApp.bus().post(new EventNewNotification(noic));
|
||||
} else {
|
||||
MainApp.bus().post(new EventDismissNotification(Notification.IC_MISSING));
|
||||
}
|
||||
basal = json.getJSONArray("basal");
|
||||
if (getBasal(0) == null) {
|
||||
double defaultBasal = 0.1d;
|
||||
isf = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultBasal + "\",\"timeAsSeconds\":\"0\"}]");
|
||||
Notification nobasal = new Notification(Notification.BASAL_MISSING, MainApp.sResources.getString(R.string.basalmissing), Notification.URGENT);
|
||||
MainApp.bus().post(new EventNewNotification(nobasal));
|
||||
} else {
|
||||
MainApp.bus().post(new EventDismissNotification(Notification.BASAL_MISSING));
|
||||
}
|
||||
targetLow = json.getJSONArray("target_low");
|
||||
if (getTargetLow(0) == null) {
|
||||
double defaultLow = units.equals(Constants.MGDL) ? 120 : 6;
|
||||
isf = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultLow + "\",\"timeAsSeconds\":\"0\"}]");
|
||||
Notification notarget = new Notification(Notification.TARGET_MISSING, MainApp.sResources.getString(R.string.targetmissing), Notification.URGENT);
|
||||
MainApp.bus().post(new EventNewNotification(notarget));
|
||||
} else {
|
||||
MainApp.bus().post(new EventDismissNotification(Notification.TARGET_MISSING));
|
||||
}
|
||||
targetHigh = json.getJSONArray("target_high");
|
||||
if (getTargetHigh(0) == null) {
|
||||
double defaultHigh = units.equals(Constants.MGDL) ? 160 : 8;
|
||||
isf = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultHigh + "\",\"timeAsSeconds\":\"0\"}]");
|
||||
Notification notarget = new Notification(Notification.TARGET_MISSING, MainApp.sResources.getString(R.string.targetmissing), Notification.URGENT);
|
||||
MainApp.bus().post(new EventNewNotification(notarget));
|
||||
} else {
|
||||
MainApp.bus().post(new EventDismissNotification(Notification.TARGET_MISSING));
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.invalidprofile));
|
||||
}
|
||||
}
|
||||
|
||||
public String log() {
|
||||
String ret = "\n";
|
||||
for (Integer hour = 0; hour < 24; hour++) {
|
||||
double value = getBasal(hour * 60 * 60);
|
||||
ret += "NS basal value for " + hour + ":00 is " + value + "\n";
|
||||
}
|
||||
ret += "NS units: " + getUnits();
|
||||
return ret;
|
||||
}
|
||||
|
||||
public JSONObject getData() {
|
||||
return json;
|
||||
}
|
||||
|
||||
public Double getDia() {
|
||||
return dia;
|
||||
}
|
||||
|
||||
// mmol or mg/dl
|
||||
public String getUnits() {
|
||||
return units;
|
||||
}
|
||||
|
||||
public TimeZone getTimeZone() {
|
||||
return timeZone;
|
||||
}
|
||||
|
||||
private Double getValueToTime(JSONArray array, Integer timeAsSeconds) {
|
||||
Double lastValue = null;
|
||||
|
||||
for (Integer index = 0; index < array.length(); index++) {
|
||||
try {
|
||||
JSONObject o = array.getJSONObject(index);
|
||||
Integer tas = o.getInt("timeAsSeconds");
|
||||
Double value = o.getDouble("value");
|
||||
if (lastValue == null) lastValue = value;
|
||||
if (timeAsSeconds < tas) {
|
||||
break;
|
||||
}
|
||||
lastValue = value;
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return lastValue;
|
||||
}
|
||||
|
||||
private String getValuesList(JSONArray array, JSONArray array2, DecimalFormat format, String units) {
|
||||
String retValue = "";
|
||||
|
||||
for (Integer index = 0; index < array.length(); index++) {
|
||||
try {
|
||||
JSONObject o = array.getJSONObject(index);
|
||||
retValue += o.getString("time");
|
||||
retValue += " ";
|
||||
retValue += format.format(o.getDouble("value"));
|
||||
if (array2 != null) {
|
||||
JSONObject o2 = array2.getJSONObject(index);
|
||||
retValue += " - ";
|
||||
retValue += format.format(o2.getDouble("value"));
|
||||
}
|
||||
retValue += " " + units;
|
||||
retValue += "\n";
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return retValue;
|
||||
}
|
||||
|
||||
public Double getIsf() {
|
||||
return getIsf(secondsFromMidnight(new Date().getTime()));
|
||||
}
|
||||
|
||||
public Double getIsf(long time) {
|
||||
return getIsf(secondsFromMidnight(time));
|
||||
}
|
||||
|
||||
public Double getIsf(Integer timeAsSeconds) {
|
||||
return getValueToTime(isf, timeAsSeconds);
|
||||
}
|
||||
|
||||
public String getIsfList() {
|
||||
return getValuesList(isf, null, new DecimalFormat("0.0"), getUnits() + "/U");
|
||||
}
|
||||
|
||||
public Double getIc() {
|
||||
return getIc(secondsFromMidnight(new Date().getTime()));
|
||||
}
|
||||
|
||||
public Double getIc(long time) {
|
||||
return getIc(secondsFromMidnight(time));
|
||||
}
|
||||
|
||||
public Double getIc(Integer timeAsSeconds) {
|
||||
return getValueToTime(ic, timeAsSeconds);
|
||||
}
|
||||
|
||||
public String getIcList() {
|
||||
return getValuesList(ic, null, new DecimalFormat("0.0"), getUnits() + "/U");
|
||||
}
|
||||
|
||||
public Double getBasal() {
|
||||
return getBasal(secondsFromMidnight(new Date().getTime()));
|
||||
}
|
||||
|
||||
public Double getBasal(long time) {
|
||||
return getBasal(secondsFromMidnight(time));
|
||||
}
|
||||
|
||||
public Double getBasal(Integer timeAsSeconds) {
|
||||
return getValueToTime(basal, timeAsSeconds);
|
||||
}
|
||||
|
||||
public String getBasalList() {
|
||||
return getValuesList(basal, null, new DecimalFormat("0.00"), "U");
|
||||
}
|
||||
|
||||
public class BasalValue {
|
||||
public BasalValue(Integer timeAsSeconds, Double value) {
|
||||
this.timeAsSeconds = timeAsSeconds;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public Integer timeAsSeconds;
|
||||
public Double value;
|
||||
}
|
||||
|
||||
public BasalValue[] getBasalValues() {
|
||||
try {
|
||||
BasalValue[] ret = new BasalValue[basal.length()];
|
||||
|
||||
for (Integer index = 0; index < basal.length(); index++) {
|
||||
JSONObject o = basal.getJSONObject(index);
|
||||
Integer tas = o.getInt("timeAsSeconds");
|
||||
Double value = o.getDouble("value");
|
||||
ret[index] = new BasalValue(tas, value);
|
||||
}
|
||||
return ret;
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return new BasalValue[0];
|
||||
}
|
||||
|
||||
public Double getTargetLow() {
|
||||
return getTargetLow(secondsFromMidnight(new Date().getTime()));
|
||||
}
|
||||
|
||||
public Double getTargetLow(long time) {
|
||||
return getTargetLow(secondsFromMidnight(time));
|
||||
}
|
||||
|
||||
public Double getTargetLow(Integer timeAsSeconds) {
|
||||
return getValueToTime(targetLow, timeAsSeconds);
|
||||
}
|
||||
|
||||
public Double getTargetHigh() {
|
||||
return getTargetHigh(secondsFromMidnight(new Date().getTime()));
|
||||
}
|
||||
|
||||
public Double getTargetHigh(long time) {
|
||||
return getTargetHigh(secondsFromMidnight(time));
|
||||
}
|
||||
|
||||
public Double getTargetHigh(Integer timeAsSeconds) {
|
||||
return getValueToTime(targetHigh, timeAsSeconds);
|
||||
}
|
||||
|
||||
public String getTargetList() {
|
||||
return getValuesList(targetLow, targetHigh, new DecimalFormat("0.0"), getUnits());
|
||||
}
|
||||
|
||||
public double getMaxDailyBasal() {
|
||||
Double max = 0d;
|
||||
for (Integer hour = 0; hour < 24; hour++) {
|
||||
double value = getBasal(hour * 60 * 60);
|
||||
if (value > max) max = value;
|
||||
}
|
||||
return max;
|
||||
}
|
||||
|
||||
public static Integer secondsFromMidnight() {
|
||||
Calendar c = Calendar.getInstance();
|
||||
long now = c.getTimeInMillis();
|
||||
c.set(Calendar.HOUR_OF_DAY, 0);
|
||||
c.set(Calendar.MINUTE, 0);
|
||||
c.set(Calendar.SECOND, 0);
|
||||
c.set(Calendar.MILLISECOND, 0);
|
||||
long passed = now - c.getTimeInMillis();
|
||||
return (int) (passed / 1000);
|
||||
}
|
||||
|
||||
public static Integer secondsFromMidnight(Date date) {
|
||||
Calendar c = Calendar.getInstance();
|
||||
long now = date.getTime();
|
||||
c.setTime(date);
|
||||
c.set(Calendar.HOUR_OF_DAY, 0);
|
||||
c.set(Calendar.MINUTE, 0);
|
||||
c.set(Calendar.SECOND, 0);
|
||||
c.set(Calendar.MILLISECOND, 0);
|
||||
long passed = now - c.getTimeInMillis();
|
||||
return (int) (passed / 1000);
|
||||
}
|
||||
|
||||
public static Integer secondsFromMidnight(long date) {
|
||||
Calendar c = Calendar.getInstance();
|
||||
c.setTimeInMillis(date);
|
||||
c.set(Calendar.HOUR_OF_DAY, 0);
|
||||
c.set(Calendar.MINUTE, 0);
|
||||
c.set(Calendar.SECOND, 0);
|
||||
c.set(Calendar.MILLISECOND, 0);
|
||||
long passed = date - c.getTimeInMillis();
|
||||
return (int) (passed / 1000);
|
||||
}
|
||||
|
||||
public static Double toMgdl(Double value, String units) {
|
||||
if (units.equals(Constants.MGDL)) return value;
|
||||
else return value * Constants.MMOLL_TO_MGDL;
|
||||
}
|
||||
|
||||
public static Double fromMgdlToUnits(Double value, String units) {
|
||||
if (units.equals(Constants.MGDL)) return value;
|
||||
else return value * Constants.MGDL_TO_MMOLL;
|
||||
}
|
||||
|
||||
public static Double toUnits(Double valueInMgdl, Double valueInMmol, String units) {
|
||||
if (units.equals(Constants.MGDL)) return valueInMgdl;
|
||||
else return valueInMmol;
|
||||
}
|
||||
|
||||
public static String toUnitsString(Double valueInMgdl, Double valueInMmol, String units) {
|
||||
if (units.equals(Constants.MGDL)) return DecimalFormatter.to0Decimal(valueInMgdl);
|
||||
else return DecimalFormatter.to1Decimal(valueInMmol);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
package info.nightscout.androidaps.data;
|
||||
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.util.LongSparseArray;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.interfaces.Interval;
|
||||
|
||||
/**
|
||||
* Created by mike on 09.05.2017.
|
||||
*/
|
||||
|
||||
// Zero duration means profile is valid until is chaged
|
||||
// When no interval match the lastest record without duration is used
|
||||
|
||||
public class ProfileIntervals<T extends Interval> {
|
||||
|
||||
private LongSparseArray<T> rawData = new LongSparseArray<>(); // oldest at index 0
|
||||
|
||||
public ProfileIntervals reset() {
|
||||
rawData = new LongSparseArray<>();
|
||||
return this;
|
||||
}
|
||||
|
||||
public void add(T newInterval) {
|
||||
rawData.put(newInterval.start(), newInterval);
|
||||
merge();
|
||||
}
|
||||
|
||||
public void add(List<T> list) {
|
||||
for (T interval : list) {
|
||||
rawData.put(interval.start(), interval);
|
||||
}
|
||||
merge();
|
||||
}
|
||||
|
||||
private void merge() {
|
||||
for (int index = 0; index < rawData.size() - 1; index++) {
|
||||
Interval i = rawData.valueAt(index);
|
||||
long startOfNewer = rawData.valueAt(index + 1).start();
|
||||
if (i.originalEnd() > startOfNewer) {
|
||||
i.cutEndTo(startOfNewer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Interval getValueToTime(long time) {
|
||||
int index = binarySearch(time);
|
||||
if (index >= 0) return rawData.valueAt(index);
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<T> getList() {
|
||||
List<T> list = new ArrayList<>();
|
||||
for (int i = 0; i < rawData.size(); i++)
|
||||
list.add(rawData.valueAt(i));
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<T> getReversedList() {
|
||||
List<T> list = new ArrayList<>();
|
||||
for (int i = rawData.size() -1; i>=0; i--)
|
||||
list.add(rawData.valueAt(i));
|
||||
return list;
|
||||
}
|
||||
|
||||
private int binarySearch(long value) {
|
||||
if (rawData.size() == 0)
|
||||
return -1;
|
||||
int lo = 0;
|
||||
int hi = rawData.size() - 1;
|
||||
|
||||
while (lo <= hi) {
|
||||
final int mid = (lo + hi) >>> 1;
|
||||
final Interval midVal = rawData.valueAt(mid);
|
||||
|
||||
if (midVal.match(value)) {
|
||||
return mid; // value found
|
||||
} else if (midVal.before(value)) {
|
||||
lo = mid + 1;
|
||||
} else if (midVal.after(value)) {
|
||||
hi = mid - 1;
|
||||
}
|
||||
}
|
||||
// not found, try nearest older with duration 0
|
||||
lo = lo - 1;
|
||||
while (lo >= 0 && lo < rawData.size()) {
|
||||
if (rawData.valueAt(lo).isEndingEvent())
|
||||
return lo;
|
||||
lo--;
|
||||
}
|
||||
return -1; // value not present
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return rawData.size();
|
||||
}
|
||||
|
||||
public T get(int index) {
|
||||
return rawData.valueAt(index);
|
||||
}
|
||||
|
||||
public T getReversed(int index) {
|
||||
return rawData.valueAt(size() - 1 - index);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,99 @@
|
|||
package info.nightscout.androidaps.data;
|
||||
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* Created by mike on 01.06.2017.
|
||||
*/
|
||||
|
||||
public class ProfileStore {
|
||||
private static Logger log = LoggerFactory.getLogger(ProfileStore.class);
|
||||
private JSONObject json = null;
|
||||
|
||||
public ProfileStore(JSONObject json) {
|
||||
this.json = json;
|
||||
}
|
||||
|
||||
public JSONObject getData() {
|
||||
return json;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Profile getDefaultProfile() {
|
||||
Profile profile = null;
|
||||
try {
|
||||
String defaultProfileName = json.getString("defaultProfile");
|
||||
JSONObject store = json.getJSONObject("store");
|
||||
if (store.has(defaultProfileName)) {
|
||||
String units = null;
|
||||
if (store.has("units"))
|
||||
units = store.getString("units");
|
||||
profile = new Profile(store.getJSONObject(defaultProfileName), units);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return profile;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getDefaultProfileName() {
|
||||
String defaultProfileName = null;
|
||||
try {
|
||||
defaultProfileName = json.getString("defaultProfile");
|
||||
JSONObject store = json.getJSONObject("store");
|
||||
if (store.has(defaultProfileName)) {
|
||||
return defaultProfileName;
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return defaultProfileName;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Profile getSpecificProfile(String profileName) {
|
||||
Profile profile = null;
|
||||
try {
|
||||
JSONObject store = json.getJSONObject("store");
|
||||
if (store.has(profileName)) {
|
||||
String units = null;
|
||||
if (json.has("units"))
|
||||
units = json.getString("units");
|
||||
profile = new Profile(store.getJSONObject(profileName), units);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return profile;
|
||||
}
|
||||
|
||||
public ArrayList<CharSequence> getProfileList() {
|
||||
ArrayList<CharSequence> ret = new ArrayList<CharSequence>();
|
||||
|
||||
JSONObject store;
|
||||
try {
|
||||
store = json.getJSONObject("store");
|
||||
Iterator<?> keys = store.keys();
|
||||
|
||||
while (keys.hasNext()) {
|
||||
String profileName = (String) keys.next();
|
||||
ret.add(profileName);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -8,7 +8,6 @@ import org.json.JSONObject;
|
|||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
import info.nightscout.utils.Round;
|
||||
|
||||
|
@ -25,7 +24,7 @@ public class PumpEnactResult extends Object {
|
|||
public boolean isTempCancel = false; // if true we are caceling temp basal
|
||||
// Result of treatment delivery
|
||||
public Double bolusDelivered = 0d; // real value of delivered insulin
|
||||
public Integer carbsDelivered = 0; // real value of delivered carbs
|
||||
public Double carbsDelivered = 0d; // real value of delivered carbs
|
||||
|
||||
public boolean queued = false;
|
||||
|
||||
|
@ -94,7 +93,7 @@ public class PumpEnactResult extends Object {
|
|||
result.put("duration", 0);
|
||||
} else if (isPercent) {
|
||||
// Nightscout is expecting absolute value
|
||||
Double abs = Round.roundTo(MainApp.getConfigBuilder().getActiveProfile().getProfile().getBasal(NSProfile.secondsFromMidnight()) * percent / 100, 0.01);
|
||||
Double abs = Round.roundTo(MainApp.getConfigBuilder().getProfile().getBasal() * percent / 100, 0.01);
|
||||
result.put("rate", abs);
|
||||
result.put("duration", duration);
|
||||
} else {
|
||||
|
|
|
@ -2,50 +2,54 @@ package info.nightscout.androidaps.db;
|
|||
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
import com.jjoe64.graphview.series.DataPointInterface;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv;
|
||||
import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_BGREADINGS)
|
||||
public class BgReading implements DataPointInterface {
|
||||
public class BgReading implements DataPointWithLabelInterface {
|
||||
private static Logger log = LoggerFactory.getLogger(BgReading.class);
|
||||
|
||||
public long getTimeIndex() {
|
||||
return timeIndex;
|
||||
}
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
||||
public void setTimeIndex(long timeIndex) {
|
||||
this.timeIndex = timeIndex;
|
||||
}
|
||||
|
||||
@DatabaseField(id = true, useGetSet = true)
|
||||
public long timeIndex;
|
||||
@DatabaseField
|
||||
public boolean isValid = true;
|
||||
|
||||
@DatabaseField
|
||||
public double value;
|
||||
|
||||
@DatabaseField
|
||||
public String direction;
|
||||
|
||||
@DatabaseField
|
||||
public double raw;
|
||||
|
||||
@DatabaseField
|
||||
public int battery_level;
|
||||
public int source = Source.NONE;
|
||||
@DatabaseField
|
||||
public String _id = null; // NS _id
|
||||
|
||||
public static String units = Constants.MGDL;
|
||||
public boolean isPrediction = false; // true when drawing predictions as bg points
|
||||
|
||||
public BgReading() {}
|
||||
public BgReading() {
|
||||
}
|
||||
|
||||
public BgReading(NSSgv sgv) {
|
||||
timeIndex = sgv.getMills();
|
||||
date = sgv.getMills();
|
||||
value = sgv.getMgdl();
|
||||
raw = sgv.getFiltered() != null ? sgv.getFiltered() : value;
|
||||
direction = sgv.getDirection();
|
||||
|
@ -63,7 +67,7 @@ public class BgReading implements DataPointInterface {
|
|||
else return DecimalFormatter.to1Decimal(value * Constants.MGDL_TO_MMOLL);
|
||||
}
|
||||
|
||||
public String directionToSymbol() {
|
||||
public String directionToSymbol() {
|
||||
String symbol = "";
|
||||
if (direction.compareTo("DoubleDown") == 0) {
|
||||
symbol = "\u21ca";
|
||||
|
@ -101,23 +105,108 @@ public class BgReading implements DataPointInterface {
|
|||
@Override
|
||||
public String toString() {
|
||||
return "BgReading{" +
|
||||
"timeIndex=" + timeIndex +
|
||||
", date=" + new Date(timeIndex) +
|
||||
"date=" + date +
|
||||
", date=" + new Date(date).toLocaleString() +
|
||||
", value=" + value +
|
||||
", direction=" + direction +
|
||||
", raw=" + raw +
|
||||
", battery_level=" + battery_level +
|
||||
'}';
|
||||
}
|
||||
|
||||
public boolean isDataChanging(BgReading other) {
|
||||
if (date != other.date) {
|
||||
log.error("Comparing different");
|
||||
return false;
|
||||
}
|
||||
if (value != other.value)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isEqual(BgReading other) {
|
||||
if (date != other.date) {
|
||||
log.error("Comparing different");
|
||||
return false;
|
||||
}
|
||||
if (value != other.value)
|
||||
return false;
|
||||
if (raw != other.raw)
|
||||
return false;
|
||||
if (!direction.equals(other.direction))
|
||||
return false;
|
||||
if (!Objects.equals(_id, other._id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void copyFrom(BgReading other) {
|
||||
if (date != other.date) {
|
||||
log.error("Copying different");
|
||||
return;
|
||||
}
|
||||
value = other.value;
|
||||
raw = other.raw;
|
||||
direction = other.direction;
|
||||
_id = other._id;
|
||||
}
|
||||
|
||||
// ------------------ DataPointWithLabelInterface ------------------
|
||||
@Override
|
||||
public double getX() {
|
||||
return timeIndex;
|
||||
return date;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getY() {
|
||||
String units = MainApp.getConfigBuilder().getProfile().getUnits();
|
||||
return valueToUnits(units);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setY(double y) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLabel() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDuration() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PointsWithLabelGraphSeries.Shape getShape() {
|
||||
return PointsWithLabelGraphSeries.Shape.POINT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSize() {
|
||||
boolean isTablet = MainApp.sResources.getBoolean(R.bool.isTablet);
|
||||
return isTablet ? 8 : 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColor() {
|
||||
String units = MainApp.getConfigBuilder().getProfile().getUnits();
|
||||
Double lowLine = SP.getDouble("low_mark", 0d);
|
||||
Double highLine = SP.getDouble("high_mark", 0d);
|
||||
if (lowLine < 1) {
|
||||
lowLine = Profile.fromMgdlToUnits(OverviewPlugin.bgTargetLow, units);
|
||||
}
|
||||
if (highLine < 1) {
|
||||
highLine = Profile.fromMgdlToUnits(OverviewPlugin.bgTargetHigh, units);
|
||||
}
|
||||
int color = MainApp.sResources.getColor(R.color.inrange);
|
||||
if (isPrediction)
|
||||
color = MainApp.sResources.getColor(R.color.prediction);
|
||||
else if (valueToUnits(units) < lowLine)
|
||||
color = MainApp.sResources.getColor(R.color.low);
|
||||
else if (valueToUnits(units) > highLine)
|
||||
color = MainApp.sResources.getColor(R.color.high);
|
||||
return color;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,244 @@
|
|||
package info.nightscout.androidaps.db;
|
||||
|
||||
import android.graphics.Color;
|
||||
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.EnumSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSMbg;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.Translator;
|
||||
|
||||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_CAREPORTALEVENTS)
|
||||
public class CareportalEvent implements DataPointWithLabelInterface {
|
||||
private static Logger log = LoggerFactory.getLogger(CareportalEvent.class);
|
||||
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
||||
@DatabaseField
|
||||
public boolean isValid = true;
|
||||
|
||||
@DatabaseField
|
||||
public int source = Source.NONE;
|
||||
@DatabaseField
|
||||
public String _id;
|
||||
|
||||
@DatabaseField
|
||||
public String eventType;
|
||||
@DatabaseField
|
||||
public String json;
|
||||
|
||||
public static final String CARBCORRECTION = "Carb Correction";
|
||||
public static final String BOLUSWIZARD = "Bolus Wizard";
|
||||
public static final String CORRECTIONBOLUS = "Correction Bolus";
|
||||
public static final String MEALBOLUS = "Meal Bolus";
|
||||
public static final String COMBOBOLUS = "Combo Bolus";
|
||||
public static final String TEMPBASAL = "Temp Basal";
|
||||
public static final String TEMPORARYTARGET = "Temporary Target";
|
||||
public static final String PROFILESWITCH = "Profile Switch";
|
||||
public static final String SITECHANGE = "Site Change";
|
||||
public static final String INSULINCHANGE = "Insulin Change";
|
||||
public static final String SENSORCHANGE = "Sensor Change";
|
||||
public static final String PUMPBATTERYCHANGE = "Pump Battery Change";
|
||||
public static final String BGCHECK = "BG Check";
|
||||
public static final String ANNOUNCEMENT = "Announcement";
|
||||
public static final String NOTE = "Note";
|
||||
public static final String QUESTION = "Question";
|
||||
public static final String EXERCISE = "Exercise";
|
||||
public static final String OPENAPSOFFLINE = "OpenAPS Offline";
|
||||
public static final String NONE = "<none>";
|
||||
|
||||
public static final String MBG = "Mbg"; // comming from entries
|
||||
|
||||
public CareportalEvent() {
|
||||
}
|
||||
|
||||
public CareportalEvent(NSMbg mbg) {
|
||||
date = mbg.date;
|
||||
eventType = MBG;
|
||||
json = mbg.json;
|
||||
}
|
||||
|
||||
public long getMillisecondsFromStart() {
|
||||
return new Date().getTime() - date;
|
||||
}
|
||||
|
||||
public long getHoursFromStart() {
|
||||
return (new Date().getTime() - date) / (60 * 1000);
|
||||
}
|
||||
|
||||
public String age() {
|
||||
Map<TimeUnit,Long> diff = computeDiff(date, new Date().getTime());
|
||||
return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours);
|
||||
}
|
||||
|
||||
public String log() {
|
||||
return "CareportalEvent{" +
|
||||
"date= " + date +
|
||||
", date= " + DateUtil.dateAndTimeString(date) +
|
||||
", isValid= " + isValid +
|
||||
", _id= " + _id +
|
||||
", eventType= " + eventType +
|
||||
", json= " + json +
|
||||
"}";
|
||||
}
|
||||
|
||||
//Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
|
||||
public static Map<TimeUnit,Long> computeDiff(long date1, long date2) {
|
||||
long diffInMillies = date2 - date1;
|
||||
List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
|
||||
Collections.reverse(units);
|
||||
Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
|
||||
long milliesRest = diffInMillies;
|
||||
for ( TimeUnit unit : units ) {
|
||||
long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
|
||||
long diffInMilliesForUnit = unit.toMillis(diff);
|
||||
milliesRest = milliesRest - diffInMilliesForUnit;
|
||||
result.put(unit,diff);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// -------- DataPointWithLabelInterface -------
|
||||
|
||||
@Override
|
||||
public double getX() {
|
||||
return date;
|
||||
}
|
||||
|
||||
double yValue = 0;
|
||||
|
||||
@Override
|
||||
public double getY() {
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile();
|
||||
if (eventType.equals(MBG)) {
|
||||
double mbg = 0d;
|
||||
try {
|
||||
JSONObject object = new JSONObject(json);
|
||||
mbg = object.getDouble("mgdl");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (profile != null)
|
||||
return profile.fromMgdlToUnits(mbg, profile.getUnits());
|
||||
return 0d;
|
||||
}
|
||||
|
||||
double glucose = 0d;
|
||||
String units = Constants.MGDL;
|
||||
try {
|
||||
JSONObject object = new JSONObject(json);
|
||||
if (object.has("glucose")) {
|
||||
glucose = object.getDouble("glucose");
|
||||
units = object.getString("units");
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (profile != null && glucose != 0d) {
|
||||
double mmol = 0d;
|
||||
double mgdl = 0;
|
||||
if (units.equals(Constants.MGDL)) {
|
||||
mgdl = glucose;
|
||||
mmol = glucose * Constants.MGDL_TO_MMOLL;
|
||||
}
|
||||
if (units.equals(Constants.MMOL)) {
|
||||
mmol = glucose;
|
||||
mgdl = glucose * Constants.MMOLL_TO_MGDL;
|
||||
}
|
||||
return profile.toUnits(mgdl, mmol, profile.getUnits());
|
||||
}
|
||||
|
||||
return yValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setY(double y) {
|
||||
yValue = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLabel() {
|
||||
try {
|
||||
JSONObject object = new JSONObject(json);
|
||||
if (object.has("notes"))
|
||||
return object.getString("notes");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return Translator.translate(eventType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDuration() {
|
||||
try {
|
||||
JSONObject object = new JSONObject(json);
|
||||
if (object.has("duration"))
|
||||
return object.getInt("duration") * 60 * 1000L;
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PointsWithLabelGraphSeries.Shape getShape() {
|
||||
switch (eventType) {
|
||||
case CareportalEvent.MBG:
|
||||
return PointsWithLabelGraphSeries.Shape.MBG;
|
||||
case CareportalEvent.BGCHECK:
|
||||
return PointsWithLabelGraphSeries.Shape.BGCHECK;
|
||||
case CareportalEvent.ANNOUNCEMENT:
|
||||
return PointsWithLabelGraphSeries.Shape.ANNOUNCEMENT;
|
||||
case CareportalEvent.OPENAPSOFFLINE:
|
||||
return PointsWithLabelGraphSeries.Shape.OPENAPSOFFLINE;
|
||||
case CareportalEvent.EXERCISE:
|
||||
return PointsWithLabelGraphSeries.Shape.EXERCISE;
|
||||
}
|
||||
if (getDuration() > 0)
|
||||
return PointsWithLabelGraphSeries.Shape.GENERALWITHDURATION;
|
||||
return PointsWithLabelGraphSeries.Shape.GENERAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSize() {
|
||||
boolean isTablet = MainApp.sResources.getBoolean(R.bool.isTablet);
|
||||
return isTablet ? 12 : 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColor() {
|
||||
if (eventType.equals(ANNOUNCEMENT))
|
||||
return 0xFFFF8C00;
|
||||
if (eventType.equals(MBG))
|
||||
return Color.RED;
|
||||
if (eventType.equals(BGCHECK))
|
||||
return Color.RED;
|
||||
if (eventType.equals(EXERCISE))
|
||||
return Color.BLUE;
|
||||
if (eventType.equals(OPENAPSOFFLINE))
|
||||
return Color.GRAY;
|
||||
return Color.GRAY;
|
||||
}
|
||||
}
|
|
@ -8,38 +8,38 @@ import java.util.Date;
|
|||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_DANARHISTORY)
|
||||
public class DanaRHistoryRecord {
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private String _id;
|
||||
@DatabaseField
|
||||
public String _id;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private byte recordCode;
|
||||
@DatabaseField
|
||||
public byte recordCode;
|
||||
|
||||
@DatabaseField(id = true, useGetSet = true)
|
||||
private String bytes;
|
||||
@DatabaseField(id = true)
|
||||
public String bytes;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private long recordDate;
|
||||
@DatabaseField
|
||||
public long recordDate;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private double recordValue;
|
||||
@DatabaseField
|
||||
public double recordValue;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private String bolusType;
|
||||
@DatabaseField
|
||||
public String bolusType;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private String stringRecordValue;
|
||||
@DatabaseField
|
||||
public String stringRecordValue;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private int recordDuration;
|
||||
@DatabaseField
|
||||
public int recordDuration;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private double recordDailyBasal;
|
||||
@DatabaseField
|
||||
public double recordDailyBasal;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private double recordDailyBolus;
|
||||
@DatabaseField
|
||||
public double recordDailyBolus;
|
||||
|
||||
@DatabaseField(useGetSet = true)
|
||||
private String recordAlarm;
|
||||
@DatabaseField
|
||||
public String recordAlarm;
|
||||
|
||||
public DanaRHistoryRecord() {
|
||||
this.recordDate = 0;
|
||||
|
@ -50,74 +50,6 @@ public class DanaRHistoryRecord {
|
|||
this._id = null;
|
||||
}
|
||||
|
||||
public void setRecordDate(Date dtRecordDate) {
|
||||
this.recordDate = dtRecordDate.getTime();
|
||||
}
|
||||
|
||||
public long getRecordDate() {
|
||||
return this.recordDate;
|
||||
}
|
||||
|
||||
public void setRecordDate(long dtRecordDate) {
|
||||
this.recordDate = dtRecordDate;
|
||||
}
|
||||
|
||||
public double getRecordValue() {
|
||||
return this.recordValue;
|
||||
}
|
||||
|
||||
public void setRecordValue(double dRecordValue) {
|
||||
this.recordValue = dRecordValue;
|
||||
}
|
||||
|
||||
public String getBolusType() {
|
||||
return this.bolusType;
|
||||
}
|
||||
|
||||
public void setBolusType(String strRecordType) {
|
||||
this.bolusType = strRecordType;
|
||||
}
|
||||
|
||||
public String getStringRecordValue() {
|
||||
return this.stringRecordValue;
|
||||
}
|
||||
|
||||
public void setStringRecordValue(String strRecordValue) {
|
||||
this.stringRecordValue = strRecordValue;
|
||||
}
|
||||
|
||||
public byte getRecordCode() {
|
||||
return this.recordCode;
|
||||
}
|
||||
|
||||
public void setRecordCode(byte cRecordCode) {
|
||||
this.recordCode = cRecordCode;
|
||||
}
|
||||
|
||||
public int getRecordDuration() {
|
||||
return this.recordDuration;
|
||||
}
|
||||
|
||||
public void setRecordDuration(int dRecordDuraion) {
|
||||
this.recordDuration = dRecordDuraion;
|
||||
}
|
||||
|
||||
public double getRecordDailyBasal() {
|
||||
return this.recordDailyBasal;
|
||||
}
|
||||
|
||||
public void setRecordDailyBasal(double dRecordDailyBasal) {
|
||||
this.recordDailyBasal = dRecordDailyBasal;
|
||||
}
|
||||
|
||||
public double getRecordDailyBolus() {
|
||||
return this.recordDailyBolus;
|
||||
}
|
||||
|
||||
public void setRecordDailyBolus(double dRecordDailyBolus) {
|
||||
this.recordDailyBolus = dRecordDailyBolus;
|
||||
}
|
||||
|
||||
public int getRecordLevel(double dExLow, double dLow, double dHigh, double dExHigh) {
|
||||
if (this.recordValue < dExLow)
|
||||
return 0;
|
||||
|
@ -128,34 +60,10 @@ public class DanaRHistoryRecord {
|
|||
return this.recordValue < dExHigh ? 3 : 4;
|
||||
}
|
||||
|
||||
public String getRecordAlarm() {
|
||||
return this.recordAlarm;
|
||||
}
|
||||
|
||||
public void setRecordAlarm(String strAlarm) {
|
||||
this.recordAlarm = strAlarm;
|
||||
}
|
||||
|
||||
public String get_id() {
|
||||
return this._id;
|
||||
}
|
||||
|
||||
public void set_id(String _id) {
|
||||
this._id = _id;
|
||||
}
|
||||
|
||||
public void setBytes(byte[] raw) {
|
||||
this.bytes = bytesToHex(raw);
|
||||
}
|
||||
|
||||
public void setBytes(String bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
public String getBytes() {
|
||||
return this.bytes;
|
||||
}
|
||||
|
||||
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
|
||||
|
||||
public static String bytesToHex(byte[] bytes) {
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -19,15 +19,7 @@ import org.slf4j.LoggerFactory;
|
|||
public class DbRequest {
|
||||
private static Logger log = LoggerFactory.getLogger(DbRequest.class);
|
||||
|
||||
public String getNsClientID() {
|
||||
return nsClientID;
|
||||
}
|
||||
|
||||
public void setNsClientID(String nsClientID) {
|
||||
this.nsClientID = nsClientID;
|
||||
}
|
||||
|
||||
@DatabaseField(id = true, useGetSet = true)
|
||||
@DatabaseField(id = true)
|
||||
public String nsClientID = null;
|
||||
|
||||
@DatabaseField
|
||||
|
|
|
@ -0,0 +1,287 @@
|
|||
package info.nightscout.androidaps.db;
|
||||
|
||||
/**
|
||||
* Created by mike on 21.05.2017.
|
||||
*/
|
||||
|
||||
import android.graphics.Color;
|
||||
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.data.Iob;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
import info.nightscout.androidaps.interfaces.Interval;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
import info.nightscout.utils.Round;
|
||||
|
||||
/**
|
||||
* Created by mike on 21.05.2017.
|
||||
*/
|
||||
|
||||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_EXTENDEDBOLUSES)
|
||||
public class ExtendedBolus implements Interval, DataPointWithLabelInterface {
|
||||
private static Logger log = LoggerFactory.getLogger(ExtendedBolus.class);
|
||||
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
||||
@DatabaseField
|
||||
public boolean isValid = true;
|
||||
|
||||
@DatabaseField(index = true)
|
||||
public long pumpId = 0;
|
||||
|
||||
@DatabaseField
|
||||
public int source = Source.NONE;
|
||||
@DatabaseField
|
||||
public String _id = null; // NS _id
|
||||
|
||||
@DatabaseField
|
||||
public double insulin = 0d;
|
||||
@DatabaseField
|
||||
public int durationInMinutes = 0; // duration == 0 means end of extended bolus
|
||||
|
||||
@DatabaseField
|
||||
public int insulinInterfaceID = InsulinInterface.FASTACTINGINSULIN;
|
||||
@DatabaseField
|
||||
public double dia = Constants.defaultDIA;
|
||||
|
||||
public ExtendedBolus() {
|
||||
}
|
||||
|
||||
public ExtendedBolus(long date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public boolean isEqual(ExtendedBolus other) {
|
||||
if (date != other.date) {
|
||||
return false;
|
||||
}
|
||||
if (durationInMinutes != other.durationInMinutes)
|
||||
return false;
|
||||
if (insulin != other.insulin)
|
||||
return false;
|
||||
if (pumpId != other.pumpId)
|
||||
return false;
|
||||
if (!Objects.equals(_id, other._id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void copyFrom(ExtendedBolus t) {
|
||||
date = t.date;
|
||||
_id = t._id;
|
||||
durationInMinutes = t.durationInMinutes;
|
||||
insulin = t.insulin;
|
||||
pumpId = t.pumpId;
|
||||
}
|
||||
|
||||
// -------- Interval interface ---------
|
||||
|
||||
Long cuttedEnd = null;
|
||||
|
||||
public long durationInMsec() {
|
||||
return durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
public long start() {
|
||||
return date;
|
||||
}
|
||||
|
||||
// planned end time at time of creation
|
||||
public long originalEnd() {
|
||||
return date + durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
// end time after cut
|
||||
public long end() {
|
||||
if (cuttedEnd != null)
|
||||
return cuttedEnd;
|
||||
return originalEnd();
|
||||
}
|
||||
|
||||
public void cutEndTo(long end) {
|
||||
cuttedEnd = end;
|
||||
}
|
||||
|
||||
public boolean match(long time) {
|
||||
if (start() <= time && end() >= time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean before(long time) {
|
||||
if (end() < time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean after(long time) {
|
||||
if (start() > time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInProgress() {
|
||||
return match(new Date().getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEndingEvent() {
|
||||
return durationInMinutes == 0;
|
||||
}
|
||||
|
||||
// -------- Interval interface end ---------
|
||||
|
||||
public String log() {
|
||||
return "Bolus{" +
|
||||
"date= " + date +
|
||||
", date= " + DateUtil.dateAndTimeString(date) +
|
||||
", isValid=" + isValid +
|
||||
", _id= " + _id +
|
||||
", pumpId= " + pumpId +
|
||||
", insulin= " + insulin +
|
||||
", durationInMinutes= " + durationInMinutes +
|
||||
"}";
|
||||
}
|
||||
|
||||
public double absoluteRate() {
|
||||
return Round.roundTo(insulin / durationInMinutes * 60, 0.01);
|
||||
}
|
||||
|
||||
public double insulinSoFar() {
|
||||
return absoluteRate() * getRealDuration() / 60d;
|
||||
}
|
||||
|
||||
public IobTotal iobCalc(long time) {
|
||||
IobTotal result = new IobTotal(time);
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile(time);
|
||||
InsulinInterface insulinInterface = ConfigBuilderPlugin.getActiveInsulin();
|
||||
|
||||
if (profile == null)
|
||||
return result;
|
||||
|
||||
int realDuration = getDurationToTime(time);
|
||||
|
||||
if (realDuration > 0) {
|
||||
Double dia_ago = time - profile.getDia() * 60 * 60 * 1000;
|
||||
int aboutFiveMinIntervals = (int) Math.ceil(realDuration / 5d);
|
||||
double spacing = realDuration / aboutFiveMinIntervals;
|
||||
|
||||
for (Long j = 0L; j < aboutFiveMinIntervals; j++) {
|
||||
// find middle of the interval
|
||||
Long calcdate = (long) (date + j * spacing * 60 * 1000 + 0.5d * spacing * 60 * 1000);
|
||||
|
||||
if (calcdate > dia_ago && calcdate <= time) {
|
||||
double tempBolusSize = absoluteRate() * spacing / 60d;
|
||||
|
||||
Treatment tempBolusPart = new Treatment(insulinInterface);
|
||||
tempBolusPart.insulin = tempBolusSize;
|
||||
tempBolusPart.date = calcdate;
|
||||
|
||||
Iob aIOB = insulinInterface.iobCalcForTreatment(tempBolusPart, time, profile.getDia());
|
||||
result.iob += aIOB.iobContrib;
|
||||
result.activity += aIOB.activityContrib;
|
||||
result.extendedBolusInsulin += tempBolusPart.insulin;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public int getRealDuration() {
|
||||
return getDurationToTime(new Date().getTime());
|
||||
}
|
||||
|
||||
private int getDurationToTime(long time) {
|
||||
long endTime = Math.min(time, end());
|
||||
long msecs = endTime - date;
|
||||
return Math.round(msecs / 60f / 1000);
|
||||
}
|
||||
|
||||
public int getPlannedRemainingMinutes() {
|
||||
float remainingMin = (end() - new Date().getTime()) / 1000f / 60;
|
||||
return (remainingMin < 0) ? 0 : Math.round(remainingMin);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "E " + DecimalFormatter.to2Decimal(absoluteRate()) + "U/h @" +
|
||||
DateUtil.timeString(date) +
|
||||
" " + getRealDuration() + "/" + durationInMinutes + "min";
|
||||
}
|
||||
|
||||
public String toStringShort() {
|
||||
return "E " + DecimalFormatter.to2Decimal(absoluteRate()) + "U/h ";
|
||||
}
|
||||
|
||||
public String toStringMedium() {
|
||||
return "E " + DecimalFormatter.to2Decimal(absoluteRate()) + "U/h ("
|
||||
+ getRealDuration() + "/" + durationInMinutes + ") ";
|
||||
}
|
||||
|
||||
public String toStringTotal() {
|
||||
return DecimalFormatter.to2Decimal(insulin) + "U ( " +
|
||||
DecimalFormatter.to2Decimal(absoluteRate()) + " U/h )";
|
||||
}
|
||||
|
||||
// -------- DataPointWithLabelInterface --------
|
||||
@Override
|
||||
public double getX() {
|
||||
return date;
|
||||
}
|
||||
|
||||
// default when no sgv around available
|
||||
private double yValue = 0;
|
||||
|
||||
|
||||
@Override
|
||||
public double getY() {
|
||||
return yValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setY(double y) {
|
||||
yValue = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLabel() {
|
||||
return toStringTotal();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDuration() {
|
||||
return durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PointsWithLabelGraphSeries.Shape getShape() {
|
||||
return PointsWithLabelGraphSeries.Shape.EXTENDEDBOLUS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSize() {
|
||||
return 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColor() {
|
||||
return Color.CYAN;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,202 @@
|
|||
package info.nightscout.androidaps.db;
|
||||
|
||||
import android.graphics.Color;
|
||||
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
|
||||
import info.nightscout.androidaps.interfaces.Interval;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
|
||||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_PROFILESWITCHES)
|
||||
public class ProfileSwitch implements Interval, DataPointWithLabelInterface {
|
||||
private static Logger log = LoggerFactory.getLogger(ProfileSwitch.class);
|
||||
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
||||
@DatabaseField
|
||||
public boolean isValid = true;
|
||||
|
||||
@DatabaseField
|
||||
public int source = Source.NONE;
|
||||
@DatabaseField
|
||||
public String _id = null; // NS _id
|
||||
|
||||
@DatabaseField
|
||||
public boolean isCPP = false; // CPP NS="CircadianPercentageProfile"
|
||||
@DatabaseField
|
||||
public int timeshift = 0; // CPP NS="timeshift"
|
||||
@DatabaseField
|
||||
public int percentage = 100; // CPP NS="percentage"
|
||||
|
||||
@DatabaseField
|
||||
public String profileName = null;
|
||||
|
||||
@DatabaseField
|
||||
public String profileJson = null;
|
||||
|
||||
@DatabaseField
|
||||
public String profilePlugin = null; // NSProfilePlugin.class.getName();
|
||||
|
||||
@DatabaseField
|
||||
public int durationInMinutes = 0;
|
||||
|
||||
public boolean isEqual(ProfileSwitch other) {
|
||||
if (date != other.date) {
|
||||
return false;
|
||||
}
|
||||
if (durationInMinutes != other.durationInMinutes)
|
||||
return false;
|
||||
if (percentage != other.percentage)
|
||||
return false;
|
||||
if (timeshift != other.timeshift)
|
||||
return false;
|
||||
if (isCPP != other.isCPP)
|
||||
return false;
|
||||
if (!Objects.equals(_id, other._id))
|
||||
return false;
|
||||
if (!Objects.equals(profilePlugin, other.profilePlugin))
|
||||
return false;
|
||||
if (!Objects.equals(profileJson, other.profileJson))
|
||||
return false;
|
||||
if (!Objects.equals(profileName, other.profileName))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void copyFrom(ProfileSwitch t) {
|
||||
date = t.date;
|
||||
_id = t._id;
|
||||
durationInMinutes = t.durationInMinutes;
|
||||
percentage = t.percentage;
|
||||
timeshift = t.timeshift;
|
||||
isCPP = t.isCPP;
|
||||
profilePlugin = t.profilePlugin;
|
||||
profileJson = t.profileJson;
|
||||
profileName = t.profileName;
|
||||
}
|
||||
|
||||
// -------- Interval interface ---------
|
||||
|
||||
Long cuttedEnd = null;
|
||||
|
||||
public long durationInMsec() {
|
||||
return durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
public long start() {
|
||||
return date;
|
||||
}
|
||||
|
||||
// planned end time at time of creation
|
||||
public long originalEnd() {
|
||||
return date + durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
// end time after cut
|
||||
public long end() {
|
||||
if (cuttedEnd != null)
|
||||
return cuttedEnd;
|
||||
return originalEnd();
|
||||
}
|
||||
|
||||
public void cutEndTo(long end) {
|
||||
cuttedEnd = end;
|
||||
}
|
||||
|
||||
public boolean match(long time) {
|
||||
if (start() <= time && end() >= time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean before(long time) {
|
||||
if (end() < time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean after(long time) {
|
||||
if (start() > time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInProgress() {
|
||||
return match(new Date().getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEndingEvent() {
|
||||
return durationInMinutes == 0;
|
||||
}
|
||||
|
||||
// -------- Interval interface end ---------
|
||||
|
||||
// ----------------- DataPointInterface --------------------
|
||||
@Override
|
||||
public double getX() {
|
||||
return date;
|
||||
}
|
||||
|
||||
// default when no sgv around available
|
||||
private double yValue = 0;
|
||||
|
||||
@Override
|
||||
public double getY() {
|
||||
return yValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setY(double y) {
|
||||
yValue = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLabel() {
|
||||
return profileName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDuration() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PointsWithLabelGraphSeries.Shape getShape() {
|
||||
return PointsWithLabelGraphSeries.Shape.PROFILE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSize() {
|
||||
return 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColor() {
|
||||
return Color.CYAN;
|
||||
}
|
||||
|
||||
public String log() {
|
||||
return "ProfileSwitch{" +
|
||||
"date=" + date +
|
||||
"date=" + DateUtil.dateAndTimeString(date) +
|
||||
", isValid=" + isValid +
|
||||
", duration=" + durationInMinutes +
|
||||
", profileName=" + profileName +
|
||||
", percentage=" + percentage +
|
||||
", timeshift=" + timeshift +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
24
app/src/main/java/info/nightscout/androidaps/db/Source.java
Normal file
24
app/src/main/java/info/nightscout/androidaps/db/Source.java
Normal file
|
@ -0,0 +1,24 @@
|
|||
package info.nightscout.androidaps.db;
|
||||
|
||||
/**
|
||||
* Created by mike on 21.05.2017.
|
||||
*/
|
||||
|
||||
public class Source {
|
||||
public final static int NONE = 0;
|
||||
public final static int PUMP = 1; // Pump history
|
||||
public final static int NIGHTSCOUT = 2; // created in NS
|
||||
public final static int USER = 3; // created by user or driver not using history
|
||||
|
||||
public static String getString(int source) {
|
||||
switch (source) {
|
||||
case PUMP:
|
||||
return "PUMP";
|
||||
case NIGHTSCOUT:
|
||||
return "NIGHTSCOUT";
|
||||
case USER:
|
||||
return "USER";
|
||||
}
|
||||
return "NONE";
|
||||
}
|
||||
}
|
|
@ -1,230 +0,0 @@
|
|||
package info.nightscout.androidaps.db;
|
||||
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.data.Iob;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
|
||||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_TEMPBASALS)
|
||||
public class TempBasal {
|
||||
private static Logger log = LoggerFactory.getLogger(TempBasal.class);
|
||||
|
||||
public long getTimeIndex() {
|
||||
return timeStart.getTime();
|
||||
}
|
||||
|
||||
public void setTimeIndex(long timeIndex) {
|
||||
this.timeIndex = timeIndex;
|
||||
}
|
||||
|
||||
@DatabaseField(id = true, useGetSet = true)
|
||||
public long timeIndex;
|
||||
|
||||
@DatabaseField
|
||||
public Date timeStart;
|
||||
|
||||
@DatabaseField
|
||||
public Date timeEnd;
|
||||
|
||||
@DatabaseField
|
||||
public int percent; // In % of current basal. 100% == current basal
|
||||
|
||||
@DatabaseField
|
||||
public Double absolute; // Absolute value in U
|
||||
|
||||
@DatabaseField
|
||||
public int duration; // in minutes
|
||||
|
||||
@DatabaseField
|
||||
public boolean isExtended = false; // true if set as extended bolus
|
||||
|
||||
@DatabaseField
|
||||
public boolean isAbsolute = false; // true if if set as absolute value in U
|
||||
|
||||
|
||||
public IobTotal iobCalc(Date time) {
|
||||
IobTotal result = new IobTotal(time.getTime());
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
|
||||
if (profile == null)
|
||||
return result;
|
||||
|
||||
Double basalRate = profile.getBasal(profile.secondsFromMidnight(time));
|
||||
|
||||
if (basalRate == null)
|
||||
return result;
|
||||
|
||||
int realDuration = getRealDuration();
|
||||
|
||||
if (realDuration > 0) {
|
||||
Double netBasalRate = 0d;
|
||||
Double tempBolusSize = 0.05;
|
||||
|
||||
if (isExtended) {
|
||||
netBasalRate = this.absolute;
|
||||
} else {
|
||||
if (this.isAbsolute) {
|
||||
netBasalRate = this.absolute - basalRate;
|
||||
} else {
|
||||
netBasalRate = (this.percent - 100) / 100d * basalRate;
|
||||
}
|
||||
}
|
||||
|
||||
result.netRatio = netBasalRate;
|
||||
Double netBasalAmount = Math.round(netBasalRate * realDuration * 10 / 6) / 100d;
|
||||
result.netInsulin = netBasalAmount;
|
||||
if (netBasalAmount < 0.1) {
|
||||
tempBolusSize = 0.01;
|
||||
}
|
||||
if (netBasalRate < 0) {
|
||||
tempBolusSize = -tempBolusSize;
|
||||
}
|
||||
Long tempBolusCount = Math.round(netBasalAmount / tempBolusSize);
|
||||
if (tempBolusCount > 0) {
|
||||
Long tempBolusSpacing = realDuration / tempBolusCount;
|
||||
for (Long j = 0l; j < tempBolusCount; j++) {
|
||||
Treatment tempBolusPart = new Treatment();
|
||||
tempBolusPart.insulin = tempBolusSize;
|
||||
Long date = this.timeStart.getTime() + j * tempBolusSpacing * 60 * 1000;
|
||||
tempBolusPart.created_at = new Date(date);
|
||||
|
||||
Iob aIOB = tempBolusPart.iobCalc(time, profile.getDia());
|
||||
result.basaliob += aIOB.iobContrib;
|
||||
result.activity += aIOB.activityContrib;
|
||||
Double dia_ago = time.getTime() - profile.getDia() * 60 * 60 * 1000;
|
||||
if (date > dia_ago && date <= time.getTime()) {
|
||||
result.netbasalinsulin += tempBolusPart.insulin;
|
||||
if (tempBolusPart.insulin > 0) {
|
||||
result.hightempinsulin += tempBolusPart.insulin;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Determine end of basal
|
||||
public Date getTimeEnd() {
|
||||
Date tempBasalTimePlannedEnd = getPlannedTimeEnd();
|
||||
Date now = new Date();
|
||||
|
||||
if (timeEnd != null && timeEnd.getTime() < tempBasalTimePlannedEnd.getTime()) {
|
||||
tempBasalTimePlannedEnd = timeEnd;
|
||||
}
|
||||
|
||||
if (now.getTime() < tempBasalTimePlannedEnd.getTime())
|
||||
tempBasalTimePlannedEnd = now;
|
||||
|
||||
return tempBasalTimePlannedEnd;
|
||||
}
|
||||
|
||||
public Date getPlannedTimeEnd() {
|
||||
return new Date(timeStart.getTime() + 60 * 1_000 * duration);
|
||||
}
|
||||
|
||||
public int getRealDuration() {
|
||||
Long msecs = getTimeEnd().getTime() - timeStart.getTime();
|
||||
return Math.round(msecs / 60f / 1000);
|
||||
}
|
||||
|
||||
public long getMillisecondsFromStart() {
|
||||
return new Date().getTime() - timeStart.getTime();
|
||||
}
|
||||
|
||||
public int getPlannedRemainingMinutes() {
|
||||
if (timeEnd != null) return 0;
|
||||
float remainingMin = (getPlannedTimeEnd().getTime() - new Date().getTime()) / 1000f / 60;
|
||||
return (remainingMin < 0) ? 0 : Math.round(remainingMin);
|
||||
}
|
||||
|
||||
public boolean isInProgress() {
|
||||
return isInProgress(new Date());
|
||||
}
|
||||
|
||||
public double tempBasalConvertedToAbsolute(Date time) {
|
||||
if (isExtended) {
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
double absval = profile.getBasal(NSProfile.secondsFromMidnight(time)) + absolute;
|
||||
return absval;
|
||||
} else {
|
||||
if (isAbsolute) return absolute;
|
||||
else {
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
double absval = profile.getBasal(NSProfile.secondsFromMidnight(time)) * percent / 100;
|
||||
return absval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isInProgress(Date time) {
|
||||
if (timeStart.getTime() > time.getTime()) return false; // in the future
|
||||
if (timeEnd == null) { // open end
|
||||
if (timeStart.getTime() < time.getTime() && getPlannedTimeEnd().getTime() > time.getTime())
|
||||
return true; // in interval
|
||||
return false;
|
||||
}
|
||||
// closed end
|
||||
if (timeStart.getTime() < time.getTime() && timeEnd.getTime() > time.getTime()) return true; // in interval
|
||||
return false;
|
||||
}
|
||||
|
||||
public String log() {
|
||||
return "TempBasal{" +
|
||||
"timeIndex=" + timeIndex +
|
||||
", timeStart=" + timeStart +
|
||||
", timeEnd=" + timeEnd +
|
||||
", percent=" + percent +
|
||||
", absolute=" + absolute +
|
||||
", duration=" + duration +
|
||||
", isAbsolute=" + isAbsolute +
|
||||
", isExtended=" + isExtended +
|
||||
'}';
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
String extended = isExtended ? "E " : "";
|
||||
|
||||
if (isAbsolute) {
|
||||
return extended + DecimalFormatter.to2Decimal(absolute) + "U/h @" +
|
||||
DateUtil.timeString(timeStart) +
|
||||
" " + getRealDuration() + "/" + duration + "min";
|
||||
} else { // percent
|
||||
return percent + "% @" +
|
||||
DateUtil.timeString(timeStart) +
|
||||
" " + getRealDuration() + "/" + duration + "min";
|
||||
}
|
||||
}
|
||||
|
||||
public String toStringShort() {
|
||||
String extended = isExtended ? "E" : "";
|
||||
|
||||
if (isAbsolute) {
|
||||
return extended + DecimalFormatter.to2Decimal(absolute) + "U/h ";
|
||||
} else { // percent
|
||||
return percent + "% ";
|
||||
}
|
||||
}
|
||||
|
||||
public String toStringMedium() {
|
||||
String extended = isExtended ? "E" : "";
|
||||
|
||||
if (isAbsolute) {
|
||||
return extended + DecimalFormatter.to2Decimal(absolute) + "U/h ("
|
||||
+ getRealDuration() + "/" + duration + ") ";
|
||||
} else { // percent
|
||||
return percent + "% (" + getRealDuration() + "/" + duration + ") ";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -7,29 +7,27 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.plugins.TempTargetRange.TempTargetRangePlugin;
|
||||
import info.nightscout.androidaps.interfaces.Interval;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
|
||||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_TEMPTARGETS)
|
||||
public class TempTarget {
|
||||
public class TempTarget implements Interval {
|
||||
private static Logger log = LoggerFactory.getLogger(TempTarget.class);
|
||||
|
||||
public long getTimeIndex() {
|
||||
return timeStart.getTime() - timeStart.getTime() % 1000;
|
||||
}
|
||||
|
||||
public void setTimeIndex(long timeIndex) {
|
||||
this.timeIndex = timeIndex;
|
||||
}
|
||||
|
||||
@DatabaseField(id = true, useGetSet = true)
|
||||
public long timeIndex;
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
||||
@DatabaseField
|
||||
public Date timeStart;
|
||||
public boolean isValid = true;
|
||||
|
||||
@DatabaseField
|
||||
public int source = Source.NONE;
|
||||
@DatabaseField
|
||||
public String _id = null; // NS _id
|
||||
|
||||
@DatabaseField
|
||||
public double low; // in mgdl
|
||||
|
@ -41,15 +39,92 @@ public class TempTarget {
|
|||
public String reason;
|
||||
|
||||
@DatabaseField
|
||||
public int duration; // in minutes
|
||||
public int durationInMinutes;
|
||||
|
||||
@DatabaseField
|
||||
public String _id; // NS _id
|
||||
|
||||
public Date getPlannedTimeEnd() {
|
||||
return new Date(timeStart.getTime() + 60 * 1_000 * duration);
|
||||
public boolean isEqual(TempTarget other) {
|
||||
if (date != other.date) {
|
||||
return false;
|
||||
}
|
||||
if (durationInMinutes != other.durationInMinutes)
|
||||
return false;
|
||||
if (low != other.low)
|
||||
return false;
|
||||
if (high != other.high)
|
||||
return false;
|
||||
if (reason != other.reason)
|
||||
return false;
|
||||
if (!Objects.equals(_id, other._id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void copyFrom(TempTarget t) {
|
||||
date = t.date;
|
||||
_id = t._id;
|
||||
durationInMinutes = t.durationInMinutes;
|
||||
low = t.low;
|
||||
high = t.high;
|
||||
reason = t.reason;
|
||||
}
|
||||
|
||||
// -------- Interval interface ---------
|
||||
|
||||
Long cuttedEnd = null;
|
||||
|
||||
public long durationInMsec() {
|
||||
return durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
public long start() {
|
||||
return date;
|
||||
}
|
||||
|
||||
// planned end time at time of creation
|
||||
public long originalEnd() {
|
||||
return date + durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
// end time after cut
|
||||
public long end() {
|
||||
if (cuttedEnd != null)
|
||||
return cuttedEnd;
|
||||
return originalEnd();
|
||||
}
|
||||
|
||||
public void cutEndTo(long end) {
|
||||
cuttedEnd = end;
|
||||
}
|
||||
|
||||
public boolean match(long time) {
|
||||
if (start() <= time && end() >= time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean before(long time) {
|
||||
if (end() < time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean after(long time) {
|
||||
if (start() > time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInProgress() {
|
||||
return match(new Date().getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEndingEvent() {
|
||||
return durationInMinutes == 0;
|
||||
}
|
||||
|
||||
// -------- Interval interface end ---------
|
||||
|
||||
public String lowValueToUnitsToString(String units) {
|
||||
if (units.equals(Constants.MGDL)) return DecimalFormatter.to0Decimal(low);
|
||||
else return DecimalFormatter.to1Decimal(low * Constants.MGDL_TO_MMOLL);
|
||||
|
@ -60,15 +135,12 @@ public class TempTarget {
|
|||
else return DecimalFormatter.to1Decimal(low * Constants.MGDL_TO_MMOLL);
|
||||
}
|
||||
|
||||
public boolean isInProgress() {
|
||||
return ((TempTargetRangePlugin) MainApp.getSpecificPlugin(TempTargetRangePlugin.class)).getTempTargetInProgress(new Date().getTime()) == this;
|
||||
}
|
||||
|
||||
public String log() {
|
||||
return "TempTarget{" +
|
||||
"timeIndex=" + timeIndex +
|
||||
", timeStart=" + timeStart +
|
||||
", duration=" + duration +
|
||||
public String toString() {
|
||||
return "TemporaryTarget{" +
|
||||
"date=" + date +
|
||||
"date=" + DateUtil.dateAndTimeString(date) +
|
||||
", isValid=" + isValid +
|
||||
", duration=" + durationInMinutes +
|
||||
", reason=" + reason +
|
||||
", low=" + low +
|
||||
", high=" + high +
|
||||
|
|
|
@ -0,0 +1,289 @@
|
|||
package info.nightscout.androidaps.db;
|
||||
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.data.Iob;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
import info.nightscout.androidaps.interfaces.Interval;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
|
||||
/**
|
||||
* Created by mike on 21.05.2017.
|
||||
*/
|
||||
|
||||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_TEMPORARYBASALS)
|
||||
public class TemporaryBasal implements Interval {
|
||||
private static Logger log = LoggerFactory.getLogger(TemporaryBasal.class);
|
||||
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
||||
@DatabaseField
|
||||
public boolean isValid = true;
|
||||
|
||||
@DatabaseField(index = true)
|
||||
public long pumpId = 0;
|
||||
|
||||
@DatabaseField
|
||||
public int source = Source.NONE;
|
||||
@DatabaseField
|
||||
public String _id = null; // NS _id
|
||||
|
||||
@DatabaseField
|
||||
public int durationInMinutes = 0; // duration == 0 means end of temp basal
|
||||
@DatabaseField
|
||||
public boolean isAbsolute = false;
|
||||
@DatabaseField
|
||||
public int percentRate = 0;
|
||||
@DatabaseField
|
||||
public double absoluteRate = 0d;
|
||||
|
||||
public TemporaryBasal() {
|
||||
}
|
||||
|
||||
public TemporaryBasal(long date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public TemporaryBasal(ExtendedBolus extendedBolus) {
|
||||
double basal = MainApp.getConfigBuilder().getProfile(extendedBolus.date).getBasal(extendedBolus.date);
|
||||
this.date = extendedBolus.date;
|
||||
this.isValid = extendedBolus.isValid;
|
||||
this.source = extendedBolus.source;
|
||||
this._id = extendedBolus._id;
|
||||
this.durationInMinutes = extendedBolus.durationInMinutes;
|
||||
this.isAbsolute = true;
|
||||
this.absoluteRate = basal + extendedBolus.absoluteRate();
|
||||
}
|
||||
|
||||
public TemporaryBasal clone() {
|
||||
TemporaryBasal t = new TemporaryBasal();
|
||||
t.date = date;
|
||||
t.isValid = isValid;
|
||||
t.source = source;
|
||||
t._id = _id;
|
||||
t.pumpId = pumpId;
|
||||
t.durationInMinutes = durationInMinutes;
|
||||
t.isAbsolute = isAbsolute;
|
||||
t.percentRate = percentRate;
|
||||
t.absoluteRate = absoluteRate;
|
||||
return t;
|
||||
}
|
||||
|
||||
public boolean isEqual(TemporaryBasal other) {
|
||||
if (date != other.date) {
|
||||
return false;
|
||||
}
|
||||
if (durationInMinutes != other.durationInMinutes)
|
||||
return false;
|
||||
if (isAbsolute != other.isAbsolute)
|
||||
return false;
|
||||
if (percentRate != other.percentRate)
|
||||
return false;
|
||||
if (absoluteRate != other.absoluteRate)
|
||||
return false;
|
||||
if (pumpId != other.pumpId)
|
||||
return false;
|
||||
if (!Objects.equals(_id, other._id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void copyFrom(TemporaryBasal t) {
|
||||
date = t.date;
|
||||
_id = t._id;
|
||||
durationInMinutes = t.durationInMinutes;
|
||||
isAbsolute = t.isAbsolute;
|
||||
percentRate = t.percentRate;
|
||||
absoluteRate = t.absoluteRate;
|
||||
pumpId = t.pumpId;
|
||||
}
|
||||
|
||||
// -------- Interval interface ---------
|
||||
|
||||
Long cuttedEnd = null;
|
||||
|
||||
public long durationInMsec() {
|
||||
return durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
public long start() {
|
||||
return date;
|
||||
}
|
||||
|
||||
// planned end time at time of creation
|
||||
public long originalEnd() {
|
||||
return date + durationInMinutes * 60 * 1000L;
|
||||
}
|
||||
|
||||
// end time after cut
|
||||
public long end() {
|
||||
if (cuttedEnd != null)
|
||||
return cuttedEnd;
|
||||
return originalEnd();
|
||||
}
|
||||
|
||||
public void cutEndTo(long end) {
|
||||
cuttedEnd = end;
|
||||
}
|
||||
|
||||
public boolean match(long time) {
|
||||
if (start() <= time && end() >= time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean before(long time) {
|
||||
if (end() < time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean after(long time) {
|
||||
if (start() > time)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInProgress() {
|
||||
return match(new Date().getTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEndingEvent() {
|
||||
return durationInMinutes == 0;
|
||||
}
|
||||
|
||||
// -------- Interval interface end ---------
|
||||
|
||||
public IobTotal iobCalc(long time) {
|
||||
IobTotal result = new IobTotal(time);
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile(time);
|
||||
InsulinInterface insulinInterface = ConfigBuilderPlugin.getActiveInsulin();
|
||||
|
||||
int realDuration = getDurationToTime(time);
|
||||
Double netBasalAmount = 0d;
|
||||
|
||||
if (realDuration > 0) {
|
||||
Double netBasalRate = 0d;
|
||||
|
||||
Double dia_ago = time - profile.getDia() * 60 * 60 * 1000;
|
||||
int aboutFiveMinIntervals = (int) Math.ceil(realDuration / 5d);
|
||||
double tempBolusSpacing = realDuration / aboutFiveMinIntervals;
|
||||
|
||||
for (Long j = 0L; j < aboutFiveMinIntervals; j++) {
|
||||
// find middle of the interval
|
||||
Long calcdate = (long) (date + j * tempBolusSpacing * 60 * 1000 + 0.5d * tempBolusSpacing * 60 * 1000);
|
||||
|
||||
Double basalRate = profile.getBasal(calcdate);
|
||||
|
||||
if (basalRate == null)
|
||||
continue;
|
||||
if (isAbsolute) {
|
||||
netBasalRate = absoluteRate - basalRate;
|
||||
} else {
|
||||
netBasalRate = (percentRate - 100) / 100d * basalRate;
|
||||
}
|
||||
|
||||
if (calcdate > dia_ago && calcdate <= time) {
|
||||
double tempBolusSize = netBasalRate * tempBolusSpacing / 60d;
|
||||
netBasalAmount += tempBolusSize;
|
||||
|
||||
Treatment tempBolusPart = new Treatment(insulinInterface);
|
||||
tempBolusPart.insulin = tempBolusSize;
|
||||
tempBolusPart.date = calcdate;
|
||||
|
||||
Iob aIOB = insulinInterface.iobCalcForTreatment(tempBolusPart, time, profile.getDia());
|
||||
result.basaliob += aIOB.iobContrib;
|
||||
result.activity += aIOB.activityContrib;
|
||||
result.netbasalinsulin += tempBolusPart.insulin;
|
||||
if (tempBolusPart.insulin > 0) {
|
||||
result.hightempinsulin += tempBolusPart.insulin;
|
||||
}
|
||||
}
|
||||
result.netRatio = netBasalRate; // ratio at the end of interval
|
||||
}
|
||||
}
|
||||
result.netInsulin = netBasalAmount;
|
||||
return result;
|
||||
}
|
||||
|
||||
public int getRealDuration() {
|
||||
return getDurationToTime(new Date().getTime());
|
||||
}
|
||||
|
||||
private int getDurationToTime(long time) {
|
||||
long endTime = Math.min(time, end());
|
||||
long msecs = endTime - date;
|
||||
return Math.round(msecs / 60f / 1000);
|
||||
}
|
||||
|
||||
public int getPlannedRemainingMinutes() {
|
||||
float remainingMin = (end() - new Date().getTime()) / 1000f / 60;
|
||||
return (remainingMin < 0) ? 0 : Math.round(remainingMin);
|
||||
}
|
||||
|
||||
public double tempBasalConvertedToAbsolute(long time) {
|
||||
if (isAbsolute) return absoluteRate;
|
||||
else {
|
||||
return MainApp.getConfigBuilder().getProfile(time).getBasal(time) * percentRate / 100;
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "TemporaryBasal{" +
|
||||
"date=" + date +
|
||||
", date=" + DateUtil.dateAndTimeString(date) +
|
||||
", isValid=" + isValid +
|
||||
", pumpId=" + pumpId +
|
||||
", _id=" + _id +
|
||||
", percentRate=" + percentRate +
|
||||
", absoluteRate=" + absoluteRate +
|
||||
", durationInMinutes=" + durationInMinutes +
|
||||
", isAbsolute=" + isAbsolute +
|
||||
'}';
|
||||
}
|
||||
|
||||
public String toStringFull() {
|
||||
if (isAbsolute) {
|
||||
return DecimalFormatter.to2Decimal(absoluteRate) + "U/h @" +
|
||||
DateUtil.timeString(date) +
|
||||
" " + getRealDuration() + "/" + durationInMinutes + "min";
|
||||
} else { // percent
|
||||
return percentRate + "% @" +
|
||||
DateUtil.timeString(date) +
|
||||
" " + getRealDuration() + "/" + durationInMinutes + "min";
|
||||
}
|
||||
}
|
||||
|
||||
public String toStringShort() {
|
||||
if (isAbsolute) {
|
||||
return DecimalFormatter.to2Decimal(absoluteRate) + "U/h ";
|
||||
} else { // percent
|
||||
return percentRate + "% ";
|
||||
}
|
||||
}
|
||||
|
||||
public String toStringMedium() {
|
||||
if (isAbsolute) {
|
||||
return DecimalFormatter.to2Decimal(absoluteRate) + "U/h ("
|
||||
+ getRealDuration() + "/" + durationInMinutes + ") ";
|
||||
} else { // percent
|
||||
return percentRate + "% (" + getRealDuration() + "/" + durationInMinutes + ") ";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,21 +1,25 @@
|
|||
package info.nightscout.androidaps.db;
|
||||
|
||||
import android.graphics.Color;
|
||||
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.data.Iob;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
|
||||
|
@ -23,85 +27,102 @@ import info.nightscout.utils.DecimalFormatter;
|
|||
public class Treatment implements DataPointWithLabelInterface {
|
||||
private static Logger log = LoggerFactory.getLogger(Treatment.class);
|
||||
|
||||
public long getTimeIndex() {
|
||||
return created_at.getTime();
|
||||
}
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
||||
public void setTimeIndex(long timeIndex) {
|
||||
this.timeIndex = timeIndex;
|
||||
}
|
||||
@DatabaseField
|
||||
public boolean isValid = true;
|
||||
|
||||
@DatabaseField(id = true, useGetSet = true)
|
||||
public long timeIndex;
|
||||
@DatabaseField(index = true)
|
||||
public long pumpId = 0;
|
||||
|
||||
@DatabaseField
|
||||
public int source = Source.NONE;
|
||||
@DatabaseField
|
||||
public String _id;
|
||||
|
||||
@DatabaseField
|
||||
public Date created_at;
|
||||
|
||||
public double insulin = 0d;
|
||||
@DatabaseField
|
||||
public Double insulin = 0d;
|
||||
|
||||
@DatabaseField
|
||||
public Double carbs = 0d;
|
||||
|
||||
public double carbs = 0d;
|
||||
@DatabaseField
|
||||
public boolean mealBolus = true; // true for meal bolus , false for correction bolus
|
||||
|
||||
public void copyFrom(Treatment t) {
|
||||
this._id = t._id;
|
||||
this.created_at = t.created_at;
|
||||
this.insulin = t.insulin;
|
||||
this.carbs = t.carbs;
|
||||
this.mealBolus = t.mealBolus;
|
||||
@DatabaseField
|
||||
public int insulinInterfaceID = InsulinInterface.FASTACTINGINSULIN;
|
||||
@DatabaseField
|
||||
public double dia = Constants.defaultDIA;
|
||||
|
||||
public Treatment() {
|
||||
}
|
||||
|
||||
public Iob iobCalc(Date time, Double dia) {
|
||||
Iob result = new Iob();
|
||||
public Treatment(long date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
Double scaleFactor = 3.0 / dia;
|
||||
Double peak = 75d;
|
||||
Double end = 180d;
|
||||
|
||||
if (this.insulin != 0d) {
|
||||
Long bolusTime = this.created_at.getTime();
|
||||
Double minAgo = scaleFactor * (time.getTime() - bolusTime) / 1000d / 60d;
|
||||
|
||||
if (minAgo < peak) {
|
||||
Double x1 = minAgo / 5d + 1;
|
||||
result.iobContrib = this.insulin * (1 - 0.001852 * x1 * x1 + 0.001852 * x1);
|
||||
// units: BG (mg/dL) = (BG/U) * U insulin * scalar
|
||||
result.activityContrib = this.insulin * (2 / dia / 60 / peak) * minAgo;
|
||||
|
||||
} else if (minAgo < end) {
|
||||
Double x2 = (minAgo - 75) / 5;
|
||||
result.iobContrib = this.insulin * (0.001323 * x2 * x2 - 0.054233 * x2 + 0.55556);
|
||||
result.activityContrib = this.insulin * (2 / dia / 60 - (minAgo - peak) * 2 / dia / 60 / (60 * 3 - peak));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
public Treatment(InsulinInterface insulin) {
|
||||
insulinInterfaceID = insulin.getId();
|
||||
dia = insulin.getDia();
|
||||
}
|
||||
|
||||
public long getMillisecondsFromStart() {
|
||||
return new Date().getTime() - created_at.getTime();
|
||||
return new Date().getTime() - date;
|
||||
}
|
||||
|
||||
public String log() {
|
||||
public String toString() {
|
||||
return "Treatment{" +
|
||||
"timeIndex: " + timeIndex +
|
||||
", _id: " + _id +
|
||||
", insulin: " + insulin +
|
||||
", carbs: " + carbs +
|
||||
", mealBolus: " + mealBolus +
|
||||
", created_at: " +
|
||||
"date= " + date +
|
||||
", date= " + DateUtil.dateAndTimeString(date) +
|
||||
", isValid= " + isValid +
|
||||
", _id= " + _id +
|
||||
", pumpId= " + pumpId +
|
||||
", insulin= " + insulin +
|
||||
", carbs= " + carbs +
|
||||
", mealBolus= " + mealBolus +
|
||||
"}";
|
||||
}
|
||||
|
||||
// DataPointInterface
|
||||
public boolean isDataChanging(Treatment other) {
|
||||
if (date != other.date) {
|
||||
return true;
|
||||
}
|
||||
if (insulin != other.insulin)
|
||||
return true;
|
||||
if (carbs != other.carbs)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isEqual(Treatment other) {
|
||||
if (date != other.date) {
|
||||
return false;
|
||||
}
|
||||
if (insulin != other.insulin)
|
||||
return false;
|
||||
if (carbs != other.carbs)
|
||||
return false;
|
||||
if (mealBolus != other.mealBolus)
|
||||
return false;
|
||||
if (pumpId != other.pumpId)
|
||||
return false;
|
||||
if (!Objects.equals(_id, other._id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void copyFrom(Treatment t) {
|
||||
date = t.date;
|
||||
_id = t._id;
|
||||
insulin = t.insulin;
|
||||
carbs = t.carbs;
|
||||
mealBolus = t.mealBolus;
|
||||
pumpId = t.pumpId;
|
||||
}
|
||||
|
||||
// ----------------- DataPointInterface --------------------
|
||||
@Override
|
||||
public double getX() {
|
||||
return timeIndex;
|
||||
return date;
|
||||
}
|
||||
|
||||
// default when no sgv around available
|
||||
|
@ -117,36 +138,42 @@ public class Treatment implements DataPointWithLabelInterface {
|
|||
String label = "";
|
||||
if (insulin > 0) label += DecimalFormatter.to2Decimal(insulin) + "U";
|
||||
if (carbs > 0)
|
||||
label += (label.equals("") ? "" : " ") + DecimalFormatter.to0Decimal(carbs) + "g";
|
||||
label += "~" + DecimalFormatter.to0Decimal(carbs) + "g";
|
||||
return label;
|
||||
}
|
||||
|
||||
public void setYValue(List<BgReading> bgReadingsArray) {
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
if (profile == null) return;
|
||||
for (int r = bgReadingsArray.size() - 1; r >= 0; r--) {
|
||||
BgReading reading = bgReadingsArray.get(r);
|
||||
if (reading.timeIndex > timeIndex) continue;
|
||||
yValue = NSProfile.fromMgdlToUnits(reading.value, profile.getUnits());
|
||||
break;
|
||||
}
|
||||
@Override
|
||||
public long getDuration() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void sendToNSClient() {
|
||||
JSONObject data = new JSONObject();
|
||||
try {
|
||||
if (mealBolus)
|
||||
data.put("eventType", "Meal Bolus");
|
||||
else
|
||||
data.put("eventType", "Correction Bolus");
|
||||
if (insulin != 0d) data.put("insulin", insulin);
|
||||
if (carbs != 0d) data.put("carbs", carbs.intValue());
|
||||
data.put("created_at", DateUtil.toISOString(created_at));
|
||||
data.put("timeIndex", timeIndex);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
ConfigBuilderPlugin.uploadCareportalEntryToNS(data);
|
||||
@Override
|
||||
public PointsWithLabelGraphSeries.Shape getShape() {
|
||||
return PointsWithLabelGraphSeries.Shape.BOLUS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSize() {
|
||||
return 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColor() {
|
||||
return Color.CYAN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setY(double y) {
|
||||
yValue = y;
|
||||
}
|
||||
|
||||
// ----------------- DataPointInterface end --------------------
|
||||
|
||||
public Iob iobCalc(long time, double dia) {
|
||||
InsulinInterface insulinInterface = MainApp.getInsulinIterfaceById(insulinInterfaceID);
|
||||
if (insulinInterface == null)
|
||||
insulinInterface = ConfigBuilderPlugin.getActiveInsulin();
|
||||
|
||||
return insulinInterface.iobCalcForTreatment(this, time, dia);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
package info.nightscout.androidaps.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 25.05.2017.
|
||||
*/
|
||||
|
||||
public class EventCareportalEventChange {
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package info.nightscout.androidaps.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 15.05.2017.
|
||||
*/
|
||||
|
||||
public class EventExtendedBolusChange {
|
||||
}
|
|
@ -1,14 +1,7 @@
|
|||
package info.nightscout.androidaps.events;
|
||||
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
|
||||
/**
|
||||
* Created by mike on 04.06.2016.
|
||||
*/
|
||||
public class EventNewBasalProfile {
|
||||
public NSProfile newNSProfile = null;
|
||||
|
||||
public EventNewBasalProfile(NSProfile newProfile) {
|
||||
newNSProfile = newProfile;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
package info.nightscout.androidaps.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 02.06.2017.
|
||||
*/
|
||||
|
||||
public class EventProfileSwitchChange {
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package info.nightscout.androidaps.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 29.05.2017.
|
||||
*/
|
||||
|
||||
public class EventReloadTempBasalData {
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package info.nightscout.androidaps.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 29.05.2017.
|
||||
*/
|
||||
|
||||
public class EventReloadTreatmentData {
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package info.nightscout.androidaps.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 13.01.2017.
|
||||
*/
|
||||
|
||||
public class EventTempTargetChange {
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
package info.nightscout.androidaps.interfaces;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.08.2016.
|
||||
*/
|
||||
public interface FragmentBase {
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package info.nightscout.androidaps.interfaces;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.data.Iob;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
|
||||
/**
|
||||
* Created by mike on 17.04.2017.
|
||||
*/
|
||||
|
||||
public interface InsulinInterface {
|
||||
final int FASTACTINGINSULIN = 0;
|
||||
final int FASTACTINGINSULINPROLONGED = 1;
|
||||
|
||||
int getId();
|
||||
String getFriendlyName();
|
||||
String getComment();
|
||||
double getDia();
|
||||
public Iob iobCalcForTreatment(Treatment treatment, long time, Double dia);
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package info.nightscout.androidaps.interfaces;
|
||||
|
||||
/**
|
||||
* Created by mike on 21.05.2017.
|
||||
*/
|
||||
|
||||
public interface Interval {
|
||||
long durationInMsec();
|
||||
long start();
|
||||
|
||||
// planned end time at time of creation
|
||||
long originalEnd();
|
||||
|
||||
// end time after cut
|
||||
long end();
|
||||
|
||||
void cutEndTo(long end);
|
||||
boolean match(long time);
|
||||
boolean before(long time);
|
||||
boolean after(long time);
|
||||
|
||||
boolean isInProgress();
|
||||
boolean isEndingEvent();
|
||||
}
|
|
@ -8,14 +8,15 @@ import java.util.Date;
|
|||
public interface PluginBase {
|
||||
int GENERAL = 1;
|
||||
int TREATMENT = 2;
|
||||
int TEMPBASAL = 3;
|
||||
//int TEMPBASAL = 3;
|
||||
int PROFILE = 4;
|
||||
int APS = 5;
|
||||
int PUMP = 6;
|
||||
int CONSTRAINTS = 7;
|
||||
int LOOP = 8;
|
||||
int BGSOURCE = 9;
|
||||
int LAST = 10; // keep always highest number
|
||||
int INSULIN = 10;
|
||||
int LAST = 11; // keep always highest number
|
||||
|
||||
int getType();
|
||||
String getFragmentClass();
|
||||
|
@ -25,6 +26,8 @@ public interface PluginBase {
|
|||
boolean isEnabled(int type);
|
||||
boolean isVisibleInTabs(int type);
|
||||
boolean canBeHidden(int type);
|
||||
boolean hasFragment();
|
||||
boolean showInList(int type);
|
||||
void setFragmentEnabled(int type, boolean fragmentEnabled);
|
||||
void setFragmentVisible(int type, boolean fragmentVisible);
|
||||
}
|
|
@ -2,12 +2,13 @@ package info.nightscout.androidaps.interfaces;
|
|||
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.androidaps.data.ProfileStore;
|
||||
|
||||
/**
|
||||
* Created by mike on 14.06.2016.
|
||||
*/
|
||||
public interface ProfileInterface {
|
||||
@Nullable
|
||||
NSProfile getProfile();
|
||||
ProfileStore getProfile();
|
||||
String getProfileName();
|
||||
}
|
||||
|
|
|
@ -6,29 +6,29 @@ package info.nightscout.androidaps.interfaces;
|
|||
|
||||
public class PumpDescription {
|
||||
public static final int NONE = 0;
|
||||
public static final int PERCENT = 1;
|
||||
public static final int ABSOLUTE = 2;
|
||||
public static final int EXTENDED = 4;
|
||||
public static final int PERCENT = 0x01;
|
||||
public static final int ABSOLUTE = 0x02;
|
||||
|
||||
public boolean isBolusCapable = true;
|
||||
public double bolusStep = 0.1d;
|
||||
|
||||
public boolean isExtendedBolusCapable = true;
|
||||
public double extendedBolusStep = 0.1d;
|
||||
public double extendedBolusDurationStep = 30;
|
||||
public double extendedBolusMaxDuration = 12 * 60;
|
||||
|
||||
public boolean isTempBasalCapable = true;
|
||||
public int lowTempBasalStyle = PERCENT;
|
||||
public int highTempBasalStyle = PERCENT;
|
||||
public double maxHighTempPercent = 200;
|
||||
public double maxHighTempAbsolute = 0; // zero = no limit
|
||||
public double lowTempPercentStep = 10;
|
||||
public double lowTempAbsoluteStep = 0.05d;
|
||||
public int lowTempPercentDuration = 30;
|
||||
public int lowTempAbsoluteDuration = 30;
|
||||
public double highTempPercentStep = 10;
|
||||
public double highTempAbsoluteStep = 0.05d;
|
||||
public int highTempPercentDuration = 30;
|
||||
public int highTempAbsoluteDuration = 30;
|
||||
public int tempBasalStyle = PERCENT;
|
||||
|
||||
public int maxTempPercent = 200;
|
||||
public int tempPercentStep = 10;
|
||||
|
||||
public double maxTempAbsolute = 10;
|
||||
public double tempAbsoluteStep = 0.05d;
|
||||
|
||||
public int tempDurationStep = 60;
|
||||
public int tempMaxDuration = 12 * 60;
|
||||
|
||||
|
||||
public boolean isSetBasalProfileCapable = true;
|
||||
public double basalStep = 0.01d;
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
package info.nightscout.androidaps.interfaces;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||
import info.nightscout.androidaps.db.TempBasal;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
|
||||
/**
|
||||
* Created by mike on 04.06.2016.
|
||||
|
@ -19,27 +17,19 @@ public interface PumpInterface {
|
|||
boolean isSuspended();
|
||||
boolean isBusy();
|
||||
|
||||
boolean isTempBasalInProgress();
|
||||
boolean isExtendedBoluslInProgress();
|
||||
|
||||
// Upload to pump new basal profile
|
||||
int SUCCESS = 0;
|
||||
int FAILED = 1;
|
||||
int NOT_NEEDED = 2;
|
||||
int setNewBasalProfile(NSProfile profile);
|
||||
boolean isThisProfileSet(NSProfile profile);
|
||||
int setNewBasalProfile(Profile profile);
|
||||
boolean isThisProfileSet(Profile profile);
|
||||
|
||||
Date lastDataTime();
|
||||
void refreshDataFromPump(String reason);
|
||||
|
||||
double getBaseBasalRate(); // base basal rate, not temp basal
|
||||
double getTempBasalAbsoluteRate();
|
||||
double getTempBasalRemainingMinutes();
|
||||
TempBasal getTempBasal(Date time);
|
||||
TempBasal getTempBasal();
|
||||
TempBasal getExtendedBolus();
|
||||
|
||||
PumpEnactResult deliverTreatment(Double insulin, Integer carbs, Context context);
|
||||
PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo);
|
||||
void stopBolusDelivering();
|
||||
PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes);
|
||||
PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes);
|
||||
|
@ -56,4 +46,6 @@ public interface PumpInterface {
|
|||
|
||||
// Short info for SMS, Wear etc
|
||||
String shortStatus(boolean veryShort);
|
||||
|
||||
boolean isFakingTempsByExtendedBoluses();
|
||||
}
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
package info.nightscout.androidaps.interfaces;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.db.TempBasal;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
|
||||
/**
|
||||
* Created by mike on 14.06.2016.
|
||||
*/
|
||||
public interface TempBasalsInterface {
|
||||
void updateTotalIOB();
|
||||
IobTotal getLastCalculation();
|
||||
IobTotal getCalculationToTime(long time);
|
||||
|
||||
TempBasal getTempBasal (Date time);
|
||||
TempBasal getExtendedBolus (Date time);
|
||||
|
||||
long oldestDataAvaialable();
|
||||
}
|
|
@ -2,18 +2,63 @@ package info.nightscout.androidaps.interfaces;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.data.MealData;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.data.MealData;
|
||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||
import info.nightscout.androidaps.db.ProfileSwitch;
|
||||
import info.nightscout.androidaps.db.TempTarget;
|
||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
import info.nightscout.androidaps.data.OverlappingIntervals;
|
||||
import info.nightscout.androidaps.data.ProfileIntervals;
|
||||
|
||||
/**
|
||||
* Created by mike on 14.06.2016.
|
||||
*/
|
||||
public interface TreatmentsInterface {
|
||||
|
||||
void updateTotalIOB();
|
||||
IobTotal getLastCalculation();
|
||||
IobTotal getCalculationToTime(long time);
|
||||
void updateTotalIOBTreatments();
|
||||
void updateTotalIOBTempBasals();
|
||||
|
||||
IobTotal getLastCalculationTreatments();
|
||||
IobTotal getCalculationToTimeTreatments(long time);
|
||||
IobTotal getLastCalculationTempBasals();
|
||||
IobTotal getCalculationToTimeTempBasals(long time);
|
||||
|
||||
MealData getMealData();
|
||||
List<Treatment> getTreatments();
|
||||
|
||||
List<Treatment> getTreatmentsFromHistory();
|
||||
List<Treatment> getTreatments5MinBackFromHistory(long time);
|
||||
|
||||
// real basals (not faked by extended bolus)
|
||||
boolean isInHistoryRealTempBasalInProgress();
|
||||
TemporaryBasal getRealTempBasalFromHistory(long time);
|
||||
|
||||
boolean addToHistoryTempBasal(TemporaryBasal tempBasal);
|
||||
|
||||
// basal that can be faked by extended boluses
|
||||
boolean isTempBasalInProgress();
|
||||
TemporaryBasal getTempBasalFromHistory(long time);
|
||||
double getTempBasalAbsoluteRateHistory();
|
||||
double getTempBasalRemainingMinutesFromHistory();
|
||||
OverlappingIntervals<TemporaryBasal> getTemporaryBasalsFromHistory();
|
||||
|
||||
boolean isInHistoryExtendedBoluslInProgress();
|
||||
ExtendedBolus getExtendedBolusFromHistory(long time);
|
||||
OverlappingIntervals<ExtendedBolus> getExtendedBolusesFromHistory();
|
||||
|
||||
boolean addToHistoryExtendedBolus(ExtendedBolus extendedBolus);
|
||||
|
||||
boolean addToHistoryTreatment(DetailedBolusInfo detailedBolusInfo);
|
||||
|
||||
TempTarget getTempTargetFromHistory(long time);
|
||||
OverlappingIntervals<TempTarget> getTempTargetsFromHistory();
|
||||
|
||||
ProfileSwitch getProfileSwitchFromHistory(long time);
|
||||
ProfileIntervals<ProfileSwitch> getProfileSwitchesFromHistory();
|
||||
void addToHistoryProfileSwitch(ProfileSwitch profileSwitch);
|
||||
|
||||
long oldestDataAvailable();
|
||||
|
||||
}
|
||||
|
|
|
@ -3,6 +3,8 @@ package info.nightscout.androidaps.plugins.Actions;
|
|||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.view.LayoutInflater;
|
||||
|
@ -10,24 +12,32 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
|
||||
import com.crashlytics.android.answers.Answers;
|
||||
import com.crashlytics.android.answers.CustomEvent;
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||
import info.nightscout.androidaps.events.EventExtendedBolusChange;
|
||||
import info.nightscout.androidaps.events.EventInitializationChanged;
|
||||
import info.nightscout.androidaps.events.EventRefreshGui;
|
||||
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog;
|
||||
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
|
||||
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
|
||||
import info.nightscout.androidaps.plugins.Actions.dialogs.NewExtendedBolusDialog;
|
||||
import info.nightscout.androidaps.plugins.Actions.dialogs.NewTempBasalDialog;
|
||||
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
|
||||
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
|
||||
import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
|
||||
|
||||
/**
|
||||
* A simple {@link Fragment} subclass.
|
||||
*/
|
||||
public class ActionsFragment extends Fragment implements FragmentBase, View.OnClickListener {
|
||||
public class ActionsFragment extends Fragment implements View.OnClickListener {
|
||||
|
||||
static ActionsPlugin actionsPlugin = new ActionsPlugin();
|
||||
|
||||
|
@ -38,10 +48,20 @@ public class ActionsFragment extends Fragment implements FragmentBase, View.OnCl
|
|||
Button profileSwitch;
|
||||
Button tempTarget;
|
||||
Button extendedBolus;
|
||||
Button extendedBolusCancel;
|
||||
Button tempBasal;
|
||||
Button fill;
|
||||
|
||||
private static Handler sHandler;
|
||||
private static HandlerThread sHandlerThread;
|
||||
|
||||
public ActionsFragment() {
|
||||
super();
|
||||
if (sHandlerThread == null) {
|
||||
sHandlerThread = new HandlerThread(ActionsFragment.class.getSimpleName());
|
||||
sHandlerThread.start();
|
||||
sHandler = new Handler(sHandlerThread.getLooper());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -53,12 +73,14 @@ public class ActionsFragment extends Fragment implements FragmentBase, View.OnCl
|
|||
profileSwitch = (Button) view.findViewById(R.id.actions_profileswitch);
|
||||
tempTarget = (Button) view.findViewById(R.id.actions_temptarget);
|
||||
extendedBolus = (Button) view.findViewById(R.id.actions_extendedbolus);
|
||||
extendedBolusCancel = (Button) view.findViewById(R.id.actions_extendedbolus_cancel);
|
||||
tempBasal = (Button) view.findViewById(R.id.actions_settempbasal);
|
||||
fill = (Button) view.findViewById(R.id.actions_fill);
|
||||
|
||||
profileSwitch.setOnClickListener(this);
|
||||
tempTarget.setOnClickListener(this);
|
||||
extendedBolus.setOnClickListener(this);
|
||||
extendedBolusCancel.setOnClickListener(this);
|
||||
tempBasal.setOnClickListener(this);
|
||||
fill.setOnClickListener(this);
|
||||
|
||||
|
@ -88,21 +110,42 @@ public class ActionsFragment extends Fragment implements FragmentBase, View.OnCl
|
|||
updateGUIIfVisible();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onStatusEvent(final EventExtendedBolusChange ev) {
|
||||
updateGUIIfVisible();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onStatusEvent(final EventTempBasalChange ev) {
|
||||
updateGUIIfVisible();
|
||||
}
|
||||
|
||||
void updateGUIIfVisible() {
|
||||
Activity activity = getActivity();
|
||||
if (activity != null)
|
||||
activity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended())
|
||||
if (MainApp.getConfigBuilder().getActiveProfileInterface().getProfile() == null)
|
||||
return;
|
||||
boolean allowProfileSwitch = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile().getProfileList().size() > 1;
|
||||
if (!MainApp.getConfigBuilder().getPumpDescription().isSetBasalProfileCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || !allowProfileSwitch)
|
||||
profileSwitch.setVisibility(View.GONE);
|
||||
else
|
||||
profileSwitch.setVisibility(View.VISIBLE);
|
||||
if (!MainApp.getConfigBuilder().getPumpDescription().isExtendedBolusCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended())
|
||||
if (!MainApp.getConfigBuilder().getPumpDescription().isExtendedBolusCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress() || MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses())
|
||||
extendedBolus.setVisibility(View.GONE);
|
||||
else
|
||||
else {
|
||||
extendedBolus.setVisibility(View.VISIBLE);
|
||||
if (!MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended())
|
||||
}
|
||||
if (!MainApp.getConfigBuilder().getPumpDescription().isExtendedBolusCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || !MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress() || MainApp.getConfigBuilder().isFakingTempsByExtendedBoluses())
|
||||
extendedBolusCancel.setVisibility(View.GONE);
|
||||
else {
|
||||
extendedBolusCancel.setVisibility(View.VISIBLE);
|
||||
ExtendedBolus running = MainApp.getConfigBuilder().getExtendedBolusFromHistory(new Date().getTime());
|
||||
extendedBolusCancel.setText(MainApp.instance().getString(R.string.cancel) + " " + running.toString());
|
||||
}
|
||||
if (!MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable || !MainApp.getConfigBuilder().isInitialized() || MainApp.getConfigBuilder().isSuspended() || MainApp.getConfigBuilder().isTempBasalInProgress())
|
||||
tempBasal.setVisibility(View.GONE);
|
||||
else
|
||||
tempBasal.setVisibility(View.VISIBLE);
|
||||
|
@ -122,6 +165,7 @@ public class ActionsFragment extends Fragment implements FragmentBase, View.OnCl
|
|||
@Override
|
||||
public void onClick(View view) {
|
||||
FragmentManager manager = getFragmentManager();
|
||||
final PumpInterface pump = MainApp.getConfigBuilder();
|
||||
switch (view.getId()) {
|
||||
case R.id.actions_profileswitch:
|
||||
NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog();
|
||||
|
@ -141,6 +185,17 @@ public class ActionsFragment extends Fragment implements FragmentBase, View.OnCl
|
|||
NewExtendedBolusDialog newExtendedDialog = new NewExtendedBolusDialog();
|
||||
newExtendedDialog.show(manager, "NewExtendedDialog");
|
||||
break;
|
||||
case R.id.actions_extendedbolus_cancel:
|
||||
if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
|
||||
sHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
pump.cancelExtendedBolus();
|
||||
Answers.getInstance().logCustom(new CustomEvent("CancelExtended"));
|
||||
}
|
||||
});
|
||||
}
|
||||
break;
|
||||
case R.id.actions_settempbasal:
|
||||
NewTempBasalDialog newTempDialog = new NewTempBasalDialog();
|
||||
newTempDialog.show(manager, "NewTempDialog");
|
||||
|
|
|
@ -54,6 +54,16 @@ public class ActionsPlugin implements PluginBase {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
if (type == GENERAL) this.fragmentEnabled = fragmentEnabled;
|
||||
|
|
|
@ -26,7 +26,9 @@ import java.text.DecimalFormat;
|
|||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||
import info.nightscout.androidaps.db.Source;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.utils.DecimalFormatter;
|
||||
|
@ -159,7 +161,12 @@ public class FillDialog extends DialogFragment implements OnClickListener {
|
|||
mHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
PumpEnactResult result = pump.deliverTreatment(finalInsulinAfterConstraints, 0, context, false);
|
||||
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
|
||||
detailedBolusInfo.insulin = finalInsulinAfterConstraints;
|
||||
detailedBolusInfo.context = context;
|
||||
detailedBolusInfo.addToTreatments = false;
|
||||
detailedBolusInfo.source = Source.NONE;
|
||||
PumpEnactResult result = pump.deliverTreatment(detailedBolusInfo);
|
||||
if (!result.success) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror));
|
||||
|
|
|
@ -29,15 +29,8 @@ import info.nightscout.utils.SafeParse;
|
|||
|
||||
public class NewExtendedBolusDialog extends DialogFragment implements View.OnClickListener {
|
||||
|
||||
Button okButton;
|
||||
EditText insulinEdit;
|
||||
RadioButton h05Radio;
|
||||
RadioButton h10Radio;
|
||||
RadioButton h20Radio;
|
||||
RadioButton h30Radio;
|
||||
RadioButton h40Radio;
|
||||
|
||||
PlusMinusEditText editInsulin;
|
||||
PlusMinusEditText editDuration;
|
||||
|
||||
Handler mHandler;
|
||||
public static HandlerThread mHandlerThread;
|
||||
|
@ -54,18 +47,16 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli
|
|||
getDialog().setTitle(getString(R.string.overview_extendedbolus_button));
|
||||
|
||||
View view = inflater.inflate(R.layout.overview_newextendedbolus_dialog, container, false);
|
||||
okButton = (Button) view.findViewById(R.id.overview_newextendedbolus_okbutton);
|
||||
insulinEdit = (EditText) view.findViewById(R.id.overview_newextendedbolus_insulin);
|
||||
h05Radio = (RadioButton) view.findViewById(R.id.overview_newextendedbolus_05h);
|
||||
h10Radio = (RadioButton) view.findViewById(R.id.overview_newextendedbolus_1h);
|
||||
h20Radio = (RadioButton) view.findViewById(R.id.overview_newextendedbolus_2h);
|
||||
h30Radio = (RadioButton) view.findViewById(R.id.overview_newextendedbolus_3h);
|
||||
h40Radio = (RadioButton) view.findViewById(R.id.overview_newextendedbolus_4h);
|
||||
|
||||
Double maxInsulin = MainApp.getConfigBuilder().applyBolusConstraints(Constants.bolusOnlyForCheckLimit);
|
||||
editInsulin = new PlusMinusEditText(view, R.id.overview_newextendedbolus_insulin, R.id.overview_newextendedbolus_insulin_plus, R.id.overview_newextendedbolus_insulin_minus, 0d, 0d, maxInsulin, 0.1d, new DecimalFormat("0.00"), false);
|
||||
|
||||
okButton.setOnClickListener(this);
|
||||
double extendedDurationStep = MainApp.getConfigBuilder().getPumpDescription().extendedBolusDurationStep;
|
||||
double extendedMaxDuration = MainApp.getConfigBuilder().getPumpDescription().extendedBolusMaxDuration;
|
||||
editDuration = new PlusMinusEditText(view, R.id.overview_newextendedbolus_duration, R.id.overview_newextendedbolus_duration_plus, R.id.overview_newextendedbolus_duration_minus, extendedDurationStep, extendedDurationStep, extendedMaxDuration, extendedDurationStep, new DecimalFormat("0"), false);
|
||||
|
||||
view.findViewById(R.id.ok).setOnClickListener(this);
|
||||
view.findViewById(R.id.cancel).setOnClickListener(this);
|
||||
return view;
|
||||
}
|
||||
|
||||
|
@ -79,14 +70,10 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli
|
|||
@Override
|
||||
public void onClick(View view) {
|
||||
switch (view.getId()) {
|
||||
case R.id.overview_newextendedbolus_okbutton:
|
||||
case R.id.ok:
|
||||
try {
|
||||
Double insulin = SafeParse.stringToDouble(insulinEdit.getText().toString());
|
||||
int durationInMinutes = 30;
|
||||
if (h10Radio.isChecked()) durationInMinutes = 60;
|
||||
if (h20Radio.isChecked()) durationInMinutes = 120;
|
||||
if (h30Radio.isChecked()) durationInMinutes = 180;
|
||||
if (h40Radio.isChecked()) durationInMinutes = 240;
|
||||
Double insulin = SafeParse.stringToDouble(editInsulin.getText());
|
||||
int durationInMinutes = SafeParse.stringToInt(editDuration.getText());
|
||||
|
||||
String confirmMessage = getString(R.string.setextendedbolusquestion);
|
||||
|
||||
|
@ -130,6 +117,10 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli
|
|||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
break;
|
||||
case R.id.cancel:
|
||||
dismiss();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.Actions.dialogs;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
|
@ -10,45 +11,38 @@ import android.support.v7.app.AlertDialog;
|
|||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.RelativeLayout;
|
||||
|
||||
import com.crashlytics.android.answers.Answers;
|
||||
import com.crashlytics.android.answers.CustomEvent;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||
import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.utils.PlusMinusEditText;
|
||||
import info.nightscout.utils.SafeParse;
|
||||
|
||||
public class NewTempBasalDialog extends DialogFragment implements View.OnClickListener, RadioGroup.OnCheckedChangeListener {
|
||||
|
||||
Button okButton;
|
||||
EditText basalPercentEdit;
|
||||
EditText basalAbsoluteEdit;
|
||||
RadioButton percentRadio;
|
||||
RadioButton absoluteRadio;
|
||||
RadioGroup basalTypeRadioGroup;
|
||||
RadioButton h05Radio;
|
||||
RadioButton h10Radio;
|
||||
RadioButton h20Radio;
|
||||
RadioButton h30Radio;
|
||||
RadioButton h40Radio;
|
||||
RelativeLayout typeSelectorLayout;
|
||||
|
||||
LinearLayout percentLayout;
|
||||
LinearLayout absoluteLayout;
|
||||
|
||||
PlusMinusEditText basalPercentPM;
|
||||
PlusMinusEditText basalAbsolutePM;
|
||||
PlusMinusEditText basalPercent;
|
||||
PlusMinusEditText basalAbsolute;
|
||||
PlusMinusEditText duration;
|
||||
|
||||
Handler mHandler;
|
||||
public static HandlerThread mHandlerThread;
|
||||
|
@ -65,31 +59,50 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
|
|||
getDialog().setTitle(getString(R.string.overview_tempbasal_button));
|
||||
|
||||
View view = inflater.inflate(R.layout.overview_newtempbasal_dialog, container, false);
|
||||
okButton = (Button) view.findViewById(R.id.overview_newtempbasal_okbutton);
|
||||
basalPercentEdit = (EditText) view.findViewById(R.id.overview_newtempbasal_basalpercentinput);
|
||||
basalAbsoluteEdit = (EditText) view.findViewById(R.id.overview_newtempbasal_basalabsoluteinput);
|
||||
|
||||
percentLayout = (LinearLayout) view.findViewById(R.id.overview_newtempbasal_percent_layout);
|
||||
absoluteLayout = (LinearLayout) view.findViewById(R.id.overview_newtempbasal_absolute_layout);
|
||||
percentRadio = (RadioButton) view.findViewById(R.id.overview_newtempbasal_percent_radio);
|
||||
basalTypeRadioGroup = (RadioGroup) view.findViewById(R.id.overview_newtempbasal_radiogroup);
|
||||
absoluteRadio = (RadioButton) view.findViewById(R.id.overview_newtempbasal_absolute_radio);
|
||||
h05Radio = (RadioButton) view.findViewById(R.id.overview_newtempbasal_05h);
|
||||
h10Radio = (RadioButton) view.findViewById(R.id.overview_newtempbasal_1h);
|
||||
h20Radio = (RadioButton) view.findViewById(R.id.overview_newtempbasal_2h);
|
||||
h30Radio = (RadioButton) view.findViewById(R.id.overview_newtempbasal_3h);
|
||||
h40Radio = (RadioButton) view.findViewById(R.id.overview_newtempbasal_4h);
|
||||
typeSelectorLayout = (RelativeLayout) view.findViewById(R.id.overview_newtempbasal_typeselector_layout);
|
||||
|
||||
Integer maxPercent = MainApp.getConfigBuilder().applyBasalConstraints(Constants.basalPercentOnlyForCheckLimit);
|
||||
basalPercentPM = new PlusMinusEditText(view, R.id.overview_newtempbasal_basalpercentinput, R.id.overview_newtempbasal_basalpercent_plus, R.id.overview_newtempbasal_basalpercent_minus, 100d, 0d, (double) maxPercent, 5d, new DecimalFormat("0"), true);
|
||||
PumpDescription pumpDescription = MainApp.getConfigBuilder().getPumpDescription();
|
||||
|
||||
Double maxAbsolute = MainApp.getConfigBuilder().applyBasalConstraints(Constants.basalAbsoluteOnlyForCheckLimit);
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
Double currentBasal = 0d;
|
||||
if (profile != null) currentBasal = profile.getBasal(NSProfile.secondsFromMidnight());
|
||||
basalAbsolutePM = new PlusMinusEditText(view, R.id.overview_newtempbasal_basalabsoluteinput, R.id.overview_newtempbasal_basalabsolute_plus, R.id.overview_newtempbasal_basalabsolute_minus, currentBasal, 0d, maxAbsolute, 0.05d, new DecimalFormat("0.00"), true);
|
||||
basalPercent = new PlusMinusEditText(view, R.id.overview_newtempbasal_basalpercentinput, R.id.overview_newtempbasal_basalpercent_plus, R.id.overview_newtempbasal_basalpercent_minus,
|
||||
100d, 0d, (double) pumpDescription.maxTempPercent, (double) pumpDescription.tempPercentStep, new DecimalFormat("0"), true);
|
||||
|
||||
absoluteLayout.setVisibility(View.GONE);
|
||||
okButton.setOnClickListener(this);
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile();
|
||||
Double currentBasal = profile.getBasal();
|
||||
basalAbsolute = new PlusMinusEditText(view, R.id.overview_newtempbasal_basalabsoluteinput, R.id.overview_newtempbasal_basalabsolute_plus, R.id.overview_newtempbasal_basalabsolute_minus,
|
||||
currentBasal, 0d, pumpDescription.maxTempAbsolute, pumpDescription.tempAbsoluteStep, new DecimalFormat("0.00"), true);
|
||||
|
||||
double tempDurationStep = MainApp.getConfigBuilder().getPumpDescription().tempDurationStep;
|
||||
double tempMaxDuration = MainApp.getConfigBuilder().getPumpDescription().tempMaxDuration;
|
||||
duration = new PlusMinusEditText(view, R.id.overview_newtempbasal_duration, R.id.overview_newtempbasal_duration_plus, R.id.overview_newtempbasal_duration_minus,
|
||||
tempDurationStep, tempDurationStep, tempMaxDuration, tempDurationStep, new DecimalFormat("0"), false);
|
||||
|
||||
if ((pumpDescription.tempBasalStyle & PumpDescription.PERCENT) == PumpDescription.PERCENT && (pumpDescription.tempBasalStyle & PumpDescription.ABSOLUTE) == PumpDescription.ABSOLUTE) {
|
||||
// Both allowed
|
||||
typeSelectorLayout.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
typeSelectorLayout.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if ((pumpDescription.tempBasalStyle & PumpDescription.PERCENT) == PumpDescription.PERCENT) {
|
||||
percentRadio.setChecked(true);
|
||||
absoluteRadio.setChecked(false);
|
||||
percentLayout.setVisibility(View.VISIBLE);
|
||||
absoluteLayout.setVisibility(View.GONE);
|
||||
} else if ((pumpDescription.tempBasalStyle & PumpDescription.ABSOLUTE) == PumpDescription.ABSOLUTE) {
|
||||
percentRadio.setChecked(false);
|
||||
absoluteRadio.setChecked(true);
|
||||
percentLayout.setVisibility(View.GONE);
|
||||
absoluteLayout.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
view.findViewById(R.id.ok).setOnClickListener(this);
|
||||
view.findViewById(R.id.cancel).setOnClickListener(this);
|
||||
basalTypeRadioGroup.setOnCheckedChangeListener(this);
|
||||
return view;
|
||||
}
|
||||
|
@ -104,36 +117,32 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
|
|||
@Override
|
||||
public void onClick(View view) {
|
||||
switch (view.getId()) {
|
||||
case R.id.overview_newtempbasal_okbutton:
|
||||
case R.id.ok:
|
||||
try {
|
||||
int basalPercent = 0;
|
||||
Double basalAbsolute = 0d;
|
||||
int percent = 0;
|
||||
Double absolute = 0d;
|
||||
final boolean setAsPercent = percentRadio.isChecked();
|
||||
int durationInMinutes = 30;
|
||||
if (h10Radio.isChecked()) durationInMinutes = 60;
|
||||
if (h20Radio.isChecked()) durationInMinutes = 120;
|
||||
if (h30Radio.isChecked()) durationInMinutes = 180;
|
||||
if (h40Radio.isChecked()) durationInMinutes = 240;
|
||||
int durationInMinutes = SafeParse.stringToInt(duration.getText());
|
||||
|
||||
String confirmMessage = getString(R.string.setbasalquestion);
|
||||
if (setAsPercent) {
|
||||
int basalPercentInput = SafeParse.stringToDouble(basalPercentEdit.getText().toString()).intValue();
|
||||
basalPercent = MainApp.getConfigBuilder().applyBasalConstraints(basalPercentInput);
|
||||
confirmMessage += "\n" + basalPercent + "% ";
|
||||
int basalPercentInput = SafeParse.stringToInt(basalPercent.getText());
|
||||
percent = MainApp.getConfigBuilder().applyBasalConstraints(basalPercentInput);
|
||||
confirmMessage += "\n" + percent + "% ";
|
||||
confirmMessage += "\n" + getString(R.string.duration) + " " + durationInMinutes + "min ?";
|
||||
if (basalPercent != basalPercentInput)
|
||||
if (percent != basalPercentInput)
|
||||
confirmMessage += "\n" + getString(R.string.constraintapllied);
|
||||
} else {
|
||||
Double basalAbsoluteInput = SafeParse.stringToDouble(basalAbsoluteEdit.getText().toString());
|
||||
basalAbsolute = MainApp.getConfigBuilder().applyBasalConstraints(basalAbsoluteInput);
|
||||
confirmMessage += "\n" + basalAbsolute + " U/h ";
|
||||
Double basalAbsoluteInput = SafeParse.stringToDouble(basalAbsolute.getText());
|
||||
absolute = MainApp.getConfigBuilder().applyBasalConstraints(basalAbsoluteInput);
|
||||
confirmMessage += "\n" + absolute + " U/h ";
|
||||
confirmMessage += "\n" + getString(R.string.duration) + " " + durationInMinutes + "min ?";
|
||||
if (basalAbsolute - basalAbsoluteInput != 0d)
|
||||
if (absolute - basalAbsoluteInput != 0d)
|
||||
confirmMessage += "\n" + getString(R.string.constraintapllied);
|
||||
}
|
||||
|
||||
final int finalBasalPercent = basalPercent;
|
||||
final Double finalBasal = basalAbsolute;
|
||||
final int finalBasalPercent = percent;
|
||||
final Double finalBasal = absolute;
|
||||
final int finalDurationInMinutes = durationInMinutes;
|
||||
|
||||
final Context context = getContext();
|
||||
|
@ -153,6 +162,12 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
|
|||
result = pump.setTempBasalAbsolute(finalBasal, finalDurationInMinutes);
|
||||
}
|
||||
if (!result.success) {
|
||||
if (context instanceof Activity) {
|
||||
Activity activity = (Activity) context;
|
||||
if (activity.isFinishing()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
builder.setTitle(MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
|
||||
builder.setMessage(result.comment);
|
||||
|
@ -171,6 +186,10 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
|
|||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
break;
|
||||
case R.id.cancel:
|
||||
dismiss();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,21 +1,32 @@
|
|||
package info.nightscout.androidaps.plugins.Careportal;
|
||||
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||
import info.nightscout.androidaps.db.CareportalEvent;
|
||||
import info.nightscout.androidaps.events.EventCareportalEventChange;
|
||||
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
|
||||
|
||||
public class CareportalFragment extends Fragment implements FragmentBase, View.OnClickListener {
|
||||
public class CareportalFragment extends Fragment implements View.OnClickListener {
|
||||
|
||||
static CareportalPlugin careportalPlugin;
|
||||
|
||||
TextView iage;
|
||||
TextView cage;
|
||||
TextView sage;
|
||||
TextView pbage;
|
||||
|
||||
static public CareportalPlugin getPlugin() {
|
||||
if (careportalPlugin == null) {
|
||||
careportalPlugin = new CareportalPlugin();
|
||||
|
@ -24,25 +35,26 @@ public class CareportalFragment extends Fragment implements FragmentBase, View.O
|
|||
}
|
||||
|
||||
// bg,insulin,carbs,prebolus,duration,percent,absolute,profile,split,temptarget
|
||||
final OptionsToShow bgcheck = new OptionsToShow(R.id.careportal_bgcheck, R.string.careportal_bgcheck, true, true, true, false, false, false, false, false, false, false);
|
||||
final OptionsToShow snackbolus = new OptionsToShow(R.id.careportal_snackbolus, R.string.careportal_snackbolus, true, true, true, true, false, false, false, false, false, false);
|
||||
final OptionsToShow mealbolus = new OptionsToShow(R.id.careportal_mealbolus, R.string.careportal_mealbolus, true, true, true, true, false, false, false, false, false, false);
|
||||
final OptionsToShow correctionbolus = new OptionsToShow(R.id.careportal_correctionbolus, R.string.careportal_correctionbolus, true, true, true, true, false, false, false, false, false, false);
|
||||
final OptionsToShow carbcorrection = new OptionsToShow(R.id.careportal_carbscorrection, R.string.careportal_carbscorrection, true, false, true, false, false, false, false, false, false, false);
|
||||
final OptionsToShow combobolus = new OptionsToShow(R.id.careportal_combobolus, R.string.careportal_combobolus, true, true, true, true, true, false, false, false, true, false);
|
||||
final OptionsToShow announcement = new OptionsToShow(R.id.careportal_announcement, R.string.careportal_announcement, true, false, false, false, false, false, false, false, false, false);
|
||||
final OptionsToShow note = new OptionsToShow(R.id.careportal_note, R.string.careportal_note, true, false, false, false, true, false, false, false, false, false);
|
||||
final OptionsToShow question = new OptionsToShow(R.id.careportal_question, R.string.careportal_question, true, false, false, false, false, false, false, false, false, false);
|
||||
final OptionsToShow exercise = new OptionsToShow(R.id.careportal_exercise, R.string.careportal_exercise, false, false, false, false, true, false, false, false, false, false);
|
||||
final OptionsToShow sitechange = new OptionsToShow(R.id.careportal_pumpsitechange, R.string.careportal_pumpsitechange, true, true, false, false, false, false, false, false, false, false);
|
||||
final OptionsToShow sensorstart = new OptionsToShow(R.id.careportal_cgmsensorstart, R.string.careportal_cgmsensorstart, true, false, false, false, false, false, false, false, false, false);
|
||||
final OptionsToShow sensorchange = new OptionsToShow(R.id.careportal_cgmsensorinsert, R.string.careportal_cgmsensorinsert, true, false, false, false, false, false, false, false, false, false);
|
||||
final OptionsToShow insulinchange = new OptionsToShow(R.id.careportal_insulincartridgechange, R.string.careportal_insulincartridgechange, true, false, false, false, false, false, false, false, false, false);
|
||||
final OptionsToShow tempbasalstart = new OptionsToShow(R.id.careportal_tempbasalstart, R.string.careportal_tempbasalstart, true, false, false, false, true, true, true, false, false, false);
|
||||
final OptionsToShow tempbasalend = new OptionsToShow(R.id.careportal_tempbasalend, R.string.careportal_tempbasalend, true, false, false, false, false, false, false, false, false, false);
|
||||
final OptionsToShow profileswitch = new OptionsToShow(R.id.careportal_profileswitch, R.string.careportal_profileswitch, true, false, false, false, false, false, false, true, false, false);
|
||||
final OptionsToShow openapsoffline = new OptionsToShow(R.id.careportal_openapsoffline, R.string.careportal_openapsoffline, false, false, false, false, true, false, false, false, false, false);
|
||||
final OptionsToShow temptarget = new OptionsToShow(R.id.careportal_temporarytarget, R.string.careportal_temporarytarget, false, false, false, false, true, false, false, false, false, true);
|
||||
static final OptionsToShow bgcheck = new OptionsToShow(R.id.careportal_bgcheck, R.string.careportal_bgcheck, true, true, true, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow snackbolus = new OptionsToShow(R.id.careportal_snackbolus, R.string.careportal_snackbolus, true, true, true, true, false, false, false, false, false, false);
|
||||
static final OptionsToShow mealbolus = new OptionsToShow(R.id.careportal_mealbolus, R.string.careportal_mealbolus, true, true, true, true, false, false, false, false, false, false);
|
||||
static final OptionsToShow correctionbolus = new OptionsToShow(R.id.careportal_correctionbolus, R.string.careportal_correctionbolus, true, true, true, true, false, false, false, false, false, false);
|
||||
static final OptionsToShow carbcorrection = new OptionsToShow(R.id.careportal_carbscorrection, R.string.careportal_carbscorrection, true, false, true, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow combobolus = new OptionsToShow(R.id.careportal_combobolus, R.string.careportal_combobolus, true, true, true, true, true, false, false, false, true, false);
|
||||
static final OptionsToShow announcement = new OptionsToShow(R.id.careportal_announcement, R.string.careportal_announcement, true, false, false, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow note = new OptionsToShow(R.id.careportal_note, R.string.careportal_note, true, false, false, false, true, false, false, false, false, false);
|
||||
static final OptionsToShow question = new OptionsToShow(R.id.careportal_question, R.string.careportal_question, true, false, false, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow exercise = new OptionsToShow(R.id.careportal_exercise, R.string.careportal_exercise, false, false, false, false, true, false, false, false, false, false);
|
||||
static final OptionsToShow sitechange = new OptionsToShow(R.id.careportal_pumpsitechange, R.string.careportal_pumpsitechange, true, true, false, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow sensorstart = new OptionsToShow(R.id.careportal_cgmsensorstart, R.string.careportal_cgmsensorstart, true, false, false, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow sensorchange = new OptionsToShow(R.id.careportal_cgmsensorinsert, R.string.careportal_cgmsensorinsert, true, false, false, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow insulinchange = new OptionsToShow(R.id.careportal_insulincartridgechange, R.string.careportal_insulincartridgechange, true, false, false, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow pumpbatterychange = new OptionsToShow(R.id.careportal_pumpbatterychange, R.string.careportal_pumpbatterychange, true, false, false, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow tempbasalstart = new OptionsToShow(R.id.careportal_tempbasalstart, R.string.careportal_tempbasalstart, true, false, false, false, true, true, true, false, false, false);
|
||||
static final OptionsToShow tempbasalend = new OptionsToShow(R.id.careportal_tempbasalend, R.string.careportal_tempbasalend, true, false, false, false, false, false, false, false, false, false);
|
||||
static final OptionsToShow profileswitch = new OptionsToShow(R.id.careportal_profileswitch, R.string.careportal_profileswitch, true, false, false, false, true, false, false, true, false, false);
|
||||
static final OptionsToShow openapsoffline = new OptionsToShow(R.id.careportal_openapsoffline, R.string.careportal_openapsoffline, false, false, false, false, true, false, false, false, false, false);
|
||||
static final OptionsToShow temptarget = new OptionsToShow(R.id.careportal_temporarytarget, R.string.careportal_temporarytarget, false, false, false, false, true, false, false, false, false, true);
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
|
@ -58,6 +70,7 @@ public class CareportalFragment extends Fragment implements FragmentBase, View.O
|
|||
view.findViewById(R.id.careportal_carbscorrection).setOnClickListener(this);
|
||||
view.findViewById(R.id.careportal_exercise).setOnClickListener(this);
|
||||
view.findViewById(R.id.careportal_insulincartridgechange).setOnClickListener(this);
|
||||
view.findViewById(R.id.careportal_pumpbatterychange).setOnClickListener(this);
|
||||
view.findViewById(R.id.careportal_mealbolus).setOnClickListener(this);
|
||||
view.findViewById(R.id.careportal_note).setOnClickListener(this);
|
||||
view.findViewById(R.id.careportal_profileswitch).setOnClickListener(this);
|
||||
|
@ -68,14 +81,24 @@ public class CareportalFragment extends Fragment implements FragmentBase, View.O
|
|||
view.findViewById(R.id.careportal_tempbasalstart).setOnClickListener(this);
|
||||
view.findViewById(R.id.careportal_openapsoffline).setOnClickListener(this);
|
||||
view.findViewById(R.id.careportal_temporarytarget).setOnClickListener(this);
|
||||
|
||||
iage = (TextView) view.findViewById(R.id.careportal_insulinage);
|
||||
cage = (TextView) view.findViewById(R.id.careportal_canulaage);
|
||||
sage = (TextView) view.findViewById(R.id.careportal_sensorage);
|
||||
pbage = (TextView) view.findViewById(R.id.careportal_pbage);
|
||||
|
||||
updateGUI();
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
FragmentManager manager = getFragmentManager();
|
||||
action(view.getId(), getFragmentManager());
|
||||
}
|
||||
|
||||
public static void action(int id, FragmentManager manager) {
|
||||
NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog();
|
||||
switch (view.getId()) {
|
||||
switch (id) {
|
||||
case R.id.careportal_bgcheck:
|
||||
newDialog.setOptions(bgcheck);
|
||||
break;
|
||||
|
@ -103,6 +126,9 @@ public class CareportalFragment extends Fragment implements FragmentBase, View.O
|
|||
case R.id.careportal_insulincartridgechange:
|
||||
newDialog.setOptions(insulinchange);
|
||||
break;
|
||||
case R.id.careportal_pumpbatterychange:
|
||||
newDialog.setOptions(pumpbatterychange);
|
||||
break;
|
||||
case R.id.careportal_mealbolus:
|
||||
newDialog.setOptions(mealbolus);
|
||||
break;
|
||||
|
@ -140,4 +166,55 @@ public class CareportalFragment extends Fragment implements FragmentBase, View.O
|
|||
newDialog.show(manager, "NewNSTreatmentDialog");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
MainApp.bus().unregister(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
MainApp.bus().register(this);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onStatusEvent(final EventCareportalEventChange c) {
|
||||
updateGUI();
|
||||
}
|
||||
|
||||
void updateGUI() {
|
||||
Activity activity = getActivity();
|
||||
updateAge(activity, sage, iage, cage, pbage);
|
||||
}
|
||||
|
||||
public static void updateAge(Activity activity, final TextView sage, final TextView iage, final TextView cage, final TextView pbage) {
|
||||
if (activity != null) {
|
||||
activity.runOnUiThread(
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
CareportalEvent careportalEvent;
|
||||
if (sage != null) {
|
||||
careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE);
|
||||
sage.setText(careportalEvent != null ? careportalEvent.age() : MainApp.sResources.getString(R.string.notavailable));
|
||||
}
|
||||
if (iage != null) {
|
||||
careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE);
|
||||
iage.setText(careportalEvent != null ? careportalEvent.age() : MainApp.sResources.getString(R.string.notavailable));
|
||||
}
|
||||
if (cage != null) {
|
||||
careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE);
|
||||
cage.setText(careportalEvent != null ? careportalEvent.age() : MainApp.sResources.getString(R.string.notavailable));
|
||||
}
|
||||
if (pbage != null) {
|
||||
careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE);
|
||||
pbage.setText(careportalEvent != null ? careportalEvent.age() : MainApp.sResources.getString(R.string.notavailable));
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.Careportal;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
|
@ -50,6 +51,16 @@ public class CareportalPlugin implements PluginBase {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return !Config.NSCLIENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
if (type == GENERAL) this.fragmentEnabled = fragmentEnabled;
|
||||
|
|
|
@ -7,7 +7,6 @@ import android.os.Bundle;
|
|||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
|
@ -21,12 +20,12 @@ import android.widget.CompoundButton;
|
|||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.crashlytics.android.answers.Answers;
|
||||
import com.crashlytics.android.answers.CustomEvent;
|
||||
import com.j256.ormlite.dao.Dao;
|
||||
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
|
||||
import com.wdullaer.materialdatetimepicker.time.RadialPickerLayout;
|
||||
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
|
||||
|
@ -36,7 +35,6 @@ import org.json.JSONObject;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
|
@ -46,45 +44,50 @@ import info.nightscout.androidaps.Constants;
|
|||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.GlucoseStatus;
|
||||
import info.nightscout.androidaps.db.CareportalEvent;
|
||||
import info.nightscout.androidaps.db.ProfileSwitch;
|
||||
import info.nightscout.androidaps.db.Source;
|
||||
import info.nightscout.androidaps.db.TempTarget;
|
||||
import info.nightscout.androidaps.events.EventNewBasalProfile;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
|
||||
import info.nightscout.androidaps.plugins.CircadianPercentageProfile.CircadianPercentageProfilePlugin;
|
||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.androidaps.plugins.TempTargetRange.events.EventTempTargetRangeChange;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.data.ProfileStore;
|
||||
import info.nightscout.androidaps.plugins.ProfileCircadianPercentage.CircadianPercentageProfilePlugin;
|
||||
import info.nightscout.utils.DateUtil;
|
||||
import info.nightscout.utils.NSUpload;
|
||||
import info.nightscout.utils.PlusMinusEditText;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.SafeParse;
|
||||
import info.nightscout.utils.ToastUtils;
|
||||
import info.nightscout.utils.Translator;
|
||||
|
||||
public class NewNSTreatmentDialog extends DialogFragment implements View.OnClickListener, DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener {
|
||||
private static Logger log = LoggerFactory.getLogger(NewNSTreatmentDialog.class);
|
||||
|
||||
private FragmentActivity context;
|
||||
private Activity context;
|
||||
|
||||
private static OptionsToShow options;
|
||||
|
||||
NSProfile profile;
|
||||
Profile profile;
|
||||
ProfileStore profileStore;
|
||||
String units;
|
||||
|
||||
LinearLayout layoutBg;
|
||||
RelativeLayout layoutBg;
|
||||
LinearLayout layoutBgSource;
|
||||
LinearLayout layoutInsulin;
|
||||
LinearLayout layoutCarbs;
|
||||
LinearLayout layoutSplit;
|
||||
LinearLayout layoutDuration;
|
||||
LinearLayout layoutPercent;
|
||||
LinearLayout layoutAbsolute;
|
||||
LinearLayout layoutCarbTime;
|
||||
LinearLayout layoutProfile;
|
||||
RelativeLayout layoutInsulin;
|
||||
RelativeLayout layoutCarbs;
|
||||
RelativeLayout layoutSplit;
|
||||
RelativeLayout layoutDuration;
|
||||
RelativeLayout layoutPercent;
|
||||
RelativeLayout layoutAbsolute;
|
||||
RelativeLayout layoutCarbTime;
|
||||
RelativeLayout layoutProfile;
|
||||
LinearLayout layoutTempTarget;
|
||||
Button dateButton;
|
||||
Button timeButton;
|
||||
Button okButton;
|
||||
Button cancelButton;
|
||||
|
||||
TextView bgUnitsView;
|
||||
RadioButton meterRadioButton;
|
||||
|
@ -134,7 +137,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
context = (FragmentActivity) activity;
|
||||
context = activity;
|
||||
super.onAttach(activity);
|
||||
}
|
||||
|
||||
|
@ -142,18 +145,19 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
getDialog().setTitle(getString(options.eventName));
|
||||
setStyle(DialogFragment.STYLE_NORMAL, getTheme());
|
||||
View view = inflater.inflate(R.layout.careportal_newnstreatment_dialog, container, false);
|
||||
|
||||
layoutBg = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_bg_layout);
|
||||
layoutBg = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_bg_layout);
|
||||
layoutBgSource = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_bgsource_layout);
|
||||
layoutInsulin = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_insulin_layout);
|
||||
layoutCarbs = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_carbs_layout);
|
||||
layoutSplit = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_split_layout);
|
||||
layoutDuration = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_duration_layout);
|
||||
layoutPercent = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_percent_layout);
|
||||
layoutAbsolute = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_absolute_layout);
|
||||
layoutCarbTime = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_carbtime_layout);
|
||||
layoutProfile = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_profile_layout);
|
||||
layoutInsulin = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_insulin_layout);
|
||||
layoutCarbs = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_carbs_layout);
|
||||
layoutSplit = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_split_layout);
|
||||
layoutDuration = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_duration_layout);
|
||||
layoutPercent = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_percent_layout);
|
||||
layoutAbsolute = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_absolute_layout);
|
||||
layoutCarbTime = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_carbtime_layout);
|
||||
layoutProfile = (RelativeLayout) view.findViewById(R.id.careportal_newnstreatment_profile_layout);
|
||||
layoutTempTarget = (LinearLayout) view.findViewById(R.id.careportal_newnstreatment_temptarget_layout);
|
||||
|
||||
bgUnitsView = (TextView) view.findViewById(R.id.careportal_newnstreatment_bgunits);
|
||||
|
@ -218,30 +222,25 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
dateButton.setOnClickListener(this);
|
||||
timeButton.setOnClickListener(this);
|
||||
|
||||
okButton = (Button) view.findViewById(R.id.careportal_newnstreatment_ok);
|
||||
okButton = (Button) view.findViewById(R.id.ok);
|
||||
okButton.setOnClickListener(this);
|
||||
cancelButton = (Button) view.findViewById(R.id.cancel);
|
||||
cancelButton.setOnClickListener(this);
|
||||
|
||||
// profile
|
||||
profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
profile = MainApp.getConfigBuilder().getProfile();
|
||||
profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile();
|
||||
ArrayList<CharSequence> profileList;
|
||||
units = Constants.MGDL;
|
||||
if (profile == null) {
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), context.getString(R.string.noprofile));
|
||||
profileList = new ArrayList<CharSequence>();
|
||||
} else {
|
||||
units = profile.getUnits();
|
||||
profileList = profile.getProfileList();
|
||||
}
|
||||
units = profile.getUnits();
|
||||
profileList = profileStore.getProfileList();
|
||||
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(),
|
||||
android.R.layout.simple_spinner_item, profileList);
|
||||
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
R.layout.spinner_centered, profileList);
|
||||
profileSpinner.setAdapter(adapter);
|
||||
if (profile != null) {
|
||||
// set selected to actual profile
|
||||
for (int p = 0; p < profileList.size(); p++) {
|
||||
if (profileList.get(p).equals(profile.getActiveProfile()))
|
||||
profileSpinner.setSelection(p);
|
||||
}
|
||||
// set selected to actual profile
|
||||
for (int p = 0; p < profileList.size(); p++) {
|
||||
if (profileList.get(p).equals(MainApp.getConfigBuilder().getProfileName()))
|
||||
profileSpinner.setSelection(p);
|
||||
}
|
||||
|
||||
// temp target
|
||||
|
@ -250,8 +249,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
reasonList.add(MainApp.sResources.getString(R.string.activity));
|
||||
reasonList.add(MainApp.sResources.getString(R.string.manual));
|
||||
ArrayAdapter<CharSequence> adapterReason = new ArrayAdapter<CharSequence>(getContext(),
|
||||
android.R.layout.simple_spinner_item, reasonList);
|
||||
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
R.layout.spinner_centered, reasonList);
|
||||
reasonSpinner.setAdapter(adapterReason);
|
||||
|
||||
// bg
|
||||
|
@ -267,7 +265,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
// meterRadioButton.setChecked(true);
|
||||
// }
|
||||
|
||||
Double bg = NSProfile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, profile != null ? profile.getUnits() : Constants.MGDL);
|
||||
Double bg = Profile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, profile != null ? profile.getUnits() : Constants.MGDL);
|
||||
if (profile == null)
|
||||
editBg = new PlusMinusEditText(view, R.id.careportal_newnstreatment_bginput, R.id.careportal_newnstreatment_bg_plus, R.id.careportal_newnstreatment_bg_minus, bg, 0d, 500d, 0.1d, new DecimalFormat("0.0"), false);
|
||||
else if (profile.getUnits().equals(Constants.MMOL))
|
||||
|
@ -276,9 +274,11 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
editBg = new PlusMinusEditText(view, R.id.careportal_newnstreatment_bginput, R.id.careportal_newnstreatment_bg_plus, R.id.careportal_newnstreatment_bg_minus, bg, 0d, 500d, 1d, new DecimalFormat("0"), false);
|
||||
bgInputEdit.addTextChangedListener(new TextWatcher() {
|
||||
|
||||
public void afterTextChanged(Editable s) {}
|
||||
public void afterTextChanged(Editable s) {
|
||||
}
|
||||
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
}
|
||||
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||
if (sensorRadioButton.isChecked()) meterRadioButton.setChecked(true);
|
||||
|
@ -287,9 +287,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
sensorRadioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile();
|
||||
if (profile == null) return;
|
||||
Double bg = NSProfile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, profile.getUnits());
|
||||
Double bg = Profile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, profile.getUnits());
|
||||
editBg.setValue(bg);
|
||||
}
|
||||
});
|
||||
|
@ -361,14 +359,17 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
tpd.dismissOnPause(true);
|
||||
tpd.show(context.getFragmentManager(), "Timepickerdialog");
|
||||
break;
|
||||
case R.id.careportal_newnstreatment_ok:
|
||||
case R.id.ok:
|
||||
createNSTreatment();
|
||||
dismiss();
|
||||
break;
|
||||
case R.id.cancel:
|
||||
dismiss();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void showOrHide(LinearLayout layout, boolean visible) {
|
||||
private void showOrHide(ViewGroup layout, boolean visible) {
|
||||
if (visible) layout.setVisibility(View.VISIBLE);
|
||||
else layout.setVisibility(View.GONE);
|
||||
}
|
||||
|
@ -398,14 +399,14 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
data.put("created_at", DateUtil.toISOString(eventTime));
|
||||
switch (options.eventType) {
|
||||
case R.id.careportal_bgcheck:
|
||||
data.put("eventType", "BG Check");
|
||||
data.put("eventType", CareportalEvent.BGCHECK);
|
||||
break;
|
||||
case R.id.careportal_announcement:
|
||||
data.put("eventType", "Announcement");
|
||||
data.put("eventType", CareportalEvent.ANNOUNCEMENT);
|
||||
data.put("isAnnouncement", true);
|
||||
break;
|
||||
case R.id.careportal_cgmsensorinsert:
|
||||
data.put("eventType", "Sensor Change");
|
||||
data.put("eventType", CareportalEvent.SENSORCHANGE);
|
||||
break;
|
||||
case R.id.careportal_cgmsensorstart:
|
||||
data.put("eventType", "Sensor Start");
|
||||
|
@ -413,7 +414,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
case R.id.careportal_combobolus:
|
||||
data.put("splitNow", SafeParse.stringToDouble(splitEdit.getText().toString()));
|
||||
data.put("splitExt", 100 - SafeParse.stringToDouble(splitEdit.getText().toString()));
|
||||
data.put("eventType", "Combo Bolus");
|
||||
data.put("eventType", CareportalEvent.COMBOBOLUS);
|
||||
break;
|
||||
case R.id.careportal_correctionbolus:
|
||||
data.put("eventType", "Correction Bolus");
|
||||
|
@ -422,40 +423,44 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
data.put("eventType", "Carb Correction");
|
||||
break;
|
||||
case R.id.careportal_exercise:
|
||||
data.put("eventType", "Exercise");
|
||||
data.put("eventType", CareportalEvent.EXERCISE);
|
||||
break;
|
||||
case R.id.careportal_insulincartridgechange:
|
||||
data.put("eventType", "Insulin Change");
|
||||
data.put("eventType", CareportalEvent.INSULINCHANGE);
|
||||
break;
|
||||
case R.id.careportal_pumpbatterychange:
|
||||
data.put("eventType", CareportalEvent.PUMPBATTERYCHANGE);
|
||||
break;
|
||||
case R.id.careportal_mealbolus:
|
||||
data.put("eventType", "Meal Bolus");
|
||||
break;
|
||||
case R.id.careportal_note:
|
||||
data.put("eventType", "Note");
|
||||
data.put("eventType", CareportalEvent.NOTE);
|
||||
break;
|
||||
case R.id.careportal_profileswitch:
|
||||
data.put("eventType", "Profile Switch");
|
||||
data.put("eventType", CareportalEvent.PROFILESWITCH);
|
||||
allowZeroDuration = true;
|
||||
break;
|
||||
case R.id.careportal_pumpsitechange:
|
||||
data.put("eventType", "Site Change");
|
||||
data.put("eventType", CareportalEvent.SITECHANGE);
|
||||
break;
|
||||
case R.id.careportal_question:
|
||||
data.put("eventType", "Question");
|
||||
data.put("eventType", CareportalEvent.QUESTION);
|
||||
break;
|
||||
case R.id.careportal_snackbolus:
|
||||
data.put("eventType", "Snack Bolus");
|
||||
break;
|
||||
case R.id.careportal_tempbasalstart:
|
||||
data.put("eventType", "Temp Basal");
|
||||
data.put("eventType", CareportalEvent.TEMPBASAL);
|
||||
break;
|
||||
case R.id.careportal_tempbasalend:
|
||||
data.put("eventType", "Temp Basal");
|
||||
data.put("eventType", CareportalEvent.TEMPBASAL);
|
||||
break;
|
||||
case R.id.careportal_openapsoffline:
|
||||
data.put("eventType", "OpenAPS Offline");
|
||||
data.put("eventType", CareportalEvent.OPENAPSOFFLINE);
|
||||
break;
|
||||
case R.id.careportal_temporarytarget:
|
||||
data.put("eventType", "Temporary Target");
|
||||
data.put("eventType", CareportalEvent.TEMPORARYTARGET);
|
||||
if (!reasonSpinner.getSelectedItem().toString().equals(""))
|
||||
data.put("reason", reasonSpinner.getSelectedItem().toString());
|
||||
if (SafeParse.stringToDouble(low.getText().toString()) != 0d)
|
||||
|
@ -611,24 +616,30 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
String profile = data.getString("profile");
|
||||
NSProfile nsProfile = ConfigBuilderPlugin.getActiveProfile().getProfile();
|
||||
nsProfile.setActiveProfile(profile);
|
||||
String profileName = data.getString("profile");
|
||||
ProfileSwitch profileSwitch = new ProfileSwitch();
|
||||
profileSwitch.date = new Date().getTime();
|
||||
profileSwitch.source = Source.PUMP;
|
||||
profileSwitch.profileName = profileName;
|
||||
profileSwitch.profileJson = profileStore.getSpecificProfile(profileName).toString();
|
||||
profileSwitch.profilePlugin = MainApp.getConfigBuilder().getActiveProfileInterface().getClass().getName();
|
||||
profileSwitch.durationInMinutes = data.getInt("duration");
|
||||
if (ConfigBuilderPlugin.getActiveProfileInterface() instanceof CircadianPercentageProfilePlugin) {
|
||||
CircadianPercentageProfilePlugin cpp = (CircadianPercentageProfilePlugin) MainApp.getConfigBuilder().getActiveProfileInterface();
|
||||
profileSwitch.isCPP = true;
|
||||
profileSwitch.timeshift = cpp.timeshift;
|
||||
profileSwitch.percentage = cpp.percentage;
|
||||
}
|
||||
MainApp.getConfigBuilder().addToHistoryProfileSwitch(profileSwitch);
|
||||
|
||||
PumpInterface pump = MainApp.getConfigBuilder();
|
||||
if (pump != null) {
|
||||
pump.setNewBasalProfile(nsProfile);
|
||||
pump.setNewBasalProfile(profileStore.getSpecificProfile(profileName));
|
||||
log.debug("Setting new profile: " + profile);
|
||||
MainApp.bus().post(new EventNewBasalProfile(nsProfile));
|
||||
MainApp.bus().post(new EventNewBasalProfile());
|
||||
} else {
|
||||
log.error("No active pump selected");
|
||||
}
|
||||
if (ConfigBuilderPlugin.getActiveProfile() instanceof CircadianPercentageProfilePlugin) {
|
||||
CircadianPercentageProfilePlugin cpp = (CircadianPercentageProfilePlugin) ConfigBuilderPlugin.getActiveProfile();
|
||||
data.put("CircadianPercentageProfile", true);
|
||||
data.put("timeshift", cpp.timeshift);
|
||||
data.put("percentage", cpp.percentage);
|
||||
}
|
||||
ConfigBuilderPlugin.uploadCareportalEntryToNS(data);
|
||||
Answers.getInstance().logCustom(new CustomEvent("ProfileSwitch"));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -638,30 +649,28 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
}
|
||||
} else if (options.executeTempTarget) {
|
||||
try {
|
||||
if ((data.has("targetBottom") && data.has("targetTop")) || (data.has("duration")&& data.getInt("duration") == 0)) {
|
||||
if ((data.has("targetBottom") && data.has("targetTop")) || (data.has("duration") && data.getInt("duration") == 0)) {
|
||||
sHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
TempTarget tempTarget = new TempTarget();
|
||||
tempTarget.timeStart = eventTime;
|
||||
tempTarget.duration = data.getInt("duration");
|
||||
tempTarget.date = eventTime.getTime();
|
||||
tempTarget.durationInMinutes = data.getInt("duration");
|
||||
tempTarget.reason = data.getString("reason");
|
||||
if(tempTarget.duration != 0) {
|
||||
tempTarget.low = NSProfile.toMgdl(data.getDouble("targetBottom"), ConfigBuilderPlugin.getActiveProfile().getProfile().getUnits());
|
||||
tempTarget.high = NSProfile.toMgdl(data.getDouble("targetTop"), ConfigBuilderPlugin.getActiveProfile().getProfile().getUnits());
|
||||
tempTarget.source = Source.USER;
|
||||
if (tempTarget.durationInMinutes != 0) {
|
||||
tempTarget.low = Profile.toMgdl(data.getDouble("targetBottom"), profile.getUnits());
|
||||
tempTarget.high = Profile.toMgdl(data.getDouble("targetTop"), profile.getUnits());
|
||||
} else {
|
||||
tempTarget.low = 0;
|
||||
tempTarget.high = 0;
|
||||
}
|
||||
tempTarget.setTimeIndex(tempTarget.getTimeIndex());
|
||||
Dao<TempTarget, Long> dao = MainApp.getDbHelper().getDaoTempTargets();
|
||||
log.debug("Creating new TempTarget db record: " + tempTarget.log());
|
||||
dao.createIfNotExists(tempTarget);
|
||||
MainApp.bus().post(new EventTempTargetRangeChange());
|
||||
ConfigBuilderPlugin.uploadCareportalEntryToNS(data);
|
||||
log.debug("Creating new TempTarget db record: " + tempTarget.toString());
|
||||
MainApp.getDbHelper().createOrUpdate(tempTarget);
|
||||
NSUpload.uploadCareportalEntryToNS(data);
|
||||
Answers.getInstance().logCustom(new CustomEvent("TempTarget"));
|
||||
} catch (JSONException | SQLException e) {
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
@ -671,7 +680,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
|
|||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
ConfigBuilderPlugin.uploadCareportalEntryToNS(data);
|
||||
NSUpload.uploadCareportalEntryToNS(data);
|
||||
Answers.getInstance().logCustom(new CustomEvent("NSTreatment"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import android.content.Context;
|
|||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -21,6 +22,7 @@ import com.crashlytics.android.answers.CustomEvent;
|
|||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.events.EventConfigBuilderChange;
|
||||
|
@ -28,16 +30,17 @@ import info.nightscout.androidaps.events.EventRefreshGui;
|
|||
import info.nightscout.androidaps.interfaces.APSInterface;
|
||||
import info.nightscout.androidaps.interfaces.BgSourceInterface;
|
||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.NSProfile.NSProfilePlugin;
|
||||
import info.nightscout.androidaps.plugins.VirtualPump.VirtualPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.InsulinFastacting.InsulinFastactingPlugin;
|
||||
import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin;
|
||||
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
|
||||
import info.nightscout.utils.PasswordProtection;
|
||||
|
||||
|
||||
public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
||||
public class ConfigBuilderFragment extends Fragment {
|
||||
|
||||
static ConfigBuilderPlugin configBuilderPlugin = new ConfigBuilderPlugin();
|
||||
|
||||
|
@ -45,15 +48,17 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
return configBuilderPlugin;
|
||||
}
|
||||
|
||||
ListView insulinListView;
|
||||
ListView bgsourceListView;
|
||||
TextView bgsourceLabel;
|
||||
ListView pumpListView;
|
||||
TextView pumpLabel;
|
||||
ListView loopListView;
|
||||
TextView loopLabel;
|
||||
ListView treatmentsListView;
|
||||
ListView tempsListView;
|
||||
TextView tempsLabel;
|
||||
TextView treatmentsLabel;
|
||||
ListView profileListView;
|
||||
TextView profileLabel;
|
||||
ListView apsListView;
|
||||
TextView apsLabel;
|
||||
ListView constraintsListView;
|
||||
|
@ -62,18 +67,20 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
TextView nsclientVerView;
|
||||
TextView nightscoutVerView;
|
||||
|
||||
LinearLayout mainLayout;
|
||||
Button unlock;
|
||||
|
||||
PluginCustomAdapter insulinDataAdapter = null;
|
||||
PluginCustomAdapter bgsourceDataAdapter = null;
|
||||
PluginCustomAdapter pumpDataAdapter = null;
|
||||
PluginCustomAdapter loopDataAdapter = null;
|
||||
PluginCustomAdapter treatmentsDataAdapter = null;
|
||||
PluginCustomAdapter tempsDataAdapter = null;
|
||||
PluginCustomAdapter profileDataAdapter = null;
|
||||
PluginCustomAdapter apsDataAdapter = null;
|
||||
PluginCustomAdapter constraintsDataAdapter = null;
|
||||
PluginCustomAdapter generalDataAdapter = null;
|
||||
|
||||
LinearLayout mainLayout;
|
||||
Button unlock;
|
||||
boolean smallWidth;
|
||||
|
||||
// TODO: sorting
|
||||
|
||||
|
@ -81,15 +88,24 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.configbuilder_fragment, container, false);
|
||||
|
||||
//check screen width
|
||||
final DisplayMetrics dm = new DisplayMetrics();
|
||||
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
|
||||
int screen_width = dm.widthPixels;
|
||||
smallWidth = screen_width < Constants.SMALL_WIDTH;
|
||||
|
||||
insulinListView = (ListView) view.findViewById(R.id.configbuilder_insulinlistview);
|
||||
bgsourceListView = (ListView) view.findViewById(R.id.configbuilder_bgsourcelistview);
|
||||
bgsourceLabel = (TextView) view.findViewById(R.id.configbuilder_bgsourcelabel);
|
||||
pumpListView = (ListView) view.findViewById(R.id.configbuilder_pumplistview);
|
||||
pumpLabel = (TextView) view.findViewById(R.id.configbuilder_pumplabel);
|
||||
loopListView = (ListView) view.findViewById(R.id.configbuilder_looplistview);
|
||||
loopLabel = (TextView) view.findViewById(R.id.configbuilder_looplabel);
|
||||
treatmentsListView = (ListView) view.findViewById(R.id.configbuilder_treatmentslistview);
|
||||
tempsListView = (ListView) view.findViewById(R.id.configbuilder_tempslistview);
|
||||
tempsLabel = (TextView) view.findViewById(R.id.configbuilder_tempslabel);
|
||||
treatmentsLabel = (TextView) view.findViewById(R.id.configbuilder_treatmentslabel);
|
||||
profileListView = (ListView) view.findViewById(R.id.configbuilder_profilelistview);
|
||||
profileLabel = (TextView) view.findViewById(R.id.configbuilder_profilelabel);
|
||||
apsListView = (ListView) view.findViewById(R.id.configbuilder_apslistview);
|
||||
apsLabel = (TextView) view.findViewById(R.id.configbuilder_apslabel);
|
||||
constraintsListView = (ListView) view.findViewById(R.id.configbuilder_constraintslistview);
|
||||
|
@ -98,6 +114,9 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
nsclientVerView = (TextView) view.findViewById(R.id.configbuilder_nsclientversion);
|
||||
nightscoutVerView = (TextView) view.findViewById(R.id.configbuilder_nightscoutversion);
|
||||
|
||||
mainLayout = (LinearLayout) view.findViewById(R.id.configbuilder_mainlayout);
|
||||
unlock = (Button) view.findViewById(R.id.configbuilder_unlock);
|
||||
|
||||
nsclientVerView.setText(ConfigBuilderPlugin.nsClientVersionName);
|
||||
nightscoutVerView.setText(ConfigBuilderPlugin.nightscoutVersionName);
|
||||
if (ConfigBuilderPlugin.nsClientVersionCode < 117) nsclientVerView.setTextColor(Color.RED);
|
||||
|
@ -105,9 +124,6 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
nightscoutVerView.setTextColor(Color.RED);
|
||||
setViews();
|
||||
|
||||
unlock = (Button) view.findViewById(R.id.configbuilder_unlock);
|
||||
mainLayout = (LinearLayout) view.findViewById(R.id.configbuilder_mainlayout);
|
||||
|
||||
if (PasswordProtection.isLocked("settings_password")) {
|
||||
mainLayout.setVisibility(View.GONE);
|
||||
unlock.setOnClickListener(new View.OnClickListener() {
|
||||
|
@ -129,41 +145,45 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
}
|
||||
|
||||
void setViews() {
|
||||
bgsourceDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsListByInterface(BgSourceInterface.class), PluginBase.BGSOURCE);
|
||||
insulinDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInListByInterface(InsulinInterface.class, PluginBase.INSULIN), PluginBase.INSULIN);
|
||||
insulinListView.setAdapter(insulinDataAdapter);
|
||||
setListViewHeightBasedOnChildren(insulinListView);
|
||||
bgsourceDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInListByInterface(BgSourceInterface.class, PluginBase.BGSOURCE), PluginBase.BGSOURCE);
|
||||
bgsourceListView.setAdapter(bgsourceDataAdapter);
|
||||
if (MainApp.getSpecificPluginsVisibleInList(PluginBase.BGSOURCE).size() == 0)
|
||||
bgsourceLabel.setVisibility(View.GONE);
|
||||
setListViewHeightBasedOnChildren(bgsourceListView);
|
||||
pumpDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsList(PluginBase.PUMP), PluginBase.PUMP);
|
||||
pumpDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInList(PluginBase.PUMP), PluginBase.PUMP);
|
||||
pumpListView.setAdapter(pumpDataAdapter);
|
||||
if (MainApp.getSpecificPluginsList(PluginBase.PUMP).size() == 0)
|
||||
if (MainApp.getSpecificPluginsVisibleInList(PluginBase.PUMP).size() == 0)
|
||||
pumpLabel.setVisibility(View.GONE);
|
||||
setListViewHeightBasedOnChildren(pumpListView);
|
||||
loopDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsList(PluginBase.LOOP), PluginBase.LOOP);
|
||||
loopDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInList(PluginBase.LOOP), PluginBase.LOOP);
|
||||
loopListView.setAdapter(loopDataAdapter);
|
||||
setListViewHeightBasedOnChildren(loopListView);
|
||||
if (MainApp.getSpecificPluginsList(PluginBase.LOOP).size() == 0)
|
||||
if (MainApp.getSpecificPluginsVisibleInList(PluginBase.LOOP).size() == 0)
|
||||
loopLabel.setVisibility(View.GONE);
|
||||
treatmentsDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsList(PluginBase.TREATMENT), PluginBase.TREATMENT);
|
||||
treatmentsDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInList(PluginBase.TREATMENT), PluginBase.TREATMENT);
|
||||
treatmentsListView.setAdapter(treatmentsDataAdapter);
|
||||
if (MainApp.getSpecificPluginsVisibleInList(PluginBase.TREATMENT).size() == 0)
|
||||
treatmentsLabel.setVisibility(View.GONE);
|
||||
setListViewHeightBasedOnChildren(treatmentsListView);
|
||||
tempsDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsList(PluginBase.TEMPBASAL), PluginBase.TEMPBASAL);
|
||||
tempsListView.setAdapter(tempsDataAdapter);
|
||||
setListViewHeightBasedOnChildren(tempsListView);
|
||||
if (MainApp.getSpecificPluginsList(PluginBase.TEMPBASAL).size() == 0)
|
||||
tempsLabel.setVisibility(View.GONE);
|
||||
profileDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsListByInterface(ProfileInterface.class), PluginBase.PROFILE);
|
||||
profileDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInListByInterface(ProfileInterface.class, PluginBase.BGSOURCE), PluginBase.PROFILE);
|
||||
profileListView.setAdapter(profileDataAdapter);
|
||||
if (MainApp.getSpecificPluginsVisibleInList(PluginBase.PROFILE).size() == 0)
|
||||
profileLabel.setVisibility(View.GONE);
|
||||
setListViewHeightBasedOnChildren(profileListView);
|
||||
apsDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsList(PluginBase.APS), PluginBase.APS);
|
||||
apsDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInList(PluginBase.APS), PluginBase.APS);
|
||||
apsListView.setAdapter(apsDataAdapter);
|
||||
setListViewHeightBasedOnChildren(apsListView);
|
||||
if (MainApp.getSpecificPluginsList(PluginBase.APS).size() == 0)
|
||||
if (MainApp.getSpecificPluginsVisibleInList(PluginBase.APS).size() == 0)
|
||||
apsLabel.setVisibility(View.GONE);
|
||||
constraintsDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class), PluginBase.CONSTRAINTS);
|
||||
constraintsDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInListByInterface(ConstraintsInterface.class, PluginBase.BGSOURCE), PluginBase.CONSTRAINTS);
|
||||
constraintsListView.setAdapter(constraintsDataAdapter);
|
||||
setListViewHeightBasedOnChildren(constraintsListView);
|
||||
if (MainApp.getSpecificPluginsList(PluginBase.CONSTRAINTS).size() == 0)
|
||||
if (MainApp.getSpecificPluginsVisibleInList(PluginBase.CONSTRAINTS).size() == 0)
|
||||
constraintsLabel.setVisibility(View.GONE);
|
||||
generalDataAdapter = new PluginCustomAdapter(getContext(), R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsList(PluginBase.GENERAL), PluginBase.GENERAL);
|
||||
generalDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInList(PluginBase.GENERAL), PluginBase.GENERAL);
|
||||
generalListView.setAdapter(generalDataAdapter);
|
||||
setListViewHeightBasedOnChildren(generalListView);
|
||||
|
||||
|
@ -193,18 +213,18 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
public View getView(int position, View view, ViewGroup parent) {
|
||||
|
||||
PluginViewHolder holder = null;
|
||||
|
||||
if (convertView == null) {
|
||||
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.configbuilder_simpleitem, null);
|
||||
if (view == null) {
|
||||
view = LayoutInflater.from(parent.getContext()).inflate(smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, null);
|
||||
|
||||
holder = new PluginViewHolder();
|
||||
holder.name = (TextView) convertView.findViewById(R.id.configbuilder_simpleitem_name);
|
||||
holder.checkboxEnabled = (CheckBox) convertView.findViewById(R.id.configbuilder_simpleitem_checkboxenabled);
|
||||
holder.checkboxVisible = (CheckBox) convertView.findViewById(R.id.configbuilder_simpleitem_checkboxvisible);
|
||||
convertView.setTag(holder);
|
||||
holder.name = (TextView) view.findViewById(R.id.configbuilder_simpleitem_name);
|
||||
holder.checkboxEnabled = (CheckBox) view.findViewById(R.id.configbuilder_simpleitem_checkboxenabled);
|
||||
holder.checkboxVisible = (CheckBox) view.findViewById(R.id.configbuilder_simpleitem_checkboxvisible);
|
||||
view.setTag(holder);
|
||||
|
||||
holder.checkboxEnabled.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
|
@ -232,7 +252,7 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
}
|
||||
});
|
||||
} else {
|
||||
holder = (PluginViewHolder) convertView.getTag();
|
||||
holder = (PluginViewHolder) view.getTag();
|
||||
}
|
||||
|
||||
PluginBase plugin = pluginList.get(position);
|
||||
|
@ -252,8 +272,12 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
holder.checkboxVisible.setEnabled(false);
|
||||
}
|
||||
|
||||
if (!plugin.hasFragment()) {
|
||||
holder.checkboxVisible.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
// Hide enabled control and force enabled plugin if there is only one plugin available
|
||||
if (type == PluginBase.PUMP || type == PluginBase.TREATMENT || type == PluginBase.TEMPBASAL || type == PluginBase.PROFILE)
|
||||
if (type == PluginBase.INSULIN || type == PluginBase.PUMP || type == PluginBase.TREATMENT || type == PluginBase.PROFILE)
|
||||
if (pluginList.size() < 2) {
|
||||
holder.checkboxEnabled.setEnabled(false);
|
||||
plugin.setFragmentEnabled(type, true);
|
||||
|
@ -284,7 +308,7 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
}
|
||||
}
|
||||
|
||||
return convertView;
|
||||
return view;
|
||||
|
||||
}
|
||||
|
||||
|
@ -299,6 +323,9 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
case PluginBase.LOOP:
|
||||
break;
|
||||
// Single selection allowed
|
||||
case PluginBase.INSULIN:
|
||||
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(InsulinInterface.class);
|
||||
break;
|
||||
case PluginBase.APS:
|
||||
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(APSInterface.class);
|
||||
break;
|
||||
|
@ -308,7 +335,6 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
case PluginBase.BGSOURCE:
|
||||
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(BgSourceInterface.class);
|
||||
break;
|
||||
case PluginBase.TEMPBASAL:
|
||||
case PluginBase.TREATMENT:
|
||||
case PluginBase.PUMP:
|
||||
pluginsInCategory = MainApp.getSpecificPluginsListByInterface(PumpInterface.class);
|
||||
|
@ -328,6 +354,8 @@ public class ConfigBuilderFragment extends Fragment implements FragmentBase {
|
|||
} else { // enable first plugin in list
|
||||
if (type == PluginBase.PUMP)
|
||||
MainApp.getSpecificPlugin(VirtualPumpPlugin.class).setFragmentEnabled(type, true);
|
||||
else if (type == PluginBase.INSULIN)
|
||||
MainApp.getSpecificPlugin(InsulinFastactingPlugin.class).setFragmentEnabled(type, true);
|
||||
else if (type == PluginBase.PROFILE)
|
||||
MainApp.getSpecificPlugin(NSProfilePlugin.class).setFragmentEnabled(type, true);
|
||||
else
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.androidaps.plugins.Objectives;
|
||||
package info.nightscout.androidaps.plugins.ConstraintsObjectives;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
|
@ -7,7 +7,6 @@ import android.support.v4.app.Fragment;
|
|||
import android.support.v7.widget.CardView;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.text.Layout;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -24,9 +23,8 @@ import java.util.List;
|
|||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||
|
||||
public class ObjectivesFragment extends Fragment implements View.OnClickListener, FragmentBase {
|
||||
public class ObjectivesFragment extends Fragment {
|
||||
private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class);
|
||||
|
||||
private static ObjectivesPlugin objectivesPlugin;
|
||||
|
@ -44,15 +42,6 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
|
|||
LinearLayout fake_layout;
|
||||
TextView reset;
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
int id = v.getId();
|
||||
switch (id) {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ObjectiveViewHolder> {
|
||||
|
||||
List<ObjectivesPlugin.Objective> objectives;
|
||||
|
@ -237,16 +226,4 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
|
|||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
MainApp.bus().unregister(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
MainApp.bus().register(this);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.androidaps.plugins.Objectives;
|
||||
package info.nightscout.androidaps.plugins.ConstraintsObjectives;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
|
@ -17,7 +17,6 @@ import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
|||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.SafeParse;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.08.2016.
|
||||
|
@ -77,6 +76,16 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.androidaps.plugins.SafetyFragment;
|
||||
package info.nightscout.androidaps.plugins.ConstraintsSafety;
|
||||
|
||||
|
||||
import android.support.v4.app.Fragment;
|
||||
|
@ -6,9 +6,7 @@ import android.support.v4.app.Fragment;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||
|
||||
public class SafetyFragment extends Fragment implements FragmentBase{
|
||||
public class SafetyFragment extends Fragment {
|
||||
private static Logger log = LoggerFactory.getLogger(SafetyFragment.class);
|
||||
|
||||
private static SafetyPlugin safetyPlugin = new SafetyPlugin();
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.androidaps.plugins.SafetyFragment;
|
||||
package info.nightscout.androidaps.plugins.ConstraintsSafety;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -10,7 +10,7 @@ import info.nightscout.androidaps.MainApp;
|
|||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.utils.HardLimits;
|
||||
import info.nightscout.utils.Round;
|
||||
import info.nightscout.utils.SP;
|
||||
|
@ -57,6 +57,16 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
|
||||
|
@ -95,7 +105,7 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
|||
Double origAbsoluteRate = absoluteRate;
|
||||
Double maxBasal = SP.getDouble("openapsma_max_basal", 1d);
|
||||
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile();
|
||||
if (profile == null) return absoluteRate;
|
||||
if (absoluteRate < 0) absoluteRate = 0d;
|
||||
|
||||
|
@ -108,8 +118,8 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
|||
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
||||
log.debug("Limiting rate " + origRate + " by maxBasal preference to " + absoluteRate + "U/h");
|
||||
}
|
||||
if (absoluteRate > maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight())) {
|
||||
absoluteRate = Math.floor(maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight()) * 100) / 100;
|
||||
if (absoluteRate > maxBasalMult * profile.getBasal()) {
|
||||
absoluteRate = Math.floor(maxBasalMult * profile.getBasal() * 100) / 100;
|
||||
if (Config.logConstraintsChanges && origAbsoluteRate != Constants.basalAbsoluteOnlyForCheckLimit)
|
||||
log.debug("Limiting rate " + origRate + " by maxBasalMult to " + absoluteRate + "U/h");
|
||||
}
|
||||
|
@ -126,9 +136,9 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
|||
Integer origPercentRate = percentRate;
|
||||
Double maxBasal = SP.getDouble("openapsma_max_basal", 1d);
|
||||
|
||||
NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile();
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile();
|
||||
if (profile == null) return percentRate;
|
||||
Double currentBasal = profile.getBasal(profile.secondsFromMidnight());
|
||||
Double currentBasal = profile.getBasal();
|
||||
|
||||
Double absoluteRate = currentBasal * ((double) percentRate / 100);
|
||||
|
||||
|
@ -146,8 +156,8 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
|||
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
||||
log.debug("Limiting rate " + origRate + " by maxBasal preference to " + absoluteRate + "U/h");
|
||||
}
|
||||
if (absoluteRate > maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight())) {
|
||||
absoluteRate = Math.floor(maxBasalMult * profile.getBasal(NSProfile.secondsFromMidnight()) * 100) / 100;
|
||||
if (absoluteRate > maxBasalMult * profile.getBasal()) {
|
||||
absoluteRate = Math.floor(maxBasalMult * profile.getBasal() * 100) / 100;
|
||||
if (Config.logConstraintsChanges && origPercentRate != Constants.basalPercentOnlyForCheckLimit)
|
||||
log.debug("Limiting rate " + origRate + " by maxBasalMult to " + absoluteRate + "U/h");
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgSettingGlucose extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingGlucose.class);
|
||||
|
||||
public MsgSettingGlucose() {
|
||||
SetCommand(0x3209);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
DanaRPlugin.getDanaRPump().units = intFromBuff(bytes, 0, 1);
|
||||
DanaRPlugin.getDanaRPump().easyBasalMode = intFromBuff(bytes, 1, 1);
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Pump units: " + (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||
log.debug("Easy basal mode: " + DanaRPlugin.getDanaRPump().easyBasalMode);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgSettingMaxValues extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingMaxValues.class);
|
||||
|
||||
public MsgSettingMaxValues() {
|
||||
SetCommand(0x3205);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
DanaRPlugin.getDanaRPump().maxBolus = intFromBuff(bytes, 0, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().maxBasal = intFromBuff(bytes, 2, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().maxDailyTotalUnits = intFromBuff(bytes, 4, 2) / 100;
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Max bolus: " + DanaRPlugin.getDanaRPump().maxBolus);
|
||||
log.debug("Max basal: " + DanaRPlugin.getDanaRPump().maxBasal);
|
||||
log.debug("Total daily max units: " + DanaRPlugin.getDanaRPump().maxDailyTotalUnits);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 13.12.2016.
|
||||
*/
|
||||
|
||||
public class MsgSettingMeal extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingMeal.class);
|
||||
|
||||
public MsgSettingMeal() {
|
||||
SetCommand(0x3203);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
DanaRPump pump = DanaRPlugin.getDanaRPump();
|
||||
pump.basalStep = intFromBuff(bytes, 0, 1) / 100d;
|
||||
pump.bolusStep = intFromBuff(bytes, 1, 1) / 100d;
|
||||
boolean bolusEnabled = intFromBuff(bytes, 2, 1) == 1;
|
||||
int melodyTime = intFromBuff(bytes, 3, 1);
|
||||
int blockTime = intFromBuff(bytes, 4, 1);
|
||||
pump.isConfigUD = intFromBuff(bytes, 5, 1) == 1;
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Basal step: " + pump.basalStep);
|
||||
log.debug("Bolus step: " + pump.bolusStep);
|
||||
log.debug("Bolus enabled: " + bolusEnabled);
|
||||
log.debug("Melody time: " + melodyTime);
|
||||
log.debug("Block time: " + blockTime);
|
||||
log.debug("Is Config U/d: " + pump.isConfigUD);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgSettingProfileRatios extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingProfileRatios.class);
|
||||
|
||||
public MsgSettingProfileRatios() {
|
||||
SetCommand(0x3204);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
if (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
||||
DanaRPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2);
|
||||
DanaRPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2);
|
||||
DanaRPlugin.getDanaRPump().currentAIDR = intFromBuff(bytes, 8, 1);
|
||||
} else {
|
||||
DanaRPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().currentAIDR = intFromBuff(bytes, 8, 1);
|
||||
}
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Pump units (saved): " + (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||
log.debug("Current pump CIR: " + DanaRPlugin.getDanaRPump().currentCIR);
|
||||
log.debug("Current pump CF: " + DanaRPlugin.getDanaRPump().currentCF);
|
||||
log.debug("Current pump AI: " + DanaRPlugin.getDanaRPump().currentAI);
|
||||
log.debug("Current pump target: " + DanaRPlugin.getDanaRPump().currentTarget);
|
||||
log.debug("Current pump AIDR: " + DanaRPlugin.getDanaRPump().currentAIDR);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgSettingProfileRatiosAll extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingProfileRatiosAll.class);
|
||||
|
||||
public MsgSettingProfileRatiosAll() {
|
||||
SetCommand(0x320D);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
if (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
||||
DanaRPlugin.getDanaRPump().morningCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRPlugin.getDanaRPump().morningCF = intFromBuff(bytes, 2, 2);
|
||||
DanaRPlugin.getDanaRPump().afternoonCIR = intFromBuff(bytes, 4, 2);
|
||||
DanaRPlugin.getDanaRPump().afternoonCF = intFromBuff(bytes, 6, 2);
|
||||
DanaRPlugin.getDanaRPump().eveningCIR = intFromBuff(bytes, 8, 2);
|
||||
DanaRPlugin.getDanaRPump().eveningCF = intFromBuff(bytes, 10, 2);
|
||||
DanaRPlugin.getDanaRPump().nightCIR = intFromBuff(bytes, 12, 2);
|
||||
DanaRPlugin.getDanaRPump().nightCF = intFromBuff(bytes, 14, 2);
|
||||
} else {
|
||||
DanaRPlugin.getDanaRPump().morningCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRPlugin.getDanaRPump().morningCF = intFromBuff(bytes, 2, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().afternoonCIR = intFromBuff(bytes, 4, 2);
|
||||
DanaRPlugin.getDanaRPump().afternoonCF = intFromBuff(bytes, 6, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().eveningCIR = intFromBuff(bytes, 8, 2);
|
||||
DanaRPlugin.getDanaRPump().eveningCF = intFromBuff(bytes, 10, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().nightCIR = intFromBuff(bytes, 12, 2);
|
||||
DanaRPlugin.getDanaRPump().nightCF = intFromBuff(bytes, 14, 2) / 100d;
|
||||
}
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Pump units: " + (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||
log.debug("Current pump morning CIR: " + DanaRPlugin.getDanaRPump().morningCIR);
|
||||
log.debug("Current pump morning CF: " + DanaRPlugin.getDanaRPump().morningCF);
|
||||
log.debug("Current pump afternoon CIR: " + DanaRPlugin.getDanaRPump().afternoonCIR);
|
||||
log.debug("Current pump afternoon CF: " + DanaRPlugin.getDanaRPump().afternoonCF);
|
||||
log.debug("Current pump evening CIR: " + DanaRPlugin.getDanaRPump().eveningCIR);
|
||||
log.debug("Current pump evening CF: " + DanaRPlugin.getDanaRPump().eveningCF);
|
||||
log.debug("Current pump night CIR: " + DanaRPlugin.getDanaRPump().nightCIR);
|
||||
log.debug("Current pump night CF: " + DanaRPlugin.getDanaRPump().nightCF);
|
||||
}
|
||||
|
||||
DanaRPlugin.getDanaRPump().createConvertedProfile();
|
||||
}
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
|
||||
public class MsgStatus extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgStatus.class);
|
||||
|
||||
public MsgStatus() {
|
||||
SetCommand(0x020B);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
DanaRPlugin.getDanaRPump().dailyTotalUnits = intFromBuff(bytes, 0, 3) / 750d;
|
||||
DanaRPlugin.getDanaRPump().isExtendedInProgress = intFromBuff(bytes, 3, 1) == 1;
|
||||
DanaRPlugin.getDanaRPump().extendedBolusMinutes = intFromBuff(bytes, 4, 2);
|
||||
DanaRPlugin.getDanaRPump().extendedBolusAmount = intFromBuff(bytes, 6, 2) / 100d;
|
||||
Double lastBolusAmount = intFromBuff(bytes, 13, 2) / 100d;
|
||||
if (lastBolusAmount != 0d) {
|
||||
DanaRPlugin.getDanaRPump().lastBolusTime = dateTimeFromBuff(bytes, 8);
|
||||
DanaRPlugin.getDanaRPump().lastBolusAmount = lastBolusAmount;
|
||||
}
|
||||
DanaRPlugin.getDanaRPump().iob = intFromBuff(bytes, 15, 2) / 100d;
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Daily total: " + DanaRPlugin.getDanaRPump().dailyTotalUnits);
|
||||
log.debug("Is extended bolus running: " + DanaRPlugin.getDanaRPump().isExtendedInProgress);
|
||||
log.debug("Extended bolus min: " + DanaRPlugin.getDanaRPump().extendedBolusMinutes);
|
||||
log.debug("Extended bolus amount: " + DanaRPlugin.getDanaRPump().extendedBolusAmount);
|
||||
log.debug("Last bolus time: " + DanaRPlugin.getDanaRPump().lastBolusTime);
|
||||
log.debug("Last bolus amount: " + DanaRPlugin.getDanaRPump().lastBolusAmount);
|
||||
log.debug("IOB: " + DanaRPlugin.getDanaRPump().iob);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,111 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.db.TempBasal;
|
||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||
|
||||
public class MsgStatusBolusExtended extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgStatusBolusExtended.class);
|
||||
|
||||
public MsgStatusBolusExtended() {
|
||||
SetCommand(0x0207);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
boolean isExtendedInProgress = intFromBuff(bytes, 0, 1) == 1;
|
||||
int extendedBolusHalfHours = intFromBuff(bytes, 1, 1);
|
||||
int extendedBolusMinutes = extendedBolusHalfHours * 30;
|
||||
|
||||
double extendedBolusAmount = intFromBuff(bytes, 2, 2) / 100d;
|
||||
int extendedBolusSoFarInSecs = intFromBuff(bytes, 4, 3);
|
||||
|
||||
int extendedBolusSoFarInMinutes = extendedBolusSoFarInSecs / 60;
|
||||
double extendedBolusAbsoluteRate = isExtendedInProgress ? extendedBolusAmount / extendedBolusMinutes * 60 : 0d;
|
||||
Date extendedBolusStart = isExtendedInProgress ? getDateFromSecAgo(extendedBolusSoFarInSecs) : new Date(0);
|
||||
int extendedBolusRemainingMinutes = extendedBolusMinutes - extendedBolusSoFarInMinutes;
|
||||
|
||||
DanaRPlugin.getDanaRPump().isExtendedInProgress = isExtendedInProgress;
|
||||
DanaRPlugin.getDanaRPump().extendedBolusMinutes = extendedBolusMinutes;
|
||||
DanaRPlugin.getDanaRPump().extendedBolusAmount = extendedBolusAmount;
|
||||
DanaRPlugin.getDanaRPump().extendedBolusSoFarInMinutes = extendedBolusSoFarInMinutes;
|
||||
DanaRPlugin.getDanaRPump().extendedBolusAbsoluteRate = extendedBolusAbsoluteRate;
|
||||
DanaRPlugin.getDanaRPump().extendedBolusStart = extendedBolusStart;
|
||||
DanaRPlugin.getDanaRPump().extendedBolusRemainingMinutes = extendedBolusRemainingMinutes;
|
||||
|
||||
updateExtendedBolusInDB();
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Is extended bolus running: " + isExtendedInProgress);
|
||||
log.debug("Extended bolus min: " + extendedBolusMinutes);
|
||||
log.debug("Extended bolus amount: " + extendedBolusAmount);
|
||||
log.debug("Extended bolus so far in minutes: " + extendedBolusSoFarInMinutes);
|
||||
log.debug("Extended bolus absolute rate: " + extendedBolusAbsoluteRate);
|
||||
log.debug("Extended bolus start: " + extendedBolusStart);
|
||||
log.debug("Extended bolus remaining minutes: " + extendedBolusRemainingMinutes);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Date getDateFromSecAgo(int tempBasalAgoSecs) {
|
||||
return new Date((long) (Math.ceil(new Date().getTime() / 1000d) - tempBasalAgoSecs) * 1000);
|
||||
}
|
||||
|
||||
public static void updateExtendedBolusInDB() {
|
||||
DanaRPlugin DanaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class);
|
||||
DanaRPump danaRPump = DanaRPlugin.getDanaRPump();
|
||||
Date now = new Date();
|
||||
|
||||
try {
|
||||
|
||||
if (DanaRPlugin.isExtendedBoluslInProgress()) {
|
||||
TempBasal extendedBolus = DanaRPlugin.getExtendedBolus();
|
||||
if (danaRPump.isExtendedInProgress) {
|
||||
if (extendedBolus.absolute != danaRPump.extendedBolusAbsoluteRate) {
|
||||
// Close current extended
|
||||
extendedBolus.timeEnd = now;
|
||||
MainApp.getDbHelper().getDaoTempBasals().update(extendedBolus);
|
||||
// Create new
|
||||
TempBasal newExtended = new TempBasal();
|
||||
newExtended.timeStart = now;
|
||||
newExtended.absolute = danaRPump.extendedBolusAbsoluteRate;
|
||||
newExtended.isAbsolute = true;
|
||||
newExtended.duration = danaRPump.extendedBolusMinutes;
|
||||
newExtended.isExtended = true;
|
||||
MainApp.getDbHelper().getDaoTempBasals().create(newExtended);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
} else {
|
||||
// Close curent temp basal
|
||||
extendedBolus.timeEnd = now;
|
||||
MainApp.getDbHelper().getDaoTempBasals().update(extendedBolus);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
} else {
|
||||
if (danaRPump.isExtendedInProgress) {
|
||||
// Create new
|
||||
TempBasal newExtended = new TempBasal();
|
||||
newExtended.timeStart = now;
|
||||
newExtended.absolute = danaRPump.extendedBolusAbsoluteRate;
|
||||
newExtended.isAbsolute = true;
|
||||
newExtended.duration = danaRPump.extendedBolusMinutes;
|
||||
newExtended.isExtended = true;
|
||||
MainApp.getDbHelper().getDaoTempBasals().create(newExtended);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgStatusProfile extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgStatusProfile.class);
|
||||
|
||||
public MsgStatusProfile() {
|
||||
SetCommand(0x0204);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
if (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL) {
|
||||
DanaRPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2);
|
||||
DanaRPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2);
|
||||
} else {
|
||||
DanaRPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||
DanaRPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2) / 100d;
|
||||
}
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Pump units (saved): " + (DanaRPlugin.getDanaRPump().units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||
log.debug("Current pump CIR: " + DanaRPlugin.getDanaRPump().currentCIR);
|
||||
log.debug("Current pump CF: " + DanaRPlugin.getDanaRPump().currentCF);
|
||||
log.debug("Current pump AI: " + DanaRPlugin.getDanaRPump().currentAI);
|
||||
log.debug("Current pump target: " + DanaRPlugin.getDanaRPump().currentTarget);
|
||||
log.debug("Current pump AIDR: " + DanaRPlugin.getDanaRPump().currentAIDR);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,102 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaR.comm;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.db.TempBasal;
|
||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaR.DanaRPump;
|
||||
|
||||
public class MsgStatusTempBasal extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgStatusTempBasal.class);
|
||||
|
||||
public MsgStatusTempBasal() {
|
||||
SetCommand(0x0205);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
boolean isTempBasalInProgress = intFromBuff(bytes, 0, 1) == 1;
|
||||
int tempBasalPercent = intFromBuff(bytes, 1, 1);
|
||||
int tempBasalTotalSec = intFromBuff(bytes, 2, 1) * 60 * 60;
|
||||
int tempBasalRunningSeconds = intFromBuff(bytes, 3, 3);
|
||||
int tempBasalRemainingMin = (tempBasalTotalSec - tempBasalRunningSeconds) / 60;
|
||||
Date tempBasalStart = isTempBasalInProgress ? getDateFromTempBasalSecAgo(tempBasalRunningSeconds) : new Date(0);
|
||||
|
||||
DanaRPlugin.getDanaRPump().isTempBasalInProgress = isTempBasalInProgress;
|
||||
DanaRPlugin.getDanaRPump().tempBasalPercent = tempBasalPercent;
|
||||
DanaRPlugin.getDanaRPump().tempBasalRemainingMin = tempBasalRemainingMin;
|
||||
DanaRPlugin.getDanaRPump().tempBasalTotalSec = tempBasalTotalSec;
|
||||
DanaRPlugin.getDanaRPump().tempBasalStart = tempBasalStart;
|
||||
|
||||
updateTempBasalInDB();
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Is temp basal running: " + isTempBasalInProgress);
|
||||
log.debug("Current temp basal percent: " + tempBasalPercent);
|
||||
log.debug("Current temp basal remaining min: " + tempBasalRemainingMin);
|
||||
log.debug("Current temp basal total sec: " + tempBasalTotalSec);
|
||||
log.debug("Current temp basal start: " + tempBasalStart);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Date getDateFromTempBasalSecAgo(int tempBasalAgoSecs) {
|
||||
return new Date((long) (Math.ceil(new Date().getTime() / 1000d) - tempBasalAgoSecs) * 1000);
|
||||
}
|
||||
|
||||
public static void updateTempBasalInDB() {
|
||||
DanaRPlugin DanaRPlugin = (DanaRPlugin) MainApp.getSpecificPlugin(DanaRPlugin.class);
|
||||
DanaRPump danaRPump = DanaRPlugin.getDanaRPump();
|
||||
Date now = new Date();
|
||||
|
||||
try {
|
||||
|
||||
if (DanaRPlugin.isRealTempBasalInProgress()) {
|
||||
TempBasal tempBasal = DanaRPlugin.getRealTempBasal();
|
||||
if (danaRPump.isTempBasalInProgress) {
|
||||
if (tempBasal.percent != danaRPump.tempBasalPercent) {
|
||||
// Close current temp basal
|
||||
tempBasal.timeEnd = now;
|
||||
MainApp.getDbHelper().getDaoTempBasals().update(tempBasal);
|
||||
// Create new
|
||||
TempBasal newTempBasal = new TempBasal();
|
||||
newTempBasal.timeStart = now;
|
||||
newTempBasal.percent = danaRPump.tempBasalPercent;
|
||||
newTempBasal.isAbsolute = false;
|
||||
newTempBasal.duration = danaRPump.tempBasalTotalSec / 60;
|
||||
newTempBasal.isExtended = false;
|
||||
MainApp.getDbHelper().getDaoTempBasals().create(newTempBasal);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
} else {
|
||||
// Close current temp basal
|
||||
tempBasal.timeEnd = now;
|
||||
MainApp.getDbHelper().getDaoTempBasals().update(tempBasal);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
} else {
|
||||
if (danaRPump.isTempBasalInProgress) {
|
||||
// Create new
|
||||
TempBasal newTempBasal = new TempBasal();
|
||||
newTempBasal.timeStart = now;
|
||||
newTempBasal.percent = danaRPump.tempBasalPercent;
|
||||
newTempBasal.isAbsolute = false;
|
||||
newTempBasal.duration = danaRPump.tempBasalTotalSec / 60;
|
||||
newTempBasal.isExtended = false;
|
||||
MainApp.getDbHelper().getDaoTempBasals().create(newTempBasal);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,167 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
/**
|
||||
* Created by mike on 04.07.2016.
|
||||
*/
|
||||
public class DanaRKoreanPump {
|
||||
public static final int UNITS_MGDL = 0;
|
||||
public static final int UNITS_MMOL = 1;
|
||||
|
||||
public static final int DELIVERY_PRIME = 0x01;
|
||||
public static final int DELIVERY_STEP_BOLUS = 0x02;
|
||||
public static final int DELIVERY_BASAL = 0x04;
|
||||
public static final int DELIVERY_EXT_BOLUS = 0x08;
|
||||
|
||||
public static final String PROFILE_PREFIX = "DanaR-";
|
||||
|
||||
public Date lastConnection = new Date(0);
|
||||
public Date lastSettingsRead = new Date(0);
|
||||
|
||||
// Info
|
||||
public String serialNumber = "";
|
||||
public Date shippingDate = new Date(0);
|
||||
public String shippingCountry = "";
|
||||
public boolean isNewPump = true;
|
||||
public int password = -1;
|
||||
public Date pumpTime = new Date(0);
|
||||
|
||||
public static final int DOMESTIC_MODEL = 0x01;
|
||||
public static final int EXPORT_MODEL = 0x03;
|
||||
public int model;
|
||||
public int protocol;
|
||||
public int productCode;
|
||||
|
||||
public boolean pumpSuspended;
|
||||
|
||||
public boolean isConfigUD;
|
||||
public boolean isExtendedBolusEnabled;
|
||||
public boolean isEasyModeEnabled;
|
||||
|
||||
// Status
|
||||
public double dailyTotalUnits;
|
||||
public int maxDailyTotalUnits;
|
||||
|
||||
public double bolusStep;
|
||||
public double basalStep;
|
||||
|
||||
public double iob;
|
||||
|
||||
public double reservoirRemainingUnits;
|
||||
public int batteryRemaining;
|
||||
|
||||
public double currentBasal;
|
||||
|
||||
public boolean isTempBasalInProgress;
|
||||
public int tempBasalPercent;
|
||||
public int tempBasalRemainingMin;
|
||||
public int tempBasalTotalSec;
|
||||
public Date tempBasalStart;
|
||||
|
||||
public boolean isExtendedInProgress;
|
||||
public int extendedBolusMinutes;
|
||||
public double extendedBolusAmount;
|
||||
public double extendedBolusAbsoluteRate;
|
||||
public int extendedBolusSoFarInMinutes;
|
||||
public Date extendedBolusStart;
|
||||
public int extendedBolusRemainingMinutes;
|
||||
|
||||
// Profile
|
||||
public int units;
|
||||
public int easyBasalMode;
|
||||
public boolean basal48Enable = false;
|
||||
public int currentCIR;
|
||||
public double currentCF;
|
||||
public double currentAI;
|
||||
public double currentTarget;
|
||||
public int currentAIDR;
|
||||
|
||||
public int morningCIR;
|
||||
public double morningCF;
|
||||
public int afternoonCIR;
|
||||
public double afternoonCF;
|
||||
public int eveningCIR;
|
||||
public double eveningCF;
|
||||
public int nightCIR;
|
||||
public double nightCF;
|
||||
|
||||
|
||||
public int activeProfile = 0;
|
||||
public double[][] pumpProfiles = null;
|
||||
|
||||
//Limits
|
||||
public double maxBolus;
|
||||
public double maxBasal;
|
||||
|
||||
public NSProfile createConvertedProfile() {
|
||||
JSONObject json = new JSONObject();
|
||||
JSONObject store = new JSONObject();
|
||||
JSONObject profile = new JSONObject();
|
||||
|
||||
// Morning / 6:00–10:59
|
||||
// Afternoon / 11:00–16:59
|
||||
// Evening / 17:00–21:59
|
||||
// Night / 22:00–5:59
|
||||
|
||||
double dia = SP.getDouble(R.string.key_danarprofile_dia, 3d);
|
||||
|
||||
try {
|
||||
json.put("defaultProfile", PROFILE_PREFIX + (activeProfile + 1));
|
||||
json.put("store", store);
|
||||
profile.put("dia", dia);
|
||||
|
||||
JSONArray carbratios = new JSONArray();
|
||||
carbratios.put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", nightCIR));
|
||||
carbratios.put(new JSONObject().put("time", "06:00").put("timeAsSeconds", 6 * 3600).put("value", morningCIR));
|
||||
carbratios.put(new JSONObject().put("time", "11:00").put("timeAsSeconds", 11 * 3600).put("value", afternoonCIR));
|
||||
carbratios.put(new JSONObject().put("time", "14:00").put("timeAsSeconds", 17 * 3600).put("value", eveningCIR));
|
||||
carbratios.put(new JSONObject().put("time", "22:00").put("timeAsSeconds", 22 * 3600).put("value", nightCIR));
|
||||
profile.put("carbratio", carbratios);
|
||||
|
||||
JSONArray sens = new JSONArray();
|
||||
sens.put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", nightCF));
|
||||
sens.put(new JSONObject().put("time", "06:00").put("timeAsSeconds", 6 * 3600).put("value", morningCF));
|
||||
sens.put(new JSONObject().put("time", "11:00").put("timeAsSeconds", 11 * 3600).put("value", afternoonCF));
|
||||
sens.put(new JSONObject().put("time", "17:00").put("timeAsSeconds", 17 * 3600).put("value", eveningCF));
|
||||
sens.put(new JSONObject().put("time", "22:00").put("timeAsSeconds", 22 * 3600).put("value", nightCF));
|
||||
profile.put("sens", sens);
|
||||
|
||||
JSONArray basals = new JSONArray();
|
||||
int basalValues = basal48Enable ? 48 : 24;
|
||||
int basalIncrement = basal48Enable ? 30 * 60 : 60 * 60;
|
||||
for (int h = 0; h < basalValues; h++) {
|
||||
String time;
|
||||
DecimalFormat df = new DecimalFormat("00");
|
||||
if (basal48Enable) {
|
||||
time = df.format((long) h / 2) + ":" + df.format(30 * (h % 2));
|
||||
} else {
|
||||
time = df.format(h) + ":00";
|
||||
}
|
||||
basals.put(new JSONObject().put("time", time).put("timeAsSeconds", h * basalIncrement).put("value", pumpProfiles[activeProfile][h]));
|
||||
}
|
||||
profile.put("basal", basals);
|
||||
|
||||
profile.put("target_low", new JSONArray().put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", currentTarget)));
|
||||
profile.put("target_high", new JSONArray().put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", currentTarget)));
|
||||
profile.put("units", units == UNITS_MGDL ? Constants.MGDL : Constants.MMOL);
|
||||
store.put(PROFILE_PREFIX + (activeProfile + 1), profile);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
return new NSProfile(json, PROFILE_PREFIX + (activeProfile + 1));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgSettingGlucose extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingGlucose.class);
|
||||
|
||||
public MsgSettingGlucose() {
|
||||
SetCommand(0x3209);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
DanaRKoreanPlugin.getDanaRPump().units = intFromBuff(bytes, 0, 1);
|
||||
DanaRKoreanPlugin.getDanaRPump().easyBasalMode = intFromBuff(bytes, 1, 1);
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Pump units: " + (DanaRKoreanPlugin.getDanaRPump().units == DanaRKoreanPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||
log.debug("Easy basal mode: " + DanaRKoreanPlugin.getDanaRPump().easyBasalMode);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgSettingMaxValues extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingMaxValues.class);
|
||||
|
||||
public MsgSettingMaxValues() {
|
||||
SetCommand(0x3205);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
DanaRKoreanPlugin.getDanaRPump().maxBolus = intFromBuff(bytes, 0, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().maxBasal = intFromBuff(bytes, 2, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().maxDailyTotalUnits = intFromBuff(bytes, 4, 2) / 100;
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Max bolus: " + DanaRKoreanPlugin.getDanaRPump().maxBolus);
|
||||
log.debug("Max basal: " + DanaRKoreanPlugin.getDanaRPump().maxBasal);
|
||||
log.debug("Total daily max units: " + DanaRKoreanPlugin.getDanaRPump().maxDailyTotalUnits);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgSettingProfileRatios extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingProfileRatios.class);
|
||||
|
||||
public MsgSettingProfileRatios() {
|
||||
SetCommand(0x3204);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
if (DanaRKoreanPlugin.getDanaRPump().units == DanaRKoreanPump.UNITS_MGDL) {
|
||||
DanaRKoreanPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRKoreanPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2);
|
||||
DanaRKoreanPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2);
|
||||
DanaRKoreanPlugin.getDanaRPump().currentAIDR = intFromBuff(bytes, 8, 1);
|
||||
} else {
|
||||
DanaRKoreanPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRKoreanPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().currentAIDR = intFromBuff(bytes, 8, 1);
|
||||
}
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Pump units (saved): " + (DanaRKoreanPlugin.getDanaRPump().units == DanaRKoreanPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||
log.debug("Current pump CIR: " + DanaRKoreanPlugin.getDanaRPump().currentCIR);
|
||||
log.debug("Current pump CF: " + DanaRKoreanPlugin.getDanaRPump().currentCF);
|
||||
log.debug("Current pump AI: " + DanaRKoreanPlugin.getDanaRPump().currentAI);
|
||||
log.debug("Current pump target: " + DanaRKoreanPlugin.getDanaRPump().currentTarget);
|
||||
log.debug("Current pump AIDR: " + DanaRKoreanPlugin.getDanaRPump().currentAIDR);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
|
||||
public class MsgSettingPumpTime extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingPumpTime.class);
|
||||
|
||||
public MsgSettingPumpTime() {
|
||||
SetCommand(0x320A);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
Date time =
|
||||
new Date(
|
||||
100 + intFromBuff(bytes, 5, 1),
|
||||
intFromBuff(bytes, 4, 1) - 1,
|
||||
intFromBuff(bytes, 3, 1),
|
||||
intFromBuff(bytes, 2, 1),
|
||||
intFromBuff(bytes, 1, 1),
|
||||
intFromBuff(bytes, 0, 1)
|
||||
);
|
||||
|
||||
if (Config.logDanaMessageDetail)
|
||||
log.debug("Pump time: " + time);
|
||||
|
||||
DanaRKoreanPlugin.getDanaRPump().pumpTime = time;
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgSettingShippingInfo extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgSettingShippingInfo.class);
|
||||
|
||||
public MsgSettingShippingInfo() {
|
||||
SetCommand(0x3207);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
DanaRKoreanPump pump = DanaRKoreanPlugin.getDanaRPump();
|
||||
pump.serialNumber = stringFromBuff(bytes, 0, 10);
|
||||
pump.shippingDate = dateFromBuff(bytes, 10);
|
||||
pump.shippingCountry = asciiStringFromBuff(bytes, 13, 3);
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Serial number: " + pump.serialNumber);
|
||||
log.debug("Shipping date: " + pump.shippingDate);
|
||||
log.debug("Shipping country: " + pump.shippingCountry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
|
||||
public class MsgStatus extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgStatus.class);
|
||||
|
||||
public MsgStatus() {
|
||||
SetCommand(0x020B);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
DanaRKoreanPlugin.getDanaRPump().dailyTotalUnits = intFromBuff(bytes, 0, 3) / 750d;
|
||||
DanaRKoreanPlugin.getDanaRPump().isExtendedInProgress = intFromBuff(bytes, 3, 1) == 1;
|
||||
DanaRKoreanPlugin.getDanaRPump().extendedBolusMinutes = intFromBuff(bytes, 4, 2);
|
||||
DanaRKoreanPlugin.getDanaRPump().extendedBolusAmount = intFromBuff(bytes, 6, 2) / 100d;
|
||||
Double lastBolusAmount = intFromBuff(bytes, 13, 2) / 100d;
|
||||
// if (lastBolusAmount != 0d) {
|
||||
// DanaRKoreanPlugin.getDanaRPump().lastBolusTime = dateTimeFromBuff(bytes, 8);
|
||||
// DanaRKoreanPlugin.getDanaRPump().lastBolusAmount = lastBolusAmount;
|
||||
// }
|
||||
DanaRKoreanPlugin.getDanaRPump().iob = intFromBuff(bytes, 15, 2) / 100d;
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Daily total: " + DanaRKoreanPlugin.getDanaRPump().dailyTotalUnits);
|
||||
log.debug("Is extended bolus running: " + DanaRKoreanPlugin.getDanaRPump().isExtendedInProgress);
|
||||
log.debug("Extended bolus min: " + DanaRKoreanPlugin.getDanaRPump().extendedBolusMinutes);
|
||||
log.debug("Extended bolus amount: " + DanaRKoreanPlugin.getDanaRPump().extendedBolusAmount);
|
||||
// log.debug("Last bolus time: " + DanaRKoreanPlugin.getDanaRPump().lastBolusTime);
|
||||
// log.debug("Last bolus amount: " + DanaRKoreanPlugin.getDanaRPump().lastBolusAmount);
|
||||
log.debug("IOB: " + DanaRKoreanPlugin.getDanaRPump().iob);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,114 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.db.TempBasal;
|
||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump;
|
||||
|
||||
public class MsgStatusBolusExtended extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgStatusBolusExtended.class);
|
||||
|
||||
public MsgStatusBolusExtended() {
|
||||
SetCommand(0x0207);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
boolean isExtendedInProgress = intFromBuff(bytes, 0, 1) == 1;
|
||||
int extendedBolusHalfHours = intFromBuff(bytes, 1, 1);
|
||||
int extendedBolusMinutes = extendedBolusHalfHours * 30;
|
||||
|
||||
double extendedBolusAmount = intFromBuff(bytes, 2, 2) / 100d;
|
||||
int extendedBolusSoFarInSecs = intFromBuff(bytes, 4, 3);
|
||||
int extendedBolusDeliveryPulse = intFromBuff(bytes, 7, 2);
|
||||
int isEasyUIUserSleep = intFromBuff(bytes, 9, 1);
|
||||
|
||||
int extendedBolusSoFarInMinutes = extendedBolusSoFarInSecs / 60;
|
||||
double extendedBolusAbsoluteRate = isExtendedInProgress ? extendedBolusAmount / extendedBolusMinutes * 60 : 0d;
|
||||
Date extendedBolusStart = isExtendedInProgress ? getDateFromSecAgo(extendedBolusSoFarInSecs) : new Date(0);
|
||||
int extendedBolusRemainingMinutes = extendedBolusMinutes - extendedBolusSoFarInMinutes;
|
||||
|
||||
DanaRKoreanPlugin.getDanaRPump().isExtendedInProgress = isExtendedInProgress;
|
||||
DanaRKoreanPlugin.getDanaRPump().extendedBolusMinutes = extendedBolusMinutes;
|
||||
DanaRKoreanPlugin.getDanaRPump().extendedBolusAmount = extendedBolusAmount;
|
||||
DanaRKoreanPlugin.getDanaRPump().extendedBolusSoFarInMinutes = extendedBolusSoFarInMinutes;
|
||||
DanaRKoreanPlugin.getDanaRPump().extendedBolusAbsoluteRate = extendedBolusAbsoluteRate;
|
||||
DanaRKoreanPlugin.getDanaRPump().extendedBolusStart = extendedBolusStart;
|
||||
DanaRKoreanPlugin.getDanaRPump().extendedBolusRemainingMinutes = extendedBolusRemainingMinutes;
|
||||
|
||||
updateExtendedBolusInDB();
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Is extended bolus running: " + isExtendedInProgress);
|
||||
log.debug("Extended bolus min: " + extendedBolusMinutes);
|
||||
log.debug("Extended bolus amount: " + extendedBolusAmount);
|
||||
log.debug("Extended bolus so far in minutes: " + extendedBolusSoFarInMinutes);
|
||||
log.debug("Extended bolus absolute rate: " + extendedBolusAbsoluteRate);
|
||||
log.debug("Extended bolus start: " + extendedBolusStart);
|
||||
log.debug("Extended bolus remaining minutes: " + extendedBolusRemainingMinutes);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Date getDateFromSecAgo(int tempBasalAgoSecs) {
|
||||
return new Date((long) (Math.ceil(new Date().getTime() / 1000d) - tempBasalAgoSecs) * 1000);
|
||||
}
|
||||
|
||||
public static void updateExtendedBolusInDB() {
|
||||
DanaRKoreanPlugin DanaRKoreanPlugin = (DanaRKoreanPlugin) MainApp.getSpecificPlugin(DanaRKoreanPlugin.class);
|
||||
DanaRKoreanPump danaRKoreanPump = DanaRKoreanPlugin.getDanaRPump();
|
||||
Date now = new Date();
|
||||
|
||||
try {
|
||||
|
||||
if (DanaRKoreanPlugin.isExtendedBoluslInProgress()) {
|
||||
TempBasal extendedBolus = DanaRKoreanPlugin.getExtendedBolus();
|
||||
if (danaRKoreanPump.isExtendedInProgress) {
|
||||
if (extendedBolus.absolute != danaRKoreanPump.extendedBolusAbsoluteRate) {
|
||||
// Close current extended
|
||||
extendedBolus.timeEnd = now;
|
||||
MainApp.getDbHelper().getDaoTempBasals().update(extendedBolus);
|
||||
// Create new
|
||||
TempBasal newExtended = new TempBasal();
|
||||
newExtended.timeStart = now;
|
||||
newExtended.absolute = danaRKoreanPump.extendedBolusAbsoluteRate;
|
||||
newExtended.isAbsolute = true;
|
||||
newExtended.duration = danaRKoreanPump.extendedBolusMinutes;
|
||||
newExtended.isExtended = true;
|
||||
MainApp.getDbHelper().getDaoTempBasals().create(newExtended);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
} else {
|
||||
// Close curent temp basal
|
||||
extendedBolus.timeEnd = now;
|
||||
MainApp.getDbHelper().getDaoTempBasals().update(extendedBolus);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
} else {
|
||||
if (danaRKoreanPump.isExtendedInProgress) {
|
||||
// Create new
|
||||
TempBasal newExtended = new TempBasal();
|
||||
newExtended.timeStart = now;
|
||||
newExtended.absolute = danaRKoreanPump.extendedBolusAbsoluteRate;
|
||||
newExtended.isAbsolute = true;
|
||||
newExtended.duration = danaRKoreanPump.extendedBolusMinutes;
|
||||
newExtended.isExtended = true;
|
||||
MainApp.getDbHelper().getDaoTempBasals().create(newExtended);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.07.2016.
|
||||
*/
|
||||
public class MsgStatusProfile extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgStatusProfile.class);
|
||||
|
||||
public MsgStatusProfile() {
|
||||
SetCommand(0x0204);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
if (DanaRKoreanPlugin.getDanaRPump().units == DanaRKoreanPump.UNITS_MGDL) {
|
||||
DanaRKoreanPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRKoreanPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2);
|
||||
DanaRKoreanPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2);
|
||||
} else {
|
||||
DanaRKoreanPlugin.getDanaRPump().currentCIR = intFromBuff(bytes, 0, 2);
|
||||
DanaRKoreanPlugin.getDanaRPump().currentCF = intFromBuff(bytes, 2, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().currentAI = intFromBuff(bytes, 4, 2) / 100d;
|
||||
DanaRKoreanPlugin.getDanaRPump().currentTarget = intFromBuff(bytes, 6, 2) / 100d;
|
||||
}
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Pump units (saved): " + (DanaRKoreanPlugin.getDanaRPump().units == DanaRKoreanPump.UNITS_MGDL ? "MGDL" : "MMOL"));
|
||||
log.debug("Current pump CIR: " + DanaRKoreanPlugin.getDanaRPump().currentCIR);
|
||||
log.debug("Current pump CF: " + DanaRKoreanPlugin.getDanaRPump().currentCF);
|
||||
log.debug("Current pump AI: " + DanaRKoreanPlugin.getDanaRPump().currentAI);
|
||||
log.debug("Current pump target: " + DanaRKoreanPlugin.getDanaRPump().currentTarget);
|
||||
log.debug("Current pump AIDR: " + DanaRKoreanPlugin.getDanaRPump().currentAIDR);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,103 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.DanaRKorean.comm;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.db.TempBasal;
|
||||
import info.nightscout.androidaps.events.EventTempBasalChange;
|
||||
import info.nightscout.androidaps.plugins.DanaR.comm.MessageBase;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.DanaRKorean.DanaRKoreanPump;
|
||||
|
||||
public class MsgStatusTempBasal extends MessageBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MsgStatusTempBasal.class);
|
||||
|
||||
public MsgStatusTempBasal() {
|
||||
SetCommand(0x0205);
|
||||
}
|
||||
|
||||
public void handleMessage(byte[] bytes) {
|
||||
boolean isTempBasalInProgress = intFromBuff(bytes, 0, 1) == 1;
|
||||
int tempBasalPercent = intFromBuff(bytes, 1, 1);
|
||||
int tempBasalTotalSec = intFromBuff(bytes, 2, 1) * 60 * 60;
|
||||
int tempBasalRunningSeconds = intFromBuff(bytes, 3, 3);
|
||||
int tempBasalRemainingMin = (tempBasalTotalSec - tempBasalRunningSeconds) / 60;
|
||||
Date tempBasalStart = isTempBasalInProgress ? getDateFromTempBasalSecAgo(tempBasalRunningSeconds) : new Date(0);
|
||||
|
||||
DanaRKoreanPlugin.getDanaRPump().isTempBasalInProgress = isTempBasalInProgress;
|
||||
DanaRKoreanPlugin.getDanaRPump().tempBasalPercent = tempBasalPercent;
|
||||
DanaRKoreanPlugin.getDanaRPump().tempBasalRemainingMin = tempBasalRemainingMin;
|
||||
DanaRKoreanPlugin.getDanaRPump().tempBasalTotalSec = tempBasalTotalSec;
|
||||
DanaRKoreanPlugin.getDanaRPump().tempBasalStart = tempBasalStart;
|
||||
|
||||
updateTempBasalInDB();
|
||||
|
||||
if (Config.logDanaMessageDetail) {
|
||||
log.debug("Is temp basal running: " + isTempBasalInProgress);
|
||||
log.debug("Current temp basal percent: " + tempBasalPercent);
|
||||
log.debug("Current temp basal remaining min: " + tempBasalRemainingMin);
|
||||
log.debug("Current temp basal total sec: " + tempBasalTotalSec);
|
||||
log.debug("Current temp basal start: " + tempBasalStart);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Date getDateFromTempBasalSecAgo(int tempBasalAgoSecs) {
|
||||
return new Date((long) (Math.ceil(new Date().getTime() / 1000d) - tempBasalAgoSecs) * 1000);
|
||||
}
|
||||
|
||||
public static void updateTempBasalInDB() {
|
||||
DanaRKoreanPlugin DanaRKoreanPlugin = (DanaRKoreanPlugin) MainApp.getSpecificPlugin(DanaRKoreanPlugin.class);
|
||||
DanaRKoreanPump danaRKoreanPump = DanaRKoreanPlugin.getDanaRPump();
|
||||
Date now = new Date();
|
||||
|
||||
try {
|
||||
|
||||
if (DanaRKoreanPlugin.isRealTempBasalInProgress()) {
|
||||
TempBasal tempBasal = DanaRKoreanPlugin.getRealTempBasal();
|
||||
if (danaRKoreanPump.isTempBasalInProgress) {
|
||||
if (tempBasal.percent != danaRKoreanPump.tempBasalPercent) {
|
||||
// Close current temp basal
|
||||
tempBasal.timeEnd = now;
|
||||
MainApp.getDbHelper().getDaoTempBasals().update(tempBasal);
|
||||
// Create new
|
||||
TempBasal newTempBasal = new TempBasal();
|
||||
newTempBasal.timeStart = now;
|
||||
newTempBasal.percent = danaRKoreanPump.tempBasalPercent;
|
||||
newTempBasal.isAbsolute = false;
|
||||
newTempBasal.duration = danaRKoreanPump.tempBasalTotalSec / 60;
|
||||
newTempBasal.isExtended = false;
|
||||
MainApp.getDbHelper().getDaoTempBasals().create(newTempBasal);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
} else {
|
||||
// Close current temp basal
|
||||
tempBasal.timeEnd = now;
|
||||
MainApp.getDbHelper().getDaoTempBasals().update(tempBasal);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
} else {
|
||||
if (danaRKoreanPump.isTempBasalInProgress) {
|
||||
// Create new
|
||||
TempBasal newTempBasal = new TempBasal();
|
||||
newTempBasal.timeStart = now;
|
||||
newTempBasal.percent = danaRKoreanPump.tempBasalPercent;
|
||||
newTempBasal.isAbsolute = false;
|
||||
newTempBasal.duration = danaRKoreanPump.tempBasalTotalSec / 60;
|
||||
newTempBasal.isExtended = false;
|
||||
MainApp.getDbHelper().getDaoTempBasals().create(newTempBasal);
|
||||
MainApp.bus().post(new EventTempBasalChange());
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
package info.nightscout.androidaps.plugins.InsulinFastacting;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import com.jjoe64.graphview.GraphView;
|
||||
import com.jjoe64.graphview.series.DataPoint;
|
||||
import com.jjoe64.graphview.series.LineGraphSeries;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.data.Iob;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
|
||||
/**
|
||||
* Created by mike on 21.04.2017.
|
||||
*/
|
||||
|
||||
public class ActivityGraph extends GraphView {
|
||||
|
||||
Context context;
|
||||
|
||||
public ActivityGraph(Context context) {
|
||||
super(context);
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public ActivityGraph(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public void show(InsulinInterface insulin) {
|
||||
double dia = insulin.getDia();
|
||||
int hours = (int) Math.floor(dia + 1);
|
||||
|
||||
Treatment t = new Treatment(insulin);
|
||||
t.date = 0;
|
||||
t.insulin = 1d;
|
||||
|
||||
LineGraphSeries<DataPoint> activitySeries = null;
|
||||
LineGraphSeries<DataPoint> iobSeries = null;
|
||||
List<DataPoint> activityArray = new ArrayList<DataPoint>();
|
||||
List<DataPoint> iobArray = new ArrayList<DataPoint>();
|
||||
|
||||
for (long time = 0; time <= hours * 60 * 60 * 1000; time += 5 * 60 * 1000L) {
|
||||
Iob iob = t.iobCalc(time, dia);
|
||||
activityArray.add(new DataPoint(time / 60 / 1000, iob.activityContrib));
|
||||
iobArray.add(new DataPoint(time / 60 / 1000, iob.iobContrib));
|
||||
}
|
||||
|
||||
DataPoint[] activityDataPoints = new DataPoint[activityArray.size()];
|
||||
activityDataPoints = activityArray.toArray(activityDataPoints);
|
||||
addSeries(activitySeries = new LineGraphSeries<DataPoint>(activityDataPoints));
|
||||
activitySeries.setThickness(8);
|
||||
|
||||
getViewport().setXAxisBoundsManual(true);
|
||||
getViewport().setMinX(0);
|
||||
getViewport().setMaxX(hours * 60);
|
||||
getGridLabelRenderer().setNumHorizontalLabels(hours + 1);
|
||||
getGridLabelRenderer().setHorizontalAxisTitle("[min]");
|
||||
|
||||
DataPoint[] iobDataPoints = new DataPoint[iobArray.size()];
|
||||
iobDataPoints = iobArray.toArray(iobDataPoints);
|
||||
getSecondScale().addSeries(iobSeries = new LineGraphSeries<DataPoint>(iobDataPoints));
|
||||
iobSeries.setDrawBackground(true);
|
||||
iobSeries.setColor(Color.MAGENTA);
|
||||
iobSeries.setBackgroundColor(Color.argb(70, 255, 0, 255));
|
||||
getSecondScale().setMinY(0);
|
||||
getSecondScale().setMaxY(1);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package info.nightscout.androidaps.plugins.InsulinFastacting;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
|
||||
/**
|
||||
* Created by mike on 17.04.2017.
|
||||
*/
|
||||
|
||||
public class InsulinFastactingFragment extends Fragment {
|
||||
static InsulinFastactingPlugin insulinFastactingPlugin = new InsulinFastactingPlugin();
|
||||
|
||||
static public InsulinFastactingPlugin getPlugin() {
|
||||
return insulinFastactingPlugin;
|
||||
}
|
||||
|
||||
TextView insulinName;
|
||||
TextView insulinComment;
|
||||
TextView insulinDia;
|
||||
ActivityGraph insulinGraph;
|
||||
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.insulin_fragment, container, false);
|
||||
|
||||
insulinName = (TextView) view.findViewById(R.id.insulin_name);
|
||||
insulinComment = (TextView) view.findViewById(R.id.insulin_comment);
|
||||
insulinDia = (TextView) view.findViewById(R.id.insulin_dia);
|
||||
insulinGraph = (ActivityGraph) view.findViewById(R.id.insuling_graph);
|
||||
|
||||
insulinName.setText(insulinFastactingPlugin.getFriendlyName());
|
||||
insulinComment.setText(insulinFastactingPlugin.getComment());
|
||||
insulinDia.setText(MainApp.sResources.getText(R.string.dia) + " " + new Double(insulinFastactingPlugin.getDia()).toString() + "h");
|
||||
insulinGraph.show(insulinFastactingPlugin);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,122 @@
|
|||
package info.nightscout.androidaps.plugins.InsulinFastacting;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.Iob;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
|
||||
/**
|
||||
* Created by mike on 17.04.2017.
|
||||
*/
|
||||
|
||||
public class InsulinFastactingPlugin implements PluginBase, InsulinInterface {
|
||||
|
||||
private static boolean fragmentEnabled = true;
|
||||
private static boolean fragmentVisible = false;
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return INSULIN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFragmentClass() {
|
||||
return InsulinFastactingFragment.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return MainApp.sResources.getString(R.string.fastactinginsulin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNameShort() {
|
||||
return MainApp.sResources.getString(R.string.insulin_shortname);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(int type) {
|
||||
return type == INSULIN && fragmentEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisibleInTabs(int type) {
|
||||
return type == INSULIN && fragmentVisible;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeHidden(int type) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
if (type == INSULIN) this.fragmentEnabled = fragmentEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||
if (type == INSULIN) this.fragmentVisible = fragmentVisible;
|
||||
}
|
||||
|
||||
// Insulin interface
|
||||
@Override
|
||||
public int getId() {
|
||||
return FASTACTINGINSULIN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFriendlyName() {
|
||||
return MainApp.sResources.getString(R.string.fastactinginsulin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComment() {
|
||||
return MainApp.sResources.getString(R.string.fastactinginsulincomment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDia() {
|
||||
return MainApp.getConfigBuilder().getProfile().getDia();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iob iobCalcForTreatment(Treatment treatment, long time, Double dia) {
|
||||
Iob result = new Iob();
|
||||
|
||||
double scaleFactor = 3.0 / dia;
|
||||
double peak = 75d;
|
||||
double end = 180d;
|
||||
|
||||
if (treatment.insulin != 0d) {
|
||||
long bolusTime = treatment.date;
|
||||
double minAgo = scaleFactor * (time - bolusTime) / 1000d / 60d;
|
||||
|
||||
if (minAgo < peak) {
|
||||
double x1 = minAgo / 5d + 1;
|
||||
result.iobContrib = treatment.insulin * (1 - 0.001852 * x1 * x1 + 0.001852 * x1);
|
||||
// units: BG (mg/dL) = (BG/U) * U insulin * scalar
|
||||
result.activityContrib = treatment.insulin * (2 / dia / 60 / peak) * minAgo;
|
||||
|
||||
} else if (minAgo < end) {
|
||||
double x2 = (minAgo - 75) / 5;
|
||||
result.iobContrib = treatment.insulin * (0.001323 * x2 * x2 - 0.054233 * x2 + 0.55556);
|
||||
result.activityContrib = treatment.insulin * (2 / dia / 60 - (minAgo - peak) * 2 / dia / 60 / (60 * 3 - peak));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package info.nightscout.androidaps.plugins.InsulinFastactingProlonged;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.InsulinFastacting.ActivityGraph;
|
||||
|
||||
/**
|
||||
* Created by mike on 17.04.2017.
|
||||
*/
|
||||
|
||||
public class InsulinFastactingProlongedFragment extends Fragment {
|
||||
static InsulinFastactingProlongedPlugin insulinFastactingProlongedPlugin = new InsulinFastactingProlongedPlugin();
|
||||
|
||||
static public InsulinFastactingProlongedPlugin getPlugin() {
|
||||
return insulinFastactingProlongedPlugin;
|
||||
}
|
||||
|
||||
TextView insulinName;
|
||||
TextView insulinComment;
|
||||
TextView insulinDia;
|
||||
ActivityGraph insulinGraph;
|
||||
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.insulin_fragment, container, false);
|
||||
|
||||
insulinName = (TextView) view.findViewById(R.id.insulin_name);
|
||||
insulinComment = (TextView) view.findViewById(R.id.insulin_comment);
|
||||
insulinDia = (TextView) view.findViewById(R.id.insulin_dia);
|
||||
insulinGraph = (ActivityGraph) view.findViewById(R.id.insuling_graph);
|
||||
|
||||
insulinName.setText(insulinFastactingProlongedPlugin.getFriendlyName());
|
||||
insulinComment.setText(insulinFastactingProlongedPlugin.getComment());
|
||||
insulinDia.setText(MainApp.sResources.getText(R.string.dia) + " " + new Double(insulinFastactingProlongedPlugin.getDia()).toString() + "h");
|
||||
insulinGraph.show(insulinFastactingProlongedPlugin);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
package info.nightscout.androidaps.plugins.InsulinFastactingProlonged;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.Iob;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
import info.nightscout.androidaps.interfaces.InsulinInterface;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
|
||||
/**
|
||||
* Created by mike on 17.04.2017.
|
||||
*/
|
||||
|
||||
public class InsulinFastactingProlongedPlugin implements PluginBase, InsulinInterface {
|
||||
|
||||
private static boolean fragmentEnabled = false;
|
||||
private static boolean fragmentVisible = false;
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return INSULIN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFragmentClass() {
|
||||
return InsulinFastactingProlongedFragment.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return MainApp.sResources.getString(R.string.fastactinginsulinprolonged);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNameShort() {
|
||||
return MainApp.sResources.getString(R.string.insulin_shortname);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(int type) {
|
||||
return type == INSULIN && fragmentEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisibleInTabs(int type) {
|
||||
return type == INSULIN && fragmentVisible;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeHidden(int type) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
if (type == INSULIN) this.fragmentEnabled = fragmentEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||
if (type == INSULIN) this.fragmentVisible = fragmentVisible;
|
||||
}
|
||||
|
||||
// Insulin interface
|
||||
@Override
|
||||
public int getId() {
|
||||
return FASTACTINGINSULINPROLONGED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFriendlyName() {
|
||||
return MainApp.sResources.getString(R.string.fastactinginsulinprolonged);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComment() {
|
||||
return MainApp.sResources.getString(R.string.fastactinginsulincomment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDia() {
|
||||
return MainApp.getConfigBuilder().getProfile().getDia();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iob iobCalcForTreatment(Treatment treatment, long time, Double dia) {
|
||||
Iob result = new Iob();
|
||||
|
||||
//Double scaleFactor = 3.0 / dia;
|
||||
double peak = 75d * dia / 6.0;
|
||||
double tail = 180d * dia / 6.0;
|
||||
double end = 360d * dia / 6.0;
|
||||
double Total = 2 * peak + (tail - peak) * 5 / 2 + (end - tail) / 2;
|
||||
|
||||
if (treatment.insulin != 0d) {
|
||||
long bolusTime = treatment.date;
|
||||
double minAgo = (time - bolusTime) / 1000d / 60d;
|
||||
|
||||
if (minAgo < peak) {
|
||||
double x1 = 6 / dia * minAgo / 5d + 1;
|
||||
result.iobContrib = treatment.insulin * (1 - 0.0012595 * x1 * x1 + 0.0012595 * x1);
|
||||
// units: BG (mg/dL) = (BG/U) * U insulin * scalar
|
||||
result.activityContrib = treatment.insulin * ((2 * peak / Total) * 2 / peak / peak * minAgo);
|
||||
} else if (minAgo < tail) {
|
||||
double x2 = (6 / dia * (minAgo - peak)) / 5;
|
||||
result.iobContrib = treatment.insulin * (0.00074 * x2 * x2 - 0.0403 * x2 + 0.69772);
|
||||
result.activityContrib = treatment.insulin * (-((2 * peak / Total) * 2 / peak * 3 / 4) / (tail - peak) * (minAgo - peak) + (2 * peak / Total) * 2 / peak);
|
||||
} else if (minAgo < end) {
|
||||
double x3 = (6 / dia * (minAgo - tail)) / 5;
|
||||
result.iobContrib = treatment.insulin * (0.0001323 * x3 * x3 - 0.0097 * x3 + 0.17776);
|
||||
result.activityContrib = treatment.insulin * (-((2 * peak / Total) * 2 / peak * 1 / 4) / (end - tail) * (minAgo - tail) + (2 * peak / Total) * 2 / peak / 4);
|
||||
}
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package info.nightscout.androidaps.plugins.IobCobCalculator;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Created by mike on 25.04.2017.
|
||||
*/
|
||||
|
||||
public class AutosensData {
|
||||
long time = 0L;
|
||||
public String pastSensitivity = "";
|
||||
public double deviation = 0d;
|
||||
boolean calculateWithDeviation = false;
|
||||
double absorbed = 0d;
|
||||
public double carbsFromBolus = 0d;
|
||||
public double cob = 0;
|
||||
public double bgi = 0d;
|
||||
public double delta = 0d;
|
||||
|
||||
public String log(long time) {
|
||||
return "AutosensData: " + new Date(time).toLocaleString() + " " + pastSensitivity + " Delta=" + delta + " Bgi=" + bgi + " Deviation=" + deviation + " Absorbed=" + absorbed + " CarbsFromBolus=" + carbsFromBolus + " COB=" + cob;
|
||||
}
|
||||
|
||||
public int minOld() {
|
||||
return (int) ((new Date().getTime() - time) / 1000 / 60);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.androidaps.plugins.OpenAPSAMA;
|
||||
package info.nightscout.androidaps.plugins.IobCobCalculator;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
|
@ -0,0 +1,16 @@
|
|||
package info.nightscout.androidaps.plugins.IobCobCalculator;
|
||||
|
||||
import android.support.v4.app.Fragment;
|
||||
|
||||
/**
|
||||
* Created by adrian on 17/11/16.
|
||||
*/
|
||||
|
||||
public class IobCobCalculatorFragment extends Fragment {
|
||||
|
||||
private static IobCobCalculatorPlugin iobCobCalculatorPlugin = new IobCobCalculatorPlugin();
|
||||
|
||||
public static IobCobCalculatorPlugin getPlugin() {
|
||||
return iobCobCalculatorPlugin;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,629 @@
|
|||
package info.nightscout.androidaps.plugins.IobCobCalculator;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.util.LongSparseArray;
|
||||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.db.BgReading;
|
||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||
import info.nightscout.androidaps.db.Treatment;
|
||||
import info.nightscout.androidaps.events.EventNewBG;
|
||||
import info.nightscout.androidaps.events.EventNewBasalProfile;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.plugins.IobCobCalculator.events.BasalData;
|
||||
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
|
||||
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData;
|
||||
import info.nightscout.utils.Round;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.SafeParse;
|
||||
|
||||
/**
|
||||
* Created by mike on 24.04.2017.
|
||||
*/
|
||||
|
||||
public class IobCobCalculatorPlugin implements PluginBase {
|
||||
private static Logger log = LoggerFactory.getLogger(IobCobCalculatorPlugin.class);
|
||||
|
||||
private static LongSparseArray<IobTotal> iobTable = new LongSparseArray<>(); // oldest at index 0
|
||||
private static LongSparseArray<AutosensData> autosensDataTable = new LongSparseArray<>(); // oldest at index 0
|
||||
private static LongSparseArray<BasalData> basalDataTable = new LongSparseArray<>(); // oldest at index 0
|
||||
|
||||
private static volatile List<BgReading> bgReadings = null; // newest at index 0
|
||||
private static volatile List<BgReading> bucketed_data = null;
|
||||
|
||||
private static double dia = Constants.defaultDIA;
|
||||
|
||||
private static Handler sHandler = null;
|
||||
private static HandlerThread sHandlerThread = null;
|
||||
|
||||
private static Object dataLock = new Object();
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return GENERAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFragmentClass() {
|
||||
return IobCobCalculatorFragment.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "IOB COB Calculator";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNameShort() {
|
||||
return "IOC";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(int type) {
|
||||
return type == GENERAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisibleInTabs(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeHidden(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentVisible(int type, boolean fragmentVisible) {
|
||||
|
||||
}
|
||||
|
||||
public IobCobCalculatorPlugin() {
|
||||
MainApp.bus().register(this);
|
||||
if (sHandlerThread == null) {
|
||||
sHandlerThread = new HandlerThread(IobCobCalculatorPlugin.class.getSimpleName());
|
||||
sHandlerThread.start();
|
||||
sHandler = new Handler(sHandlerThread.getLooper());
|
||||
}
|
||||
onNewBg(new EventNewBG());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static List<BgReading> getBucketedData(long fromTime) {
|
||||
//log.debug("Locking getBucketedData");
|
||||
synchronized (dataLock) {
|
||||
if (bucketed_data == null) {
|
||||
log.debug("No bucketed data available");
|
||||
return null;
|
||||
}
|
||||
int index = indexNewerThan(fromTime);
|
||||
if (index > -1) {
|
||||
List<BgReading> part = bucketed_data.subList(0, index);
|
||||
log.debug("Bucketed data striped off: " + part.size() + "/" + bucketed_data.size());
|
||||
return part;
|
||||
}
|
||||
}
|
||||
//log.debug("Releasing getBucketedData");
|
||||
return null;
|
||||
}
|
||||
|
||||
private static int indexNewerThan(long time) {
|
||||
for (int index = 0; index < bucketed_data.size(); index++) {
|
||||
if (bucketed_data.get(index).date < time)
|
||||
return index - 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static long roundUpTime(long time) {
|
||||
if (time % 60000 == 0)
|
||||
return time;
|
||||
long rouded = (time / 60000 + 1) * 60000;
|
||||
return rouded;
|
||||
}
|
||||
|
||||
private void loadBgData() {
|
||||
//log.debug("Locking loadBgData");
|
||||
synchronized (dataLock) {
|
||||
onNewProfile(null);
|
||||
bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (new Date().getTime() - 60 * 60 * 1000L * (24 + dia)), false);
|
||||
log.debug("BG data loaded. Size: " + bgReadings.size());
|
||||
}
|
||||
//log.debug("Releasing loadBgData");
|
||||
}
|
||||
|
||||
public void createBucketedData() {
|
||||
//log.debug("Locking createBucketedData");
|
||||
synchronized (dataLock) {
|
||||
if (bgReadings == null || bgReadings.size() < 3) {
|
||||
bucketed_data = null;
|
||||
return;
|
||||
}
|
||||
|
||||
bucketed_data = new ArrayList<>();
|
||||
bucketed_data.add(bgReadings.get(0));
|
||||
int j = 0;
|
||||
for (int i = 1; i < bgReadings.size(); ++i) {
|
||||
long bgTime = bgReadings.get(i).date;
|
||||
long lastbgTime = bgReadings.get(i - 1).date;
|
||||
//log.error("Processing " + i + ": " + new Date(bgTime).toString() + " " + bgReadings.get(i).value + " Previous: " + new Date(lastbgTime).toString() + " " + bgReadings.get(i - 1).value);
|
||||
if (bgReadings.get(i).value < 39 || bgReadings.get(i - 1).value < 39) {
|
||||
continue;
|
||||
}
|
||||
|
||||
long elapsed_minutes = (bgTime - lastbgTime) / (60 * 1000);
|
||||
if (Math.abs(elapsed_minutes) > 8) {
|
||||
// interpolate missing data points
|
||||
double lastbg = bgReadings.get(i - 1).value;
|
||||
elapsed_minutes = Math.abs(elapsed_minutes);
|
||||
//console.error(elapsed_minutes);
|
||||
long nextbgTime;
|
||||
while (elapsed_minutes > 5) {
|
||||
nextbgTime = lastbgTime - 5 * 60 * 1000;
|
||||
j++;
|
||||
BgReading newBgreading = new BgReading();
|
||||
newBgreading.date = nextbgTime;
|
||||
double gapDelta = bgReadings.get(i).value - lastbg;
|
||||
//console.error(gapDelta, lastbg, elapsed_minutes);
|
||||
double nextbg = lastbg + (5d / elapsed_minutes * gapDelta);
|
||||
newBgreading.value = Math.round(nextbg);
|
||||
//console.error("Interpolated", bucketed_data[j]);
|
||||
bucketed_data.add(newBgreading);
|
||||
//log.error("******************************************************************************************************* Adding:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
|
||||
|
||||
elapsed_minutes = elapsed_minutes - 5;
|
||||
lastbg = nextbg;
|
||||
lastbgTime = nextbgTime;
|
||||
}
|
||||
j++;
|
||||
BgReading newBgreading = new BgReading();
|
||||
newBgreading.value = bgReadings.get(i).value;
|
||||
newBgreading.date = bgTime;
|
||||
bucketed_data.add(newBgreading);
|
||||
//log.error("******************************************************************************************************* Copying:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
|
||||
} else if (Math.abs(elapsed_minutes) > 2) {
|
||||
j++;
|
||||
BgReading newBgreading = new BgReading();
|
||||
newBgreading.value = bgReadings.get(i).value;
|
||||
newBgreading.date = bgTime;
|
||||
bucketed_data.add(newBgreading);
|
||||
//log.error("******************************************************************************************************* Copying:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
|
||||
} else {
|
||||
bucketed_data.get(j).value = (bucketed_data.get(j).value + bgReadings.get(i).value) / 2;
|
||||
//log.error("***** Average");
|
||||
}
|
||||
}
|
||||
log.debug("Bucketed data created. Size: " + bucketed_data.size());
|
||||
}
|
||||
//log.debug("Releasing createBucketedData");
|
||||
}
|
||||
|
||||
public void calculateSensitivityData() {
|
||||
if (MainApp.getConfigBuilder() == null)
|
||||
return; // app still initializing
|
||||
//log.debug("Locking calculateSensitivityData");
|
||||
synchronized (dataLock) {
|
||||
|
||||
if (bucketed_data == null || bucketed_data.size() < 3) {
|
||||
log.debug("calculateSensitivityData: No bucketed data available");
|
||||
return;
|
||||
}
|
||||
|
||||
long prevDataTime = roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date);
|
||||
log.debug("Prev data time: " + new Date(prevDataTime).toLocaleString());
|
||||
AutosensData previous = autosensDataTable.get(prevDataTime);
|
||||
// start from oldest to be able sub cob
|
||||
for (int i = bucketed_data.size() - 4; i >= 0; i--) {
|
||||
// check if data already exists
|
||||
long bgTime = bucketed_data.get(i).date;
|
||||
bgTime = roundUpTime(bgTime);
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile(bgTime);
|
||||
|
||||
AutosensData existing;
|
||||
if ((existing = autosensDataTable.get(bgTime)) != null) {
|
||||
previous = existing;
|
||||
continue;
|
||||
}
|
||||
|
||||
double sens = Profile.toMgdl(profile.getIsf(bgTime), profile.getUnits());
|
||||
|
||||
AutosensData autosensData = new AutosensData();
|
||||
autosensData.time = bgTime;
|
||||
|
||||
//console.error(bgTime , bucketed_data[i].glucose);
|
||||
double bg;
|
||||
double avgDelta;
|
||||
double delta;
|
||||
bg = bucketed_data.get(i).value;
|
||||
if (bg < 39 || bucketed_data.get(i + 3).value < 39) {
|
||||
log.error("! value < 39");
|
||||
continue;
|
||||
}
|
||||
delta = (bg - bucketed_data.get(i + 1).value);
|
||||
|
||||
IobTotal iob = calulateFromTreatmentsAndTemps(bgTime);
|
||||
|
||||
double bgi = -iob.activity * sens * 5;
|
||||
double deviation = delta - bgi;
|
||||
|
||||
List<Treatment> recentTreatments = MainApp.getConfigBuilder().getTreatments5MinBackFromHistory(bgTime);
|
||||
for (int ir = 0; ir < recentTreatments.size(); ir++) {
|
||||
autosensData.carbsFromBolus += recentTreatments.get(ir).carbs;
|
||||
}
|
||||
|
||||
// if we are absorbing carbs
|
||||
if (previous != null && previous.cob > 0) {
|
||||
// figure out how many carbs that represents
|
||||
// but always assume at least 3mg/dL/5m (default) absorption
|
||||
double ci = Math.max(deviation, SP.getDouble("openapsama_min_5m_carbimpact", 3.0));
|
||||
autosensData.absorbed = ci * profile.getIc(bgTime) / sens;
|
||||
// and add that to the running total carbsAbsorbed
|
||||
autosensData.cob = Math.max(previous.cob - autosensData.absorbed, 0d);
|
||||
}
|
||||
autosensData.cob += autosensData.carbsFromBolus;
|
||||
autosensData.deviation = deviation;
|
||||
autosensData.bgi = bgi;
|
||||
autosensData.delta = delta;
|
||||
|
||||
// calculate autosens only without COB
|
||||
if (autosensData.cob <= 0) {
|
||||
if (Math.abs(deviation) < Constants.DEVIATION_TO_BE_EQUAL) {
|
||||
autosensData.pastSensitivity += "=";
|
||||
} else if (deviation > 0) {
|
||||
autosensData.pastSensitivity += "+";
|
||||
} else {
|
||||
autosensData.pastSensitivity += "-";
|
||||
}
|
||||
autosensData.calculateWithDeviation = true;
|
||||
} else {
|
||||
autosensData.pastSensitivity += "C";
|
||||
}
|
||||
//log.debug("TIME: " + new Date(bgTime).toString() + " BG: " + bg + " SENS: " + sens + " DELTA: " + delta + " AVGDELTA: " + avgDelta + " IOB: " + iob.iob + " ACTIVITY: " + iob.activity + " BGI: " + bgi + " DEVIATION: " + deviation);
|
||||
|
||||
previous = autosensData;
|
||||
autosensDataTable.put(bgTime, autosensData);
|
||||
if (Config.logAutosensData)
|
||||
log.debug(autosensData.log(bgTime));
|
||||
}
|
||||
}
|
||||
MainApp.bus().post(new EventAutosensCalculationFinished());
|
||||
//log.debug("Releasing calculateSensitivityData");
|
||||
}
|
||||
|
||||
public static IobTotal calulateFromTreatmentsAndTemps(long time) {
|
||||
long now = new Date().getTime();
|
||||
time = roundUpTime(time);
|
||||
if (time < now && iobTable.get(time) != null) {
|
||||
//log.debug(">>> Cache hit");
|
||||
return iobTable.get(time);
|
||||
} else {
|
||||
//log.debug(">>> Cache miss " + new Date(time).toLocaleString());
|
||||
}
|
||||
IobTotal bolusIob = MainApp.getConfigBuilder().getCalculationToTimeTreatments(time).round();
|
||||
IobTotal basalIob = MainApp.getConfigBuilder().getCalculationToTimeTempBasals(time).round();
|
||||
/*
|
||||
if (basalIob.basaliob > 0) {
|
||||
log.debug(new Date(time).toLocaleString() + " basaliob: " + basalIob.basaliob );
|
||||
}
|
||||
*/
|
||||
IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round();
|
||||
if (time < new Date().getTime()) {
|
||||
iobTable.put(time, iobTotal);
|
||||
}
|
||||
return iobTotal;
|
||||
}
|
||||
|
||||
private static Long findPreviousTimeFromBucketedData(long time) {
|
||||
if (bucketed_data == null)
|
||||
return null;
|
||||
for (int index = 0; index < bucketed_data.size(); index++) {
|
||||
if (bucketed_data.get(index).date < time)
|
||||
return bucketed_data.get(index).date;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static BasalData getBasalData(long time) {
|
||||
long now = new Date().getTime();
|
||||
time = roundUpTime(time);
|
||||
BasalData retval = basalDataTable.get(time);
|
||||
if (retval == null) {
|
||||
retval = new BasalData();
|
||||
TemporaryBasal tb = MainApp.getConfigBuilder().getTempBasalFromHistory(time);
|
||||
retval.basal = MainApp.getConfigBuilder().getProfile(time).getBasal(time);
|
||||
if (tb != null) {
|
||||
retval.isTempBasalRunning = true;
|
||||
retval.tempBasalAbsolute = tb.tempBasalConvertedToAbsolute(time);
|
||||
} else {
|
||||
retval.isTempBasalRunning = false;
|
||||
retval.tempBasalAbsolute = retval.basal;
|
||||
}
|
||||
if (time < now) {
|
||||
basalDataTable.append(time, retval);
|
||||
}
|
||||
//log.debug(">>> Cache miss " + new Date(time).toLocaleString());
|
||||
} else {
|
||||
//log.debug(">>> Cache hit " + new Date(time).toLocaleString());
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
public static AutosensData getAutosensData(long time) {
|
||||
long now = new Date().getTime();
|
||||
if (time > now)
|
||||
return null;
|
||||
Long previous = findPreviousTimeFromBucketedData(time);
|
||||
if (previous == null)
|
||||
return null;
|
||||
time = roundUpTime(previous);
|
||||
AutosensData data = autosensDataTable.get(time);
|
||||
if (data != null) {
|
||||
//log.debug(">>> Cache hit " + data.log(time));
|
||||
return data;
|
||||
} else {
|
||||
//log.debug(">>> Cache miss " + new Date(time).toLocaleString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static AutosensData getLastAutosensData() {
|
||||
if (autosensDataTable.size() < 1)
|
||||
return null;
|
||||
AutosensData data = autosensDataTable.valueAt(autosensDataTable.size() - 1);
|
||||
if (data.time < new Date().getTime() - 5 * 60 * 1000) {
|
||||
return null;
|
||||
} else {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
public static IobTotal[] calculateIobArrayInDia() {
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile();
|
||||
// predict IOB out to DIA plus 30m
|
||||
long time = new Date().getTime();
|
||||
int len = (int) ((profile.getDia() * 60 + 30) / 5);
|
||||
IobTotal[] array = new IobTotal[len];
|
||||
int pos = 0;
|
||||
for (int i = 0; i < len; i++) {
|
||||
long t = time + i * 5 * 60000;
|
||||
IobTotal iob = calulateFromTreatmentsAndTemps(t);
|
||||
array[pos] = iob;
|
||||
pos++;
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
public static AutosensResult detectSensitivity(long fromTime) {
|
||||
//log.debug("Locking detectSensitivity");
|
||||
synchronized (dataLock) {
|
||||
if (autosensDataTable == null || autosensDataTable.size() < 4) {
|
||||
log.debug("No autosens data available");
|
||||
return new AutosensResult();
|
||||
}
|
||||
|
||||
AutosensData current = getLastAutosensData();
|
||||
if (current == null) {
|
||||
log.debug("No current autosens data available");
|
||||
return new AutosensResult();
|
||||
}
|
||||
|
||||
|
||||
List<Double> deviationsArray = new ArrayList<>();
|
||||
String pastSensitivity = "";
|
||||
int index = 0;
|
||||
while (index < autosensDataTable.size()) {
|
||||
AutosensData autosensData = autosensDataTable.valueAt(index);
|
||||
|
||||
if (autosensData.time < fromTime) {
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (autosensData.calculateWithDeviation)
|
||||
deviationsArray.add(autosensData.deviation);
|
||||
|
||||
pastSensitivity += autosensData.pastSensitivity;
|
||||
int secondsFromMidnight = Profile.secondsFromMidnight(autosensData.time);
|
||||
if (secondsFromMidnight % 3600 < 2.5 * 60 || secondsFromMidnight % 3600 > 57.5 * 60) {
|
||||
pastSensitivity += "(" + Math.round(secondsFromMidnight / 3600d) + ")";
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
Double[] deviations = new Double[deviationsArray.size()];
|
||||
deviations = deviationsArray.toArray(deviations);
|
||||
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile();
|
||||
|
||||
double sens = profile.getIsf();
|
||||
|
||||
double ratio = 1;
|
||||
String ratioLimit = "";
|
||||
String sensResult = "";
|
||||
|
||||
log.debug("Records: " + index + " " + pastSensitivity);
|
||||
Arrays.sort(deviations);
|
||||
|
||||
for (double i = 0.9; i > 0.1; i = i - 0.02) {
|
||||
if (percentile(deviations, (i + 0.02)) >= 0 && percentile(deviations, i) < 0) {
|
||||
log.debug(Math.round(100 * i) + "% of non-meal deviations negative (target 45%-50%)");
|
||||
}
|
||||
}
|
||||
double pSensitive = percentile(deviations, 0.50);
|
||||
double pResistant = percentile(deviations, 0.45);
|
||||
|
||||
double basalOff = 0;
|
||||
|
||||
if (pSensitive < 0) { // sensitive
|
||||
basalOff = pSensitive * (60 / 5) / Profile.toMgdl(sens, profile.getUnits());
|
||||
sensResult = "Excess insulin sensitivity detected";
|
||||
} else if (pResistant > 0) { // resistant
|
||||
basalOff = pResistant * (60 / 5) / Profile.toMgdl(sens, profile.getUnits());
|
||||
sensResult = "Excess insulin resistance detected";
|
||||
} else {
|
||||
sensResult = "Sensitivity normal";
|
||||
}
|
||||
log.debug(sensResult);
|
||||
ratio = 1 + (basalOff / profile.getMaxDailyBasal());
|
||||
|
||||
double rawRatio = ratio;
|
||||
ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_min", "0.7")));
|
||||
ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2")));
|
||||
|
||||
if (ratio != rawRatio) {
|
||||
ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio;
|
||||
log.debug(ratioLimit);
|
||||
}
|
||||
|
||||
double newisf = Math.round(Profile.toMgdl(sens, profile.getUnits()) / ratio);
|
||||
if (ratio != 1) {
|
||||
log.debug("ISF adjusted from " + Profile.toMgdl(sens, profile.getUnits()) + " to " + newisf);
|
||||
}
|
||||
|
||||
AutosensResult output = new AutosensResult();
|
||||
output.ratio = Round.roundTo(ratio, 0.01);
|
||||
output.carbsAbsorbed = Round.roundTo(current.cob, 0.01);
|
||||
output.pastSensitivity = pastSensitivity;
|
||||
output.ratioLimit = ratioLimit;
|
||||
output.sensResult = sensResult;
|
||||
return output;
|
||||
}
|
||||
//log.debug("Releasing detectSensitivity");
|
||||
}
|
||||
|
||||
|
||||
public static JSONArray convertToJSONArray(IobTotal[] iobArray) {
|
||||
JSONArray array = new JSONArray();
|
||||
for (int i = 0; i < iobArray.length; i++) {
|
||||
array.put(iobArray[i].determineBasalJson());
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onNewBg(EventNewBG ev) {
|
||||
sHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
loadBgData();
|
||||
createBucketedData();
|
||||
calculateSensitivityData();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onNewProfile(EventNewBasalProfile ev) {
|
||||
if (MainApp.getConfigBuilder() == null)
|
||||
return; // app still initializing
|
||||
Profile profile = MainApp.getConfigBuilder().getProfile();
|
||||
dia = profile.getDia();
|
||||
if (ev == null) { // on init no need of reset
|
||||
return;
|
||||
}
|
||||
synchronized (dataLock) {
|
||||
log.debug("Invalidating cached data because of new profile. IOB: " + iobTable.size() + " Autosens: " + autosensDataTable.size() + " records");
|
||||
iobTable = new LongSparseArray<>();
|
||||
autosensDataTable = new LongSparseArray<>();
|
||||
}
|
||||
sHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
calculateSensitivityData();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// When historical data is changed (comming from NS etc) finished calculations after this date must be invalidated
|
||||
@Subscribe
|
||||
public void onNewHistoryData(EventNewHistoryData ev) {
|
||||
//log.debug("Locking onNewHistoryData");
|
||||
synchronized (dataLock) {
|
||||
long time = ev.time;
|
||||
log.debug("Invalidating cached data to: " + new Date(time).toLocaleString());
|
||||
for (int index = iobTable.size() - 1; index >= 0; index--) {
|
||||
if (iobTable.keyAt(index) > time) {
|
||||
if (Config.logAutosensData)
|
||||
log.debug("Removing from iobTable: " + new Date(iobTable.keyAt(index)).toLocaleString());
|
||||
iobTable.removeAt(index);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int index = autosensDataTable.size() - 1; index >= 0; index--) {
|
||||
if (autosensDataTable.keyAt(index) > time) {
|
||||
if (Config.logAutosensData)
|
||||
log.debug("Removing from autosensDataTable: " + new Date(autosensDataTable.keyAt(index)).toLocaleString());
|
||||
autosensDataTable.removeAt(index);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (int index = basalDataTable.size() - 1; index >= 0; index--) {
|
||||
if (basalDataTable.keyAt(index) > time) {
|
||||
if (Config.logAutosensData)
|
||||
log.debug("Removing from basalDataTable: " + new Date(basalDataTable.keyAt(index)).toLocaleString());
|
||||
basalDataTable.removeAt(index);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
sHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
calculateSensitivityData();
|
||||
}
|
||||
});
|
||||
//log.debug("Releasing onNewHistoryData");
|
||||
}
|
||||
|
||||
// From https://gist.github.com/IceCreamYou/6ffa1b18c4c8f6aeaad2
|
||||
// Returns the value at a given percentile in a sorted numeric array.
|
||||
// "Linear interpolation between closest ranks" method
|
||||
public static double percentile(Double[] arr, double p) {
|
||||
if (arr.length == 0) return 0;
|
||||
if (p <= 0) return arr[0];
|
||||
if (p >= 1) return arr[arr.length - 1];
|
||||
|
||||
double index = arr.length * p,
|
||||
lower = Math.floor(index),
|
||||
upper = lower + 1,
|
||||
weight = index % 1;
|
||||
|
||||
if (upper >= arr.length) return arr[(int) lower];
|
||||
return arr[(int) lower] * (1 - weight) + arr[(int) upper] * weight;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package info.nightscout.androidaps.plugins.IobCobCalculator.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 10.06.2017.
|
||||
*/
|
||||
|
||||
public class BasalData {
|
||||
public double basal;
|
||||
public double tempBasalAbsolute;
|
||||
public boolean isTempBasalRunning;
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package info.nightscout.androidaps.plugins.IobCobCalculator.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 30.04.2017.
|
||||
*/
|
||||
|
||||
public class EventAutosensCalculationFinished {
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package info.nightscout.androidaps.plugins.IobCobCalculator.events;
|
||||
|
||||
/**
|
||||
* Created by mike on 26.04.2017.
|
||||
*/
|
||||
|
||||
public class EventNewHistoryData {
|
||||
public long time = 0;
|
||||
|
||||
public EventNewHistoryData(long time) {
|
||||
this.time = time;
|
||||
}
|
||||
}
|
|
@ -402,16 +402,4 @@ public class DeviceStatus {
|
|||
return record;
|
||||
}
|
||||
|
||||
public void sendToNSClient() {
|
||||
Context context = MainApp.instance().getApplicationContext();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString("action", "dbAdd");
|
||||
bundle.putString("collection", "devicestatus");
|
||||
bundle.putString("data", mongoRecord().toString());
|
||||
Intent intent = new Intent(Intents.ACTION_DATABASE);
|
||||
intent.putExtras(bundle);
|
||||
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
|
||||
context.sendBroadcast(intent);
|
||||
DbLogger.dbAdd(intent, mongoRecord().toString(), DeviceStatus.class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,11 +19,10 @@ import org.slf4j.LoggerFactory;
|
|||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||
import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui;
|
||||
import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
|
||||
|
||||
public class LoopFragment extends Fragment implements View.OnClickListener, FragmentBase {
|
||||
public class LoopFragment extends Fragment implements View.OnClickListener {
|
||||
private static Logger log = LoggerFactory.getLogger(LoopFragment.class);
|
||||
|
||||
private static LoopPlugin loopPlugin;
|
||||
|
|
|
@ -12,6 +12,7 @@ import android.support.v7.app.NotificationCompat;
|
|||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
@ -32,7 +33,10 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
|||
import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui;
|
||||
import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
|
||||
import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification;
|
||||
import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin;
|
||||
import info.nightscout.utils.NSUpload;
|
||||
import info.nightscout.utils.SP;
|
||||
import info.nightscout.utils.SafeParse;
|
||||
|
||||
/**
|
||||
* Created by mike on 05.08.2016.
|
||||
|
@ -44,7 +48,7 @@ public class LoopPlugin implements PluginBase {
|
|||
private static HandlerThread sHandlerThread;
|
||||
|
||||
private boolean fragmentEnabled = false;
|
||||
private boolean fragmentVisible = true;
|
||||
private boolean fragmentVisible = false;
|
||||
|
||||
private long loopSuspendedTill = 0L; // end of manual loop suspend
|
||||
private boolean isSuperBolus = false;
|
||||
|
@ -113,6 +117,16 @@ public class LoopPlugin implements PluginBase {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
if (type == LOOP) this.fragmentEnabled = fragmentEnabled;
|
||||
|
@ -246,7 +260,7 @@ public class LoopPlugin implements PluginBase {
|
|||
lastRun.source = ((PluginBase) usedAPS).getName();
|
||||
lastRun.setByPump = null;
|
||||
|
||||
if (constraintsInterface.isClosedModeEnabled()) {
|
||||
if (constraintsInterface.isClosedModeEnabled()) {
|
||||
if (result.changeRequested) {
|
||||
final PumpEnactResult waiting = new PumpEnactResult();
|
||||
final PumpEnactResult previousResult = lastRun.setByPump;
|
||||
|
@ -306,7 +320,7 @@ public class LoopPlugin implements PluginBase {
|
|||
}
|
||||
|
||||
MainApp.bus().post(new EventLoopUpdateGui());
|
||||
MainApp.getConfigBuilder().uploadDeviceStatus();
|
||||
NSUpload.uploadDeviceStatus();
|
||||
} finally {
|
||||
if (Config.logFunctionCalls)
|
||||
log.debug("invoke end");
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.MDI;
|
||||
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||
import info.nightscout.androidaps.plugins.VirtualPump.VirtualPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.VirtualPump.events.EventVirtualPumpUpdateGui;
|
||||
|
||||
public class MDIFragment extends Fragment implements FragmentBase {
|
||||
private static Logger log = LoggerFactory.getLogger(MDIFragment.class);
|
||||
|
||||
private static MDIPlugin mdiPlugin = new MDIPlugin();
|
||||
|
||||
public static MDIPlugin getPlugin() {
|
||||
return mdiPlugin;
|
||||
}
|
||||
}
|
|
@ -28,13 +28,12 @@ import org.slf4j.LoggerFactory;
|
|||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||
import info.nightscout.androidaps.interfaces.FragmentBase;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientNewLog;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientRestart;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientUpdateGUI;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
public class NSClientInternalFragment extends Fragment implements FragmentBase, View.OnClickListener, CompoundButton.OnCheckedChangeListener {
|
||||
public class NSClientInternalFragment extends Fragment implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
|
||||
private static Logger log = LoggerFactory.getLogger(NSClientInternalFragment.class);
|
||||
|
||||
static NSClientInternalPlugin nsClientInternalPlugin;
|
||||
|
@ -189,5 +188,4 @@ public class NSClientInternalFragment extends Fragment implements FragmentBase,
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -4,11 +4,9 @@ import android.content.ComponentName;
|
|||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.IBinder;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.Html;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
|
@ -20,20 +18,15 @@ import org.slf4j.LoggerFactory;
|
|||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.BuildConfig;
|
||||
import info.nightscout.androidaps.Config;
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.events.EventAppExit;
|
||||
import info.nightscout.androidaps.events.EventPreferenceChange;
|
||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||
import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||
import info.nightscout.androidaps.plugins.DanaR.Services.ExecutionService;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientNewLog;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientRestart;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientStatus;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientUpdateGUI;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService;
|
||||
|
@ -116,6 +109,16 @@ public class NSClientInternalPlugin implements PluginBase {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFragment() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInList(int type) {
|
||||
return !Config.NSCLIENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
|
||||
if (type == GENERAL) this.fragmentEnabled = fragmentEnabled;
|
||||
|
@ -147,11 +150,6 @@ public class NSClientInternalPlugin implements PluginBase {
|
|||
MainApp.instance().getApplicationContext().unbindService(mConnection);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onStatusEvent(final EventPreferenceChange s) {
|
||||
//TODO
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onStatusEvent(final EventNSClientNewLog ev) {
|
||||
addToLog(ev);
|
||||
|
|
|
@ -5,22 +5,17 @@ import android.content.Intent;
|
|||
|
||||
import com.j256.ormlite.dao.CloseableIterator;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
||||
import info.nightscout.androidaps.db.DbRequest;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService;
|
||||
import info.nightscout.utils.SP;
|
||||
|
||||
/**
|
||||
* Created by mike on 21.02.2016.
|
||||
|
@ -118,7 +113,7 @@ public class UploadQueue {
|
|||
String result = "";
|
||||
CloseableIterator<DbRequest> iterator = null;
|
||||
try {
|
||||
iterator = MainApp.getDbHelper().getDaoDbRequest().closeableIterator();
|
||||
iterator = MainApp.getDbHelper().getDbRequestInterator();
|
||||
try {
|
||||
while (iterator.hasNext()) {
|
||||
DbRequest dbr = iterator.next();
|
||||
|
|
|
@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory;
|
|||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.Services.Intents;
|
||||
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
||||
import info.nightscout.androidaps.data.ProfileStore;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -20,10 +20,9 @@ import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile;
|
|||
public class BroadcastProfile {
|
||||
private static Logger log = LoggerFactory.getLogger(BroadcastProfile.class);
|
||||
|
||||
public void handleNewTreatment(NSProfile profile, Context context, boolean isDelta) {
|
||||
public void handleNewTreatment(ProfileStore profile, Context context, boolean isDelta) {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString("profile", profile.getData().toString());
|
||||
bundle.putString("activeprofile", profile.getActiveProfile());
|
||||
bundle.putBoolean("delta", isDelta);
|
||||
Intent intent = new Intent(Intents.ACTION_NEW_PROFILE);
|
||||
intent.putExtras(bundle);
|
||||
|
|
|
@ -17,8 +17,9 @@ import info.nightscout.utils.ToastUtils;
|
|||
* Created by mike on 02.07.2016.
|
||||
*/
|
||||
public class DbLogger {
|
||||
public static void dbAdd(Intent intent, String data, Class sender) {
|
||||
Logger log = LoggerFactory.getLogger(sender);
|
||||
private static Logger log = LoggerFactory.getLogger(DbLogger.class);
|
||||
|
||||
public static void dbAdd(Intent intent, String data) {
|
||||
List<ResolveInfo> q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0);
|
||||
if (q.size() < 1) {
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.nsclientnotinstalled));
|
||||
|
@ -27,8 +28,7 @@ public class DbLogger {
|
|||
log.debug("DBADD dbAdd " + q.size() + " receivers " + data);
|
||||
}
|
||||
|
||||
public static void dbRemove(Intent intent, String data, Class sender) {
|
||||
Logger log = LoggerFactory.getLogger(sender);
|
||||
public static void dbRemove(Intent intent, String data) {
|
||||
List<ResolveInfo> q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0);
|
||||
if (q.size() < 1) {
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.nsclientnotinstalled));
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue