diff --git a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java index 363c97116956403dea14cdd6033079536b1fca84..65999350ff1c0aae746e92fa386d54f3bc1715a5 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java +++ b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java @@ -109,18 +109,31 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc private StatusMessageReceiver statusMessageReceiver = new StatusMessageReceiver(); private MedtronicCnlAlarmReceiver medtronicCnlAlarmReceiver = new MedtronicCnlAlarmReceiver(); - + /** + * calculate the next poll timestamp based on last svg event + * + * @param pumpStatusData + * @return timestamp + */ public static long getNextPoll(PumpStatusEvent pumpStatusData) { - long nextPoll = pumpStatusData.getEventDate().getTime() + pumpStatusData.getPumpTimeOffset() - + MedtronicCnlIntentService.POLL_GRACE_PERIOD_MS; + long nextPoll = pumpStatusData.getEventDate().getTime() + pumpStatusData.getPumpTimeOffset(), + now = System.currentTimeMillis(); - if (pumpStatusData.getBatteryPercentage() > 25) { - // poll every 5 min - nextPoll += MainActivity.pollInterval; + // align to next poll slot + if (nextPoll + 2 * 60 * 60 * 1000 < now) { // last event more than 2h old -> could be a calibration + nextPoll = System.currentTimeMillis() + 1000; } else { - // if pump battery seems to be empty reduce polling to save battery (every 15 min) - //TODO add message & document it - nextPoll += MainActivity.lowBatteryPollInterval; + // align to poll interval + nextPoll += (((now - nextPoll) / MainActivity.pollInterval)) * MainActivity.pollInterval + + MedtronicCnlIntentService.POLL_GRACE_PERIOD_MS; + if (pumpStatusData.getBatteryPercentage() > 25) { + // poll every 5 min + nextPoll += MainActivity.pollInterval; + } else { + // if pump battery seems to be empty reduce polling to save battery (every 15 min) + //TODO add message & document it + nextPoll += MainActivity.lowBatteryPollInterval; + } } return nextPoll; @@ -411,7 +424,18 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc } private void startCgmService() { - startCgmService(System.currentTimeMillis() + 1000); + startCgmServiceDelayed(0); + } + + private void startCgmServiceDelayed(long delay) { + RealmResults<PumpStatusEvent> results = mRealm.where(PumpStatusEvent.class) + .findAllSorted("eventDate", Sort.DESCENDING); + + if (results.size() > 0) { + startCgmService(getNextPoll(results.first()) + delay); + } else { + startCgmService(System.currentTimeMillis() + (delay==0?1000:delay)); + } } private void startCgmService(long initialPoll) { @@ -912,7 +936,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc if (hasUsbPermission()) { // Give the USB a little time to warm up first - startCgmService(System.currentTimeMillis() + MedtronicCnlIntentService.USB_WARMUP_TIME_MS); + startCgmServiceDelayed(MedtronicCnlIntentService.USB_WARMUP_TIME_MS); } else { Log.d(TAG, "No permission for USB. Waiting."); waitForUsbPermission(); diff --git a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java index 9b041daf2e537086e1b164b90e5c80b9f34fd2e0..23fdd5dcf4a4fba01066e5e9b1ac38c6792e48e1 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java +++ b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java @@ -21,15 +21,14 @@ import java.util.Date; import java.util.Locale; import java.util.concurrent.TimeoutException; -import info.nightscout.android.BuildConfig; import info.nightscout.android.R; import info.nightscout.android.USB.UsbHidDriver; import info.nightscout.android.medtronic.MainActivity; import info.nightscout.android.medtronic.MedtronicCnlReader; import info.nightscout.android.medtronic.exception.ChecksumException; import info.nightscout.android.medtronic.exception.EncryptionException; -import info.nightscout.android.medtronic.message.MessageUtils; import info.nightscout.android.medtronic.exception.UnexpectedMessageException; +import info.nightscout.android.medtronic.message.MessageUtils; import info.nightscout.android.model.medtronicNg.ContourNextLinkInfo; import info.nightscout.android.model.medtronicNg.PumpInfo; import info.nightscout.android.model.medtronicNg.PumpStatusEvent; @@ -38,8 +37,6 @@ import info.nightscout.android.xdrip_plus.XDripPlusUploadReceiver; import io.realm.Realm; import io.realm.RealmResults; -import static info.nightscout.android.medtronic.MainActivity.setActivePumpMac; - public class MedtronicCnlIntentService extends IntentService { public final static int USB_VID = 0x1a79; public final static int USB_PID = 0x6210; @@ -155,12 +152,7 @@ public class MedtronicCnlIntentService extends IntentService { .findFirst(); if (info == null) { - // TODO - use realm.createObject()? info = realm.createObject(ContourNextLinkInfo.class, cnlReader.getStickSerial()); - //info = new ContourNextLinkInfo(); - ///info.setSerialNumber(cnlReader.getStickSerial()); - - //info = realm.copyToRealm(info); } cnlReader.getPumpSession().setStickSerial(info.getSerialNumber());