Merge branch 'dev' into omnipod_eros_dev_dagger
Refcator omnipod to work with Dagger - Phase 2
This commit is contained in:
commit
b1a220499d
148 changed files with 3406 additions and 2715 deletions
|
@ -217,16 +217,6 @@ public class MainApp extends DaggerApplication {
|
|||
return sResources.getString(id, args);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static int gc(@ColorRes int id) {
|
||||
return ContextCompat.getColor(instance(), id);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static Resources resources() {
|
||||
return sResources;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static MainApp instance() {
|
||||
return sInstance;
|
||||
|
|
|
@ -278,13 +278,13 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
|
|||
} else if (pref.text != null) {
|
||||
pref.dialogMessage = pref.dialogMessage
|
||||
pref.setSummary(pref.text)
|
||||
} else {
|
||||
for (plugin in pluginStore.plugins) {
|
||||
plugin.updatePreferenceSummary(pref)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (plugin in pluginStore.plugins) {
|
||||
pref?.let { pref-> pref.getKey()?.let { plugin.updatePreferenceSummary(pref) }}
|
||||
}
|
||||
|
||||
val hmacPasswords = arrayOf(
|
||||
resourceHelper.gs(R.string.key_bolus_password),
|
||||
resourceHelper.gs(R.string.key_master_password),
|
||||
|
|
|
@ -42,6 +42,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval {
|
|||
@Inject ProfileFunction profileFunction;
|
||||
@Inject ResourceHelper resourceHelper;
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject Translator translator;
|
||||
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
@ -227,7 +228,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval {
|
|||
} catch (JSONException e) {
|
||||
aapsLogger.error("Unhandled exception", e);
|
||||
}
|
||||
return Translator.translate(eventType);
|
||||
return translator.translate(eventType);
|
||||
}
|
||||
|
||||
public String getNotes() {
|
||||
|
|
|
@ -3,15 +3,12 @@ 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.Locale;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil;
|
||||
import info.nightscout.androidaps.utils.DateUtil;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
|
||||
/**
|
||||
* Created by mike on 20.09.2017.
|
||||
|
@ -20,7 +17,6 @@ import info.nightscout.androidaps.utils.DateUtil;
|
|||
|
||||
@DatabaseTable(tableName = DatabaseHelper.DATABASE_TDDS)
|
||||
public class TDD {
|
||||
private static Logger log = StacktraceLoggerWrapper.getLogger(L.DATABASE);
|
||||
|
||||
@DatabaseField(id = true)
|
||||
public long date;
|
||||
|
@ -35,14 +31,15 @@ public class TDD {
|
|||
public double total;
|
||||
|
||||
|
||||
public double getTotal(){
|
||||
return (total > 0d) ? total:(bolus+basal);
|
||||
public double getTotal() {
|
||||
return (total > 0d) ? total : (bolus + basal);
|
||||
}
|
||||
|
||||
|
||||
public TDD() { }
|
||||
public TDD() {
|
||||
}
|
||||
|
||||
public TDD(long date, double bolus, double basal, double total){
|
||||
public TDD(long date, double bolus, double basal, double total) {
|
||||
this.date = date;
|
||||
this.bolus = bolus;
|
||||
this.basal = basal;
|
||||
|
@ -61,11 +58,11 @@ public class TDD {
|
|||
']';
|
||||
}
|
||||
|
||||
public String toText() {
|
||||
return MainApp.gs(R.string.tddformat, DateUtil.dateStringShort(date), total, bolus, basal);
|
||||
public String toText(ResourceHelper resourceHelper) {
|
||||
return resourceHelper.gs(R.string.tddformat, DateUtil.dateStringShort(date), total, bolus, basal);
|
||||
}
|
||||
|
||||
public String toText(int days) {
|
||||
return MainApp.gs(R.string.tddformat, String.format("%d ", days) + MainApp.gs(R.string.days), total, bolus, basal);
|
||||
public String toText(ResourceHelper resourceHelper, int days) {
|
||||
return resourceHelper.gs(R.string.tddformat, String.format(Locale.getDefault(), "%d ", days) + resourceHelper.gs(R.string.days), total, bolus, basal);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,6 +29,16 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensData
|
|||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobOref1Thread
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobThread
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RFSpy
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkBLE
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command.SendAndListen
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command.SetPreamble
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioPacket
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioResponse
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.*
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicCommunicationManager
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUITask
|
||||
import info.nightscout.androidaps.plugins.treatments.Treatment
|
||||
import info.nightscout.androidaps.queue.CommandQueue
|
||||
import info.nightscout.androidaps.queue.commands.*
|
||||
|
@ -185,6 +195,23 @@ interface AppComponent : AndroidInjector<MainApp> {
|
|||
|
||||
fun injectGraphData(graphData: GraphData)
|
||||
|
||||
//Medtronic
|
||||
fun injectRileyLinkCommunicationManager(rileyLinkCommunicationManager: RileyLinkCommunicationManager)
|
||||
fun injectMedtronicCommunicationManager(medtronicCommunicationManager: MedtronicCommunicationManager)
|
||||
fun injectMedtronicUITask(medtronicUITask: MedtronicUITask)
|
||||
fun injectServiceTask(serviceTask: ServiceTask)
|
||||
fun injectPumpTask(pumpTask: PumpTask)
|
||||
fun injectDiscoverGattServicesTask(discoverGattServicesTask: DiscoverGattServicesTask)
|
||||
fun injectInitializePumpManagerTask(initializePumpManagerTask: InitializePumpManagerTask)
|
||||
fun injectResetRileyLinkConfigurationTask(resetRileyLinkConfigurationTask: ResetRileyLinkConfigurationTask)
|
||||
fun injectWakeAndTuneTask(wakeAndTuneTask: WakeAndTuneTask)
|
||||
fun injectRadioResponse(radioResponse: RadioResponse)
|
||||
fun injectRileyLinkBLE(rileyLinkBLE: RileyLinkBLE)
|
||||
fun injectRFSpy(rfSpy: RFSpy)
|
||||
fun injectSendAndListen(sendAndListen: SendAndListen)
|
||||
fun injectSetPreamble(setPreamble: SetPreamble)
|
||||
fun injectRadioPacket(radioPacket: RadioPacket)
|
||||
|
||||
@Component.Builder
|
||||
interface Builder {
|
||||
|
||||
|
|
|
@ -46,7 +46,16 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensData
|
|||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobOref1Thread
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobThread
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.driver.comm.AapsOmnipodManager
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RFSpy
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkBLE
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command.SendAndListen
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command.SetPreamble
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioPacket
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioResponse
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.*
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicCommunicationManager
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUITask
|
||||
import info.nightscout.androidaps.plugins.treatments.Treatment
|
||||
import info.nightscout.androidaps.queue.CommandQueue
|
||||
import info.nightscout.androidaps.queue.commands.*
|
||||
|
@ -276,11 +285,29 @@ open class AppModule {
|
|||
@ContributesAndroidInjector fun encryptedPrefsFormatInjector(): EncryptedPrefsFormat
|
||||
@ContributesAndroidInjector fun classicPrefsFormatInjector(): ClassicPrefsFormat
|
||||
|
||||
@ContributesAndroidInjector fun aapsOmnipodManagerInjector(): AapsOmnipodManager
|
||||
|
||||
@Binds fun bindContext(mainApp: MainApp): Context
|
||||
@Binds fun bindInjector(mainApp: MainApp): HasAndroidInjector
|
||||
|
||||
// Medtronic
|
||||
@ContributesAndroidInjector fun rileyLinkCommunicationManagerProvider(): RileyLinkCommunicationManager
|
||||
@ContributesAndroidInjector fun medtronicCommunicationManagerProvider(): MedtronicCommunicationManager
|
||||
@ContributesAndroidInjector fun medtronicUITaskProvider(): MedtronicUITask
|
||||
@ContributesAndroidInjector fun serviceTaskProvider(): ServiceTask
|
||||
@ContributesAndroidInjector fun pumpTaskProvider(): PumpTask
|
||||
@ContributesAndroidInjector fun discoverGattServicesTaskProvider(): DiscoverGattServicesTask
|
||||
@ContributesAndroidInjector fun initializePumpManagerTaskProvider(): InitializePumpManagerTask
|
||||
@ContributesAndroidInjector fun resetRileyLinkConfigurationTaskProvider(): ResetRileyLinkConfigurationTask
|
||||
@ContributesAndroidInjector fun wakeAndTuneTaskProvider(): WakeAndTuneTask
|
||||
@ContributesAndroidInjector fun radioResponseProvider(): RadioResponse
|
||||
@ContributesAndroidInjector fun rileyLinkBLEProvider(): RileyLinkBLE
|
||||
@ContributesAndroidInjector fun rfSpyProvider(): RFSpy
|
||||
@ContributesAndroidInjector fun sendAndListenProvider(): SendAndListen
|
||||
@ContributesAndroidInjector fun setPreambleProvider(): SetPreamble
|
||||
@ContributesAndroidInjector fun radioPacketProvider(): RadioPacket
|
||||
|
||||
// Omnipod
|
||||
@ContributesAndroidInjector fun aapsOmnipodManagerInjector(): AapsOmnipodManager
|
||||
|
||||
@Binds
|
||||
fun bindActivePluginProvider(pluginStore: PluginStore): ActivePluginProvider
|
||||
|
||||
|
|
|
@ -32,10 +32,12 @@ import info.nightscout.androidaps.plugins.insulin.InsulinFragment
|
|||
import info.nightscout.androidaps.plugins.profile.local.LocalProfileFragment
|
||||
import info.nightscout.androidaps.plugins.profile.ns.NSProfileFragment
|
||||
import info.nightscout.androidaps.plugins.pump.combo.ComboFragment
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusGeneralFragment
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusHistoryFragment
|
||||
import info.nightscout.androidaps.plugins.pump.danaR.DanaRFragment
|
||||
import info.nightscout.androidaps.plugins.pump.insight.LocalInsightFragment
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicFragment
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.OmnipodFragment
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.dialog.RileyLinkStatusDeviceMedtronic
|
||||
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpFragment
|
||||
import info.nightscout.androidaps.plugins.source.BGSourceFragment
|
||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsFragment
|
||||
|
@ -115,4 +117,8 @@ abstract class FragmentsModule {
|
|||
@ContributesAndroidInjector abstract fun contributesWizardInfoDialog(): WizardInfoDialog
|
||||
|
||||
@ContributesAndroidInjector abstract fun contributesPasswordCheck(): PasswordCheck
|
||||
}
|
||||
|
||||
@ContributesAndroidInjector abstract fun contributesRileyLinkStatusGeneral(): RileyLinkStatusGeneralFragment
|
||||
@ContributesAndroidInjector abstract fun contributesRileyLinkStatusHistoryFragment(): RileyLinkStatusHistoryFragment
|
||||
@ContributesAndroidInjector abstract fun contributesRileyLinkStatusDeviceMedtronic(): RileyLinkStatusDeviceMedtronic
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package info.nightscout.androidaps.dependencyInjection
|
|||
import dagger.Module
|
||||
import dagger.android.ContributesAndroidInjector
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkBluetoothStateReceiver
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkBroadcastReceiver
|
||||
import info.nightscout.androidaps.receivers.*
|
||||
|
||||
@Module
|
||||
|
@ -17,4 +18,6 @@ abstract class ReceiversModule {
|
|||
@ContributesAndroidInjector abstract fun contributesRileyLinkBluetoothStateReceiver(): RileyLinkBluetoothStateReceiver
|
||||
@ContributesAndroidInjector abstract fun contributesSmsReceiver(): SmsReceiver
|
||||
@ContributesAndroidInjector abstract fun contributesTimeDateOrTZChangeReceiver(): TimeDateOrTZChangeReceiver
|
||||
|
||||
@ContributesAndroidInjector abstract fun contributesRileyLinkBroadcastReceiver(): RileyLinkBroadcastReceiver
|
||||
}
|
|
@ -36,6 +36,7 @@ class CareDialog : DialogFragmentWithDate() {
|
|||
@Inject lateinit var mainApp: MainApp
|
||||
@Inject lateinit var resourceHelper: ResourceHelper
|
||||
@Inject lateinit var profileFunction: ProfileFunction
|
||||
@Inject lateinit var translator: Translator
|
||||
|
||||
enum class EventType {
|
||||
BGCHECK,
|
||||
|
@ -149,7 +150,7 @@ class CareDialog : DialogFragmentWithDate() {
|
|||
actions_care_sensor.isChecked -> "Sensor"
|
||||
else -> "Manual"
|
||||
}
|
||||
actions.add(resourceHelper.gs(R.string.careportal_newnstreatment_glucosetype) + ": " + Translator.translate(type))
|
||||
actions.add(resourceHelper.gs(R.string.careportal_newnstreatment_glucosetype) + ": " + translator.translate(type))
|
||||
actions.add(resourceHelper.gs(R.string.treatments_wizard_bg_label) + ": " + Profile.toCurrentUnitsString(profileFunction, actions_care_bg.value) + " " + resourceHelper.gs(unitResId))
|
||||
json.put("glucose", actions_care_bg.value)
|
||||
json.put("glucoseType", type)
|
||||
|
|
|
@ -11,6 +11,7 @@ interface AAPSLogger {
|
|||
fun debug(tag: LTag, message: String)
|
||||
fun debug(tag: LTag, format: String, vararg arguments: Any?)
|
||||
fun warn(tag: LTag, message: String)
|
||||
fun warn(tag: LTag, format: String, vararg arguments: Any?)
|
||||
fun info(tag: LTag, message: String)
|
||||
fun info(tag: LTag, format: String, vararg arguments: Any?)
|
||||
fun error(tag: LTag, message: String)
|
||||
|
|
|
@ -28,6 +28,10 @@ class AAPSLoggerDebug : AAPSLogger {
|
|||
Log.w(tag.tag, message)
|
||||
}
|
||||
|
||||
override fun warn(tag: LTag, format: String, vararg arguments: Any?) {
|
||||
Log.w(tag.tag, String.format(format, arguments))
|
||||
}
|
||||
|
||||
override fun info(tag: LTag, message: String) {
|
||||
Log.i(tag.tag, message)
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ class AAPSLoggerProduction : AAPSLogger {
|
|||
|
||||
override fun debug(tag: LTag, format: String, vararg arguments: Any?) {
|
||||
if (L.isEnabled(tag.tag))
|
||||
LoggerFactory.getLogger(tag.tag).debug(stackLogMarker() + String.format(format, arguments))
|
||||
LoggerFactory.getLogger(tag.tag).debug(stackLogMarker() + format, arguments)
|
||||
}
|
||||
|
||||
override fun warn(tag: LTag, message: String) {
|
||||
|
@ -35,6 +35,10 @@ class AAPSLoggerProduction : AAPSLogger {
|
|||
}
|
||||
}
|
||||
|
||||
override fun warn(tag: LTag, format: String, vararg arguments: Any?) {
|
||||
LoggerFactory.getLogger(tag.tag).warn(stackLogMarker() + format, arguments)
|
||||
}
|
||||
|
||||
override fun info(tag: LTag, message: String) {
|
||||
if (L.isEnabled(tag.tag)) {
|
||||
LoggerFactory.getLogger(tag.tag).info(stackLogMarker() + message)
|
||||
|
@ -43,7 +47,7 @@ class AAPSLoggerProduction : AAPSLogger {
|
|||
}
|
||||
|
||||
override fun info(tag: LTag, format: String, vararg arguments: Any?) {
|
||||
LoggerFactory.getLogger(tag.tag).info(stackLogMarker() + String.format(format, arguments))
|
||||
LoggerFactory.getLogger(tag.tag).info(stackLogMarker() + format, arguments)
|
||||
}
|
||||
|
||||
override fun error(tag: LTag, message: String) {
|
||||
|
@ -61,7 +65,7 @@ class AAPSLoggerProduction : AAPSLogger {
|
|||
}
|
||||
|
||||
override fun error(format: String, vararg arguments: Any?) {
|
||||
LoggerFactory.getLogger(LTag.CORE.tag).error(stackLogMarker() + String.format(format, arguments))
|
||||
LoggerFactory.getLogger(LTag.CORE.tag).error(stackLogMarker() + format, arguments)
|
||||
}
|
||||
|
||||
override fun error(tag: LTag, message: String, throwable: Throwable) {
|
||||
|
@ -72,7 +76,7 @@ class AAPSLoggerProduction : AAPSLogger {
|
|||
|
||||
override fun error(tag: LTag, format: String, vararg arguments: Any?) {
|
||||
if (L.isEnabled(tag.tag)) {
|
||||
LoggerFactory.getLogger(tag.tag).error(stackLogMarker() + String.format(format, arguments))
|
||||
LoggerFactory.getLogger(tag.tag).error(stackLogMarker() + format, arguments)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,10 @@ class AAPSLoggerTest : AAPSLogger {
|
|||
println("WARN: " + tag.tag + " " + message)
|
||||
}
|
||||
|
||||
override fun warn(tag: LTag, format: String, vararg arguments: Any?) {
|
||||
println("INFO: : " + tag.tag + " " + String.format(format, arguments))
|
||||
}
|
||||
|
||||
override fun info(tag: LTag, message: String) {
|
||||
println("INFO: " + tag.tag + " " + message)
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@ public class NewNSTreatmentDialog extends DaggerDialogFragment implements View.O
|
|||
@Inject ActivePluginProvider activePlugin;
|
||||
@Inject TreatmentsPlugin treatmentsPlugin;
|
||||
@Inject HardLimits hardLimits;
|
||||
@Inject Translator translator;
|
||||
|
||||
private static OptionsToShow options;
|
||||
private static @StringRes int event;
|
||||
|
@ -623,7 +624,7 @@ public class NewNSTreatmentDialog extends DaggerDialogFragment implements View.O
|
|||
if (data.has("glucoseType")) {
|
||||
ret += resourceHelper.gs(R.string.careportal_newnstreatment_glucosetype);
|
||||
ret += ": ";
|
||||
ret += Translator.translate(JsonHelper.safeGetString(data, "glucoseType", ""));
|
||||
ret += translator.translate(JsonHelper.safeGetString(data, "glucoseType", ""));
|
||||
ret += "\n";
|
||||
}
|
||||
if (data.has("carbs")) {
|
||||
|
@ -712,7 +713,7 @@ public class NewNSTreatmentDialog extends DaggerDialogFragment implements View.O
|
|||
|
||||
private void confirmNSTreatmentCreation() {
|
||||
final JSONObject data = gatherData();
|
||||
OKDialog.showConfirmation(getContext(), Translator.translate(JsonHelper.safeGetString(data, "eventType", resourceHelper.gs(R.string.overview_treatment_label))), buildConfirmText(data), () -> NSUpload.createNSTreatment(data, profileStore, profileFunction, eventTime.getTime()));
|
||||
OKDialog.showConfirmation(getContext(), translator.translate(JsonHelper.safeGetString(data, "eventType", resourceHelper.gs(R.string.overview_treatment_label))), buildConfirmText(data), () -> NSUpload.createNSTreatment(data, profileStore, profileFunction, eventTime.getTime()));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewB
|
|||
import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpDriverState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkService;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData;
|
||||
import info.nightscout.androidaps.plugins.treatments.Treatment;
|
||||
import info.nightscout.androidaps.utils.DateUtil;
|
||||
|
@ -70,7 +71,6 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
.enacted(false).comment(MainApp.gs(R.string.pump_operation_not_yet_supported_by_pump));
|
||||
*/
|
||||
protected PumpDescription pumpDescription = new PumpDescription();
|
||||
protected PumpStatus pumpStatus;
|
||||
protected ServiceConnection serviceConnection = null;
|
||||
protected boolean serviceRunning = false;
|
||||
// protected boolean isInitialized = false;
|
||||
|
@ -109,6 +109,11 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
|
||||
public abstract void initPumpStatusData();
|
||||
|
||||
public abstract void resetRileyLinkConfiguration();
|
||||
|
||||
public abstract void doTuneUpDevice();
|
||||
|
||||
public abstract RileyLinkService getRileyLinkService();
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
|
@ -124,7 +129,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
disposable.add(rxBus
|
||||
.toObservable(EventAppExit.class)
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(event -> context.unbindService(serviceConnection), exception -> fabricPrivacy.logException(exception))
|
||||
.subscribe(event -> context.unbindService(serviceConnection), fabricPrivacy::logException)
|
||||
);
|
||||
onStartCustomActions();
|
||||
}
|
||||
|
@ -153,9 +158,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
*/
|
||||
public abstract Class getServiceClass();
|
||||
|
||||
public PumpStatus getPumpStatusData() {
|
||||
return pumpStatus;
|
||||
}
|
||||
public abstract PumpStatus getPumpStatusData();
|
||||
|
||||
|
||||
public boolean isInitialized() {
|
||||
|
@ -219,12 +222,6 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
aapsLogger.debug(LTag.PUMP, "finishHandshaking [PumpPluginAbstract] - default (empty) implementation.");
|
||||
}
|
||||
|
||||
|
||||
public void getPumpStatus() {
|
||||
aapsLogger.debug(LTag.PUMP, "getPumpStatus [PumpPluginAbstract] - Not implemented.");
|
||||
}
|
||||
|
||||
|
||||
// Upload to pump new basal profile
|
||||
@NonNull public PumpEnactResult setNewBasalProfile(Profile profile) {
|
||||
aapsLogger.debug(LTag.PUMP, "setNewBasalProfile [PumpPluginAbstract] - Not implemented.");
|
||||
|
@ -240,7 +237,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
|
||||
public long lastDataTime() {
|
||||
aapsLogger.debug(LTag.PUMP, "lastDataTime [PumpPluginAbstract].");
|
||||
return pumpStatus.lastConnection;
|
||||
return getPumpStatusData().lastConnection;
|
||||
}
|
||||
|
||||
|
||||
|
@ -329,7 +326,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
@NonNull @Override
|
||||
public JSONObject getJSONStatus(Profile profile, String profileName) {
|
||||
|
||||
if ((pumpStatus.lastConnection + 5 * 60 * 1000L) < System.currentTimeMillis()) {
|
||||
if ((getPumpStatusData().lastConnection + 5 * 60 * 1000L) < System.currentTimeMillis()) {
|
||||
return new JSONObject();
|
||||
}
|
||||
|
||||
|
@ -338,8 +335,8 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
JSONObject status = new JSONObject();
|
||||
JSONObject extended = new JSONObject();
|
||||
try {
|
||||
battery.put("percent", pumpStatus.batteryRemaining);
|
||||
status.put("status", pumpStatus.pumpStatusType != null ? pumpStatus.pumpStatusType.getStatus() : "normal");
|
||||
battery.put("percent", getPumpStatusData().batteryRemaining);
|
||||
status.put("status", getPumpStatusData().pumpStatusType != null ? getPumpStatusData().pumpStatusType.getStatus() : "normal");
|
||||
extended.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION);
|
||||
try {
|
||||
extended.put("ActiveProfile", profileName);
|
||||
|
@ -366,7 +363,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
pump.put("battery", battery);
|
||||
pump.put("status", status);
|
||||
pump.put("extended", extended);
|
||||
pump.put("reservoir", pumpStatus.reservoirRemainingUnits);
|
||||
pump.put("reservoir", getPumpStatusData().reservoirRemainingUnits);
|
||||
pump.put("clock", DateUtil.toISOString(new Date()));
|
||||
} catch (JSONException e) {
|
||||
aapsLogger.error("Unhandled exception", e);
|
||||
|
@ -379,14 +376,14 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
@NonNull @Override
|
||||
public String shortStatus(boolean veryShort) {
|
||||
String ret = "";
|
||||
if (pumpStatus.lastConnection != 0) {
|
||||
long agoMsec = System.currentTimeMillis() - pumpStatus.lastConnection;
|
||||
if (getPumpStatusData().lastConnection != 0) {
|
||||
long agoMsec = System.currentTimeMillis() - getPumpStatusData().lastConnection;
|
||||
int agoMin = (int) (agoMsec / 60d / 1000d);
|
||||
ret += "LastConn: " + agoMin + " min ago\n";
|
||||
}
|
||||
if (pumpStatus.lastBolusTime != null && pumpStatus.lastBolusTime.getTime() != 0) {
|
||||
ret += "LastBolus: " + DecimalFormatter.to2Decimal(pumpStatus.lastBolusAmount) + "U @" + //
|
||||
android.text.format.DateFormat.format("HH:mm", pumpStatus.lastBolusTime) + "\n";
|
||||
if (getPumpStatusData().lastBolusTime != null && getPumpStatusData().lastBolusTime.getTime() != 0) {
|
||||
ret += "LastBolus: " + DecimalFormatter.to2Decimal(getPumpStatusData().lastBolusAmount) + "U @" + //
|
||||
android.text.format.DateFormat.format("HH:mm", getPumpStatusData().lastBolusTime) + "\n";
|
||||
}
|
||||
TemporaryBasal activeTemp = activePlugin.getActiveTreatments().getRealTempBasalFromHistory(System.currentTimeMillis());
|
||||
if (activeTemp != null) {
|
||||
|
@ -401,9 +398,9 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
// ret += "TDD: " + DecimalFormatter.to0Decimal(pumpStatus.dailyTotalUnits) + " / "
|
||||
// + pumpStatus.maxDailyTotalUnits + " U\n";
|
||||
// }
|
||||
ret += "IOB: " + pumpStatus.iob + "U\n";
|
||||
ret += "Reserv: " + DecimalFormatter.to0Decimal(pumpStatus.reservoirRemainingUnits) + "U\n";
|
||||
ret += "Batt: " + pumpStatus.batteryRemaining + "\n";
|
||||
ret += "IOB: " + getPumpStatusData().iob + "U\n";
|
||||
ret += "Reserv: " + DecimalFormatter.to0Decimal(getPumpStatusData().reservoirRemainingUnits) + "U\n";
|
||||
ret += "Batt: " + getPumpStatusData().batteryRemaining + "\n";
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -451,7 +448,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI
|
|||
|
||||
|
||||
public ManufacturerType manufacturer() {
|
||||
return pumpType.getManufacturer() ;
|
||||
return pumpType.getManufacturer();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.data;
|
||||
|
||||
import org.joda.time.LocalDateTime;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.data.ProfileStore;
|
||||
import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpStatusType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.utils.DateUtil;
|
||||
|
||||
/**
|
||||
* Created by andy on 4/28/18.
|
||||
|
@ -16,7 +14,7 @@ import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
|||
public abstract class PumpStatus {
|
||||
|
||||
// connection
|
||||
public LocalDateTime lastDataTime;
|
||||
public long lastDataTime;
|
||||
public long lastConnection = 0L;
|
||||
public long previousConnection = 0L; // here should be stored last connection of previous session (so needs to be
|
||||
// read before lastConnection is modified for first time).
|
||||
|
@ -42,7 +40,6 @@ public abstract class PumpStatus {
|
|||
public Double dailyTotalUnits;
|
||||
public String maxDailyTotalUnits;
|
||||
public boolean validBasalRateProfileSelectedOnPump = true;
|
||||
public PumpType pumpType = PumpType.GenericAAPS;
|
||||
public ProfileStore profileStore;
|
||||
public String units; // Constants.MGDL or Constants.MMOL
|
||||
public PumpStatusType pumpStatusType = PumpStatusType.Running;
|
||||
|
@ -52,21 +49,19 @@ public abstract class PumpStatus {
|
|||
public int tempBasalRatio = 0;
|
||||
public int tempBasalRemainMin = 0;
|
||||
public Date tempBasalStart;
|
||||
protected PumpDescription pumpDescription;
|
||||
//protected PumpDescription pumpDescription;
|
||||
|
||||
|
||||
public PumpStatus(PumpDescription pumpDescription) {
|
||||
this.pumpDescription = pumpDescription;
|
||||
public PumpStatus() {
|
||||
// public PumpStatus(PumpDescription pumpDescription) {
|
||||
// this.pumpDescription = pumpDescription;
|
||||
|
||||
this.initSettings();
|
||||
// this.initSettings();
|
||||
}
|
||||
|
||||
|
||||
public abstract void initSettings();
|
||||
|
||||
|
||||
public void setLastCommunicationToNow() {
|
||||
this.lastDataTime = LocalDateTime.now();
|
||||
this.lastDataTime = DateUtil.now();
|
||||
this.lastConnection = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
|
@ -74,23 +69,5 @@ public abstract class PumpStatus {
|
|||
this.lastErrorConnection = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
|
||||
public abstract String getErrorInfo();
|
||||
|
||||
|
||||
public abstract void refreshConfiguration();
|
||||
|
||||
|
||||
public PumpType getPumpType() {
|
||||
return pumpType;
|
||||
}
|
||||
|
||||
|
||||
public void setPumpType(PumpType pumpType) {
|
||||
this.pumpType = pumpType;
|
||||
}
|
||||
|
||||
// public Date last_bolus_time;
|
||||
// public double last_bolus_amount = 0;
|
||||
|
||||
}
|
||||
|
|
|
@ -9,8 +9,6 @@ import info.nightscout.androidaps.logging.L;
|
|||
|
||||
public class TempBasalPair {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(L.PUMPCOMM);
|
||||
|
||||
@Expose
|
||||
protected double insulinRate = 0.0d;
|
||||
@Expose
|
||||
|
|
|
@ -41,20 +41,14 @@ import javax.inject.Inject;
|
|||
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity;
|
||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.common.ManufacturerType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.LocationHelper;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventMedtronicPumpConfigurationChanged;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.driver.OmnipodPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.events.EventOmnipodPumpValuesChanged;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodUtil;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
|
||||
|
@ -65,6 +59,9 @@ public class RileyLinkBLEScanActivity extends NoSplashAppCompatActivity {
|
|||
@Inject SP sp;
|
||||
@Inject RxBusWrapper rxBus;
|
||||
@Inject ResourceHelper resourceHelper;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
// TODO change this. Currently verifyConfiguration uses MDT data not only RL
|
||||
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
|
||||
@Inject ActivePluginProvider activePlugin;
|
||||
|
||||
private static final int PERMISSION_REQUEST_COARSE_LOCATION = 30241; // arbitrary.
|
||||
|
@ -114,13 +111,13 @@ public class RileyLinkBLEScanActivity extends NoSplashAppCompatActivity {
|
|||
|
||||
sp.putString(RileyLinkConst.Prefs.RileyLinkAddress, bleAddress);
|
||||
|
||||
RileyLinkUtil.getRileyLinkSelectPreference().setSummary(bleAddress);
|
||||
//RileyLinkUtil.getRileyLinkSelectPreference().setSummary(bleAddress);
|
||||
|
||||
if (activePlugin.getActivePump().manufacturer()== ManufacturerType.Medtronic) {
|
||||
MedtronicPumpStatus pumpStatus = MedtronicUtil.getPumpStatus();
|
||||
pumpStatus.verifyConfiguration(); // force reloading of address
|
||||
medtronicPumpPlugin.getRileyLinkService().verifyConfiguration(); // force reloading of address
|
||||
|
||||
rxBus.send(new EventMedtronicPumpConfigurationChanged());
|
||||
|
||||
rxBus.send(new EventMedtronicPumpConfigurationChanged());
|
||||
} else if (activePlugin.getActivePump().manufacturer()== ManufacturerType.Insulet) {
|
||||
OmnipodPumpStatus pumpStatus = OmnipodUtil.getPumpStatus();
|
||||
pumpStatus.verifyConfiguration();
|
||||
|
@ -202,7 +199,7 @@ public class RileyLinkBLEScanActivity extends NoSplashAppCompatActivity {
|
|||
}
|
||||
|
||||
// disable currently selected RL, so that we can discover it
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkDisconnect);
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkDisconnect, this);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RFSpy;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkCommunicationException;
|
||||
|
@ -21,9 +21,8 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.WakeAndTuneTask;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.driver.OmnipodPumpStatus;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
|
||||
/**
|
||||
* This is abstract class for RileyLink Communication, this one needs to be extended by specific "Pump" class.
|
||||
|
@ -32,83 +31,83 @@ import info.nightscout.androidaps.utils.SP;
|
|||
*/
|
||||
public abstract class RileyLinkCommunicationManager {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
@Inject protected AAPSLogger aapsLogger;
|
||||
@Inject protected SP sp;
|
||||
|
||||
private static final int SCAN_TIMEOUT = 1500;
|
||||
private static final int ALLOWED_PUMP_UNREACHABLE = 10 * 60 * 1000; // 10 minutes
|
||||
@Inject MedtronicPumpStatus medtronicPumpStatus;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject ServiceTaskExecutor serviceTaskExecutor;
|
||||
|
||||
|
||||
private final int SCAN_TIMEOUT = 1500;
|
||||
private final int ALLOWED_PUMP_UNREACHABLE = 10 * 60 * 1000; // 10 minutes
|
||||
|
||||
protected final HasAndroidInjector injector;
|
||||
protected final RFSpy rfspy;
|
||||
protected int receiverDeviceAwakeForMinutes = 1; // override this in constructor of specific implementation
|
||||
protected String receiverDeviceID; // String representation of receiver device (ex. Pump (xxxxxx) or Pod (yyyyyy))
|
||||
protected long lastGoodReceiverCommunicationTime = 0;
|
||||
protected PumpStatus pumpStatus;
|
||||
protected RileyLinkServiceData rileyLinkServiceData;
|
||||
// protected PumpStatus pumpStatus;
|
||||
private long nextWakeUpRequired = 0L;
|
||||
|
||||
// internal flag
|
||||
private boolean showPumpMessages = true;
|
||||
private int timeoutCount = 0;
|
||||
|
||||
|
||||
public RileyLinkCommunicationManager(RFSpy rfspy) {
|
||||
public RileyLinkCommunicationManager(HasAndroidInjector injector, RFSpy rfspy) {
|
||||
this.injector = injector;
|
||||
injector.androidInjector().inject(this);
|
||||
this.rfspy = rfspy;
|
||||
this.rileyLinkServiceData = RileyLinkUtil.getRileyLinkServiceData();
|
||||
RileyLinkUtil.setRileyLinkCommunicationManager(this);
|
||||
|
||||
configurePumpSpecificSettings();
|
||||
}
|
||||
|
||||
|
||||
protected abstract void configurePumpSpecificSettings();
|
||||
|
||||
|
||||
// All pump communications go through this function.
|
||||
public <E extends RLMessage> E sendAndListen(RLMessage msg, int timeout_ms, Class<E> clazz)
|
||||
protected <E extends RLMessage> E sendAndListen(RLMessage msg, int timeout_ms, Class<E> clazz)
|
||||
throws RileyLinkCommunicationException {
|
||||
return sendAndListen(msg, timeout_ms, null, clazz);
|
||||
}
|
||||
|
||||
public <E extends RLMessage> E sendAndListen(RLMessage msg, int timeout_ms, Integer extendPreamble_ms, Class<E> clazz)
|
||||
private <E extends RLMessage> E sendAndListen(RLMessage msg, int timeout_ms, Integer extendPreamble_ms, Class<E> clazz)
|
||||
throws RileyLinkCommunicationException {
|
||||
return sendAndListen(msg, timeout_ms, 0, extendPreamble_ms, clazz);
|
||||
}
|
||||
|
||||
// For backward compatibility
|
||||
public <E extends RLMessage> E sendAndListen(RLMessage msg, int timeout_ms, int repeatCount, Integer extendPreamble_ms, Class<E> clazz)
|
||||
private <E extends RLMessage> E sendAndListen(RLMessage msg, int timeout_ms, int repeatCount, Integer extendPreamble_ms, Class<E> clazz)
|
||||
throws RileyLinkCommunicationException {
|
||||
return sendAndListen(msg, timeout_ms, repeatCount, 0, extendPreamble_ms, clazz);
|
||||
}
|
||||
|
||||
public <E extends RLMessage> E sendAndListen(RLMessage msg, int timeout_ms, int repeatCount, int retryCount, Integer extendPreamble_ms, Class<E> clazz)
|
||||
private <E extends RLMessage> E sendAndListen(RLMessage msg, int timeout_ms, int repeatCount, int retryCount, Integer extendPreamble_ms, Class<E> clazz)
|
||||
throws RileyLinkCommunicationException {
|
||||
|
||||
// internal flag
|
||||
boolean showPumpMessages = true;
|
||||
if (showPumpMessages) {
|
||||
if (isLogEnabled())
|
||||
LOG.info("Sent:" + ByteUtil.shortHexString(msg.getTxData()));
|
||||
aapsLogger.info(LTag.PUMPCOMM, "Sent:" + ByteUtil.shortHexString(msg.getTxData()));
|
||||
}
|
||||
|
||||
RFSpyResponse rfSpyResponse = rfspy.transmitThenReceive(new RadioPacket(msg.getTxData()),
|
||||
(byte)0, (byte)repeatCount, (byte)0, (byte)0, timeout_ms, (byte)retryCount, extendPreamble_ms);
|
||||
RFSpyResponse rfSpyResponse = rfspy.transmitThenReceive(new RadioPacket(injector, msg.getTxData()),
|
||||
(byte) 0, (byte) repeatCount, (byte) 0, (byte) 0, timeout_ms, (byte) retryCount, extendPreamble_ms);
|
||||
|
||||
RadioResponse radioResponse = rfSpyResponse.getRadioResponse();
|
||||
RadioResponse radioResponse = rfSpyResponse.getRadioResponse(injector);
|
||||
E response = createResponseMessage(radioResponse.getPayload(), clazz);
|
||||
|
||||
if (response.isValid()) {
|
||||
// Mark this as the last time we heard from the pump.
|
||||
rememberLastGoodDeviceCommunicationTime();
|
||||
} else {
|
||||
LOG.warn("isDeviceReachable. Response is invalid ! [interrupted={}, timeout={}, unknownCommand={}, invalidParam={}]", rfSpyResponse.wasInterrupted(),
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "isDeviceReachable. Response is invalid ! [interrupted={}, timeout={}, unknownCommand={}, invalidParam={}]", rfSpyResponse.wasInterrupted(),
|
||||
rfSpyResponse.wasTimeout(), rfSpyResponse.isUnknownCommand(), rfSpyResponse.isInvalidParam());
|
||||
|
||||
if (rfSpyResponse.wasTimeout()) {
|
||||
if (hasTunning()) {
|
||||
timeoutCount++;
|
||||
|
||||
long diff = System.currentTimeMillis() - pumpStatus.lastConnection;
|
||||
long diff = System.currentTimeMillis() - getPumpStatus().lastConnection;
|
||||
|
||||
if (diff > ALLOWED_PUMP_UNREACHABLE) {
|
||||
LOG.warn("We reached max time that Pump can be unreachable. Starting Tuning.");
|
||||
ServiceTaskExecutor.startTask(new WakeAndTuneTask());
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "We reached max time that Pump can be unreachable. Starting Tuning.");
|
||||
serviceTaskExecutor.startTask(new WakeAndTuneTask(injector));
|
||||
timeoutCount = 0;
|
||||
}
|
||||
}
|
||||
|
@ -120,8 +119,7 @@ public abstract class RileyLinkCommunicationManager {
|
|||
}
|
||||
|
||||
if (showPumpMessages) {
|
||||
if (isLogEnabled())
|
||||
LOG.info("Received:" + ByteUtil.shortHexString(rfSpyResponse.getRadioResponse().getPayload()));
|
||||
aapsLogger.info(LTag.PUMPCOMM, "Received:" + ByteUtil.shortHexString(rfSpyResponse.getRadioResponse(injector).getPayload()));
|
||||
}
|
||||
|
||||
return response;
|
||||
|
@ -152,27 +150,24 @@ public abstract class RileyLinkCommunicationManager {
|
|||
// **** FIXME: this wakeup doesn't seem to work well... must revisit
|
||||
// receiverDeviceAwakeForMinutes = duration_minutes;
|
||||
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.WakingUp);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.WakingUp);
|
||||
|
||||
if (force)
|
||||
nextWakeUpRequired = 0L;
|
||||
|
||||
if (System.currentTimeMillis() > nextWakeUpRequired) {
|
||||
if (isLogEnabled())
|
||||
LOG.info("Waking pump...");
|
||||
aapsLogger.info(LTag.PUMPCOMM, "Waking pump...");
|
||||
|
||||
byte[] pumpMsgContent = createPumpMessageContent(RLMessageType.ReadSimpleData); // simple
|
||||
RFSpyResponse resp = rfspy.transmitThenReceive(new RadioPacket(pumpMsgContent), (byte) 0, (byte) 200,
|
||||
RFSpyResponse resp = rfspy.transmitThenReceive(new RadioPacket(injector, pumpMsgContent), (byte) 0, (byte) 200,
|
||||
(byte) 0, (byte) 0, 25000, (byte) 0);
|
||||
if (isLogEnabled())
|
||||
LOG.info("wakeup: raw response is " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.info(LTag.PUMPCOMM, "wakeup: raw response is " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
|
||||
// FIXME wakeUp successful !!!!!!!!!!!!!!!!!!
|
||||
|
||||
nextWakeUpRequired = System.currentTimeMillis() + (receiverDeviceAwakeForMinutes * 60 * 1000);
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.trace("Last pump communication was recent, not waking pump.");
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Last pump communication was recent, not waking pump.");
|
||||
}
|
||||
|
||||
// long lastGoodPlus = getLastGoodReceiverCommunicationTime() + (receiverDeviceAwakeForMinutes * 60 * 1000);
|
||||
|
@ -196,7 +191,7 @@ public abstract class RileyLinkCommunicationManager {
|
|||
|
||||
|
||||
public double tuneForDevice() {
|
||||
return scanForDevice(RileyLinkUtil.getRileyLinkTargetFrequency().getScanFrequencies());
|
||||
return scanForDevice(rileyLinkServiceData.rileyLinkTargetFrequency.getScanFrequencies());
|
||||
}
|
||||
|
||||
|
||||
|
@ -210,7 +205,7 @@ public abstract class RileyLinkCommunicationManager {
|
|||
*/
|
||||
public boolean isValidFrequency(double frequency) {
|
||||
|
||||
double[] scanFrequencies = RileyLinkUtil.getRileyLinkTargetFrequency().getScanFrequencies();
|
||||
double[] scanFrequencies = rileyLinkServiceData.rileyLinkTargetFrequency.getScanFrequencies();
|
||||
|
||||
if (scanFrequencies.length == 1) {
|
||||
return RileyLinkUtil.isSame(scanFrequencies[0], frequency);
|
||||
|
@ -228,9 +223,8 @@ public abstract class RileyLinkCommunicationManager {
|
|||
public abstract boolean tryToConnectToDevice();
|
||||
|
||||
|
||||
public double scanForDevice(double[] frequencies) {
|
||||
if (isLogEnabled())
|
||||
LOG.info("Scanning for receiver ({})", receiverDeviceID);
|
||||
private double scanForDevice(double[] frequencies) {
|
||||
aapsLogger.info(LTag.PUMPCOMM, "Scanning for receiver ({})", receiverDeviceID);
|
||||
wakeUp(receiverDeviceAwakeForMinutes, false);
|
||||
FrequencyScanResults results = new FrequencyScanResults();
|
||||
|
||||
|
@ -244,12 +238,12 @@ public abstract class RileyLinkCommunicationManager {
|
|||
for (int j = 0; j < tries; j++) {
|
||||
|
||||
byte[] pumpMsgContent = createPumpMessageContent(RLMessageType.ReadSimpleData);
|
||||
RFSpyResponse resp = rfspy.transmitThenReceive(new RadioPacket(pumpMsgContent), (byte) 0, (byte) 0,
|
||||
RFSpyResponse resp = rfspy.transmitThenReceive(new RadioPacket(injector, pumpMsgContent), (byte) 0, (byte) 0,
|
||||
(byte) 0, (byte) 0, 1250, (byte) 0);
|
||||
if (resp.wasTimeout()) {
|
||||
LOG.error("scanForPump: Failed to find pump at frequency {}", frequencies[i]);
|
||||
aapsLogger.error(LTag.PUMPCOMM, "scanForPump: Failed to find pump at frequency {}", frequencies[i]);
|
||||
} else if (resp.looksLikeRadioPacket()) {
|
||||
RadioResponse radioResponse = new RadioResponse();
|
||||
RadioResponse radioResponse = new RadioResponse(injector);
|
||||
|
||||
try {
|
||||
|
||||
|
@ -261,17 +255,17 @@ public abstract class RileyLinkCommunicationManager {
|
|||
trial.rssiList.add(rssi);
|
||||
trial.successes++;
|
||||
} else {
|
||||
LOG.warn("Failed to parse radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Failed to parse radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
trial.rssiList.add(-99);
|
||||
}
|
||||
|
||||
} catch (RileyLinkCommunicationException rle) {
|
||||
LOG.warn("Failed to decode radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Failed to decode radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
trial.rssiList.add(-99);
|
||||
}
|
||||
|
||||
} else {
|
||||
LOG.error("scanForPump: raw response is " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.error(LTag.PUMPCOMM, "scanForPump: raw response is " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
trial.rssiList.add(-99);
|
||||
}
|
||||
trial.tries++;
|
||||
|
@ -295,7 +289,7 @@ public abstract class RileyLinkCommunicationManager {
|
|||
+ one.frequencyMHz, "" + one.averageRSSI + ", RSSIs =" + one.rssiList));
|
||||
}
|
||||
|
||||
LOG.info(stringBuilder.toString());
|
||||
aapsLogger.info(LTag.PUMPCOMM, stringBuilder.toString());
|
||||
|
||||
results.sort(); // sorts in ascending order
|
||||
|
||||
|
@ -303,11 +297,10 @@ public abstract class RileyLinkCommunicationManager {
|
|||
results.bestFrequencyMHz = bestTrial.frequencyMHz;
|
||||
if (bestTrial.successes > 0) {
|
||||
rfspy.setBaseFrequency(results.bestFrequencyMHz);
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Best frequency found: " + results.bestFrequencyMHz);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Best frequency found: " + results.bestFrequencyMHz);
|
||||
return results.bestFrequencyMHz;
|
||||
} else {
|
||||
LOG.error("No pump response during scan.");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "No pump response during scan.");
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
@ -333,25 +326,25 @@ public abstract class RileyLinkCommunicationManager {
|
|||
rfspy.setBaseFrequency(freqMHz);
|
||||
// RLMessage msg = makeRLMessage(RLMessageType.ReadSimpleData);
|
||||
byte[] pumpMsgContent = createPumpMessageContent(RLMessageType.ReadSimpleData);
|
||||
RadioPacket pkt = new RadioPacket(pumpMsgContent);
|
||||
RadioPacket pkt = new RadioPacket(injector, pumpMsgContent);
|
||||
RFSpyResponse resp = rfspy.transmitThenReceive(pkt, (byte) 0, (byte) 0, (byte) 0, (byte) 0, SCAN_TIMEOUT, (byte) 0);
|
||||
if (resp.wasTimeout()) {
|
||||
LOG.warn("tune_tryFrequency: no pump response at frequency {}", freqMHz);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "tune_tryFrequency: no pump response at frequency {}", freqMHz);
|
||||
} else if (resp.looksLikeRadioPacket()) {
|
||||
RadioResponse radioResponse = new RadioResponse();
|
||||
RadioResponse radioResponse = new RadioResponse(injector);
|
||||
try {
|
||||
radioResponse.init(resp.getRaw());
|
||||
|
||||
if (radioResponse.isValid()) {
|
||||
LOG.warn("tune_tryFrequency: saw response level {} at frequency {}", radioResponse.rssi, freqMHz);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "tune_tryFrequency: saw response level {} at frequency {}", radioResponse.rssi, freqMHz);
|
||||
return calculateRssi(radioResponse.rssi);
|
||||
} else {
|
||||
LOG.warn("tune_tryFrequency: invalid radio response:"
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "tune_tryFrequency: invalid radio response:"
|
||||
+ ByteUtil.shortHexString(radioResponse.getPayload()));
|
||||
}
|
||||
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
LOG.warn("Failed to decode radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Failed to decode radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -378,16 +371,13 @@ public abstract class RileyLinkCommunicationManager {
|
|||
}
|
||||
if (betterFrequency == 0.0) {
|
||||
// we've failed... caller should try a full scan for pump
|
||||
if (isLogEnabled())
|
||||
LOG.error("quickTuneForPump: failed to find pump");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "quickTuneForPump: failed to find pump");
|
||||
} else {
|
||||
rfspy.setBaseFrequency(betterFrequency);
|
||||
if (betterFrequency != startFrequencyMHz) {
|
||||
if (isLogEnabled())
|
||||
LOG.info("quickTuneForPump: new frequency is {}MHz", betterFrequency);
|
||||
aapsLogger.info(LTag.PUMPCOMM, "quickTuneForPump: new frequency is {}MHz", betterFrequency);
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.info("quickTuneForPump: pump frequency is the same: {}MHz", startFrequencyMHz);
|
||||
aapsLogger.info(LTag.PUMPCOMM, "quickTuneForPump: pump frequency is the same: {}MHz", startFrequencyMHz);
|
||||
}
|
||||
}
|
||||
return betterFrequency;
|
||||
|
@ -395,8 +385,7 @@ public abstract class RileyLinkCommunicationManager {
|
|||
|
||||
|
||||
private double quickTunePumpStep(double startFrequencyMHz, double stepSizeMHz) {
|
||||
if (isLogEnabled())
|
||||
LOG.info("Doing quick radio tune for receiver ({})", receiverDeviceID);
|
||||
aapsLogger.info(LTag.PUMPCOMM, "Doing quick radio tune for receiver ({})", receiverDeviceID);
|
||||
wakeUp(false);
|
||||
int startRssi = tune_tryFrequency(startFrequencyMHz);
|
||||
double lowerFrequency = startFrequencyMHz - stepSizeMHz;
|
||||
|
@ -422,42 +411,29 @@ public abstract class RileyLinkCommunicationManager {
|
|||
protected void rememberLastGoodDeviceCommunicationTime() {
|
||||
lastGoodReceiverCommunicationTime = System.currentTimeMillis();
|
||||
|
||||
SP.putLong(RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, lastGoodReceiverCommunicationTime);
|
||||
if(pumpStatus != null) {
|
||||
pumpStatus.setLastCommunicationToNow();
|
||||
}
|
||||
sp.putLong(RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, lastGoodReceiverCommunicationTime);
|
||||
getPumpStatus().setLastCommunicationToNow();
|
||||
}
|
||||
|
||||
|
||||
private long getLastGoodReceiverCommunicationTime() {
|
||||
// If we have a value of zero, we need to load from prefs.
|
||||
if (lastGoodReceiverCommunicationTime == 0L) {
|
||||
lastGoodReceiverCommunicationTime = SP.getLong(RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L);
|
||||
lastGoodReceiverCommunicationTime = sp.getLong(RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L);
|
||||
// Might still be zero, but that's fine.
|
||||
}
|
||||
double minutesAgo = (System.currentTimeMillis() - lastGoodReceiverCommunicationTime) / (1000.0 * 60.0);
|
||||
if (isLogEnabled())
|
||||
LOG.trace("Last good pump communication was " + minutesAgo + " minutes ago.");
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Last good pump communication was " + minutesAgo + " minutes ago.");
|
||||
return lastGoodReceiverCommunicationTime;
|
||||
}
|
||||
|
||||
|
||||
public PumpStatus getPumpStatus() {
|
||||
return pumpStatus;
|
||||
}
|
||||
|
||||
|
||||
public void clearNotConnectedCount() {
|
||||
if (rfspy != null) {
|
||||
rfspy.notConnectedCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPCOMM);
|
||||
}
|
||||
public abstract PumpStatus getPumpStatus();
|
||||
|
||||
public void setPumpStatus(PumpStatus pumpStatus) {
|
||||
this.pumpStatus = pumpStatus;
|
||||
}
|
||||
public abstract boolean isDeviceReachable();
|
||||
}
|
||||
|
|
|
@ -5,9 +5,6 @@ import android.content.Intent;
|
|||
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
@ -15,180 +12,56 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBus;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkBLE;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.encoding.Encoding4b6b;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.encoding.Encoding4b6bGeoff;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkEncodingType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.BleAdvertisedData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkService;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceNotification;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceResult;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceTransport;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTask;
|
||||
import info.nightscout.androidaps.plugins.pump.common.ui.RileyLinkSelectPreference;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventMedtronicDeviceStatusChange;
|
||||
|
||||
/**
|
||||
* Created by andy on 17/05/2018.
|
||||
*/
|
||||
|
||||
@Singleton
|
||||
public class RileyLinkUtil {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMP);
|
||||
protected static List<RLHistoryItem> historyRileyLink = new ArrayList<>();
|
||||
protected static RileyLinkCommunicationManager rileyLinkCommunicationManager;
|
||||
static ServiceTask currentTask;
|
||||
private static Context context;
|
||||
private static RileyLinkBLE rileyLinkBLE;
|
||||
private static RileyLinkServiceData rileyLinkServiceData;
|
||||
private static RileyLinkService rileyLinkService;
|
||||
private static RileyLinkTargetFrequency rileyLinkTargetFrequency;
|
||||
private List<RLHistoryItem> historyRileyLink = new ArrayList<>();
|
||||
private ServiceTask currentTask;
|
||||
|
||||
private static RileyLinkTargetDevice targetDevice;
|
||||
private static RileyLinkEncodingType encoding;
|
||||
private static RileyLinkSelectPreference rileyLinkSelectPreference;
|
||||
private static Encoding4b6b encoding4b6b;
|
||||
private static RileyLinkFirmwareVersion firmwareVersion;
|
||||
private RileyLinkEncodingType encoding;
|
||||
private Encoding4b6b encoding4b6b;
|
||||
|
||||
|
||||
public static void setContext(Context contextIn) {
|
||||
RileyLinkUtil.context = contextIn;
|
||||
@Inject
|
||||
public RileyLinkUtil() {
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkEncodingType getEncoding() {
|
||||
public RileyLinkEncodingType getEncoding() {
|
||||
return encoding;
|
||||
}
|
||||
|
||||
|
||||
public static void setEncoding(RileyLinkEncodingType encoding) {
|
||||
RileyLinkUtil.encoding = encoding;
|
||||
public void setEncoding(RileyLinkEncodingType encoding) {
|
||||
this.encoding = encoding;
|
||||
|
||||
if (encoding == RileyLinkEncodingType.FourByteSixByteLocal) {
|
||||
RileyLinkUtil.encoding4b6b = new Encoding4b6bGeoff();
|
||||
this.encoding4b6b = new Encoding4b6bGeoff();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void sendBroadcastMessage(String message) {
|
||||
if (context != null) {
|
||||
Intent intent = new Intent(message);
|
||||
LocalBroadcastManager.getInstance(RileyLinkUtil.context).sendBroadcast(intent);
|
||||
}
|
||||
public void sendBroadcastMessage(String message, Context context) {
|
||||
Intent intent = new Intent(message);
|
||||
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
|
||||
}
|
||||
|
||||
|
||||
public static void setServiceState(RileyLinkServiceState newState) {
|
||||
setServiceState(newState, null);
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkError getError() {
|
||||
if (RileyLinkUtil.rileyLinkServiceData != null)
|
||||
return RileyLinkUtil.rileyLinkServiceData.errorCode;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkServiceState getServiceState() {
|
||||
return workWithServiceState(null, null, false);
|
||||
}
|
||||
|
||||
|
||||
public static void setServiceState(RileyLinkServiceState newState, RileyLinkError errorCode) {
|
||||
workWithServiceState(newState, errorCode, true);
|
||||
}
|
||||
|
||||
|
||||
private static synchronized RileyLinkServiceState workWithServiceState(RileyLinkServiceState newState,
|
||||
RileyLinkError errorCode, boolean set) {
|
||||
|
||||
if (set) {
|
||||
|
||||
RileyLinkUtil.rileyLinkServiceData.serviceState = newState;
|
||||
RileyLinkUtil.rileyLinkServiceData.errorCode = errorCode;
|
||||
|
||||
if (L.isEnabled(L.PUMP))
|
||||
LOG.info("RileyLink State Changed: {} {}", newState, errorCode == null ? "" : " - Error State: "
|
||||
+ errorCode.name());
|
||||
|
||||
RileyLinkUtil.historyRileyLink.add(new RLHistoryItem(RileyLinkUtil.rileyLinkServiceData.serviceState,
|
||||
RileyLinkUtil.rileyLinkServiceData.errorCode, targetDevice));
|
||||
RxBus.Companion.getINSTANCE().send(new EventMedtronicDeviceStatusChange(newState, errorCode));
|
||||
return null;
|
||||
|
||||
} else {
|
||||
return (RileyLinkUtil.rileyLinkServiceData == null || RileyLinkUtil.rileyLinkServiceData.serviceState == null) ? //
|
||||
RileyLinkServiceState.NotStarted
|
||||
: RileyLinkUtil.rileyLinkServiceData.serviceState;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkBLE getRileyLinkBLE() {
|
||||
return RileyLinkUtil.rileyLinkBLE;
|
||||
}
|
||||
|
||||
|
||||
public static void setRileyLinkBLE(RileyLinkBLE rileyLinkBLEIn) {
|
||||
RileyLinkUtil.rileyLinkBLE = rileyLinkBLEIn;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkServiceData getRileyLinkServiceData() {
|
||||
return RileyLinkUtil.rileyLinkServiceData;
|
||||
}
|
||||
|
||||
|
||||
public static void setRileyLinkServiceData(RileyLinkServiceData rileyLinkServiceData) {
|
||||
RileyLinkUtil.rileyLinkServiceData = rileyLinkServiceData;
|
||||
}
|
||||
|
||||
|
||||
public static boolean hasPumpBeenTunned() {
|
||||
return RileyLinkUtil.rileyLinkServiceData.tuneUpDone;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkService getRileyLinkService() {
|
||||
return RileyLinkUtil.rileyLinkService;
|
||||
}
|
||||
|
||||
|
||||
public static void setRileyLinkService(RileyLinkService rileyLinkService) {
|
||||
RileyLinkUtil.rileyLinkService = rileyLinkService;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkCommunicationManager getRileyLinkCommunicationManager() {
|
||||
return RileyLinkUtil.rileyLinkCommunicationManager;
|
||||
}
|
||||
|
||||
|
||||
public static void setRileyLinkCommunicationManager(RileyLinkCommunicationManager rileyLinkCommunicationManager) {
|
||||
RileyLinkUtil.rileyLinkCommunicationManager = rileyLinkCommunicationManager;
|
||||
}
|
||||
|
||||
|
||||
public static boolean sendNotification(ServiceNotification notification, Integer clientHashcode) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// FIXME remove ?
|
||||
public static void setCurrentTask(ServiceTask task) {
|
||||
public void setCurrentTask(ServiceTask task) {
|
||||
if (currentTask == null) {
|
||||
currentTask = task;
|
||||
} else {
|
||||
|
@ -197,7 +70,7 @@ public class RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static void finishCurrentTask(ServiceTask task) {
|
||||
public void finishCurrentTask(ServiceTask task) {
|
||||
if (task != currentTask) {
|
||||
//LOG.error("finishCurrentTask: task does not match");
|
||||
}
|
||||
|
@ -211,7 +84,7 @@ public class RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static void sendServiceTransportResponse(ServiceTransport transport, ServiceResult serviceResult) {
|
||||
private static void sendServiceTransportResponse(ServiceTransport transport, ServiceResult serviceResult) {
|
||||
// get the key (hashcode) of the client who requested this
|
||||
Integer clientHashcode = transport.getSenderHashcode();
|
||||
// make a new bundle to send as the message data
|
||||
|
@ -222,16 +95,6 @@ public class RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static RileyLinkTargetFrequency getRileyLinkTargetFrequency() {
|
||||
return RileyLinkUtil.rileyLinkTargetFrequency;
|
||||
}
|
||||
|
||||
|
||||
public static void setRileyLinkTargetFrequency(RileyLinkTargetFrequency rileyLinkTargetFrequency) {
|
||||
RileyLinkUtil.rileyLinkTargetFrequency = rileyLinkTargetFrequency;
|
||||
}
|
||||
|
||||
|
||||
public static boolean isSame(Double d1, Double d2) {
|
||||
double diff = d1 - d2;
|
||||
|
||||
|
@ -239,7 +102,6 @@ public class RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
@Deprecated
|
||||
public static BleAdvertisedData parseAdertisedData(byte[] advertisedData) {
|
||||
List<UUID> uuids = new ArrayList<UUID>();
|
||||
String name = null;
|
||||
|
@ -285,45 +147,11 @@ public class RileyLinkUtil {
|
|||
return new BleAdvertisedData(uuids, name);
|
||||
}
|
||||
|
||||
|
||||
public static List<RLHistoryItem> getRileyLinkHistory() {
|
||||
public List<RLHistoryItem> getRileyLinkHistory() {
|
||||
return historyRileyLink;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkTargetDevice getTargetDevice() {
|
||||
return targetDevice;
|
||||
}
|
||||
|
||||
|
||||
public static void setTargetDevice(RileyLinkTargetDevice targetDevice) {
|
||||
RileyLinkUtil.targetDevice = targetDevice;
|
||||
}
|
||||
|
||||
|
||||
public static void setRileyLinkSelectPreference(RileyLinkSelectPreference rileyLinkSelectPreference) {
|
||||
|
||||
RileyLinkUtil.rileyLinkSelectPreference = rileyLinkSelectPreference;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkSelectPreference getRileyLinkSelectPreference() {
|
||||
|
||||
return rileyLinkSelectPreference;
|
||||
}
|
||||
|
||||
|
||||
public static Encoding4b6b getEncoding4b6b() {
|
||||
return RileyLinkUtil.encoding4b6b;
|
||||
}
|
||||
|
||||
|
||||
public static void setFirmwareVersion(RileyLinkFirmwareVersion firmwareVersion) {
|
||||
RileyLinkUtil.firmwareVersion = firmwareVersion;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkFirmwareVersion getFirmwareVersion() {
|
||||
return firmwareVersion;
|
||||
public Encoding4b6b getEncoding4b6b() {
|
||||
return encoding4b6b;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,15 +2,14 @@ package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble;
|
|||
|
||||
import android.os.SystemClock;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command.Reset;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command.RileyLinkCommand;
|
||||
|
@ -28,37 +27,46 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.Rile
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations.BLECommOperationResult;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ThreadUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicConst;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.defs.FirmwareVersion;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
|
||||
/**
|
||||
* Created by geoff on 5/26/16.
|
||||
*/
|
||||
public class RFSpy {
|
||||
|
||||
public static final long RILEYLINK_FREQ_XTAL = 24000000;
|
||||
public static final int EXPECTED_MAX_BLUETOOTH_LATENCY_MS = 7500; // 1500
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPBTCOMM);
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject ResourceHelper resourceHelper;
|
||||
@Inject SP sp;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
|
||||
private final HasAndroidInjector injector;
|
||||
|
||||
private static final long RILEYLINK_FREQ_XTAL = 24000000;
|
||||
private static final int EXPECTED_MAX_BLUETOOTH_LATENCY_MS = 7500; // 1500
|
||||
public int notConnectedCount = 0;
|
||||
private RileyLinkBLE rileyLinkBle;
|
||||
private RFSpyReader reader;
|
||||
private RileyLinkTargetFrequency selectedTargetFrequency;
|
||||
private UUID radioServiceUUID = UUID.fromString(GattAttributes.SERVICE_RADIO);
|
||||
private UUID radioDataUUID = UUID.fromString(GattAttributes.CHARA_RADIO_DATA);
|
||||
private UUID radioVersionUUID = UUID.fromString(GattAttributes.CHARA_RADIO_VERSION);
|
||||
private UUID responseCountUUID = UUID.fromString(GattAttributes.CHARA_RADIO_RESPONSE_COUNT);
|
||||
private RileyLinkFirmwareVersion firmwareVersion;
|
||||
private String bleVersion; // We don't use it so no need of sofisticated logic
|
||||
Double currentFrequencyMHz;
|
||||
private Double currentFrequencyMHz;
|
||||
|
||||
|
||||
public RFSpy(RileyLinkBLE rileyLinkBle) {
|
||||
public RFSpy(HasAndroidInjector injector, RileyLinkBLE rileyLinkBle) {
|
||||
injector.androidInjector().inject(this);
|
||||
this.injector = injector;
|
||||
this.rileyLinkBle = rileyLinkBle;
|
||||
reader = new RFSpyReader(rileyLinkBle);
|
||||
reader = new RFSpyReader(aapsLogger, rileyLinkBle);
|
||||
}
|
||||
|
||||
|
||||
|
@ -75,13 +83,7 @@ public class RFSpy {
|
|||
// Call this after the RL services are discovered.
|
||||
// Starts an async task to read when data is available
|
||||
public void startReader() {
|
||||
rileyLinkBle.registerRadioResponseCountNotification(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
newDataIsAvailable();
|
||||
}
|
||||
});
|
||||
rileyLinkBle.registerRadioResponseCountNotification(this::newDataIsAvailable);
|
||||
reader.start();
|
||||
}
|
||||
|
||||
|
@ -90,13 +92,12 @@ public class RFSpy {
|
|||
// firmware version
|
||||
public void initializeRileyLink() {
|
||||
bleVersion = getVersion();
|
||||
firmwareVersion = getFirmwareVersion();
|
||||
RileyLinkUtil.setFirmwareVersion(firmwareVersion);
|
||||
rileyLinkServiceData.firmwareVersion = getFirmwareVersion();
|
||||
}
|
||||
|
||||
|
||||
// Call this from the "response count" notification handler.
|
||||
public void newDataIsAvailable() {
|
||||
private void newDataIsAvailable() {
|
||||
// pass the message to the reader (which should be internal to RFSpy)
|
||||
reader.newDataIsAvailable();
|
||||
}
|
||||
|
@ -108,11 +109,10 @@ public class RFSpy {
|
|||
BLECommOperationResult result = rileyLinkBle.readCharacteristic_blocking(radioServiceUUID, radioVersionUUID);
|
||||
if (result.resultCode == BLECommOperationResult.RESULT_SUCCESS) {
|
||||
String version = StringUtil.fromBytes(result.value);
|
||||
if (isLogEnabled())
|
||||
LOG.debug("BLE Version: " + version);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "BLE Version: " + version);
|
||||
return version;
|
||||
} else {
|
||||
LOG.error("getVersion failed with code: " + result.resultCode);
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "getVersion failed with code: " + result.resultCode);
|
||||
return "(null)";
|
||||
}
|
||||
}
|
||||
|
@ -120,14 +120,13 @@ public class RFSpy {
|
|||
public boolean isRileyLinkStillAvailable() {
|
||||
RileyLinkFirmwareVersion firmwareVersion = getFirmwareVersion();
|
||||
|
||||
return (firmwareVersion!= RileyLinkFirmwareVersion.UnknownVersion);
|
||||
return (firmwareVersion != RileyLinkFirmwareVersion.UnknownVersion);
|
||||
}
|
||||
|
||||
|
||||
public RileyLinkFirmwareVersion getFirmwareVersion() {
|
||||
private RileyLinkFirmwareVersion getFirmwareVersion() {
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Firmware Version. Get Version - Start");
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Firmware Version. Get Version - Start");
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
// We have to call raw version of communication to get firmware version
|
||||
|
@ -136,8 +135,7 @@ public class RFSpy {
|
|||
byte[] getVersionRaw = getByteArray(RileyLinkCommandType.GetVersion.code);
|
||||
byte[] response = writeToDataRaw(getVersionRaw, 5000);
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Firmware Version. GetVersion [response={}]", ByteUtil.shortHexString(response));
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Firmware Version. GetVersion [response={}]", ByteUtil.shortHexString(response));
|
||||
|
||||
if (response != null) { // && response[0] == (byte) 0xDD) {
|
||||
|
||||
|
@ -146,8 +144,7 @@ public class RFSpy {
|
|||
RileyLinkFirmwareVersion version = RileyLinkFirmwareVersion.getByVersionString(StringUtil
|
||||
.fromBytes(response));
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.trace("Firmware Version string: {}, resolved to {}.", versionString, version);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Firmware Version string: {}, resolved to {}.", versionString, version);
|
||||
|
||||
if (version != RileyLinkFirmwareVersion.UnknownVersion)
|
||||
return version;
|
||||
|
@ -156,7 +153,7 @@ public class RFSpy {
|
|||
}
|
||||
}
|
||||
|
||||
LOG.error("Firmware Version can't be determined. Checking with BLE Version [{}].", bleVersion);
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Firmware Version can't be determined. Checking with BLE Version [{}].", bleVersion);
|
||||
|
||||
if (bleVersion.contains(" 2.")) {
|
||||
return RileyLinkFirmwareVersion.Version_2_0;
|
||||
|
@ -172,7 +169,7 @@ public class RFSpy {
|
|||
byte[] junkInBuffer = reader.poll(0);
|
||||
|
||||
while (junkInBuffer != null) {
|
||||
LOG.warn(ThreadUtil.sig() + "writeToData: draining read queue, found this: "
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, ThreadUtil.sig() + "writeToData: draining read queue, found this: "
|
||||
+ ByteUtil.shortHexString(junkInBuffer));
|
||||
junkInBuffer = reader.poll(0);
|
||||
}
|
||||
|
@ -180,12 +177,12 @@ public class RFSpy {
|
|||
// prepend length, and send it.
|
||||
byte[] prepended = ByteUtil.concat(new byte[]{(byte) (bytes.length)}, bytes);
|
||||
|
||||
LOG.debug("writeToData (raw={})", ByteUtil.shortHexString(prepended));
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "writeToData (raw={})", ByteUtil.shortHexString(prepended));
|
||||
|
||||
BLECommOperationResult writeCheck = rileyLinkBle.writeCharacteristic_blocking(radioServiceUUID, radioDataUUID,
|
||||
prepended);
|
||||
if (writeCheck.resultCode != BLECommOperationResult.RESULT_SUCCESS) {
|
||||
LOG.error("BLE Write operation failed, code=" + writeCheck.resultCode);
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "BLE Write operation failed, code=" + writeCheck.resultCode);
|
||||
return null; // will be a null (invalid) response
|
||||
}
|
||||
SystemClock.sleep(100);
|
||||
|
@ -204,23 +201,22 @@ public class RFSpy {
|
|||
|
||||
RFSpyResponse resp = new RFSpyResponse(command, rawResponse);
|
||||
if (rawResponse == null) {
|
||||
LOG.error("writeToData: No response from RileyLink");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "writeToData: No response from RileyLink");
|
||||
notConnectedCount++;
|
||||
} else {
|
||||
if (resp.wasInterrupted()) {
|
||||
LOG.error("writeToData: RileyLink was interrupted");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "writeToData: RileyLink was interrupted");
|
||||
} else if (resp.wasTimeout()) {
|
||||
LOG.error("writeToData: RileyLink reports timeout");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "writeToData: RileyLink reports timeout");
|
||||
notConnectedCount++;
|
||||
} else if (resp.isOK()) {
|
||||
LOG.warn("writeToData: RileyLink reports OK");
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "writeToData: RileyLink reports OK");
|
||||
resetNotConnectedCount();
|
||||
} else {
|
||||
if (resp.looksLikeRadioPacket()) {
|
||||
// RadioResponse radioResp = resp.getRadioResponse();
|
||||
// byte[] responsePayload = radioResp.getPayload();
|
||||
if (isLogEnabled())
|
||||
LOG.trace("writeToData: received radio response. Will decode at upper level");
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "writeToData: received radio response. Will decode at upper level");
|
||||
resetNotConnectedCount();
|
||||
}
|
||||
// Log.i(TAG, "writeToData: raw response is " + ByteUtil.shortHexString(rawResponse));
|
||||
|
@ -274,14 +270,14 @@ public class RFSpy {
|
|||
int sendDelay = repeatCount * delay_ms;
|
||||
int receiveDelay = timeout_ms * (retryCount + 1);
|
||||
|
||||
SendAndListen command = new SendAndListen(sendChannel, repeatCount, delay_ms, listenChannel, timeout_ms,
|
||||
SendAndListen command = new SendAndListen(injector, sendChannel, repeatCount, delay_ms, listenChannel, timeout_ms,
|
||||
retryCount, extendPreamble_ms, pkt);
|
||||
|
||||
return writeToData(command, sendDelay + receiveDelay + EXPECTED_MAX_BLUETOOTH_LATENCY_MS);
|
||||
}
|
||||
|
||||
|
||||
public RFSpyResponse updateRegister(CC111XRegister reg, int val) {
|
||||
private RFSpyResponse updateRegister(CC111XRegister reg, int val) {
|
||||
RFSpyResponse resp = writeToData(new UpdateRegister(reg, (byte) val), EXPECTED_MAX_BLUETOOTH_LATENCY_MS);
|
||||
return resp;
|
||||
}
|
||||
|
@ -292,11 +288,11 @@ public class RFSpy {
|
|||
updateRegister(CC111XRegister.freq0, (byte) (value & 0xff));
|
||||
updateRegister(CC111XRegister.freq1, (byte) ((value >> 8) & 0xff));
|
||||
updateRegister(CC111XRegister.freq2, (byte) ((value >> 16) & 0xff));
|
||||
LOG.info("Set frequency to {} MHz", freqMHz);
|
||||
aapsLogger.info(LTag.PUMPBTCOMM, "Set frequency to {} MHz", freqMHz);
|
||||
|
||||
this.currentFrequencyMHz = freqMHz;
|
||||
|
||||
configureRadioForRegion(RileyLinkUtil.getRileyLinkTargetFrequency());
|
||||
configureRadioForRegion(rileyLinkServiceData.rileyLinkTargetFrequency);
|
||||
}
|
||||
|
||||
|
||||
|
@ -362,7 +358,7 @@ public class RFSpy {
|
|||
}
|
||||
break;
|
||||
default:
|
||||
LOG.warn("No region configuration for RfSpy and {}", frequency.name());
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "No region configuration for RfSpy and {}", frequency.name());
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -374,23 +370,22 @@ public class RFSpy {
|
|||
private void setMedtronicEncoding() {
|
||||
RileyLinkEncodingType encoding = RileyLinkEncodingType.FourByteSixByteLocal;
|
||||
|
||||
if (RileyLinkFirmwareVersion.isSameVersion(this.firmwareVersion, RileyLinkFirmwareVersion.Version2AndHigher)) {
|
||||
if (SP.getString(MedtronicConst.Prefs.Encoding, "None").equals(MainApp.gs(R.string.key_medtronic_pump_encoding_4b6b_rileylink))) {
|
||||
if (RileyLinkFirmwareVersion.isSameVersion(rileyLinkServiceData.firmwareVersion, RileyLinkFirmwareVersion.Version2AndHigher)) {
|
||||
if (sp.getString(MedtronicConst.Prefs.Encoding, "None").equals(resourceHelper.gs(R.string.key_medtronic_pump_encoding_4b6b_rileylink))) {
|
||||
encoding = RileyLinkEncodingType.FourByteSixByteRileyLink;
|
||||
}
|
||||
}
|
||||
|
||||
setRileyLinkEncoding(encoding);
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Set Encoding for Medtronic: " + encoding.name());
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Set Encoding for Medtronic: " + encoding.name());
|
||||
}
|
||||
|
||||
|
||||
private RFSpyResponse setPreamble(int preamble) {
|
||||
RFSpyResponse resp = null;
|
||||
try {
|
||||
resp = writeToData(new SetPreamble(preamble), EXPECTED_MAX_BLUETOOTH_LATENCY_MS);
|
||||
resp = writeToData(new SetPreamble(injector, preamble), EXPECTED_MAX_BLUETOOTH_LATENCY_MS);
|
||||
} catch (Exception e) {
|
||||
e.toString();
|
||||
}
|
||||
|
@ -403,7 +398,7 @@ public class RFSpy {
|
|||
|
||||
if (resp.isOK()) {
|
||||
reader.setRileyLinkEncodingType(encoding);
|
||||
RileyLinkUtil.setEncoding(encoding);
|
||||
rileyLinkUtil.setEncoding(encoding);
|
||||
}
|
||||
|
||||
return resp;
|
||||
|
@ -431,16 +426,10 @@ public class RFSpy {
|
|||
RFSpyResponse resp = null;
|
||||
try {
|
||||
resp = writeToData(new Reset(), EXPECTED_MAX_BLUETOOTH_LATENCY_MS);
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Reset command send, response: {}", resp);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Reset command send, response: {}", resp);
|
||||
} catch (Exception e) {
|
||||
e.toString();
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPBTCOMM);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,19 +1,15 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import android.os.SystemClock;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import android.os.SystemClock;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkEncodingType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations.BLECommOperationResult;
|
||||
|
@ -25,7 +21,7 @@ import info.nightscout.androidaps.plugins.pump.common.utils.ThreadUtil;
|
|||
*/
|
||||
public class RFSpyReader {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPBTCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
private static AsyncTask<Void, Void, Void> readerTask;
|
||||
private RileyLinkBLE rileyLinkBle;
|
||||
private Semaphore waitForRadioData = new Semaphore(0, true);
|
||||
|
@ -35,13 +31,9 @@ public class RFSpyReader {
|
|||
private boolean stopAtNull = true;
|
||||
|
||||
|
||||
public RFSpyReader(RileyLinkBLE rileyLinkBle) {
|
||||
RFSpyReader(AAPSLogger aapsLogger, RileyLinkBLE rileyLinkBle) {
|
||||
this.rileyLinkBle = rileyLinkBle;
|
||||
}
|
||||
|
||||
|
||||
public void init(RileyLinkBLE rileyLinkBLE) {
|
||||
this.rileyLinkBle = rileyLinkBLE;
|
||||
this.aapsLogger = aapsLogger;
|
||||
}
|
||||
|
||||
|
||||
|
@ -52,16 +44,15 @@ public class RFSpyReader {
|
|||
this.rileyLinkBle = rileyLinkBle;
|
||||
}
|
||||
|
||||
public void setRileyLinkEncodingType(RileyLinkEncodingType encodingType) {
|
||||
void setRileyLinkEncodingType(RileyLinkEncodingType encodingType) {
|
||||
stopAtNull = !(encodingType == RileyLinkEncodingType.Manchester || //
|
||||
encodingType == RileyLinkEncodingType.FourByteSixByteRileyLink);
|
||||
}
|
||||
|
||||
|
||||
// This timeout must be coordinated with the length of the RFSpy radio operation or Bad Things Happen.
|
||||
public byte[] poll(int timeout_ms) {
|
||||
if (isLogEnabled())
|
||||
LOG.trace(ThreadUtil.sig() + "Entering poll at t==" + SystemClock.uptimeMillis() + ", timeout is " + timeout_ms
|
||||
byte[] poll(int timeout_ms) {
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "Entering poll at t==" + SystemClock.uptimeMillis() + ", timeout is " + timeout_ms
|
||||
+ " mDataQueue size is " + mDataQueue.size());
|
||||
|
||||
if (mDataQueue.isEmpty()) {
|
||||
|
@ -70,16 +61,14 @@ public class RFSpyReader {
|
|||
// returns null if timeout.
|
||||
byte[] dataFromQueue = mDataQueue.poll(timeout_ms, TimeUnit.MILLISECONDS);
|
||||
if (dataFromQueue != null) {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Got data [" + ByteUtil.shortHexString(dataFromQueue) + "] at t=="
|
||||
+ SystemClock.uptimeMillis());
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Got data [" + ByteUtil.shortHexString(dataFromQueue) + "] at t=="
|
||||
+ SystemClock.uptimeMillis());
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Got data [null] at t==" + SystemClock.uptimeMillis());
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Got data [null] at t==" + SystemClock.uptimeMillis());
|
||||
}
|
||||
return dataFromQueue;
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("poll: Interrupted waiting for data");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "poll: Interrupted waiting for data");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,11 +77,10 @@ public class RFSpyReader {
|
|||
|
||||
|
||||
// Call this from the "response count" notification handler.
|
||||
public void newDataIsAvailable() {
|
||||
void newDataIsAvailable() {
|
||||
releaseCount++;
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.trace(ThreadUtil.sig() + "waitForRadioData released(count=" + releaseCount + ") at t="
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "waitForRadioData released(count=" + releaseCount + ") at t="
|
||||
+ SystemClock.uptimeMillis());
|
||||
waitForRadioData.release();
|
||||
}
|
||||
|
@ -110,8 +98,7 @@ public class RFSpyReader {
|
|||
try {
|
||||
acquireCount++;
|
||||
waitForRadioData.acquire();
|
||||
if (isLogEnabled())
|
||||
LOG.trace(ThreadUtil.sig() + "waitForRadioData acquired (count=" + acquireCount + ") at t="
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "waitForRadioData acquired (count=" + acquireCount + ") at t="
|
||||
+ SystemClock.uptimeMillis());
|
||||
SystemClock.sleep(100);
|
||||
SystemClock.sleep(1);
|
||||
|
@ -130,24 +117,19 @@ public class RFSpyReader {
|
|||
}
|
||||
mDataQueue.add(result.value);
|
||||
} else if (result.resultCode == BLECommOperationResult.RESULT_INTERRUPTED) {
|
||||
LOG.error("Read operation was interrupted");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Read operation was interrupted");
|
||||
} else if (result.resultCode == BLECommOperationResult.RESULT_TIMEOUT) {
|
||||
LOG.error("Read operation on Radio Data timed out");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Read operation on Radio Data timed out");
|
||||
} else if (result.resultCode == BLECommOperationResult.RESULT_BUSY) {
|
||||
LOG.error("FAIL: RileyLinkBLE reports operation already in progress");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "FAIL: RileyLinkBLE reports operation already in progress");
|
||||
} else if (result.resultCode == BLECommOperationResult.RESULT_NONE) {
|
||||
LOG.error("FAIL: got invalid result code: " + result.resultCode);
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "FAIL: got invalid result code: " + result.resultCode);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("Interrupted while waiting for data");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Interrupted while waiting for data");
|
||||
}
|
||||
}
|
||||
}
|
||||
}.execute();
|
||||
}
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPBTCOMM);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -12,15 +12,16 @@ import android.content.Context;
|
|||
import android.os.SystemClock;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.Semaphore;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes;
|
||||
|
@ -31,6 +32,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operation
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations.DescriptorWriteOperation;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ThreadUtil;
|
||||
|
||||
|
@ -40,11 +42,13 @@ import info.nightscout.androidaps.plugins.pump.common.utils.ThreadUtil;
|
|||
*/
|
||||
public class RileyLinkBLE {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPBTCOMM);
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
|
||||
private final Context context;
|
||||
public boolean gattDebugEnabled = true;
|
||||
boolean manualDisconnect = false;
|
||||
private boolean gattDebugEnabled = true;
|
||||
private boolean manualDisconnect = false;
|
||||
private BluetoothAdapter bluetoothAdapter;
|
||||
private BluetoothGattCallback bluetoothGattCallback;
|
||||
private BluetoothDevice rileyLinkDevice;
|
||||
|
@ -55,24 +59,24 @@ public class RileyLinkBLE {
|
|||
private boolean mIsConnected = false;
|
||||
|
||||
|
||||
public RileyLinkBLE(final Context context) {
|
||||
public RileyLinkBLE(HasAndroidInjector injector, final Context context) {
|
||||
injector.androidInjector().inject(this);
|
||||
this.context = context;
|
||||
this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("BT Adapter: " + this.bluetoothAdapter);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "BT Adapter: " + this.bluetoothAdapter);
|
||||
bluetoothGattCallback = new BluetoothGattCallback() {
|
||||
|
||||
@Override
|
||||
public void onCharacteristicChanged(final BluetoothGatt gatt,
|
||||
final BluetoothGattCharacteristic characteristic) {
|
||||
super.onCharacteristicChanged(gatt, characteristic);
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.trace(ThreadUtil.sig() + "onCharacteristicChanged "
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "onCharacteristicChanged "
|
||||
+ GattAttributes.lookup(characteristic.getUuid()) + " "
|
||||
+ ByteUtil.getHex(characteristic.getValue()));
|
||||
if (characteristic.getUuid().equals(UUID.fromString(GattAttributes.CHARA_RADIO_RESPONSE_COUNT))) {
|
||||
LOG.debug("Response Count is " + ByteUtil.shortHexString(characteristic.getValue()));
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Response Count is " + ByteUtil.shortHexString(characteristic.getValue()));
|
||||
}
|
||||
}
|
||||
if (radioResponseCountNotified != null) {
|
||||
|
@ -87,8 +91,8 @@ public class RileyLinkBLE {
|
|||
super.onCharacteristicRead(gatt, characteristic, status);
|
||||
|
||||
final String statusMessage = getGattStatusMessage(status);
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.trace(ThreadUtil.sig() + "onCharacteristicRead ("
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "onCharacteristicRead ("
|
||||
+ GattAttributes.lookup(characteristic.getUuid()) + ") " + statusMessage + ":"
|
||||
+ ByteUtil.getHex(characteristic.getValue()));
|
||||
}
|
||||
|
@ -102,8 +106,8 @@ public class RileyLinkBLE {
|
|||
super.onCharacteristicWrite(gatt, characteristic, status);
|
||||
|
||||
final String uuidString = GattAttributes.lookup(characteristic.getUuid());
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.trace(ThreadUtil.sig() + "onCharacteristicWrite " + getGattStatusMessage(status) + " "
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "onCharacteristicWrite " + getGattStatusMessage(status) + " "
|
||||
+ uuidString + " " + ByteUtil.shortHexString(characteristic.getValue()));
|
||||
}
|
||||
mCurrentOperation.gattOperationCompletionCallback(characteristic.getUuid(), characteristic.getValue());
|
||||
|
@ -116,7 +120,7 @@ public class RileyLinkBLE {
|
|||
|
||||
// https://github.com/NordicSemiconductor/puck-central-android/blob/master/PuckCentral/app/src/main/java/no/nordicsemi/puckcentral/bluetooth/gatt/GattManager.java#L117
|
||||
if (status == 133) {
|
||||
LOG.error("Got the status 133 bug, closing gatt");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Got the status 133 bug, closing gatt");
|
||||
disconnect();
|
||||
SystemClock.sleep(500);
|
||||
return;
|
||||
|
@ -136,29 +140,27 @@ public class RileyLinkBLE {
|
|||
stateMessage = "UNKNOWN newState (" + newState + ")";
|
||||
}
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.warn("onConnectionStateChange " + getGattStatusMessage(status) + " " + stateMessage);
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "onConnectionStateChange " + getGattStatusMessage(status) + " " + stateMessage);
|
||||
}
|
||||
|
||||
if (newState == BluetoothProfile.STATE_CONNECTED) {
|
||||
if (status == BluetoothGatt.GATT_SUCCESS) {
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.BluetoothConnected);
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.BluetoothConnected, context);
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("BT State connected, GATT status {} ({})", status, getGattStatusMessage(status));
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "BT State connected, GATT status {} ({})", status, getGattStatusMessage(status));
|
||||
}
|
||||
|
||||
} else if ((newState == BluetoothProfile.STATE_CONNECTING) || //
|
||||
(newState == BluetoothProfile.STATE_DISCONNECTING)) {
|
||||
// LOG.debug("We are in {} state.", status == BluetoothProfile.STATE_CONNECTING ? "Connecting" :
|
||||
// aapsLogger.debug(LTag.PUMPBTCOMM,"We are in {} state.", status == BluetoothProfile.STATE_CONNECTING ? "Connecting" :
|
||||
// "Disconnecting");
|
||||
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkDisconnected);
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkDisconnected, context);
|
||||
if (manualDisconnect)
|
||||
close();
|
||||
LOG.warn("RileyLink Disconnected.");
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "RileyLink Disconnected.");
|
||||
} else {
|
||||
LOG.warn("Some other state: (status={},newState={})", status, newState);
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Some other state: (status={},newState={})", status, newState);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -166,8 +168,8 @@ public class RileyLinkBLE {
|
|||
@Override
|
||||
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
|
||||
super.onDescriptorWrite(gatt, descriptor, status);
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.warn("onDescriptorWrite " + GattAttributes.lookup(descriptor.getUuid()) + " "
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "onDescriptorWrite " + GattAttributes.lookup(descriptor.getUuid()) + " "
|
||||
+ getGattStatusMessage(status) + " written: " + ByteUtil.getHex(descriptor.getValue()));
|
||||
}
|
||||
mCurrentOperation.gattOperationCompletionCallback(descriptor.getUuid(), descriptor.getValue());
|
||||
|
@ -178,8 +180,8 @@ public class RileyLinkBLE {
|
|||
public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
|
||||
super.onDescriptorRead(gatt, descriptor, status);
|
||||
mCurrentOperation.gattOperationCompletionCallback(descriptor.getUuid(), descriptor.getValue());
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.warn("onDescriptorRead " + getGattStatusMessage(status) + " status " + descriptor);
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "onDescriptorRead " + getGattStatusMessage(status) + " status " + descriptor);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -187,8 +189,8 @@ public class RileyLinkBLE {
|
|||
@Override
|
||||
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
|
||||
super.onMtuChanged(gatt, mtu, status);
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.warn("onMtuChanged " + mtu + " status " + status);
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "onMtuChanged " + mtu + " status " + status);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -196,8 +198,8 @@ public class RileyLinkBLE {
|
|||
@Override
|
||||
public void onReadRemoteRssi(final BluetoothGatt gatt, int rssi, int status) {
|
||||
super.onReadRemoteRssi(gatt, rssi, status);
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.warn("onReadRemoteRssi " + getGattStatusMessage(status) + ": " + rssi);
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "onReadRemoteRssi " + getGattStatusMessage(status) + ": " + rssi);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -205,8 +207,8 @@ public class RileyLinkBLE {
|
|||
@Override
|
||||
public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
|
||||
super.onReliableWriteCompleted(gatt, status);
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.warn("onReliableWriteCompleted status " + status);
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "onReliableWriteCompleted status " + status);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -232,27 +234,26 @@ public class RileyLinkBLE {
|
|||
}
|
||||
}
|
||||
|
||||
if (gattDebugEnabled && isLogEnabled()) {
|
||||
LOG.warn("onServicesDiscovered " + getGattStatusMessage(status));
|
||||
if (gattDebugEnabled) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "onServicesDiscovered " + getGattStatusMessage(status));
|
||||
}
|
||||
|
||||
LOG.info("Gatt device is RileyLink device: " + rileyLinkFound);
|
||||
aapsLogger.info(LTag.PUMPBTCOMM, "Gatt device is RileyLink device: " + rileyLinkFound);
|
||||
|
||||
if (rileyLinkFound) {
|
||||
mIsConnected = true;
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkReady);
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkReady, context);
|
||||
// RileyLinkUtil.sendNotification(new
|
||||
// ServiceNotification(RileyLinkConst.Intents.RileyLinkReady), null);
|
||||
} else {
|
||||
mIsConnected = false;
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.RileyLinkError,
|
||||
rileyLinkServiceData.setServiceState(RileyLinkServiceState.RileyLinkError,
|
||||
RileyLinkError.DeviceIsNotRileyLink);
|
||||
}
|
||||
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("onServicesDiscovered " + getGattStatusMessage(status));
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkGattFailed);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "onServicesDiscovered " + getGattStatusMessage(status));
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkGattFailed, context);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -261,9 +262,7 @@ public class RileyLinkBLE {
|
|||
|
||||
private boolean isAnyRileyLinkServiceFound(BluetoothGattService service) {
|
||||
|
||||
boolean found = false;
|
||||
|
||||
found = GattAttributes.isRileyLink(service.getUuid());
|
||||
boolean found = GattAttributes.isRileyLink(service.getUuid());
|
||||
|
||||
if (found) {
|
||||
return true;
|
||||
|
@ -313,7 +312,7 @@ public class RileyLinkBLE {
|
|||
|
||||
stringBuilder.append("\n\n");
|
||||
|
||||
LOG.warn(stringBuilder.toString());
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, stringBuilder.toString());
|
||||
|
||||
List<BluetoothGattService> includedServices = service.getIncludedServices();
|
||||
|
||||
|
@ -324,7 +323,7 @@ public class RileyLinkBLE {
|
|||
}
|
||||
|
||||
|
||||
public void registerRadioResponseCountNotification(Runnable notifier) {
|
||||
void registerRadioResponseCountNotification(Runnable notifier) {
|
||||
radioResponseCountNotified = notifier;
|
||||
}
|
||||
|
||||
|
@ -342,11 +341,10 @@ public class RileyLinkBLE {
|
|||
}
|
||||
|
||||
if (bluetoothConnectionGatt.discoverServices()) {
|
||||
if (isLogEnabled())
|
||||
LOG.warn("Starting to discover GATT Services.");
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Starting to discover GATT Services.");
|
||||
return true;
|
||||
} else {
|
||||
LOG.error("Cannot discover GATT Services.");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Cannot discover GATT Services.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -356,7 +354,7 @@ public class RileyLinkBLE {
|
|||
BLECommOperationResult result = setNotification_blocking(UUID.fromString(GattAttributes.SERVICE_RADIO), //
|
||||
UUID.fromString(GattAttributes.CHARA_RADIO_RESPONSE_COUNT));
|
||||
if (result.resultCode != BLECommOperationResult.RESULT_SUCCESS) {
|
||||
LOG.error("Error setting response count notification");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Error setting response count notification");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -364,36 +362,34 @@ public class RileyLinkBLE {
|
|||
|
||||
|
||||
public void findRileyLink(String RileyLinkAddress) {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("RileyLink address: " + RileyLinkAddress);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "RileyLink address: " + RileyLinkAddress);
|
||||
// Must verify that this is a valid MAC, or crash.
|
||||
|
||||
rileyLinkDevice = bluetoothAdapter.getRemoteDevice(RileyLinkAddress);
|
||||
// if this succeeds, we get a connection state change callback?
|
||||
|
||||
if (rileyLinkDevice!=null) {
|
||||
if (rileyLinkDevice != null) {
|
||||
connectGatt();
|
||||
} else {
|
||||
LOG.error("RileyLink device not found with address: " + RileyLinkAddress);
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "RileyLink device not found with address: " + RileyLinkAddress);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// This function must be run on UI thread.
|
||||
public void connectGatt() {
|
||||
if (this.rileyLinkDevice==null) {
|
||||
LOG.error("RileyLink device is null, can't do connectGatt.");
|
||||
if (this.rileyLinkDevice == null) {
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "RileyLink device is null, can't do connectGatt.");
|
||||
return;
|
||||
}
|
||||
|
||||
bluetoothConnectionGatt = rileyLinkDevice.connectGatt(context, true, bluetoothGattCallback);
|
||||
// , BluetoothDevice.TRANSPORT_LE
|
||||
if (bluetoothConnectionGatt == null) {
|
||||
LOG.error("Failed to connect to Bluetooth Low Energy device at " + bluetoothAdapter.getAddress());
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Failed to connect to Bluetooth Low Energy device at " + bluetoothAdapter.getAddress());
|
||||
} else {
|
||||
if (gattDebugEnabled) {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Gatt Connected.");
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Gatt Connected.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -401,8 +397,7 @@ public class RileyLinkBLE {
|
|||
|
||||
public void disconnect() {
|
||||
mIsConnected = false;
|
||||
if (isLogEnabled())
|
||||
LOG.warn("Closing GATT connection");
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Closing GATT connection");
|
||||
// Close old conenction
|
||||
if (bluetoothConnectionGatt != null) {
|
||||
// Not sure if to disconnect or to close first..
|
||||
|
@ -420,7 +415,7 @@ public class RileyLinkBLE {
|
|||
}
|
||||
|
||||
|
||||
public BLECommOperationResult setNotification_blocking(UUID serviceUUID, UUID charaUUID) {
|
||||
private BLECommOperationResult setNotification_blocking(UUID serviceUUID, UUID charaUUID) {
|
||||
BLECommOperationResult rval = new BLECommOperationResult();
|
||||
if (bluetoothConnectionGatt != null) {
|
||||
|
||||
|
@ -428,7 +423,7 @@ public class RileyLinkBLE {
|
|||
gattOperationSema.acquire();
|
||||
SystemClock.sleep(1); // attempting to yield thread, to make sequence of events easier to follow
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("setNotification_blocking: interrupted waiting for gattOperationSema");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "setNotification_blocking: interrupted waiting for gattOperationSema");
|
||||
return rval;
|
||||
}
|
||||
if (mCurrentOperation != null) {
|
||||
|
@ -437,7 +432,7 @@ public class RileyLinkBLE {
|
|||
if (bluetoothConnectionGatt.getService(serviceUUID) == null) {
|
||||
// Catch if the service is not supported by the BLE device
|
||||
rval.resultCode = BLECommOperationResult.RESULT_NONE;
|
||||
LOG.error("BT Device not supported");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "BT Device not supported");
|
||||
// TODO: 11/07/2016 UI update for user
|
||||
} else {
|
||||
BluetoothGattCharacteristic chara = bluetoothConnectionGatt.getService(serviceUUID)
|
||||
|
@ -447,13 +442,12 @@ public class RileyLinkBLE {
|
|||
List<BluetoothGattDescriptor> list = chara.getDescriptors();
|
||||
if (gattDebugEnabled) {
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Found descriptor: " + list.get(i).toString());
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Found descriptor: " + list.get(i).toString());
|
||||
}
|
||||
}
|
||||
BluetoothGattDescriptor descr = list.get(0);
|
||||
// Tell the remote device to send the notifications
|
||||
mCurrentOperation = new DescriptorWriteOperation(bluetoothConnectionGatt, descr,
|
||||
mCurrentOperation = new DescriptorWriteOperation(aapsLogger, bluetoothConnectionGatt, descr,
|
||||
BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
|
||||
mCurrentOperation.execute(this);
|
||||
if (mCurrentOperation.timedOut) {
|
||||
|
@ -468,7 +462,7 @@ public class RileyLinkBLE {
|
|||
gattOperationSema.release();
|
||||
}
|
||||
} else {
|
||||
LOG.error("setNotification_blocking: not configured!");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "setNotification_blocking: not configured!");
|
||||
rval.resultCode = BLECommOperationResult.RESULT_NOT_CONFIGURED;
|
||||
}
|
||||
return rval;
|
||||
|
@ -476,7 +470,7 @@ public class RileyLinkBLE {
|
|||
|
||||
|
||||
// call from main
|
||||
public BLECommOperationResult writeCharacteristic_blocking(UUID serviceUUID, UUID charaUUID, byte[] value) {
|
||||
BLECommOperationResult writeCharacteristic_blocking(UUID serviceUUID, UUID charaUUID, byte[] value) {
|
||||
BLECommOperationResult rval = new BLECommOperationResult();
|
||||
if (bluetoothConnectionGatt != null) {
|
||||
rval.value = value;
|
||||
|
@ -484,7 +478,7 @@ public class RileyLinkBLE {
|
|||
gattOperationSema.acquire();
|
||||
SystemClock.sleep(1); // attempting to yield thread, to make sequence of events easier to follow
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("writeCharacteristic_blocking: interrupted waiting for gattOperationSema");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "writeCharacteristic_blocking: interrupted waiting for gattOperationSema");
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
@ -497,12 +491,12 @@ public class RileyLinkBLE {
|
|||
// app that created the bluetoothConnectionGatt has been destroyed/created,
|
||||
// e.g. when the user switches from portrait to landscape.
|
||||
rval.resultCode = BLECommOperationResult.RESULT_NONE;
|
||||
LOG.error("BT Device not supported");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "BT Device not supported");
|
||||
// TODO: 11/07/2016 UI update for user
|
||||
} else {
|
||||
BluetoothGattCharacteristic chara = bluetoothConnectionGatt.getService(serviceUUID)
|
||||
.getCharacteristic(charaUUID);
|
||||
mCurrentOperation = new CharacteristicWriteOperation(bluetoothConnectionGatt, chara, value);
|
||||
mCurrentOperation = new CharacteristicWriteOperation(aapsLogger, bluetoothConnectionGatt, chara, value);
|
||||
mCurrentOperation.execute(this);
|
||||
if (mCurrentOperation.timedOut) {
|
||||
rval.resultCode = BLECommOperationResult.RESULT_TIMEOUT;
|
||||
|
@ -516,21 +510,21 @@ public class RileyLinkBLE {
|
|||
gattOperationSema.release();
|
||||
}
|
||||
} else {
|
||||
LOG.error("writeCharacteristic_blocking: not configured!");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "writeCharacteristic_blocking: not configured!");
|
||||
rval.resultCode = BLECommOperationResult.RESULT_NOT_CONFIGURED;
|
||||
}
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
||||
public BLECommOperationResult readCharacteristic_blocking(UUID serviceUUID, UUID charaUUID) {
|
||||
BLECommOperationResult readCharacteristic_blocking(UUID serviceUUID, UUID charaUUID) {
|
||||
BLECommOperationResult rval = new BLECommOperationResult();
|
||||
if (bluetoothConnectionGatt != null) {
|
||||
try {
|
||||
gattOperationSema.acquire();
|
||||
SystemClock.sleep(1); // attempting to yield thread, to make sequence of events easier to follow
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("readCharacteristic_blocking: Interrupted waiting for gattOperationSema");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "readCharacteristic_blocking: Interrupted waiting for gattOperationSema");
|
||||
return rval;
|
||||
}
|
||||
if (mCurrentOperation != null) {
|
||||
|
@ -539,12 +533,12 @@ public class RileyLinkBLE {
|
|||
if (bluetoothConnectionGatt.getService(serviceUUID) == null) {
|
||||
// Catch if the service is not supported by the BLE device
|
||||
rval.resultCode = BLECommOperationResult.RESULT_NONE;
|
||||
LOG.error("BT Device not supported");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "BT Device not supported");
|
||||
// TODO: 11/07/2016 UI update for user
|
||||
} else {
|
||||
BluetoothGattCharacteristic chara = bluetoothConnectionGatt.getService(serviceUUID).getCharacteristic(
|
||||
charaUUID);
|
||||
mCurrentOperation = new CharacteristicReadOperation(bluetoothConnectionGatt, chara);
|
||||
mCurrentOperation = new CharacteristicReadOperation(aapsLogger, bluetoothConnectionGatt, chara);
|
||||
mCurrentOperation.execute(this);
|
||||
if (mCurrentOperation.timedOut) {
|
||||
rval.resultCode = BLECommOperationResult.RESULT_TIMEOUT;
|
||||
|
@ -559,7 +553,7 @@ public class RileyLinkBLE {
|
|||
mCurrentOperation = null;
|
||||
gattOperationSema.release();
|
||||
} else {
|
||||
LOG.error("readCharacteristic_blocking: not configured!");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "readCharacteristic_blocking: not configured!");
|
||||
rval.resultCode = BLECommOperationResult.RESULT_NOT_CONFIGURED;
|
||||
}
|
||||
return rval;
|
||||
|
@ -582,9 +576,4 @@ public class RileyLinkBLE {
|
|||
|
||||
return statusMessage;
|
||||
}
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPBTCOMM);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -3,14 +3,20 @@ package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioPacket;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
|
||||
public class SendAndListen extends RileyLinkCommand {
|
||||
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
|
||||
private byte sendChannel;
|
||||
private byte repeatCount;
|
||||
private int delayBetweenPackets_ms;
|
||||
|
@ -21,20 +27,21 @@ public class SendAndListen extends RileyLinkCommand {
|
|||
private RadioPacket packetToSend;
|
||||
|
||||
|
||||
public SendAndListen(byte sendChannel, byte repeatCount, byte delayBetweenPackets_ms, byte listenChannel,
|
||||
public SendAndListen(HasAndroidInjector injector, byte sendChannel, byte repeatCount, byte delayBetweenPackets_ms, byte listenChannel,
|
||||
int timeout_ms, byte retryCount, RadioPacket packetToSend
|
||||
|
||||
) {
|
||||
this(sendChannel, repeatCount, delayBetweenPackets_ms, listenChannel, timeout_ms, retryCount, null,
|
||||
this(injector, sendChannel, repeatCount, delayBetweenPackets_ms, listenChannel, timeout_ms, retryCount, null,
|
||||
packetToSend);
|
||||
}
|
||||
|
||||
|
||||
public SendAndListen(byte sendChannel, byte repeatCount, int delayBetweenPackets_ms, byte listenChannel,
|
||||
int timeout_ms, byte retryCount, Integer preambleExtension_ms, RadioPacket packetToSend
|
||||
public SendAndListen(HasAndroidInjector injector, byte sendChannel, byte repeatCount, int delayBetweenPackets_ms, byte listenChannel,
|
||||
int timeout_ms, byte retryCount, Integer preambleExtension_ms, RadioPacket packetToSend
|
||||
|
||||
) {
|
||||
super();
|
||||
injector.androidInjector().inject(this);
|
||||
this.sendChannel = sendChannel;
|
||||
this.repeatCount = repeatCount;
|
||||
this.delayBetweenPackets_ms = delayBetweenPackets_ms;
|
||||
|
@ -57,8 +64,8 @@ public class SendAndListen extends RileyLinkCommand {
|
|||
|
||||
// If firmware version is not set (error reading version from device, shouldn't happen),
|
||||
// we will default to version 2
|
||||
boolean isPacketV2 = RileyLinkUtil.getFirmwareVersion() != null ? RileyLinkUtil.getFirmwareVersion()
|
||||
.isSameVersion(RileyLinkFirmwareVersion.Version2AndHigher) : true;
|
||||
boolean isPacketV2 = rileyLinkServiceData.firmwareVersion == null || rileyLinkServiceData.firmwareVersion
|
||||
.isSameVersion(RileyLinkFirmwareVersion.Version2AndHigher);
|
||||
|
||||
ArrayList<Byte> bytes = new ArrayList<Byte>();
|
||||
bytes.add(this.getCommandType().code);
|
||||
|
|
|
@ -4,20 +4,26 @@ import java.nio.ByteBuffer;
|
|||
|
||||
import org.apache.commons.lang3.NotImplementedException;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
|
||||
public class SetPreamble extends RileyLinkCommand {
|
||||
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
|
||||
private int preamble;
|
||||
|
||||
|
||||
public SetPreamble(int preamble) throws Exception {
|
||||
public SetPreamble(HasAndroidInjector injector, int preamble) throws Exception {
|
||||
super();
|
||||
|
||||
// this command was not supported before 2.0
|
||||
if (!RileyLinkUtil.getFirmwareVersion().isSameVersion(RileyLinkFirmwareVersion.Version2AndHigher)) {
|
||||
if (!rileyLinkServiceData.firmwareVersion.isSameVersion(RileyLinkFirmwareVersion.Version2AndHigher)) {
|
||||
throw new NotImplementedException("Old firmware does not support SetPreamble command");
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkCommunicationException;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command.RileyLinkCommand;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RFSpyRLResponse;
|
||||
|
@ -48,12 +49,12 @@ public class RFSpyResponse {
|
|||
}
|
||||
|
||||
|
||||
public RadioResponse getRadioResponse() throws RileyLinkCommunicationException {
|
||||
public RadioResponse getRadioResponse(HasAndroidInjector injector) throws RileyLinkCommunicationException {
|
||||
if (looksLikeRadioPacket()) {
|
||||
radioResponse = new RadioResponse(command);
|
||||
radioResponse = new RadioResponse(injector, command);
|
||||
radioResponse.init(raw);
|
||||
} else {
|
||||
radioResponse = new RadioResponse();
|
||||
radioResponse = new RadioResponse(injector);
|
||||
}
|
||||
return radioResponse;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,9 @@ package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data;
|
|||
|
||||
import org.apache.commons.lang3.NotImplementedException;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.CRC;
|
||||
|
@ -12,10 +15,13 @@ import info.nightscout.androidaps.plugins.pump.common.utils.CRC;
|
|||
|
||||
public class RadioPacket {
|
||||
|
||||
protected byte[] pkt;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
|
||||
private byte[] pkt;
|
||||
|
||||
|
||||
public RadioPacket(byte[] pkt) {
|
||||
public RadioPacket(HasAndroidInjector injector, byte[] pkt) {
|
||||
injector.androidInjector().inject(this);
|
||||
this.pkt = pkt;
|
||||
}
|
||||
|
||||
|
@ -25,7 +31,7 @@ public class RadioPacket {
|
|||
}
|
||||
|
||||
|
||||
public byte[] getWithCRC() {
|
||||
private byte[] getWithCRC() {
|
||||
byte[] withCRC = ByteUtil.concat(pkt, CRC.crc8(pkt));
|
||||
return withCRC;
|
||||
}
|
||||
|
@ -33,7 +39,7 @@ public class RadioPacket {
|
|||
|
||||
public byte[] getEncoded() {
|
||||
|
||||
switch (RileyLinkUtil.getEncoding()) {
|
||||
switch (rileyLinkUtil.getEncoding()) {
|
||||
case Manchester: { // We have this encoding in RL firmware
|
||||
return pkt;
|
||||
}
|
||||
|
@ -41,8 +47,8 @@ public class RadioPacket {
|
|||
case FourByteSixByteLocal: {
|
||||
byte[] withCRC = getWithCRC();
|
||||
|
||||
byte[] encoded = RileyLinkUtil.getEncoding4b6b().encode4b6b(withCRC);
|
||||
return ByteUtil.concat(encoded, (byte)0);
|
||||
byte[] encoded = rileyLinkUtil.getEncoding4b6b().encode4b6b(withCRC);
|
||||
return ByteUtil.concat(encoded, (byte) 0);
|
||||
}
|
||||
|
||||
case FourByteSixByteRileyLink: {
|
||||
|
@ -50,8 +56,7 @@ public class RadioPacket {
|
|||
}
|
||||
|
||||
default:
|
||||
throw new NotImplementedException(("Encoding not supported: " + RileyLinkUtil.getEncoding().toString()));
|
||||
throw new NotImplementedException(("Encoding not supported: " + rileyLinkUtil.getEncoding().toString()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,17 +1,19 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data;
|
||||
|
||||
import org.apache.commons.lang3.NotImplementedException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkCommunicationException;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.command.RileyLinkCommand;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkBLEError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.CRC;
|
||||
|
||||
|
@ -20,26 +22,25 @@ import info.nightscout.androidaps.plugins.pump.common.utils.CRC;
|
|||
*/
|
||||
public class RadioResponse {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPBTCOMM);
|
||||
|
||||
public boolean decodedOK = false;
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
|
||||
private boolean decodedOK = false;
|
||||
public int rssi;
|
||||
public int responseNumber;
|
||||
public byte[] decodedPayload = new byte[0];
|
||||
public byte receivedCRC;
|
||||
private int responseNumber;
|
||||
private byte[] decodedPayload = new byte[0];
|
||||
private byte receivedCRC;
|
||||
private RileyLinkCommand command;
|
||||
|
||||
|
||||
public RadioResponse() {
|
||||
|
||||
public RadioResponse(HasAndroidInjector injector) {
|
||||
injector.androidInjector().inject(this);
|
||||
}
|
||||
|
||||
|
||||
// public RadioResponse(byte[] rxData) {
|
||||
// init(rxData);
|
||||
// }
|
||||
|
||||
public RadioResponse(RileyLinkCommand command /* , byte[] raw */) {
|
||||
public RadioResponse(HasAndroidInjector injector, RileyLinkCommand command /* , byte[] raw */) {
|
||||
this(injector);
|
||||
this.command = command;
|
||||
// init(raw);
|
||||
}
|
||||
|
@ -75,8 +76,8 @@ public class RadioResponse {
|
|||
}
|
||||
byte[] encodedPayload;
|
||||
|
||||
if (RileyLinkFirmwareVersion.isSameVersion(RileyLinkUtil.getRileyLinkServiceData().versionCC110,
|
||||
RileyLinkFirmwareVersion.Version2)) {
|
||||
if (RileyLinkFirmwareVersion.isSameVersion(rileyLinkServiceData.versionCC110,
|
||||
RileyLinkFirmwareVersion.Version2)) {
|
||||
encodedPayload = ByteUtil.substring(rxData, 3, rxData.length - 3);
|
||||
rssi = rxData[1];
|
||||
responseNumber = rxData[2];
|
||||
|
@ -92,23 +93,23 @@ public class RadioResponse {
|
|||
// well, for non-radio commands we shouldn't even reach this point
|
||||
// but getVersion is kind of exception
|
||||
if (command != null && //
|
||||
command.getCommandType() != RileyLinkCommandType.SendAndListen) {
|
||||
command.getCommandType() != RileyLinkCommandType.SendAndListen) {
|
||||
decodedOK = true;
|
||||
decodedPayload = encodedPayload;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (RileyLinkUtil.getEncoding()) {
|
||||
switch (rileyLinkUtil.getEncoding()) {
|
||||
|
||||
case Manchester:
|
||||
case FourByteSixByteRileyLink: {
|
||||
decodedOK = true;
|
||||
decodedPayload = encodedPayload;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case FourByteSixByteLocal: {
|
||||
byte[] decodeThis = RileyLinkUtil.getEncoding4b6b().decode4b6b(encodedPayload);
|
||||
byte[] decodeThis = rileyLinkUtil.getEncoding4b6b().decode4b6b(encodedPayload);
|
||||
|
||||
if (decodeThis != null && decodeThis.length > 2) {
|
||||
decodedOK = true;
|
||||
|
@ -117,22 +118,22 @@ public class RadioResponse {
|
|||
receivedCRC = decodeThis[decodeThis.length - 1];
|
||||
byte calculatedCRC = CRC.crc8(decodedPayload);
|
||||
if (receivedCRC != calculatedCRC) {
|
||||
LOG.error(String.format("RadioResponse: CRC mismatch, calculated 0x%02x, received 0x%02x",
|
||||
calculatedCRC, receivedCRC));
|
||||
aapsLogger.error(LTag.PUMPCOMM, String.format("RadioResponse: CRC mismatch, calculated 0x%02x, received 0x%02x",
|
||||
calculatedCRC, receivedCRC));
|
||||
}
|
||||
} else {
|
||||
throw new RileyLinkCommunicationException(RileyLinkBLEError.TooShortOrNullResponse);
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new NotImplementedException("this {" + RileyLinkUtil.getEncoding().toString()
|
||||
+ "} encoding is not supported");
|
||||
throw new NotImplementedException("this {" + rileyLinkUtil.getEncoding().toString()
|
||||
+ "} encoding is not supported");
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
decodedOK = false;
|
||||
LOG.error("Failed to decode radio data: " + ByteUtil.shortHexString(encodedPayload));
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Failed to decode radio data: " + ByteUtil.shortHexString(encodedPayload));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,17 +1,14 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.os.SystemClock;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkBLE;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes;
|
||||
|
||||
|
@ -20,12 +17,13 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.Gatt
|
|||
*/
|
||||
public class CharacteristicReadOperation extends BLECommOperation {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPBTCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
|
||||
private BluetoothGattCharacteristic characteristic;
|
||||
|
||||
|
||||
public CharacteristicReadOperation(BluetoothGatt gatt, BluetoothGattCharacteristic chara) {
|
||||
public CharacteristicReadOperation(AAPSLogger aapsLogger, BluetoothGatt gatt, BluetoothGattCharacteristic chara) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
this.gatt = gatt;
|
||||
this.characteristic = chara;
|
||||
}
|
||||
|
@ -39,15 +37,14 @@ public class CharacteristicReadOperation extends BLECommOperation {
|
|||
boolean didAcquire = operationComplete.tryAcquire(getGattOperationTimeout_ms(), TimeUnit.MILLISECONDS);
|
||||
if (didAcquire) {
|
||||
SystemClock.sleep(1); // This is to allow the IBinder thread to exit before we continue, allowing easier
|
||||
// understanding of the sequence of events.
|
||||
// understanding of the sequence of events.
|
||||
// success
|
||||
} else {
|
||||
LOG.error("Timeout waiting for gatt write operation to complete");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Timeout waiting for gatt write operation to complete");
|
||||
timedOut = true;
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
if (isLogEnabled())
|
||||
LOG.error("Interrupted while waiting for gatt write operation to complete");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Interrupted while waiting for gatt write operation to complete");
|
||||
interrupted = true;
|
||||
}
|
||||
value = characteristic.getValue();
|
||||
|
@ -58,15 +55,10 @@ public class CharacteristicReadOperation extends BLECommOperation {
|
|||
public void gattOperationCompletionCallback(UUID uuid, byte[] value) {
|
||||
super.gattOperationCompletionCallback(uuid, value);
|
||||
if (!characteristic.getUuid().equals(uuid)) {
|
||||
LOG.error(String.format(
|
||||
"Completion callback: UUID does not match! out of sequence? Found: %s, should be %s",
|
||||
GattAttributes.lookup(characteristic.getUuid()), GattAttributes.lookup(uuid)));
|
||||
aapsLogger.error(LTag.PUMPCOMM, String.format(
|
||||
"Completion callback: UUID does not match! out of sequence? Found: %s, should be %s",
|
||||
GattAttributes.lookup(characteristic.getUuid()), GattAttributes.lookup(uuid)));
|
||||
}
|
||||
operationComplete.release();
|
||||
}
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPBTCOMM);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,17 +1,14 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.os.SystemClock;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkBLE;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes;
|
||||
|
||||
|
@ -20,12 +17,13 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.Gatt
|
|||
*/
|
||||
public class CharacteristicWriteOperation extends BLECommOperation {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPBTCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
|
||||
private BluetoothGattCharacteristic characteristic;
|
||||
|
||||
|
||||
public CharacteristicWriteOperation(BluetoothGatt gatt, BluetoothGattCharacteristic chara, byte[] value) {
|
||||
public CharacteristicWriteOperation(AAPSLogger aapsLogger, BluetoothGatt gatt, BluetoothGattCharacteristic chara, byte[] value) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
this.gatt = gatt;
|
||||
this.characteristic = chara;
|
||||
this.value = value;
|
||||
|
@ -42,14 +40,14 @@ public class CharacteristicWriteOperation extends BLECommOperation {
|
|||
boolean didAcquire = operationComplete.tryAcquire(getGattOperationTimeout_ms(), TimeUnit.MILLISECONDS);
|
||||
if (didAcquire) {
|
||||
SystemClock.sleep(1); // This is to allow the IBinder thread to exit before we continue, allowing easier
|
||||
// understanding of the sequence of events.
|
||||
// understanding of the sequence of events.
|
||||
// success
|
||||
} else {
|
||||
LOG.error("Timeout waiting for gatt write operation to complete");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Timeout waiting for gatt write operation to complete");
|
||||
timedOut = true;
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("Interrupted while waiting for gatt write operation to complete");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Interrupted while waiting for gatt write operation to complete");
|
||||
interrupted = true;
|
||||
}
|
||||
|
||||
|
@ -60,16 +58,10 @@ public class CharacteristicWriteOperation extends BLECommOperation {
|
|||
@Override
|
||||
public void gattOperationCompletionCallback(UUID uuid, byte[] value) {
|
||||
if (!characteristic.getUuid().equals(uuid)) {
|
||||
LOG.error(String.format(
|
||||
"Completion callback: UUID does not match! out of sequence? Found: %s, should be %s",
|
||||
GattAttributes.lookup(characteristic.getUuid()), GattAttributes.lookup(uuid)));
|
||||
aapsLogger.error(LTag.PUMPCOMM, String.format(
|
||||
"Completion callback: UUID does not match! out of sequence? Found: %s, should be %s",
|
||||
GattAttributes.lookup(characteristic.getUuid()), GattAttributes.lookup(uuid)));
|
||||
}
|
||||
operationComplete.release();
|
||||
}
|
||||
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPBTCOMM);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,16 +1,14 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattDescriptor;
|
||||
import android.os.SystemClock;
|
||||
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkBLE;
|
||||
|
||||
/**
|
||||
|
@ -18,12 +16,13 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLink
|
|||
*/
|
||||
public class DescriptorWriteOperation extends BLECommOperation {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(DescriptorWriteOperation.class);
|
||||
private final AAPSLogger aapsLogger;
|
||||
|
||||
private BluetoothGattDescriptor descr;
|
||||
|
||||
|
||||
public DescriptorWriteOperation(BluetoothGatt gatt, BluetoothGattDescriptor descr, byte[] value) {
|
||||
public DescriptorWriteOperation(AAPSLogger aapsLogger, BluetoothGatt gatt, BluetoothGattDescriptor descr, byte[] value) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
this.gatt = gatt;
|
||||
this.descr = descr;
|
||||
this.value = value;
|
||||
|
@ -46,14 +45,14 @@ public class DescriptorWriteOperation extends BLECommOperation {
|
|||
boolean didAcquire = operationComplete.tryAcquire(getGattOperationTimeout_ms(), TimeUnit.MILLISECONDS);
|
||||
if (didAcquire) {
|
||||
SystemClock.sleep(1); // This is to allow the IBinder thread to exit before we continue, allowing easier
|
||||
// understanding of the sequence of events.
|
||||
// understanding of the sequence of events.
|
||||
// success
|
||||
} else {
|
||||
LOG.error("Timeout waiting for descriptor write operation to complete");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Timeout waiting for descriptor write operation to complete");
|
||||
timedOut = true;
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
LOG.error("Interrupted while waiting for descriptor write operation to complete");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Interrupted while waiting for descriptor write operation to complete");
|
||||
interrupted = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,14 +2,15 @@ package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data;
|
|||
|
||||
import org.joda.time.LocalDateTime;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.defs.OmnipodCommandType;
|
||||
|
||||
|
||||
/**
|
||||
* Created by andy on 5/19/18.
|
||||
*/
|
||||
|
@ -74,16 +75,16 @@ public class RLHistoryItem {
|
|||
}
|
||||
|
||||
|
||||
public String getDescription() {
|
||||
public String getDescription(ResourceHelper resourceHelper) {
|
||||
|
||||
// TODO extend when we have Omnipod
|
||||
switch (this.source) {
|
||||
case RileyLink:
|
||||
return "State: " + MainApp.gs(serviceState.getResourceId(targetDevice))
|
||||
return "State: " + resourceHelper.gs(serviceState.getResourceId(targetDevice))
|
||||
+ (this.errorCode == null ? "" : ", Error Code: " + errorCode);
|
||||
|
||||
case MedtronicPump:
|
||||
return MainApp.gs(pumpDeviceState.getResourceId());
|
||||
return resourceHelper.gs(pumpDeviceState.getResourceId());
|
||||
|
||||
case MedtronicCommand:
|
||||
return medtronicCommandType.name();
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs;
|
||||
|
||||
public interface RileyLinkPumpDevice {
|
||||
}
|
|
@ -26,12 +26,13 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
|||
public class RileyLinkStatusActivity extends NoSplashAppCompatActivity {
|
||||
|
||||
@Inject ResourceHelper resourceHelper;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
|
||||
TextView connectionStatus;
|
||||
TextView configuredAddress;
|
||||
TextView connectedDevice;
|
||||
TextView connectionError;
|
||||
RileyLinkServiceData rileyLinkServiceData;
|
||||
|
||||
private SectionsPagerAdapter mSectionsPagerAdapter;
|
||||
private FloatingActionButton floatingActionButton;
|
||||
|
@ -76,8 +77,6 @@ public class RileyLinkStatusActivity extends NoSplashAppCompatActivity {
|
|||
this.connectedDevice = findViewById(R.id.rls_t1_connected_device);
|
||||
this.connectionError = findViewById(R.id.rls_t1_connection_error);
|
||||
|
||||
rileyLinkServiceData = RileyLinkUtil.getRileyLinkServiceData();
|
||||
|
||||
// // 7-12
|
||||
// int[] ids = {R.id.rls_t1_tv02, R.id.rls_t1_tv03, R.id.rls_t1_tv04, R.id.rls_t1_tv05, R.id.rls_t1_tv07, //
|
||||
// R.id.rls_t1_tv08, R.id.rls_t1_tv09, R.id.rls_t1_tv10, R.id.rls_t1_tv11, R.id.rls_t1_tv12};
|
||||
|
@ -97,12 +96,12 @@ public class RileyLinkStatusActivity extends NoSplashAppCompatActivity {
|
|||
public void refreshData(int position) {
|
||||
if (position == 0) {
|
||||
// FIXME i18n
|
||||
this.connectionStatus.setText(rileyLinkServiceData.serviceState.name());
|
||||
this.connectionStatus.setText(rileyLinkServiceData.rileyLinkServiceState.name());
|
||||
this.configuredAddress.setText(rileyLinkServiceData.rileylinkAddress);
|
||||
// FIXME
|
||||
this.connectedDevice.setText("???");
|
||||
// FIXME i18n
|
||||
this.connectionError.setText(rileyLinkServiceData.errorCode.name());
|
||||
this.connectionError.setText(rileyLinkServiceData.rileyLinkError.name());
|
||||
} else {
|
||||
|
||||
}
|
||||
|
@ -114,8 +113,8 @@ public class RileyLinkStatusActivity extends NoSplashAppCompatActivity {
|
|||
|
||||
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
|
||||
|
||||
mSectionsPagerAdapter.addFragment(new RileyLinkStatusGeneral(), resourceHelper.gs(R.string.rileylink_settings_tab1));
|
||||
mSectionsPagerAdapter.addFragment(new RileyLinkStatusHistory(), resourceHelper.gs(R.string.rileylink_settings_tab2));
|
||||
mSectionsPagerAdapter.addFragment(new RileyLinkStatusGeneralFragment(), resourceHelper.gs(R.string.rileylink_settings_tab1));
|
||||
mSectionsPagerAdapter.addFragment(new RileyLinkStatusHistoryFragment(), resourceHelper.gs(R.string.rileylink_settings_tab2));
|
||||
//mSectionsPagerAdapter.addFragment(new RileyLinkStatusDevice(), "Medtronic");
|
||||
|
||||
mViewPager.setAdapter(mSectionsPagerAdapter);
|
||||
|
|
|
@ -6,32 +6,38 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import org.joda.time.LocalDateTime;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.support.DaggerFragment;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.dialog.RefreshableInterface;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.driver.OmnipodPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodUtil;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
|
||||
/**
|
||||
* Created by andy on 5/19/18.
|
||||
*/
|
||||
|
||||
public class RileyLinkStatusGeneral extends Fragment implements RefreshableInterface {
|
||||
public class RileyLinkStatusGeneralFragment extends DaggerFragment implements RefreshableInterface {
|
||||
|
||||
// TODO fix this is not correct
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
@Inject MedtronicUtil medtronicUtil;
|
||||
@Inject MedtronicPumpStatus medtronicPumpStatus;
|
||||
@Inject ResourceHelper resourceHelper;
|
||||
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
|
||||
TextView connectionStatus;
|
||||
TextView configuredAddress;
|
||||
|
@ -98,18 +104,15 @@ public class RileyLinkStatusGeneral extends Fragment implements RefreshableInter
|
|||
|
||||
public void refreshData() {
|
||||
|
||||
RileyLinkTargetDevice targetDevice = RileyLinkUtil.getTargetDevice();
|
||||
RileyLinkTargetDevice targetDevice = rileyLinkServiceData.targetDevice;
|
||||
|
||||
if (RileyLinkUtil.getServiceState() == null)
|
||||
this.connectionStatus.setText(MainApp.gs(RileyLinkServiceState.NotStarted.getResourceId(targetDevice)));
|
||||
else
|
||||
this.connectionStatus.setText(MainApp.gs(RileyLinkUtil.getServiceState().getResourceId(targetDevice)));
|
||||
this.connectionStatus.setText(resourceHelper.gs(rileyLinkServiceData.rileyLinkServiceState.getResourceId(targetDevice)));
|
||||
|
||||
if (rileyLinkServiceData != null) {
|
||||
this.configuredAddress.setText(rileyLinkServiceData.rileylinkAddress);
|
||||
this.connectionError.setText(rileyLinkServiceData.errorCode == null ? //
|
||||
this.connectionError.setText(rileyLinkServiceData.rileyLinkError == null ? //
|
||||
"-"
|
||||
: MainApp.gs(rileyLinkServiceData.errorCode.getResourceId(targetDevice)));
|
||||
: resourceHelper.gs(rileyLinkServiceData.rileyLinkError.getResourceId(targetDevice)));
|
||||
|
||||
|
||||
RileyLinkFirmwareVersion firmwareVersion = rileyLinkServiceData.versionCC110;
|
||||
|
@ -123,31 +126,31 @@ public class RileyLinkStatusGeneral extends Fragment implements RefreshableInter
|
|||
|
||||
}
|
||||
|
||||
if (MedtronicUtil.isMedtronicPump()) {
|
||||
// TODO add handling for Omnipod pump status
|
||||
// TODO refactor this Omnipod
|
||||
|
||||
this.medtronicPumpStatus = MedtronicUtil.getPumpStatus();
|
||||
if (medtronicPumpStatus != null) {
|
||||
this.deviceType.setText(resourceHelper.gs(RileyLinkTargetDevice.MedtronicPump.getResourceId()));
|
||||
this.deviceModel.setText(medtronicPumpPlugin.getPumpDescription().pumpType.getDescription());
|
||||
this.serialNumber.setText(medtronicPumpStatus.serialNumber);
|
||||
this.pumpFrequency.setText(resourceHelper.gs(medtronicPumpStatus.pumpFrequency.equals("medtronic_pump_frequency_us_ca") ? R.string.medtronic_pump_frequency_us_ca : R.string.medtronic_pump_frequency_worldwide));
|
||||
|
||||
if (medtronicPumpStatus != null) {
|
||||
this.deviceType.setText(MainApp.gs(RileyLinkTargetDevice.MedtronicPump.getResourceId()));
|
||||
this.deviceModel.setText(medtronicPumpStatus.pumpType.getDescription());
|
||||
this.serialNumber.setText(medtronicPumpStatus.serialNumber);
|
||||
this.pumpFrequency.setText(MainApp.gs(medtronicPumpStatus.pumpFrequency.equals("medtronic_pump_frequency_us_ca") ? R.string.medtronic_pump_frequency_us_ca : R.string.medtronic_pump_frequency_worldwide));
|
||||
// TODO extend when Omnipod used
|
||||
|
||||
if (MedtronicUtil.getMedtronicPumpModel() != null)
|
||||
this.connectedDevice.setText("Medtronic " + MedtronicUtil.getMedtronicPumpModel().getPumpModel());
|
||||
else
|
||||
this.connectedDevice.setText("???");
|
||||
if (medtronicUtil.getMedtronicPumpModel() != null)
|
||||
this.connectedDevice.setText("Medtronic " + medtronicUtil.getMedtronicPumpModel().getPumpModel());
|
||||
else
|
||||
this.connectedDevice.setText("???");
|
||||
|
||||
if (rileyLinkServiceData.lastGoodFrequency != null)
|
||||
this.lastUsedFrequency.setText(String.format(Locale.ENGLISH, "%.2f MHz",
|
||||
rileyLinkServiceData.lastGoodFrequency));
|
||||
if (rileyLinkServiceData.lastGoodFrequency != null)
|
||||
this.lastUsedFrequency.setText(String.format(Locale.ENGLISH, "%.2f MHz",
|
||||
rileyLinkServiceData.lastGoodFrequency));
|
||||
|
||||
if (medtronicPumpStatus.lastConnection != 0)
|
||||
this.lastDeviceContact.setText(StringUtil.toDateTimeString(new LocalDateTime(
|
||||
medtronicPumpStatus.lastDataTime)));
|
||||
else
|
||||
this.lastDeviceContact.setText(MainApp.gs(R.string.common_never));
|
||||
}
|
||||
if (medtronicPumpStatus.lastConnection != 0)
|
||||
this.lastDeviceContact.setText(StringUtil.toDateTimeString(new LocalDateTime(
|
||||
medtronicPumpStatus.lastDataTime)));
|
||||
else
|
||||
this.lastDeviceContact.setText("Never");
|
||||
} else {
|
||||
|
||||
// if (OmnipodUtil.isOmnipodDash())
|
|
@ -1,33 +1,39 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import android.os.Bundle;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.support.DaggerFragment;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.pump.common.dialog.RefreshableInterface;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.utils.DateUtil;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
|
||||
/**
|
||||
* Created by andy on 5/19/18.
|
||||
*/
|
||||
|
||||
public class RileyLinkStatusHistory extends Fragment implements RefreshableInterface {
|
||||
public class RileyLinkStatusHistoryFragment extends DaggerFragment implements RefreshableInterface {
|
||||
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
@Inject ResourceHelper resourceHelper;
|
||||
|
||||
RecyclerView recyclerView;
|
||||
RecyclerViewAdapter recyclerViewAdapter;
|
||||
|
@ -40,10 +46,10 @@ public class RileyLinkStatusHistory extends Fragment implements RefreshableInter
|
|||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View rootView = inflater.inflate(R.layout.rileylink_status_history, container, false);
|
||||
|
||||
recyclerView = (RecyclerView)rootView.findViewById(R.id.rileylink_history_list);
|
||||
recyclerView = (RecyclerView) rootView.findViewById(R.id.rileylink_history_list);
|
||||
|
||||
recyclerView.setHasFixedSize(true);
|
||||
llm = new LinearLayoutManager(getActivity().getApplicationContext());
|
||||
llm = new LinearLayoutManager(rootView.getContext());
|
||||
recyclerView.setLayoutManager(llm);
|
||||
|
||||
recyclerViewAdapter = new RecyclerViewAdapter(filteredHistoryList);
|
||||
|
@ -63,13 +69,13 @@ public class RileyLinkStatusHistory extends Fragment implements RefreshableInter
|
|||
|
||||
@Override
|
||||
public void refreshData() {
|
||||
if (RileyLinkUtil.getRileyLinkHistory()!=null) {
|
||||
recyclerViewAdapter.addItemsAndClean(RileyLinkUtil.getRileyLinkHistory());
|
||||
if (rileyLinkUtil.getRileyLinkHistory() != null) {
|
||||
recyclerViewAdapter.addItemsAndClean(rileyLinkUtil.getRileyLinkHistory());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.HistoryViewHolder> {
|
||||
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.HistoryViewHolder> {
|
||||
|
||||
List<RLHistoryItem> historyList;
|
||||
|
||||
|
@ -104,11 +110,11 @@ public class RileyLinkStatusHistory extends Fragment implements RefreshableInter
|
|||
|
||||
PumpDeviceState pumpState = item.getPumpDeviceState();
|
||||
|
||||
if ((pumpState != null) && //
|
||||
(pumpState == PumpDeviceState.Sleeping || //
|
||||
//
|
||||
if ((pumpState == PumpDeviceState.Sleeping || //
|
||||
pumpState == PumpDeviceState.Active || //
|
||||
pumpState == PumpDeviceState.WakingUp //
|
||||
))
|
||||
pumpState == PumpDeviceState.WakingUp //
|
||||
))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
@ -120,7 +126,7 @@ public class RileyLinkStatusHistory extends Fragment implements RefreshableInter
|
|||
@Override
|
||||
public RecyclerViewAdapter.HistoryViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
|
||||
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.rileylink_status_history_item, //
|
||||
viewGroup, false);
|
||||
viewGroup, false);
|
||||
return new RecyclerViewAdapter.HistoryViewHolder(v);
|
||||
}
|
||||
|
||||
|
@ -132,7 +138,7 @@ public class RileyLinkStatusHistory extends Fragment implements RefreshableInter
|
|||
if (item != null) {
|
||||
holder.timeView.setText(DateUtil.dateAndTimeAndSecondsString(item.getDateTime().toDateTime().getMillis()));
|
||||
holder.typeView.setText(item.getSource().getDesc());
|
||||
holder.valueView.setText(item.getDescription());
|
||||
holder.valueView.setText(item.getDescription(resourceHelper));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -148,7 +154,7 @@ public class RileyLinkStatusHistory extends Fragment implements RefreshableInter
|
|||
super.onAttachedToRecyclerView(recyclerView);
|
||||
}
|
||||
|
||||
static class HistoryViewHolder extends RecyclerView.ViewHolder {
|
||||
class HistoryViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
TextView timeView;
|
||||
TextView typeView;
|
||||
|
@ -158,9 +164,9 @@ public class RileyLinkStatusHistory extends Fragment implements RefreshableInter
|
|||
HistoryViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
|
||||
timeView = (TextView)itemView.findViewById(R.id.rileylink_history_time);
|
||||
typeView = (TextView)itemView.findViewById(R.id.rileylink_history_source);
|
||||
valueView = (TextView)itemView.findViewById(R.id.rileylink_history_description);
|
||||
timeView = (TextView) itemView.findViewById(R.id.rileylink_history_time);
|
||||
typeView = (TextView) itemView.findViewById(R.id.rileylink_history_source);
|
||||
valueView = (TextView) itemView.findViewById(R.id.rileylink_history_description);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service
|
||||
|
||||
import android.bluetooth.BluetoothAdapter
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
|
@ -15,6 +14,7 @@ import javax.inject.Inject
|
|||
class RileyLinkBluetoothStateReceiver : DaggerBroadcastReceiver() {
|
||||
@Inject lateinit var aapsLogger: AAPSLogger
|
||||
@Inject lateinit var activePlugin: ActivePluginProvider
|
||||
@Inject lateinit var rileyLinkUtil: RileyLinkUtil
|
||||
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
super.onReceive(context, intent)
|
||||
|
@ -27,7 +27,7 @@ class RileyLinkBluetoothStateReceiver : DaggerBroadcastReceiver() {
|
|||
|
||||
BluetoothAdapter.STATE_ON -> {
|
||||
aapsLogger.debug("RileyLinkBluetoothStateReceiver: Bluetooth back on. Sending broadcast to RileyLink Framework")
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.BluetoothReconnected)
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.BluetoothReconnected, context)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,24 +5,24 @@ package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service;
|
|||
*/
|
||||
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.DaggerBroadcastReceiver;
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
|
@ -31,26 +31,27 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTask;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.WakeAndTuneTask;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
|
||||
/**
|
||||
* I added this class outside of RileyLinkService, because for now it's very important part of RL framework and
|
||||
* where we get a lot of problems. Especially merging between AAPS and RileyLinkAAPS. I might put it back at
|
||||
* later time
|
||||
*/
|
||||
public class RileyLinkBroadcastReceiver extends BroadcastReceiver {
|
||||
public class RileyLinkBroadcastReceiver extends DaggerBroadcastReceiver {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
@Inject HasAndroidInjector injector;
|
||||
@Inject SP sp;
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject ServiceTaskExecutor serviceTaskExecutor;
|
||||
|
||||
RileyLinkService serviceInstance;
|
||||
protected Map<String, List<String>> broadcastIdentifiers = null;
|
||||
String deviceSpecificPrefix;
|
||||
Context context;
|
||||
|
||||
|
||||
public RileyLinkBroadcastReceiver(RileyLinkService serviceInstance, Context context) {
|
||||
public RileyLinkBroadcastReceiver(RileyLinkService serviceInstance) {
|
||||
this.serviceInstance = serviceInstance;
|
||||
this.context = context;
|
||||
|
||||
createBroadcastIdentifiers();
|
||||
}
|
||||
|
@ -88,31 +89,31 @@ public class RileyLinkBroadcastReceiver extends BroadcastReceiver {
|
|||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
super.onReceive(context, intent);
|
||||
|
||||
if (intent == null) {
|
||||
LOG.error("onReceive: received null intent");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "onReceive: received null intent");
|
||||
} else {
|
||||
String action = intent.getAction();
|
||||
if (action == null) {
|
||||
LOG.error("onReceive: null action");
|
||||
aapsLogger.error("onReceive: null action");
|
||||
} else {
|
||||
if (isLoggingEnabled())
|
||||
LOG.debug("Received Broadcast: " + action);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Received Broadcast: " + action);
|
||||
|
||||
if (!processBluetoothBroadcasts(action) && //
|
||||
!processRileyLinkBroadcasts(action) && //
|
||||
!processRileyLinkBroadcasts(action, context) && //
|
||||
!processTuneUpBroadcasts(action) && //
|
||||
!processDeviceSpecificBroadcasts(action, intent) && //
|
||||
!processApplicationSpecificBroadcasts(action, intent) //
|
||||
) {
|
||||
LOG.error("Unhandled broadcast: action=" + action);
|
||||
aapsLogger.error(LTag.PUMPCOMM, "Unhandled broadcast: action=" + action);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void registerBroadcasts() {
|
||||
public void registerBroadcasts(Context context) {
|
||||
|
||||
IntentFilter intentFilter = new IntentFilter();
|
||||
|
||||
|
@ -131,61 +132,55 @@ public class RileyLinkBroadcastReceiver extends BroadcastReceiver {
|
|||
}
|
||||
|
||||
|
||||
private boolean processRileyLinkBroadcasts(String action) {
|
||||
private boolean processRileyLinkBroadcasts(String action, Context context) {
|
||||
|
||||
if (action.equals(RileyLinkConst.Intents.RileyLinkDisconnected)) {
|
||||
if (BluetoothAdapter.getDefaultAdapter().isEnabled()) {
|
||||
RileyLinkUtil
|
||||
.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.RileyLinkUnreachable);
|
||||
rileyLinkServiceData.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.RileyLinkUnreachable);
|
||||
} else {
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.BluetoothDisabled);
|
||||
rileyLinkServiceData.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.BluetoothDisabled);
|
||||
}
|
||||
|
||||
return true;
|
||||
} else if (action.equals(RileyLinkConst.Intents.RileyLinkReady)) {
|
||||
|
||||
if (isLoggingEnabled())
|
||||
LOG.warn("MedtronicConst.Intents.RileyLinkReady");
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "MedtronicConst.Intents.RileyLinkReady");
|
||||
// sendIPCNotification(RT2Const.IPC.MSG_note_WakingPump);
|
||||
|
||||
if (this.serviceInstance.rileyLinkBLE == null)
|
||||
return false;
|
||||
serviceInstance.rileyLinkBLE.enableNotifications();
|
||||
serviceInstance.rfspy.startReader(); // call startReader from outside?
|
||||
|
||||
this.serviceInstance.rileyLinkBLE.enableNotifications();
|
||||
this.serviceInstance.rfspy.startReader(); // call startReader from outside?
|
||||
|
||||
this.serviceInstance.rfspy.initializeRileyLink();
|
||||
String bleVersion = this.serviceInstance.rfspy.getBLEVersionCached();
|
||||
RileyLinkFirmwareVersion rlVersion = this.serviceInstance.rfspy.getRLVersionCached();
|
||||
serviceInstance.rfspy.initializeRileyLink();
|
||||
String bleVersion = serviceInstance.rfspy.getBLEVersionCached();
|
||||
RileyLinkFirmwareVersion rlVersion = rileyLinkServiceData.firmwareVersion;
|
||||
|
||||
// if (isLoggingEnabled())
|
||||
LOG.debug("RfSpy version (BLE113): " + bleVersion);
|
||||
this.serviceInstance.rileyLinkServiceData.versionBLE113 = bleVersion;
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "RfSpy version (BLE113): " + bleVersion);
|
||||
serviceInstance.rileyLinkServiceData.versionBLE113 = bleVersion;
|
||||
|
||||
// if (isLoggingEnabled())
|
||||
LOG.debug("RfSpy Radio version (CC110): " + rlVersion.name());
|
||||
this.serviceInstance.rileyLinkServiceData.versionCC110 = rlVersion;
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "RfSpy Radio version (CC110): " + rlVersion.name());
|
||||
serviceInstance.rileyLinkServiceData.versionCC110 = rlVersion;
|
||||
|
||||
ServiceTask task = new InitializePumpManagerTask(RileyLinkUtil.getTargetDevice());
|
||||
ServiceTaskExecutor.startTask(task);
|
||||
if (isLoggingEnabled())
|
||||
LOG.info("Announcing RileyLink open For business");
|
||||
ServiceTask task = new InitializePumpManagerTask(injector, context);
|
||||
serviceTaskExecutor.startTask(task);
|
||||
aapsLogger.info(LTag.PUMPCOMM, "Announcing RileyLink open For business");
|
||||
|
||||
return true;
|
||||
} else if (action.equals(RileyLinkConst.Intents.RileyLinkNewAddressSet)) {
|
||||
String RileylinkBLEAddress = SP.getString(RileyLinkConst.Prefs.RileyLinkAddress, "");
|
||||
String RileylinkBLEAddress = sp.getString(RileyLinkConst.Prefs.RileyLinkAddress, "");
|
||||
if (RileylinkBLEAddress.equals("")) {
|
||||
LOG.error("No Rileylink BLE Address saved in app");
|
||||
aapsLogger.error("No Rileylink BLE Address saved in app");
|
||||
} else {
|
||||
// showBusy("Configuring Service", 50);
|
||||
// rileyLinkBLE.findRileyLink(RileylinkBLEAddress);
|
||||
this.serviceInstance.reconfigureRileyLink(RileylinkBLEAddress);
|
||||
serviceInstance.reconfigureRileyLink(RileylinkBLEAddress);
|
||||
// MainApp.getServiceClientConnection().setThisRileylink(RileylinkBLEAddress);
|
||||
}
|
||||
|
||||
return true;
|
||||
} else if (action.equals(RileyLinkConst.Intents.RileyLinkDisconnect)) {
|
||||
this.serviceInstance.disconnectRileyLink();
|
||||
serviceInstance.disconnectRileyLink();
|
||||
|
||||
return true;
|
||||
} else {
|
||||
|
@ -198,18 +193,16 @@ public class RileyLinkBroadcastReceiver extends BroadcastReceiver {
|
|||
public boolean processBluetoothBroadcasts(String action) {
|
||||
|
||||
if (action.equals(RileyLinkConst.Intents.BluetoothConnected)) {
|
||||
if (isLoggingEnabled())
|
||||
LOG.debug("Bluetooth - Connected");
|
||||
ServiceTaskExecutor.startTask(new DiscoverGattServicesTask());
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Bluetooth - Connected");
|
||||
serviceTaskExecutor.startTask(new DiscoverGattServicesTask(injector));
|
||||
|
||||
return true;
|
||||
|
||||
} else if (action.equals(RileyLinkConst.Intents.BluetoothReconnected)) {
|
||||
if (isLoggingEnabled())
|
||||
LOG.debug("Bluetooth - Reconnecting");
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Bluetooth - Reconnecting");
|
||||
|
||||
serviceInstance.bluetoothInit();
|
||||
ServiceTaskExecutor.startTask(new DiscoverGattServicesTask(true));
|
||||
serviceTaskExecutor.startTask(new DiscoverGattServicesTask(injector, true));
|
||||
|
||||
return true;
|
||||
} else {
|
||||
|
@ -224,7 +217,7 @@ public class RileyLinkBroadcastReceiver extends BroadcastReceiver {
|
|||
|
||||
if (this.broadcastIdentifiers.get("TuneUp").contains(action)) {
|
||||
if (serviceInstance.getRileyLinkTargetDevice().isTuneUpEnabled()) {
|
||||
ServiceTaskExecutor.startTask(new WakeAndTuneTask());
|
||||
serviceTaskExecutor.startTask(new WakeAndTuneTask(injector));
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
|
@ -240,7 +233,7 @@ public class RileyLinkBroadcastReceiver extends BroadcastReceiver {
|
|||
}
|
||||
|
||||
if (action.startsWith(this.deviceSpecificPrefix)) {
|
||||
return this.serviceInstance.handleDeviceSpecificBroadcasts(intent);
|
||||
return serviceInstance.handleDeviceSpecificBroadcasts(intent);
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
@ -250,12 +243,7 @@ public class RileyLinkBroadcastReceiver extends BroadcastReceiver {
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
public boolean isLoggingEnabled() {
|
||||
return (L.isEnabled(L.PUMPCOMM));
|
||||
}
|
||||
|
||||
public void unregisterBroadcasts() {
|
||||
public void unregisterBroadcasts(Context context) {
|
||||
LocalBroadcastManager.getInstance(context).unregisterReceiver(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,11 +5,14 @@ import android.content.Context;
|
|||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.DaggerService;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
|
@ -22,11 +25,10 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLin
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceResult;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceTransport;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
|
||||
import static info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil.getRileyLinkCommunicationManager;
|
||||
|
||||
/**
|
||||
* Created by andy on 5/6/18.
|
||||
* Split from original file and renamed.
|
||||
|
@ -36,26 +38,28 @@ public abstract class RileyLinkService extends DaggerService {
|
|||
@Inject protected AAPSLogger aapsLogger;
|
||||
@Inject protected SP sp;
|
||||
@Inject protected Context context;
|
||||
@Inject protected RxBusWrapper rxBus;
|
||||
@Inject protected RileyLinkUtil rileyLinkUtil;
|
||||
@Inject protected MedtronicUtil medtronicUtil; // TODO should be avoided here as it's MDT
|
||||
@Inject protected RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject protected MedtronicPumpStatus medtronicPumpStatus;
|
||||
|
||||
|
||||
public RileyLinkBLE rileyLinkBLE; // android-bluetooth management
|
||||
@NotNull protected RileyLinkBLE rileyLinkBLE; // android-bluetooth management, must be set in initRileyLinkServiceData
|
||||
protected BluetoothAdapter bluetoothAdapter;
|
||||
protected RFSpy rfspy; // interface for RL xxx Mhz radio.
|
||||
protected RileyLinkBroadcastReceiver mBroadcastReceiver;
|
||||
protected RileyLinkServiceData rileyLinkServiceData;
|
||||
protected RileyLinkBluetoothStateReceiver bluetoothStateReceiver;
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
RileyLinkUtil.setContext(this.context);
|
||||
RileyLinkUtil.setRileyLinkService(this);
|
||||
RileyLinkUtil.setEncoding(getEncoding());
|
||||
rileyLinkUtil.setEncoding(getEncoding());
|
||||
initRileyLinkServiceData();
|
||||
|
||||
mBroadcastReceiver = new RileyLinkBroadcastReceiver(this, this.context);
|
||||
mBroadcastReceiver.registerBroadcasts();
|
||||
mBroadcastReceiver = new RileyLinkBroadcastReceiver(this);
|
||||
mBroadcastReceiver.registerBroadcasts(this);
|
||||
|
||||
|
||||
bluetoothStateReceiver = new RileyLinkBluetoothStateReceiver();
|
||||
|
@ -93,13 +97,10 @@ public abstract class RileyLinkService extends DaggerService {
|
|||
super.onDestroy();
|
||||
//LOG.error("I die! I die!");
|
||||
|
||||
if (rileyLinkBLE != null) {
|
||||
rileyLinkBLE.disconnect(); // dispose of Gatt (disconnect and close)
|
||||
rileyLinkBLE = null;
|
||||
}
|
||||
rileyLinkBLE.disconnect(); // dispose of Gatt (disconnect and close)
|
||||
|
||||
if (mBroadcastReceiver != null) {
|
||||
mBroadcastReceiver.unregisterBroadcasts();
|
||||
mBroadcastReceiver.unregisterBroadcasts(this);
|
||||
}
|
||||
|
||||
if (bluetoothStateReceiver != null) {
|
||||
|
@ -126,32 +127,30 @@ public abstract class RileyLinkService extends DaggerService {
|
|||
|
||||
public abstract RileyLinkCommunicationManager getDeviceCommunicationManager();
|
||||
|
||||
|
||||
// Here is where the wake-lock begins:
|
||||
// We've received a service startCommand, we grab the lock.
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
RileyLinkUtil.setContext(getApplicationContext());
|
||||
return (START_STICKY);
|
||||
}
|
||||
|
||||
|
||||
public boolean bluetoothInit() {
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "bluetoothInit: attempting to get an adapter");
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.BluetoothInitializing);
|
||||
rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.BluetoothInitializing);
|
||||
|
||||
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
|
||||
|
||||
if (bluetoothAdapter == null) {
|
||||
aapsLogger.error("Unable to obtain a BluetoothAdapter.");
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.NoBluetoothAdapter);
|
||||
rileyLinkServiceData.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.NoBluetoothAdapter);
|
||||
} else {
|
||||
|
||||
if (!bluetoothAdapter.isEnabled()) {
|
||||
aapsLogger.error("Bluetooth is not enabled.");
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.BluetoothDisabled);
|
||||
rileyLinkServiceData.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.BluetoothDisabled);
|
||||
} else {
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.BluetoothReady);
|
||||
rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.BluetoothReady);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -163,12 +162,7 @@ public abstract class RileyLinkService extends DaggerService {
|
|||
// returns true if our Rileylink configuration changed
|
||||
public boolean reconfigureRileyLink(String deviceAddress) {
|
||||
|
||||
if (rileyLinkBLE == null) {
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.BluetoothInitializing);
|
||||
return false;
|
||||
}
|
||||
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.RileyLinkInitializing);
|
||||
rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.RileyLinkInitializing);
|
||||
|
||||
if (rileyLinkBLE.isConnected()) {
|
||||
if (deviceAddress.equals(rileyLinkServiceData.rileylinkAddress)) {
|
||||
|
@ -189,10 +183,10 @@ public abstract class RileyLinkService extends DaggerService {
|
|||
} else {
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Using RL " + deviceAddress);
|
||||
|
||||
if (RileyLinkUtil.getServiceState() == RileyLinkServiceState.NotStarted) {
|
||||
if (rileyLinkServiceData.getRileyLinkServiceState() == RileyLinkServiceState.NotStarted) {
|
||||
if (!bluetoothInit()) {
|
||||
aapsLogger.error("RileyLink can't get activated, Bluetooth is not functioning correctly. {}",
|
||||
RileyLinkUtil.getError() != null ? RileyLinkUtil.getError().name() : "Unknown error (null)");
|
||||
getError() != null ? getError().name() : "Unknown error (null)");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -211,8 +205,8 @@ public abstract class RileyLinkService extends DaggerService {
|
|||
// FIXME: This needs to be run in a session so that is interruptable, has a separate thread, etc.
|
||||
public void doTuneUpDevice() {
|
||||
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.TuneUpDevice);
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.TuneUpDevice);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
|
||||
double lastGoodFrequency = 0.0d;
|
||||
|
||||
|
@ -236,25 +230,27 @@ public abstract class RileyLinkService extends DaggerService {
|
|||
|
||||
if (newFrequency == 0.0d) {
|
||||
// error tuning pump, pump not present ??
|
||||
RileyLinkUtil
|
||||
.setServiceState(RileyLinkServiceState.PumpConnectorError, RileyLinkError.TuneUpOfDeviceFailed);
|
||||
rileyLinkServiceData.setServiceState(RileyLinkServiceState.PumpConnectorError, RileyLinkError.TuneUpOfDeviceFailed);
|
||||
} else {
|
||||
getRileyLinkCommunicationManager().clearNotConnectedCount();
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.PumpConnectorReady);
|
||||
getDeviceCommunicationManager().clearNotConnectedCount();
|
||||
rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.PumpConnectorReady);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void disconnectRileyLink() {
|
||||
|
||||
if (this.rileyLinkBLE != null && this.rileyLinkBLE.isConnected()) {
|
||||
this.rileyLinkBLE.disconnect();
|
||||
if (rileyLinkBLE.isConnected()) {
|
||||
rileyLinkBLE.disconnect();
|
||||
rileyLinkServiceData.rileylinkAddress = null;
|
||||
}
|
||||
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.BluetoothReady);
|
||||
rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.BluetoothReady);
|
||||
}
|
||||
|
||||
@NotNull public RileyLinkBLE getRileyLinkBLE() {
|
||||
return rileyLinkBLE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Target Device for Service
|
||||
|
@ -269,4 +265,11 @@ public abstract class RileyLinkService extends DaggerService {
|
|||
rfspy.setRileyLinkEncoding(encodingType);
|
||||
}
|
||||
}
|
||||
|
||||
public RileyLinkError getError() {
|
||||
if (rileyLinkServiceData != null)
|
||||
return rileyLinkServiceData.rileyLinkError;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,21 +1,39 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventMedtronicDeviceStatusChange;
|
||||
|
||||
/**
|
||||
* Created by andy on 16/05/2018.
|
||||
*/
|
||||
|
||||
@Singleton
|
||||
public class RileyLinkServiceData {
|
||||
|
||||
public boolean tuneUpDone = false;
|
||||
public RileyLinkError errorCode;
|
||||
public RileyLinkServiceState serviceState = RileyLinkServiceState.NotStarted;
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
@Inject RxBusWrapper rxBus;
|
||||
|
||||
boolean tuneUpDone = false;
|
||||
public RileyLinkError rileyLinkError;
|
||||
public RileyLinkServiceState rileyLinkServiceState = RileyLinkServiceState.NotStarted;
|
||||
public RileyLinkFirmwareVersion firmwareVersion;
|
||||
public RileyLinkTargetFrequency rileyLinkTargetFrequency;
|
||||
|
||||
public String rileylinkAddress;
|
||||
public long lastTuneUpTime = 0L;
|
||||
long lastTuneUpTime = 0L;
|
||||
public Double lastGoodFrequency;
|
||||
|
||||
// bt version
|
||||
|
@ -29,15 +47,45 @@ public class RileyLinkServiceData {
|
|||
public String pumpID;
|
||||
public byte[] pumpIDBytes;
|
||||
|
||||
|
||||
public RileyLinkServiceData(RileyLinkTargetDevice targetDevice) {
|
||||
this.targetDevice = targetDevice;
|
||||
}
|
||||
|
||||
@Inject
|
||||
public RileyLinkServiceData() {}
|
||||
|
||||
public void setPumpID(String pumpId, byte[] pumpIdBytes) {
|
||||
this.pumpID = pumpId;
|
||||
this.pumpIDBytes = pumpIdBytes;
|
||||
}
|
||||
|
||||
public void setRileyLinkServiceState(RileyLinkServiceState newState) {
|
||||
setServiceState(newState, null);
|
||||
}
|
||||
|
||||
public RileyLinkServiceState getRileyLinkServiceState() {
|
||||
return workWithServiceState(null, null, false);
|
||||
}
|
||||
|
||||
|
||||
public void setServiceState(RileyLinkServiceState newState, RileyLinkError errorCode) {
|
||||
workWithServiceState(newState, errorCode, true);
|
||||
}
|
||||
|
||||
|
||||
private synchronized RileyLinkServiceState workWithServiceState(RileyLinkServiceState newState, RileyLinkError errorCode, boolean set) {
|
||||
|
||||
if (set) {
|
||||
|
||||
rileyLinkServiceState = newState;
|
||||
this.rileyLinkError = errorCode;
|
||||
|
||||
aapsLogger.info(LTag.PUMP, "RileyLink State Changed: {} {}", newState, errorCode == null ? "" : " - Error State: " + errorCode.name());
|
||||
|
||||
rileyLinkUtil.getRileyLinkHistory().add(new RLHistoryItem(rileyLinkServiceState, errorCode, targetDevice));
|
||||
rxBus.send(new EventMedtronicDeviceStatusChange(newState, errorCode));
|
||||
return null;
|
||||
|
||||
} else {
|
||||
return rileyLinkServiceState;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,20 +1,28 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
|
||||
/**
|
||||
* Created by geoff on 7/9/16.
|
||||
*/
|
||||
public class DiscoverGattServicesTask extends ServiceTask {
|
||||
|
||||
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
|
||||
|
||||
public boolean needToConnect = false;
|
||||
|
||||
|
||||
public DiscoverGattServicesTask() {
|
||||
public DiscoverGattServicesTask(HasAndroidInjector injector) {
|
||||
super(injector);
|
||||
}
|
||||
|
||||
|
||||
public DiscoverGattServicesTask(boolean needToConnect) {
|
||||
public DiscoverGattServicesTask(HasAndroidInjector injector, boolean needToConnect) {
|
||||
super(injector);
|
||||
this.needToConnect = needToConnect;
|
||||
}
|
||||
|
||||
|
@ -23,8 +31,8 @@ public class DiscoverGattServicesTask extends ServiceTask {
|
|||
public void run() {
|
||||
|
||||
if (needToConnect)
|
||||
RileyLinkUtil.getRileyLinkBLE().connectGatt();
|
||||
medtronicPumpPlugin.getRileyLinkService().getRileyLinkBLE().connectGatt();
|
||||
|
||||
RileyLinkUtil.getRileyLinkBLE().discoverServices();
|
||||
medtronicPumpPlugin.getRileyLinkService().getRileyLinkBLE().discoverServices();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks;
|
||||
|
||||
import android.util.Log;
|
||||
import android.content.Context;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.PumpPluginAbstract;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceTransport;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicConst;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
|
||||
/**
|
||||
* Created by geoff on 7/9/16.
|
||||
|
@ -25,67 +25,71 @@ import info.nightscout.androidaps.utils.SP;
|
|||
*/
|
||||
public class InitializePumpManagerTask extends ServiceTask {
|
||||
|
||||
private static final String TAG = "InitPumpManagerTask";
|
||||
private RileyLinkTargetDevice targetDevice;
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject ActivePluginProvider activePlugin;
|
||||
@Inject SP sp;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
|
||||
public InitializePumpManagerTask(RileyLinkTargetDevice targetDevice) {
|
||||
super();
|
||||
this.targetDevice = targetDevice;
|
||||
private final Context context;
|
||||
|
||||
public InitializePumpManagerTask(HasAndroidInjector injector, Context context) {
|
||||
super(injector);
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
|
||||
public InitializePumpManagerTask(ServiceTransport transport) {
|
||||
super(transport);
|
||||
public InitializePumpManagerTask(HasAndroidInjector injector, Context context, ServiceTransport transport) {
|
||||
super(injector, transport);
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
double lastGoodFrequency = 0.0d;
|
||||
double lastGoodFrequency;
|
||||
|
||||
if (RileyLinkUtil.getRileyLinkServiceData().lastGoodFrequency == null) {
|
||||
if (rileyLinkServiceData.lastGoodFrequency == null) {
|
||||
|
||||
lastGoodFrequency = SP.getDouble(RileyLinkConst.Prefs.LastGoodDeviceFrequency, 0.0d);
|
||||
lastGoodFrequency = sp.getDouble(RileyLinkConst.Prefs.LastGoodDeviceFrequency, 0.0d);
|
||||
lastGoodFrequency = Math.round(lastGoodFrequency * 1000d) / 1000d;
|
||||
|
||||
RileyLinkUtil.getRileyLinkServiceData().lastGoodFrequency = lastGoodFrequency;
|
||||
rileyLinkServiceData.lastGoodFrequency = lastGoodFrequency;
|
||||
|
||||
// if (RileyLinkUtil.getRileyLinkTargetFrequency() == null) {
|
||||
// String pumpFrequency = SP.getString(MedtronicConst.Prefs.PumpFrequency, null);
|
||||
// }
|
||||
} else {
|
||||
lastGoodFrequency = RileyLinkUtil.getRileyLinkServiceData().lastGoodFrequency;
|
||||
lastGoodFrequency = rileyLinkServiceData.lastGoodFrequency;
|
||||
}
|
||||
|
||||
// TODO Omnipod/Dagger needs refactoring
|
||||
|
||||
if (MedtronicUtil.isMedtronicPump()) {
|
||||
if (MedtronicUtil.isMedtronicPump()) {
|
||||
RileyLinkCommunicationManager rileyLinkCommunicationManager = ((PumpPluginAbstract) activePlugin.getActivePump()).getRileyLinkService().getDeviceCommunicationManager();
|
||||
|
||||
if ((lastGoodFrequency > 0.0d)
|
||||
&& RileyLinkUtil.getRileyLinkCommunicationManager().isValidFrequency(lastGoodFrequency)) {
|
||||
if ((lastGoodFrequency > 0.0d)
|
||||
&& rileyLinkCommunicationManager.isValidFrequency(lastGoodFrequency)) {
|
||||
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.RileyLinkReady);
|
||||
rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.RileyLinkReady);
|
||||
|
||||
if (L.isEnabled(L.PUMPCOMM))
|
||||
LOG.info("Setting radio frequency to {} MHz", lastGoodFrequency);
|
||||
aapsLogger.info(LTag.PUMPCOMM, "Setting radio frequency to {} MHz", lastGoodFrequency);
|
||||
|
||||
RileyLinkUtil.getRileyLinkCommunicationManager().setRadioFrequencyForPump(lastGoodFrequency);
|
||||
rileyLinkCommunicationManager.setRadioFrequencyForPump(lastGoodFrequency);
|
||||
|
||||
boolean foundThePump = RileyLinkUtil.getRileyLinkCommunicationManager().tryToConnectToDevice();
|
||||
|
||||
if (foundThePump) {
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.PumpConnectorReady);
|
||||
} else {
|
||||
RileyLinkUtil.setServiceState(RileyLinkServiceState.PumpConnectorError,
|
||||
RileyLinkError.NoContactWithDevice);
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.IPC.MSG_PUMP_tunePump);
|
||||
}
|
||||
boolean foundThePump = rileyLinkCommunicationManager.tryToConnectToDevice();
|
||||
|
||||
if (foundThePump) {
|
||||
rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.PumpConnectorReady);
|
||||
} else {
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.IPC.MSG_PUMP_tunePump);
|
||||
rileyLinkServiceData.setServiceState(RileyLinkServiceState.PumpConnectorError,
|
||||
RileyLinkError.NoContactWithDevice);
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.IPC.MSG_PUMP_tunePump, context);
|
||||
}
|
||||
|
||||
} else {
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.IPC.MSG_PUMP_tunePump, context);
|
||||
}
|
||||
} else {
|
||||
|
||||
if (!RileyLinkUtil.isSame(lastGoodFrequency, RileyLinkTargetFrequency.Omnipod.getScanFrequencies()[0])) {
|
||||
lastGoodFrequency = RileyLinkTargetFrequency.Omnipod.getScanFrequencies()[0];
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceTransport;
|
||||
|
||||
/**
|
||||
|
@ -7,12 +8,12 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.
|
|||
*/
|
||||
public class PumpTask extends ServiceTask {
|
||||
|
||||
public PumpTask() {
|
||||
super();
|
||||
public PumpTask(HasAndroidInjector injector) {
|
||||
super(injector);
|
||||
}
|
||||
|
||||
|
||||
public PumpTask(ServiceTransport transport) {
|
||||
super(transport);
|
||||
public PumpTask(HasAndroidInjector injector, ServiceTransport transport) {
|
||||
super(injector, transport);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,10 +5,6 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventRefreshButtonState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.service.RileyLinkMedtronicService;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.OmnipodPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.service.RileyLinkOmnipodService;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodUtil;
|
||||
|
||||
/**
|
||||
* Created by geoff on 7/16/16.
|
||||
|
@ -29,17 +25,18 @@ public class ResetRileyLinkConfigurationTask extends PumpTask {
|
|||
|
||||
@Override
|
||||
public void run() {
|
||||
// TODO Omnipod refactor this
|
||||
if (MedtronicUtil.isMedtronicPump()) {
|
||||
RxBus.Companion.getINSTANCE().send(new EventRefreshButtonState(false));
|
||||
if (MedtronicUtil.isMedtronicPump()) {
|
||||
MedtronicPumpPlugin.isBusy = true;
|
||||
RileyLinkMedtronicService.getInstance().resetRileyLinkConfiguration();
|
||||
MedtronicPumpPlugin.isBusy = false;
|
||||
} else if (OmnipodUtil.isOmnipodEros()) {
|
||||
MedtronicPumpPlugin.isBusy = true;
|
||||
RileyLinkMedtronicService.getInstance().resetRileyLinkConfiguration();
|
||||
MedtronicPumpPlugin.isBusy = false;
|
||||
RxBus.Companion.getINSTANCE().send(new EventRefreshButtonState(true));
|
||||
} else if (OmnipodUtil.isOmnipodEros()) {
|
||||
OmnipodPumpPlugin.isBusy = true;
|
||||
RileyLinkOmnipodService.getInstance().resetRileyLinkConfiguration();
|
||||
OmnipodPumpPlugin.isBusy = false;
|
||||
}
|
||||
RxBus.Companion.getINSTANCE().send(new EventRefreshButtonState(true));
|
||||
}
|
||||
|
||||
RxBus.Companion.getINSTANCE().send(new EventRefreshButtonState(true));
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceTransport;
|
||||
|
||||
/**
|
||||
|
@ -7,17 +8,21 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.
|
|||
*/
|
||||
public class ServiceTask implements Runnable {
|
||||
|
||||
private static final String TAG = "ServiceTask(base)";
|
||||
public boolean completed = false;
|
||||
protected ServiceTransport mTransport;
|
||||
protected HasAndroidInjector injector;
|
||||
|
||||
|
||||
public ServiceTask() {
|
||||
public ServiceTask(HasAndroidInjector injector) {
|
||||
this.injector = injector;
|
||||
injector.androidInjector().inject(this);
|
||||
init(new ServiceTransport());
|
||||
}
|
||||
|
||||
|
||||
public ServiceTask(ServiceTransport transport) {
|
||||
public ServiceTask(HasAndroidInjector injector, ServiceTransport transport) {
|
||||
this.injector = injector;
|
||||
injector.androidInjector().inject(this);
|
||||
init(transport);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,46 +4,40 @@ import java.util.concurrent.LinkedBlockingQueue;
|
|||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import android.util.Log;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
|
||||
/**
|
||||
* Created by geoff on 7/9/16.
|
||||
*/
|
||||
@Singleton
|
||||
public class ServiceTaskExecutor extends ThreadPoolExecutor {
|
||||
|
||||
private static final String TAG = "ServiceTaskExecutor";
|
||||
private static ServiceTaskExecutor instance;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
|
||||
private static LinkedBlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<>();
|
||||
|
||||
static {
|
||||
instance = new ServiceTaskExecutor();
|
||||
}
|
||||
|
||||
|
||||
private ServiceTaskExecutor() {
|
||||
@Inject
|
||||
public ServiceTaskExecutor() {
|
||||
super(1, 1, 10000, TimeUnit.MILLISECONDS, taskQueue);
|
||||
}
|
||||
|
||||
|
||||
public static ServiceTaskExecutor getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
public static ServiceTask startTask(ServiceTask task) {
|
||||
instance.execute(task); // task will be run on async thread from pool.
|
||||
public ServiceTask startTask(ServiceTask task) {
|
||||
execute(task); // task will be run on async thread from pool.
|
||||
return task;
|
||||
}
|
||||
|
||||
|
||||
// FIXME
|
||||
protected void beforeExecute(Thread t, Runnable r) {
|
||||
// This is run on either caller UI thread or Service UI thread.
|
||||
ServiceTask task = (ServiceTask)r;
|
||||
Log.v(TAG, "About to run task " + task.getClass().getSimpleName());
|
||||
RileyLinkUtil.setCurrentTask(task);
|
||||
ServiceTask task = (ServiceTask) r;
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "About to run task " + task.getClass().getSimpleName());
|
||||
rileyLinkUtil.setCurrentTask(task);
|
||||
task.preOp();
|
||||
}
|
||||
|
||||
|
@ -51,9 +45,9 @@ public class ServiceTaskExecutor extends ThreadPoolExecutor {
|
|||
// FIXME
|
||||
protected void afterExecute(Runnable r, Throwable t) {
|
||||
// This is run on either caller UI thread or Service UI thread.
|
||||
ServiceTask task = (ServiceTask)r;
|
||||
ServiceTask task = (ServiceTask) r;
|
||||
task.postOp();
|
||||
Log.v(TAG, "Finishing task " + task.getClass().getSimpleName());
|
||||
RileyLinkUtil.finishCurrentTask(task);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Finishing task " + task.getClass().getSimpleName());
|
||||
rileyLinkUtil.finishCurrentTask(task);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,34 +1,43 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks;
|
||||
|
||||
import info.nightscout.androidaps.plugins.bus.RxBus;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.common.PumpPluginAbstract;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.data.ServiceTransport;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventRefreshButtonState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.service.RileyLinkMedtronicService;
|
||||
|
||||
/**
|
||||
* Created by geoff on 7/16/16.
|
||||
*/
|
||||
public class WakeAndTuneTask extends PumpTask {
|
||||
|
||||
@Inject ActivePluginProvider activePlugin;
|
||||
@Inject RxBusWrapper rxBus;
|
||||
|
||||
private static final String TAG = "WakeAndTuneTask";
|
||||
|
||||
|
||||
public WakeAndTuneTask() {
|
||||
public WakeAndTuneTask(HasAndroidInjector injector) {
|
||||
super(injector);
|
||||
}
|
||||
|
||||
|
||||
public WakeAndTuneTask(ServiceTransport transport) {
|
||||
super(transport);
|
||||
public WakeAndTuneTask(HasAndroidInjector injector, ServiceTransport transport) {
|
||||
super(injector, transport);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
RxBus.Companion.getINSTANCE().send(new EventRefreshButtonState(false));
|
||||
PumpPluginAbstract pump = (PumpPluginAbstract) activePlugin.getActivePump();
|
||||
rxBus.send(new EventRefreshButtonState(false));
|
||||
MedtronicPumpPlugin.isBusy = true;
|
||||
RileyLinkMedtronicService.getInstance().doTuneUpDevice();
|
||||
pump.doTuneUpDevice();
|
||||
MedtronicPumpPlugin.isBusy = false;
|
||||
RxBus.Companion.getINSTANCE().send(new EventRefreshButtonState(true));
|
||||
rxBus.send(new EventRefreshButtonState(true));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.preference.Preference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
|
||||
/**
|
||||
* Created by andy on 10/18/18.
|
||||
*/
|
||||
|
||||
public class RileyLinkSelectPreference extends Preference {
|
||||
|
||||
public RileyLinkSelectPreference(Context context) {
|
||||
super(context);
|
||||
setInitialSummaryValue();
|
||||
|
||||
MedtronicUtil.setRileyLinkSelectPreference(this);
|
||||
}
|
||||
|
||||
|
||||
public RileyLinkSelectPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setInitialSummaryValue();
|
||||
|
||||
MedtronicUtil.setRileyLinkSelectPreference(this);
|
||||
}
|
||||
|
||||
|
||||
private void setInitialSummaryValue() {
|
||||
String value = SP.getString("pref_rileylink_mac_address", null);
|
||||
|
||||
setSummary(value == null ? MainApp.gs(R.string.rileylink_error_address_not_set_short) : value);
|
||||
}
|
||||
|
||||
}
|
|
@ -20,14 +20,13 @@ import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
|||
*/
|
||||
public class DateTimeUtil {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
|
||||
/**
|
||||
* DateTime is packed as long: yyyymmddHHMMss
|
||||
*
|
||||
* @param atechDateTime
|
||||
* @return
|
||||
*/
|
||||
@Deprecated // use joda instead
|
||||
public static LocalDateTime toLocalDateTime(long atechDateTime) {
|
||||
int year = (int) (atechDateTime / 10000000000L);
|
||||
atechDateTime -= year * 10000000000L;
|
||||
|
@ -49,8 +48,7 @@ public class DateTimeUtil {
|
|||
try {
|
||||
return new LocalDateTime(year, month, dayOfMonth, hourOfDay, minute, second);
|
||||
} catch (Exception ex) {
|
||||
if (L.isEnabled(L.PUMPCOMM))
|
||||
LOG.error("Error creating LocalDateTime from values [atechDateTime={}, year={}, month={}, day={}, hour={}, minute={}, second={}]. Exception: {}", atechDateTime, year, month, dayOfMonth, hourOfDay, minute, second, ex.getMessage());
|
||||
//LOG.error("Error creating LocalDateTime from values [atechDateTime={}, year={}, month={}, day={}, hour={}, minute={}, second={}]. Exception: {}", atechDateTime, year, month, dayOfMonth, hourOfDay, minute, second, ex.getMessage());
|
||||
//return null;
|
||||
throw ex;
|
||||
}
|
||||
|
@ -63,6 +61,7 @@ public class DateTimeUtil {
|
|||
* @param atechDateTime
|
||||
* @return
|
||||
*/
|
||||
@Deprecated // use joda instead
|
||||
public static GregorianCalendar toGregorianCalendar(long atechDateTime) {
|
||||
int year = (int) (atechDateTime / 10000000000L);
|
||||
atechDateTime -= year * 10000000000L;
|
||||
|
@ -84,8 +83,7 @@ public class DateTimeUtil {
|
|||
try {
|
||||
return new GregorianCalendar(year, month - 1, dayOfMonth, hourOfDay, minute, second);
|
||||
} catch (Exception ex) {
|
||||
if (L.isEnabled(L.PUMPCOMM))
|
||||
LOG.error("DateTimeUtil", String.format("Error creating GregorianCalendar from values [atechDateTime=%d, year=%d, month=%d, day=%d, hour=%d, minute=%d, second=%d]", atechDateTime, year, month, dayOfMonth, hourOfDay, minute, second));
|
||||
//LOG.error("DateTimeUtil", String.format("Error creating GregorianCalendar from values [atechDateTime=%d, year=%d, month=%d, day=%d, hour=%d, minute=%d, second=%d]", atechDateTime, year, month, dayOfMonth, hourOfDay, minute, second));
|
||||
//return null;
|
||||
throw ex;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import android.content.Context;
|
|||
import android.content.Intent;
|
||||
import android.location.LocationManager;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.utils.alertDialogs.OKDialog;
|
||||
|
||||
|
@ -44,7 +43,7 @@ public class LocationHelper {
|
|||
}
|
||||
|
||||
// Shamelessly borrowed from http://stackoverflow.com/a/10311877/868533
|
||||
OKDialog.showConfirmation(parent, MainApp.gs(R.string.location_not_found_title), MainApp.gs(R.string.location_not_found_message), () -> {
|
||||
OKDialog.showConfirmation(parent, parent.getString(R.string.location_not_found_title), parent.getString(R.string.location_not_found_message), () -> {
|
||||
parent.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
|
||||
});
|
||||
}
|
||||
|
|
|
@ -19,10 +19,10 @@ import info.nightscout.androidaps.logging.AAPSLogger
|
|||
import info.nightscout.androidaps.logging.LTag
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusActivity
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.BatteryType
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState
|
||||
|
@ -37,9 +37,9 @@ import info.nightscout.androidaps.queue.Callback
|
|||
import info.nightscout.androidaps.queue.events.EventQueueChanged
|
||||
import info.nightscout.androidaps.utils.DateUtil
|
||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
|
||||
import info.nightscout.androidaps.utils.T
|
||||
import info.nightscout.androidaps.utils.WarnColors
|
||||
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
|
||||
import info.nightscout.androidaps.utils.extensions.plusAssign
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
|
@ -57,6 +57,10 @@ class MedtronicFragment : DaggerFragment() {
|
|||
@Inject lateinit var activePlugin: ActivePluginProvider
|
||||
@Inject lateinit var medtronicPumpPlugin: MedtronicPumpPlugin
|
||||
@Inject lateinit var warnColors: WarnColors
|
||||
@Inject lateinit var rileyLinkUtil: RileyLinkUtil
|
||||
@Inject lateinit var medtronicUtil: MedtronicUtil
|
||||
@Inject lateinit var medtronicPumpStatus: MedtronicPumpStatus
|
||||
@Inject lateinit var rileyLinkServiceData: RileyLinkServiceData
|
||||
|
||||
private var disposable: CompositeDisposable = CompositeDisposable()
|
||||
|
||||
|
@ -85,7 +89,7 @@ class MedtronicFragment : DaggerFragment() {
|
|||
medtronic_pump_status.text = "{fa-bed}"
|
||||
|
||||
medtronic_history.setOnClickListener {
|
||||
if (MedtronicUtil.getPumpStatus().verifyConfiguration()) {
|
||||
if (medtronicPumpPlugin.rileyLinkService?.verifyConfiguration() == true) {
|
||||
startActivity(Intent(context, MedtronicHistoryActivity::class.java))
|
||||
} else {
|
||||
displayNotConfiguredDialog()
|
||||
|
@ -93,7 +97,7 @@ class MedtronicFragment : DaggerFragment() {
|
|||
}
|
||||
|
||||
medtronic_refresh.setOnClickListener {
|
||||
if (!MedtronicUtil.getPumpStatus().verifyConfiguration()) {
|
||||
if (medtronicPumpPlugin.rileyLinkService?.verifyConfiguration() != true) {
|
||||
displayNotConfiguredDialog()
|
||||
} else {
|
||||
medtronic_refresh.isEnabled = false
|
||||
|
@ -107,7 +111,7 @@ class MedtronicFragment : DaggerFragment() {
|
|||
}
|
||||
|
||||
medtronic_stats.setOnClickListener {
|
||||
if (MedtronicUtil.getPumpStatus().verifyConfiguration()) {
|
||||
if (medtronicPumpPlugin.rileyLinkService?.verifyConfiguration() == true) {
|
||||
startActivity(Intent(context, RileyLinkStatusActivity::class.java))
|
||||
} else {
|
||||
displayNotConfiguredDialog()
|
||||
|
@ -147,7 +151,7 @@ class MedtronicFragment : DaggerFragment() {
|
|||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe({
|
||||
aapsLogger.debug(LTag.PUMP, "EventMedtronicPumpConfigurationChanged triggered")
|
||||
MedtronicUtil.getPumpStatus().verifyConfiguration()
|
||||
medtronicPumpPlugin.rileyLinkService?.verifyConfiguration()
|
||||
updateGUI()
|
||||
}, { fabricPrivacy.logException(it) })
|
||||
disposable += rxBus
|
||||
|
@ -171,33 +175,24 @@ class MedtronicFragment : DaggerFragment() {
|
|||
|
||||
@Synchronized
|
||||
private fun setDeviceStatus() {
|
||||
val pumpStatus: MedtronicPumpStatus = MedtronicUtil.getPumpStatus()
|
||||
pumpStatus.rileyLinkServiceState = checkStatusSet(pumpStatus.rileyLinkServiceState,
|
||||
RileyLinkUtil.getServiceState()) as RileyLinkServiceState?
|
||||
|
||||
val resourceId = pumpStatus.rileyLinkServiceState.getResourceId(RileyLinkTargetDevice.MedtronicPump)
|
||||
val rileyLinkError = RileyLinkUtil.getError()
|
||||
val resourceId = rileyLinkServiceData.rileyLinkServiceState.getResourceId(RileyLinkTargetDevice.MedtronicPump)
|
||||
val rileyLinkError = medtronicPumpPlugin.rileyLinkService?.error
|
||||
medtronic_rl_status.text =
|
||||
when {
|
||||
pumpStatus.rileyLinkServiceState == RileyLinkServiceState.NotStarted -> resourceHelper.gs(resourceId)
|
||||
pumpStatus.rileyLinkServiceState.isConnecting -> "{fa-bluetooth-b spin} " + resourceHelper.gs(resourceId)
|
||||
pumpStatus.rileyLinkServiceState.isError && rileyLinkError == null -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
|
||||
pumpStatus.rileyLinkServiceState.isError && rileyLinkError != null -> "{fa-bluetooth-b} " + resourceHelper.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.MedtronicPump))
|
||||
else -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
|
||||
rileyLinkServiceData.rileyLinkServiceState == RileyLinkServiceState.NotStarted -> resourceHelper.gs(resourceId)
|
||||
rileyLinkServiceData.rileyLinkServiceState.isConnecting -> "{fa-bluetooth-b spin} " + resourceHelper.gs(resourceId)
|
||||
rileyLinkServiceData.rileyLinkServiceState.isError && rileyLinkError == null -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
|
||||
rileyLinkServiceData.rileyLinkServiceState.isError && rileyLinkError != null -> "{fa-bluetooth-b} " + resourceHelper.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.MedtronicPump))
|
||||
else -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
|
||||
}
|
||||
medtronic_rl_status.setTextColor(if (rileyLinkError != null) Color.RED else Color.WHITE)
|
||||
|
||||
pumpStatus.rileyLinkError = checkStatusSet(pumpStatus.rileyLinkError, RileyLinkUtil.getError()) as RileyLinkError?
|
||||
|
||||
medtronic_errors.text =
|
||||
pumpStatus.rileyLinkError?.let {
|
||||
rileyLinkServiceData.rileyLinkError?.let {
|
||||
resourceHelper.gs(it.getResourceId(RileyLinkTargetDevice.MedtronicPump))
|
||||
} ?: "-"
|
||||
|
||||
pumpStatus.pumpDeviceState = checkStatusSet(pumpStatus.pumpDeviceState,
|
||||
MedtronicUtil.getPumpDeviceState()) as PumpDeviceState?
|
||||
|
||||
when (pumpStatus.pumpDeviceState) {
|
||||
when (medtronicPumpStatus.pumpDeviceState) {
|
||||
null,
|
||||
PumpDeviceState.Sleeping -> medtronic_pump_status.text = "{fa-bed} " // + pumpStatus.pumpDeviceState.name());
|
||||
PumpDeviceState.NeverContacted,
|
||||
|
@ -205,20 +200,20 @@ class MedtronicFragment : DaggerFragment() {
|
|||
PumpDeviceState.PumpUnreachable,
|
||||
PumpDeviceState.ErrorWhenCommunicating,
|
||||
PumpDeviceState.TimeoutWhenCommunicating,
|
||||
PumpDeviceState.InvalidConfiguration -> medtronic_pump_status.text = " " + resourceHelper.gs(pumpStatus.pumpDeviceState.resourceId)
|
||||
PumpDeviceState.InvalidConfiguration -> medtronic_pump_status.text = " " + resourceHelper.gs(medtronicPumpStatus.pumpDeviceState.resourceId)
|
||||
|
||||
PumpDeviceState.Active -> {
|
||||
val cmd = MedtronicUtil.getCurrentCommand()
|
||||
val cmd = medtronicUtil.getCurrentCommand()
|
||||
if (cmd == null)
|
||||
medtronic_pump_status.text = " " + resourceHelper.gs(pumpStatus.pumpDeviceState.resourceId)
|
||||
medtronic_pump_status.text = " " + resourceHelper.gs(medtronicPumpStatus.pumpDeviceState.resourceId)
|
||||
else {
|
||||
aapsLogger.debug(LTag.PUMP, "Command: " + cmd)
|
||||
val cmdResourceId = cmd.resourceId
|
||||
if (cmd == MedtronicCommandType.GetHistoryData) {
|
||||
medtronic_pump_status.text = MedtronicUtil.frameNumber?.let {
|
||||
resourceHelper.gs(cmdResourceId, MedtronicUtil.pageNumber, MedtronicUtil.frameNumber)
|
||||
medtronic_pump_status.text = medtronicUtil.frameNumber?.let {
|
||||
resourceHelper.gs(cmdResourceId, medtronicUtil.pageNumber, medtronicUtil.frameNumber)
|
||||
}
|
||||
?: resourceHelper.gs(R.string.medtronic_cmd_desc_get_history_request, MedtronicUtil.pageNumber)
|
||||
?: resourceHelper.gs(R.string.medtronic_cmd_desc_get_history_request, medtronicUtil.pageNumber)
|
||||
} else {
|
||||
medtronic_pump_status.text = " " + (cmdResourceId?.let { resourceHelper.gs(it) }
|
||||
?: cmd.getCommandDescription())
|
||||
|
@ -226,7 +221,7 @@ class MedtronicFragment : DaggerFragment() {
|
|||
}
|
||||
}
|
||||
|
||||
else -> aapsLogger.warn(LTag.PUMP, "Unknown pump state: " + pumpStatus.pumpDeviceState)
|
||||
else -> aapsLogger.warn(LTag.PUMP, "Unknown pump state: " + medtronicPumpStatus.pumpDeviceState)
|
||||
}
|
||||
|
||||
val status = commandQueue.spannedStatus()
|
||||
|
@ -238,17 +233,6 @@ class MedtronicFragment : DaggerFragment() {
|
|||
}
|
||||
}
|
||||
|
||||
private fun checkStatusSet(object1: Any?, object2: Any?): Any? {
|
||||
return if (object1 == null) {
|
||||
object2
|
||||
} else {
|
||||
if (object1 != object2) {
|
||||
object2
|
||||
} else
|
||||
object1
|
||||
}
|
||||
}
|
||||
|
||||
private fun displayNotConfiguredDialog() {
|
||||
context?.let {
|
||||
OKDialog.show(it, resourceHelper.gs(R.string.combo_warning),
|
||||
|
@ -260,18 +244,17 @@ class MedtronicFragment : DaggerFragment() {
|
|||
@Synchronized
|
||||
fun updateGUI() {
|
||||
if (medtronic_rl_status == null) return
|
||||
val pumpStatus = MedtronicUtil.getPumpStatus()
|
||||
|
||||
setDeviceStatus()
|
||||
|
||||
// last connection
|
||||
if (pumpStatus.lastConnection != 0L) {
|
||||
val minAgo = DateUtil.minAgo(resourceHelper, pumpStatus.lastConnection)
|
||||
val min = (System.currentTimeMillis() - pumpStatus.lastConnection) / 1000 / 60
|
||||
if (pumpStatus.lastConnection + 60 * 1000 > System.currentTimeMillis()) {
|
||||
if (medtronicPumpStatus.lastConnection != 0L) {
|
||||
val minAgo = DateUtil.minAgo(resourceHelper, medtronicPumpStatus.lastConnection)
|
||||
val min = (System.currentTimeMillis() - medtronicPumpStatus.lastConnection) / 1000 / 60
|
||||
if (medtronicPumpStatus.lastConnection + 60 * 1000 > System.currentTimeMillis()) {
|
||||
medtronic_lastconnection.setText(R.string.combo_pump_connected_now)
|
||||
medtronic_lastconnection.setTextColor(Color.WHITE)
|
||||
} else if (pumpStatus.lastConnection + 30 * 60 * 1000 < System.currentTimeMillis()) {
|
||||
} else if (medtronicPumpStatus.lastConnection + 30 * 60 * 1000 < System.currentTimeMillis()) {
|
||||
|
||||
if (min < 60) {
|
||||
medtronic_lastconnection.text = resourceHelper.gs(R.string.minago, min)
|
||||
|
@ -294,19 +277,19 @@ class MedtronicFragment : DaggerFragment() {
|
|||
}
|
||||
|
||||
// last bolus
|
||||
val bolus = pumpStatus.lastBolusAmount
|
||||
val bolusTime = pumpStatus.lastBolusTime
|
||||
val bolus = medtronicPumpStatus.lastBolusAmount
|
||||
val bolusTime = medtronicPumpStatus.lastBolusTime
|
||||
if (bolus != null && bolusTime != null) {
|
||||
val agoMsc = System.currentTimeMillis() - pumpStatus.lastBolusTime.time
|
||||
val agoMsc = System.currentTimeMillis() - medtronicPumpStatus.lastBolusTime.time
|
||||
val bolusMinAgo = agoMsc.toDouble() / 60.0 / 1000.0
|
||||
val unit = resourceHelper.gs(R.string.insulin_unit_shortname)
|
||||
val ago: String
|
||||
if (agoMsc < 60 * 1000) {
|
||||
ago = resourceHelper.gs(R.string.combo_pump_connected_now)
|
||||
} else if (bolusMinAgo < 60) {
|
||||
ago = DateUtil.minAgo(resourceHelper, pumpStatus.lastBolusTime.time)
|
||||
ago = DateUtil.minAgo(resourceHelper, medtronicPumpStatus.lastBolusTime.time)
|
||||
} else {
|
||||
ago = DateUtil.hourAgo(pumpStatus.lastBolusTime.time, resourceHelper)
|
||||
ago = DateUtil.hourAgo(medtronicPumpStatus.lastBolusTime.time, resourceHelper)
|
||||
}
|
||||
medtronic_lastbolus.text = resourceHelper.gs(R.string.combo_last_bolus, bolus, unit, ago)
|
||||
} else {
|
||||
|
@ -314,24 +297,25 @@ class MedtronicFragment : DaggerFragment() {
|
|||
}
|
||||
|
||||
// base basal rate
|
||||
medtronic_basabasalrate.text = ("(" + pumpStatus.activeProfileName + ") "
|
||||
medtronic_basabasalrate.text = ("(" + medtronicPumpStatus.activeProfileName + ") "
|
||||
+ resourceHelper.gs(R.string.pump_basebasalrate, medtronicPumpPlugin.baseBasalRate))
|
||||
|
||||
medtronic_tempbasal.text = activePlugin.activeTreatments.getTempBasalFromHistory(System.currentTimeMillis())?.toStringFull()
|
||||
?: ""
|
||||
|
||||
// battery
|
||||
if (MedtronicUtil.getBatteryType() == BatteryType.None || pumpStatus.batteryVoltage == null) {
|
||||
medtronic_pumpstate_battery.text = "{fa-battery-" + pumpStatus.batteryRemaining / 25 + "} "
|
||||
if (medtronicPumpStatus.batteryType == BatteryType.None || medtronicPumpStatus.batteryVoltage == null) {
|
||||
medtronic_pumpstate_battery.text = "{fa-battery-" + medtronicPumpStatus.batteryRemaining / 25 + "} "
|
||||
} else {
|
||||
medtronic_pumpstate_battery.text = "{fa-battery-" + pumpStatus.batteryRemaining / 25 + "} " + pumpStatus.batteryRemaining + "%" + String.format(" (%.2f V)", pumpStatus.batteryVoltage)
|
||||
medtronic_pumpstate_battery.text = "{fa-battery-" + medtronicPumpStatus.batteryRemaining / 25 + "} " + medtronicPumpStatus.batteryRemaining + "%" + String.format(" (%.2f V)", medtronicPumpStatus.batteryVoltage)
|
||||
}
|
||||
warnColors.setColorInverse(medtronic_pumpstate_battery, pumpStatus.batteryRemaining.toDouble(), 25.0, 10.0)
|
||||
warnColors.setColorInverse(medtronic_pumpstate_battery, medtronicPumpStatus.batteryRemaining.toDouble(), 25.0, 10.0)
|
||||
|
||||
// reservoir
|
||||
medtronic_reservoir.text = resourceHelper.gs(R.string.reservoirvalue, pumpStatus.reservoirRemainingUnits, pumpStatus.reservoirFullUnits)
|
||||
warnColors.setColorInverse(medtronic_reservoir, pumpStatus.reservoirRemainingUnits, 50.0, 20.0)
|
||||
medtronic_reservoir.text = resourceHelper.gs(R.string.reservoirvalue, medtronicPumpStatus.reservoirRemainingUnits, medtronicPumpStatus.reservoirFullUnits)
|
||||
warnColors.setColorInverse(medtronic_reservoir, medtronicPumpStatus.reservoirRemainingUnits, 50.0, 20.0)
|
||||
|
||||
medtronic_errors.text = pumpStatus.errorInfo
|
||||
medtronicPumpPlugin.rileyLinkService?.verifyConfiguration()
|
||||
medtronic_errors.text = medtronicPumpStatus.errorInfo
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,10 @@ import android.os.IBinder;
|
|||
import android.os.SystemClock;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.joda.time.LocalDateTime;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -34,7 +37,6 @@ import info.nightscout.androidaps.data.Profile;
|
|||
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||
import info.nightscout.androidaps.db.Source;
|
||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||
import info.nightscout.androidaps.events.EventCustomActionsChanged;
|
||||
import info.nightscout.androidaps.events.EventRefreshOverview;
|
||||
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
||||
import info.nightscout.androidaps.interfaces.CommandQueueProvider;
|
||||
|
@ -50,18 +52,19 @@ import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType;
|
|||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
|
||||
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
|
||||
import info.nightscout.androidaps.plugins.pump.common.PumpPluginAbstract;
|
||||
import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpDriverState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ResetRileyLinkConfigurationTask;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.WakeAndTuneTask;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryResult;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUIComm;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUITask;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BasalProfile;
|
||||
|
@ -85,7 +88,6 @@ import info.nightscout.androidaps.utils.TimeChangeType;
|
|||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
|
||||
import static info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil.sendNotification;
|
||||
|
||||
/**
|
||||
* Created by andy on 23.04.18.
|
||||
|
@ -95,18 +97,22 @@ import static info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUt
|
|||
@Singleton
|
||||
public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInterface {
|
||||
|
||||
private final SP sp;
|
||||
private final RileyLinkUtil rileyLinkUtil;
|
||||
private final MedtronicUtil medtronicUtil;
|
||||
private final MedtronicPumpStatus medtronicPumpStatus;
|
||||
private final MedtronicHistoryData medtronicHistoryData;
|
||||
private final RileyLinkServiceData rileyLinkServiceData;
|
||||
private final ServiceTaskExecutor serviceTaskExecutor;
|
||||
|
||||
protected static MedtronicPumpPlugin plugin = null;
|
||||
private RileyLinkMedtronicService medtronicService;
|
||||
private MedtronicPumpStatus pumpStatusLocal = null;
|
||||
private MedtronicUIComm medtronicUIComm;
|
||||
private RileyLinkMedtronicService rileyLinkMedtronicService;
|
||||
|
||||
// variables for handling statuses and history
|
||||
private boolean firstRun = true;
|
||||
private boolean isRefresh = false;
|
||||
private Map<MedtronicStatusRefreshType, Long> statusRefreshMap = new HashMap<>();
|
||||
private boolean isInitialized = false;
|
||||
private MedtronicHistoryData medtronicHistoryData;
|
||||
private MedtronicCommunicationManager medtronicCommunicationManager;
|
||||
private PumpHistoryEntry lastPumpHistoryEntry;
|
||||
|
||||
public static boolean isBusy = false;
|
||||
|
@ -124,7 +130,13 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
ActivePluginProvider activePlugin,
|
||||
SP sp,
|
||||
CommandQueueProvider commandQueue,
|
||||
FabricPrivacy fabricPrivacy
|
||||
FabricPrivacy fabricPrivacy,
|
||||
RileyLinkUtil rileyLinkUtil,
|
||||
MedtronicUtil medtronicUtil,
|
||||
MedtronicPumpStatus medtronicPumpStatus,
|
||||
MedtronicHistoryData medtronicHistoryData,
|
||||
RileyLinkServiceData rileyLinkServiceData,
|
||||
ServiceTaskExecutor serviceTaskExecutor
|
||||
) {
|
||||
|
||||
super(new PluginDescription() //
|
||||
|
@ -132,14 +144,20 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
.fragmentClass(MedtronicFragment.class.getName()) //
|
||||
.pluginName(R.string.medtronic_name) //
|
||||
.shortName(R.string.medtronic_name_short) //
|
||||
.preferencesId(R.xml.pref_medtronic).description(R.string.description_pump_medtronic), //
|
||||
.preferencesId(R.xml.pref_medtronic)
|
||||
.description(R.string.description_pump_medtronic), //
|
||||
PumpType.Medtronic_522_722, // we default to most basic model, correct model from config is loaded later
|
||||
injector, resourceHelper, aapsLogger, commandQueue, rxBus, activePlugin, sp, context, fabricPrivacy
|
||||
);
|
||||
this.plugin = this;
|
||||
|
||||
this.rxBus = rxBus;
|
||||
this.rileyLinkUtil = rileyLinkUtil;
|
||||
this.medtronicUtil = medtronicUtil;
|
||||
this.sp = sp;
|
||||
this.medtronicPumpStatus = medtronicPumpStatus;
|
||||
this.medtronicHistoryData = medtronicHistoryData;
|
||||
this.rileyLinkServiceData = rileyLinkServiceData;
|
||||
this.serviceTaskExecutor = serviceTaskExecutor;
|
||||
|
||||
displayConnectionMessages = false;
|
||||
|
||||
|
@ -147,24 +165,22 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
aapsLogger.debug(LTag.PUMP, "RileyLinkMedtronicService is disconnected");
|
||||
medtronicService = null;
|
||||
rileyLinkMedtronicService = null;
|
||||
}
|
||||
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
aapsLogger.debug(LTag.PUMP, "RileyLinkMedtronicService is connected");
|
||||
RileyLinkMedtronicService.LocalBinder mLocalBinder = (RileyLinkMedtronicService.LocalBinder) service;
|
||||
medtronicService = mLocalBinder.getServiceInstance();
|
||||
rileyLinkMedtronicService = mLocalBinder.getServiceInstance();
|
||||
|
||||
new Thread(() -> {
|
||||
|
||||
for (int i = 0; i < 20; i++) {
|
||||
SystemClock.sleep(5000);
|
||||
|
||||
if (MedtronicUtil.getPumpStatus() != null) {
|
||||
aapsLogger.debug(LTag.PUMP, "Starting Medtronic-RileyLink service");
|
||||
if (MedtronicUtil.getPumpStatus().setNotInPreInit()) {
|
||||
break;
|
||||
}
|
||||
aapsLogger.debug(LTag.PUMP, "Starting Medtronic-RileyLink service");
|
||||
if (rileyLinkMedtronicService.setNotInPreInit()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
|
@ -176,8 +192,6 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
medtronicUIComm = new MedtronicUIComm(aapsLogger, rxBus, getResourceHelper());
|
||||
medtronicHistoryData = new MedtronicHistoryData(aapsLogger, sp, activePlugin);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
|
@ -188,34 +202,33 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void updatePreferenceSummary(@NotNull Preference pref) {
|
||||
super.updatePreferenceSummary(pref);
|
||||
|
||||
if (pref.getKey().equals(getResourceHelper().gs(R.string.key_rileylink_mac_address))) {
|
||||
String value = sp.getStringOrNull(R.string.key_rileylink_mac_address, null);
|
||||
pref.setSummary(value == null ? getResourceHelper().gs(R.string.rileylink_error_address_not_set_short) : value);
|
||||
}
|
||||
}
|
||||
|
||||
private String getLogPrefix() {
|
||||
return "MedtronicPumpPlugin::";
|
||||
}
|
||||
|
||||
|
||||
public MedtronicHistoryData getMedtronicHistoryData() {
|
||||
return this.medtronicHistoryData;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void initPumpStatusData() {
|
||||
|
||||
this.pumpStatusLocal = new MedtronicPumpStatus(pumpDescription);
|
||||
MedtronicUtil.setPumpStatus(pumpStatusLocal);
|
||||
medtronicPumpStatus.lastConnection = sp.getLong(RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L);
|
||||
medtronicPumpStatus.lastDataTime = medtronicPumpStatus.lastConnection;
|
||||
medtronicPumpStatus.previousConnection = medtronicPumpStatus.lastConnection;
|
||||
|
||||
pumpStatusLocal.lastConnection = sp.getLong(RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L);
|
||||
pumpStatusLocal.lastDataTime = new LocalDateTime(pumpStatusLocal.lastConnection);
|
||||
pumpStatusLocal.previousConnection = pumpStatusLocal.lastConnection;
|
||||
if (rileyLinkMedtronicService != null) rileyLinkMedtronicService.verifyConfiguration();
|
||||
|
||||
pumpStatusLocal.refreshConfiguration();
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "initPumpStatusData: " + this.pumpStatusLocal);
|
||||
|
||||
this.pumpStatus = pumpStatusLocal;
|
||||
aapsLogger.debug(LTag.PUMP, "initPumpStatusData: " + this.medtronicPumpStatus);
|
||||
|
||||
// this is only thing that can change, by being configured
|
||||
pumpDescription.maxTempAbsolute = (pumpStatusLocal.maxBasal != null) ? pumpStatusLocal.maxBasal : 35.0d;
|
||||
pumpDescription.maxTempAbsolute = (medtronicPumpStatus.maxBasal != null) ? medtronicPumpStatus.maxBasal : 35.0d;
|
||||
|
||||
// set first Medtronic Pump Start
|
||||
if (!sp.contains(MedtronicConst.Statistics.FirstPumpStart)) {
|
||||
|
@ -226,6 +239,15 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetRileyLinkConfiguration() {
|
||||
rileyLinkMedtronicService.resetRileyLinkConfiguration();
|
||||
}
|
||||
|
||||
@Override public void doTuneUpDevice() {
|
||||
rileyLinkMedtronicService.doTuneUpDevice();
|
||||
}
|
||||
|
||||
private void migrateSettings() {
|
||||
|
||||
if ("US (916 MHz)".equals(sp.getString(MedtronicConst.Prefs.PumpFrequency, "US (916 MHz)"))) {
|
||||
|
@ -276,6 +298,9 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
return RileyLinkMedtronicService.class;
|
||||
}
|
||||
|
||||
@Override public PumpStatus getPumpStatusData() {
|
||||
return medtronicPumpStatus;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String deviceID() {
|
||||
|
@ -298,9 +323,13 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
// Pump Plugin
|
||||
|
||||
private boolean isServiceSet() {
|
||||
return medtronicService != null;
|
||||
return rileyLinkMedtronicService != null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public RileyLinkMedtronicService getRileyLinkService() {
|
||||
return rileyLinkMedtronicService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInitialized() {
|
||||
|
@ -365,7 +394,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
public boolean isConnected() {
|
||||
if (displayConnectionMessages)
|
||||
aapsLogger.debug(LTag.PUMP, "MedtronicPumpPlugin::isConnected");
|
||||
return isServiceSet() && medtronicService.isInitialized();
|
||||
return isServiceSet() && rileyLinkMedtronicService.isInitialized();
|
||||
}
|
||||
|
||||
|
||||
|
@ -373,15 +402,13 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
public boolean isConnecting() {
|
||||
if (displayConnectionMessages)
|
||||
aapsLogger.debug(LTag.PUMP, "MedtronicPumpPlugin::isConnecting");
|
||||
return !isServiceSet() || !medtronicService.isInitialized();
|
||||
return !isServiceSet() || !rileyLinkMedtronicService.isInitialized();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void getPumpStatus() {
|
||||
|
||||
getMDTPumpStatus();
|
||||
|
||||
if (firstRun) {
|
||||
initializePump(!isRefresh);
|
||||
} else {
|
||||
|
@ -400,7 +427,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
private boolean isPumpNotReachable() {
|
||||
|
||||
RileyLinkServiceState rileyLinkServiceState = MedtronicUtil.getServiceState();
|
||||
RileyLinkServiceState rileyLinkServiceState = rileyLinkServiceData.rileyLinkServiceState;
|
||||
|
||||
if (rileyLinkServiceState == null) {
|
||||
aapsLogger.debug(LTag.PUMP, "RileyLink unreachable. RileyLinkServiceState is null.");
|
||||
|
@ -414,7 +441,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
return false;
|
||||
}
|
||||
|
||||
return (!medtronicCommunicationManager.isDeviceReachable());
|
||||
return (!rileyLinkMedtronicService.getDeviceCommunicationManager().isDeviceReachable());
|
||||
}
|
||||
|
||||
|
||||
|
@ -431,12 +458,12 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
if (isPumpNotReachable()) {
|
||||
aapsLogger.error("Pump unreachable.");
|
||||
MedtronicUtil.sendNotification(MedtronicNotificationType.PumpUnreachable, getResourceHelper(), rxBus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpUnreachable, getResourceHelper(), rxBus);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
medtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
|
||||
|
||||
if (hasTimeDateOrTimeZoneChanged) {
|
||||
|
@ -470,14 +497,14 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
case BatteryStatus:
|
||||
case RemainingInsulin: {
|
||||
medtronicUIComm.executeCommand(refreshType.getKey().getCommandType());
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(refreshType.getKey().getCommandType(medtronicUtil.getMedtronicPumpModel()));
|
||||
refreshTypesNeededToReschedule.add(refreshType.getKey());
|
||||
resetTime = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case Configuration: {
|
||||
medtronicUIComm.executeCommand(refreshType.getKey().getCommandType());
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(refreshType.getKey().getCommandType(medtronicUtil.getMedtronicPumpModel()));
|
||||
resetTime = true;
|
||||
}
|
||||
break;
|
||||
|
@ -492,7 +519,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
}
|
||||
|
||||
if (resetTime)
|
||||
pumpStatusLocal.setLastCommunicationToNow();
|
||||
medtronicPumpStatus.setLastCommunicationToNow();
|
||||
|
||||
}
|
||||
|
||||
|
@ -519,35 +546,30 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
aapsLogger.info(LTag.PUMP, getLogPrefix() + "initializePump - start");
|
||||
|
||||
if (medtronicCommunicationManager == null) {
|
||||
medtronicCommunicationManager = MedtronicCommunicationManager.getInstance();
|
||||
medtronicCommunicationManager.setDoWakeUpBeforeCommand(false);
|
||||
}
|
||||
rileyLinkMedtronicService.getDeviceCommunicationManager().setDoWakeUpBeforeCommand(false);
|
||||
|
||||
setRefreshButtonEnabled(false);
|
||||
|
||||
getMDTPumpStatus();
|
||||
|
||||
if (isRefresh) {
|
||||
if (isPumpNotReachable()) {
|
||||
aapsLogger.error(getLogPrefix() + "initializePump::Pump unreachable.");
|
||||
MedtronicUtil.sendNotification(MedtronicNotificationType.PumpUnreachable, getResourceHelper(), rxBus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpUnreachable, getResourceHelper(), rxBus);
|
||||
|
||||
setRefreshButtonEnabled(true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
medtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
}
|
||||
|
||||
// model (once)
|
||||
if (MedtronicUtil.getMedtronicPumpModel() == null) {
|
||||
medtronicUIComm.executeCommand(MedtronicCommandType.PumpModel);
|
||||
if (medtronicUtil.getMedtronicPumpModel() == null) {
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.PumpModel);
|
||||
} else {
|
||||
if (pumpStatusLocal.medtronicDeviceType != MedtronicUtil.getMedtronicPumpModel()) {
|
||||
if (medtronicPumpStatus.medtronicDeviceType != medtronicUtil.getMedtronicPumpModel()) {
|
||||
aapsLogger.warn(LTag.PUMP, getLogPrefix() + "Configured pump is not the same as one detected.");
|
||||
MedtronicUtil.sendNotification(MedtronicNotificationType.PumpTypeNotSame, getResourceHelper(), rxBus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpTypeNotSame, getResourceHelper(), rxBus);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -559,29 +581,29 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
readPumpHistory();
|
||||
|
||||
// remaining insulin (>50 = 4h; 50-20 = 1h; 15m)
|
||||
medtronicUIComm.executeCommand(MedtronicCommandType.GetRemainingInsulin);
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.GetRemainingInsulin);
|
||||
scheduleNextRefresh(MedtronicStatusRefreshType.RemainingInsulin, 10);
|
||||
|
||||
// remaining power (1h)
|
||||
medtronicUIComm.executeCommand(MedtronicCommandType.GetBatteryStatus);
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.GetBatteryStatus);
|
||||
scheduleNextRefresh(MedtronicStatusRefreshType.BatteryStatus, 20);
|
||||
|
||||
// configuration (once and then if history shows config changes)
|
||||
medtronicUIComm.executeCommand(MedtronicCommandType.getSettings(MedtronicUtil.getMedtronicPumpModel()));
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.getSettings(medtronicUtil.getMedtronicPumpModel()));
|
||||
|
||||
// read profile (once, later its controlled by isThisProfileSet method)
|
||||
getBasalProfiles();
|
||||
|
||||
int errorCount = medtronicUIComm.getInvalidResponsesCount();
|
||||
int errorCount = rileyLinkMedtronicService.getMedtronicUIComm().getInvalidResponsesCount();
|
||||
|
||||
if (errorCount >= 5) {
|
||||
aapsLogger.error("Number of error counts was 5 or more. Starting tunning.");
|
||||
setRefreshButtonEnabled(true);
|
||||
ServiceTaskExecutor.startTask(new WakeAndTuneTask());
|
||||
serviceTaskExecutor.startTask(new WakeAndTuneTask(getInjector()));
|
||||
return;
|
||||
}
|
||||
|
||||
pumpStatusLocal.setLastCommunicationToNow();
|
||||
medtronicPumpStatus.setLastCommunicationToNow();
|
||||
setRefreshButtonEnabled(true);
|
||||
|
||||
if (!isRefresh) {
|
||||
|
@ -596,42 +618,37 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
private void getBasalProfiles() {
|
||||
|
||||
MedtronicUITask medtronicUITask = medtronicUIComm.executeCommand(MedtronicCommandType.GetBasalProfileSTD);
|
||||
MedtronicUITask medtronicUITask = rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.GetBasalProfileSTD);
|
||||
|
||||
if (medtronicUITask.getResponseType() == MedtronicUIResponseType.Error) {
|
||||
medtronicUIComm.executeCommand(MedtronicCommandType.GetBasalProfileSTD);
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.GetBasalProfileSTD);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isThisProfileSet(Profile profile) {
|
||||
MedtronicPumpStatus mdtPumpStatus = getMDTPumpStatus();
|
||||
aapsLogger.debug(LTag.PUMP, "isThisProfileSet: basalInitalized=" + mdtPumpStatus.basalProfileStatus);
|
||||
aapsLogger.debug(LTag.PUMP, "isThisProfileSet: basalInitalized=" + medtronicPumpStatus.basalProfileStatus);
|
||||
|
||||
if (!isInitialized)
|
||||
return true;
|
||||
|
||||
if (mdtPumpStatus.basalProfileStatus == BasalProfileStatus.NotInitialized) {
|
||||
if (medtronicPumpStatus.basalProfileStatus == BasalProfileStatus.NotInitialized) {
|
||||
// this shouldn't happen, but if there was problem we try again
|
||||
getBasalProfiles();
|
||||
return isProfileSame(profile);
|
||||
} else if (mdtPumpStatus.basalProfileStatus == BasalProfileStatus.ProfileChanged) {
|
||||
} else if (medtronicPumpStatus.basalProfileStatus == BasalProfileStatus.ProfileChanged) {
|
||||
return false;
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
|
||||
return (getMDTPumpStatus().basalProfileStatus != BasalProfileStatus.ProfileOK) || isProfileSame(profile);
|
||||
return (medtronicPumpStatus.basalProfileStatus != BasalProfileStatus.ProfileOK) || isProfileSame(profile);
|
||||
}
|
||||
|
||||
|
||||
private boolean isProfileSame(Profile profile) {
|
||||
|
||||
boolean invalid = false;
|
||||
Double[] basalsByHour = getMDTPumpStatus().basalsByHour;
|
||||
PumpType pumpType = getMDTPumpStatus().getPumpType();
|
||||
Double[] basalsByHour = medtronicPumpStatus.basalsByHour;
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "Current Basals (h): "
|
||||
+ (basalsByHour == null ? "null" : BasalProfile.getProfilesByHourToString(basalsByHour)));
|
||||
|
@ -645,11 +662,11 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
for (Profile.ProfileValue basalValue : profile.getBasalValues()) {
|
||||
|
||||
double basalValueValue = pumpType.determineCorrectBasalSize(basalValue.value);
|
||||
double basalValueValue = pumpDescription.pumpType.determineCorrectBasalSize(basalValue.value);
|
||||
|
||||
int hour = basalValue.timeAsSeconds / (60 * 60);
|
||||
|
||||
if (!MedtronicUtil.isSame(basalsByHour[hour], basalValueValue)) {
|
||||
if (!medtronicUtil.isSame(basalsByHour[hour], basalValueValue)) {
|
||||
invalid = true;
|
||||
}
|
||||
|
||||
|
@ -671,10 +688,9 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
@Override
|
||||
public long lastDataTime() {
|
||||
getMDTPumpStatus();
|
||||
|
||||
if (pumpStatusLocal.lastConnection != 0) {
|
||||
return pumpStatusLocal.lastConnection;
|
||||
if (medtronicPumpStatus.lastConnection != 0) {
|
||||
return medtronicPumpStatus.lastConnection;
|
||||
}
|
||||
|
||||
return System.currentTimeMillis();
|
||||
|
@ -683,33 +699,21 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
@Override
|
||||
public double getBaseBasalRate() {
|
||||
return getMDTPumpStatus().getBasalProfileForHour();
|
||||
return medtronicPumpStatus.getBasalProfileForHour();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double getReservoirLevel() {
|
||||
return getMDTPumpStatus().reservoirRemainingUnits;
|
||||
return medtronicPumpStatus.reservoirRemainingUnits;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getBatteryLevel() {
|
||||
return getMDTPumpStatus().batteryRemaining;
|
||||
return medtronicPumpStatus.batteryRemaining;
|
||||
}
|
||||
|
||||
|
||||
private MedtronicPumpStatus getMDTPumpStatus() {
|
||||
if (pumpStatusLocal == null) {
|
||||
// FIXME I don't know why this happens
|
||||
aapsLogger.warn(LTag.PUMP, "!!!! Reset Pump Status Local");
|
||||
pumpStatusLocal = MedtronicUtil.getPumpStatus();
|
||||
}
|
||||
|
||||
return pumpStatusLocal;
|
||||
}
|
||||
|
||||
|
||||
protected void triggerUIChange() {
|
||||
rxBus.send(new EventMedtronicPumpValuesChanged());
|
||||
}
|
||||
|
@ -736,16 +740,16 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
return;
|
||||
}
|
||||
|
||||
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
medtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
|
||||
medtronicUIComm.executeCommand(MedtronicCommandType.GetRealTimeClock);
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.GetRealTimeClock);
|
||||
|
||||
ClockDTO clock = MedtronicUtil.getPumpTime();
|
||||
ClockDTO clock = medtronicUtil.getPumpTime();
|
||||
|
||||
if (clock == null) { // retry
|
||||
medtronicUIComm.executeCommand(MedtronicCommandType.GetRealTimeClock);
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.GetRealTimeClock);
|
||||
|
||||
clock = MedtronicUtil.getPumpTime();
|
||||
clock = medtronicUtil.getPumpTime();
|
||||
}
|
||||
|
||||
if (clock == null)
|
||||
|
@ -759,7 +763,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
aapsLogger.info(LTag.PUMP, "MedtronicPumpPlugin::checkTimeAndOptionallySetTime - Time difference is {} s. Set time on pump." + timeDiff);
|
||||
|
||||
medtronicUIComm.executeCommand(MedtronicCommandType.SetRealTimeClock);
|
||||
rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.SetRealTimeClock);
|
||||
|
||||
if (clock.timeDifference == 0) {
|
||||
Notification notification = new Notification(Notification.INSIGHT_DATE_TIME_UPDATED, getResourceHelper().gs(R.string.pump_time_updated), Notification.INFO, 60);
|
||||
|
@ -768,7 +772,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
} else {
|
||||
if ((clock.localDeviceTime.getYear() > 2015)) {
|
||||
aapsLogger.error("MedtronicPumpPlugin::checkTimeAndOptionallySetTime - Time difference over 24h requested [diff={}]. Doing nothing." + timeDiff);
|
||||
sendNotification(MedtronicNotificationType.TimeChangeOver24h, getResourceHelper(), rxBus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.TimeChangeOver24h, getResourceHelper(), rxBus);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -787,14 +791,12 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
setRefreshButtonEnabled(false);
|
||||
|
||||
MedtronicPumpStatus mdtPumpStatus = getMDTPumpStatus();
|
||||
|
||||
if (detailedBolusInfo.insulin > mdtPumpStatus.reservoirRemainingUnits) {
|
||||
if (detailedBolusInfo.insulin > medtronicPumpStatus.reservoirRemainingUnits) {
|
||||
return new PumpEnactResult(getInjector()) //
|
||||
.success(false) //
|
||||
.enacted(false) //
|
||||
.comment(getResourceHelper().gs(R.string.medtronic_cmd_bolus_could_not_be_delivered_no_insulin,
|
||||
mdtPumpStatus.reservoirRemainingUnits,
|
||||
medtronicPumpStatus.reservoirRemainingUnits,
|
||||
detailedBolusInfo.insulin));
|
||||
}
|
||||
|
||||
|
@ -805,7 +807,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
return setNotReachable(true, false);
|
||||
}
|
||||
|
||||
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
medtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
|
||||
if (bolusDeliveryType == BolusDeliveryType.CancelDelivery) {
|
||||
// LOG.debug("MedtronicPumpPlugin::deliverBolus - Delivery Canceled.");
|
||||
|
@ -831,7 +833,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
// LOG.debug("MedtronicPumpPlugin::deliverBolus - Start delivery");
|
||||
|
||||
MedtronicUITask responseTask = medtronicUIComm.executeCommand(MedtronicCommandType.SetBolus,
|
||||
MedtronicUITask responseTask = rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.SetBolus,
|
||||
detailedBolusInfo.insulin);
|
||||
|
||||
Boolean response = (Boolean) responseTask.returnData;
|
||||
|
@ -870,7 +872,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
activePlugin.getActiveTreatments().addToHistoryTreatment(detailedBolusInfo, true);
|
||||
|
||||
// we subtract insulin, exact amount will be visible with next remainingInsulin update.
|
||||
getMDTPumpStatus().reservoirRemainingUnits -= detailedBolusInfo.insulin;
|
||||
medtronicPumpStatus.reservoirRemainingUnits -= detailedBolusInfo.insulin;
|
||||
|
||||
incrementStatistics(detailedBolusInfo.isSMB ? MedtronicConst.Statistics.SMBBoluses
|
||||
: MedtronicConst.Statistics.StandardBoluses);
|
||||
|
@ -956,9 +958,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
.comment(getResourceHelper().gs(R.string.medtronic_pump_status_pump_unreachable));
|
||||
}
|
||||
|
||||
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
|
||||
getMDTPumpStatus();
|
||||
medtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
|
||||
aapsLogger.info(LTag.PUMP, getLogPrefix() + "setTempBasalAbsolute: rate: " + absoluteRate + ", duration=" + durationInMinutes);
|
||||
|
||||
|
@ -976,10 +976,10 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
if (!enforceNew) {
|
||||
|
||||
if (MedtronicUtil.isSame(tbrCurrent.getInsulinRate(), absoluteRate)) {
|
||||
if (medtronicUtil.isSame(tbrCurrent.getInsulinRate(), absoluteRate)) {
|
||||
|
||||
boolean sameRate = true;
|
||||
if (MedtronicUtil.isSame(0.0d, absoluteRate) && durationInMinutes > 0) {
|
||||
if (medtronicUtil.isSame(0.0d, absoluteRate) && durationInMinutes > 0) {
|
||||
// if rate is 0.0 and duration>0 then the rate is not the same
|
||||
sameRate = false;
|
||||
}
|
||||
|
@ -999,7 +999,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
// CANCEL
|
||||
|
||||
MedtronicUITask responseTask2 = medtronicUIComm.executeCommand(MedtronicCommandType.CancelTBR);
|
||||
MedtronicUITask responseTask2 = rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.CancelTBR);
|
||||
|
||||
Boolean response = (Boolean) responseTask2.returnData;
|
||||
|
||||
|
@ -1016,7 +1016,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
}
|
||||
|
||||
// now start new TBR
|
||||
MedtronicUITask responseTask = medtronicUIComm.executeCommand(MedtronicCommandType.SetTemporaryBasal,
|
||||
MedtronicUITask responseTask = rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.SetTemporaryBasal,
|
||||
absoluteRate, durationInMinutes);
|
||||
|
||||
Boolean response = (Boolean) responseTask.returnData;
|
||||
|
@ -1025,9 +1025,9 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
if (response) {
|
||||
// FIXME put this into UIPostProcessor
|
||||
pumpStatusLocal.tempBasalStart = new Date();
|
||||
pumpStatusLocal.tempBasalAmount = absoluteRate;
|
||||
pumpStatusLocal.tempBasalLength = durationInMinutes;
|
||||
medtronicPumpStatus.tempBasalStart = new Date();
|
||||
medtronicPumpStatus.tempBasalAmount = absoluteRate;
|
||||
medtronicPumpStatus.tempBasalLength = durationInMinutes;
|
||||
|
||||
TemporaryBasal tempStart = new TemporaryBasal(getInjector()) //
|
||||
.date(System.currentTimeMillis()) //
|
||||
|
@ -1061,8 +1061,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
return setTempBasalAbsolute(0.0d, durationInMinutes, profile, enforceNew);
|
||||
} else {
|
||||
double absoluteValue = profile.getBasal() * (percent / 100.0d);
|
||||
getMDTPumpStatus();
|
||||
absoluteValue = pumpStatusLocal.pumpType.determineCorrectBasalSize(absoluteValue);
|
||||
absoluteValue = pumpDescription.pumpType.determineCorrectBasalSize(absoluteValue);
|
||||
aapsLogger.warn(LTag.PUMP, "setTempBasalPercent [MedtronicPumpPlugin] - You are trying to use setTempBasalPercent with percent other then 0% (" + percent + "). This will start setTempBasalAbsolute, with calculated value (" + absoluteValue + "). Result might not be 100% correct.");
|
||||
return setTempBasalAbsolute(absoluteValue, durationInMinutes, profile, enforceNew);
|
||||
}
|
||||
|
@ -1097,9 +1096,9 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
scheduleNextRefresh(MedtronicStatusRefreshType.PumpTime, -1);
|
||||
}
|
||||
|
||||
if (this.getMDTPumpStatus().basalProfileStatus != BasalProfileStatus.NotInitialized
|
||||
if (this.medtronicPumpStatus.basalProfileStatus != BasalProfileStatus.NotInitialized
|
||||
&& medtronicHistoryData.hasBasalProfileChanged()) {
|
||||
medtronicHistoryData.processLastBasalProfileChange(getMDTPumpStatus());
|
||||
medtronicHistoryData.processLastBasalProfileChange(pumpDescription.pumpType, medtronicPumpStatus);
|
||||
}
|
||||
|
||||
PumpDriverState previousState = this.pumpState;
|
||||
|
@ -1162,7 +1161,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
aapsLogger.debug(LTag.PUMP, getLogPrefix() + "readPumpHistoryLogic(): targetDate: " + targetDate);
|
||||
}
|
||||
} else {
|
||||
aapsLogger.debug(LTag.PUMP, getLogPrefix() + "readPumpHistoryLogic(): lastPumpHistoryEntry: not null - " + MedtronicUtil.gsonInstance.toJson(lastPumpHistoryEntry));
|
||||
aapsLogger.debug(LTag.PUMP, getLogPrefix() + "readPumpHistoryLogic(): lastPumpHistoryEntry: not null - " + medtronicUtil.gsonInstance.toJson(lastPumpHistoryEntry));
|
||||
medtronicHistoryData.setIsInInit(false);
|
||||
// medtronicHistoryData.setLastHistoryRecordTime(lastPumpHistoryEntry.atechDateTime);
|
||||
|
||||
|
@ -1171,7 +1170,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
aapsLogger.debug(LTag.PUMP, "HST: Target Date: " + targetDate);
|
||||
|
||||
MedtronicUITask responseTask2 = medtronicUIComm.executeCommand(MedtronicCommandType.GetHistoryData,
|
||||
MedtronicUITask responseTask2 = rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.GetHistoryData,
|
||||
lastPumpHistoryEntry, targetDate);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "HST: After task");
|
||||
|
@ -1247,7 +1246,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
switch (refreshType) {
|
||||
|
||||
case RemainingInsulin: {
|
||||
double remaining = pumpStatusLocal.reservoirRemainingUnits;
|
||||
double remaining = medtronicPumpStatus.reservoirRemainingUnits;
|
||||
int min;
|
||||
if (remaining > 50)
|
||||
min = 4 * 60;
|
||||
|
@ -1311,7 +1310,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
|
||||
private TempBasalPair readTBR() {
|
||||
MedtronicUITask responseTask = medtronicUIComm.executeCommand(MedtronicCommandType.ReadTemporaryBasal);
|
||||
MedtronicUITask responseTask = rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.ReadTemporaryBasal);
|
||||
|
||||
if (responseTask.hasData()) {
|
||||
TempBasalPair tbr = (TempBasalPair) responseTask.returnData;
|
||||
|
@ -1343,7 +1342,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
.comment(getResourceHelper().gs(R.string.medtronic_pump_status_pump_unreachable));
|
||||
}
|
||||
|
||||
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
medtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
setRefreshButtonEnabled(false);
|
||||
|
||||
TempBasalPair tbrCurrent = readTBR();
|
||||
|
@ -1361,7 +1360,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
.comment(getResourceHelper().gs(R.string.medtronic_cmd_cant_read_tbr));
|
||||
}
|
||||
|
||||
MedtronicUITask responseTask2 = medtronicUIComm.executeCommand(MedtronicCommandType.CancelTBR);
|
||||
MedtronicUITask responseTask2 = rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.CancelTBR);
|
||||
|
||||
Boolean response = (Boolean) responseTask2.returnData;
|
||||
|
||||
|
@ -1389,17 +1388,17 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
@NonNull @Override
|
||||
public ManufacturerType manufacturer() {
|
||||
return getMDTPumpStatus().pumpType.getManufacturer();
|
||||
return pumpDescription.pumpType.getManufacturer();
|
||||
}
|
||||
|
||||
@NonNull @Override
|
||||
public PumpType model() {
|
||||
return getMDTPumpStatus().pumpType;
|
||||
return pumpDescription.pumpType;
|
||||
}
|
||||
|
||||
@NonNull @Override
|
||||
public String serialNumber() {
|
||||
return getMDTPumpStatus().serialNumber;
|
||||
return medtronicPumpStatus.serialNumber;
|
||||
}
|
||||
|
||||
@NonNull @Override
|
||||
|
@ -1426,7 +1425,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
.comment(getResourceHelper().gs(R.string.medtronic_pump_status_pump_unreachable));
|
||||
}
|
||||
|
||||
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
medtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable, rxBus);
|
||||
|
||||
BasalProfile basalProfile = convertProfileToMedtronicProfile(profile);
|
||||
|
||||
|
@ -1439,7 +1438,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
.comment(getResourceHelper().gs(R.string.medtronic_cmd_set_profile_pattern_overflow, profileInvalid));
|
||||
}
|
||||
|
||||
MedtronicUITask responseTask = medtronicUIComm.executeCommand(MedtronicCommandType.SetBasalProfileSTD,
|
||||
MedtronicUITask responseTask = rileyLinkMedtronicService.getMedtronicUIComm().executeCommand(MedtronicCommandType.SetBasalProfileSTD,
|
||||
basalProfile);
|
||||
|
||||
Boolean response = (Boolean) responseTask.returnData;
|
||||
|
@ -1459,14 +1458,12 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
|
||||
MedtronicPumpStatus pumpStatus = getMDTPumpStatus();
|
||||
|
||||
if (pumpStatus.maxBasal == null)
|
||||
if (medtronicPumpStatus.maxBasal == null)
|
||||
return null;
|
||||
|
||||
for (BasalProfileEntry profileEntry : basalProfile.getEntries()) {
|
||||
|
||||
if (profileEntry.rate > pumpStatus.maxBasal) {
|
||||
if (profileEntry.rate > medtronicPumpStatus.maxBasal) {
|
||||
stringBuilder.append(profileEntry.startTime.toString("HH:mm"));
|
||||
stringBuilder.append("=");
|
||||
stringBuilder.append(profileEntry.rate);
|
||||
|
@ -1480,16 +1477,12 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
@NonNull
|
||||
private BasalProfile convertProfileToMedtronicProfile(Profile profile) {
|
||||
|
||||
MedtronicPumpStatus pumpStatus = getMDTPumpStatus();
|
||||
|
||||
PumpType pumpType = pumpStatus.pumpType;
|
||||
|
||||
BasalProfile basalProfile = new BasalProfile();
|
||||
BasalProfile basalProfile = new BasalProfile(aapsLogger);
|
||||
|
||||
for (int i = 0; i < 24; i++) {
|
||||
double rate = profile.getBasalTimeFromMidnight(i * 60 * 60);
|
||||
|
||||
double v = pumpType.determineCorrectBasalSize(rate);
|
||||
double v = pumpDescription.pumpType.determineCorrectBasalSize(rate);
|
||||
|
||||
BasalProfileEntry basalEntry = new BasalProfileEntry(v, i, 0);
|
||||
basalProfile.addEntry(basalEntry);
|
||||
|
@ -1536,8 +1529,8 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
switch (mcat) {
|
||||
|
||||
case WakeUpAndTune: {
|
||||
if (MedtronicUtil.getPumpStatus().verifyConfiguration()) {
|
||||
ServiceTaskExecutor.startTask(new WakeAndTuneTask());
|
||||
if (rileyLinkMedtronicService.verifyConfiguration()) {
|
||||
serviceTaskExecutor.startTask(new WakeAndTuneTask(getInjector()));
|
||||
} else {
|
||||
Intent i = new Intent(context, ErrorHelperActivity.class);
|
||||
i.putExtra("soundid", R.raw.boluserror);
|
||||
|
@ -1557,7 +1550,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
break;
|
||||
|
||||
case ResetRileyLinkConfiguration: {
|
||||
ServiceTaskExecutor.startTask(new ResetRileyLinkConfigurationTask());
|
||||
serviceTaskExecutor.startTask(new ResetRileyLinkConfigurationTask(getInjector()));
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1576,7 +1569,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
}
|
||||
|
||||
|
||||
public void setEnableCustomAction(MedtronicCustomActionType customAction, boolean isEnabled) {
|
||||
private void setEnableCustomAction(MedtronicCustomActionType customAction, boolean isEnabled) {
|
||||
|
||||
if (customAction == MedtronicCustomActionType.ClearBolusBlock) {
|
||||
this.customActionClearBolusBlock.setEnabled(isEnabled);
|
||||
|
@ -1586,6 +1579,4 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
|
|||
|
||||
refreshCustomActionsList();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -3,16 +3,18 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm;
|
|||
import android.os.SystemClock;
|
||||
|
||||
import org.joda.time.LocalDateTime;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RFSpy;
|
||||
|
@ -22,10 +24,12 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RLMe
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioPacket;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RadioResponse;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RLMessageType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.WakeAndTuneTask;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.RawHistoryPage;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.MedtronicPumpHistoryDecoder;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry;
|
||||
|
@ -45,8 +49,8 @@ import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.TempBasalPair;
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
|
||||
/**
|
||||
* Original file created by geoff on 5/30/16.
|
||||
|
@ -57,53 +61,43 @@ import info.nightscout.androidaps.utils.SP;
|
|||
*/
|
||||
public class MedtronicCommunicationManager extends RileyLinkCommunicationManager {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
private static final int MAX_COMMAND_TRIES = 3;
|
||||
private static final int DEFAULT_TIMEOUT = 2000;
|
||||
private static final long RILEYLINK_TIMEOUT = 15 * 60 * 1000; // 15 min
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject MedtronicPumpStatus medtronicPumpStatus;
|
||||
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
|
||||
@Inject MedtronicConverter medtronicConverter;
|
||||
@Inject MedtronicUtil medtronicUtil;
|
||||
@Inject MedtronicPumpHistoryDecoder medtronicPumpHistoryDecoder;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject ServiceTaskExecutor serviceTaskExecutor;
|
||||
|
||||
static MedtronicCommunicationManager medtronicCommunicationManager;
|
||||
String errorMessage;
|
||||
private MedtronicConverter medtronicConverter;
|
||||
private final int MAX_COMMAND_TRIES = 3;
|
||||
private final int DEFAULT_TIMEOUT = 2000;
|
||||
private final long RILEYLINK_TIMEOUT = 15 * 60 * 1000; // 15 min
|
||||
|
||||
private String errorMessage;
|
||||
private boolean debugSetCommands = false;
|
||||
|
||||
private MedtronicPumpHistoryDecoder pumpHistoryDecoder;
|
||||
private boolean doWakeUpBeforeCommand = true;
|
||||
|
||||
|
||||
public MedtronicCommunicationManager(RFSpy rfspy) {
|
||||
super(rfspy);
|
||||
medtronicCommunicationManager = this;
|
||||
this.medtronicConverter = new MedtronicConverter();
|
||||
this.pumpHistoryDecoder = new MedtronicPumpHistoryDecoder();
|
||||
MedtronicUtil.getPumpStatus().previousConnection = SP.getLong(
|
||||
public MedtronicCommunicationManager(HasAndroidInjector injector, RFSpy rfspy) {
|
||||
super(injector, rfspy);
|
||||
medtronicPumpStatus.previousConnection = sp.getLong(
|
||||
RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L);
|
||||
}
|
||||
|
||||
|
||||
public static MedtronicCommunicationManager getInstance() {
|
||||
return medtronicCommunicationManager;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void configurePumpSpecificSettings() {
|
||||
pumpStatus = MedtronicUtil.getPumpStatus();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public <E extends RLMessage> E createResponseMessage(byte[] payload, Class<E> clazz) {
|
||||
PumpMessage pumpMessage = new PumpMessage(payload);
|
||||
PumpMessage pumpMessage = new PumpMessage(aapsLogger, payload);
|
||||
return (E) pumpMessage;
|
||||
}
|
||||
|
||||
|
||||
public void setDoWakeUpBeforeCommand(boolean doWakeUp) {
|
||||
this.doWakeUpBeforeCommand = doWakeUp;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isDeviceReachable() {
|
||||
return isDeviceReachable(false);
|
||||
}
|
||||
|
@ -117,15 +111,14 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
*/
|
||||
public boolean isDeviceReachable(boolean canPreventTuneUp) {
|
||||
|
||||
PumpDeviceState state = MedtronicUtil.getPumpDeviceState();
|
||||
PumpDeviceState state = medtronicPumpStatus.getPumpDeviceState();
|
||||
|
||||
if (state != PumpDeviceState.PumpUnreachable)
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.WakingUp);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.WakingUp);
|
||||
|
||||
for (int retry = 0; retry < 5; retry++) {
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("isDeviceReachable. Waking pump... " + (retry != 0 ? " (retry " + retry + ")" : ""));
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "isDeviceReachable. Waking pump... " + (retry != 0 ? " (retry " + retry + ")" : ""));
|
||||
|
||||
boolean connected = connectToDevice();
|
||||
|
||||
|
@ -137,14 +130,14 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
}
|
||||
|
||||
if (state != PumpDeviceState.PumpUnreachable)
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.PumpUnreachable);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.PumpUnreachable);
|
||||
|
||||
if (!canPreventTuneUp) {
|
||||
|
||||
long diff = System.currentTimeMillis() - MedtronicUtil.getPumpStatus().lastConnection;
|
||||
long diff = System.currentTimeMillis() - medtronicPumpStatus.lastConnection;
|
||||
|
||||
if (diff > RILEYLINK_TIMEOUT) {
|
||||
ServiceTaskExecutor.startTask(new WakeAndTuneTask());
|
||||
serviceTaskExecutor.startTask(new WakeAndTuneTask(injector));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -154,18 +147,17 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
private boolean connectToDevice() {
|
||||
|
||||
PumpDeviceState state = MedtronicUtil.getPumpDeviceState();
|
||||
PumpDeviceState state = medtronicPumpStatus.getPumpDeviceState();
|
||||
|
||||
byte[] pumpMsgContent = createPumpMessageContent(RLMessageType.ReadSimpleData); // simple
|
||||
RFSpyResponse rfSpyResponse = rfspy.transmitThenReceive(new RadioPacket(pumpMsgContent), (byte) 0, (byte) 200,
|
||||
RFSpyResponse rfSpyResponse = rfspy.transmitThenReceive(new RadioPacket(injector, pumpMsgContent), (byte) 0, (byte) 200,
|
||||
(byte) 0, (byte) 0, 25000, (byte) 0);
|
||||
if (isLogEnabled())
|
||||
LOG.info("wakeup: raw response is " + ByteUtil.shortHexString(rfSpyResponse.getRaw()));
|
||||
aapsLogger.info(LTag.PUMPCOMM, "wakeup: raw response is " + ByteUtil.shortHexString(rfSpyResponse.getRaw()));
|
||||
|
||||
if (rfSpyResponse.wasTimeout()) {
|
||||
LOG.error("isDeviceReachable. Failed to find pump (timeout).");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "isDeviceReachable. Failed to find pump (timeout).");
|
||||
} else if (rfSpyResponse.looksLikeRadioPacket()) {
|
||||
RadioResponse radioResponse = new RadioResponse();
|
||||
RadioResponse radioResponse = new RadioResponse(injector);
|
||||
|
||||
try {
|
||||
|
||||
|
@ -176,30 +168,29 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
PumpMessage pumpResponse = createResponseMessage(radioResponse.getPayload(), PumpMessage.class);
|
||||
|
||||
if (!pumpResponse.isValid()) {
|
||||
LOG.warn("Response is invalid ! [interrupted={}, timeout={}]", rfSpyResponse.wasInterrupted(),
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Response is invalid ! [interrupted={}, timeout={}]", rfSpyResponse.wasInterrupted(),
|
||||
rfSpyResponse.wasTimeout());
|
||||
} else {
|
||||
|
||||
// radioResponse.rssi;
|
||||
Object dataResponse = medtronicConverter.convertResponse(MedtronicCommandType.PumpModel,
|
||||
Object dataResponse = medtronicConverter.convertResponse(medtronicPumpPlugin.getPumpDescription().pumpType, MedtronicCommandType.PumpModel,
|
||||
pumpResponse.getRawContent());
|
||||
|
||||
MedtronicDeviceType pumpModel = (MedtronicDeviceType) dataResponse;
|
||||
boolean valid = (pumpModel != MedtronicDeviceType.Unknown_Device);
|
||||
|
||||
if (MedtronicUtil.getMedtronicPumpModel() == null && valid) {
|
||||
MedtronicUtil.setMedtronicPumpModel(pumpModel);
|
||||
if (medtronicUtil.getMedtronicPumpModel() == null && valid) {
|
||||
medtronicUtil.setMedtronicPumpModel(pumpModel);
|
||||
}
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("isDeviceReachable. PumpModel is {} - Valid: {} (rssi={})", pumpModel.name(), valid,
|
||||
radioResponse.rssi);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "isDeviceReachable. PumpModel is {} - Valid: {} (rssi={})", pumpModel.name(), valid,
|
||||
radioResponse.rssi);
|
||||
|
||||
if (valid) {
|
||||
if (state == PumpDeviceState.PumpUnreachable)
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.WakingUp);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.WakingUp);
|
||||
else
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
|
||||
rememberLastGoodDeviceCommunicationTime();
|
||||
|
||||
|
@ -207,23 +198,23 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
} else {
|
||||
if (state != PumpDeviceState.PumpUnreachable)
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.PumpUnreachable);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.PumpUnreachable);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
LOG.warn("isDeviceReachable. Failed to parse radio response: "
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "isDeviceReachable. Failed to parse radio response: "
|
||||
+ ByteUtil.shortHexString(rfSpyResponse.getRaw()));
|
||||
}
|
||||
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
LOG.warn("isDeviceReachable. Failed to decode radio response: "
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "isDeviceReachable. Failed to decode radio response: "
|
||||
+ ByteUtil.shortHexString(rfSpyResponse.getRaw()));
|
||||
}
|
||||
|
||||
} else {
|
||||
LOG.warn("isDeviceReachable. Unknown response: " + ByteUtil.shortHexString(rfSpyResponse.getRaw()));
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "isDeviceReachable. Unknown response: " + ByteUtil.shortHexString(rfSpyResponse.getRaw()));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -239,7 +230,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
private PumpMessage runCommandWithArgs(PumpMessage msg) throws RileyLinkCommunicationException {
|
||||
|
||||
if (debugSetCommands)
|
||||
LOG.debug("Run command with Args: ");
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Run command with Args: ");
|
||||
|
||||
PumpMessage rval;
|
||||
PumpMessage shortMessage = makePumpMessage(msg.commandType, new CarelinkShortMessageBody(new byte[]{0}));
|
||||
|
@ -247,17 +238,16 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
PumpMessage shortResponse = sendAndListen(shortMessage);
|
||||
if (shortResponse.commandType == MedtronicCommandType.CommandACK) {
|
||||
if (debugSetCommands)
|
||||
LOG.debug("Run command with Args: Got ACK response");
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Run command with Args: Got ACK response");
|
||||
|
||||
rval = sendAndListen(msg);
|
||||
if (debugSetCommands)
|
||||
LOG.debug("2nd Response: {}", rval);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "2nd Response: {}", rval);
|
||||
|
||||
return rval;
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.error("runCommandWithArgs: Pump did not ack Attention packet");
|
||||
return new PumpMessage("No ACK after Attention packet.");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "runCommandWithArgs: Pump did not ack Attention packet");
|
||||
return new PumpMessage(aapsLogger, "No ACK after Attention packet.");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -265,8 +255,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
private PumpMessage runCommandWithFrames(MedtronicCommandType commandType, List<List<Byte>> frames)
|
||||
throws RileyLinkCommunicationException {
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Run command with Frames: {}", commandType.name());
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Run command with Frames: {}", commandType.name());
|
||||
|
||||
PumpMessage rval = null;
|
||||
PumpMessage shortMessage = makePumpMessage(commandType, new CarelinkShortMessageBody(new byte[]{0}));
|
||||
|
@ -274,39 +263,36 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
PumpMessage shortResponse = sendAndListen(shortMessage);
|
||||
|
||||
if (shortResponse.commandType != MedtronicCommandType.CommandACK) {
|
||||
if (isLogEnabled())
|
||||
LOG.error("runCommandWithFrames: Pump did not ack Attention packet");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "runCommandWithFrames: Pump did not ack Attention packet");
|
||||
|
||||
return new PumpMessage("No ACK after start message.");
|
||||
return new PumpMessage(aapsLogger, "No ACK after start message.");
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Run command with Frames: Got ACK response for Attention packet");
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Run command with Frames: Got ACK response for Attention packet");
|
||||
}
|
||||
|
||||
int frameNr = 1;
|
||||
|
||||
for (List<Byte> frame : frames) {
|
||||
|
||||
byte[] frameData = MedtronicUtil.createByteArray(frame);
|
||||
byte[] frameData = medtronicUtil.createByteArray(frame);
|
||||
|
||||
// LOG.debug("Frame {} data:\n{}", frameNr, ByteUtil.getCompactString(frameData));
|
||||
// aapsLogger.debug(LTag.PUMPCOMM,"Frame {} data:\n{}", frameNr, ByteUtil.getCompactString(frameData));
|
||||
|
||||
PumpMessage msg = makePumpMessage(commandType, new CarelinkLongMessageBody(frameData));
|
||||
|
||||
rval = sendAndListen(msg);
|
||||
|
||||
// LOG.debug("PumpResponse: " + rval);
|
||||
// aapsLogger.debug(LTag.PUMPCOMM,"PumpResponse: " + rval);
|
||||
|
||||
if (rval.commandType != MedtronicCommandType.CommandACK) {
|
||||
LOG.error("runCommandWithFrames: Pump did not ACK frame #{}", frameNr);
|
||||
aapsLogger.error(LTag.PUMPCOMM, "runCommandWithFrames: Pump did not ACK frame #{}", frameNr);
|
||||
|
||||
LOG.error("Run command with Frames FAILED (command={}, response={})", commandType.name(),
|
||||
aapsLogger.error(LTag.PUMPCOMM, "Run command with Frames FAILED (command={}, response={})", commandType.name(),
|
||||
rval.toString());
|
||||
|
||||
return new PumpMessage("No ACK after frame #" + frameNr);
|
||||
return new PumpMessage(aapsLogger, "No ACK after frame #" + frameNr);
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Run command with Frames: Got ACK response for frame #{}", (frameNr));
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Run command with Frames: Got ACK response for frame #{}", (frameNr));
|
||||
}
|
||||
|
||||
frameNr++;
|
||||
|
@ -319,34 +305,32 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
public PumpHistoryResult getPumpHistory(PumpHistoryEntry lastEntry, LocalDateTime targetDate) {
|
||||
|
||||
PumpHistoryResult pumpTotalResult = new PumpHistoryResult(lastEntry, targetDate == null ? null
|
||||
PumpHistoryResult pumpTotalResult = new PumpHistoryResult(aapsLogger, lastEntry, targetDate == null ? null
|
||||
: DateTimeUtil.toATechDate(targetDate));
|
||||
|
||||
if (doWakeUpBeforeCommand)
|
||||
wakeUp(receiverDeviceAwakeForMinutes, false);
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Current command: " + MedtronicUtil.getCurrentCommand());
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Current command: " + medtronicUtil.getCurrentCommand());
|
||||
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Active);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Active);
|
||||
boolean doneWithError = false;
|
||||
|
||||
for (int pageNumber = 0; pageNumber < 5; pageNumber++) {
|
||||
|
||||
RawHistoryPage rawHistoryPage = new RawHistoryPage();
|
||||
RawHistoryPage rawHistoryPage = new RawHistoryPage(aapsLogger);
|
||||
// wakeUp(receiverDeviceAwakeForMinutes, false);
|
||||
PumpMessage getHistoryMsg = makePumpMessage(MedtronicCommandType.GetHistoryData,
|
||||
new GetHistoryPageCarelinkMessageBody(pageNumber));
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.info("getPumpHistory: Page {}", pageNumber);
|
||||
// LOG.info("getPumpHistoryPage("+pageNumber+"): "+ByteUtil.shortHexString(getHistoryMsg.getTxData()));
|
||||
aapsLogger.info(LTag.PUMPCOMM, "getPumpHistory: Page {}", pageNumber);
|
||||
// aapsLogger.info(LTag.PUMPCOMM,"getPumpHistoryPage("+pageNumber+"): "+ByteUtil.shortHexString(getHistoryMsg.getTxData()));
|
||||
// Ask the pump to transfer history (we get first frame?)
|
||||
|
||||
PumpMessage firstResponse = null;
|
||||
boolean failed = false;
|
||||
|
||||
MedtronicUtil.setCurrentCommand(MedtronicCommandType.GetHistoryData, pageNumber, null);
|
||||
medtronicUtil.setCurrentCommand(MedtronicCommandType.GetHistoryData, pageNumber, null);
|
||||
|
||||
for (int retries = 0; retries < MAX_COMMAND_TRIES; retries++) {
|
||||
|
||||
|
@ -355,18 +339,17 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
failed = false;
|
||||
break;
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
if (isLogEnabled())
|
||||
LOG.error("First call for PumpHistory failed (retry={})", retries);
|
||||
aapsLogger.error(LTag.PUMPCOMM, "First call for PumpHistory failed (retry={})", retries);
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
return pumpTotalResult;
|
||||
}
|
||||
|
||||
// LOG.info("getPumpHistoryPage("+pageNumber+"): " + ByteUtil.shortHexString(firstResponse.getContents()));
|
||||
// aapsLogger.info(LTag.PUMPCOMM,"getPumpHistoryPage("+pageNumber+"): " + ByteUtil.shortHexString(firstResponse.getContents()));
|
||||
|
||||
PumpMessage ackMsg = makePumpMessage(MedtronicCommandType.CommandACK, new PumpAckMessageBody());
|
||||
GetHistoryPageCarelinkMessageBody currentResponse = new GetHistoryPageCarelinkMessageBody(firstResponse
|
||||
|
@ -383,19 +366,17 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
&& currentResponse.getFrameNumber() == expectedFrameNum) {
|
||||
// success! got a frame.
|
||||
if (frameData.length != 64) {
|
||||
if (isLogEnabled())
|
||||
LOG.warn("Expected frame of length 64, got frame of length " + frameData.length);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Expected frame of length 64, got frame of length " + frameData.length);
|
||||
// but append it anyway?
|
||||
}
|
||||
// handle successful frame data
|
||||
rawHistoryPage.appendData(currentResponse.getFrameData());
|
||||
// RileyLinkMedtronicService.getInstance().announceProgress(((100 / 16) *
|
||||
// currentResponse.getFrameNumber() + 1));
|
||||
MedtronicUtil.setCurrentCommand(MedtronicCommandType.GetHistoryData, pageNumber,
|
||||
medtronicUtil.setCurrentCommand(MedtronicCommandType.GetHistoryData, pageNumber,
|
||||
currentResponse.getFrameNumber());
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.info("getPumpHistory: Got frame {} of Page {}", currentResponse.getFrameNumber(), pageNumber);
|
||||
aapsLogger.info(LTag.PUMPCOMM, "getPumpHistory: Got frame {} of Page {}", currentResponse.getFrameNumber(), pageNumber);
|
||||
// Do we need to ask for the next frame?
|
||||
if (expectedFrameNum < 16) { // This number may not be correct for pumps other than 522/722
|
||||
expectedFrameNum++;
|
||||
|
@ -404,22 +385,18 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
}
|
||||
} else {
|
||||
if (frameData == null) {
|
||||
if (isLogEnabled())
|
||||
LOG.error("null frame data, retrying");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "null frame data, retrying");
|
||||
} else if (currentResponse.getFrameNumber() != expectedFrameNum) {
|
||||
if (isLogEnabled())
|
||||
LOG.warn("Expected frame number {}, received {} (retrying)", expectedFrameNum,
|
||||
currentResponse.getFrameNumber());
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Expected frame number {}, received {} (retrying)", expectedFrameNum,
|
||||
currentResponse.getFrameNumber());
|
||||
} else if (frameData.length == 0) {
|
||||
if (isLogEnabled())
|
||||
LOG.warn("Frame has zero length, retrying");
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Frame has zero length, retrying");
|
||||
}
|
||||
failures++;
|
||||
if (failures == 6) {
|
||||
if (isLogEnabled())
|
||||
LOG.error(
|
||||
"getPumpHistory: 6 failures in attempting to download frame {} of page {}, giving up.",
|
||||
expectedFrameNum, pageNumber);
|
||||
aapsLogger.error(LTag.PUMPCOMM,
|
||||
"getPumpHistory: 6 failures in attempting to download frame {} of page {}, giving up.",
|
||||
expectedFrameNum, pageNumber);
|
||||
done = true; // failure completion.
|
||||
doneWithError = true;
|
||||
}
|
||||
|
@ -435,59 +412,52 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
nextMsg = sendAndListen(ackMsg);
|
||||
break;
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
if (isLogEnabled())
|
||||
LOG.error("Problem acknowledging frame response. (retry={})", retries);
|
||||
aapsLogger.error(LTag.PUMPCOMM, "Problem acknowledging frame response. (retry={})", retries);
|
||||
}
|
||||
}
|
||||
|
||||
if (nextMsg != null)
|
||||
currentResponse = new GetHistoryPageCarelinkMessageBody(nextMsg.getMessageBody().getTxData());
|
||||
else {
|
||||
if (isLogEnabled())
|
||||
LOG.error("We couldn't acknowledge frame from pump, aborting operation.");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "We couldn't acknowledge frame from pump, aborting operation.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (rawHistoryPage.getLength() != 1024) {
|
||||
if (isLogEnabled())
|
||||
LOG.warn("getPumpHistory: short page. Expected length of 1024, found length of "
|
||||
+ rawHistoryPage.getLength());
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "getPumpHistory: short page. Expected length of 1024, found length of "
|
||||
+ rawHistoryPage.getLength());
|
||||
doneWithError = true;
|
||||
}
|
||||
|
||||
if (!rawHistoryPage.isChecksumOK()) {
|
||||
if (isLogEnabled())
|
||||
LOG.error("getPumpHistory: checksum is wrong");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "getPumpHistory: checksum is wrong");
|
||||
doneWithError = true;
|
||||
}
|
||||
|
||||
if (doneWithError) {
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
return pumpTotalResult;
|
||||
}
|
||||
|
||||
rawHistoryPage.dumpToDebug();
|
||||
|
||||
List<PumpHistoryEntry> medtronicHistoryEntries = pumpHistoryDecoder
|
||||
.processPageAndCreateRecords(rawHistoryPage);
|
||||
List<PumpHistoryEntry> medtronicHistoryEntries = medtronicPumpHistoryDecoder.processPageAndCreateRecords(rawHistoryPage);
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("getPumpHistory: Found {} history entries.", medtronicHistoryEntries.size());
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "getPumpHistory: Found {} history entries.", medtronicHistoryEntries.size());
|
||||
|
||||
pumpTotalResult.addHistoryEntries(medtronicHistoryEntries, pageNumber);
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("getPumpHistory: Search status: Search finished: {}", pumpTotalResult.isSearchFinished());
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "getPumpHistory: Search status: Search finished: {}", pumpTotalResult.isSearchFinished());
|
||||
|
||||
if (pumpTotalResult.isSearchFinished()) {
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
|
||||
return pumpTotalResult;
|
||||
}
|
||||
}
|
||||
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
|
||||
return pumpTotalResult;
|
||||
|
||||
|
@ -503,11 +473,11 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
public byte[] createPumpMessageContent(RLMessageType type) {
|
||||
switch (type) {
|
||||
case PowerOn:
|
||||
return MedtronicUtil.buildCommandPayload(MedtronicCommandType.RFPowerOn, //
|
||||
return medtronicUtil.buildCommandPayload(rileyLinkServiceData, MedtronicCommandType.RFPowerOn, //
|
||||
new byte[]{2, 1, (byte) receiverDeviceAwakeForMinutes}); // maybe this is better FIXME
|
||||
|
||||
case ReadSimpleData:
|
||||
return MedtronicUtil.buildCommandPayload(MedtronicCommandType.PumpModel, null);
|
||||
return medtronicUtil.buildCommandPayload(rileyLinkServiceData, MedtronicCommandType.PumpModel, null);
|
||||
}
|
||||
return new byte[0];
|
||||
}
|
||||
|
@ -525,7 +495,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
|
||||
private PumpMessage makePumpMessage(MedtronicCommandType messageType, MessageBody messageBody) {
|
||||
PumpMessage msg = new PumpMessage();
|
||||
PumpMessage msg = new PumpMessage(aapsLogger);
|
||||
msg.init(PacketType.Carelink, rileyLinkServiceData.pumpIDBytes, messageType, messageBody);
|
||||
return msg;
|
||||
}
|
||||
|
@ -551,7 +521,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
if (doWakeUpBeforeCommand)
|
||||
wakeUp(receiverDeviceAwakeForMinutes, false);
|
||||
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Active);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Active);
|
||||
|
||||
// create message
|
||||
PumpMessage msg;
|
||||
|
@ -564,7 +534,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
// send and wait for response
|
||||
PumpMessage response = sendAndListen(msg, timeoutMs);
|
||||
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
@ -589,27 +559,22 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
private Object sendAndGetResponseWithCheck(MedtronicCommandType commandType, byte[] bodyData) {
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("getDataFromPump: {}", commandType);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "getDataFromPump: {}", commandType);
|
||||
|
||||
for (int retries = 0; retries < MAX_COMMAND_TRIES; retries++) {
|
||||
|
||||
try {
|
||||
PumpMessage response = null;
|
||||
PumpMessage response = sendAndGetResponse(commandType, bodyData, DEFAULT_TIMEOUT + (DEFAULT_TIMEOUT * retries));
|
||||
|
||||
response = sendAndGetResponse(commandType, bodyData, DEFAULT_TIMEOUT + (DEFAULT_TIMEOUT * retries));
|
||||
|
||||
String check = checkResponseContent(response, commandType.commandDescription,
|
||||
commandType.expectedLength);
|
||||
String check = checkResponseContent(response, commandType.commandDescription, commandType.expectedLength);
|
||||
|
||||
if (check == null) {
|
||||
|
||||
Object dataResponse = medtronicConverter.convertResponse(commandType, response.getRawContent());
|
||||
Object dataResponse = medtronicConverter.convertResponse(medtronicPumpPlugin.getPumpDescription().pumpType, commandType, response.getRawContent());
|
||||
|
||||
if (dataResponse != null) {
|
||||
this.errorMessage = null;
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Converted response for {} is {}.", commandType.name(), dataResponse);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Converted response for {} is {}.", commandType.name(), dataResponse);
|
||||
|
||||
return dataResponse;
|
||||
} else {
|
||||
|
@ -621,8 +586,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
}
|
||||
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
if (isLogEnabled())
|
||||
LOG.warn("Error getting response from RileyLink (error={}, retry={})", e.getMessage(), retries + 1);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Error getting response from RileyLink (error={}, retry={})", e.getMessage(), retries + 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -635,8 +599,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
if (!response.isValid()) {
|
||||
String responseData = String.format("%s: Invalid response.", method);
|
||||
if (isLogEnabled())
|
||||
LOG.warn(responseData);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, responseData);
|
||||
return responseData;
|
||||
}
|
||||
|
||||
|
@ -644,7 +607,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
if (contents != null) {
|
||||
if (contents.length >= expectedLength) {
|
||||
LOG.trace("{}: Content: {}", method, ByteUtil.shortHexString(contents));
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "{}: Content: {}", method, ByteUtil.shortHexString(contents));
|
||||
return null;
|
||||
|
||||
} else {
|
||||
|
@ -652,13 +615,12 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
"%s: Cannot return data. Data is too short [expected=%s, received=%s].", method, ""
|
||||
+ expectedLength, "" + contents.length);
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.warn(responseData);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, responseData);
|
||||
return responseData;
|
||||
}
|
||||
} else {
|
||||
String responseData = String.format("%s: Cannot return data. Null response.", method);
|
||||
LOG.warn(responseData);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, responseData);
|
||||
return responseData;
|
||||
}
|
||||
}
|
||||
|
@ -690,12 +652,11 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
MedtronicCommandType commandType = MedtronicCommandType.GetBasalProfileSTD;
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("getDataFromPump: {}", commandType);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "getDataFromPump: {}", commandType);
|
||||
|
||||
MedtronicUtil.setCurrentCommand(commandType);
|
||||
medtronicUtil.setCurrentCommand(commandType);
|
||||
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Active);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Active);
|
||||
|
||||
for (int retries = 0; retries <= MAX_COMMAND_TRIES; retries++) {
|
||||
|
||||
|
@ -706,12 +667,11 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
msg = makePumpMessage(commandType);
|
||||
|
||||
// send and wait for response
|
||||
PumpMessage response = null;
|
||||
|
||||
response = sendAndListen(msg, DEFAULT_TIMEOUT + (DEFAULT_TIMEOUT * retries));
|
||||
PumpMessage response = sendAndListen(msg, DEFAULT_TIMEOUT + (DEFAULT_TIMEOUT * retries));
|
||||
|
||||
// LOG.debug("1st Response: " + HexDump.toHexStringDisplayable(response.getRawContent()));
|
||||
// LOG.debug("1st Response: " + HexDump.toHexStringDisplayable(response.getMessageBody().getTxData()));
|
||||
// aapsLogger.debug(LTag.PUMPCOMM,"1st Response: " + HexDump.toHexStringDisplayable(response.getRawContent()));
|
||||
// aapsLogger.debug(LTag.PUMPCOMM,"1st Response: " + HexDump.toHexStringDisplayable(response.getMessageBody().getTxData()));
|
||||
|
||||
String check = checkResponseContent(response, commandType.commandDescription, 1);
|
||||
|
||||
|
@ -727,8 +687,8 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
response = sendAndListen(ackMsg, DEFAULT_TIMEOUT + (DEFAULT_TIMEOUT * retries));
|
||||
|
||||
// LOG.debug("{} Response: {}", runs, HexDump.toHexStringDisplayable(response2.getRawContent()));
|
||||
// LOG.debug("{} Response: {}", runs,
|
||||
// aapsLogger.debug(LTag.PUMPCOMM,"{} Response: {}", runs, HexDump.toHexStringDisplayable(response2.getRawContent()));
|
||||
// aapsLogger.debug(LTag.PUMPCOMM,"{} Response: {}", runs,
|
||||
// HexDump.toHexStringDisplayable(response2.getMessageBody().getTxData()));
|
||||
|
||||
String check2 = checkResponseContent(response, commandType.commandDescription, 1);
|
||||
|
@ -739,7 +699,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
} else {
|
||||
this.errorMessage = check2;
|
||||
LOG.error("Error with response got GetProfile: " + check2);
|
||||
aapsLogger.error(LTag.PUMPCOMM, "Error with response got GetProfile: " + check2);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -747,26 +707,25 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
errorMessage = check;
|
||||
}
|
||||
|
||||
BasalProfile basalProfile = (BasalProfile) medtronicConverter.convertResponse(commandType, data);
|
||||
BasalProfile basalProfile = (BasalProfile) medtronicConverter.convertResponse(medtronicPumpPlugin.getPumpDescription().pumpType, commandType, data);
|
||||
|
||||
if (basalProfile != null) {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Converted response for {} is {}.", commandType.name(), basalProfile);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Converted response for {} is {}.", commandType.name(), basalProfile);
|
||||
|
||||
MedtronicUtil.setCurrentCommand(null);
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
medtronicUtil.setCurrentCommand(null);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
|
||||
return basalProfile;
|
||||
}
|
||||
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
LOG.error("Error getting response from RileyLink (error={}, retry={})", e.getMessage(), retries + 1);
|
||||
aapsLogger.error(LTag.PUMPCOMM, "Error getting response from RileyLink (error={}, retry={})", e.getMessage(), retries + 1);
|
||||
}
|
||||
}
|
||||
|
||||
LOG.warn("Error reading profile in max retries.");
|
||||
MedtronicUtil.setCurrentCommand(null);
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Error reading profile in max retries.");
|
||||
medtronicUtil.setCurrentCommand(null);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.Sleeping);
|
||||
|
||||
return null;
|
||||
|
||||
|
@ -782,7 +741,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
int last = responseRaw.length - 1;
|
||||
|
||||
LOG.debug("Length: " + data.length);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Length: " + data.length);
|
||||
|
||||
if (data.length >= BasalProfile.MAX_RAW_DATA_SIZE) {
|
||||
return false;
|
||||
|
@ -825,7 +784,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
public Map<String, PumpSettingDTO> getPumpSettings() {
|
||||
|
||||
Object responseObject = sendAndGetResponseWithCheck(MedtronicCommandType.getSettings(MedtronicUtil
|
||||
Object responseObject = sendAndGetResponseWithCheck(MedtronicCommandType.getSettings(medtronicUtil
|
||||
.getMedtronicPumpModel()));
|
||||
|
||||
return responseObject == null ? null : (Map<String, PumpSettingDTO>) responseObject;
|
||||
|
@ -834,18 +793,16 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
public Boolean setBolus(double units) {
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.info("setBolus: " + units);
|
||||
aapsLogger.info(LTag.PUMPCOMM, "setBolus: " + units);
|
||||
|
||||
return setCommand(MedtronicCommandType.SetBolus, MedtronicUtil.getBolusStrokes(units));
|
||||
return setCommand(MedtronicCommandType.SetBolus, medtronicUtil.getBolusStrokes(units));
|
||||
|
||||
}
|
||||
|
||||
|
||||
public boolean setTBR(TempBasalPair tbr) {
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.info("setTBR: " + tbr.getDescription());
|
||||
aapsLogger.info(LTag.PUMPCOMM, "setTBR: " + tbr.getDescription());
|
||||
|
||||
return setCommand(MedtronicCommandType.SetTemporaryBasal, tbr.getAsRawData());
|
||||
}
|
||||
|
@ -856,8 +813,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
GregorianCalendar gc = new GregorianCalendar();
|
||||
gc.add(Calendar.SECOND, 5);
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.info("setPumpTime: " + DateTimeUtil.toString(gc));
|
||||
aapsLogger.info(LTag.PUMPCOMM, "setPumpTime: " + DateTimeUtil.toString(gc));
|
||||
|
||||
int i = 1;
|
||||
byte[] data = new byte[8];
|
||||
|
@ -866,7 +822,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
data[i + 1] = (byte) gc.get(Calendar.MINUTE);
|
||||
data[i + 2] = (byte) gc.get(Calendar.SECOND);
|
||||
|
||||
byte[] yearByte = MedtronicUtil.getByteArrayFromUnsignedShort(gc.get(Calendar.YEAR), true);
|
||||
byte[] yearByte = medtronicUtil.getByteArrayFromUnsignedShort(gc.get(Calendar.YEAR), true);
|
||||
|
||||
data[i + 3] = yearByte[0];
|
||||
data[i + 4] = yearByte[1];
|
||||
|
@ -874,7 +830,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
data[i + 5] = (byte) (gc.get(Calendar.MONTH) + 1);
|
||||
data[i + 6] = (byte) gc.get(Calendar.DAY_OF_MONTH);
|
||||
|
||||
//LOG.info("setPumpTime: Body: " + ByteUtil.getHex(data));
|
||||
//aapsLogger.info(LTag.PUMPCOMM,"setPumpTime: Body: " + ByteUtil.getHex(data));
|
||||
|
||||
return setCommand(MedtronicCommandType.SetRealTimeClock, data);
|
||||
|
||||
|
@ -890,7 +846,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
wakeUp(false);
|
||||
|
||||
if (debugSetCommands)
|
||||
LOG.debug("{}: Body - {}", commandType.getCommandDescription(),
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "{}: Body - {}", commandType.getCommandDescription(),
|
||||
ByteUtil.getHex(body));
|
||||
|
||||
PumpMessage msg = makePumpMessage(commandType, new CarelinkLongMessageBody(body));
|
||||
|
@ -898,17 +854,16 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
PumpMessage pumpMessage = runCommandWithArgs(msg);
|
||||
|
||||
if (debugSetCommands)
|
||||
LOG.debug("{}: {}", commandType.getCommandDescription(), pumpMessage.getResponseContent());
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "{}: {}", commandType.getCommandDescription(), pumpMessage.getResponseContent());
|
||||
|
||||
if (pumpMessage.commandType == MedtronicCommandType.CommandACK) {
|
||||
return true;
|
||||
} else {
|
||||
LOG.warn("We received non-ACK response from pump: {}", pumpMessage.getResponseContent());
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "We received non-ACK response from pump: {}", pumpMessage.getResponseContent());
|
||||
}
|
||||
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
if (isLogEnabled())
|
||||
LOG.warn("Error getting response from RileyLink (error={}, retry={})", e.getMessage(), retries + 1);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Error getting response from RileyLink (error={}, retry={})", e.getMessage(), retries + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -931,7 +886,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
|
||||
public Boolean setBasalProfile(BasalProfile basalProfile) {
|
||||
|
||||
List<List<Byte>> basalProfileFrames = MedtronicUtil.getBasalProfileFrames(basalProfile.getRawData());
|
||||
List<List<Byte>> basalProfileFrames = medtronicUtil.getBasalProfileFrames(basalProfile.getRawData());
|
||||
|
||||
for (int retries = 0; retries <= MAX_COMMAND_TRIES; retries++) {
|
||||
|
||||
|
@ -944,23 +899,20 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
|
|||
return true;
|
||||
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
LOG.warn("Error getting response from RileyLink (error={}, retry={})", e.getMessage(), retries + 1);
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Error getting response from RileyLink (error={}, retry={})", e.getMessage(), retries + 1);
|
||||
}
|
||||
|
||||
if (responseMessage != null)
|
||||
LOG.warn("Set Basal Profile: Invalid response: commandType={},rawData={}", responseMessage.commandType, ByteUtil.shortHexString(responseMessage.getRawContent()));
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Set Basal Profile: Invalid response: commandType={},rawData={}", responseMessage.commandType, ByteUtil.shortHexString(responseMessage.getRawContent()));
|
||||
else
|
||||
LOG.warn("Set Basal Profile: Null response.");
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Set Basal Profile: Null response.");
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPCOMM);
|
||||
@Override public PumpStatus getPumpStatus() {
|
||||
return medtronicPumpStatus;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -2,14 +2,16 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm;
|
|||
|
||||
import org.joda.time.IllegalFieldValueException;
|
||||
import org.joda.time.LocalDateTime;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BasalProfile;
|
||||
|
@ -26,25 +28,30 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
|||
* High level decoder for data returned through MedtroniUIComm
|
||||
*/
|
||||
|
||||
@Singleton
|
||||
public class MedtronicConverter {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
private final MedtronicUtil medtronicUtil;
|
||||
|
||||
MedtronicDeviceType pumpModel;
|
||||
@Inject
|
||||
public MedtronicConverter(
|
||||
AAPSLogger aapsLogger,
|
||||
MedtronicUtil medtronicUtil
|
||||
) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
this.medtronicUtil = medtronicUtil;
|
||||
}
|
||||
|
||||
|
||||
public Object convertResponse(MedtronicCommandType commandType, byte[] rawContent) {
|
||||
Object convertResponse(PumpType pumpType, MedtronicCommandType commandType, byte[] rawContent) {
|
||||
|
||||
if ((rawContent == null || rawContent.length < 1) && commandType != MedtronicCommandType.PumpModel) {
|
||||
LOG.warn("Content is empty or too short, no data to convert (type={},isNull={},length={})",
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Content is empty or too short, no data to convert (type={},isNull={},length={})",
|
||||
commandType.name(), rawContent == null, rawContent == null ? "-" : rawContent.length);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Raw response before convert: " + ByteUtil.shortHexString(rawContent));
|
||||
|
||||
this.pumpModel = MedtronicUtil.getMedtronicPumpModel();
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Raw response before convert: " + ByteUtil.shortHexString(rawContent));
|
||||
|
||||
switch (commandType) {
|
||||
|
||||
|
@ -67,12 +74,12 @@ public class MedtronicConverter {
|
|||
case GetBasalProfileSTD:
|
||||
case GetBasalProfileA:
|
||||
case GetBasalProfileB: {
|
||||
return decodeBasalProfile(rawContent);
|
||||
return decodeBasalProfile(pumpType, rawContent);
|
||||
|
||||
}
|
||||
|
||||
case ReadTemporaryBasal: {
|
||||
return new TempBasalPair(rawContent); // 5
|
||||
return new TempBasalPair(aapsLogger, rawContent); // 5
|
||||
}
|
||||
|
||||
case Settings_512: {
|
||||
|
@ -96,29 +103,28 @@ public class MedtronicConverter {
|
|||
}
|
||||
|
||||
|
||||
private BasalProfile decodeBasalProfile(byte[] rawContent) {
|
||||
private BasalProfile decodeBasalProfile(PumpType pumpType, byte[] rawContent) {
|
||||
|
||||
BasalProfile basalProfile = new BasalProfile(rawContent);
|
||||
BasalProfile basalProfile = new BasalProfile(aapsLogger, rawContent);
|
||||
|
||||
return basalProfile.verify() ? basalProfile : null;
|
||||
return basalProfile.verify(pumpType) ? basalProfile : null;
|
||||
}
|
||||
|
||||
|
||||
private MedtronicDeviceType decodeModel(byte[] rawContent) {
|
||||
|
||||
if ((rawContent == null || rawContent.length < 4)) {
|
||||
LOG.warn("Error reading PumpModel, returning Unknown_Device");
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Error reading PumpModel, returning Unknown_Device");
|
||||
return MedtronicDeviceType.Unknown_Device;
|
||||
}
|
||||
|
||||
String rawModel = StringUtil.fromBytes(ByteUtil.substring(rawContent, 1, 3));
|
||||
MedtronicDeviceType pumpModel = MedtronicDeviceType.getByDescription(rawModel);
|
||||
if (isLogEnabled())
|
||||
LOG.debug("PumpModel: [raw={}, resolved={}]", rawModel, pumpModel.name());
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "PumpModel: [raw={}, resolved={}]", rawModel, pumpModel.name());
|
||||
|
||||
if (pumpModel != MedtronicDeviceType.Unknown_Device) {
|
||||
if (!MedtronicUtil.isModelSet()) {
|
||||
MedtronicUtil.setMedtronicPumpModel(pumpModel);
|
||||
if (!medtronicUtil.isModelSet()) {
|
||||
medtronicUtil.setMedtronicPumpModel(pumpModel);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -154,10 +160,10 @@ public class MedtronicConverter {
|
|||
}
|
||||
|
||||
|
||||
protected Float decodeRemainingInsulin(byte[] rawData) {
|
||||
private Float decodeRemainingInsulin(byte[] rawData) {
|
||||
int startIdx = 0;
|
||||
|
||||
this.pumpModel = MedtronicUtil.getMedtronicPumpModel();
|
||||
MedtronicDeviceType pumpModel = medtronicUtil.getMedtronicPumpModel();
|
||||
|
||||
int strokes = pumpModel == null ? 10 : pumpModel.getBolusStrokes();
|
||||
|
||||
|
@ -167,8 +173,7 @@ public class MedtronicConverter {
|
|||
|
||||
float value = ByteUtil.toInt(rawData[startIdx], rawData[startIdx + 1]) / (1.0f * strokes);
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Remaining insulin: " + value);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Remaining insulin: " + value);
|
||||
return value;
|
||||
}
|
||||
|
||||
|
@ -185,7 +190,7 @@ public class MedtronicConverter {
|
|||
LocalDateTime pumpTime = new LocalDateTime(year, month, day, hours, minutes, seconds);
|
||||
return pumpTime;
|
||||
} catch (IllegalFieldValueException e) {
|
||||
LOG.error(
|
||||
aapsLogger.error(LTag.PUMPCOMM,
|
||||
"decodeTime: Failed to parse pump time value: year=%d, month=%d, hours=%d, minutes=%d, seconds=%d",
|
||||
year, month, day, hours, minutes, seconds);
|
||||
return null;
|
||||
|
@ -194,7 +199,7 @@ public class MedtronicConverter {
|
|||
}
|
||||
|
||||
|
||||
public Map<String, PumpSettingDTO> decodeSettingsLoop(byte[] rd) {
|
||||
private Map<String, PumpSettingDTO> decodeSettingsLoop(byte[] rd) {
|
||||
|
||||
Map<String, PumpSettingDTO> map = new HashMap<>();
|
||||
|
||||
|
@ -271,7 +276,7 @@ public class MedtronicConverter {
|
|||
addSettingToMap("CFG_BASE_CLOCK_MODE", rd[getSettingIndexTimeDisplayFormat()] == 0 ? "12h" : "24h",
|
||||
PumpConfigurationGroup.General, map);
|
||||
|
||||
if (MedtronicDeviceType.isSameDevice(pumpModel, MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.getMedtronicPumpModel(), MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
addSettingToMap("PCFG_INSULIN_CONCENTRATION", "" + (rd[9] == 0 ? 50 : 100), PumpConfigurationGroup.Insulin,
|
||||
map);
|
||||
// LOG.debug("Insulin concentration: " + rd[9]);
|
||||
|
@ -323,7 +328,7 @@ public class MedtronicConverter {
|
|||
}
|
||||
|
||||
|
||||
public void addSettingToMap(String key, String value, PumpConfigurationGroup group, Map<String, PumpSettingDTO> map) {
|
||||
private void addSettingToMap(String key, String value, PumpConfigurationGroup group, Map<String, PumpSettingDTO> map) {
|
||||
map.put(key, new PumpSettingDTO(key, value, group));
|
||||
}
|
||||
|
||||
|
@ -339,7 +344,7 @@ public class MedtronicConverter {
|
|||
|
||||
addSettingToMap("CFG_MM_KEYPAD_LOCKED", parseResultEnable(rd[20]), PumpConfigurationGroup.Other, map);
|
||||
|
||||
if (MedtronicDeviceType.isSameDevice(pumpModel, MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.getMedtronicPumpModel(), MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
|
||||
addSettingToMap("PCFG_BOLUS_SCROLL_STEP_SIZE", "" + rd[21], PumpConfigurationGroup.Bolus, map);
|
||||
addSettingToMap("PCFG_CAPTURE_EVENT_ENABLE", parseResultEnable(rd[22]), PumpConfigurationGroup.Other, map);
|
||||
|
@ -352,7 +357,7 @@ public class MedtronicConverter {
|
|||
}
|
||||
|
||||
|
||||
protected String parseResultEnable(int i) {
|
||||
private String parseResultEnable(int i) {
|
||||
switch (i) {
|
||||
case 0:
|
||||
return "No";
|
||||
|
@ -364,19 +369,19 @@ public class MedtronicConverter {
|
|||
}
|
||||
|
||||
|
||||
public float getStrokesPerUnit(boolean isBasal) {
|
||||
private float getStrokesPerUnit(boolean isBasal) {
|
||||
return isBasal ? 40.0f : 10; // pumpModel.getBolusStrokes();
|
||||
}
|
||||
|
||||
|
||||
// 512
|
||||
public void decodeInsulinActionSetting(byte[] ai, Map<String, PumpSettingDTO> map) {
|
||||
if (MedtronicDeviceType.isSameDevice(pumpModel, MedtronicDeviceType.Medtronic_512_712)) {
|
||||
private void decodeInsulinActionSetting(byte[] ai, Map<String, PumpSettingDTO> map) {
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.getMedtronicPumpModel(), MedtronicDeviceType.Medtronic_512_712)) {
|
||||
addSettingToMap("PCFG_INSULIN_ACTION_TYPE", (ai[17] != 0 ? "Regular" : "Fast"),
|
||||
PumpConfigurationGroup.Insulin, map);
|
||||
} else {
|
||||
int i = ai[17];
|
||||
String s = "";
|
||||
String s;
|
||||
|
||||
if ((i == 0) || (i == 1)) {
|
||||
s = ai[17] != 0 ? "Regular" : "Fast";
|
||||
|
@ -392,12 +397,12 @@ public class MedtronicConverter {
|
|||
}
|
||||
|
||||
|
||||
public double decodeBasalInsulin(int i) {
|
||||
private double decodeBasalInsulin(int i) {
|
||||
return (double) i / (double) getStrokesPerUnit(true);
|
||||
}
|
||||
|
||||
|
||||
public double decodeBolusInsulin(int i) {
|
||||
private double decodeBolusInsulin(int i) {
|
||||
|
||||
return (double) i / (double) getStrokesPerUnit(false);
|
||||
}
|
||||
|
@ -413,19 +418,13 @@ public class MedtronicConverter {
|
|||
}
|
||||
|
||||
|
||||
public double decodeMaxBolus(byte[] ai) {
|
||||
private double decodeMaxBolus(byte[] ai) {
|
||||
return is523orHigher() ? decodeBolusInsulin(ByteUtil.toInt(ai[5], ai[6])) : decodeBolusInsulin(ByteUtil
|
||||
.asUINT8(ai[5]));
|
||||
}
|
||||
|
||||
|
||||
private boolean is523orHigher() {
|
||||
return (MedtronicDeviceType.isSameDevice(pumpModel, MedtronicDeviceType.Medtronic_523andHigher));
|
||||
return (MedtronicDeviceType.isSameDevice(medtronicUtil.getMedtronicPumpModel(), MedtronicDeviceType.Medtronic_523andHigher));
|
||||
}
|
||||
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPCOMM);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,32 +1,32 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.history;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
||||
|
||||
/**
|
||||
* This file was taken from GGC - GNU Gluco Control (ggc.sourceforge.net), application for diabetes
|
||||
* management and modified/extended for AAPS.
|
||||
*
|
||||
* <p>
|
||||
* Author: Andy {andy.rozman@gmail.com}
|
||||
*/
|
||||
|
||||
public abstract class MedtronicHistoryDecoder<T extends MedtronicHistoryEntry> implements MedtronicHistoryDecoderInterface<T> {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject MedtronicUtil medtronicUtil;
|
||||
|
||||
protected ByteUtil bitUtils;
|
||||
|
||||
|
@ -34,7 +34,6 @@ public abstract class MedtronicHistoryDecoder<T extends MedtronicHistoryEntry> i
|
|||
protected boolean statisticsEnabled = true;
|
||||
protected Map<Integer, Integer> unknownOpCodes;
|
||||
protected Map<RecordDecodeStatus, Map<String, String>> mapStatistics;
|
||||
protected MedtronicDeviceType deviceType;
|
||||
|
||||
|
||||
public MedtronicHistoryDecoder() {
|
||||
|
@ -62,8 +61,8 @@ public abstract class MedtronicHistoryDecoder<T extends MedtronicHistoryEntry> i
|
|||
// return byteList;
|
||||
// }
|
||||
|
||||
if (MedtronicUtil.getMedtronicPumpModel() == null) {
|
||||
LOG.error("Device Type is not defined.");
|
||||
if (medtronicUtil.getMedtronicPumpModel() == null) {
|
||||
aapsLogger.error(LTag.PUMPCOMM, "Device Type is not defined.");
|
||||
return byteList;
|
||||
}
|
||||
|
||||
|
@ -86,17 +85,16 @@ public abstract class MedtronicHistoryDecoder<T extends MedtronicHistoryEntry> i
|
|||
if (!statisticsEnabled)
|
||||
return;
|
||||
|
||||
unknownOpCodes = new HashMap<Integer, Integer>();
|
||||
mapStatistics = new HashMap<RecordDecodeStatus, Map<String, String>>();
|
||||
unknownOpCodes = new HashMap<>();
|
||||
mapStatistics = new HashMap<>();
|
||||
|
||||
for (RecordDecodeStatus stat : RecordDecodeStatus.values()) {
|
||||
mapStatistics.put(stat, new HashMap<String, String>());
|
||||
mapStatistics.put(stat, new HashMap<>());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void addToStatistics(MedtronicHistoryEntryInterface pumpHistoryEntry, RecordDecodeStatus status,
|
||||
Integer opCode) {
|
||||
protected void addToStatistics(MedtronicHistoryEntryInterface pumpHistoryEntry, RecordDecodeStatus status, Integer opCode) {
|
||||
if (!statisticsEnabled)
|
||||
return;
|
||||
|
||||
|
@ -120,11 +118,10 @@ public abstract class MedtronicHistoryDecoder<T extends MedtronicHistoryEntry> i
|
|||
StringUtil.appendToStringBuilder(sb, "" + unknownEntry.getKey(), ", ");
|
||||
}
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("STATISTICS OF PUMP DECODE");
|
||||
aapsLogger.error(LTag.PUMPCOMM, "STATISTICS OF PUMP DECODE");
|
||||
|
||||
if (unknownOpCodes.size() > 0) {
|
||||
LOG.warn("Unknown Op Codes: {}", sb.toString());
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "Unknown Op Codes: {}", sb.toString());
|
||||
}
|
||||
|
||||
for (Map.Entry<RecordDecodeStatus, Map<String, String>> entry : mapStatistics.entrySet()) {
|
||||
|
@ -140,12 +137,9 @@ public abstract class MedtronicHistoryDecoder<T extends MedtronicHistoryEntry> i
|
|||
|
||||
String spaces = StringUtils.repeat(" ", 14 - entry.getKey().name().length());
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug(" {}{} - {}. Elements: {}", entry.getKey().name(), spaces, entry.getValue().size(),
|
||||
sb.toString());
|
||||
aapsLogger.error(LTag.PUMPCOMM, " {}{} - {}. Elements: {}", entry.getKey().name(), spaces, entry.getValue().size(), sb.toString());
|
||||
} else {
|
||||
if (isLogEnabled())
|
||||
LOG.debug(" {} - {}", entry.getKey().name(), entry.getValue().size());
|
||||
aapsLogger.error(LTag.PUMPCOMM, " {} - {}", entry.getKey().name(), entry.getValue().size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -184,9 +178,4 @@ public abstract class MedtronicHistoryDecoder<T extends MedtronicHistoryEntry> i
|
|||
|
||||
return records;
|
||||
}
|
||||
|
||||
protected boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPCOMM);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,11 +2,8 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm.history;
|
|||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.CRC;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
@ -16,12 +13,13 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
|||
*/
|
||||
public class RawHistoryPage {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPBTCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
|
||||
private byte[] data = new byte[0];
|
||||
|
||||
|
||||
public RawHistoryPage() {
|
||||
public RawHistoryPage(AAPSLogger aapsLogger) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
}
|
||||
|
||||
|
||||
|
@ -35,7 +33,7 @@ public class RawHistoryPage {
|
|||
}
|
||||
|
||||
|
||||
public byte[] getOnlyData() {
|
||||
byte[] getOnlyData() {
|
||||
return Arrays.copyOfRange(data, 0, 1022);
|
||||
}
|
||||
|
||||
|
@ -55,11 +53,11 @@ public class RawHistoryPage {
|
|||
int crcStored = ByteUtil.toInt(data[1022], data[1023]);
|
||||
|
||||
if (crcCalculated != crcStored) {
|
||||
LOG.error("Stored CRC ({}) is different than calculated ({}), but ignored for now.", crcStored,
|
||||
crcCalculated);
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Stored CRC ({}) is different than calculated ({}), but ignored for now.", crcStored,
|
||||
crcCalculated);
|
||||
} else {
|
||||
if (MedtronicUtil.isLowLevelDebug())
|
||||
LOG.debug("CRC ok.");
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "CRC ok.");
|
||||
}
|
||||
|
||||
return crcCalculated == crcStored;
|
||||
|
@ -70,7 +68,7 @@ public class RawHistoryPage {
|
|||
int linesize = 80;
|
||||
int offset = 0;
|
||||
|
||||
StringBuffer sb = new StringBuffer();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
while (offset < data.length) {
|
||||
int bytesToLog = linesize;
|
||||
|
@ -83,7 +81,6 @@ public class RawHistoryPage {
|
|||
offset += linesize;
|
||||
}
|
||||
|
||||
LOG.debug("History Page Data:\n{}", sb.toString());
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "History Page Data:\n{}", sb.toString());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.RecordDeco
|
|||
/**
|
||||
* This file was taken from GGC - GNU Gluco Control (ggc.sourceforge.net), application for diabetes
|
||||
* management and modified/extended for AAPS.
|
||||
*
|
||||
* <p>
|
||||
* Author: Andy {andy.rozman@gmail.com}
|
||||
*/
|
||||
|
||||
|
@ -209,8 +209,7 @@ public class MedtronicCGMSHistoryDecoder extends MedtronicHistoryDecoder<CGMSHis
|
|||
entry.setDateTime(dateTime, getIndex);
|
||||
}
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("Record: {}", entry);
|
||||
LOG.debug("Record: {}", entry);
|
||||
}
|
||||
|
||||
return reversedOutList;
|
||||
|
|
|
@ -1,16 +1,14 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.MedtronicHistoryDecoder;
|
||||
|
@ -27,21 +25,26 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
|||
/**
|
||||
* This file was taken from GGC - GNU Gluco Control (ggc.sourceforge.net), application for diabetes
|
||||
* management and modified/extended for AAPS.
|
||||
*
|
||||
* <p>
|
||||
* Author: Andy {andy.rozman@gmail.com}
|
||||
*/
|
||||
|
||||
@Singleton
|
||||
public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHistoryEntry> {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
private final MedtronicUtil medtronicUtil;
|
||||
|
||||
private PumpHistoryEntry tbrPreviousRecord;
|
||||
private PumpHistoryEntry changeTimeRecord;
|
||||
private MedtronicDeviceType deviceType;
|
||||
private static final String TAG = "MdtPumpHistoryDecoder";
|
||||
|
||||
|
||||
public MedtronicPumpHistoryDecoder() {
|
||||
@Inject
|
||||
public MedtronicPumpHistoryDecoder(
|
||||
AAPSLogger aapsLogger,
|
||||
MedtronicUtil medtronicUtil
|
||||
) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
this.medtronicUtil = medtronicUtil;
|
||||
}
|
||||
|
||||
|
||||
|
@ -50,15 +53,13 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
|
||||
int counter = 0;
|
||||
int record = 0;
|
||||
boolean incompletePacket = false;
|
||||
deviceType = MedtronicUtil.getMedtronicPumpModel();
|
||||
boolean incompletePacket;
|
||||
|
||||
List<PumpHistoryEntry> outList = new ArrayList<PumpHistoryEntry>();
|
||||
List<PumpHistoryEntry> outList = new ArrayList<>();
|
||||
String skipped = null;
|
||||
int elementStart = 0;
|
||||
|
||||
if (dataClear.size() == 0) {
|
||||
Log.e(TAG, "Empty page.");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Empty page.");
|
||||
return outList;
|
||||
}
|
||||
|
||||
|
@ -76,7 +77,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
continue;
|
||||
} else {
|
||||
if (skipped != null) {
|
||||
Log.w(TAG, " ... Skipped " + skipped);
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, " ... Skipped " + skipped);
|
||||
skipped = null;
|
||||
}
|
||||
}
|
||||
|
@ -84,7 +85,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
PumpHistoryEntryType entryType = PumpHistoryEntryType.getByCode(opCode);
|
||||
|
||||
PumpHistoryEntry pe = new PumpHistoryEntry();
|
||||
pe.setEntryType(entryType);
|
||||
pe.setEntryType(medtronicUtil.getMedtronicPumpModel(), entryType);
|
||||
pe.setOffset(counter);
|
||||
|
||||
counter++;
|
||||
|
@ -93,11 +94,11 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
break;
|
||||
}
|
||||
|
||||
List<Byte> listRawData = new ArrayList<Byte>();
|
||||
List<Byte> listRawData = new ArrayList<>();
|
||||
listRawData.add((byte) opCode);
|
||||
|
||||
if (entryType == PumpHistoryEntryType.UnabsorbedInsulin
|
||||
|| entryType == PumpHistoryEntryType.UnabsorbedInsulin512) {
|
||||
|| entryType == PumpHistoryEntryType.UnabsorbedInsulin512) {
|
||||
int elements = dataClear.get(counter);
|
||||
listRawData.add((byte) elements);
|
||||
counter++;
|
||||
|
@ -105,20 +106,20 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
int els = getUnsignedInt(elements);
|
||||
|
||||
for (int k = 0; k < (els - 2); k++) {
|
||||
listRawData.add((byte) dataClear.get(counter));
|
||||
listRawData.add(dataClear.get(counter));
|
||||
counter++;
|
||||
}
|
||||
|
||||
special = true;
|
||||
} else {
|
||||
|
||||
for (int j = 0; j < (entryType.getTotalLength() - 1); j++) {
|
||||
for (int j = 0; j < (entryType.getTotalLength(medtronicUtil.getMedtronicPumpModel()) - 1); j++) {
|
||||
|
||||
try {
|
||||
listRawData.add(dataClear.get(counter));
|
||||
counter++;
|
||||
} catch (Exception ex) {
|
||||
LOG.error("OpCode: " + ByteUtil.shortHexString((byte) opCode) + ", Invalid package: "
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "OpCode: " + ByteUtil.shortHexString((byte) opCode) + ", Invalid package: "
|
||||
+ ByteUtil.getHex(listRawData));
|
||||
// throw ex;
|
||||
incompletePacket = true;
|
||||
|
@ -133,14 +134,14 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
}
|
||||
|
||||
if (entryType == PumpHistoryEntryType.None) {
|
||||
LOG.error("Error in code. We should have not come into this branch.");
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Error in code. We should have not come into this branch.");
|
||||
} else {
|
||||
|
||||
if (pe.getEntryType() == PumpHistoryEntryType.UnknownBasePacket) {
|
||||
pe.setOpCode(opCode);
|
||||
}
|
||||
|
||||
if (entryType.getHeadLength() == 0)
|
||||
if (entryType.getHeadLength(medtronicUtil.getMedtronicPumpModel()) == 0)
|
||||
special = true;
|
||||
|
||||
pe.setData(listRawData, special);
|
||||
|
@ -150,7 +151,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
if ((decoded == RecordDecodeStatus.OK) || (decoded == RecordDecodeStatus.Ignored)) {
|
||||
//Log.i(TAG, "#" + record + " " + decoded.getDescription() + " " + pe);
|
||||
} else {
|
||||
Log.w(TAG, "#" + record + " " + decoded.getDescription() + " " + pe);
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "#" + record + " " + decoded.getDescription() + " " + pe);
|
||||
}
|
||||
|
||||
addToStatistics(pe, decoded, null);
|
||||
|
@ -173,13 +174,13 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
try {
|
||||
return decodeRecord(record, false);
|
||||
} catch (Exception ex) {
|
||||
LOG.error(" Error decoding: type={}, ex={}", record.getEntryType().name(), ex.getMessage(), ex);
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, " Error decoding: type={}, ex={}", record.getEntryType().name(), ex.getMessage(), ex);
|
||||
return RecordDecodeStatus.Error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public RecordDecodeStatus decodeRecord(PumpHistoryEntry entry, boolean x) {
|
||||
private RecordDecodeStatus decodeRecord(PumpHistoryEntry entry, boolean x) {
|
||||
|
||||
if (entry.getDateTimeLength() > 0) {
|
||||
decodeDateTime(entry);
|
||||
|
@ -260,7 +261,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
case EventUnknown_0x4d:
|
||||
case EventUnknown_MM522_0x25:
|
||||
case EventUnknown_MM522_0x05:
|
||||
LOG.debug(" -- ignored Unknown Pump Entry: " + entry);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, " -- ignored Unknown Pump Entry: " + entry);
|
||||
return RecordDecodeStatus.Ignored;
|
||||
|
||||
case UnabsorbedInsulin:
|
||||
|
@ -340,7 +341,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
return RecordDecodeStatus.Error;
|
||||
|
||||
default: {
|
||||
LOG.debug("Not supported: " + entry.getEntryType());
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Not supported: " + entry.getEntryType());
|
||||
return RecordDecodeStatus.NotSupported;
|
||||
}
|
||||
|
||||
|
@ -367,7 +368,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
|
||||
// LOG.debug("decodeBasalProfile: {}", entry);
|
||||
|
||||
BasalProfile basalProfile = new BasalProfile();
|
||||
BasalProfile basalProfile = new BasalProfile(aapsLogger);
|
||||
basalProfile.setRawDataFromHistory(entry.getBody());
|
||||
|
||||
// LOG.debug("decodeBasalProfile BasalProfile: {}", basalProfile);
|
||||
|
@ -396,7 +397,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
}
|
||||
|
||||
|
||||
public static String getFormattedValue(float value, int decimals) {
|
||||
private static String getFormattedValue(float value, int decimals) {
|
||||
return String.format(Locale.ENGLISH, "%." + decimals + "f", value);
|
||||
}
|
||||
|
||||
|
@ -408,16 +409,14 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
Float rate = null;
|
||||
int index = entry.getHead()[0];
|
||||
|
||||
if (MedtronicDeviceType.isSameDevice(MedtronicUtil.getMedtronicPumpModel(),
|
||||
MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.getMedtronicPumpModel(), MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
rate = body[1] * 0.025f;
|
||||
}
|
||||
|
||||
//LOG.info("Basal Profile Start: offset={}, rate={}, index={}, body_raw={}", offset, rate, index, body);
|
||||
|
||||
if (rate == null) {
|
||||
LOG.warn("Basal Profile Start (ERROR): offset={}, rate={}, index={}, body_raw={}", offset, rate, index,
|
||||
body);
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Basal Profile Start (ERROR): offset={}, rate={}, index={}, body_raw={}", offset, rate, index, body);
|
||||
return RecordDecodeStatus.Error;
|
||||
} else {
|
||||
entry.addDecodedData("Value", getFormattedFloat(rate, 3));
|
||||
|
@ -435,8 +434,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
|
||||
float bolusStrokes = 10.0f;
|
||||
|
||||
if (MedtronicDeviceType.isSameDevice(MedtronicUtil.getMedtronicPumpModel(),
|
||||
MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.getMedtronicPumpModel(), MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
// https://github.com/ps2/minimed_rf/blob/master/lib/minimed_rf/log_entries/bolus_wizard.rb#L102
|
||||
bolusStrokes = 40.0f;
|
||||
|
||||
|
@ -447,19 +445,19 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
// carb_ratio (?) = (((self.body[2] & 0x07) << 8) + self.body[3]) /
|
||||
// 10.0s
|
||||
dto.insulinSensitivity = new Float(body[4]);
|
||||
dto.bgTargetLow = (int)body[5];
|
||||
dto.bgTargetHigh = (int)body[14];
|
||||
dto.bgTargetLow = (int) body[5];
|
||||
dto.bgTargetHigh = (int) body[14];
|
||||
dto.correctionEstimate = (((body[9] & 0x38) << 5) + body[6]) / bolusStrokes;
|
||||
dto.foodEstimate = ((body[7] << 8) + body[8]) / bolusStrokes;
|
||||
dto.unabsorbedInsulin = ((body[10] << 8) + body[11]) / bolusStrokes;
|
||||
dto.bolusTotal = ((body[12] << 8) + body[13]) / bolusStrokes;
|
||||
} else {
|
||||
dto.bloodGlucose = (((body[1] & 0x0F) << 8) | entry.getHead()[0]);
|
||||
dto.carbs = (int)body[0];
|
||||
dto.carbs = (int) body[0];
|
||||
dto.carbRatio = Float.valueOf(body[2]);
|
||||
dto.insulinSensitivity = new Float(body[3]);
|
||||
dto.bgTargetLow = (int)body[4];
|
||||
dto.bgTargetHigh = (int)body[12];
|
||||
dto.bgTargetLow = (int) body[4];
|
||||
dto.bgTargetHigh = (int) body[12];
|
||||
dto.bolusTotal = body[11] / bolusStrokes;
|
||||
dto.foodEstimate = body[6] / bolusStrokes;
|
||||
dto.unabsorbedInsulin = body[9] / bolusStrokes;
|
||||
|
@ -490,7 +488,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
dto.carbs = (body[1] & 0xC) << 6 | body[0]; // (int)body[0];
|
||||
dto.carbRatio = Float.valueOf(body[2]);
|
||||
dto.insulinSensitivity = new Float(body[3]);
|
||||
dto.bgTargetLow = (int)body[4];
|
||||
dto.bgTargetLow = (int) body[4];
|
||||
dto.foodEstimate = body[6] / 10.0f;
|
||||
dto.correctionEstimate = (body[7] + (body[5] & 0x0F)) / bolusStrokes;
|
||||
dto.unabsorbedInsulin = body[9] / bolusStrokes;
|
||||
|
@ -570,8 +568,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
|
||||
byte[] data = entry.getHead();
|
||||
|
||||
if (MedtronicDeviceType.isSameDevice(MedtronicUtil.getMedtronicPumpModel(),
|
||||
MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.getMedtronicPumpModel(), MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
bolus.setRequestedAmount(ByteUtil.toInt(data[0], data[1]) / 40.0d);
|
||||
bolus.setDeliveredAmount(ByteUtil.toInt(data[2], data[3]) / 40.0d);
|
||||
bolus.setInsulinOnBoard(ByteUtil.toInt(data[4], data[5]) / 40.0d);
|
||||
|
@ -606,7 +603,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
}
|
||||
|
||||
|
||||
public static void decodeTempBasal(PumpHistoryEntry tbrPreviousRecord, PumpHistoryEntry entry) {
|
||||
public void decodeTempBasal(PumpHistoryEntry tbrPreviousRecord, PumpHistoryEntry entry) {
|
||||
|
||||
PumpHistoryEntry tbrRate = null, tbrDuration = null;
|
||||
|
||||
|
@ -639,7 +636,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
byte[] dt = entry.getDatetime();
|
||||
|
||||
if (dt == null) {
|
||||
LOG.warn("DateTime not set.");
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "DateTime not set.");
|
||||
}
|
||||
|
||||
if (entry.getDateTimeLength() == 5) {
|
||||
|
@ -673,7 +670,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
//LOG.debug("DT: {} {} {}", year, month, dayOfMonth);
|
||||
|
||||
if (dayOfMonth == 32) {
|
||||
LOG.warn("Entry: Day 32 {} = [{}] {}", entry.getEntryType().name(),
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Entry: Day 32 {} = [{}] {}", entry.getEntryType().name(),
|
||||
ByteUtil.getHex(entry.getRawData()), entry);
|
||||
}
|
||||
|
||||
|
@ -686,7 +683,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder<PumpHis
|
|||
entry.setAtechDateTime(DateTimeUtil.toATechDate(year, month, dayOfMonth, hour, minutes, seconds));
|
||||
|
||||
} else {
|
||||
LOG.warn("Unknown datetime format: " + entry.getDateTimeLength());
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Unknown datetime format: " + entry.getDateTimeLength());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,15 +2,12 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump;
|
|||
|
||||
import com.google.gson.annotations.Expose;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.MedtronicHistoryEntry;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceType;
|
||||
|
||||
/**
|
||||
* This file was taken from GGC - GNU Gluco Control (ggc.sourceforge.net), application for diabetes
|
||||
|
@ -21,8 +18,6 @@ import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.MedtronicH
|
|||
|
||||
public class PumpHistoryEntry extends MedtronicHistoryEntry {
|
||||
|
||||
private static Logger LOG = StacktraceLoggerWrapper.getLogger(PumpHistoryEntry.class);
|
||||
|
||||
@Expose
|
||||
private PumpHistoryEntryType entryType;
|
||||
private Integer opCode; // this is set only when we have unknown entry...
|
||||
|
@ -35,12 +30,12 @@ public class PumpHistoryEntry extends MedtronicHistoryEntry {
|
|||
}
|
||||
|
||||
|
||||
public void setEntryType(PumpHistoryEntryType entryType) {
|
||||
public void setEntryType(MedtronicDeviceType medtronicDeviceType, PumpHistoryEntryType entryType) {
|
||||
this.entryType = entryType;
|
||||
|
||||
this.sizes[0] = entryType.getHeadLength();
|
||||
this.sizes[0] = entryType.getHeadLength(medtronicDeviceType);
|
||||
this.sizes[1] = entryType.getDateLength();
|
||||
this.sizes[2] = entryType.getBodyLength();
|
||||
this.sizes[2] = entryType.getBodyLength(medtronicDeviceType);
|
||||
|
||||
if (this.entryType != null && this.atechDateTime != null)
|
||||
setPumpId();
|
||||
|
|
|
@ -7,7 +7,6 @@ import java.util.Map;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
||||
/**
|
||||
* This file was taken from GGC - GNU Gluco Control (ggc.sourceforge.net), application for diabetes
|
||||
|
@ -159,8 +158,7 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
TempBasalCombined(0xfe, "TBR", PumpHistoryEntryGroup.Basal), //
|
||||
UnknownBasePacket(0xff, "Unknown Base Packet", PumpHistoryEntryGroup.Unknown);
|
||||
|
||||
private static Map<Integer, PumpHistoryEntryType> opCodeMap = new HashMap<Integer, PumpHistoryEntryType>();
|
||||
private static PumpHistoryEntryType tddType;
|
||||
private static Map<Integer, PumpHistoryEntryType> opCodeMap = new HashMap<>();
|
||||
|
||||
static {
|
||||
for (PumpHistoryEntryType type : values()) {
|
||||
|
@ -172,7 +170,7 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
|
||||
private int opCode;
|
||||
private String description;
|
||||
private int headLength = 0;
|
||||
private int headLength;
|
||||
private int dateLength;
|
||||
// private MinimedDeviceType deviceType;
|
||||
private int bodyLength;
|
||||
|
@ -182,8 +180,7 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
private List<SpecialRule> specialRulesHead;
|
||||
private List<SpecialRule> specialRulesBody;
|
||||
private boolean hasSpecialRules = false;
|
||||
private PumpHistoryEntryGroup group = PumpHistoryEntryGroup.Unknown;
|
||||
private static Object TDDType;
|
||||
private PumpHistoryEntryGroup group;
|
||||
|
||||
|
||||
PumpHistoryEntryType(int opCode, String name, PumpHistoryEntryGroup group) {
|
||||
|
@ -289,9 +286,9 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
}
|
||||
|
||||
|
||||
public int getTotalLength() {
|
||||
public int getTotalLength(MedtronicDeviceType medtronicDeviceType) {
|
||||
if (hasSpecialRules()) {
|
||||
return getHeadLength() + getBodyLength() + getDateLength();
|
||||
return getHeadLength(medtronicDeviceType) + getBodyLength(medtronicDeviceType) + getDateLength();
|
||||
} else {
|
||||
return totalLength;
|
||||
}
|
||||
|
@ -305,7 +302,7 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
|
||||
void addSpecialRuleHead(SpecialRule rule) {
|
||||
if (isEmpty(specialRulesHead)) {
|
||||
specialRulesHead = new ArrayList<SpecialRule>();
|
||||
specialRulesHead = new ArrayList<>();
|
||||
}
|
||||
|
||||
specialRulesHead.add(rule);
|
||||
|
@ -315,7 +312,7 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
|
||||
void addSpecialRuleBody(SpecialRule rule) {
|
||||
if (isEmpty(specialRulesBody)) {
|
||||
specialRulesBody = new ArrayList<SpecialRule>();
|
||||
specialRulesBody = new ArrayList<>();
|
||||
}
|
||||
|
||||
specialRulesBody.add(rule);
|
||||
|
@ -333,10 +330,10 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
}
|
||||
|
||||
|
||||
public int getHeadLength() {
|
||||
public int getHeadLength(MedtronicDeviceType medtronicDeviceType) {
|
||||
if (hasSpecialRules) {
|
||||
if (isNotEmpty(specialRulesHead)) {
|
||||
return determineSizeByRule(headLength, specialRulesHead);
|
||||
return determineSizeByRule(medtronicDeviceType, headLength, specialRulesHead);
|
||||
} else {
|
||||
return headLength;
|
||||
}
|
||||
|
@ -351,10 +348,10 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
}
|
||||
|
||||
|
||||
public int getBodyLength() {
|
||||
public int getBodyLength(MedtronicDeviceType medtronicDeviceType) {
|
||||
if (hasSpecialRules) {
|
||||
if (isNotEmpty(specialRulesBody)) {
|
||||
return determineSizeByRule(bodyLength, specialRulesBody);
|
||||
return determineSizeByRule(medtronicDeviceType, bodyLength, specialRulesBody);
|
||||
} else {
|
||||
return bodyLength;
|
||||
}
|
||||
|
@ -376,11 +373,11 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
|
||||
// byte[] dh = { 2, 3 };
|
||||
|
||||
private int determineSizeByRule(int defaultValue, List<SpecialRule> rules) {
|
||||
private int determineSizeByRule(MedtronicDeviceType medtronicDeviceType, int defaultValue, List<SpecialRule> rules) {
|
||||
int size = defaultValue;
|
||||
|
||||
for (SpecialRule rule : rules) {
|
||||
if (MedtronicDeviceType.isSameDevice(MedtronicUtil.getMedtronicPumpModel(), rule.deviceType)) {
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicDeviceType, rule.deviceType)) {
|
||||
size = rule.size;
|
||||
break;
|
||||
}
|
||||
|
@ -395,36 +392,13 @@ public enum PumpHistoryEntryType // implements CodeEnum
|
|||
return group;
|
||||
}
|
||||
|
||||
enum DateFormat {
|
||||
None(0), //
|
||||
LongDate(5), //
|
||||
ShortDate(2);
|
||||
|
||||
private int length;
|
||||
|
||||
|
||||
DateFormat(int length) {
|
||||
this.length = length;
|
||||
}
|
||||
|
||||
|
||||
public int getLength() {
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
public void setLength(int length) {
|
||||
this.length = length;
|
||||
}
|
||||
}
|
||||
|
||||
public static class SpecialRule {
|
||||
|
||||
MedtronicDeviceType deviceType;
|
||||
int size;
|
||||
|
||||
|
||||
public SpecialRule(MedtronicDeviceType deviceType, int size) {
|
||||
SpecialRule(MedtronicDeviceType deviceType, int size) {
|
||||
this.deviceType = deviceType;
|
||||
this.size = size;
|
||||
}
|
||||
|
|
|
@ -1,24 +1,21 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil;
|
||||
|
||||
/**
|
||||
* History page contains data, sorted from newest to oldest (0=newest..n=oldest)
|
||||
*
|
||||
* <p>
|
||||
* Created by andy on 9/23/18.
|
||||
*/
|
||||
public class PumpHistoryResult {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
|
||||
private boolean searchFinished = false;
|
||||
private PumpHistoryEntry searchEntry = null;
|
||||
|
@ -28,23 +25,22 @@ public class PumpHistoryResult {
|
|||
public List<PumpHistoryEntry> validEntries;
|
||||
|
||||
|
||||
public PumpHistoryResult(PumpHistoryEntry searchEntry, Long targetDate) {
|
||||
public PumpHistoryResult(AAPSLogger aapsLogger, PumpHistoryEntry searchEntry, Long targetDate) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
if (searchEntry != null) {
|
||||
/*
|
||||
* this.searchEntry = searchEntry;
|
||||
* this.searchType = SearchType.LastEntry;
|
||||
* LOG.debug("PumpHistoryResult. Search parameters: Last Entry: " + searchEntry.atechDateTime + " type="
|
||||
* aapsLogger.debug(LTag.PUMPCOMM,"PumpHistoryResult. Search parameters: Last Entry: " + searchEntry.atechDateTime + " type="
|
||||
* + searchEntry.getEntryType().name());
|
||||
*/
|
||||
this.searchDate = searchEntry.atechDateTime;
|
||||
this.searchType = SearchType.Date;
|
||||
if (isLogEnabled())
|
||||
LOG.debug("PumpHistoryResult. Search parameters: Date(with searchEntry): " + targetDate);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "PumpHistoryResult. Search parameters: Date(with searchEntry): " + targetDate);
|
||||
} else if (targetDate != null) {
|
||||
this.searchDate = targetDate;
|
||||
this.searchType = SearchType.Date;
|
||||
if (isLogEnabled())
|
||||
LOG.debug("PumpHistoryResult. Search parameters: Date: " + targetDate);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "PumpHistoryResult. Search parameters: Date: " + targetDate);
|
||||
}
|
||||
|
||||
// this.unprocessedEntries = new ArrayList<>();
|
||||
|
@ -54,7 +50,7 @@ public class PumpHistoryResult {
|
|||
|
||||
public void addHistoryEntries(List<PumpHistoryEntry> entries, int page) {
|
||||
this.unprocessedEntries = entries;
|
||||
//LOG.debug("PumpHistoryResult. Unprocessed entries: {}", MedtronicUtil.getGsonInstance().toJson(entries));
|
||||
//aapsLogger.debug(LTag.PUMPCOMM,"PumpHistoryResult. Unprocessed entries: {}", MedtronicUtil.getGsonInstance().toJson(entries));
|
||||
processEntries();
|
||||
}
|
||||
|
||||
|
@ -66,47 +62,47 @@ public class PumpHistoryResult {
|
|||
|
||||
switch (searchType) {
|
||||
case None:
|
||||
//LOG.debug("PE. None search");
|
||||
//aapsLogger.debug(LTag.PUMPCOMM,"PE. None search");
|
||||
this.validEntries.addAll(this.unprocessedEntries);
|
||||
break;
|
||||
|
||||
case LastEntry: {
|
||||
LOG.debug("PE. Last entry search");
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "PE. Last entry search");
|
||||
|
||||
//Collections.sort(this.unprocessedEntries, new PumpHistoryEntry.Comparator());
|
||||
|
||||
LOG.debug("PE. PumpHistoryResult. Search entry date: " + searchEntry.atechDateTime);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "PE. PumpHistoryResult. Search entry date: " + searchEntry.atechDateTime);
|
||||
|
||||
Long date = searchEntry.atechDateTime;
|
||||
|
||||
for (PumpHistoryEntry unprocessedEntry : unprocessedEntries) {
|
||||
|
||||
if (unprocessedEntry.equals(searchEntry)) {
|
||||
//LOG.debug("PE. Item found {}.", unprocessedEntry);
|
||||
//aapsLogger.debug(LTag.PUMPCOMM,"PE. Item found {}.", unprocessedEntry);
|
||||
searchFinished = true;
|
||||
break;
|
||||
}
|
||||
|
||||
//LOG.debug("PE. Entry {} added.", unprocessedEntry);
|
||||
//aapsLogger.debug(LTag.PUMPCOMM,"PE. Entry {} added.", unprocessedEntry);
|
||||
this.validEntries.add(unprocessedEntry);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Date: {
|
||||
LOG.debug("PE. Date search: Search date: {}", this.searchDate);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "PE. Date search: Search date: {}", this.searchDate);
|
||||
|
||||
|
||||
for (PumpHistoryEntry unprocessedEntry : unprocessedEntries) {
|
||||
|
||||
if (unprocessedEntry.atechDateTime == null || unprocessedEntry.atechDateTime == 0) {
|
||||
LOG.debug("PE. PumpHistoryResult. Search entry date: Entry with no date: {}", unprocessedEntry);
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "PE. PumpHistoryResult. Search entry date: Entry with no date: {}", unprocessedEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (unprocessedEntry.isAfter(this.searchDate)) {
|
||||
this.validEntries.add(unprocessedEntry);
|
||||
} else {
|
||||
// LOG.debug("PE. PumpHistoryResult. Not after.. Unprocessed Entry [year={},entry={}]",
|
||||
// aapsLogger.debug(LTag.PUMPCOMM,"PE. PumpHistoryResult. Not after.. Unprocessed Entry [year={},entry={}]",
|
||||
// DateTimeUtil.getYear(unprocessedEntry.atechDateTime), unprocessedEntry);
|
||||
if (DateTimeUtil.getYear(unprocessedEntry.atechDateTime) > 2015)
|
||||
olderEntries++;
|
||||
|
@ -123,7 +119,7 @@ public class PumpHistoryResult {
|
|||
|
||||
} // switch
|
||||
|
||||
//LOG.debug("PE. Valid Entries: {}", validEntries);
|
||||
//aapsLogger.debug(LTag.PUMPCOMM,"PE. Valid Entries: {}", validEntries);
|
||||
}
|
||||
|
||||
|
||||
|
@ -178,11 +174,4 @@ public class PumpHistoryResult {
|
|||
LastEntry, //
|
||||
Date
|
||||
}
|
||||
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPCOMM);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,19 +1,15 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.message;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
||||
/**
|
||||
* Created by geoff on 6/2/16.
|
||||
*/
|
||||
public class CarelinkLongMessageBody extends MessageBody {
|
||||
|
||||
public static final int LONG_MESSAGE_BODY_LENGTH = 65;
|
||||
private static final int LONG_MESSAGE_BODY_LENGTH = 65;
|
||||
protected byte[] data;
|
||||
|
||||
|
||||
public CarelinkLongMessageBody() {
|
||||
CarelinkLongMessageBody() {
|
||||
init(new byte[0]);
|
||||
}
|
||||
|
||||
|
@ -22,12 +18,6 @@ public class CarelinkLongMessageBody extends MessageBody {
|
|||
init(payload);
|
||||
}
|
||||
|
||||
|
||||
public CarelinkLongMessageBody(List<Byte> payload) {
|
||||
init(MedtronicUtil.createByteArray(payload));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void init(byte[] rxData) {
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ public enum PacketType {
|
|||
}
|
||||
}
|
||||
|
||||
private byte value = 0;
|
||||
private byte value;
|
||||
|
||||
|
||||
PacketType(int value) {
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.message;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RLMessage;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType;
|
||||
|
@ -14,9 +11,9 @@ import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandTy
|
|||
*/
|
||||
public class PumpMessage implements RLMessage {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
|
||||
public PacketType packetType = PacketType.Carelink;
|
||||
private PacketType packetType = PacketType.Carelink;
|
||||
public byte[] address = new byte[]{0, 0, 0};
|
||||
public MedtronicCommandType commandType;
|
||||
public Byte invalidCommandType;
|
||||
|
@ -26,18 +23,20 @@ public class PumpMessage implements RLMessage {
|
|||
public static final int FRAME_DATA_LENGTH = 64;
|
||||
|
||||
|
||||
public PumpMessage(String error) {
|
||||
public PumpMessage(AAPSLogger aapsLogger, String error) {
|
||||
this.error = error;
|
||||
this.aapsLogger = aapsLogger;
|
||||
}
|
||||
|
||||
|
||||
public PumpMessage(byte[] rxData) {
|
||||
public PumpMessage(AAPSLogger aapsLogger, byte[] rxData) {
|
||||
init(rxData);
|
||||
this.aapsLogger = aapsLogger;
|
||||
}
|
||||
|
||||
|
||||
public PumpMessage() {
|
||||
|
||||
public PumpMessage(AAPSLogger aapsLogger) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
}
|
||||
|
||||
|
||||
|
@ -67,8 +66,7 @@ public class PumpMessage implements RLMessage {
|
|||
if (rxData.length > 4) {
|
||||
this.commandType = MedtronicCommandType.getByCode(rxData[4]);
|
||||
if (this.commandType == MedtronicCommandType.InvalidCommand) {
|
||||
if (isLogEnabled())
|
||||
LOG.error("PumpMessage - Unknown commandType " + rxData[4]);
|
||||
aapsLogger.error(LTag.PUMPCOMM, "PumpMessage - Unknown commandType " + rxData[4]);
|
||||
}
|
||||
}
|
||||
if (rxData.length > 5) {
|
||||
|
@ -80,7 +78,7 @@ public class PumpMessage implements RLMessage {
|
|||
|
||||
@Override
|
||||
public byte[] getTxData() {
|
||||
byte[] rval = ByteUtil.concat(new byte[]{(byte) packetType.getValue()}, address);
|
||||
byte[] rval = ByteUtil.concat(new byte[]{packetType.getValue()}, address);
|
||||
rval = ByteUtil.concat(rval, commandType.getCommandCode());
|
||||
rval = ByteUtil.concat(rval, messageBody.getTxData());
|
||||
return rval;
|
||||
|
@ -211,10 +209,4 @@ public class PumpMessage implements RLMessage {
|
|||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMPCOMM);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,113 +1,58 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.ui;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
|
||||
/**
|
||||
* Created by andy on 6/14/18.
|
||||
*/
|
||||
public class MedtronicUIComm {
|
||||
|
||||
private final HasAndroidInjector injector;
|
||||
private final AAPSLogger aapsLogger;
|
||||
|
||||
MedtronicCommunicationManager mcmInstance = null;
|
||||
MedtronicUIPostprocessor uiPostprocessor;
|
||||
private final MedtronicUtil medtronicUtil;
|
||||
private final MedtronicCommunicationManager medtronicCommunicationManager;
|
||||
private final MedtronicUIPostprocessor medtronicUIPostprocessor;
|
||||
|
||||
public MedtronicUIComm(
|
||||
HasAndroidInjector injector,
|
||||
AAPSLogger aapsLogger,
|
||||
RxBusWrapper rxBus,
|
||||
ResourceHelper resourceHelper
|
||||
MedtronicUtil medtronicUtil,
|
||||
MedtronicUIPostprocessor medtronicUIPostprocessor,
|
||||
MedtronicCommunicationManager medtronicCommunicationManager
|
||||
) {
|
||||
this.injector = injector;
|
||||
this.aapsLogger = aapsLogger;
|
||||
|
||||
uiPostprocessor = new MedtronicUIPostprocessor(aapsLogger, rxBus, resourceHelper);
|
||||
this.medtronicUtil = medtronicUtil;
|
||||
this.medtronicUIPostprocessor = medtronicUIPostprocessor;
|
||||
this.medtronicCommunicationManager = medtronicCommunicationManager;
|
||||
}
|
||||
|
||||
|
||||
private MedtronicCommunicationManager getCommunicationManager() {
|
||||
if (mcmInstance == null) {
|
||||
mcmInstance = MedtronicCommunicationManager.getInstance();
|
||||
}
|
||||
|
||||
return mcmInstance;
|
||||
}
|
||||
|
||||
|
||||
public synchronized MedtronicUITask executeCommand(MedtronicCommandType commandType, Object... parameters) {
|
||||
|
||||
aapsLogger.warn(LTag.PUMP, "Execute Command: " + commandType.name());
|
||||
|
||||
MedtronicUITask task = new MedtronicUITask(commandType, parameters);
|
||||
MedtronicUITask task = new MedtronicUITask(injector, commandType, parameters);
|
||||
|
||||
MedtronicUtil.setCurrentCommand(commandType);
|
||||
medtronicUtil.setCurrentCommand(commandType);
|
||||
|
||||
// new Thread(() -> {
|
||||
// LOG.warn("@@@ Start Thread");
|
||||
//
|
||||
// task.execute(getCommunicationManager());
|
||||
//
|
||||
// LOG.warn("@@@ End Thread");
|
||||
// });
|
||||
|
||||
task.execute(getCommunicationManager());
|
||||
|
||||
// for (int i = 0; i < getMaxWaitTime(commandType); i++) {
|
||||
// synchronized (task) {
|
||||
// // try {
|
||||
// //
|
||||
// // //task.wait(1000);
|
||||
// // } catch (InterruptedException e) {
|
||||
// // LOG.error("executeCommand InterruptedException", e);
|
||||
// // }
|
||||
//
|
||||
//
|
||||
// SystemClock.sleep(1000);
|
||||
// }
|
||||
//
|
||||
// if (task.isReceived()) {
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
task.execute(medtronicCommunicationManager);
|
||||
|
||||
if (!task.isReceived()) {
|
||||
aapsLogger.warn(LTag.PUMP, "Reply not received for " + commandType);
|
||||
}
|
||||
|
||||
task.postProcess(uiPostprocessor);
|
||||
task.postProcess(medtronicUIPostprocessor);
|
||||
|
||||
return task;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* We return 25s as waitTime (17 for wakeUp, and addtional 8 for data retrieval) for normal commands and
|
||||
* 120s for History. Real time for returning data would be arround 5s, but lets be sure.
|
||||
*
|
||||
* @param commandType
|
||||
* @return
|
||||
*/
|
||||
private int getMaxWaitTime(MedtronicCommandType commandType) {
|
||||
if (commandType == MedtronicCommandType.GetHistoryData)
|
||||
return 120;
|
||||
else
|
||||
return 25;
|
||||
}
|
||||
|
||||
|
||||
public int getInvalidResponsesCount() {
|
||||
return getCommunicationManager().getNotConnectedCount();
|
||||
}
|
||||
|
||||
|
||||
public void startTunning() {
|
||||
RileyLinkUtil.sendBroadcastMessage(RileyLinkConst.IPC.MSG_PUMP_tunePump);
|
||||
return medtronicCommunicationManager.getNotConnectedCount();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,9 +6,13 @@ import org.joda.time.Duration;
|
|||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BasalProfile;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BatteryStatusDTO;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.ClockDTO;
|
||||
|
@ -20,34 +24,41 @@ import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpSta
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
|
||||
import static info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil.sendNotification;
|
||||
|
||||
/**
|
||||
* Created by andy on 6/15/18.
|
||||
*/
|
||||
|
||||
class MedtronicUIPostprocessor {
|
||||
@Singleton
|
||||
public class MedtronicUIPostprocessor {
|
||||
|
||||
private final AAPSLogger aapsLogger;
|
||||
private final RxBusWrapper rxBus;
|
||||
private final ResourceHelper resourceHelper;
|
||||
private final MedtronicUtil medtronicUtil;
|
||||
private final MedtronicPumpStatus medtronicPumpStatus;
|
||||
private final MedtronicPumpPlugin medtronicPumpPlugin;
|
||||
|
||||
|
||||
private MedtronicPumpStatus pumpStatus;
|
||||
|
||||
|
||||
|
||||
public MedtronicUIPostprocessor(AAPSLogger aapsLogger, RxBusWrapper rxBus, ResourceHelper resourceHelper) {
|
||||
@Inject
|
||||
public MedtronicUIPostprocessor(
|
||||
AAPSLogger aapsLogger,
|
||||
RxBusWrapper rxBus,
|
||||
ResourceHelper resourceHelper,
|
||||
MedtronicUtil medtronicUtil,
|
||||
MedtronicPumpStatus medtronicPumpStatus,
|
||||
MedtronicPumpPlugin medtronicPumpPlugin) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
this.rxBus = rxBus;
|
||||
this.resourceHelper = resourceHelper;
|
||||
pumpStatus = MedtronicUtil.getPumpStatus();
|
||||
this.medtronicUtil = medtronicUtil;
|
||||
this.medtronicPumpStatus = medtronicPumpStatus;
|
||||
this.medtronicPumpPlugin = medtronicPumpPlugin;
|
||||
}
|
||||
|
||||
|
||||
// this is mostly intended for command that return certain statuses (Remaining Insulin, ...), and
|
||||
// where responses won't be directly used
|
||||
public void postProcessData(MedtronicUITask uiTask) {
|
||||
void postProcessData(MedtronicUITask uiTask) {
|
||||
|
||||
switch (uiTask.commandType) {
|
||||
|
||||
|
@ -57,7 +68,7 @@ class MedtronicUIPostprocessor {
|
|||
if (response) {
|
||||
BasalProfile basalProfile = (BasalProfile) uiTask.getParameter(0);
|
||||
|
||||
pumpStatus.basalsByHour = basalProfile.getProfilesByHour();
|
||||
medtronicPumpStatus.basalsByHour = basalProfile.getProfilesByHour(medtronicPumpPlugin.getPumpDescription().pumpType);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -66,11 +77,11 @@ class MedtronicUIPostprocessor {
|
|||
BasalProfile basalProfile = (BasalProfile) uiTask.returnData;
|
||||
|
||||
try {
|
||||
Double[] profilesByHour = basalProfile.getProfilesByHour();
|
||||
Double[] profilesByHour = basalProfile.getProfilesByHour(medtronicPumpPlugin.getPumpDescription().pumpType);
|
||||
|
||||
if (profilesByHour != null) {
|
||||
pumpStatus.basalsByHour = profilesByHour;
|
||||
pumpStatus.basalProfileStatus = BasalProfileStatus.ProfileOK;
|
||||
medtronicPumpStatus.basalsByHour = profilesByHour;
|
||||
medtronicPumpStatus.basalProfileStatus = BasalProfileStatus.ProfileOK;
|
||||
} else {
|
||||
uiTask.responseType = MedtronicUIResponseType.Error;
|
||||
uiTask.errorDescription = "No profile found.";
|
||||
|
@ -85,20 +96,20 @@ class MedtronicUIPostprocessor {
|
|||
break;
|
||||
|
||||
case SetBolus: {
|
||||
pumpStatus.lastBolusAmount = uiTask.getDoubleFromParameters(0);
|
||||
pumpStatus.lastBolusTime = new Date();
|
||||
medtronicPumpStatus.lastBolusAmount = uiTask.getDoubleFromParameters(0);
|
||||
medtronicPumpStatus.lastBolusTime = new Date();
|
||||
}
|
||||
break;
|
||||
|
||||
case GetRemainingInsulin: {
|
||||
pumpStatus.reservoirRemainingUnits = (Float) uiTask.returnData;
|
||||
medtronicPumpStatus.reservoirRemainingUnits = (Float) uiTask.returnData;
|
||||
}
|
||||
break;
|
||||
|
||||
case CancelTBR: {
|
||||
pumpStatus.tempBasalStart = null;
|
||||
pumpStatus.tempBasalAmount = null;
|
||||
pumpStatus.tempBasalLength = null;
|
||||
medtronicPumpStatus.tempBasalStart = null;
|
||||
medtronicPumpStatus.tempBasalAmount = null;
|
||||
medtronicPumpStatus.tempBasalLength = null;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -113,7 +124,7 @@ class MedtronicUIPostprocessor {
|
|||
aapsLogger.debug(LTag.PUMP, "New time was {} set.", response ? "" : "NOT");
|
||||
|
||||
if (response) {
|
||||
MedtronicUtil.getPumpTime().timeDifference = 0;
|
||||
medtronicUtil.getPumpTime().timeDifference = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -122,10 +133,10 @@ class MedtronicUIPostprocessor {
|
|||
case GetBatteryStatus: {
|
||||
BatteryStatusDTO batteryStatusDTO = (BatteryStatusDTO) uiTask.returnData;
|
||||
|
||||
pumpStatus.batteryRemaining = batteryStatusDTO.getCalculatedPercent(pumpStatus.batteryType);
|
||||
medtronicPumpStatus.batteryRemaining = batteryStatusDTO.getCalculatedPercent(medtronicPumpStatus.batteryType);
|
||||
|
||||
if (batteryStatusDTO.voltage != null) {
|
||||
pumpStatus.batteryVoltage = batteryStatusDTO.voltage;
|
||||
medtronicPumpStatus.batteryVoltage = batteryStatusDTO.voltage;
|
||||
}
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "BatteryStatus: {}", batteryStatusDTO.toString());
|
||||
|
@ -134,9 +145,9 @@ class MedtronicUIPostprocessor {
|
|||
break;
|
||||
|
||||
case PumpModel: {
|
||||
if (pumpStatus.medtronicDeviceType != MedtronicUtil.getMedtronicPumpModel()) {
|
||||
if (medtronicPumpStatus.medtronicDeviceType != medtronicUtil.getMedtronicPumpModel()) {
|
||||
aapsLogger.warn(LTag.PUMP, "Configured pump is different then pump detected !");
|
||||
sendNotification(MedtronicNotificationType.PumpTypeNotSame, resourceHelper, rxBus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpTypeNotSame, resourceHelper, rxBus);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -166,7 +177,7 @@ class MedtronicUIPostprocessor {
|
|||
|
||||
clockDTO.timeDifference = (int) dur.getStandardSeconds();
|
||||
|
||||
MedtronicUtil.setPumpTime(clockDTO);
|
||||
medtronicUtil.setPumpTime(clockDTO);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "Pump Time: " + clockDTO.localDeviceTime + ", DeviceTime=" + clockDTO.pumpTime + //
|
||||
", diff: " + dur.getStandardSeconds() + " s");
|
||||
|
@ -190,29 +201,23 @@ class MedtronicUIPostprocessor {
|
|||
|
||||
Map<String, PumpSettingDTO> settings = (Map<String, PumpSettingDTO>) uiTask.returnData;
|
||||
|
||||
MedtronicUtil.setSettings(settings);
|
||||
medtronicUtil.setSettings(settings);
|
||||
|
||||
PumpSettingDTO checkValue = null;
|
||||
PumpSettingDTO checkValue;
|
||||
|
||||
if (pumpStatus == null) {
|
||||
aapsLogger.debug(LTag.PUMP, "Pump Status: was null");
|
||||
pumpStatus = MedtronicUtil.getPumpStatus();
|
||||
aapsLogger.debug(LTag.PUMP, "Pump Status: " + this.pumpStatus);
|
||||
}
|
||||
|
||||
this.pumpStatus.verifyConfiguration();
|
||||
medtronicPumpPlugin.getRileyLinkService().verifyConfiguration();
|
||||
|
||||
// check profile
|
||||
if (!"Yes".equals(settings.get("PCFG_BASAL_PROFILES_ENABLED").value)) {
|
||||
aapsLogger.error(LTag.PUMP, "Basal profiles are not enabled on pump.");
|
||||
sendNotification(MedtronicNotificationType.PumpBasalProfilesNotEnabled, resourceHelper, rxBus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpBasalProfilesNotEnabled, resourceHelper, rxBus);
|
||||
|
||||
} else {
|
||||
checkValue = settings.get("PCFG_ACTIVE_BASAL_PROFILE");
|
||||
|
||||
if (!"STD".equals(checkValue.value)) {
|
||||
aapsLogger.error("Basal profile set on pump is incorrect (must be STD).");
|
||||
sendNotification(MedtronicNotificationType.PumpIncorrectBasalProfileSelected, resourceHelper, rxBus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpIncorrectBasalProfileSelected, resourceHelper, rxBus);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -222,23 +227,23 @@ class MedtronicUIPostprocessor {
|
|||
|
||||
if (!"Units".equals(checkValue.value)) {
|
||||
aapsLogger.error("Wrong TBR type set on pump (must be Absolute).");
|
||||
sendNotification(MedtronicNotificationType.PumpWrongTBRTypeSet, resourceHelper, rxBus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpWrongTBRTypeSet, resourceHelper, rxBus);
|
||||
}
|
||||
|
||||
// MAXes
|
||||
|
||||
checkValue = settings.get("PCFG_MAX_BOLUS");
|
||||
|
||||
if (!MedtronicUtil.isSame(Double.parseDouble(checkValue.value), pumpStatus.maxBolus)) {
|
||||
aapsLogger.error("Wrong Max Bolus set on Pump (current={}, required={}).", checkValue.value, pumpStatus.maxBolus);
|
||||
sendNotification(MedtronicNotificationType.PumpWrongMaxBolusSet, resourceHelper, rxBus, pumpStatus.maxBolus);
|
||||
if (!medtronicUtil.isSame(Double.parseDouble(checkValue.value), medtronicPumpStatus.maxBolus)) {
|
||||
aapsLogger.error("Wrong Max Bolus set on Pump (current={}, required={}).", checkValue.value, medtronicPumpStatus.maxBolus);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpWrongMaxBolusSet, resourceHelper, rxBus, medtronicPumpStatus.maxBolus);
|
||||
}
|
||||
|
||||
checkValue = settings.get("PCFG_MAX_BASAL");
|
||||
|
||||
if (!MedtronicUtil.isSame(Double.parseDouble(checkValue.value), pumpStatus.maxBasal)) {
|
||||
aapsLogger.error("Wrong Max Basal set on Pump (current={}, required={}).", checkValue.value, pumpStatus.maxBasal);
|
||||
sendNotification(MedtronicNotificationType.PumpWrongMaxBasalSet, resourceHelper, rxBus, pumpStatus.maxBasal);
|
||||
if (!medtronicUtil.isSame(Double.parseDouble(checkValue.value), medtronicPumpStatus.maxBasal)) {
|
||||
aapsLogger.error("Wrong Max Basal set on Pump (current={}, required={}).", checkValue.value, medtronicPumpStatus.maxBasal);
|
||||
medtronicUtil.sendNotification(MedtronicNotificationType.PumpWrongMaxBasalSet, resourceHelper, rxBus, medtronicPumpStatus.maxBasal);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.ui;
|
||||
|
||||
import org.joda.time.LocalDateTime;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBus;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BasalProfile;
|
||||
|
@ -15,6 +15,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.TempBasalPair;
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicUIResponseType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventMedtronicDeviceStatusChange;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventMedtronicPumpValuesChanged;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
@ -25,7 +26,12 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
|||
|
||||
public class MedtronicUITask {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMP);
|
||||
@Inject RxBusWrapper rxBus;
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject MedtronicPumpStatus medtronicPumpStatus;
|
||||
@Inject MedtronicUtil medtronicUtil;
|
||||
|
||||
private final HasAndroidInjector injector;
|
||||
|
||||
public MedtronicCommandType commandType;
|
||||
public Object returnData;
|
||||
|
@ -36,12 +42,16 @@ public class MedtronicUITask {
|
|||
MedtronicUIResponseType responseType;
|
||||
|
||||
|
||||
public MedtronicUITask(MedtronicCommandType commandType) {
|
||||
public MedtronicUITask(HasAndroidInjector injector, MedtronicCommandType commandType) {
|
||||
this.injector = injector;
|
||||
this.injector.androidInjector().inject(this);
|
||||
this.commandType = commandType;
|
||||
}
|
||||
|
||||
|
||||
public MedtronicUITask(MedtronicCommandType commandType, Object... parameters) {
|
||||
public MedtronicUITask(HasAndroidInjector injector, MedtronicCommandType commandType, Object... parameters) {
|
||||
this.injector = injector;
|
||||
this.injector.androidInjector().inject(this);
|
||||
this.commandType = commandType;
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
@ -49,8 +59,7 @@ public class MedtronicUITask {
|
|||
|
||||
public void execute(MedtronicCommunicationManager communicationManager) {
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("MedtronicUITask: @@@ In execute. {}", commandType);
|
||||
aapsLogger.debug(LTag.PUMP, "MedtronicUITask: @@@ In execute. {}", commandType);
|
||||
|
||||
switch (commandType) {
|
||||
case PumpModel: {
|
||||
|
@ -70,7 +79,7 @@ public class MedtronicUITask {
|
|||
|
||||
case GetRealTimeClock: {
|
||||
returnData = communicationManager.getPumpTime();
|
||||
MedtronicUtil.setPumpTime(null);
|
||||
medtronicUtil.setPumpTime(null);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -132,7 +141,7 @@ public class MedtronicUITask {
|
|||
break;
|
||||
|
||||
default: {
|
||||
LOG.warn("This commandType is not supported (yet) - {}.", commandType);
|
||||
aapsLogger.warn(LTag.PUMP, "This commandType is not supported (yet) - {}.", commandType);
|
||||
// invalid = true;
|
||||
responseType = MedtronicUIResponseType.Invalid;
|
||||
}
|
||||
|
@ -163,12 +172,12 @@ public class MedtronicUITask {
|
|||
}
|
||||
|
||||
|
||||
public Double getDoubleFromParameters(int index) {
|
||||
Double getDoubleFromParameters(int index) {
|
||||
return (Double) parameters[index];
|
||||
}
|
||||
|
||||
|
||||
public Integer getIntegerFromParameters(int index) {
|
||||
private Integer getIntegerFromParameters(int index) {
|
||||
return (Integer) parameters[index];
|
||||
}
|
||||
|
||||
|
@ -185,25 +194,24 @@ public class MedtronicUITask {
|
|||
|
||||
void postProcess(MedtronicUIPostprocessor postprocessor) {
|
||||
|
||||
if (isLogEnabled())
|
||||
LOG.debug("MedtronicUITask: @@@ In execute. {}", commandType);
|
||||
aapsLogger.debug(LTag.PUMP, "MedtronicUITask: @@@ In execute. {}", commandType);
|
||||
|
||||
if (responseType == MedtronicUIResponseType.Data) {
|
||||
postprocessor.postProcessData(this);
|
||||
}
|
||||
|
||||
if (responseType == MedtronicUIResponseType.Invalid) {
|
||||
RxBus.Companion.getINSTANCE().send(new EventMedtronicDeviceStatusChange(PumpDeviceState.ErrorWhenCommunicating,
|
||||
rxBus.send(new EventMedtronicDeviceStatusChange(PumpDeviceState.ErrorWhenCommunicating,
|
||||
"Unsupported command in MedtronicUITask"));
|
||||
} else if (responseType == MedtronicUIResponseType.Error) {
|
||||
RxBus.Companion.getINSTANCE().send(new EventMedtronicDeviceStatusChange(PumpDeviceState.ErrorWhenCommunicating,
|
||||
rxBus.send(new EventMedtronicDeviceStatusChange(PumpDeviceState.ErrorWhenCommunicating,
|
||||
errorDescription));
|
||||
} else {
|
||||
RxBus.Companion.getINSTANCE().send(new EventMedtronicPumpValuesChanged());
|
||||
MedtronicUtil.getPumpStatus().setLastCommunicationToNow();
|
||||
rxBus.send(new EventMedtronicPumpValuesChanged());
|
||||
medtronicPumpStatus.setLastCommunicationToNow();
|
||||
}
|
||||
|
||||
MedtronicUtil.setCurrentCommand(null);
|
||||
medtronicUtil.setCurrentCommand(null);
|
||||
}
|
||||
|
||||
|
||||
|
@ -212,16 +220,11 @@ public class MedtronicUITask {
|
|||
}
|
||||
|
||||
|
||||
public Object getParameter(int index) {
|
||||
Object getParameter(int index) {
|
||||
return parameters[index];
|
||||
}
|
||||
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMP);
|
||||
}
|
||||
|
||||
|
||||
public MedtronicUIResponseType getResponseType() {
|
||||
return this.responseType;
|
||||
}
|
||||
|
|
|
@ -18,10 +18,12 @@ import java.util.List;
|
|||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||
import info.nightscout.androidaps.db.CareportalEvent;
|
||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
||||
import info.nightscout.androidaps.db.DbObjectBase;
|
||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||
import info.nightscout.androidaps.db.Source;
|
||||
|
@ -31,6 +33,7 @@ import info.nightscout.androidaps.interfaces.ActivePluginProvider;
|
|||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
||||
|
@ -67,22 +70,23 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
|||
|
||||
// All things marked with "TODO: Fix db code" needs to be updated in new 2.5 database code
|
||||
|
||||
@Singleton
|
||||
public class MedtronicHistoryData {
|
||||
|
||||
private static AAPSLogger aapsLogger;
|
||||
private SP sp;
|
||||
private ActivePluginProvider activePlugin;
|
||||
private final AAPSLogger aapsLogger;
|
||||
private final SP sp;
|
||||
private final ActivePluginProvider activePlugin;
|
||||
private final MedtronicUtil medtronicUtil;
|
||||
private final MedtronicPumpHistoryDecoder medtronicPumpHistoryDecoder;
|
||||
|
||||
private List<PumpHistoryEntry> allHistory = null;
|
||||
private List<PumpHistoryEntry> allHistory;
|
||||
private List<PumpHistoryEntry> newHistory = null;
|
||||
|
||||
private Long lastHistoryRecordTime;
|
||||
private boolean isInit = false;
|
||||
|
||||
private Gson gson;
|
||||
private Gson gsonCore;
|
||||
private Gson gson; // cannot be initialized in constructor because of injection
|
||||
private Gson gsonCore; // cannot be initialized in constructor because of injection
|
||||
|
||||
private DatabaseHelper databaseHelper = MainApp.getDbHelper();
|
||||
private ClockDTO pumpTime;
|
||||
|
||||
private long lastIdUsed = 0;
|
||||
|
@ -94,25 +98,32 @@ public class MedtronicHistoryData {
|
|||
*/
|
||||
public static boolean doubleBolusDebug = false;
|
||||
|
||||
|
||||
public MedtronicHistoryData(AAPSLogger aapsLogger, SP sp, ActivePluginProvider activePlugin) {
|
||||
@Inject
|
||||
public MedtronicHistoryData(
|
||||
AAPSLogger aapsLogger,
|
||||
SP sp,
|
||||
ActivePluginProvider activePlugin,
|
||||
MedtronicUtil medtronicUtil,
|
||||
MedtronicPumpHistoryDecoder medtronicPumpHistoryDecoder
|
||||
) {
|
||||
this.allHistory = new ArrayList<>();
|
||||
this.gson = MedtronicUtil.gsonInstance;
|
||||
this.gsonCore = MedtronicUtil.getGsonInstanceCore();
|
||||
|
||||
this.aapsLogger = aapsLogger;
|
||||
this.sp = sp;
|
||||
this.activePlugin = activePlugin;
|
||||
|
||||
if (this.gson == null) {
|
||||
this.gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
|
||||
}
|
||||
|
||||
if (this.gsonCore == null) {
|
||||
this.gsonCore = new GsonBuilder().create();
|
||||
}
|
||||
this.medtronicUtil = medtronicUtil;
|
||||
this.medtronicPumpHistoryDecoder = medtronicPumpHistoryDecoder;
|
||||
}
|
||||
|
||||
private Gson gson() {
|
||||
if (gson == null) gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
|
||||
return gson;
|
||||
}
|
||||
|
||||
private Gson gsonCore() {
|
||||
if (gsonCore == null) gsonCore = new GsonBuilder().create();
|
||||
return gsonCore;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add New History entries
|
||||
|
@ -134,11 +145,11 @@ public class MedtronicHistoryData {
|
|||
|
||||
this.newHistory = newEntries;
|
||||
|
||||
showLogs("List of history (before filtering): [" + this.newHistory.size() + "]", gson.toJson(this.newHistory));
|
||||
showLogs("List of history (before filtering): [" + this.newHistory.size() + "]", gson().toJson(this.newHistory));
|
||||
}
|
||||
|
||||
|
||||
private static void showLogs(String header, String data) {
|
||||
private void showLogs(String header, String data) {
|
||||
if (header != null) {
|
||||
aapsLogger.debug(LTag.PUMP, header);
|
||||
}
|
||||
|
@ -208,7 +219,7 @@ public class MedtronicHistoryData {
|
|||
|
||||
aapsLogger.debug(LTag.PUMP, "New History entries found: {}", this.newHistory.size());
|
||||
|
||||
showLogs("List of history (after filtering): [" + this.newHistory.size() + "]", gson.toJson(this.newHistory));
|
||||
showLogs("List of history (after filtering): [" + this.newHistory.size() + "]", gson().toJson(this.newHistory));
|
||||
|
||||
}
|
||||
|
||||
|
@ -321,7 +332,7 @@ public class MedtronicHistoryData {
|
|||
|
||||
List<PumpHistoryEntry> items = getDataForPumpSuspends();
|
||||
|
||||
showLogs("isPumpSuspended: ", MedtronicUtil.gsonInstance.toJson(items));
|
||||
showLogs("isPumpSuspended: ", gson().toJson(items));
|
||||
|
||||
if (isCollectionNotEmpty(items)) {
|
||||
|
||||
|
@ -407,7 +418,7 @@ public class MedtronicHistoryData {
|
|||
// Prime (for reseting autosense)
|
||||
List<PumpHistoryEntry> primeRecords = getFilteredItems(PumpHistoryEntryType.Prime);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: Prime [count={}, items={}]", primeRecords.size(), gson.toJson(primeRecords));
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: Prime [count={}, items={}]", primeRecords.size(), gson().toJson(primeRecords));
|
||||
|
||||
if (isCollectionNotEmpty(primeRecords)) {
|
||||
try {
|
||||
|
@ -421,7 +432,7 @@ public class MedtronicHistoryData {
|
|||
// TDD
|
||||
List<PumpHistoryEntry> tdds = getFilteredItems(PumpHistoryEntryType.EndResultTotals, getTDDType());
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: TDD [count={}, items={}]", tdds.size(), gson.toJson(tdds));
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: TDD [count={}, items={}]", tdds.size(), gson().toJson(tdds));
|
||||
|
||||
if (isCollectionNotEmpty(tdds)) {
|
||||
try {
|
||||
|
@ -432,12 +443,12 @@ public class MedtronicHistoryData {
|
|||
}
|
||||
}
|
||||
|
||||
pumpTime = MedtronicUtil.getPumpTime();
|
||||
pumpTime = medtronicUtil.getPumpTime();
|
||||
|
||||
// Bolus
|
||||
List<PumpHistoryEntry> treatments = getFilteredItems(PumpHistoryEntryType.Bolus);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: Bolus [count={}, items={}]", treatments.size(), gson.toJson(treatments));
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: Bolus [count={}, items={}]", treatments.size(), gson().toJson(treatments));
|
||||
|
||||
if (treatments.size() > 0) {
|
||||
try {
|
||||
|
@ -451,7 +462,7 @@ public class MedtronicHistoryData {
|
|||
// TBR
|
||||
List<PumpHistoryEntry> tbrs = getFilteredItems(PumpHistoryEntryType.TempBasalCombined);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: TBRs Processed [count={}, items={}]", tbrs.size(), gson.toJson(tbrs));
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: TBRs Processed [count={}, items={}]", tbrs.size(), gson().toJson(tbrs));
|
||||
|
||||
if (tbrs.size() > 0) {
|
||||
try {
|
||||
|
@ -463,7 +474,7 @@ public class MedtronicHistoryData {
|
|||
}
|
||||
|
||||
// 'Delivery Suspend'
|
||||
List<TempBasalProcessDTO> suspends = null;
|
||||
List<TempBasalProcessDTO> suspends;
|
||||
|
||||
try {
|
||||
suspends = getSuspends();
|
||||
|
@ -473,7 +484,7 @@ public class MedtronicHistoryData {
|
|||
}
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "ProcessHistoryData: 'Delivery Suspend' Processed [count={}, items={}]", suspends.size(),
|
||||
gson.toJson(suspends));
|
||||
gson().toJson(suspends));
|
||||
|
||||
if (isCollectionNotEmpty(suspends)) {
|
||||
try {
|
||||
|
@ -539,9 +550,9 @@ public class MedtronicHistoryData {
|
|||
|
||||
List<PumpHistoryEntry> tdds = filterTDDs(tddsIn);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, getLogPrefix() + "TDDs found: {}.\n{}", tdds.size(), gson.toJson(tdds));
|
||||
aapsLogger.debug(LTag.PUMP, getLogPrefix() + "TDDs found: {}.\n{}", tdds.size(), gson().toJson(tdds));
|
||||
|
||||
List<TDD> tddsDb = databaseHelper.getTDDsForLastXDays(3);
|
||||
List<TDD> tddsDb = MainApp.getDbHelper().getTDDsForLastXDays(3);
|
||||
|
||||
for (PumpHistoryEntry tdd : tdds) {
|
||||
|
||||
|
@ -557,7 +568,7 @@ public class MedtronicHistoryData {
|
|||
|
||||
aapsLogger.debug(LTag.PUMP, "TDD Add: {}", tddNew);
|
||||
|
||||
databaseHelper.createOrUpdateTDD(tddNew);
|
||||
MainApp.getDbHelper().createOrUpdateTDD(tddNew);
|
||||
|
||||
} else {
|
||||
|
||||
|
@ -566,7 +577,7 @@ public class MedtronicHistoryData {
|
|||
|
||||
aapsLogger.debug(LTag.PUMP, "TDD Edit: {}", tddDbEntry);
|
||||
|
||||
databaseHelper.createOrUpdateTDD(tddDbEntry);
|
||||
MainApp.getDbHelper().createOrUpdateTDD(tddDbEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -595,13 +606,11 @@ public class MedtronicHistoryData {
|
|||
|
||||
long oldestTimestamp = getOldestTimestamp(entryList);
|
||||
|
||||
Gson gson = MedtronicUtil.getGsonInstance();
|
||||
|
||||
List<? extends DbObjectBase> entriesFromHistory = getDatabaseEntriesByLastTimestamp(oldestTimestamp, ProcessHistoryRecord.Bolus);
|
||||
|
||||
if (doubleBolusDebug)
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: List (before filter): {}, FromDb={}", gson.toJson(entryList),
|
||||
gsonCore.toJson(entriesFromHistory));
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: List (before filter): {}, FromDb={}", gson().toJson(entryList),
|
||||
gsonCore().toJson(entriesFromHistory));
|
||||
|
||||
filterOutAlreadyAddedEntries(entryList, entriesFromHistory);
|
||||
|
||||
|
@ -614,8 +623,8 @@ public class MedtronicHistoryData {
|
|||
filterOutNonInsulinEntries(entriesFromHistory);
|
||||
|
||||
if (doubleBolusDebug)
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: List (after filter): {}, FromDb={}", gson.toJson(entryList),
|
||||
gsonCore.toJson(entriesFromHistory));
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: List (after filter): {}, FromDb={}", gson().toJson(entryList),
|
||||
gsonCore().toJson(entriesFromHistory));
|
||||
|
||||
if (isCollectionEmpty(entriesFromHistory)) {
|
||||
for (PumpHistoryEntry treatment : entryList) {
|
||||
|
@ -678,8 +687,8 @@ public class MedtronicHistoryData {
|
|||
|
||||
List<? extends DbObjectBase> entriesFromHistory = getDatabaseEntriesByLastTimestamp(oldestTimestamp, ProcessHistoryRecord.TBR);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, ProcessHistoryRecord.TBR.getDescription() + " List (before filter): {}, FromDb={}", gson.toJson(entryList),
|
||||
gson.toJson(entriesFromHistory));
|
||||
aapsLogger.debug(LTag.PUMP, ProcessHistoryRecord.TBR.getDescription() + " List (before filter): {}, FromDb={}", gson().toJson(entryList),
|
||||
gson().toJson(entriesFromHistory));
|
||||
|
||||
|
||||
TempBasalProcessDTO processDTO = null;
|
||||
|
@ -729,7 +738,7 @@ public class MedtronicHistoryData {
|
|||
|
||||
tempBasal.durationInMinutes = tempBasalProcessDTO.getDuration();
|
||||
|
||||
databaseHelper.createOrUpdate(tempBasal);
|
||||
MainApp.getDbHelper().createOrUpdate(tempBasal);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "Edit " + ProcessHistoryRecord.TBR.getDescription() + " - (entryFromDb={}) ", tempBasal);
|
||||
} else {
|
||||
|
@ -777,7 +786,7 @@ public class MedtronicHistoryData {
|
|||
}
|
||||
}
|
||||
|
||||
TemporaryBasal tempBasal = databaseHelper.findTempBasalByPumpId(pumpId);
|
||||
TemporaryBasal tempBasal = MainApp.getDbHelper().findTempBasalByPumpId(pumpId);
|
||||
return tempBasal;
|
||||
}
|
||||
|
||||
|
@ -798,7 +807,7 @@ public class MedtronicHistoryData {
|
|||
//proposedTime += (this.pumpTime.timeDifference * 1000);
|
||||
|
||||
if (doubleBolusDebug)
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: findDbEntry Treatment={}, FromDb={}", treatment, gson.toJson(entriesFromHistory));
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: findDbEntry Treatment={}, FromDb={}", treatment, gson().toJson(entriesFromHistory));
|
||||
|
||||
if (entriesFromHistory.size() == 0) {
|
||||
if (doubleBolusDebug)
|
||||
|
@ -852,10 +861,10 @@ public class MedtronicHistoryData {
|
|||
|
||||
if (min == 0 && sec == 10 && outList.size() > 1) {
|
||||
aapsLogger.error("Too many entries (with too small diff): (timeDiff=[min={},sec={}],count={},list={})",
|
||||
min, sec, outList.size(), gson.toJson(outList));
|
||||
min, sec, outList.size(), gson().toJson(outList));
|
||||
if (doubleBolusDebug)
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: findDbEntry Error - Too many entries (with too small diff): (timeDiff=[min={},sec={}],count={},list={})",
|
||||
min, sec, outList.size(), gson.toJson(outList));
|
||||
min, sec, outList.size(), gson().toJson(outList));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -868,7 +877,7 @@ public class MedtronicHistoryData {
|
|||
if (processHistoryRecord == ProcessHistoryRecord.Bolus) {
|
||||
return activePlugin.getActiveTreatments().getTreatmentsFromHistoryAfterTimestamp(startTimestamp);
|
||||
} else {
|
||||
return databaseHelper.getTemporaryBasalsDataFromTime(startTimestamp, true);
|
||||
return MainApp.getDbHelper().getTemporaryBasalsDataFromTime(startTimestamp, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -905,8 +914,8 @@ public class MedtronicHistoryData {
|
|||
|
||||
if (doubleBolusDebug)
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: filterOutAlreadyAddedEntries: PumpHistory={}, Treatments={}",
|
||||
gson.toJson(removeTreatmentsFromPH),
|
||||
gsonCore.toJson(removeTreatmentsFromHistory));
|
||||
gson().toJson(removeTreatmentsFromPH),
|
||||
gsonCore().toJson(removeTreatmentsFromHistory));
|
||||
|
||||
treatmentsFromHistory.removeAll(removeTreatmentsFromHistory);
|
||||
}
|
||||
|
@ -976,7 +985,7 @@ public class MedtronicHistoryData {
|
|||
treatment.pumpId = bolus.getPumpId();
|
||||
treatment.insulin = bolusDTO.getDeliveredAmount();
|
||||
|
||||
TreatmentService.UpdateReturn updateReturn = ((TreatmentsPlugin)activePlugin.getActiveTreatments()).getService().createOrUpdateMedtronic(treatment, false);
|
||||
TreatmentService.UpdateReturn updateReturn = ((TreatmentsPlugin) activePlugin.getActiveTreatments()).getService().createOrUpdateMedtronic(treatment, false);
|
||||
|
||||
if (doubleBolusDebug)
|
||||
aapsLogger.debug(LTag.PUMP, "DoubleBolusDebug: addBolus(tretament!=null): NewTreatment={}, UpdateReturn={}", treatment, updateReturn);
|
||||
|
@ -1026,7 +1035,7 @@ public class MedtronicHistoryData {
|
|||
|
||||
treatment.setLinkedObject(temporaryBasalDb);
|
||||
|
||||
databaseHelper.createOrUpdate(temporaryBasalDb);
|
||||
MainApp.getDbHelper().createOrUpdate(temporaryBasalDb);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, operation + " - [date={},pumpId={}, rate={} {}, duration={}]", //
|
||||
temporaryBasalDb.date, //
|
||||
|
@ -1042,7 +1051,7 @@ public class MedtronicHistoryData {
|
|||
|
||||
for (TempBasalProcessDTO tempBasalProcess : tempBasalProcessList) {
|
||||
|
||||
TemporaryBasal tempBasal = databaseHelper.findTempBasalByPumpId(tempBasalProcess.itemOne.getPumpId());
|
||||
TemporaryBasal tempBasal = MainApp.getDbHelper().findTempBasalByPumpId(tempBasalProcess.itemOne.getPumpId());
|
||||
|
||||
if (tempBasal == null) {
|
||||
// add
|
||||
|
@ -1058,7 +1067,7 @@ public class MedtronicHistoryData {
|
|||
tempBasalProcess.itemOne.setLinkedObject(tempBasal);
|
||||
tempBasalProcess.itemTwo.setLinkedObject(tempBasal);
|
||||
|
||||
databaseHelper.createOrUpdate(tempBasal);
|
||||
MainApp.getDbHelper().createOrUpdate(tempBasal);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1205,11 +1214,11 @@ public class MedtronicHistoryData {
|
|||
|
||||
|
||||
if (!finishedItems) {
|
||||
showLogs("NoDeliveryRewindPrimeRecords: Not finished Items: ", gson.toJson(tempData));
|
||||
showLogs("NoDeliveryRewindPrimeRecords: Not finished Items: ", gson().toJson(tempData));
|
||||
return outList;
|
||||
}
|
||||
|
||||
showLogs("NoDeliveryRewindPrimeRecords: Records to evaluate: ", gson.toJson(tempData));
|
||||
showLogs("NoDeliveryRewindPrimeRecords: Records to evaluate: ", gson().toJson(tempData));
|
||||
|
||||
List<PumpHistoryEntry> items = getFilteredItems(tempData, //
|
||||
PumpHistoryEntryType.Prime
|
||||
|
@ -1305,7 +1314,7 @@ public class MedtronicHistoryData {
|
|||
}
|
||||
}
|
||||
|
||||
LocalDateTime oldestEntryTime = null;
|
||||
LocalDateTime oldestEntryTime;
|
||||
|
||||
try {
|
||||
|
||||
|
@ -1370,11 +1379,11 @@ public class MedtronicHistoryData {
|
|||
|
||||
private PumpHistoryEntryType getTDDType() {
|
||||
|
||||
if (MedtronicUtil.getMedtronicPumpModel() == null) {
|
||||
if (medtronicUtil.getMedtronicPumpModel() == null) {
|
||||
return PumpHistoryEntryType.EndResultTotals;
|
||||
}
|
||||
|
||||
switch (MedtronicUtil.getMedtronicPumpModel()) {
|
||||
switch (medtronicUtil.getMedtronicPumpModel()) {
|
||||
|
||||
case Medtronic_515:
|
||||
case Medtronic_715:
|
||||
|
@ -1401,13 +1410,13 @@ public class MedtronicHistoryData {
|
|||
|
||||
List<PumpHistoryEntry> filteredItems = getFilteredItems(PumpHistoryEntryType.ChangeBasalProfile_NewProfile);
|
||||
|
||||
aapsLogger.debug(LTag.PUMP, "hasBasalProfileChanged. Items: " + gson.toJson(filteredItems));
|
||||
aapsLogger.debug(LTag.PUMP, "hasBasalProfileChanged. Items: " + gson().toJson(filteredItems));
|
||||
|
||||
return (filteredItems.size() > 0);
|
||||
}
|
||||
|
||||
|
||||
public void processLastBasalProfileChange(MedtronicPumpStatus mdtPumpStatus) {
|
||||
public void processLastBasalProfileChange(PumpType pumpType, MedtronicPumpStatus mdtPumpStatus) {
|
||||
|
||||
List<PumpHistoryEntry> filteredItems = getFilteredItems(PumpHistoryEntryType.ChangeBasalProfile_NewProfile);
|
||||
|
||||
|
@ -1433,7 +1442,7 @@ public class MedtronicHistoryData {
|
|||
aapsLogger.debug(LTag.PUMP, "processLastBasalProfileChange. item found, setting new basalProfileLocally: " + newProfile);
|
||||
BasalProfile basalProfile = (BasalProfile) newProfile.getDecodedData().get("Object");
|
||||
|
||||
mdtPumpStatus.basalsByHour = basalProfile.getProfilesByHour();
|
||||
mdtPumpStatus.basalsByHour = basalProfile.getProfilesByHour(pumpType);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1447,7 +1456,6 @@ public class MedtronicHistoryData {
|
|||
public void setLastHistoryRecordTime(Long lastHistoryRecordTime) {
|
||||
|
||||
// this.previousLastHistoryRecordTime = this.lastHistoryRecordTime;
|
||||
this.lastHistoryRecordTime = lastHistoryRecordTime;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1470,8 +1478,8 @@ public class MedtronicHistoryData {
|
|||
|
||||
for (PumpHistoryEntry pumpHistoryEntry : TBRs_Input) {
|
||||
if (map.containsKey(pumpHistoryEntry.DT)) {
|
||||
MedtronicPumpHistoryDecoder.decodeTempBasal(map.get(pumpHistoryEntry.DT), pumpHistoryEntry);
|
||||
pumpHistoryEntry.setEntryType(PumpHistoryEntryType.TempBasalCombined);
|
||||
medtronicPumpHistoryDecoder.decodeTempBasal(map.get(pumpHistoryEntry.DT), pumpHistoryEntry);
|
||||
pumpHistoryEntry.setEntryType(medtronicUtil.getMedtronicPumpModel(), PumpHistoryEntryType.TempBasalCombined);
|
||||
TBRs.add(pumpHistoryEntry);
|
||||
map.remove(pumpHistoryEntry.DT);
|
||||
} else {
|
||||
|
|
|
@ -3,14 +3,13 @@ package info.nightscout.androidaps.plugins.pump.medtronic.data.dto;
|
|||
import com.google.gson.annotations.Expose;
|
||||
|
||||
import org.joda.time.Instant;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
@ -32,7 +31,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
|||
*/
|
||||
public class BasalProfile {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
private final AAPSLogger aapsLogger;
|
||||
|
||||
public static final int MAX_RAW_DATA_SIZE = (48 * 3) + 1;
|
||||
private static final boolean DEBUG_BASALPROFILE = false;
|
||||
|
@ -41,18 +40,20 @@ public class BasalProfile {
|
|||
private List<BasalProfileEntry> listEntries;
|
||||
|
||||
|
||||
public BasalProfile() {
|
||||
public BasalProfile(AAPSLogger aapsLogger) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
public BasalProfile(byte[] data) {
|
||||
public BasalProfile(AAPSLogger aapsLogger, byte[] data) {
|
||||
this .aapsLogger = aapsLogger;
|
||||
setRawData(data);
|
||||
}
|
||||
|
||||
|
||||
// this asUINT8 should be combined with Record.asUINT8, and placed in a new util class.
|
||||
protected static int readUnsignedByte(byte b) {
|
||||
private static int readUnsignedByte(byte b) {
|
||||
return (b < 0) ? b + 256 : b;
|
||||
}
|
||||
|
||||
|
@ -65,9 +66,9 @@ public class BasalProfile {
|
|||
}
|
||||
|
||||
|
||||
public boolean setRawData(byte[] data) {
|
||||
private boolean setRawData(byte[] data) {
|
||||
if (data == null) {
|
||||
LOG.error("setRawData: buffer is null!");
|
||||
aapsLogger.error(LTag.PUMPCOMM,"setRawData: buffer is null!");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -90,7 +91,7 @@ public class BasalProfile {
|
|||
|
||||
public boolean setRawDataFromHistory(byte[] data) {
|
||||
if (data == null) {
|
||||
LOG.error("setRawData: buffer is null!");
|
||||
aapsLogger.error(LTag.PUMPCOMM,"setRawData: buffer is null!");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -115,13 +116,13 @@ public class BasalProfile {
|
|||
|
||||
|
||||
public void dumpBasalProfile() {
|
||||
LOG.debug("Basal Profile entries:");
|
||||
aapsLogger.debug(LTag.PUMPCOMM,"Basal Profile entries:");
|
||||
List<BasalProfileEntry> entries = getEntries();
|
||||
for (int i = 0; i < entries.size(); i++) {
|
||||
BasalProfileEntry entry = entries.get(i);
|
||||
String startString = entry.startTime.toString("HH:mm");
|
||||
// this doesn't work
|
||||
LOG.debug(String.format("Entry %d, rate=%.3f (0x%02X), start=%s (0x%02X)", i + 1, entry.rate,
|
||||
aapsLogger.debug(LTag.PUMPCOMM,String.format("Entry %d, rate=%.3f (0x%02X), start=%s (0x%02X)", i + 1, entry.rate,
|
||||
entry.rate_raw, startString, entry.startTime_raw));
|
||||
|
||||
}
|
||||
|
@ -168,14 +169,14 @@ public class BasalProfile {
|
|||
BasalProfileEntry rval = new BasalProfileEntry();
|
||||
List<BasalProfileEntry> entries = getEntries();
|
||||
if (entries.size() == 0) {
|
||||
LOG.warn(String.format("getEntryForTime(%s): table is empty",
|
||||
aapsLogger.warn(LTag.PUMPCOMM,String.format("getEntryForTime(%s): table is empty",
|
||||
when.toDateTime().toLocalTime().toString("HH:mm")));
|
||||
return rval;
|
||||
}
|
||||
// Log.w(TAG,"Assuming first entry");
|
||||
rval = entries.get(0);
|
||||
if (entries.size() == 1) {
|
||||
LOG.debug("getEntryForTime: Only one entry in profile");
|
||||
aapsLogger.debug(LTag.PUMPCOMM,"getEntryForTime: Only one entry in profile");
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
@ -185,17 +186,17 @@ public class BasalProfile {
|
|||
while (!done) {
|
||||
BasalProfileEntry entry = entries.get(i);
|
||||
if (DEBUG_BASALPROFILE) {
|
||||
LOG.debug(String.format("Comparing 'now'=%s to entry 'start time'=%s", when.toDateTime().toLocalTime()
|
||||
aapsLogger.debug(LTag.PUMPCOMM,String.format("Comparing 'now'=%s to entry 'start time'=%s", when.toDateTime().toLocalTime()
|
||||
.toString("HH:mm"), entry.startTime.toString("HH:mm")));
|
||||
}
|
||||
if (localMillis >= entry.startTime.getMillisOfDay()) {
|
||||
rval = entry;
|
||||
if (DEBUG_BASALPROFILE)
|
||||
LOG.debug("Accepted Entry");
|
||||
aapsLogger.debug(LTag.PUMPCOMM,"Accepted Entry");
|
||||
} else {
|
||||
// entry at i has later start time, keep older entry
|
||||
if (DEBUG_BASALPROFILE)
|
||||
LOG.debug("Rejected Entry");
|
||||
aapsLogger.debug(LTag.PUMPCOMM,"Rejected Entry");
|
||||
done = true;
|
||||
}
|
||||
i++;
|
||||
|
@ -204,7 +205,7 @@ public class BasalProfile {
|
|||
}
|
||||
}
|
||||
if (DEBUG_BASALPROFILE) {
|
||||
LOG.debug(String.format("getEntryForTime(%s): Returning entry: rate=%.3f (%d), start=%s (%d)", when
|
||||
aapsLogger.debug(LTag.PUMPCOMM,String.format("getEntryForTime(%s): Returning entry: rate=%.3f (%d), start=%s (%d)", when
|
||||
.toDateTime().toLocalTime().toString("HH:mm"), rval.rate, rval.rate_raw,
|
||||
rval.startTime.toString("HH:mm"), rval.startTime_raw));
|
||||
}
|
||||
|
@ -216,7 +217,7 @@ public class BasalProfile {
|
|||
List<BasalProfileEntry> entries = new ArrayList<>();
|
||||
|
||||
if (mRawData == null || mRawData[2] == 0x3f) {
|
||||
LOG.warn("Raw Data is empty.");
|
||||
aapsLogger.warn(LTag.PUMPCOMM,"Raw Data is empty.");
|
||||
return entries; // an empty list
|
||||
}
|
||||
boolean done = false;
|
||||
|
@ -234,9 +235,9 @@ public class BasalProfile {
|
|||
st = readUnsignedByte(mRawData[i + 2]);
|
||||
|
||||
try {
|
||||
entries.add(new BasalProfileEntry(r, st));
|
||||
entries.add(new BasalProfileEntry(aapsLogger, r, st));
|
||||
} catch (Exception ex) {
|
||||
LOG.error("Error decoding basal profile from bytes: {}", ByteUtil.shortHexString(mRawData));
|
||||
aapsLogger.error(LTag.PUMPCOMM,"Error decoding basal profile from bytes: {}", ByteUtil.shortHexString(mRawData));
|
||||
throw ex;
|
||||
}
|
||||
|
||||
|
@ -278,17 +279,17 @@ public class BasalProfile {
|
|||
}
|
||||
|
||||
|
||||
public Double[] getProfilesByHour() {
|
||||
public Double[] getProfilesByHour(PumpType pumpType) {
|
||||
|
||||
List<BasalProfileEntry> entries = null;
|
||||
|
||||
try {
|
||||
entries = getEntries();
|
||||
} catch (Exception ex) {
|
||||
LOG.error("=============================================================================");
|
||||
LOG.error(" Error generating entries. Ex.: " + ex, ex);
|
||||
LOG.error(" rawBasalValues: " + ByteUtil.shortHexString(this.getRawData()));
|
||||
LOG.error("=============================================================================");
|
||||
aapsLogger.error(LTag.PUMPCOMM,"=============================================================================");
|
||||
aapsLogger.error(LTag.PUMPCOMM," Error generating entries. Ex.: " + ex, ex);
|
||||
aapsLogger.error(LTag.PUMPCOMM," rawBasalValues: " + ByteUtil.shortHexString(this.getRawData()));
|
||||
aapsLogger.error(LTag.PUMPCOMM,"=============================================================================");
|
||||
|
||||
//FabricUtil.createEvent("MedtronicBasalProfileGetByHourError", null);
|
||||
}
|
||||
|
@ -305,8 +306,6 @@ public class BasalProfile {
|
|||
|
||||
Double[] basalByHour = new Double[24];
|
||||
|
||||
PumpType pumpType = MedtronicUtil.getPumpStatus().pumpType;
|
||||
|
||||
for (int i = 0; i < entries.size(); i++) {
|
||||
BasalProfileEntry current = entries.get(i);
|
||||
|
||||
|
@ -368,7 +367,7 @@ public class BasalProfile {
|
|||
return L.isEnabled(L.PUMPCOMM);
|
||||
}
|
||||
|
||||
public boolean verify() {
|
||||
public boolean verify(PumpType pumpType) {
|
||||
|
||||
try {
|
||||
getEntries();
|
||||
|
@ -376,7 +375,7 @@ public class BasalProfile {
|
|||
return false;
|
||||
}
|
||||
|
||||
Double[] profilesByHour = getProfilesByHour();
|
||||
Double[] profilesByHour = getProfilesByHour(pumpType);
|
||||
|
||||
for (Double aDouble : profilesByHour) {
|
||||
if (aDouble > 35.0d)
|
||||
|
|
|
@ -1,11 +1,9 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.data.dto;
|
||||
|
||||
import org.joda.time.LocalTime;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
||||
/**
|
||||
|
@ -15,22 +13,18 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
|||
*/
|
||||
public class BasalProfileEntry {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
|
||||
public byte[] rate_raw;
|
||||
byte[] rate_raw;
|
||||
public double rate;
|
||||
public byte startTime_raw;
|
||||
byte startTime_raw;
|
||||
public LocalTime startTime; // Just a "time of day"
|
||||
|
||||
|
||||
public BasalProfileEntry() {
|
||||
rate = -9.999E6;
|
||||
rate_raw = MedtronicUtil.getByteArrayFromUnsignedShort(0xFF, true);
|
||||
startTime = new LocalTime(0);
|
||||
startTime_raw = (byte)0xFF;
|
||||
startTime_raw = (byte) 0xFF;
|
||||
}
|
||||
|
||||
|
||||
public BasalProfileEntry(double rate, int hour, int minutes) {
|
||||
byte[] data = MedtronicUtil.getBasalStrokes(rate, true);
|
||||
|
||||
|
@ -44,47 +38,42 @@ public class BasalProfileEntry {
|
|||
interval++;
|
||||
}
|
||||
|
||||
startTime_raw = (byte)interval;
|
||||
startTime_raw = (byte) interval;
|
||||
startTime = new LocalTime(hour, minutes == 30 ? 30 : 0);
|
||||
}
|
||||
|
||||
|
||||
public BasalProfileEntry(int rateStrokes, int startTimeInterval) {
|
||||
BasalProfileEntry(AAPSLogger aapsLogger, int rateStrokes, int startTimeInterval) {
|
||||
// rateByte is insulin delivery rate, U/hr, in 0.025 U increments
|
||||
// startTimeByte is time-of-day, in 30 minute increments
|
||||
rate_raw = MedtronicUtil.getByteArrayFromUnsignedShort(rateStrokes, true);
|
||||
rate = rateStrokes * 0.025;
|
||||
startTime_raw = (byte)startTimeInterval;
|
||||
startTime_raw = (byte) startTimeInterval;
|
||||
|
||||
try {
|
||||
startTime = new LocalTime(startTimeInterval / 2, (startTimeInterval % 2) * 30);
|
||||
} catch (Exception ex) {
|
||||
LOG.error(
|
||||
"Error creating BasalProfileEntry: startTimeInterval={}, startTime_raw={}, hours={}, rateStrokes={}",
|
||||
startTimeInterval, startTime_raw, startTimeInterval / 2, rateStrokes);
|
||||
aapsLogger.error(LTag.PUMPCOMM,
|
||||
"Error creating BasalProfileEntry: startTimeInterval={}, startTime_raw={}, hours={}, rateStrokes={}",
|
||||
startTimeInterval, startTime_raw, startTimeInterval / 2, rateStrokes);
|
||||
throw ex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public BasalProfileEntry(byte rateByte, int startTimeByte) {
|
||||
BasalProfileEntry(byte rateByte, int startTimeByte) {
|
||||
// rateByte is insulin delivery rate, U/hr, in 0.025 U increments
|
||||
// startTimeByte is time-of-day, in 30 minute increments
|
||||
rate_raw = MedtronicUtil.getByteArrayFromUnsignedShort(rateByte, true);
|
||||
rate = rateByte * 0.025;
|
||||
startTime_raw = (byte)startTimeByte;
|
||||
startTime_raw = (byte) startTimeByte;
|
||||
startTime = new LocalTime(startTimeByte / 2, (startTimeByte % 2) * 30);
|
||||
}
|
||||
|
||||
|
||||
public void setStartTime(LocalTime localTime) {
|
||||
this.startTime = localTime;
|
||||
}
|
||||
|
||||
|
||||
public void setRate(double rate) {
|
||||
this.rate = rate;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,8 +24,6 @@ import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpH
|
|||
|
||||
public class DailyTotalsDTO {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
|
||||
// bg avg, bg low hi, number Bgs,
|
||||
// Sen Avg, Sen Lo/Hi, Sens Cal/Data = 0/0,
|
||||
// Insulin=19.8[8,9], Basal[10,11], Bolus[13,14], Carbs,
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.data.dto;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
||||
|
@ -19,12 +19,6 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
|||
*/
|
||||
public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
|
||||
public TempBasalPair() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This constructor is for use with PumpHistoryDecoder
|
||||
*
|
||||
|
@ -34,7 +28,6 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
|||
*/
|
||||
public TempBasalPair(byte rateByte, int startTimeByte, boolean isPercent) {
|
||||
super();
|
||||
|
||||
int rateInt = ByteUtil.asUINT8(rateByte);
|
||||
|
||||
if (isPercent)
|
||||
|
@ -46,10 +39,11 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
|||
}
|
||||
|
||||
|
||||
public TempBasalPair(byte[] response) {
|
||||
public TempBasalPair(AAPSLogger aapsLogger, byte[] response) {
|
||||
super();
|
||||
|
||||
if (L.isEnabled(L.PUMPCOMM))
|
||||
LOG.debug("Received TempBasal response: " + ByteUtil.getHex(response));
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Received TempBasal response: " + ByteUtil.getHex(response));
|
||||
|
||||
isPercent = response[0] == 1;
|
||||
|
||||
|
@ -61,13 +55,13 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
|||
insulinRate = strokes / 40.0d;
|
||||
}
|
||||
|
||||
if (response.length<6) {
|
||||
if (response.length < 6) {
|
||||
durationMinutes = ByteUtil.asUINT8(response[4]);
|
||||
} else {
|
||||
durationMinutes = MedtronicUtil.makeUnsignedShort(response[4], response[5]);
|
||||
}
|
||||
|
||||
LOG.warn("TempBasalPair (with {} byte response): {}", response.length, toString());
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "TempBasalPair (with {} byte response): {}", response.length, toString());
|
||||
|
||||
}
|
||||
|
||||
|
@ -79,7 +73,7 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
|||
|
||||
public byte[] getAsRawData() {
|
||||
|
||||
List<Byte> list = new ArrayList<Byte>();
|
||||
List<Byte> list = new ArrayList<>();
|
||||
|
||||
list.add((byte) 5);
|
||||
|
||||
|
@ -128,7 +122,7 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
@NotNull @Override
|
||||
public String toString() {
|
||||
return "TempBasalPair [" + "Rate=" + insulinRate + ", DurationMinutes=" + durationMinutes + ", IsPercent="
|
||||
+ isPercent + "]";
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.defs;
|
||||
|
||||
import androidx.annotation.StringRes;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -19,30 +21,14 @@ public enum BatteryType {
|
|||
NiMH(R.string.key_medtronic_pump_battery_nimh, 1.10d, 1.40d) //
|
||||
;
|
||||
|
||||
private final String description;
|
||||
public double lowVoltage;
|
||||
public double highVoltage;
|
||||
public final @StringRes int description;
|
||||
public final double lowVoltage;
|
||||
public final double highVoltage;
|
||||
|
||||
static Map<String, BatteryType> mapByDescription;
|
||||
|
||||
static {
|
||||
mapByDescription = new HashMap<>();
|
||||
|
||||
for (BatteryType value : values()) {
|
||||
mapByDescription.put(value.description, value);
|
||||
}
|
||||
}
|
||||
|
||||
BatteryType(int resId, double lowVoltage, double highVoltage) {
|
||||
this.description = MainApp.gs(resId);
|
||||
this.description = resId;
|
||||
this.lowVoltage = lowVoltage;
|
||||
this.highVoltage = highVoltage;
|
||||
}
|
||||
|
||||
public static BatteryType getByDescription(String batteryTypeStr) {
|
||||
if (mapByDescription.containsKey(batteryTypeStr)) {
|
||||
return mapByDescription.get(batteryTypeStr);
|
||||
}
|
||||
return BatteryType.None;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.defs;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
|
||||
/**
|
||||
* Created by andy on 6/28/18.
|
||||
*/
|
||||
|
@ -30,9 +28,9 @@ public enum MedtronicStatusRefreshType {
|
|||
}
|
||||
|
||||
|
||||
public MedtronicCommandType getCommandType() {
|
||||
public MedtronicCommandType getCommandType(MedtronicDeviceType medtronicDeviceType) {
|
||||
if (this == Configuration) {
|
||||
return MedtronicCommandType.getSettings(MedtronicUtil.getMedtronicPumpModel());
|
||||
return MedtronicCommandType.getSettings(medtronicDeviceType);
|
||||
} else
|
||||
return commandType;
|
||||
}
|
||||
|
|
|
@ -21,13 +21,13 @@ import javax.inject.Inject;
|
|||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData;
|
||||
|
||||
|
||||
public class MedtronicHistoryActivity extends NoSplashAppCompatActivity {
|
||||
|
||||
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
|
||||
@Inject MedtronicHistoryData medtronicHistoryData;
|
||||
|
||||
Spinner historyTypeSpinner;
|
||||
TextView statusView;
|
||||
|
@ -49,7 +49,7 @@ public class MedtronicHistoryActivity extends NoSplashAppCompatActivity {
|
|||
this.filteredHistoryList.clear();
|
||||
|
||||
List<PumpHistoryEntry> list = new ArrayList<>();
|
||||
list.addAll(medtronicPumpPlugin.getMedtronicHistoryData().getAllHistory());
|
||||
list.addAll(medtronicHistoryData.getAllHistory());
|
||||
|
||||
//LOG.debug("Items on full list: {}", list.size());
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.dialog;
|
||||
|
||||
import android.os.Bundle;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -12,10 +11,14 @@ import android.widget.TextView;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.android.support.DaggerFragment;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.pump.common.dialog.RefreshableInterface;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
|
||||
/**
|
||||
* Created by andy on 5/19/18.
|
||||
|
@ -26,7 +29,9 @@ import info.nightscout.androidaps.plugins.pump.common.utils.StringUtil;
|
|||
*/
|
||||
|
||||
// TODO needs to be implemented
|
||||
public class RileyLinkStatusDeviceMedtronic extends Fragment implements RefreshableInterface {
|
||||
public class RileyLinkStatusDeviceMedtronic extends DaggerFragment implements RefreshableInterface {
|
||||
|
||||
@Inject ResourceHelper resourceHelper;
|
||||
|
||||
// @BindView(R.id.rileylink_history_list)
|
||||
ListView listView;
|
||||
|
@ -150,7 +155,7 @@ public class RileyLinkStatusDeviceMedtronic extends Fragment implements Refresha
|
|||
RLHistoryItem item = historyItemList.get(i);
|
||||
viewHolder.itemTime.setText(StringUtil.toDateTimeString(item.getDateTime()));
|
||||
viewHolder.itemSource.setText("Riley Link"); // for now
|
||||
viewHolder.itemDescription.setText(item.getDescription());
|
||||
viewHolder.itemDescription.setText(item.getDescription(resourceHelper));
|
||||
|
||||
return view;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.driver;
|
||||
|
||||
import org.joda.time.LocalDateTime;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
@ -10,84 +8,74 @@ import java.util.GregorianCalendar;
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkEncodingType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.BasalProfileStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.BatteryType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventMedtronicDeviceStatusChange;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicConst;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
|
||||
/**
|
||||
* Created by andy on 4/28/18.
|
||||
*/
|
||||
|
||||
@Singleton
|
||||
public class MedtronicPumpStatus extends PumpStatus {
|
||||
|
||||
private static Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMP);
|
||||
private final ResourceHelper resourceHelper;
|
||||
private final SP sp;
|
||||
private final RileyLinkUtil rileyLinkUtil;
|
||||
private final RxBusWrapper rxBus;
|
||||
|
||||
public String errorDescription = null;
|
||||
public String serialNumber;
|
||||
public String pumpFrequency = null;
|
||||
public String rileyLinkAddress = null;
|
||||
public Double maxBolus;
|
||||
public Double maxBasal;
|
||||
public boolean inPreInit = true;
|
||||
|
||||
// statuses
|
||||
public RileyLinkServiceState rileyLinkServiceState = RileyLinkServiceState.NotStarted;
|
||||
public RileyLinkError rileyLinkError;
|
||||
public PumpDeviceState pumpDeviceState = PumpDeviceState.NeverContacted;
|
||||
private PumpDeviceState pumpDeviceState = PumpDeviceState.NeverContacted;
|
||||
public MedtronicDeviceType medtronicDeviceType = null;
|
||||
public double currentBasal = 0;
|
||||
public int tempBasalInProgress = 0;
|
||||
public int tempBasalRatio = 0;
|
||||
public int tempBasalRemainMin = 0;
|
||||
public Date tempBasalStart;
|
||||
public Double tempBasalAmount = 0.0d;
|
||||
|
||||
// fixme
|
||||
public Integer tempBasalLength = 0;
|
||||
|
||||
private String regexMac = "([\\da-fA-F]{1,2}(?:\\:|$)){6}";
|
||||
private String regexSN = "[0-9]{6}";
|
||||
|
||||
private boolean serialChanged = false;
|
||||
private boolean rileyLinkAddressChanged = false;
|
||||
private boolean encodingChanged = false;
|
||||
private boolean targetFrequencyChanged = false;
|
||||
|
||||
private RileyLinkEncodingType encodingType;
|
||||
private String[] frequencies;
|
||||
private boolean isFrequencyUS = false;
|
||||
private Map<String, PumpType> medtronicPumpMap = null;
|
||||
private Map<String, MedtronicDeviceType> medtronicDeviceTypeMap = null;
|
||||
private RileyLinkTargetFrequency targetFrequency;
|
||||
public BasalProfileStatus basalProfileStatus = BasalProfileStatus.NotInitialized;
|
||||
public BatteryType batteryType = BatteryType.None;
|
||||
|
||||
|
||||
public MedtronicPumpStatus(PumpDescription pumpDescription) {
|
||||
super(pumpDescription);
|
||||
@Inject
|
||||
public MedtronicPumpStatus(
|
||||
ResourceHelper resourceHelper,
|
||||
SP sp,
|
||||
RxBusWrapper rxBus,
|
||||
RileyLinkUtil rileyLinkUtil
|
||||
) {
|
||||
super();
|
||||
this.resourceHelper = resourceHelper;
|
||||
this.sp = sp;
|
||||
this.rxBus = rxBus;
|
||||
this.rileyLinkUtil = rileyLinkUtil;
|
||||
initSettings();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void initSettings() {
|
||||
private void initSettings() {
|
||||
|
||||
this.activeProfileName = "STD";
|
||||
this.reservoirRemainingUnits = 75d;
|
||||
|
@ -99,8 +87,8 @@ public class MedtronicPumpStatus extends PumpStatus {
|
|||
if (this.medtronicDeviceTypeMap == null)
|
||||
createMedtronicDeviceTypeMap();
|
||||
|
||||
this.lastConnection = SP.getLong(MedtronicConst.Statistics.LastGoodPumpCommunicationTime, 0L);
|
||||
this.lastDataTime = new LocalDateTime(this.lastConnection);
|
||||
this.lastConnection = sp.getLong(MedtronicConst.Statistics.LastGoodPumpCommunicationTime, 0L);
|
||||
this.lastDataTime = this.lastConnection;
|
||||
}
|
||||
|
||||
|
||||
|
@ -135,244 +123,16 @@ public class MedtronicPumpStatus extends PumpStatus {
|
|||
medtronicPumpMap.put("554", PumpType.Medtronic_554_754_Veo);
|
||||
medtronicPumpMap.put("754", PumpType.Medtronic_554_754_Veo);
|
||||
|
||||
frequencies = new String[2];
|
||||
frequencies[0] = MainApp.gs(R.string.key_medtronic_pump_frequency_us_ca);
|
||||
frequencies[1] = MainApp.gs(R.string.key_medtronic_pump_frequency_worldwide);
|
||||
}
|
||||
|
||||
|
||||
public boolean verifyConfiguration() {
|
||||
try {
|
||||
|
||||
// FIXME don't reload information several times
|
||||
if (this.medtronicPumpMap == null)
|
||||
createMedtronicPumpMap();
|
||||
|
||||
if (this.medtronicDeviceTypeMap == null)
|
||||
createMedtronicDeviceTypeMap();
|
||||
|
||||
this.errorDescription = "-";
|
||||
|
||||
String serialNr = SP.getString(MedtronicConst.Prefs.PumpSerial, null);
|
||||
|
||||
if (serialNr == null) {
|
||||
this.errorDescription = MainApp.gs(R.string.medtronic_error_serial_not_set);
|
||||
return false;
|
||||
} else {
|
||||
if (!serialNr.matches(regexSN)) {
|
||||
this.errorDescription = MainApp.gs(R.string.medtronic_error_serial_invalid);
|
||||
return false;
|
||||
} else {
|
||||
if (!serialNr.equals(this.serialNumber)) {
|
||||
this.serialNumber = serialNr;
|
||||
serialChanged = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String pumpType = SP.getString(MedtronicConst.Prefs.PumpType, null);
|
||||
|
||||
if (pumpType == null) {
|
||||
this.errorDescription = MainApp.gs(R.string.medtronic_error_pump_type_not_set);
|
||||
return false;
|
||||
} else {
|
||||
String pumpTypePart = pumpType.substring(0, 3);
|
||||
|
||||
if (!pumpTypePart.matches("[0-9]{3}")) {
|
||||
this.errorDescription = MainApp.gs(R.string.medtronic_error_pump_type_invalid);
|
||||
return false;
|
||||
} else {
|
||||
this.pumpType = medtronicPumpMap.get(pumpTypePart);
|
||||
this.medtronicDeviceType = medtronicDeviceTypeMap.get(pumpTypePart);
|
||||
this.pumpDescription.setPumpDescription(this.pumpType);
|
||||
|
||||
if (pumpTypePart.startsWith("7"))
|
||||
this.reservoirFullUnits = 300;
|
||||
else
|
||||
this.reservoirFullUnits = 176;
|
||||
}
|
||||
}
|
||||
|
||||
String pumpFrequency = SP.getString(MedtronicConst.Prefs.PumpFrequency, null);
|
||||
|
||||
if (pumpFrequency == null) {
|
||||
this.errorDescription = MainApp.gs(R.string.medtronic_error_pump_frequency_not_set);
|
||||
return false;
|
||||
} else {
|
||||
if (!pumpFrequency.equals(frequencies[0]) && !pumpFrequency.equals(frequencies[1])) {
|
||||
this.errorDescription = MainApp.gs(R.string.medtronic_error_pump_frequency_invalid);
|
||||
return false;
|
||||
} else {
|
||||
this.pumpFrequency = pumpFrequency;
|
||||
this.isFrequencyUS = pumpFrequency.equals(frequencies[0]);
|
||||
|
||||
RileyLinkTargetFrequency newTargetFrequency = this.isFrequencyUS ? //
|
||||
RileyLinkTargetFrequency.Medtronic_US
|
||||
: RileyLinkTargetFrequency.Medtronic_WorldWide;
|
||||
|
||||
if (targetFrequency != newTargetFrequency) {
|
||||
RileyLinkUtil.setRileyLinkTargetFrequency(newTargetFrequency);
|
||||
targetFrequency = newTargetFrequency;
|
||||
targetFrequencyChanged = true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
String rileyLinkAddress = SP.getString(RileyLinkConst.Prefs.RileyLinkAddress, null);
|
||||
|
||||
if (rileyLinkAddress == null) {
|
||||
if (isLogEnabled())
|
||||
LOG.debug("RileyLink address invalid: null");
|
||||
this.errorDescription = MainApp.gs(R.string.medtronic_error_rileylink_address_invalid);
|
||||
return false;
|
||||
} else {
|
||||
if (!rileyLinkAddress.matches(regexMac)) {
|
||||
this.errorDescription = MainApp.gs(R.string.medtronic_error_rileylink_address_invalid);
|
||||
if (isLogEnabled())
|
||||
LOG.debug("RileyLink address invalid: {}", rileyLinkAddress);
|
||||
} else {
|
||||
if (!rileyLinkAddress.equals(this.rileyLinkAddress)) {
|
||||
this.rileyLinkAddress = rileyLinkAddress;
|
||||
rileyLinkAddressChanged = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double maxBolusLcl = checkParameterValue(MedtronicConst.Prefs.MaxBolus, "25.0", 25.0d);
|
||||
|
||||
if (maxBolus == null || !maxBolus.equals(maxBolusLcl)) {
|
||||
maxBolus = maxBolusLcl;
|
||||
|
||||
//LOG.debug("Max Bolus from AAPS settings is " + maxBolus);
|
||||
}
|
||||
|
||||
double maxBasalLcl = checkParameterValue(MedtronicConst.Prefs.MaxBasal, "35.0", 35.0d);
|
||||
|
||||
if (maxBasal == null || !maxBasal.equals(maxBasalLcl)) {
|
||||
maxBasal = maxBasalLcl;
|
||||
|
||||
//LOG.debug("Max Basal from AAPS settings is " + maxBasal);
|
||||
}
|
||||
|
||||
|
||||
String encodingTypeStr = SP.getString(MedtronicConst.Prefs.Encoding, null);
|
||||
|
||||
if (encodingTypeStr == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
RileyLinkEncodingType newEncodingType = RileyLinkEncodingType.getByDescription(encodingTypeStr);
|
||||
|
||||
if (this.encodingType == null) {
|
||||
this.encodingType = newEncodingType;
|
||||
} else if (this.encodingType != newEncodingType) {
|
||||
this.encodingType = newEncodingType;
|
||||
this.encodingChanged = true;
|
||||
}
|
||||
|
||||
String batteryTypeStr = SP.getString(MedtronicConst.Prefs.BatteryType, null);
|
||||
|
||||
if (batteryTypeStr == null)
|
||||
return false;
|
||||
|
||||
BatteryType batteryType = BatteryType.getByDescription(batteryTypeStr);
|
||||
|
||||
if (this.batteryType != batteryType) {
|
||||
this.batteryType = batteryType;
|
||||
MedtronicUtil.setBatteryType(this.batteryType);
|
||||
}
|
||||
|
||||
String bolusDebugEnabled = SP.getString(MedtronicConst.Prefs.BolusDebugEnabled, null);
|
||||
|
||||
boolean bolusDebug = bolusDebugEnabled != null && bolusDebugEnabled.equals(MainApp.gs(R.string.common_on));
|
||||
|
||||
MedtronicHistoryData.doubleBolusDebug = bolusDebug;
|
||||
|
||||
reconfigureService();
|
||||
|
||||
return true;
|
||||
|
||||
} catch (Exception ex) {
|
||||
this.errorDescription = ex.getMessage();
|
||||
LOG.error("Error on Verification: " + ex.getMessage(), ex);
|
||||
return false;
|
||||
}
|
||||
public Map<String, PumpType> getMedtronicPumpMap() {
|
||||
return medtronicPumpMap;
|
||||
}
|
||||
|
||||
|
||||
private boolean reconfigureService() {
|
||||
|
||||
if (!inPreInit && MedtronicUtil.getMedtronicService() != null) {
|
||||
|
||||
if (serialChanged) {
|
||||
MedtronicUtil.getMedtronicService().setPumpIDString(this.serialNumber); // short operation
|
||||
serialChanged = false;
|
||||
}
|
||||
|
||||
if (rileyLinkAddressChanged) {
|
||||
MedtronicUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkNewAddressSet);
|
||||
rileyLinkAddressChanged = false;
|
||||
}
|
||||
|
||||
if (encodingChanged) {
|
||||
RileyLinkUtil.getRileyLinkService().changeRileyLinkEncoding(encodingType);
|
||||
encodingChanged = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if (targetFrequencyChanged && !inPreInit && MedtronicUtil.getMedtronicService() != null) {
|
||||
// RileyLinkUtil.setRileyLinkTargetFrequency(targetFrequency);
|
||||
// // RileyLinkUtil.getRileyLinkCommunicationManager().refreshRileyLinkTargetFrequency();
|
||||
// targetFrequencyChanged = false;
|
||||
// }
|
||||
|
||||
return (!rileyLinkAddressChanged && !serialChanged && !encodingChanged); // && !targetFrequencyChanged);
|
||||
public Map<String, MedtronicDeviceType> getMedtronicDeviceTypeMap() {
|
||||
return medtronicDeviceTypeMap;
|
||||
}
|
||||
|
||||
|
||||
private double checkParameterValue(int key, String defaultValue, double defaultValueDouble) {
|
||||
double val = 0.0d;
|
||||
|
||||
String value = SP.getString(key, defaultValue);
|
||||
|
||||
try {
|
||||
val = Double.parseDouble(value);
|
||||
} catch (Exception ex) {
|
||||
LOG.error("Error parsing setting: {}, value found {}", key, value);
|
||||
val = defaultValueDouble;
|
||||
}
|
||||
|
||||
if (val > defaultValueDouble) {
|
||||
SP.putString(key, defaultValue);
|
||||
val = defaultValueDouble;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
public String getErrorInfo() {
|
||||
verifyConfiguration();
|
||||
|
||||
return (this.errorDescription == null) ? "-" : this.errorDescription;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void refreshConfiguration() {
|
||||
verifyConfiguration();
|
||||
}
|
||||
|
||||
|
||||
public boolean setNotInPreInit() {
|
||||
this.inPreInit = false;
|
||||
|
||||
return reconfigureService();
|
||||
}
|
||||
|
||||
|
||||
public double getBasalProfileForHour() {
|
||||
if (basalsByHour != null) {
|
||||
GregorianCalendar c = new GregorianCalendar();
|
||||
|
@ -384,8 +144,37 @@ public class MedtronicPumpStatus extends PumpStatus {
|
|||
return 0;
|
||||
}
|
||||
|
||||
private boolean isLogEnabled() {
|
||||
return L.isEnabled(L.PUMP);
|
||||
// Battery type
|
||||
private Map<String, BatteryType> mapByDescription;
|
||||
|
||||
public BatteryType getBatteryTypeByDescription(String batteryTypeStr) {
|
||||
if (mapByDescription == null) {
|
||||
mapByDescription = new HashMap<>();
|
||||
for (BatteryType value : BatteryType.values()) {
|
||||
mapByDescription.put(resourceHelper.gs(value.description), value);
|
||||
}
|
||||
}
|
||||
if (mapByDescription.containsKey(batteryTypeStr)) {
|
||||
return mapByDescription.get(batteryTypeStr);
|
||||
}
|
||||
return BatteryType.None;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getErrorInfo() {
|
||||
return (errorDescription == null) ? "-" : errorDescription;
|
||||
}
|
||||
|
||||
public PumpDeviceState getPumpDeviceState() {
|
||||
return pumpDeviceState;
|
||||
}
|
||||
|
||||
|
||||
public void setPumpDeviceState(PumpDeviceState pumpDeviceState) {
|
||||
this.pumpDeviceState = pumpDeviceState;
|
||||
|
||||
rileyLinkUtil.getRileyLinkHistory().add(new RLHistoryItem(pumpDeviceState, RileyLinkTargetDevice.MedtronicPump));
|
||||
|
||||
rxBus.send(new EventMedtronicDeviceStatusChange(pumpDeviceState));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.service;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.res.Configuration;
|
||||
|
@ -9,55 +8,58 @@ import android.os.IBinder;
|
|||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkConst;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RFSpy;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkBLE;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkEncodingType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkService;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTask;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUIComm;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUIPostprocessor;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.BatteryType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicConst;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
|
||||
/**
|
||||
* RileyLinkMedtronicService is intended to stay running when the gui-app is closed.
|
||||
*/
|
||||
public class RileyLinkMedtronicService extends RileyLinkService {
|
||||
|
||||
//@Inject AAPSLogger aapsLogger;
|
||||
//@Inject Context context;
|
||||
@Inject HasAndroidInjector injector;
|
||||
@Inject ResourceHelper resourceHelper;
|
||||
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
|
||||
//@Inject SP sp;
|
||||
@Inject MedtronicUtil medtronicUtil;
|
||||
@Inject MedtronicUIPostprocessor medtronicUIPostprocessor;
|
||||
@Inject MedtronicPumpStatus medtronicPumpStatus;
|
||||
|
||||
private static RileyLinkMedtronicService instance;
|
||||
private static ServiceTask currentTask = null;
|
||||
|
||||
// cache of most recently received set of pump history pages. Probably shouldn't be here.
|
||||
public MedtronicCommunicationManager medtronicCommunicationManager;
|
||||
MedtronicPumpStatus pumpStatus = null;
|
||||
private MedtronicUIComm medtronicUIComm;
|
||||
private MedtronicCommunicationManager medtronicCommunicationManager;
|
||||
private IBinder mBinder = new LocalBinder();
|
||||
|
||||
private boolean serialChanged = false;
|
||||
private String[] frequencies;
|
||||
private String rileyLinkAddress = null;
|
||||
private boolean rileyLinkAddressChanged = false;
|
||||
private RileyLinkEncodingType encodingType;
|
||||
private boolean encodingChanged = false;
|
||||
private boolean inPreInit = true;
|
||||
|
||||
|
||||
public RileyLinkMedtronicService() {
|
||||
super();
|
||||
instance = this;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkMedtronicService getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
|
@ -85,29 +87,26 @@ public class RileyLinkMedtronicService extends RileyLinkService {
|
|||
*/
|
||||
public void initRileyLinkServiceData() {
|
||||
|
||||
rileyLinkServiceData = new RileyLinkServiceData(RileyLinkTargetDevice.MedtronicPump);
|
||||
frequencies = new String[2];
|
||||
frequencies[0] = resourceHelper.gs(R.string.key_medtronic_pump_frequency_us_ca);
|
||||
frequencies[1] = resourceHelper.gs(R.string.key_medtronic_pump_frequency_worldwide);
|
||||
|
||||
RileyLinkUtil.setRileyLinkServiceData(rileyLinkServiceData);
|
||||
RileyLinkUtil.setTargetDevice(RileyLinkTargetDevice.MedtronicPump);
|
||||
rileyLinkServiceData.targetDevice = RileyLinkTargetDevice.MedtronicPump;
|
||||
|
||||
setPumpIDString(sp.getString(MedtronicConst.Prefs.PumpSerial, "000000"));
|
||||
|
||||
// get most recently used RileyLink address
|
||||
rileyLinkServiceData.rileylinkAddress = sp.getString(RileyLinkConst.Prefs.RileyLinkAddress, "");
|
||||
|
||||
rileyLinkBLE = new RileyLinkBLE(this.context); // or this
|
||||
rfspy = new RFSpy(rileyLinkBLE);
|
||||
rileyLinkBLE = new RileyLinkBLE(injector, this); // or this
|
||||
rfspy = new RFSpy(injector, rileyLinkBLE);
|
||||
rfspy.startReader();
|
||||
|
||||
RileyLinkUtil.setRileyLinkBLE(rileyLinkBLE);
|
||||
|
||||
// init rileyLinkCommunicationManager
|
||||
medtronicCommunicationManager = new MedtronicCommunicationManager(rfspy);
|
||||
medtronicCommunicationManager = new MedtronicCommunicationManager(injector, rfspy);
|
||||
medtronicUIComm = new MedtronicUIComm(injector, aapsLogger, medtronicUtil, medtronicUIPostprocessor, medtronicCommunicationManager);
|
||||
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "RileyLinkMedtronicService newly constructed");
|
||||
MedtronicUtil.setMedtronicService(this);
|
||||
pumpStatus = (MedtronicPumpStatus) medtronicPumpPlugin.getPumpStatusData();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -116,12 +115,15 @@ public class RileyLinkMedtronicService extends RileyLinkService {
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RileyLinkCommunicationManager getDeviceCommunicationManager() {
|
||||
public MedtronicCommunicationManager getDeviceCommunicationManager() {
|
||||
return this.medtronicCommunicationManager;
|
||||
}
|
||||
|
||||
|
||||
public MedtronicUIComm getMedtronicUIComm() {
|
||||
return medtronicUIComm;
|
||||
}
|
||||
|
||||
public void setPumpIDString(String pumpID) {
|
||||
if (pumpID.length() != 6) {
|
||||
aapsLogger.error("setPumpIDString: invalid pump id string: " + pumpID);
|
||||
|
@ -153,13 +155,13 @@ public class RileyLinkMedtronicService extends RileyLinkService {
|
|||
rileyLinkServiceData.setPumpID(pumpID, pumpIDBytes);
|
||||
|
||||
if (oldId != null && !oldId.equals(pumpID)) {
|
||||
MedtronicUtil.setMedtronicPumpModel(null); // if we change pumpId, model probably changed too
|
||||
medtronicUtil.setMedtronicPumpModel(null); // if we change pumpId, model probably changed too
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
MedtronicUtil.setPumpDeviceState(PumpDeviceState.InvalidConfiguration);
|
||||
medtronicPumpStatus.setPumpDeviceState(PumpDeviceState.InvalidConfiguration);
|
||||
|
||||
// LOG.info("setPumpIDString: saved pumpID " + idString);
|
||||
}
|
||||
|
@ -177,7 +179,7 @@ public class RileyLinkMedtronicService extends RileyLinkService {
|
|||
// PumpInterface - REMOVE
|
||||
|
||||
public boolean isInitialized() {
|
||||
return RileyLinkServiceState.isReady(RileyLinkUtil.getRileyLinkServiceData().serviceState);
|
||||
return RileyLinkServiceState.isReady(rileyLinkServiceData.rileyLinkServiceState);
|
||||
}
|
||||
|
||||
|
||||
|
@ -195,4 +197,209 @@ public class RileyLinkMedtronicService extends RileyLinkService {
|
|||
@Override
|
||||
public void registerDeviceSpecificBroadcasts(IntentFilter intentFilter) {
|
||||
}
|
||||
|
||||
public boolean verifyConfiguration() {
|
||||
try {
|
||||
String regexSN = "[0-9]{6}";
|
||||
String regexMac = "([\\da-fA-F]{1,2}(?:\\:|$)){6}";
|
||||
|
||||
medtronicPumpStatus.errorDescription = "-";
|
||||
|
||||
String serialNr = sp.getStringOrNull(MedtronicConst.Prefs.PumpSerial, null);
|
||||
|
||||
if (serialNr == null) {
|
||||
medtronicPumpStatus.errorDescription = resourceHelper.gs(R.string.medtronic_error_serial_not_set);
|
||||
return false;
|
||||
} else {
|
||||
if (!serialNr.matches(regexSN)) {
|
||||
medtronicPumpStatus.errorDescription = resourceHelper.gs(R.string.medtronic_error_serial_invalid);
|
||||
return false;
|
||||
} else {
|
||||
if (!serialNr.equals(medtronicPumpStatus.serialNumber)) {
|
||||
medtronicPumpStatus.serialNumber = serialNr;
|
||||
serialChanged = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String pumpTypePref = sp.getStringOrNull(MedtronicConst.Prefs.PumpType, null);
|
||||
|
||||
if (pumpTypePref == null) {
|
||||
medtronicPumpStatus.errorDescription = resourceHelper.gs(R.string.medtronic_error_pump_type_not_set);
|
||||
return false;
|
||||
} else {
|
||||
String pumpTypePart = pumpTypePref.substring(0, 3);
|
||||
|
||||
if (!pumpTypePart.matches("[0-9]{3}")) {
|
||||
medtronicPumpStatus.errorDescription = resourceHelper.gs(R.string.medtronic_error_pump_type_invalid);
|
||||
return false;
|
||||
} else {
|
||||
PumpType pumpType = medtronicPumpStatus.getMedtronicPumpMap().get(pumpTypePart);
|
||||
medtronicPumpStatus.medtronicDeviceType = medtronicPumpStatus.getMedtronicDeviceTypeMap().get(pumpTypePart);
|
||||
medtronicPumpPlugin.getPumpDescription().setPumpDescription(pumpType);
|
||||
|
||||
if (pumpTypePart.startsWith("7"))
|
||||
medtronicPumpStatus.reservoirFullUnits = 300;
|
||||
else
|
||||
medtronicPumpStatus.reservoirFullUnits = 176;
|
||||
}
|
||||
}
|
||||
|
||||
String pumpFrequency = sp.getStringOrNull(MedtronicConst.Prefs.PumpFrequency, null);
|
||||
|
||||
if (pumpFrequency == null) {
|
||||
medtronicPumpStatus.errorDescription = resourceHelper.gs(R.string.medtronic_error_pump_frequency_not_set);
|
||||
return false;
|
||||
} else {
|
||||
if (!pumpFrequency.equals(frequencies[0]) && !pumpFrequency.equals(frequencies[1])) {
|
||||
medtronicPumpStatus.errorDescription = resourceHelper.gs(R.string.medtronic_error_pump_frequency_invalid);
|
||||
return false;
|
||||
} else {
|
||||
medtronicPumpStatus.pumpFrequency = pumpFrequency;
|
||||
boolean isFrequencyUS = pumpFrequency.equals(frequencies[0]);
|
||||
|
||||
RileyLinkTargetFrequency newTargetFrequency = isFrequencyUS ? //
|
||||
RileyLinkTargetFrequency.Medtronic_US
|
||||
: RileyLinkTargetFrequency.Medtronic_WorldWide;
|
||||
|
||||
if (rileyLinkServiceData.rileyLinkTargetFrequency != newTargetFrequency) {
|
||||
rileyLinkServiceData.rileyLinkTargetFrequency = newTargetFrequency;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
String rileyLinkAddress = sp.getStringOrNull(RileyLinkConst.Prefs.RileyLinkAddress, null);
|
||||
|
||||
if (rileyLinkAddress == null) {
|
||||
aapsLogger.debug(LTag.PUMP, "RileyLink address invalid: null");
|
||||
medtronicPumpStatus.errorDescription = resourceHelper.gs(R.string.medtronic_error_rileylink_address_invalid);
|
||||
return false;
|
||||
} else {
|
||||
if (!rileyLinkAddress.matches(regexMac)) {
|
||||
medtronicPumpStatus.errorDescription = resourceHelper.gs(R.string.medtronic_error_rileylink_address_invalid);
|
||||
aapsLogger.debug(LTag.PUMP, "RileyLink address invalid: {}", rileyLinkAddress);
|
||||
} else {
|
||||
if (!rileyLinkAddress.equals(this.rileyLinkAddress)) {
|
||||
this.rileyLinkAddress = rileyLinkAddress;
|
||||
rileyLinkAddressChanged = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double maxBolusLcl = checkParameterValue(MedtronicConst.Prefs.MaxBolus, "25.0", 25.0d);
|
||||
|
||||
if (medtronicPumpStatus.maxBolus == null || !medtronicPumpStatus.maxBolus.equals(maxBolusLcl)) {
|
||||
medtronicPumpStatus.maxBolus = maxBolusLcl;
|
||||
|
||||
//LOG.debug("Max Bolus from AAPS settings is " + maxBolus);
|
||||
}
|
||||
|
||||
double maxBasalLcl = checkParameterValue(MedtronicConst.Prefs.MaxBasal, "35.0", 35.0d);
|
||||
|
||||
if (medtronicPumpStatus.maxBasal == null || !medtronicPumpStatus.maxBasal.equals(maxBasalLcl)) {
|
||||
medtronicPumpStatus.maxBasal = maxBasalLcl;
|
||||
|
||||
//LOG.debug("Max Basal from AAPS settings is " + maxBasal);
|
||||
}
|
||||
|
||||
|
||||
String encodingTypeStr = sp.getStringOrNull(MedtronicConst.Prefs.Encoding, null);
|
||||
|
||||
if (encodingTypeStr == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
RileyLinkEncodingType newEncodingType = RileyLinkEncodingType.getByDescription(encodingTypeStr);
|
||||
|
||||
if (encodingType == null) {
|
||||
encodingType = newEncodingType;
|
||||
} else if (encodingType != newEncodingType) {
|
||||
encodingType = newEncodingType;
|
||||
encodingChanged = true;
|
||||
}
|
||||
|
||||
String batteryTypeStr = sp.getStringOrNull(MedtronicConst.Prefs.BatteryType, null);
|
||||
|
||||
if (batteryTypeStr == null)
|
||||
return false;
|
||||
|
||||
BatteryType batteryType = medtronicPumpStatus.getBatteryTypeByDescription(batteryTypeStr);
|
||||
|
||||
if (medtronicPumpStatus.batteryType != batteryType) {
|
||||
medtronicPumpStatus.batteryType = batteryType;
|
||||
}
|
||||
|
||||
String bolusDebugEnabled = sp.getStringOrNull(MedtronicConst.Prefs.BolusDebugEnabled, null);
|
||||
|
||||
boolean bolusDebug = bolusDebugEnabled != null && bolusDebugEnabled.equals(resourceHelper.gs(R.string.common_on));
|
||||
|
||||
MedtronicHistoryData.doubleBolusDebug = bolusDebug;
|
||||
|
||||
reconfigureService();
|
||||
|
||||
return true;
|
||||
|
||||
} catch (Exception ex) {
|
||||
medtronicPumpStatus.errorDescription = ex.getMessage();
|
||||
aapsLogger.error(LTag.PUMP, "Error on Verification: " + ex.getMessage(), ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean reconfigureService() {
|
||||
|
||||
if (!inPreInit) {
|
||||
|
||||
if (serialChanged) {
|
||||
setPumpIDString(medtronicPumpStatus.serialNumber); // short operation
|
||||
serialChanged = false;
|
||||
}
|
||||
|
||||
if (rileyLinkAddressChanged) {
|
||||
rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.Intents.RileyLinkNewAddressSet, this);
|
||||
rileyLinkAddressChanged = false;
|
||||
}
|
||||
|
||||
if (encodingChanged) {
|
||||
changeRileyLinkEncoding(encodingType);
|
||||
encodingChanged = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if (targetFrequencyChanged && !inPreInit && MedtronicUtil.getMedtronicService() != null) {
|
||||
// RileyLinkUtil.setRileyLinkTargetFrequency(targetFrequency);
|
||||
// // RileyLinkUtil.getRileyLinkCommunicationManager().refreshRileyLinkTargetFrequency();
|
||||
// targetFrequencyChanged = false;
|
||||
// }
|
||||
|
||||
return (!rileyLinkAddressChanged && !serialChanged && !encodingChanged); // && !targetFrequencyChanged);
|
||||
}
|
||||
|
||||
private double checkParameterValue(int key, String defaultValue, double defaultValueDouble) {
|
||||
double val;
|
||||
|
||||
String value = sp.getString(key, defaultValue);
|
||||
|
||||
try {
|
||||
val = Double.parseDouble(value);
|
||||
} catch (Exception ex) {
|
||||
aapsLogger.error("Error parsing setting: {}, value found {}", key, value);
|
||||
val = defaultValueDouble;
|
||||
}
|
||||
|
||||
if (val > defaultValueDouble) {
|
||||
sp.putString(key, defaultValue);
|
||||
val = defaultValueDouble;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
public boolean setNotInPreInit() {
|
||||
this.inPreInit = false;
|
||||
|
||||
return reconfigureService();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ import com.google.gson.Gson;
|
|||
import com.google.gson.GsonBuilder;
|
||||
|
||||
import org.joda.time.LocalTime;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
|
@ -12,67 +11,64 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import info.nightscout.androidaps.interfaces.PluginType;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBus;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.LTag;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification;
|
||||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
|
||||
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.ClockDTO;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.PumpSettingDTO;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.BatteryType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicNotificationType;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpDeviceState;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventMedtronicDeviceStatusChange;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.service.RileyLinkMedtronicService;
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper;
|
||||
|
||||
/**
|
||||
* Created by andy on 5/9/18.
|
||||
*/
|
||||
|
||||
public class MedtronicUtil extends RileyLinkUtil {
|
||||
@Singleton
|
||||
public class MedtronicUtil {
|
||||
|
||||
private static final Logger LOG = StacktraceLoggerWrapper.getLogger(L.PUMPCOMM);
|
||||
static int ENVELOPE_SIZE = 4; // 0xA7 S1 S2 S3 CMD PARAM_COUNT [PARAMS]
|
||||
static int CRC_SIZE = 1;
|
||||
private int ENVELOPE_SIZE = 4; // 0xA7 S1 S2 S3 CMD PARAM_COUNT [PARAMS]
|
||||
private static boolean lowLevelDebug = true;
|
||||
private static PumpDeviceState pumpDeviceState;
|
||||
private static MedtronicDeviceType medtronicPumpModel;
|
||||
private static RileyLinkMedtronicService medtronicService;
|
||||
private static MedtronicPumpStatus medtronicPumpStatus;
|
||||
private static MedtronicCommandType currentCommand;
|
||||
private static Map<String, PumpSettingDTO> settings;
|
||||
private static int BIG_FRAME_LENGTH = 65;
|
||||
private static int doneBit = 1 << 7;
|
||||
private static ClockDTO pumpTime;
|
||||
public static Gson gsonInstance = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
|
||||
public static Gson gsonInstanceCore = new GsonBuilder().create();
|
||||
private static BatteryType batteryType = BatteryType.None;
|
||||
private MedtronicDeviceType medtronicPumpModel;
|
||||
private MedtronicCommandType currentCommand;
|
||||
private Map<String, PumpSettingDTO> settings;
|
||||
private int BIG_FRAME_LENGTH = 65;
|
||||
private int doneBit = 1 << 7;
|
||||
private ClockDTO pumpTime;
|
||||
public Gson gsonInstance = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
|
||||
|
||||
private final AAPSLogger aapsLogger;
|
||||
private final RxBusWrapper rxBus;
|
||||
private final RileyLinkUtil rileyLinkUtil;
|
||||
private final MedtronicPumpStatus medtronicPumpStatus;
|
||||
|
||||
public static Gson getGsonInstance() {
|
||||
return gsonInstance;
|
||||
@Inject
|
||||
public MedtronicUtil(
|
||||
AAPSLogger aapsLogger,
|
||||
RxBusWrapper rxBus,
|
||||
RileyLinkUtil rileyLinkUtil,
|
||||
MedtronicPumpStatus medtronicPumpStatus
|
||||
) {
|
||||
this.aapsLogger = aapsLogger;
|
||||
this.rxBus = rxBus;
|
||||
this.rileyLinkUtil = rileyLinkUtil;
|
||||
this.medtronicPumpStatus = medtronicPumpStatus;
|
||||
}
|
||||
|
||||
|
||||
public static Gson getGsonInstanceCore() {
|
||||
return gsonInstanceCore;
|
||||
}
|
||||
|
||||
|
||||
public static LocalTime getTimeFrom30MinInterval(int interval) {
|
||||
public LocalTime getTimeFrom30MinInterval(int interval) {
|
||||
if (interval % 2 == 0) {
|
||||
return new LocalTime(interval / 2, 0);
|
||||
} else {
|
||||
|
@ -91,12 +87,6 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
return k;
|
||||
}
|
||||
|
||||
public static boolean isMedtronicPump() {
|
||||
return MedtronicPumpPlugin.getPlugin().isEnabled(PluginType.PUMP);
|
||||
//return ConfigBuilderPlugin.getPlugin().getActivePump().deviceID().equals("Medtronic");
|
||||
}
|
||||
|
||||
|
||||
public static byte[] getByteArrayFromUnsignedShort(int shortValue, boolean returnFixedSize) {
|
||||
byte highByte = (byte) (shortValue >> 8 & 0xFF);
|
||||
byte lowByte = (byte) (shortValue & 0xFF);
|
||||
|
@ -127,17 +117,17 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static double decodeBasalInsulin(int i, int j) {
|
||||
public double decodeBasalInsulin(int i, int j) {
|
||||
return decodeBasalInsulin(makeUnsignedShort(i, j));
|
||||
}
|
||||
|
||||
|
||||
public static double decodeBasalInsulin(int i) {
|
||||
public double decodeBasalInsulin(int i) {
|
||||
return (double) i / 40.0d;
|
||||
}
|
||||
|
||||
|
||||
public static byte[] getBasalStrokes(double amount) {
|
||||
public byte[] getBasalStrokes(double amount) {
|
||||
return getBasalStrokes(amount, false);
|
||||
}
|
||||
|
||||
|
@ -147,12 +137,12 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static int getBasalStrokesInt(double amount) {
|
||||
public int getBasalStrokesInt(double amount) {
|
||||
return getStrokesInt(amount, 40);
|
||||
}
|
||||
|
||||
|
||||
public static byte[] getBolusStrokes(double amount) {
|
||||
public byte[] getBolusStrokes(double amount) {
|
||||
|
||||
int strokesPerUnit = medtronicPumpModel.getBolusStrokes();
|
||||
|
||||
|
@ -184,7 +174,7 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static byte[] createCommandBody(byte[] input) {
|
||||
public byte[] createCommandBody(byte[] input) {
|
||||
|
||||
return ByteUtil.concat((byte) input.length, input);
|
||||
}
|
||||
|
@ -223,7 +213,7 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static void sendNotification(MedtronicNotificationType notificationType, ResourceHelper resourceHelper, RxBusWrapper rxBus) {
|
||||
public void sendNotification(MedtronicNotificationType notificationType, ResourceHelper resourceHelper, RxBusWrapper rxBus) {
|
||||
Notification notification = new Notification( //
|
||||
notificationType.getNotificationType(), //
|
||||
resourceHelper.gs(notificationType.getResourceId()), //
|
||||
|
@ -232,7 +222,7 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static void sendNotification(MedtronicNotificationType notificationType, ResourceHelper resourceHelper, RxBusWrapper rxBus, Object... parameters) {
|
||||
public void sendNotification(MedtronicNotificationType notificationType, ResourceHelper resourceHelper, RxBusWrapper rxBus, Object... parameters) {
|
||||
Notification notification = new Notification( //
|
||||
notificationType.getNotificationType(), //
|
||||
resourceHelper.gs(notificationType.getResourceId(), parameters), //
|
||||
|
@ -241,22 +231,22 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static void dismissNotification(MedtronicNotificationType notificationType, RxBusWrapper rxBus) {
|
||||
public void dismissNotification(MedtronicNotificationType notificationType, RxBusWrapper rxBus) {
|
||||
rxBus.send(new EventDismissNotification(notificationType.getNotificationType()));
|
||||
}
|
||||
|
||||
|
||||
// public static byte[] buildCommandPayload(MessageType commandType, byte[] parameters) {
|
||||
// public byte[] buildCommandPayload(MessageType commandType, byte[] parameters) {
|
||||
// return buildCommandPayload(commandType.getValue(), parameters);
|
||||
// }
|
||||
|
||||
|
||||
public static byte[] buildCommandPayload(MedtronicCommandType commandType, byte[] parameters) {
|
||||
return buildCommandPayload((byte) commandType.commandCode, parameters);
|
||||
public byte[] buildCommandPayload(RileyLinkServiceData rileyLinkServiceData, MedtronicCommandType commandType, byte[] parameters) {
|
||||
return buildCommandPayload(rileyLinkServiceData, (byte) commandType.commandCode, parameters);
|
||||
}
|
||||
|
||||
|
||||
public static byte[] buildCommandPayload(byte commandType, byte[] parameters) {
|
||||
public byte[] buildCommandPayload(RileyLinkServiceData rileyLinkServiceData, byte commandType, byte[] parameters) {
|
||||
// A7 31 65 51 C0 00 52
|
||||
|
||||
byte commandLength = (byte) (parameters == null ? 2 : 2 + parameters.length);
|
||||
|
@ -264,7 +254,7 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
ByteBuffer sendPayloadBuffer = ByteBuffer.allocate(ENVELOPE_SIZE + commandLength); // + CRC_SIZE
|
||||
sendPayloadBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
|
||||
byte[] serialNumberBCD = RileyLinkUtil.getRileyLinkServiceData().pumpIDBytes;
|
||||
byte[] serialNumberBCD = rileyLinkServiceData.pumpIDBytes;
|
||||
|
||||
sendPayloadBuffer.put((byte) 0xA7);
|
||||
sendPayloadBuffer.put(serialNumberBCD[0]);
|
||||
|
@ -285,8 +275,7 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
|
||||
byte[] payload = sendPayloadBuffer.array();
|
||||
|
||||
if (L.isEnabled(L.PUMPCOMM))
|
||||
LOG.debug("buildCommandPayload [{}]", ByteUtil.shortHexString(payload));
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "buildCommandPayload [{}]", ByteUtil.shortHexString(payload));
|
||||
|
||||
// int crc = computeCRC8WithPolynomial(payload, 0, payload.length - 1);
|
||||
|
||||
|
@ -300,7 +289,7 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
|
||||
// Note: at the moment supported only for 24 items, if you will use it for more than
|
||||
// that you will need to add
|
||||
public static List<List<Byte>> getBasalProfileFrames(byte[] data) {
|
||||
public List<List<Byte>> getBasalProfileFrames(byte[] data) {
|
||||
|
||||
boolean done = false;
|
||||
int start = 0;
|
||||
|
@ -372,7 +361,7 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
private static void checkAndAppenLastFrame(List<Byte> frameData) {
|
||||
private void checkAndAppenLastFrame(List<Byte> frameData) {
|
||||
|
||||
if (frameData.size() == BIG_FRAME_LENGTH)
|
||||
return;
|
||||
|
@ -385,7 +374,7 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
private static boolean isEmptyFrame(List<Byte> frameData) {
|
||||
private boolean isEmptyFrame(List<Byte> frameData) {
|
||||
|
||||
for (Byte frameDateEntry : frameData) {
|
||||
if (frameDateEntry != 0x00) {
|
||||
|
@ -401,92 +390,43 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
return lowLevelDebug;
|
||||
}
|
||||
|
||||
|
||||
public static void setLowLevelDebug(boolean lowLevelDebug) {
|
||||
MedtronicUtil.lowLevelDebug = lowLevelDebug;
|
||||
public boolean isModelSet() {
|
||||
return medtronicPumpModel != null;
|
||||
}
|
||||
|
||||
|
||||
public static PumpDeviceState getPumpDeviceState() {
|
||||
return pumpDeviceState;
|
||||
public MedtronicDeviceType getMedtronicPumpModel() {
|
||||
return medtronicPumpModel;
|
||||
}
|
||||
|
||||
|
||||
public static void setPumpDeviceState(PumpDeviceState pumpDeviceState) {
|
||||
MedtronicUtil.pumpDeviceState = pumpDeviceState;
|
||||
|
||||
historyRileyLink.add(new RLHistoryItem(pumpDeviceState, RileyLinkTargetDevice.MedtronicPump));
|
||||
|
||||
RxBus.Companion.getINSTANCE().send(new EventMedtronicDeviceStatusChange(pumpDeviceState));
|
||||
public void setMedtronicPumpModel(MedtronicDeviceType medtronicPumpModel) {
|
||||
this.medtronicPumpModel = medtronicPumpModel;
|
||||
}
|
||||
|
||||
|
||||
public static boolean isModelSet() {
|
||||
return MedtronicUtil.medtronicPumpModel != null;
|
||||
public MedtronicCommandType getCurrentCommand() {
|
||||
return this.currentCommand;
|
||||
}
|
||||
|
||||
|
||||
public static MedtronicDeviceType getMedtronicPumpModel() {
|
||||
return MedtronicUtil.medtronicPumpModel;
|
||||
}
|
||||
|
||||
|
||||
public static void setMedtronicPumpModel(MedtronicDeviceType medtronicPumpModel) {
|
||||
MedtronicUtil.medtronicPumpModel = medtronicPumpModel;
|
||||
}
|
||||
|
||||
|
||||
public static MedtronicCommunicationManager getMedtronicCommunicationManager() {
|
||||
return (MedtronicCommunicationManager) RileyLinkUtil.rileyLinkCommunicationManager;
|
||||
}
|
||||
|
||||
|
||||
public static RileyLinkMedtronicService getMedtronicService() {
|
||||
return MedtronicUtil.medtronicService;
|
||||
}
|
||||
|
||||
|
||||
public static void setMedtronicService(RileyLinkMedtronicService medtronicService) {
|
||||
MedtronicUtil.medtronicService = medtronicService;
|
||||
}
|
||||
|
||||
|
||||
public static MedtronicPumpStatus getPumpStatus() {
|
||||
return MedtronicUtil.medtronicPumpStatus;
|
||||
}
|
||||
|
||||
|
||||
public static void setPumpStatus(MedtronicPumpStatus medtronicPumpStatus) {
|
||||
MedtronicUtil.medtronicPumpStatus = medtronicPumpStatus;
|
||||
}
|
||||
|
||||
|
||||
public static MedtronicCommandType getCurrentCommand() {
|
||||
return MedtronicUtil.currentCommand;
|
||||
}
|
||||
|
||||
|
||||
public static void setCurrentCommand(MedtronicCommandType currentCommand) {
|
||||
MedtronicUtil.currentCommand = currentCommand;
|
||||
public void setCurrentCommand(MedtronicCommandType currentCommand) {
|
||||
this.currentCommand = currentCommand;
|
||||
|
||||
if (currentCommand != null)
|
||||
historyRileyLink.add(new RLHistoryItem(currentCommand));
|
||||
rileyLinkUtil.getRileyLinkHistory().add(new RLHistoryItem(currentCommand));
|
||||
|
||||
}
|
||||
|
||||
public static int pageNumber;
|
||||
public static Integer frameNumber;
|
||||
public int pageNumber;
|
||||
public Integer frameNumber;
|
||||
|
||||
|
||||
public static void setCurrentCommand(MedtronicCommandType currentCommand, int pageNumber_, Integer frameNumber_) {
|
||||
public void setCurrentCommand(MedtronicCommandType currentCommand, int pageNumber_, Integer frameNumber_) {
|
||||
pageNumber = pageNumber_;
|
||||
frameNumber = frameNumber_;
|
||||
|
||||
if (MedtronicUtil.currentCommand != currentCommand) {
|
||||
if (this.currentCommand != currentCommand) {
|
||||
setCurrentCommand(currentCommand);
|
||||
}
|
||||
|
||||
RxBus.Companion.getINSTANCE().send(new EventMedtronicDeviceStatusChange(pumpDeviceState));
|
||||
rxBus.send(new EventMedtronicDeviceStatusChange(medtronicPumpStatus.getPumpDeviceState()));
|
||||
}
|
||||
|
||||
|
||||
|
@ -497,33 +437,19 @@ public class MedtronicUtil extends RileyLinkUtil {
|
|||
}
|
||||
|
||||
|
||||
public static Map<String, PumpSettingDTO> getSettings() {
|
||||
public Map<String, PumpSettingDTO> getSettings() {
|
||||
return settings;
|
||||
}
|
||||
|
||||
|
||||
public static void setSettings(Map<String, PumpSettingDTO> settings) {
|
||||
MedtronicUtil.settings = settings;
|
||||
public void setSettings(Map<String, PumpSettingDTO> settings) {
|
||||
this.settings = settings;
|
||||
}
|
||||
|
||||
|
||||
public static void setPumpTime(ClockDTO pumpTime) {
|
||||
MedtronicUtil.pumpTime = pumpTime;
|
||||
public void setPumpTime(ClockDTO pumpTime) {
|
||||
this.pumpTime = pumpTime;
|
||||
}
|
||||
|
||||
|
||||
public static ClockDTO getPumpTime() {
|
||||
return MedtronicUtil.pumpTime;
|
||||
public ClockDTO getPumpTime() {
|
||||
return this.pumpTime;
|
||||
}
|
||||
|
||||
public static void setBatteryType(BatteryType batteryType) {
|
||||
MedtronicUtil.batteryType = batteryType;
|
||||
}
|
||||
|
||||
|
||||
public static BatteryType getBatteryType() {
|
||||
return MedtronicUtil.batteryType;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -6,6 +6,9 @@ import org.slf4j.LoggerFactory;
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import info.nightscout.androidaps.logging.AAPSLogger;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RFSpy;
|
||||
|
@ -13,7 +16,14 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLink
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RLMessage;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RLMessageType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkBLEError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicConverter;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.MedtronicPumpHistoryDecoder;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.comm.action.OmnipodAction;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.MessageBlock;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.OmnipodMessage;
|
||||
|
@ -41,9 +51,17 @@ import info.nightscout.androidaps.plugins.pump.omnipod.comm.exception.PodReturne
|
|||
/**
|
||||
* Created by andy on 6/29/18.
|
||||
*/
|
||||
|
||||
// FIXME should be named OmnipodCommunicationManager
|
||||
public class OmnipodCommunicationService extends RileyLinkCommunicationManager {
|
||||
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject MedtronicPumpStatus medtronicPumpStatus;
|
||||
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
|
||||
@Inject MedtronicConverter medtronicConverter;
|
||||
@Inject MedtronicUtil medtronicUtil;
|
||||
@Inject MedtronicPumpHistoryDecoder medtronicPumpHistoryDecoder;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject ServiceTaskExecutor serviceTaskExecutor;
|
||||
private static final Logger LOG = LoggerFactory.getLogger(L.PUMPCOMM);
|
||||
|
||||
public OmnipodCommunicationService(RFSpy rfspy) {
|
|
@ -0,0 +1,4 @@
|
|||
package info.nightscout.androidaps.plugins.pump.omnipod_dash.driver;
|
||||
|
||||
public class OmnipodDashPumpStatus {
|
||||
}
|
|
@ -40,6 +40,7 @@ import info.nightscout.androidaps.logging.L;
|
|||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBus;
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.FabricPrivacy;
|
||||
|
@ -265,9 +266,9 @@ public class TreatmentService extends OrmLiteBaseService<DatabaseHelper> {
|
|||
if (treatment != null) {
|
||||
|
||||
if (MedtronicHistoryData.doubleBolusDebug)
|
||||
log.debug("DoubleBolusDebug: createTreatmentFromJsonIfNotExists:: medtronicPump={}", MedtronicUtil.isMedtronicPump());
|
||||
log.debug("DoubleBolusDebug: createTreatmentFromJsonIfNotExists:: medtronicPump={}", MedtronicPumpPlugin.getPlugin().isEnabled());
|
||||
|
||||
if (!MedtronicUtil.isMedtronicPump())
|
||||
if (!MedtronicPumpPlugin.getPlugin().isEnabled())
|
||||
createOrUpdate(treatment);
|
||||
else
|
||||
createOrUpdateMedtronic(treatment, true);
|
||||
|
|
|
@ -8,6 +8,7 @@ import androidx.annotation.NonNull;
|
|||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.firebase.analytics.FirebaseAnalytics;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
|
@ -56,7 +57,6 @@ import info.nightscout.androidaps.plugins.general.overview.notifications.Notific
|
|||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData;
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
|
||||
import info.nightscout.androidaps.utils.DateUtil;
|
||||
import info.nightscout.androidaps.utils.FabricPrivacy;
|
||||
import info.nightscout.androidaps.utils.T;
|
||||
|
@ -300,13 +300,13 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
|||
|
||||
long time = System.currentTimeMillis();
|
||||
synchronized (treatments) {
|
||||
getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: AllTreatmentsInDb: " + MedtronicUtil.getGsonInstanceCore().toJson(treatments));
|
||||
getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: AllTreatmentsInDb: " + new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(treatments));
|
||||
|
||||
for (Treatment t : treatments) {
|
||||
if (t.date <= time && t.date >= fromTimestamp)
|
||||
in5minback.add(t);
|
||||
}
|
||||
getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: FilteredTreatments: AfterTime={}, Items={} " + fromTimestamp + " " + MedtronicUtil.getGsonInstanceCore().toJson(in5minback));
|
||||
getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: FilteredTreatments: AfterTime={}, Items={} " + fromTimestamp + " " + new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(in5minback));
|
||||
return in5minback;
|
||||
}
|
||||
}
|
||||
|
@ -452,7 +452,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
|
|||
TemporaryBasal runningTBR = getTempBasalFromHistory(i);
|
||||
double running = basal;
|
||||
if (runningTBR != null) {
|
||||
running = runningTBR.tempBasalConvertedToAbsolute(i, profile);
|
||||
running = runningTBR.tempBasalConvertedToAbsolute(i, profile);
|
||||
}
|
||||
Treatment treatment = new Treatment(getInjector());
|
||||
treatment.date = i;
|
||||
|
|
|
@ -37,6 +37,7 @@ class TreatmentsCareportalFragment : DaggerFragment() {
|
|||
@Inject lateinit var sp: SP
|
||||
@Inject lateinit var resourceHelper: ResourceHelper
|
||||
@Inject lateinit var fabricPrivacy: FabricPrivacy
|
||||
@Inject lateinit var translator: Translator
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?): View? {
|
||||
|
@ -108,7 +109,7 @@ class TreatmentsCareportalFragment : DaggerFragment() {
|
|||
holder.date.text = DateUtil.dateAndTimeString(careportalEvent.date)
|
||||
holder.duration.text = if (careportalEvent.durationInMsec() == 0L) "" else DateUtil.niceTimeScalar(careportalEvent.durationInMsec(), resourceHelper)
|
||||
holder.note.text = careportalEvent.notes
|
||||
holder.type.text = Translator.translate(careportalEvent.eventType)
|
||||
holder.type.text = translator.translate(careportalEvent.eventType)
|
||||
holder.remove.tag = careportalEvent
|
||||
}
|
||||
|
||||
|
@ -129,7 +130,7 @@ class TreatmentsCareportalFragment : DaggerFragment() {
|
|||
remove.setOnClickListener { v: View ->
|
||||
val careportalEvent = v.tag as CareportalEvent
|
||||
activity?.let { activity ->
|
||||
val text = resourceHelper.gs(R.string.careportal_newnstreatment_eventtype) + ": " + Translator.translate(careportalEvent.eventType) + "\n" +
|
||||
val text = resourceHelper.gs(R.string.careportal_newnstreatment_eventtype) + ": " + translator.translate(careportalEvent.eventType) + "\n" +
|
||||
resourceHelper.gs(R.string.careportal_newnstreatment_notes_label) + ": " + careportalEvent.notes + "\n" +
|
||||
resourceHelper.gs(R.string.date) + ": " + DateUtil.dateAndTimeString(careportalEvent.date)
|
||||
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.removerecord), text, Runnable {
|
||||
|
|
|
@ -15,13 +15,12 @@ import javax.inject.Inject
|
|||
class TimeDateOrTZChangeReceiver : DaggerBroadcastReceiver() {
|
||||
@Inject lateinit var aapsLogger: AAPSLogger
|
||||
@Inject lateinit var activePlugin: ActivePluginProvider
|
||||
var gson: Gson
|
||||
val gson: Gson = Gson()
|
||||
|
||||
private var isDST = false
|
||||
|
||||
init {
|
||||
isDST = calculateDST()
|
||||
gson = Gson()
|
||||
}
|
||||
|
||||
private fun calculateDST(): Boolean {
|
||||
|
@ -38,10 +37,6 @@ class TimeDateOrTZChangeReceiver : DaggerBroadcastReceiver() {
|
|||
super.onReceive(context, intent)
|
||||
val action = intent.action
|
||||
val activePump: PumpInterface = activePlugin.activePump
|
||||
if (activePump == null) {
|
||||
aapsLogger.debug(LTag.PUMP,"TimeDateOrTZChangeReceiver::Time and/or TimeZone changed. [action={}]. Pump is null, exiting.", action)
|
||||
return
|
||||
}
|
||||
|
||||
aapsLogger.debug(LTag.PUMP,"TimeDateOrTZChangeReceiver::Date, Time and/or TimeZone changed. [action={}]", action)
|
||||
aapsLogger.debug(LTag.PUMP,"TimeDateOrTZChangeReceiver::Intent::{}", gson.toJson(intent))
|
||||
|
|
|
@ -5,7 +5,6 @@ import android.os.Handler;
|
|||
import android.os.Message;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.text.method.DigitsKeyListener;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
|
@ -15,24 +14,18 @@ import android.widget.Button;
|
|||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.text.NumberFormat;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.logging.StacktraceLoggerWrapper;
|
||||
|
||||
/**
|
||||
* Created by mike on 28.06.2016.
|
||||
*/
|
||||
public class NumberPicker extends LinearLayout implements View.OnKeyListener,
|
||||
View.OnTouchListener, View.OnClickListener {
|
||||
private static Logger log = StacktraceLoggerWrapper.getLogger(NumberPicker.class);
|
||||
|
||||
public interface OnValueChangedListener {
|
||||
void onValueChanged(double value);
|
||||
|
@ -172,14 +165,14 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener,
|
|||
value = SafeParse.stringToDouble(editText.getText().toString());
|
||||
if (value > maxValue) {
|
||||
value = maxValue;
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.youareonallowedlimit));
|
||||
ToastUtils.showToastInUiThread(getContext(), getContext().getString(R.string.youareonallowedlimit));
|
||||
updateEditText();
|
||||
if (okButton != null)
|
||||
okButton.setVisibility(VISIBLE);
|
||||
}
|
||||
if (value < minValue) {
|
||||
value = minValue;
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.youareonallowedlimit));
|
||||
ToastUtils.showToastInUiThread(getContext(), getContext().getString(R.string.youareonallowedlimit));
|
||||
updateEditText();
|
||||
if (okButton != null)
|
||||
okButton.setVisibility(VISIBLE);
|
||||
|
@ -244,7 +237,7 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener,
|
|||
if (value > maxValue) {
|
||||
value = maxValue;
|
||||
callValueChangedListener();
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.youareonallowedlimit));
|
||||
ToastUtils.showToastInUiThread(getContext(), getContext().getString(R.string.youareonallowedlimit));
|
||||
stopUpdating();
|
||||
}
|
||||
updateEditText();
|
||||
|
@ -255,7 +248,7 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener,
|
|||
if (value < minValue) {
|
||||
value = minValue;
|
||||
callValueChangedListener();
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.youareonallowedlimit));
|
||||
ToastUtils.showToastInUiThread(getContext(), getContext().getString(R.string.youareonallowedlimit));
|
||||
stopUpdating();
|
||||
}
|
||||
updateEditText();
|
||||
|
@ -275,7 +268,7 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener,
|
|||
|
||||
private void startUpdating(boolean inc) {
|
||||
if (mUpdater != null) {
|
||||
log.debug("Another executor is still active");
|
||||
//log.debug("Another executor is still active");
|
||||
return;
|
||||
}
|
||||
mUpdater = Executors.newSingleThreadScheduledExecutor();
|
||||
|
|
|
@ -14,7 +14,6 @@ import android.widget.Toast;
|
|||
import androidx.annotation.DrawableRes;
|
||||
import androidx.appcompat.view.ContextThemeWrapper;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
|
||||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
|
||||
|
@ -30,20 +29,20 @@ public class ToastUtils {
|
|||
}
|
||||
|
||||
public static void infoToast(final Context ctx, final String string) {
|
||||
graphicalToast(ctx, string, R.drawable.ic_toast_info,false);
|
||||
graphicalToast(ctx, string, R.drawable.ic_toast_info, false);
|
||||
}
|
||||
|
||||
public static void okToast(final Context ctx, final String string) {
|
||||
graphicalToast(ctx, string, R.drawable.ic_toast_check,false);
|
||||
graphicalToast(ctx, string, R.drawable.ic_toast_check, false);
|
||||
}
|
||||
|
||||
public static void errorToast(final Context ctx, final String string) {
|
||||
graphicalToast(ctx, string, R.drawable.ic_toast_error,false);
|
||||
graphicalToast(ctx, string, R.drawable.ic_toast_error, false);
|
||||
}
|
||||
}
|
||||
|
||||
public static void showToastInUiThread(final Context ctx, final int stringId) {
|
||||
showToastInUiThread(ctx, MainApp.gs(stringId));
|
||||
showToastInUiThread(ctx, ctx.getString(stringId));
|
||||
}
|
||||
|
||||
public static void warnToast(final Context ctx, final String string) {
|
||||
|
@ -70,7 +69,7 @@ public class ToastUtils {
|
|||
public static void graphicalToast(final Context ctx, final String string, @DrawableRes int iconId, boolean isShort) {
|
||||
Handler mainThread = new Handler(Looper.getMainLooper());
|
||||
mainThread.post(() -> {
|
||||
View toastRoot =LayoutInflater.from(new ContextThemeWrapper(ctx, R.style.AppTheme)).inflate(R.layout.toast, null);
|
||||
View toastRoot = LayoutInflater.from(new ContextThemeWrapper(ctx, R.style.AppTheme)).inflate(R.layout.toast, null);
|
||||
TextView toastMessage = toastRoot.findViewById(android.R.id.message);
|
||||
toastMessage.setText(string);
|
||||
|
||||
|
@ -86,9 +85,7 @@ public class ToastUtils {
|
|||
|
||||
public static void showToastInUiThread(final Context ctx, final String string) {
|
||||
Handler mainThread = new Handler(Looper.getMainLooper());
|
||||
mainThread.post(() -> {
|
||||
Toast.makeText(ctx, string, Toast.LENGTH_SHORT).show();
|
||||
});
|
||||
mainThread.post(() -> Toast.makeText(ctx, string, Toast.LENGTH_SHORT).show());
|
||||
}
|
||||
|
||||
public static void showToastInUiThread(final Context ctx, final RxBusWrapper rxBus,
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
package info.nightscout.androidaps.utils;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
|
||||
/**
|
||||
* Created by mike on 15.07.2016.
|
||||
*/
|
||||
public class Translator {
|
||||
|
||||
public static String translate(String text) {
|
||||
switch (text) {
|
||||
|
||||
case "BG Check":
|
||||
return MainApp.gs(R.string.careportal_bgcheck);
|
||||
case "Snack Bolus":
|
||||
return MainApp.gs(R.string.careportal_snackbolus);
|
||||
case "Meal Bolus":
|
||||
return MainApp.gs(R.string.careportal_mealbolus);
|
||||
case "Correction Bolus":
|
||||
return MainApp.gs(R.string.careportal_correctionbolus);
|
||||
case "Carb Correction":
|
||||
return MainApp.gs(R.string.careportal_carbscorrection);
|
||||
case "Combo Bolus":
|
||||
return MainApp.gs(R.string.careportal_combobolus);
|
||||
case "Announcement":
|
||||
return MainApp.gs(R.string.careportal_announcement);
|
||||
case "Note":
|
||||
return MainApp.gs(R.string.careportal_note);
|
||||
case "Question":
|
||||
return MainApp.gs(R.string.careportal_question);
|
||||
case "Exercise":
|
||||
return MainApp.gs(R.string.careportal_exercise);
|
||||
case "Site Change":
|
||||
return MainApp.gs(R.string.careportal_pumpsitechange);
|
||||
case "Pump Battery Change":
|
||||
return MainApp.gs(R.string.careportal_pumpbatterychange);
|
||||
case "Sensor Start":
|
||||
return MainApp.gs(R.string.careportal_cgmsensorstart);
|
||||
case "Sensor Change":
|
||||
return MainApp.gs(R.string.careportal_cgmsensorinsert);
|
||||
case "Insulin Change":
|
||||
return MainApp.gs(R.string.careportal_insulincartridgechange);
|
||||
case "Temp Basal Start":
|
||||
return MainApp.gs(R.string.careportal_tempbasalstart);
|
||||
case "Temp Basal End":
|
||||
return MainApp.gs(R.string.careportal_tempbasalend);
|
||||
case "Profile Switch":
|
||||
return MainApp.gs(R.string.careportal_profileswitch);
|
||||
case "Temporary Target":
|
||||
return MainApp.gs(R.string.careportal_temporarytarget);
|
||||
case "Temporary Target Cancel":
|
||||
return MainApp.gs(R.string.careportal_temporarytargetcancel);
|
||||
case "OpenAPS Offline":
|
||||
return MainApp.gs(R.string.careportal_openapsoffline);
|
||||
case "Finger":
|
||||
return MainApp.gs(R.string.glucosetype_finger);
|
||||
case "Sensor":
|
||||
return MainApp.gs(R.string.glucosetype_sensor);
|
||||
case "Manual":
|
||||
return MainApp.gs(R.string.manual);
|
||||
}
|
||||
return text;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package info.nightscout.androidaps.utils
|
||||
|
||||
import info.nightscout.androidaps.R
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
/**
|
||||
* Created by mike on 15.07.2016.
|
||||
*/
|
||||
@Singleton
|
||||
class Translator @Inject internal constructor(
|
||||
private val resourceHelper: ResourceHelper
|
||||
) {
|
||||
|
||||
fun translate(text: String): String =
|
||||
when (text) {
|
||||
"BG Check" -> resourceHelper.gs(R.string.careportal_bgcheck)
|
||||
"Snack Bolus" -> resourceHelper.gs(R.string.careportal_snackbolus)
|
||||
"Meal Bolus" -> resourceHelper.gs(R.string.careportal_mealbolus)
|
||||
"Correction Bolus" -> resourceHelper.gs(R.string.careportal_correctionbolus)
|
||||
"Carb Correction" -> resourceHelper.gs(R.string.careportal_carbscorrection)
|
||||
"Combo Bolus" -> resourceHelper.gs(R.string.careportal_combobolus)
|
||||
"Announcement" -> resourceHelper.gs(R.string.careportal_announcement)
|
||||
"Note" -> resourceHelper.gs(R.string.careportal_note)
|
||||
"Question" -> resourceHelper.gs(R.string.careportal_question)
|
||||
"Exercise" -> resourceHelper.gs(R.string.careportal_exercise)
|
||||
"Site Change" -> resourceHelper.gs(R.string.careportal_pumpsitechange)
|
||||
"Pump Battery Change" -> resourceHelper.gs(R.string.careportal_pumpbatterychange)
|
||||
"Sensor Start" -> resourceHelper.gs(R.string.careportal_cgmsensorstart)
|
||||
"Sensor Change" -> resourceHelper.gs(R.string.careportal_cgmsensorinsert)
|
||||
"Insulin Change" -> resourceHelper.gs(R.string.careportal_insulincartridgechange)
|
||||
"Temp Basal Start" -> resourceHelper.gs(R.string.careportal_tempbasalstart)
|
||||
"Temp Basal End" -> resourceHelper.gs(R.string.careportal_tempbasalend)
|
||||
"Profile Switch" -> resourceHelper.gs(R.string.careportal_profileswitch)
|
||||
"Temporary Target" -> resourceHelper.gs(R.string.careportal_temporarytarget)
|
||||
"Temporary Target Cancel" -> resourceHelper.gs(R.string.careportal_temporarytargetcancel)
|
||||
"OpenAPS Offline" -> resourceHelper.gs(R.string.careportal_openapsoffline)
|
||||
"Finger" -> resourceHelper.gs(R.string.glucosetype_finger)
|
||||
"Sensor" -> resourceHelper.gs(R.string.glucosetype_sensor)
|
||||
"Manual" -> resourceHelper.gs(R.string.manual)
|
||||
else -> resourceHelper.gs(R.string.unknown)
|
||||
}
|
||||
}
|
|
@ -92,14 +92,14 @@ class TddCalculator @Inject constructor(
|
|||
"<b>" + resourceHelper.gs(R.string.tdd) + ":</b><br>" +
|
||||
toText(tdds) +
|
||||
"<b>" + resourceHelper.gs(R.string.average) + ":</b><br>" +
|
||||
averageTdd.toText(tdds.size())
|
||||
averageTdd.toText(resourceHelper, tdds.size())
|
||||
)
|
||||
}
|
||||
|
||||
private fun toText(tdds: LongSparseArray<TDD>): String {
|
||||
var t = ""
|
||||
for (i in 0 until tdds.size()) {
|
||||
t += "${tdds.valueAt(i).toText()}<br>"
|
||||
t += "${tdds.valueAt(i).toText(resourceHelper)}<br>"
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusGeneral">
|
||||
tools:context=".plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusGeneralFragment">
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusHistory">
|
||||
tools:context=".plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusHistoryFragment">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -103,7 +103,6 @@
|
|||
<string name="sms_delta">Delta:</string>
|
||||
<string name="configbuilder">Konfigurasie bouer</string>
|
||||
<string name="objectives">Doelstellings</string>
|
||||
<string name="openapsma">OpenAPS MA</string>
|
||||
<string name="overview">Oorsig</string>
|
||||
<string name="nsprofile">Ns Profiel</string>
|
||||
<string name="simpleprofile">Maklike profiel</string>
|
||||
|
|
|
@ -46,6 +46,9 @@
|
|||
<string name="requestcode">Код (request code): %1$s</string>
|
||||
<string name="objectives_hint">(отбележете всички правилни отговори)</string>
|
||||
<string name="disconnectpump_hint" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#what-to-do-when-taking-a-shower-or-bath</string>
|
||||
<string name="usetemptarget_hint" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen</string>
|
||||
<string name="useaction_hint" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#config-builder</string>
|
||||
<string name="usescale_hint" formatted="false">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/Screenshots.html#the-homescreen</string>
|
||||
<string name="notconnected">Няма връзка с Интернет!</string>
|
||||
<string name="failedretrievetime">Не може да се вземе времето</string>
|
||||
<string name="requirementnotmet">Задачите не са изпълнени</string>
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
<string name="description_pump_mdi">Писалки - За хората, които правят множество ежедневни инжекции ( интензифицирано лечение с писалки)</string>
|
||||
<string name="description_pump_virtual">За помпи, който все още не работят с AndroidAPS(Open Loop)</string>
|
||||
<string name="description_sensitivity_aaps">Чувствителността се изчислява по същия начин като в Oref0, но можете да зададете времева рамка. Минимална въглехидрати абсорбция се изчислява от Макс време за усвояване на въглехидратите в опциите.</string>
|
||||
<string name="description_sensitivity_oref1">Чувствителността се изчислява за 8 или 24 назад в миналото, а въглехидрати (ако не са се абсорбирали) изчезват след изтичане на срока от настройките. Това е необходимо за изчисление на необявени хранения (UAM).</string>
|
||||
<string name="description_sensitivity_weighted_average">Чувствителността се изчислява като среднопретеглена стойност от отклоненията. По-новите отклонения имат по-високо тегло. Минималната абсорбция на въглехидрати се изчислява от Време за макс усвояване на въглехидрати от опциите. Този алгоритъм е най-бързият при проследяването на промени в чувствителността.</string>
|
||||
<string name="description_source_eversense">Получава данни за КЗ от модифицираното приложение на Eversense.</string>
|
||||
<string name="description_source_glimp">Получава данни за КЗ от Glimp.</string>
|
||||
|
@ -105,7 +106,6 @@
|
|||
<string name="sms_delta">Изменение (делта):</string>
|
||||
<string name="configbuilder">Конфигурация</string>
|
||||
<string name="objectives">Цели</string>
|
||||
<string name="openapsma">OpenAPS МА</string>
|
||||
<string name="overview">Общ</string>
|
||||
<string name="nsprofile">NS Профил</string>
|
||||
<string name="simpleprofile">Обикновен профил</string>
|
||||
|
@ -543,8 +543,6 @@
|
|||
<string name="enablesuperbolus">Разреши използването на Суперболус</string>
|
||||
<string name="enablesuperbolus_summary">Разреши функцията суперболус в съветника. Не я разрешавайте докато не научите какво наистина прави. ТОВА МОЖЕ ДА СЪЗДАДЕ ОПАСНОСТ ОТ ПРЕДОЗИРАНЕ С ИНСУЛИН.</string>
|
||||
<string name="show_statuslights">Покажи статус светлини на началния екран</string>
|
||||
<string name="show_statuslights_extended">Покажи статус светлини с подробности на началния екран</string>
|
||||
<string name="show_statuslights_extended_summary">Показвай подробни статус светлини за канула, инсулин, сензор, резервоар и батерията на началния екран.</string>
|
||||
<string name="statuslights_res_warning">Ниво за аларма за останал инсулин в резервоара [Е]</string>
|
||||
<string name="statuslights_res_critical">Критично ниво на останал инсулин в резервоар [Е]</string>
|
||||
<string name="statuslights_bat_warning">Аларма при заряд на батерия под [%]</string>
|
||||
|
@ -979,6 +977,7 @@
|
|||
<string name="allow_hardware_pump_text">Внимание: Ако активирате и свържете с хардуерна помпа, AndroidAPS ще копира основните настройки от профила в помпата, като презапише съществуващата базова скорост, съхранявана на помпата. Уверете се, че имате правилните основни настройки в AndroidAPS. Ако не сте сигурни или не искате да презапишете основните настройки на помпата, натиснете Cancel и повторете превключването към помпата по-късно.</string>
|
||||
<string name="error_adding_treatment_title">Данните за лечението не са пълни</string>
|
||||
<string name="maintenance_settings">Настройки за поддръжка</string>
|
||||
<string name="maintenance_email">Имейл</string>
|
||||
<string name="maintenance_amount">Брой логове за изпращане</string>
|
||||
<string name="maintenance">Поддръжка</string>
|
||||
<string name="maintenance_shortname">ПОДДР</string>
|
||||
|
|
|
@ -20,7 +20,9 @@
|
|||
<string name="objectives_autosens_gate">Jeden týden úspěšného používání s běžným příjmem sacharidů</string>
|
||||
<string name="objectives_ama_objective">Povolení doplňkový funkcí pro každodenní použití, jako např. pokročilý jídelní asistent (AMA)</string>
|
||||
<string name="objectives_smb_objective">Povolit další funkce pro běžné používání jako SMB</string>
|
||||
<string name="objectives_auto_objective">Povolení automatizace</string>
|
||||
<string name="objectives_smb_gate">Přečíst si dokumentaci a zvýšit maximální IOB, aby mohlo SMB fungovat. Pro začátek se dá použít velikost běžného bolusu + 3x maximální denní bazál</string>
|
||||
<string name="objectives_auto_gate">Přečtěte si na wiki, jak automatizace funguje. Nejdříve nastavte pouze jednoduchá pravidla. Namísto provádění akcí nechte AAPS zobrazovat pouze oznámení. Pokud jste si jistí, že je automatizace je spuštěna v pravý čas, můžete oznámení nahradit prováděním akce. (https://androidaps.readdocs.io/en/latest/CROWDIN/cs/Usage/Automation.html)</string>
|
||||
<string name="objectives_bgavailableinns">Glykémie dostupná v NS</string>
|
||||
<string name="objectives_pumpstatusavailableinns">Stav pumpy dostupný v NS</string>
|
||||
<string name="objectives_manualenacts">Ručně spuštěno</string>
|
||||
|
|
|
@ -4,4 +4,20 @@
|
|||
<string name="biometric_description">Položte prst na čtečku otisků prstů pro ověření vaší totožnosti</string>
|
||||
<string name="settings_protection">Ochrana nastavení</string>
|
||||
<string name="application_protection">Ochrana aplikace</string>
|
||||
<string name="bolus_protection">Ochrana bolusu</string>
|
||||
<string name="master_password">Hlavní heslo</string>
|
||||
<string name="settings_password">Heslo pro nastavení</string>
|
||||
<string name="application_password">Heslo aplikace</string>
|
||||
<string name="bolus_password">Heslo pro bolus</string>
|
||||
<string name="unlock_settings">Odemknout nastavení</string>
|
||||
<string name="biometric">Biometrie</string>
|
||||
<string name="custom_password">Vlastní heslo</string>
|
||||
<string name="noprotection">Bez ochrany</string>
|
||||
<string name="protection">Ochrana</string>
|
||||
<string name="master_password_missing">Hlavní heslo není nastaveno!\n\nProsím nastavte své hlavní heslo v Preferencích (%1$s → %2$s)</string>
|
||||
<string name="password_set">Heslo nastaveno!</string>
|
||||
<string name="password_not_set">Heslo není nastavené</string>
|
||||
<string name="password_not_changed">Heslo nezměněno</string>
|
||||
<string name="password_cleared">Heslo vymazáno!</string>
|
||||
<string name="password_hint">Zadejte heslo</string>
|
||||
</resources>
|
||||
|
|
|
@ -106,7 +106,6 @@
|
|||
<string name="sms_delta">Rozdíl:</string>
|
||||
<string name="configbuilder">Konfigurace</string>
|
||||
<string name="objectives">Cíle</string>
|
||||
<string name="openapsma">OpenAPS MA</string>
|
||||
<string name="overview">Přehled</string>
|
||||
<string name="nsprofile">NS profil</string>
|
||||
<string name="simpleprofile">Jednoduchý profil</string>
|
||||
|
@ -585,8 +584,14 @@
|
|||
<string name="enablesuperbolus">Povolit superbolus</string>
|
||||
<string name="enablesuperbolus_summary">Povolení superbolusu v kalkulátoru. Nepovolujte, dokud se nenaučíte, co to opravdu dělá. MŮŽE ZPŮSOBIT PŘEDÁVKOVÁNÍ INZULÍNEM PŘI NESPRÁVNÉM POUŽITÍ!</string>
|
||||
<string name="show_statuslights">Zobrazit stavové indikátory na domovské obrazovce</string>
|
||||
<string name="show_statuslights_extended">Zobrazit rozšířené stavové indikátory na domovské obrazovce</string>
|
||||
<string name="show_statuslights_extended_summary">Povolí rozšířené stavové indikátory pro stáří kanyly, inzulínu, senzoru, zásobníku a baterie na domovské obrazovce.</string>
|
||||
<string name="statuslights_cage_warning">Úroveň varování stáří kanyly [h]</string>
|
||||
<string name="statuslights_cage_critical">Úroveň kritického stáří kanyly [h]</string>
|
||||
<string name="statuslights_iage_warning">Úroveň varování stáří inzulínu [h]</string>
|
||||
<string name="statuslights_iage_critical">Úroveň kritického stáří inzulínu [h]</string>
|
||||
<string name="statuslights_sage_warning">Úroveň varování stáří senzoru [h]</string>
|
||||
<string name="statuslights_sage_critical">Úroveň kritického stáří senzoru [h]</string>
|
||||
<string name="statuslights_bage_warning">Úroveň varování stáří baterie [h]</string>
|
||||
<string name="statuslights_bage_critical">Úroveň kritického varování stáří baterie [h]</string>
|
||||
<string name="statuslights_res_warning">Úroveň varování stavu zásobníku [U]</string>
|
||||
<string name="statuslights_res_critical">Úroveň kritického varování stavu zásobníku [U]</string>
|
||||
<string name="statuslights_bat_warning">Úroveň varování stavu baterie [%]</string>
|
||||
|
@ -1523,4 +1528,12 @@
|
|||
<string name="ondisconnect">Při odpojení</string>
|
||||
<string name="overview_show_predictions">Predikce</string>
|
||||
<string name="overview_show_deviationslope">Odchylka sklonu</string>
|
||||
<string name="authorizationfailed">Autorizace selhala</string>
|
||||
<string name="overview_show_absinsulin">Absolutní inzulin</string>
|
||||
<string name="master_password_summary">Hlavní heslo se používá pro šifrování zálohy a pro \"přebití\" zabezpečení v aplikaci. Dobře si ho zapamatujte nebo uložte na bezpečném místě.</string>
|
||||
<string name="passwords_dont_match">Hesla se neshodují</string>
|
||||
<string name="current_master_password">Aktuální hlavní heslo</string>
|
||||
<string name="statuslights">Stavové indikátory</string>
|
||||
<string name="statuslights_copy_ns">Zkopírovat nastavení z NS</string>
|
||||
<string name="copyexistingvalues">Zkopírovat nastavení NS (existuje-li)?</string>
|
||||
</resources>
|
||||
|
|
|
@ -20,8 +20,10 @@
|
|||
<string name="objectives_autosens_gate">Loope eine Woche tagsüber mit regelmäßiger Kohlenhydrat-Eingabe</string>
|
||||
<string name="objectives_ama_objective">Aktiviere zusätzliche Funktionen für die Nutzung tagsüber wie z. B. den erweiterten Mahlzeitenassistenten (AMA)</string>
|
||||
<string name="objectives_smb_objective">Aktiviere zusätzliche Funktionen für die Nutzung tagsüber wie z. B. SMB</string>
|
||||
<string name="objectives_auto_objective">Automatisierung aktivieren</string>
|
||||
<string name="objectives_smb_gate">Lies das Wiki und erhöhe maxIOB, damit der SMB gut funktioniert. Ein guter Anfang ist
|
||||
die Formel maxIOB = durchschnittlicher Essensbolus + 3 x höchste Basalrate</string>
|
||||
<string name="objectives_auto_gate">Lies in den Docs wie Automatisierung funktioniert und erstelle dann eine erste einfache Regel. Verwende eine Benachrichtigung statt der tatsächlichen Aktion. Wenn die Automatisierung zum richtigen Zeitpunkt auslöst, ersetze die Benachrichtigung durch die gewünschte Aktion. (https://androidaps.readthedocs.io/en/latest/CROWDIN/de/Usage/Automation.html)</string>
|
||||
<string name="objectives_bgavailableinns">BZ in Nightscout verfügbar</string>
|
||||
<string name="objectives_pumpstatusavailableinns">Pumpen-Status in Nightscout verfügbar</string>
|
||||
<string name="objectives_manualenacts">Manuelle Aktionen</string>
|
||||
|
|
|
@ -1,2 +1,23 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="biometric_title">Authentifizierung erforderlich</string>
|
||||
<string name="biometric_description">Legen Deinen Finger auf den Fingerabdrucksensors, um Deine Identität zu bestätigen.</string>
|
||||
<string name="settings_protection">Schutz der Einstellungen</string>
|
||||
<string name="application_protection">Schutz der App</string>
|
||||
<string name="bolus_protection">Bolus-Schutz</string>
|
||||
<string name="master_password">Master-Passwort</string>
|
||||
<string name="settings_password">Passwort für Einstellungen</string>
|
||||
<string name="application_password">Anwendungspasswort</string>
|
||||
<string name="bolus_password">Passwort für Boli</string>
|
||||
<string name="unlock_settings">Einstellungen freischalten</string>
|
||||
<string name="biometric">Biometrisch</string>
|
||||
<string name="custom_password">Benutzerdefiniertes Passwort</string>
|
||||
<string name="noprotection">Kein Schutz</string>
|
||||
<string name="protection">Schutz</string>
|
||||
<string name="master_password_missing">Das Master-Passwort ist nicht festgelegt!\n\nLege Dein Master-Passwort bitte in en Einstellungen fest (%1$s → %2$s)</string>
|
||||
<string name="password_set">Passwort festgelegt!</string>
|
||||
<string name="password_not_set">Passwort nicht festgelegt</string>
|
||||
<string name="password_not_changed">Passwort nicht geändert</string>
|
||||
<string name="password_cleared">Passwort gelöscht!</string>
|
||||
<string name="password_hint">Passwort hier eingeben</string>
|
||||
</resources>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue