diff --git a/app/build.gradle b/app/build.gradle index 6bfea65e09c18951c4bedbba1cb835ca18935ecb..b54f1f8a56453af8a710861a1fe258c16bf8d0be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -156,7 +156,7 @@ dependencies { compile 'com.mikepenz:google-material-typeface:2.2.0.1.original@aar' compile 'uk.co.chrisjenx:calligraphy:2.2.0' compile 'com.bugfender.sdk:android:0.7.2' - compile 'com.jjoe64:graphview:4.2.1' + compile 'com.jjoe64:graphview:4.0.1' compile 'com.android.support:support-v4:23.4.0' compile 'com.google.code.gson:gson:2.7' compile 'com.squareup.retrofit2:retrofit:2.1.0' 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 4a7e1110aad092b11c1c44bacec2596712abe957..bb686c818791e74973699645f5a8f6a1e07ee94d 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java +++ b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java @@ -328,6 +328,8 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc mChart.getViewport().setMaxX(now); mChart.getViewport().setMinX(left); +// due to bug in GraphView v4.2.1 using setNumHorizontalLabels reverted to using v4.0.1 and setOnXAxisBoundsChangedListener is n/a in this version +/* mChart.getViewport().setOnXAxisBoundsChangedListener(new Viewport.OnXAxisBoundsChangedListener() { @Override public void onXAxisBoundsChanged(double minX, double maxX, Reason reason) { @@ -335,7 +337,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc hasZoomedChart = (rightX != maxX || rightX - chartZoom * 60 * 60 * 1000 != minX); } }); - +*/ mChart.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { @@ -349,7 +351,9 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc } }); mChart.getGridLabelRenderer().setNumHorizontalLabels(6); - mChart.getGridLabelRenderer().setHumanRounding(false); + +// due to bug in GraphView v4.2.1 using setNumHorizontalLabels reverted to using v4.0.1 and setHumanRounding is n/a in this version +// mChart.getGridLabelRenderer().setHumanRounding(false); mChart.getGridLabelRenderer().setLabelFormatter(new DefaultLabelFormatter() { DateFormat mFormat = new SimpleDateFormat("HH:mm"); // 24 hour format forced to fix label overlap @@ -446,14 +450,15 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc } 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)); + if (!mRealm.isClosed()) { + RealmResults<PumpStatusEvent> results = mRealm.where(PumpStatusEvent.class) + .findAllSorted("eventDate", Sort.DESCENDING); + if (results.size() > 0) { + startCgmService(getNextPoll(results.first()) + delay); + return; + } } + startCgmService(System.currentTimeMillis() + (delay == 0 ? 1000 : delay)); } private void startCgmService(long initialPoll) { diff --git a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCnlReader.java b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCnlReader.java index 6763c82d683bcd7daf32ba61f95294216a4a2a70..79fc5ce59946aaf202f8f520f435ab203267f150 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCnlReader.java +++ b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCnlReader.java @@ -171,44 +171,16 @@ public class MedtronicCnlReader { public Date getPumpTime() throws EncryptionException, IOException, ChecksumException, TimeoutException, UnexpectedMessageException { Log.d(TAG, "Begin getPumpTime"); - - // CNL<-->PUMP comms can have occasional short lived noise causing errors, retrying once catches this - try { - PumpTimeResponseMessage response = new PumpTimeRequestMessage(mPumpSession).send(mDevice); - Log.d(TAG, "Finished getPumpTime with date " + response.getPumpTime()); - return response.getPumpTime(); - } catch (UnexpectedMessageException e) { - Log.e(TAG, "Unexpected Message", e); - } catch (TimeoutException e) { - Log.e(TAG, "Timeout communicating with the Contour Next Link.", e); - } - PumpTimeResponseMessage response = new PumpTimeRequestMessage(mPumpSession).send(mDevice); - Log.d(TAG, "Finished getPumpTime with date " + response.getPumpTime()); return response.getPumpTime(); } public PumpStatusEvent updatePumpStatus(PumpStatusEvent pumpRecord) throws IOException, EncryptionException, ChecksumException, TimeoutException, UnexpectedMessageException { Log.d(TAG, "Begin updatePumpStatus"); - - // CNL<-->PUMP comms can have occasional short lived noise causing errors, retrying once catches this - try { - PumpStatusResponseMessage response = new PumpStatusRequestMessage(mPumpSession).send(mDevice); - response.updatePumpRecord(pumpRecord); - Log.d(TAG, "Finished updatePumpStatus"); - return pumpRecord; - } catch (UnexpectedMessageException e) { - Log.e(TAG, "Unexpected Message", e); - } catch (TimeoutException e) { - Log.e(TAG, "Timeout communicating with the Contour Next Link.", e); - } - PumpStatusResponseMessage response = new PumpStatusRequestMessage(mPumpSession).send(mDevice); response.updatePumpRecord(pumpRecord); - Log.d(TAG, "Finished updatePumpStatus"); - return pumpRecord; } diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java index bc656cbd18a4b0c3177e339567f0d5c42d94d74a..18de1f899ec1354ce7605ccd486c4aaa0bf845d8 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java +++ b/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java @@ -7,6 +7,7 @@ import info.nightscout.android.USB.UsbHidDriver; import info.nightscout.android.medtronic.MedtronicCnlSession; import info.nightscout.android.medtronic.exception.ChecksumException; import info.nightscout.android.medtronic.exception.EncryptionException; +import info.nightscout.android.medtronic.exception.UnexpectedMessageException; /** * Created by volker on 10.12.2016. @@ -17,6 +18,24 @@ public class CloseConnectionRequestMessage extends ContourNextLinkBinaryRequestM super(CommandType.CLOSE_CONNECTION, pumpSession, payload); } + @Override + public CloseConnectionResponseMessage send(UsbHidDriver mDevice, int millis) throws IOException, TimeoutException, ChecksumException, EncryptionException, UnexpectedMessageException { + + // clear unexpected incoming messages + clearMessage(mDevice); + + sendMessage(mDevice); + if (millis > 0) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + } + } + + CloseConnectionResponseMessage response = this.getResponse(readMessage(mDevice)); + return response; + } + @Override protected CloseConnectionResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException { return new CloseConnectionResponseMessage(payload); diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusRequestMessage.java index 163f42775f2161bcf92ae7e743c2a0435ba99165..13858f38e76f4e761bd2bd13e6a343683ab34daf 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusRequestMessage.java +++ b/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusRequestMessage.java @@ -40,11 +40,13 @@ public class PumpStatusRequestMessage extends MedtronicSendMessageRequestMessage } catch (InterruptedException e) { } } - PumpStatusResponseMessage response = this.getResponse(readMessage(mDevice)); + // Read the 0x80 + byte[] payload = readMessage(mDevice); // clear unexpected incoming messages clearMessage(mDevice); + PumpStatusResponseMessage response = this.getResponse(payload); return response; } diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/PumpTimeRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/PumpTimeRequestMessage.java index 592800406888cb5c6ce3860642c785b274ce79a2..c4063b53e0681c472885b90ebf4ee6d7aa9ce231 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/message/PumpTimeRequestMessage.java +++ b/app/src/main/java/info/nightscout/android/medtronic/message/PumpTimeRequestMessage.java @@ -36,11 +36,12 @@ public class PumpTimeRequestMessage extends MedtronicSendMessageRequestMessage<P } } // Read the 0x80 - PumpTimeResponseMessage response = this.getResponse(readMessage(mDevice)); + byte[] payload = readMessage(mDevice); // Pump sends additional 0x80 message when not using EHSM, lets clear this and any unexpected incoming messages clearMessage(mDevice); + PumpTimeResponseMessage response = this.getResponse(payload); return response; } 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 b7881f6c2d24c284ef14f116d98f83d15b61b85f..77dbee6aaededae6fd72f1311a4c3ab886e49068 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 @@ -259,14 +259,14 @@ public class MedtronicCnlIntentService extends IntentService { } sendStatus("SGV: " + MainActivity.strFormatSGV(pumpRecord.getSgv()) + " At: " + df.format(pumpRecord.getEventDate().getTime()) + " Pump: " + offsetSign + (pumpOffset / 1000L) + "sec"); //note: event time is currently stored with offset - // Check if pump sent old event when new expected and schedule a re-poll + // Check if pump sent old event when new expected if (((pumpRecord.getEventDate().getTime() - dataStore.getLastPumpStatus().getEventDate().getTime()) < 5000L) && ((timePollExpected - timePollStarted) < 5000L)) { - pollInterval = 90000L; // polling interval set to 90 seconds - sendStatus("Pump sent old SGV event, re-polling..."); + sendStatus("Pump sent old SGV event"); } //MainActivity.timeLastGoodSGV = pumpRecord.getEventDate().getTime(); // track last good sgv event time //MainActivity.pumpBattery = pumpRecord.getBatteryPercentage(); // track pump battery + timeLastGoodSGV = pumpRecord.getEventDate().getTime(); dataStore.clearUnavailableSGVCount(); // reset unavailable sgv count // Check that the record doesn't already exist before committing @@ -295,11 +295,11 @@ public class MedtronicCnlIntentService extends IntentService { } catch (UnexpectedMessageException e) { Log.e(TAG, "Unexpected Message", e); sendStatus("Communication Error: " + e.getMessage()); - pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway()?2L:1L); + pollInterval = 60000L; // retry once during this poll period } catch (TimeoutException e) { Log.e(TAG, "Timeout communicating with the Contour Next Link.", e); sendStatus("Timeout communicating with the Contour Next Link."); - pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway()?2L:1L); + pollInterval = 60000L; // retry once during this poll period } catch (NoSuchAlgorithmException e) { Log.e(TAG, "Could not determine CNL HMAC", e); sendStatus("Error connecting to Contour Next Link: Hashing error.");