Configuration:
- added delay for Bolus delivery
- added choice for decoding (done on RL or in software)

Code:
- encoding DailyTotals for 522 and 523
- some minor fixes reported by Crashalytics
- refactoring history
- added history display
- changes to delivering Bolus (canceling)
- started adding 6b4b hardware decoding
This commit is contained in:
Andy Rozman 2019-01-04 14:02:10 +01:00
parent a9200e9e3e
commit 56eaacb3a2
38 changed files with 1506 additions and 1183 deletions

View file

@ -66,7 +66,7 @@
</intent-filter>
</activity>
<activity android:name=".plugins.PumpDanaRS.activities.PairingHelperActivity" />
<activity android:name=".activities.HistoryBrowseActivity" />
<activity android:name=".plugins.PumpCommon.dialog.RileyLinkBLEScanActivity">
@ -213,6 +213,7 @@
android:label="@string/title_activity_rileylink_settings"
android:theme="@style/Theme.AppCompat.NoTitle" />
<activity android:name=".plugins.PumpMedtronic.dialog.MedtronicHistoryActivity" />
</application>

View file

@ -272,6 +272,8 @@ public class MainApp extends Application {
// SP.putDouble(RileyLinkConst.Prefs.LastGoodDeviceFrequency, null);
SP.remove(MedtronicConst.Statistics.LastPumpHistoryEntry); // FIXME remove
//SP.putString(MedtronicConst.Prefs.PumpFrequency, "US (916 MHz)");
// RileyLink framework needs to know, when BT was reconnected, so that we can reconnect to RL device
btReceiver = new BroadcastReceiver() {

View file

@ -78,15 +78,17 @@ public class RileyLinkUtil {
public static void setEncoding(RileyLinkEncodingType encoding) {
RileyLinkUtil.encoding = encoding;
if (encoding == RileyLinkEncodingType.FourByteSixByte) {
if (encoding == RileyLinkEncodingType.FourByteSixByteLocal) {
RileyLinkUtil.encoding4b6b = new Encoding4b6bGeoff();
}
}
public static void sendBroadcastMessage(String message) {
Intent intent = new Intent(message);
LocalBroadcastManager.getInstance(RileyLinkUtil.context).sendBroadcast(intent);
if (context != null) {
Intent intent = new Intent(message);
LocalBroadcastManager.getInstance(RileyLinkUtil.context).sendBroadcast(intent);
}
}

View file

@ -81,8 +81,8 @@ public class RFSpy {
// Here should go generic RL initialisation + protocol adjustments depending on
// firmware version
public void initializeRileyLink() {
firmwareVersion = getFirmwareVersion();
bleVersion = getVersion();
firmwareVersion = getFirmwareVersion();
}
@ -98,7 +98,9 @@ public class RFSpy {
public String getVersion() {
BLECommOperationResult result = rileyLinkBle.readCharacteristic_blocking(radioServiceUUID, radioVersionUUID);
if (result.resultCode == BLECommOperationResult.RESULT_SUCCESS) {
return StringUtil.fromBytes(result.value);
String version = StringUtil.fromBytes(result.value);
LOG.debug("BLE Version: " + version);
return version;
} else {
LOG.error("getVersion failed with code: " + result.resultCode);
return "(null)";
@ -107,14 +109,22 @@ public class RFSpy {
public RileyLinkFirmwareVersion getFirmwareVersion() {
LOG.debug("Firmware Version. Get Version - Start");
for (int i = 0; i < 5; i++) {
// We have to call raw version of communication to get firmware version
// So that we can adjust other commands accordingly afterwords
byte[] getVersionRaw = getByteArray(RileyLinkCommandType.GetVersion.code);
byte[] response = writeToDataRaw(getVersionRaw, 5000);
LOG.debug("Firmware Version. GetVersion [response={}]", ByteUtil.getHex(response));
if (response != null) { // && response[0] == (byte) 0xDD) {
String versionString = StringUtil.fromBytes(response);
RileyLinkFirmwareVersion version = RileyLinkFirmwareVersion.getByVersionString(StringUtil
.fromBytes(response));
@ -127,6 +137,12 @@ public class RFSpy {
}
}
LOG.error("Firmware Version can't be determined. Checking with BLE Version [{}].", bleVersion);
if (bleVersion.contains(" 2.")) {
return RileyLinkFirmwareVersion.Version_2_0;
}
return RileyLinkFirmwareVersion.UnknownVersion;
}
@ -310,7 +326,7 @@ public class RFSpy {
updateRegister(CC111XRegister.mdmcfg1, 0x62);
updateRegister(CC111XRegister.mdmcfg0, 0x1A);
updateRegister(CC111XRegister.deviatn, 0x13);
// RileyLinkUtil.setEncoding(RileyLinkEncodingType.FourByteSixByte);
setMedtronicEncoding();
}
break;
@ -322,10 +338,10 @@ public class RFSpy {
updateRegister(CC111XRegister.mdmcfg1, 0x61);
updateRegister(CC111XRegister.mdmcfg0, 0x7E);
updateRegister(CC111XRegister.deviatn, 0x15);
// RileyLinkUtil.setEncoding(RileyLinkEncodingType.FourByteSixByte);
setMedtronicEncoding();
}
break;
case Omnipod: {
RFSpyResponse r = null;
// RL initialization for Omnipod is a copy/paste from OmniKit implementation.
@ -369,6 +385,15 @@ public class RFSpy {
}
private void setMedtronicEncoding() {
// FIXME
// check settings if RileyLink_4b6b is enabled, and then check if we have version 2.2 or higher, if both
// are yes then we set encoding on RileyLink and set it in RileyLinkUtil.
}
private RFSpyResponse setPreamble(int preamble) {
RFSpyResponse resp = null;
try {

View file

@ -25,7 +25,6 @@ public class RFSpyReader {
private static final Logger LOG = LoggerFactory.getLogger(RFSpyReader.class);
private static AsyncTask<Void, Void, Void> readerTask;
// private Context context;
private RileyLinkBLE rileyLinkBle;
private Semaphore waitForRadioData = new Semaphore(0, true);
private LinkedBlockingQueue<byte[]> mDataQueue = new LinkedBlockingQueue<>();
@ -33,14 +32,12 @@ public class RFSpyReader {
private int releaseCount = 0;
public RFSpyReader(/* Context context, */RileyLinkBLE rileyLinkBle) {
// this.context = context;
public RFSpyReader(RileyLinkBLE rileyLinkBle) {
this.rileyLinkBle = rileyLinkBle;
}
public void init(/* Context context, */RileyLinkBLE rileyLinkBLE) {
// this.context = context;
public void init(RileyLinkBLE rileyLinkBLE) {
this.rileyLinkBle = rileyLinkBLE;
}

View file

@ -1,447 +0,0 @@
package info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.ble;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.plugins.PumpCommon.utils.ByteUtil;
import info.nightscout.androidaps.plugins.PumpCommon.utils.CRC;
/**
* Created by geoff on 7/31/15.
*/
// TODO refactor this DRY
public class RFTools {
public static final byte[] codes = new byte[] { 21, 49, 50, 35, 52, 37, 38, 22, 26, 25, 42, 11, 44, 13, 14, 28 };
private static final Logger LOG = LoggerFactory.getLogger(RFTools.class);
private final static char[] HEX_DIGITS = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
/*
* CodeSymbols is an ordered list of translations
* 6bits -> 4 bits, in order from 0x0 to 0xF
* The 6 bit codes are what is used on the RF side of the RileyLink
* to communicate with a Medtronic pump.
*/
public static byte[] CodeSymbols = {
0x15, 0x31, 0x32, 0x23, 0x34, 0x25, 0x26, 0x16, 0x1a, 0x19, 0x2a, 0x0b, 0x2c, 0x0d, 0x0e, 0x1c };
public static byte[] appendChecksum(final byte[] input) {
if (input == null) {
return null;
}
if (input.length == 0) {
return null;
}
byte[] rval = new byte[input.length + 1];
System.arraycopy(input, 0, rval, 0, input.length);
byte mycrc = CRC.crc8(input);
LOG.debug(String.format("Adding checksum 0x%02X to %d byte array from 0x%02X to 0x%02X", mycrc, input.length,
input[0], input[input.length - 1]));
rval[input.length] = mycrc;
return rval;
}
/*
* + (NSData*)encode4b6b:(NSData*)data {
* NSMutableData *outData = [NSMutableData data];
* NSMutableData *dataPlusCrc = [data mutableCopy];
* unsigned char crc = [MinimedPacket crcForData:data];
* [dataPlusCrc appendBytes:&crc length:1];
* char codes[16] = {21,49,50,35,52,37,38,22,26,25,42,11,44,13,14,28};
* const unsigned char *inBytes = [dataPlusCrc bytes];
* unsigned int acc = 0x0;
* int bitcount = 0;
* for (int i=0; i < dataPlusCrc.length; i++) {
* acc <<= 6;
* acc |= codes[inBytes[i] >> 4];
* bitcount += 6;
*
* acc <<= 6;
* acc |= codes[inBytes[i] & 0x0f];
* bitcount += 6;
*
* while (bitcount >= 8) {
* unsigned char outByte = acc >> (bitcount-8) & 0xff;
* [outData appendBytes:&outByte length:1];
* bitcount -= 8;
* acc &= (0xffff >> (16-bitcount));
* }
* }
* if (bitcount > 0) {
* acc <<= (8-bitcount);
* unsigned char outByte = acc & 0xff;
* [outData appendBytes:&outByte length:1];
* }
* return outData;
* }
*/
public static ArrayList<Byte> fromBytes(byte[] data) {
ArrayList<Byte> rval = new ArrayList<>();
for (int i = 0; i < data.length; i++) {
rval.add(data[i]);
}
return rval;
}
public static byte[] toBytes(ArrayList<Byte> data) {
byte[] rval = new byte[data.size()];
for (int i = 0; i < data.size(); i++) {
rval[i] = data.get(i);
}
return rval;
}
/* O(n) lookup. Run on an O(n) translation of a byte-stream, gives O(n**2) performance. Sigh. */
public static int codeIndex(byte b) {
for (int i = 0; i < codes.length; i++) {
if (b == codes[i]) {
return i;
}
}
return -1;
}
public static byte[] encode4b6b(byte[] data) {
if ((data.length % 2) != 0) {
// LOG.error("Warning: data is odd number of bytes");
}
// use arraylists because byte[] is annoying.
ArrayList<Byte> inData = fromBytes(data);
ArrayList<Byte> outData = new ArrayList<>();
int acc = 0;
int bitcount = 0;
int i;
for (i = 0; i < inData.size(); i++) {
acc <<= 6;
acc |= codes[(inData.get(i) >> 4) & 0x0f];
bitcount += 6;
acc <<= 6;
acc |= codes[inData.get(i) & 0x0f];
bitcount += 6;
while (bitcount >= 8) {
byte outByte = (byte)(acc >> (bitcount - 8) & 0xff);
outData.add(outByte);
bitcount -= 8;
acc &= (0xffff >> (16 - bitcount));
}
}
if (bitcount > 0) {
acc <<= 6;
acc |= 0x14; // marks uneven packet boundary.
bitcount += 6;
if (bitcount >= 8) {
byte outByte = (byte)((acc >> (bitcount - 8)) & 0xff);
outData.add(outByte);
bitcount -= 8;
// acc &= (0xffff >> (16 - bitcount));
}
while (bitcount >= 8) {
outData.add((byte)0);
bitcount -= 8;
}
}
// convert back to byte[]
byte[] rval = toBytes(outData);
return rval;
}
public static byte[] encode4b6b_newtest(byte[] data) {
List<Byte> buffer = new ArrayList<Byte>();
int bitAccumulator = 0x0;
int bitcount = 0;
for (byte element : data) {
bitAccumulator <<= 6;
bitAccumulator |= codes[element >> 4];
bitcount += 6;
bitAccumulator <<= 6;
bitAccumulator |= codes[element & 0x0f];
bitcount += 6;
while (bitcount >= 8) {
buffer.add((byte)((bitAccumulator >> (bitcount - 8)) & 0xff));
bitcount -= 8;
bitAccumulator &= (0xffff >> (16 - bitcount));
}
}
if (bitcount > 0) {
bitAccumulator <<= (8 - bitcount);
buffer.add((byte)((bitAccumulator) & 0xff));
}
return ByteUtil.getByteArrayFromList(buffer);
}
// public func encode4b6b() -> [UInt8] {
// var buffer = [UInt8]()
// var bitAccumulator = 0x0
// var bitcount = 0
// for byte in self {
// bitAccumulator <<= 6
// bitAccumulator |= codes[Int(byte >> 4)]
// bitcount += 6
//
// bitAccumulator <<= 6
// bitAccumulator |= codes[Int(byte & 0x0f)]
// bitcount += 6
//
// while bitcount >= 8 {
// buffer.append(UInt8(bitAccumulator >> (bitcount-8)) & 0xff)
// bitcount -= 8
// bitAccumulator &= (0xffff >> (16-bitcount))
// }
// }
// if bitcount > 0 {
// bitAccumulator <<= (8-bitcount)
// buffer.append(UInt8(bitAccumulator) & 0xff)
// }
// return buffer
// }
public static void test() {
/*
* {0xa7} -> {0xa9, 0x60}
* {0xa7, 0x12} -> {0xa9, 0x6c, 0x72}
* {0xa7, 0x12, 0xa7} -> {0xa9, 0x6c, 0x72, 0xa9, 0x60}
*/
/* test compare */
byte[] s1 = { 0, 1, 2 };
byte[] s2 = { 2, 1, 0, 3 };
byte[] s3 = { 0, 1, 2, 3 };
if (ByteUtil.compare(s1, s1) != 0) {
LOG.error("test: compare failed.");
}
if (ByteUtil.compare(s1, s2) >= 0) {
LOG.error("test: compare failed.");
}
if (ByteUtil.compare(s2, s1) <= 0) {
LOG.error("test: compare failed.");
}
if (ByteUtil.compare(s1, s3) >= 0) {
LOG.error("test: compare failed.");
}
// testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
byte[] bs = encode4b6b(new byte[] { (byte)0xa7 });
byte[] out = new byte[] { (byte)(0xa9), 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
LOG.error("encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
}
bs = encode4b6b(new byte[] { (byte)0xa7, 0x12 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
if (ByteUtil.compare(bs, out) != 0) {
LOG.error("encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
}
bs = encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
LOG.error("encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
}
return;
}
public static byte[] decode4b6b(byte[] raw) throws NumberFormatException {
/*
* if ((raw.length % 2) != 0) {
* LOG.error("Warning: data is odd number of bytes");
* }
*/
byte[] rval = new byte[] {};
int availableBits = 0;
int codingErrors = 0;
int x = 0;
// Log.w(TAG,"decode4b6b: untested code");
// Log.w(TAG,String.format("Decoding %d bytes: %s",raw.length,ByteUtil.shortHexString(raw)));
for (int i = 0; i < raw.length; i++) {
int unsignedValue = raw[i];
if (unsignedValue < 0) {
unsignedValue += 256;
}
x = (x << 8) + unsignedValue;
availableBits += 8;
if (availableBits >= 12) {
// take top six
int highcode = (x >> (availableBits - 6)) & 0x3F;
int highIndex = codeIndex((byte)(highcode));
// take bottom six
int lowcode = (x >> (availableBits - 12)) & 0x3F;
int lowIndex = codeIndex((byte)(lowcode));
// special case at end of transmission on uneven boundaries:
if ((highIndex >= 0) && (lowIndex >= 0)) {
byte decoded = (byte)((highIndex << 4) + lowIndex);
rval = ByteUtil.concat(rval, decoded);
/*
* LOG.debug(String.format(
* "i=%d,x=0x%08X,0x%02X->0x%02X, 0x%02X->0x%02X, result: 0x%02X, %d bits remaining, errors %d, bytes remaining: %s"
* ,
* i,x,highcode,highIndex, lowcode,
* lowIndex,decoded,availableBits,codingErrors,ByteUtil.shortHexString
* (ByteUtil.substring(raw,i+1,raw.length-i-1))));
*/
} else {
// LOG.debug(String.format("i=%d,x=%08X, coding error: highcode=0x%02X, lowcode=0x%02X, %d bits remaining",i,x,highcode,lowcode,availableBits));
codingErrors++;
}
availableBits -= 12;
x = x & (0x0000ffff >> (16 - availableBits));
} else {
// LOG.debug(String.format("i=%d, skip: x=0x%08X, available bits %d",i,x,availableBits));
}
}
if (availableBits != 0) {
if ((availableBits == 4) && (x == 0x05)) {
// normal end
} else {
LOG.error("decode4b6b: failed clean decode -- extra bits available (not marker)(" + availableBits + ")");
codingErrors++;
}
} else {
// also normal end.
}
if (codingErrors > 0) {
LOG.error("decode4b6b: " + codingErrors + " coding errors encountered.");
throw new NumberFormatException();
}
return rval;
}
public static DecodeResponseDto decode4b6bWithoutException(byte[] raw) {
/*
* if ((raw.length % 2) != 0) {
* LOG.error("Warning: data is odd number of bytes");
* }
*/
DecodeResponseDto response = new DecodeResponseDto();
StringBuilder errorMessageBuilder = new StringBuilder();
errorMessageBuilder.append("Input data: " + ByteUtil.getHex(raw) + "\n");
if ((raw.length % 2) != 0) {
errorMessageBuilder.append("Warn: odd number of bytes.");
}
byte[] rval = new byte[] {};
int availableBits = 0;
int codingErrors = 0;
int x = 0;
// Log.w(TAG,"decode4b6b: untested code");
// Log.w(TAG,String.format("Decoding %d bytes: %s",raw.length,ByteUtil.shortHexString(raw)));
for (int i = 0; i < raw.length; i++) {
int unsignedValue = raw[i];
if (unsignedValue < 0) {
unsignedValue += 256;
}
x = (x << 8) + unsignedValue;
availableBits += 8;
if (availableBits >= 12) {
// take top six
int highcode = (x >> (availableBits - 6)) & 0x3F;
int highIndex = codeIndex((byte)(highcode));
// take bottom six
int lowcode = (x >> (availableBits - 12)) & 0x3F;
int lowIndex = codeIndex((byte)(lowcode));
// special case at end of transmission on uneven boundaries:
if ((highIndex >= 0) && (lowIndex >= 0)) {
byte decoded = (byte)((highIndex << 4) + lowIndex);
rval = ByteUtil.concat(rval, decoded);
/*
* LOG.debug(String.format(
* "i=%d,x=0x%08X,0x%02X->0x%02X, 0x%02X->0x%02X, result: 0x%02X, %d bits remaining, errors %d, bytes remaining: %s"
* ,
* i,x,highcode,highIndex, lowcode,
* lowIndex,decoded,availableBits,codingErrors,ByteUtil.shortHexString
* (ByteUtil.substring(raw,i+1,raw.length-i-1))));
*/
} else {
// LOG.debug(String.format("i=%d,x=%08X, coding error: highcode=0x%02X, lowcode=0x%02X, %d bits remaining",i,x,highcode,lowcode,availableBits));
errorMessageBuilder.append(String.format(
"decode4b6b: i=%d,x=%08X, coding error: highcode=0x%02X, lowcode=0x%02X, %d bits remaining.\n",
i, x, highcode, lowcode, availableBits));
codingErrors++;
}
availableBits -= 12;
x = x & (0x0000ffff >> (16 - availableBits));
} else {
// LOG.debug(String.format("i=%d, skip: x=0x%08X, available bits %d",i,x,availableBits));
}
}
if (availableBits != 0) {
if ((availableBits == 4) && (x == 0x05)) {
// normal end
} else {
LOG.error("decode4b6b: failed clean decode -- extra bits available (not marker)(" + availableBits + ")");
errorMessageBuilder.append("decode4b6b: failed clean decode -- extra bits available (not marker)("
+ availableBits + ")\n");
codingErrors++;
}
} else {
// also normal end.
}
if (codingErrors > 0) {
LOG.error("decode4b6b: " + codingErrors + " coding errors encountered.");
errorMessageBuilder.append("decode4b6b: " + codingErrors + " coding errors encountered.");
response.errorData = errorMessageBuilder.toString();
} else {
response.data = rval;
}
return response;
}
public static String toHexString(byte[] array) {
return toHexString(array, 0, array.length);
}
public static String toHexString(byte[] array, int offset, int length) {
char[] buf = new char[length * 2];
int bufIndex = 0;
for (int i = offset; i < offset + length; i++) {
byte b = array[i];
buf[bufIndex++] = HEX_DIGITS[(b >>> 4) & 0x0F];
buf[bufIndex++] = HEX_DIGITS[b & 0x0F];
}
return new String(buf);
}
public static class DecodeResponseDto {
public byte[] data;
public String errorData;
}
}

View file

@ -316,7 +316,6 @@ public class RileyLinkBLE {
debugService(serviceI, indentCount + 4);
}
}
// }
}

View file

@ -6,7 +6,7 @@ import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.ble.defs.Riley
* Created by andy on 11/23/18.
*/
public class RileyLinkCommunicationException extends Throwable {
public class RileyLinkCommunicationException extends Exception {
String extendedErrorText;
private RileyLinkBLEError errorCode;

View file

@ -38,13 +38,17 @@ public class RadioPacket {
return pkt;
}
case FourByteSixByte: {
case FourByteSixByteLocal: {
byte[] withCRC = getWithCRC();
byte[] encoded = RileyLinkUtil.getEncoding4b6b().encode4b6b(withCRC);
return ByteUtil.concat(encoded, (byte)0);
}
case FourByteSixByteRileyLink: {
return pkt;
}
default:
throw new NotImplementedException(("Encoding not supported: " + RileyLinkUtil.getEncoding().toString()));
}

View file

@ -94,11 +94,15 @@ public class RadioResponse {
}
switch (RileyLinkUtil.getEncoding()) {
case Manchester:
case FourByteSixByteRileyLink: {
decodedOK = true;
decodedPayload = encodedPayload;
}
break;
case FourByteSixByte:
case FourByteSixByteLocal: {
byte[] decodeThis = RileyLinkUtil.getEncoding4b6b().decode4b6b(encodedPayload);
decodedOK = true;
@ -109,7 +113,9 @@ public class RadioResponse {
LOG.error(String.format("RadioResponse: CRC mismatch, calculated 0x%02x, received 0x%02x",
calculatedCRC, receivedCRC));
}
}
break;
default:
throw new NotImplementedException("this {" + RileyLinkUtil.getEncoding().toString()
+ "} encoding is not supported");

View file

@ -1,9 +1,11 @@
package info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.ble.defs;
public enum RileyLinkEncodingType {
None(0x00), //
Manchester(0x01), //
FourByteSixByte(0x02), //
None(0x00), // No encoding on RL
Manchester(0x01), // Manchester encoding on RL (for Omnipod)
FourByteSixByteRileyLink(0x02), // 4b6b encoding on RL (for Medtronic)
FourByteSixByteLocal(0x00), // No encoding on RL, but 4b6b encoding in code
;
public byte value;

View file

@ -4,6 +4,9 @@ package info.nightscout.androidaps.plugins.PumpCommon.utils;
* Created by andy on 10/25/18.
*/
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.joda.time.LocalDateTime;
/**
@ -53,6 +56,20 @@ public class DateTimeUtil {
}
public static long toATechDate(GregorianCalendar gc) {
long atechDateTime = 0L;
atechDateTime += gc.get(Calendar.YEAR) * 10000000000L;
atechDateTime += (gc.get(Calendar.MONTH) + 1) * 100000000L;
atechDateTime += gc.get(Calendar.DAY_OF_MONTH) * 1000000L;
atechDateTime += gc.get(Calendar.HOUR_OF_DAY) * 10000L;
atechDateTime += gc.get(Calendar.MINUTE) * 100L;
atechDateTime += gc.get(Calendar.SECOND);
return atechDateTime;
}
public static boolean isSameDay(LocalDateTime ldt1, LocalDateTime ldt2) {
return (ldt1.getYear() == ldt2.getYear() && //
@ -62,6 +79,15 @@ public class DateTimeUtil {
}
public static boolean isSameDay(long ldt1, long ldt2) {
long day1 = ldt1 / 10000L;
long day2 = ldt2 / 10000L;
return day1 == day2;
}
public static long toATechDate(int year, int month, int dayOfMonth, int hour, int minutes, int seconds) {
long atechDateTime = 0L;
@ -104,4 +130,10 @@ public class DateTimeUtil {
return (number < 10) ? "0" + number : "" + number;
}
public static int getYear(long atechDateTime) {
int year = (int)(atechDateTime / 10000000000L);
return year;
}
}

View file

@ -40,6 +40,7 @@ import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.defs.RileyLink
import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.dialog.RileyLinkStatusActivity;
import info.nightscout.androidaps.plugins.PumpMedtronic.defs.MedtronicCommandType;
import info.nightscout.androidaps.plugins.PumpMedtronic.defs.PumpDeviceState;
import info.nightscout.androidaps.plugins.PumpMedtronic.dialog.MedtronicHistoryActivity;
import info.nightscout.androidaps.plugins.PumpMedtronic.driver.MedtronicPumpStatus;
import info.nightscout.androidaps.plugins.PumpMedtronic.events.EventMedtronicDeviceStatusChange;
import info.nightscout.androidaps.plugins.PumpMedtronic.events.EventMedtronicPumpConfigurationChanged;
@ -146,13 +147,15 @@ public class MedtronicFragment extends SubscriberFragment {
@OnClick(R.id.medtronic_history)
void onHistoryClick() {
// startActivity(new Intent(getContext(), DanaRHistoryActivity.class));
startActivity(new Intent(getContext(), MedtronicHistoryActivity.class));
}
@OnClick(R.id.medtronic_refresh)
void onRefreshClick() {
refreshButton.setEnabled(false);
if (refreshButtonStatic != null)
refreshButtonStatic.setEnabled(false);
MedtronicPumpPlugin.getPlugin().resetStatusState();
ConfigBuilderPlugin.getPlugin().getCommandQueue().readStatus("Clicked refresh", new Callback() {
@ -163,7 +166,8 @@ public class MedtronicFragment extends SubscriberFragment {
if (activity != null) {
activity.runOnUiThread(() -> {
refreshButton.setEnabled(true);
if (refreshButtonStatic != null)
refreshButtonStatic.setEnabled(true);
});
}
}
@ -219,7 +223,7 @@ public class MedtronicFragment extends SubscriberFragment {
pumpStatus.rileyLinkServiceState = (RileyLinkServiceState)checkStatusSet(pumpStatus.rileyLinkServiceState,
RileyLinkUtil.getServiceState());
if (pumpStatus.rileyLinkServiceState != null) {
if (pumpStatus.rileyLinkServiceState != null && rileyLinkStatus != null) {
int resourceId = pumpStatus.rileyLinkServiceState.getResourceId(getTargetDevice());
rileyLinkStatus.setTextColor(Color.WHITE);
@ -271,7 +275,7 @@ public class MedtronicFragment extends SubscriberFragment {
case ErrorWhenCommunicating:
case TimeoutWhenCommunicating:
case InvalidConfiguration:
pumpStatusIconView.setText(" " + getTranslation(pumpStatus.pumpDeviceState.getResourceId()));
pumpStatusIconView.setText(" " + getTranslation(pumpStatus.pumpDeviceState.getResourceId()));
break;
// FIXME
@ -281,24 +285,25 @@ public class MedtronicFragment extends SubscriberFragment {
LOG.debug("Command: " + cmd);
if (cmd == null)
pumpStatusIconView.setText(" " + MainApp.gs(pumpStatus.pumpDeviceState.getResourceId()));
pumpStatusIconView.setText(" " + MainApp.gs(pumpStatus.pumpDeviceState.getResourceId()));
else {
Integer resourceId = cmd.getResourceId();
if (cmd == MedtronicCommandType.GetHistoryData) {
if (resourceId == null) {
pumpStatusIconView.setText(String.format(" Get History - Page %d (%d/16)",
MedtronicUtil.pageNumber, MedtronicUtil.frameNumber));
if (MedtronicUtil.frameNumber == null) {
pumpStatusIconView.setText(MainApp.gs(R.string.medtronic_cmd_desc_get_history_request,
MedtronicUtil.pageNumber));
} else {
pumpStatusIconView.setText(MainApp.gs(resourceId, MedtronicUtil.pageNumber,
MedtronicUtil.frameNumber));
}
} else {
if (resourceId == null) {
pumpStatusIconView.setText(" " + cmd.name());
pumpStatusIconView.setText(" " + cmd.name());
} else {
pumpStatusIconView.setText(" " + getTranslation(resourceId));
pumpStatusIconView.setText(" " + getTranslation(resourceId));
}
}
@ -338,7 +343,7 @@ public class MedtronicFragment extends SubscriberFragment {
public Object checkStatusSet(Object object1, Object object2) {
if (object1 == null) {
return object1;
return object2;
} else {
if (!object1.equals(object2)) {
return object2;

View file

@ -14,6 +14,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.SystemClock;
@ -39,6 +40,7 @@ import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.Actions.defs.CustomAction;
import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
import info.nightscout.androidaps.plugins.PumpCommon.PumpPluginAbstract;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpDriverState;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
@ -161,6 +163,11 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
}
public MedtronicHistoryData getMedtronicHistoryData() {
return this.medtronicHistoryData;
}
@Override
public void initPumpStatusData() {
@ -460,7 +467,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
scheduleNextRefresh(MedtronicStatusRefreshType.BatteryStatus, 20);
// configuration (once and then if history shows config changes)
// medtronicUIComm.executeCommand(MedtronicCommandType.getSettings(MedtronicUtil.getMedtronicPumpModel()));
medtronicUIComm.executeCommand(MedtronicCommandType.getSettings(MedtronicUtil.getMedtronicPumpModel()));
// time (1h)
medtronicUIComm.executeCommand(MedtronicCommandType.RealTimeClock);
@ -506,8 +513,13 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
return true;
}
if (!basalProfileChanged && getMDTPumpStatus().basalsByHour != null) {
return (!isBasalProfileInvalid);
LOG.info("isThisProfileSet: check");
if (!basalProfileChanged && getMDTPumpStatus().basalsByHour != null && !isBasalProfileInvalid) {
if (isLoggingEnabled())
LOG.debug("isThisProfileSet: profile has not changed and is not invalid.");
return isProfileSame(profile);
}
setRefreshButtonEnabled(false);
@ -521,57 +533,78 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable);
if (isLoggingEnabled())
LOG.debug("isThisProfileSet: profile possible changed, reading from Pump.");
MedtronicUITask responseTask = medtronicUIComm.executeCommand(MedtronicCommandType.GetBasalProfileSTD);
boolean invalid = false;
boolean valid = false;
boolean noData = false;
if (responseTask.haveData()) {
Double[] basalsByHour = getMDTPumpStatus().basalsByHour;
valid = isProfileSame(profile);
LOG.debug("Basals by hour: " + (basalsByHour == null ? "null" : StringUtils.join(basalsByHour, " ")));
int index = 0;
if (basalsByHour == null)
return true; // we don't want to set profile again, unless we are sure
for (Profile.BasalValue basalValue : profile.getBasalValues()) {
int hour = basalValue.timeAsSeconds / (60 * 60);
if (MedtronicUtil.isSame(basalsByHour[index], basalValue.value)) {
if (index != hour) {
invalid = true;
break;
}
} else {
invalid = true;
break;
}
index++;
}
if (!invalid) {
if (isLoggingEnabled())
LOG.debug("Basal profile is same as AAPS one.");
if (valid) {
basalProfileChanged = false;
} else {
if (isLoggingEnabled())
LOG.debug("Basal profile on Pump is different than the AAPS one.");
}
} else {
invalid = true;
noData = true;
if (isLoggingEnabled())
LOG.debug("Basal profile NO DATA");
}
isBasalProfileInvalid = invalid;
isBasalProfileInvalid = !valid;
setRefreshButtonEnabled(true);
// we don't want to force set profile if we couldn't read the profile (noData)
return (noData || valid);
}
private boolean isProfileSame(Profile profile) {
boolean invalid = false;
Double[] basalsByHour = getMDTPumpStatus().basalsByHour;
if (isLoggingEnabled())
LOG.debug("Current Basals (h): " + (basalsByHour == null ? "null" : StringUtils.join(basalsByHour, " ")));
int index = 0;
if (basalsByHour == null)
return true; // we don't want to set profile again, unless we are sure
StringBuilder stringBuilder = new StringBuilder("Requested Basals (h): ");
for (Profile.BasalValue basalValue : profile.getBasalValues()) {
int hour = basalValue.timeAsSeconds / (60 * 60);
if (!MedtronicUtil.isSame(basalsByHour[hour], basalValue.value)) {
invalid = true;
}
stringBuilder.append(basalValue.value);
stringBuilder.append(" ");
}
if (isLoggingEnabled())
LOG.debug(stringBuilder.toString());
if (!invalid) {
if (isLoggingEnabled())
LOG.debug("Basal profile is same as AAPS one.");
// basalProfileChanged = false;
} else {
if (isLoggingEnabled())
LOG.debug("Basal profile on Pump is different than the AAPS one.");
}
return (!invalid);
}
@ -610,25 +643,53 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
MainApp.bus().post(new EventMedtronicPumpValuesChanged());
}
private BolusDeliveryType bolusDeliveryType = BolusDeliveryType.Idle;
private enum BolusDeliveryType {
Idle, //
DeliveryPrepared, //
Delivering, //
CancelDelivery
}
@NonNull
protected PumpEnactResult deliverBolus(final DetailedBolusInfo detailedBolusInfo) {
LOG.info("MedtronicPumpPlugin::deliverBolus - {}", BolusDeliveryType.DeliveryPrepared);
setRefreshButtonEnabled(false);
bolusDeliveryType = BolusDeliveryType.DeliveryPrepared;
if (isPumpNotReachable()) {
setRefreshButtonEnabled(true);
return new PumpEnactResult() //
.success(false) //
.enacted(false) //
.comment(MainApp.gs(R.string.medtronic_pump_status_pump_unreachable));
LOG.debug("MedtronicPumpPlugin::deliverBolus - Pump Unreachable.");
return setNotReachable(true, false);
}
MedtronicUtil.dismissNotification(MedtronicNotificationType.PumpUnreachable);
if (bolusDeliveryType == BolusDeliveryType.CancelDelivery) {
LOG.debug("MedtronicPumpPlugin::deliverBolus - Delivery Canceled.");
return setNotReachable(true, true);
}
LOG.debug("MedtronicPumpPlugin::deliverBolus - Starting wait period.");
SystemClock.sleep(10000);
if (bolusDeliveryType == BolusDeliveryType.CancelDelivery) {
LOG.debug("MedtronicPumpPlugin::deliverBolus - Delivery Canceled, before wait period.");
return setNotReachable(true, true);
}
LOG.debug("MedtronicPumpPlugin::deliverBolus - End wait period. Start delivery");
try {
LOG.error("MedtronicPumpPlugin::deliverBolus Not fully implemented - Just base command.");
bolusDeliveryType = BolusDeliveryType.Delivering;
// LOG.error("MedtronicPumpPlugin::deliverBolus Not fully implemented - Just base command.");
MedtronicUITask responseTask = medtronicUIComm.executeCommand(MedtronicCommandType.SetBolus,
detailedBolusInfo.insulin);
@ -637,28 +698,65 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
// TODO display bolus
// setRefreshButtonEnabled(true);
setRefreshButtonEnabled(true);
bolusDeliveryType = BolusDeliveryType.Idle;
if (response) {
if (bolusDeliveryType == BolusDeliveryType.CancelDelivery) {
LOG.debug("MedtronicPumpPlugin::deliverBolus - Delivery Canceled after Bolus started.");
new Thread(() -> {
// Looper.prepare();
LOG.debug("MedtronicPumpPlugin::deliverBolus - Show dialog - before");
SystemClock.sleep(2000);
LOG.debug("MedtronicPumpPlugin::deliverBolus - Show dialog. Context: "
+ MainApp.instance().getApplicationContext());
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
// i.putExtra("soundid", R.raw.boluserror);
i.putExtra("status", MainApp.gs(R.string.medtronic_cmd_cancel_bolus_not_supported));
i.putExtra("title", MainApp.gs(R.string.combo_warning));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MainApp.instance().startActivity(i);
// OKDialog.show(MainApp.instance().getApplicationContext(), //
// MainApp.gs(R.string.combo_warning), //
// MainApp.gs(R.string.medtronic_cmd_cancel_bolus_not_supported), null);
}).start();
}
// FIXME this needs to be fixed to read info from history
boolean treatmentCreated = TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, true);
getMDTPumpStatus().reservoirRemainingUnits -= detailedBolusInfo.insulin; // we subtract insulin, exact
// amount will be visible with
// next remainingInsulin
// update.
// we subtract insulin, exact amount will be visible with next remainingInsulin update.
getMDTPumpStatus().reservoirRemainingUnits -= detailedBolusInfo.insulin;
incrementStatistics(detailedBolusInfo.isSMB ? MedtronicConst.Statistics.SMBBoluses
: MedtronicConst.Statistics.StandardBoluses);
return new PumpEnactResult().success(response) //
.enacted(response) //
.bolusDelivered(detailedBolusInfo.insulin) //
.carbsDelivered(detailedBolusInfo.carbs);
if (bolusDeliveryType == BolusDeliveryType.CancelDelivery) {
return new PumpEnactResult() //
.success(false) //
.enacted(response) //
.bolusDelivered(detailedBolusInfo.insulin) //
.carbsDelivered(detailedBolusInfo.carbs) //
.comment(MainApp.gs(R.string.medtronic_cmd_cancel_bolus_not_supported));
} else {
return new PumpEnactResult().success(response) //
.enacted(response) //
.bolusDelivered(detailedBolusInfo.insulin) //
.carbsDelivered(detailedBolusInfo.carbs);
}
} else {
return new PumpEnactResult().success(false).enacted(false) //
return new PumpEnactResult() //
.success(bolusDeliveryType == BolusDeliveryType.CancelDelivery) //
.enacted(false) //
.comment(MainApp.gs(R.string.medtronic_cmd_bolus_could_not_be_delivered));
}
// pump.activity = MainApp.gs(R.string.combo_pump_action_bolusing, detailedBolusInfo.insulin);
@ -780,6 +878,35 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
}
private PumpEnactResult setNotReachable(boolean isBolus, boolean success) {
setRefreshButtonEnabled(true);
if (isBolus) {
bolusDeliveryType = BolusDeliveryType.Idle;
}
if (success) {
return new PumpEnactResult() //
.success(true) //
.enacted(false);
} else {
return new PumpEnactResult() //
.success(false) //
.enacted(false) //
.comment(MainApp.gs(R.string.medtronic_pump_status_pump_unreachable));
}
}
public void stopBolusDelivering() {
this.bolusDeliveryType = BolusDeliveryType.CancelDelivery;
// if (isLoggingEnabled())
LOG.warn("MedtronicPumpPlugin::deliverBolus - Stop Bolus Delivery.");
}
private void incrementStatistics(String statsKey) {
long currentCount = SP.getLong(statsKey, 0L);
currentCount++;
@ -1027,13 +1154,15 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
+ targetDate);
targetDate = timeMinus36h;
} else {
LocalDateTime lastHistoryRecordTime = DateTimeUtil.toLocalDateTime(lastPumpHistoryEntryTime);
// LocalDateTime lastHistoryRecordTime = DateTimeUtil.toLocalDateTime(lastPumpHistoryEntryTime);
if (isLoggingEnabled())
LOG.debug(getLogPrefix() + "readPumpHistoryLogic(): lastPumpHistoryEntryTime: {} - targetDate: {}",
lastHistoryRecordTime, targetDate);
lastPumpHistoryEntryTime, targetDate);
medtronicHistoryData.setLastHistoryRecordTime(DateTimeUtil.toLocalDateTime(lastPumpHistoryEntryTime));
medtronicHistoryData.setLastHistoryRecordTime(lastPumpHistoryEntryTime);
LocalDateTime lastHistoryRecordTime = DateTimeUtil.toLocalDateTime(lastPumpHistoryEntryTime);
lastHistoryRecordTime = lastHistoryRecordTime.minusHours(12); // we get last 12 hours of history to
// determine pump state
@ -1070,8 +1199,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
return;
this.lastPumpHistoryEntry = latestEntry;
SP.putLong(MedtronicConst.Statistics.LastPumpHistoryEntry,
DateTimeUtil.toATechDate(latestEntry.getLocalDateTime()));
SP.putLong(MedtronicConst.Statistics.LastPumpHistoryEntry, latestEntry.atechDateTime);
this.medtronicHistoryData.addNewHistory(historyResult);
this.medtronicHistoryData.filterNewEntries();
@ -1260,6 +1388,14 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
if (isLoggingEnabled())
LOG.info(getLogPrefix() + "setNewBasalProfile");
// this shouldn't be needed, but let's do check if profile setting we are setting is same as current one
if (isProfileSame(profile)) {
return new PumpEnactResult() //
.success(true) //
.enacted(false) //
.comment(MainApp.gs(R.string.medtronic_cmd_basal_profile_not_set_is_same));
}
setRefreshButtonEnabled(false);
if (isPumpNotReachable()) {
@ -1294,6 +1430,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
LOG.info(getLogPrefix() + "Basal Profile was set: " + response);
if (response) {
medtronicHistoryData.setBasalProfileChanged();
return new PumpEnactResult().success(response).enacted(response);
} else {
return new PumpEnactResult().success(response).enacted(response) //
@ -1348,36 +1485,8 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
return basalProfile;
}
// OPERATIONS not supported by Pump or Plugin
// @Override
// public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
// LOG.error("MedtronicPumpPlugin::setExtendedBolus NOT SUPPORTED.");
// return OPERATION_NOT_SUPPORTED;
// }
//
//
// @Override
// public PumpEnactResult cancelExtendedBolus() {
// LOG.warn("cancelExtendedBolus - operation not supported.");
// return getOperationNotSupportedWithCustomText(R.string.medtronic_cmd_cancel_bolus_not_supported);
// }
// @Override
// public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile,
// boolean enforceNew) {
// LOG.error("setTempBasalPercent NOT IMPLEMENTED.");
// // we will never come here unless somebody has played with configuration in PumpType
// return OPERATION_NOT_SUPPORTED;
// }
// // we don't loadTDD. TDD is read from Pump History
// @Override
// public PumpEnactResult loadTDDs() {
// return OPERATION_NOT_SUPPORTED;
// }
// public void connect(String reason) {
// // we don't use this.
// // we connect to RileyLink on startup and keep connection opened, then connection to pump
@ -1399,11 +1508,6 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
// LOG.debug("MedtronicPumpPlugin::stopConnecting");
// }
@Override
public void stopBolusDelivering() {
// Medtronic doesn't have Bolus cancel, so we fake it.
}
List<CustomAction> customActions = null;

View file

@ -22,6 +22,7 @@ import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.ble.defs.RLMes
import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.service.tasks.ServiceTaskExecutor;
import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.service.tasks.WakeAndTuneTask;
import info.nightscout.androidaps.plugins.PumpCommon.utils.ByteUtil;
import info.nightscout.androidaps.plugins.PumpCommon.utils.DateTimeUtil;
import info.nightscout.androidaps.plugins.PumpCommon.utils.HexDump;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.RawHistoryPage;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.MedtronicPumpHistoryDecoder;
@ -411,7 +412,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
public PumpHistoryResult getPumpHistory(PumpHistoryEntry lastEntry, LocalDateTime targetDate) {
PumpHistoryResult pumpTotalResult = new PumpHistoryResult(lastEntry, targetDate);
PumpHistoryResult pumpTotalResult = new PumpHistoryResult(lastEntry, DateTimeUtil.toATechDate(targetDate));
if (doWakeUpBeforeCommand)
wakeUp(receiverDeviceAwakeForMinutes, false);
@ -435,6 +436,8 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
PumpMessage firstResponse = null;
boolean failed = false;
MedtronicUtil.setCurrentCommand(MedtronicCommandType.GetHistoryData, pageNumber, null);
for (int retries = 0; retries < MAX_COMMAND_TRIES; retries++) {
try {
@ -474,8 +477,8 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
}
// handle successful frame data
rawHistoryPage.appendData(currentResponse.getFrameData());
// RileyLinkMedtronicService.getInstance().announceProgress(
// ((100 / 16) * currentResponse.getFrameNumber() + 1));
// RileyLinkMedtronicService.getInstance().announceProgress(((100 / 16) *
// currentResponse.getFrameNumber() + 1));
MedtronicUtil.setCurrentCommand(MedtronicCommandType.GetHistoryData, pageNumber,
currentResponse.getFrameNumber());
@ -707,18 +710,18 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
}
protected PumpMessage makePumpMessage(MedtronicCommandType messageType, byte[] body) {
private PumpMessage makePumpMessage(MedtronicCommandType messageType, byte[] body) {
return makePumpMessage(messageType, body == null ? new CarelinkShortMessageBody()
: new CarelinkShortMessageBody(body));
}
protected PumpMessage makePumpMessage(MedtronicCommandType messageType) {
private PumpMessage makePumpMessage(MedtronicCommandType messageType) {
return makePumpMessage(messageType, (byte[])null);
}
protected PumpMessage makePumpMessage(MedtronicCommandType messageType, MessageBody messageBody) {
private PumpMessage makePumpMessage(MedtronicCommandType messageType, MessageBody messageBody) {
PumpMessage msg = new PumpMessage();
msg.init(PacketType.Carelink, rileyLinkServiceData.pumpIDBytes, messageType, messageBody);
return msg;
@ -731,17 +734,6 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
}
// private PumpMessage sendAndGetResponse(MedtronicCommandType commandType, int timeoutMs) {
//
// return sendAndGetResponse(commandType, null, timeoutMs);
// }
//
//
// private PumpMessage sendAndGetResponse(MedtronicCommandType commandType, byte[] bodyData) {
//
// return sendAndGetResponse(commandType, bodyData, DEFAULT_TIMEOUT);
// }
/**
* Main wrapper method for sending data - (for getting responses)
*
@ -775,13 +767,13 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
}
protected PumpMessage sendAndListen(RLMessage msg) throws RileyLinkCommunicationException {
private PumpMessage sendAndListen(RLMessage msg) throws RileyLinkCommunicationException {
return sendAndListen(msg, 4000); // 2000
}
// All pump communications go through this function.
protected PumpMessage sendAndListen(RLMessage msg, int timeout_ms) throws RileyLinkCommunicationException {
private PumpMessage sendAndListen(RLMessage msg, int timeout_ms) throws RileyLinkCommunicationException {
return sendAndListen(msg, timeout_ms, PumpMessage.class);
}
@ -794,6 +786,8 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
private Object sendAndGetResponseWithCheck(MedtronicCommandType commandType, byte[] bodyData) {
LOG.debug("getDataFromPump: {}", commandType);
for (int retries = 0; retries < MAX_COMMAND_TRIES; retries++) {
try {
@ -885,10 +879,14 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
if (doWakeUpBeforeCommand)
wakeUp(receiverDeviceAwakeForMinutes, false);
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Active);
MedtronicCommandType commandType = MedtronicCommandType.GetBasalProfileSTD;
LOG.debug("getDataFromPump: {}", commandType);
MedtronicUtil.setCurrentCommand(commandType);
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Active);
for (int retries = 0; retries <= MAX_COMMAND_TRIES; retries++) {
try {
@ -903,11 +901,11 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
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()));
LOG.debug("1st Response: " + HexDump.toHexStringDisplayable(response.getRawContent()));
LOG.debug("1st Response: " + HexDump.toHexStringDisplayable(response.getMessageBody().getTxData()));
String check = checkResponseContent(response, commandType.commandDescription,
commandType.expectedLength);
commandType.getRecordLength());
byte[] data = null;
@ -925,20 +923,20 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
PumpMessage response2 = sendAndListen(ackMsg, DEFAULT_TIMEOUT + (DEFAULT_TIMEOUT * retries));
// LOG.debug("{} Response: {}", runs,
// HexDump.toHexStringDisplayable(response2.getRawContent()));
// LOG.debug("{} Response: {}", runs,
// HexDump.toHexStringDisplayable(response2.getMessageBody().getTxData()));
LOG.debug("{} Response: {}", runs, HexDump.toHexStringDisplayable(response2.getRawContent()));
LOG.debug("{} Response: {}", runs,
HexDump.toHexStringDisplayable(response2.getMessageBody().getTxData()));
String check2 = checkResponseContent(response2, commandType.commandDescription,
commandType.expectedLength);
commandType.getRecordLength());
if (check2 == null) {
data = ByteUtil.concat(data, ByteUtil.substring(response2.getMessageBody().getTxData(), 1));
} else {
this.errorMessage = check;
this.errorMessage = check2;
LOG.debug("Error message: " + check2);
}
}
@ -950,6 +948,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
LOG.debug("Converted response for {} is {}.", commandType.name(), basalProfile);
MedtronicUtil.setCurrentCommand(null);
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
return basalProfile;
@ -960,6 +959,7 @@ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager
}
LOG.warn("Error reading profile in max retries.");
MedtronicUtil.setCurrentCommand(null);
MedtronicUtil.setPumpDeviceState(PumpDeviceState.Sleeping);
return null;

View file

@ -4,7 +4,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
@ -47,7 +46,7 @@ public abstract class MedtronicHistoryEntry implements MedtronicHistoryEntryInte
protected byte[] datetime;
protected byte[] body;
protected LocalDateTime dateTime;
// protected LocalDateTime dateTime;
@Expose
public String DT;
@ -93,6 +92,11 @@ public abstract class MedtronicHistoryEntry implements MedtronicHistoryEntryInte
}
public String getDateTimeString() {
return this.DT;
}
public String getDecodedData() {
if (decodedData == null)
if (isNoDataEntry())
@ -139,9 +143,7 @@ public abstract class MedtronicHistoryEntry implements MedtronicHistoryEntryInte
StringBuilder sb = new StringBuilder();
sb.append(getToStringStart());
sb.append(", DT: "
+ StringUtil.getStringInLength((this.dateTime == null) ? "x" : StringUtil.toDateTimeString(this.dateTime),
19));
sb.append(", DT: " + StringUtil.getStringInLength(this.DT, 19));
sb.append(", length=");
sb.append(getHeadLength());
sb.append(",");
@ -237,16 +239,15 @@ public abstract class MedtronicHistoryEntry implements MedtronicHistoryEntryInte
}
public LocalDateTime getLocalDateTime() {
return this.dateTime;
}
public void setLocalDateTime(LocalDateTime atdate) {
this.dateTime = atdate;
// this.DT = atdate.toString(dateTimeFormatter);
}
// public LocalDateTime getLocalDateTime() {
// return this.dateTime;
// }
//
//
// public void setLocalDateTime(LocalDateTime atdate) {
// this.dateTime = atdate;
// // this.DT = atdate.toString(dateTimeFormatter);
// }
public void setAtechDateTime(long dt) {
this.atechDateTime = dt;

View file

@ -4,11 +4,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.plugins.PumpCommon.utils.ByteUtil;
import info.nightscout.androidaps.plugins.PumpCommon.utils.DateTimeUtil;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.MedtronicHistoryDecoder;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.MedtronicHistoryEntry;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.RecordDecodeStatus;
@ -63,7 +63,7 @@ public class MedtronicCGMSHistoryDecoder extends MedtronicHistoryDecoder {
// CGMSHistoryEntry entry = (CGMSHistoryEntry) entryIn;
if (entry.getDateTimeLength() > 0) {
LocalDateTime dt = parseDate(entry);
Long dt = parseDate(entry);
System.out.println("DT: " + dt);
}
@ -292,7 +292,7 @@ public class MedtronicCGMSHistoryDecoder extends MedtronicHistoryDecoder {
}
private LocalDateTime parseDate(CGMSHistoryEntry entry) {
private Long parseDate(CGMSHistoryEntry entry) {
if (entry.getEntryType().hasDate())
return null;
@ -323,17 +323,18 @@ public class MedtronicCGMSHistoryDecoder extends MedtronicHistoryDecoder {
// date is reversed
if (entry.getEntryType().getDateType() == CGMSHistoryEntryType.DateType.MinuteSpecific) {
LocalDateTime date = new LocalDateTime(parseDay(data[2]), parseMonths(data[0], data[1]),
parseYear(data[3]), parseHours(data[0]), parseMinutes(data[1]), 0);
// LocalDateTime date = new LocalDateTime(parseDay(data[2]), parseMonths(data[0], data[1]),
// parseHours(data[0]), parseMinutes(data[1]), 0);
// ATechDate date = new ATechDate(parseDay(data[0]),
// parseMonths(data[2], data[1]), parseYear(data[2]),
// parseHours(data[2]), parseMinutes(data[1]), 0,
// ATechDateType.DateAndTimeSec);
entry.setLocalDateTime(date);
entry.atechDateTime = DateTimeUtil.toATechDate(parseYear(data[3]), parseMonths(data[0], data[1]),
parseDay(data[2]), parseHours(data[0]), parseMinutes(data[1]), 0);
return date;
return entry.atechDateTime;
} else if (entry.getEntryType().getDateType() == CGMSHistoryEntryType.DateType.SecondSpecific) {
LOG.warn("parseDate for SecondSpecific type is not implemented.");

View file

@ -12,7 +12,6 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.plugins.PumpCommon.utils.ByteUtil;
import info.nightscout.androidaps.plugins.PumpCommon.utils.DateTimeUtil;
import info.nightscout.androidaps.plugins.PumpCommon.utils.HexDump;
import info.nightscout.androidaps.plugins.PumpCommon.utils.StringUtil;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.MedtronicHistoryDecoder;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.MedtronicHistoryEntry;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.RecordDecodeStatus;
@ -247,7 +246,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
case DailyTotals515:
return decodeDailyTotals(entry); // Not supported at the moment
case SelectBasalProfile:
case ChangeBasalPattern:
return RecordDecodeStatus.OK; // Not supported at the moment
// WORK IN PROGRESS
@ -294,7 +293,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
case ChangeBGReminderOffset:
case ChangeAlarmClockTime:
case ChangeMeterId:
case ChangeParadigmLinkID:
case ChangeParadigmID:
case JournalEntryMealMarker:
case JournalEntryExerciseMarker:
case DeleteBolusReminderTime:
@ -304,11 +303,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
case JournalEntryOtherMarker:
case ChangeBolusWizardSetup:
case ChangeSensorSetup2:
case RestoreMystery51:
case RestoreMystery52:
case ChangeSensorAlarmSilenceConfig:
case RestoreMystery54:
case RestoreMystery55:
case ChangeSensorRateOfChangeAlertSetup:
case ChangeBolusScrollStepSize:
case BolusWizardChange:
@ -321,9 +316,22 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
case ChangeCarbUnits:
case ChangeWatchdogEnable:
case ChangeOtherDeviceID:
case ReadOtherDevicesIDs:
case BolusWizard512:
case BGReceived512:
case SensorStatus:
case ReadCaptureEventEnabled:
case ChangeCaptureEventEnable:
case ReadOtherDevicesStatus:
return RecordDecodeStatus.OK;
// case ChangeWatchdogMarriageProfile:
// case DeleteOtherDeviceID:
// case ChangeCaptureEventEnable:
case Sensor54:
case Sensor55:
case Sensor51:
case Sensor52:
case EventUnknown_MM522_0x45:
case EventUnknown_MM522_0x46:
case EventUnknown_MM522_0x47:
@ -334,11 +342,10 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
case EventUnknown_MM522_0x4c:
case EventUnknown_MM512_0x10:
case EventUnknown_MM512_0x2e:
case EventUnknown_MM512_0x2f:
case EventUnknown_MM512_0x37:
case EventUnknown_MM512_0x38:
case EventUnknown_MM512_0x39:
case EventUnknown_MM512_0x3b:
case EventUnknown_MM512_0x4e:
case EventUnknown_MM522_0x70:
case EventUnknown_MM512_0x88:
@ -346,7 +353,8 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
case EventUnknown_MM522_0xE8:
case EventUnknown_0x4d:
case EventUnknown_MM522_0x25:
// LOG.debug(" -- ignored Pump Entry: " + entry.getEntryType().name());
case EventUnknown_MM522_0x05:
LOG.debug(" -- ignored Pump Entry: " + entry);
return RecordDecodeStatus.Ignored;
// **** Implemented records ****
@ -375,7 +383,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
decodeEndResultTotals(entry);
return RecordDecodeStatus.OK;
case BatteryActivity:
case BatteryChange:
decodeBatteryActivity(entry);
return RecordDecodeStatus.OK;
@ -411,9 +419,6 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
decodePrime(entry);
return RecordDecodeStatus.OK;
case EventUnknown_MM522_0x05:
return RecordDecodeStatus.Ignored;
case TempBasalCombined:
return RecordDecodeStatus.Ignored;
@ -482,6 +487,8 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
//
// }
System.out.println("" + totals.toString());
return RecordDecodeStatus.WIP;
}
@ -608,7 +615,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
dto.correctionEstimate = (body[7] + (body[5] & 0x0F)) / 10.0f;
}
dto.localDateTime = entry.getLocalDateTime();
dto.atechDateTime = entry.atechDateTime;
entry.addDecodedData("Object", dto);
// entry.setHistoryEntryDetails(dto);
@ -676,9 +683,9 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
bolus.setBolusType((bolus.getDuration() != null && (bolus.getDuration() > 0)) ? PumpBolusType.Extended
: PumpBolusType.Normal);
bolus.setLocalDateTime(entry.getLocalDateTime());
bolus.setAtechDateTime(entry.atechDateTime);
String dateTime = StringUtil.toDateTimeString(entry.getLocalDateTime());
String dateTime = entry.DT;
if (bolus.getBolusType() == PumpBolusType.Extended) {
// we check if we have coresponding normal entry
@ -770,7 +777,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
LocalDateTime atdate = new LocalDateTime(year, month, dayOfMonth, hour, minutes, seconds);
entry.setLocalDateTime(atdate); // TODO remove
// entry.setLocalDateTime(atdate); // TODO remove
entry.setAtechDateTime(DateTimeUtil.toATechDate(year, month, dayOfMonth, hour, minutes, seconds));
} else if (entry.getDateTimeLength() == 2) {
@ -811,7 +818,7 @@ public class MedtronicPumpHistoryDecoder extends MedtronicHistoryDecoder {
atdate = new LocalDateTime(year, month, dayOfMonth, 0, 0);
}
entry.setLocalDateTime(atdate);
// entry.setLocalDateTime(atdate);
entry.setAtechDateTime(DateTimeUtil.toATechDate(year, month, dayOfMonth, hour, minutes, seconds));
} else {

View file

@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump;
import java.util.Objects;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -41,6 +40,7 @@ public class PumpHistoryEntry extends MedtronicHistoryEntry {
private PumpHistoryEntryType entryType;
private Integer opCode; // this is set only when we have unknown entry...
private int offset;
private String displayableValue = "";
public PumpHistoryEntryType getEntryType() {
@ -112,7 +112,7 @@ public class PumpHistoryEntry extends MedtronicHistoryEntry {
PumpHistoryEntry that = (PumpHistoryEntry)o;
return entryType == that.entryType && //
Objects.equals(this.dateTime, that.dateTime); // && //
this.atechDateTime == that.atechDateTime; // && //
// Objects.equals(this.decodedData, that.decodedData);
}
@ -123,13 +123,12 @@ public class PumpHistoryEntry extends MedtronicHistoryEntry {
}
public boolean isAfter(LocalDateTime dateTimeIn) {
// LOG.debug("Entry: " + this.dateTime);
// LOG.debug("Datetime: " + dateTimeIn);
// LOG.debug("Item after: " + this.dateTime.isAfter(dateTimeIn));
return this.dateTime.isAfter(dateTimeIn);
}
// public boolean isAfter(LocalDateTime dateTimeIn) {
// // LOG.debug("Entry: " + this.dateTime);
// // LOG.debug("Datetime: " + dateTimeIn);
// // LOG.debug("Item after: " + this.dateTime.isAfter(dateTimeIn));
// return this.dateTime.isAfter(dateTimeIn);
// }
public boolean isAfter(long atechDateTime) {
return atechDateTime > this.atechDateTime;
@ -142,4 +141,9 @@ public class PumpHistoryEntry extends MedtronicHistoryEntry {
return (int)(o2.atechDateTime - o1.atechDateTime);
}
}
public String getDisplayableValue() {
return displayableValue;
}
}

View file

@ -0,0 +1,59 @@
package info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump;
import java.util.ArrayList;
import java.util.List;
import info.nightscout.androidaps.R;
/**
* Created by andy on 12/23/18.
*/
public enum PumpHistoryEntryGroup {
All(R.string.medtronic_history_group_all), //
Bolus(R.string.danar_history_bolus), //
Basal(R.string.medtronic_history_group_basal), //
Prime(R.string.danar_history_prime), //
Configuration(R.string.medtronic_history_group_configuration), //
Alarm(R.string.danar_history_alarm), //
Glucose(R.string.danar_history_glucose), //
Notification(R.string.medtronic_history_group_notification), //
Statistic(R.string.medtronic_history_group_statistic),
Unknown(R.string.medtronic_history_group_unknown), //
;
private int resourceId;
private String translated;
private static List<PumpHistoryEntryGroup> list;
static {
list = new ArrayList<>();
for (PumpHistoryEntryGroup pumpHistoryEntryGroup : values()) {
list.add(pumpHistoryEntryGroup);
}
}
PumpHistoryEntryGroup(int resourceId) {
this.resourceId = resourceId;
// this.translated = MainApp.gs(resourceId);
}
public static List<PumpHistoryEntryGroup> getList() {
return list;
}
public int getResourceId() {
return resourceId;
}
public String toString() {
return this.translated;
}
}

View file

@ -35,124 +35,130 @@ import info.nightscout.androidaps.plugins.PumpMedtronic.util.MedtronicUtil;
public enum PumpHistoryEntryType // implements CodeEnum
{
None(0, "None", 1, 0, 0), // Bolus(0x01, "Bolus", 4, 5, 4), // 4,5,0 -> 4,5,4 Bolus(0x01, "Bolus", 2, 5, 4),
None(0, "None", PumpHistoryEntryGroup.Unknown, 1, 0, 0), // Bolus(0x01, "Bolus", 4, 5, 4), // 4,5,0 -> 4,5,4
// Bolus(0x01, "Bolus", 2, 5, 4),
Bolus(0x01, "Bolus", 4, DateFormat.LongDate, 0), // 523+[H=8]
Bolus(0x01, "Bolus", PumpHistoryEntryGroup.Bolus, 4, 5, 0), // 523+[H=8]
Prime(0x03, "Prime", 5, 5, 0), //
Prime(0x03, "Prime", PumpHistoryEntryGroup.Prime, 5, 5, 0), //
EventUnknown_MM522_0x05((byte)0x05, 2, 5, 28), //
NoDeliveryAlarm(0x06, "NoDelivery", 4, 5, 0), //
EndResultTotals(0x07, "ResultTotals", 5, 2, 0), // V1: 5/5/41 V2: 5,2,3 V3, 5,2,0 V5: 7/10(523)
ChangeBasalProfile_OldProfile(0x08, 2, 5, 145), // // V1: 2,5,42 V2:2,5,145; V4: V5
ChangeBasalProfile_NewProfile(0x09, 2, 5, 145), //
EventUnknown_MM512_0x10(0x10), // 29, 5, 0
CalBGForPH(0x0a, "CalBGForPH"), //
SensorAlert(0x0b, "SensorAlert", 3, 5, 0), // Ian08
ClearAlarm(0x0c, "ClearAlarm", 2, 5, 0), // 2,5,4
/**/EventUnknown_MM522_0x05((byte)0x05, PumpHistoryEntryGroup.Unknown, 2, 5, 28), //
NoDeliveryAlarm(0x06, "NoDelivery", PumpHistoryEntryGroup.Alarm, 4, 5, 0), //
EndResultTotals(0x07, "ResultTotals", PumpHistoryEntryGroup.Statistic, 5, 2, 0), // V1: 5/5/41 V2: 5,2,3 V3, 5,2,0
// V5: 7/10(523)
ChangeBasalProfile_OldProfile(0x08, PumpHistoryEntryGroup.Basal, 2, 5, 145), // // V1: 2,5,42 V2:2,5,145; V4: V5
ChangeBasalProfile_NewProfile(0x09, PumpHistoryEntryGroup.Basal, 2, 5, 145), //
/**/EventUnknown_MM512_0x10(0x10, PumpHistoryEntryGroup.Unknown), // 29, 5, 0
CalBGForPH(0x0a, "BG Capture", PumpHistoryEntryGroup.Glucose), //
SensorAlert(0x0b, "SensorAlert", PumpHistoryEntryGroup.Alarm, 3, 5, 0), // Ian08
ClearAlarm(0x0c, "ClearAlarm", PumpHistoryEntryGroup.Alarm, 2, 5, 0), // 2,5,4
// Andy0d(0x0d, "Unknown", 2, 5, 0),
SelectBasalProfile(0x14, "SelectBasalProfile"), //
TempBasalDuration(0x16, "TempBasalDuration"), //
ChangeTime(0x17, "ChangeTime"), //
NewTimeSet(0x18, "NewTimeSet"), //
LowBattery(0x19, "LowBattery"), //
BatteryActivity(0x1a, "Battery Activity"), //
SetAutoOff(0x1b, "SetAutoOff"), //
PumpSuspend(0x1e, "Pump Suspend"), //
PumpResume(0x1f, "Pump Resume"), //
SelfTest(0x20, "SelfTest"), //
Rewind(0x21, "Rewind"), //
ClearSettings(0x22, "ClearSettings"), // 8?
ChangeChildBlockEnable(0x23, "ChangeChildBlockEnable"), // 8?
ChangeMaxBolus(0x24), // 8?
EventUnknown_MM522_0x25(0x25), // 8?
ToggleRemote(0x26, "EnableDisableRemote", 2, 5, 14), // 2, 5, 14 V6:2,5,14
ChangeRemoteId(0x27, "ChangeRemoteID"), // ??
ChangeBasalPattern(0x14, "Change Basal Pattern", PumpHistoryEntryGroup.Basal), //
TempBasalDuration(0x16, "TempBasalDuration", PumpHistoryEntryGroup.Basal), //
ChangeTime(0x17, "ChangeTime", PumpHistoryEntryGroup.Configuration), //
NewTimeSet(0x18, "NewTimeSet", PumpHistoryEntryGroup.Notification), //
LowBattery(0x19, "LowBattery", PumpHistoryEntryGroup.Notification), //
BatteryChange(0x1a, "Battery Change", PumpHistoryEntryGroup.Notification), //
SetAutoOff(0x1b, "SetAutoOff", PumpHistoryEntryGroup.Configuration), //
PumpSuspend(0x1e, "Pump Suspend", PumpHistoryEntryGroup.Basal), //
PumpResume(0x1f, "Pump Resume", PumpHistoryEntryGroup.Basal), //
ChangeMaxBasal(0x2c), //
BolusWizardEnabled(0x2d), // V3 ?
EventUnknown_MM512_0x2e(0x2e), //
EventUnknown_MM512_0x2f(0x2f), //
ChangeBGReminderOffset(0x31), //
ChangeAlarmClockTime(0x32), //
TempBasalRate(0x33, "Temp Basal Rate", 2, 5, 1), //
LowReservoir(0x34), //
SelfTest(0x20, "SelfTest", PumpHistoryEntryGroup.Statistic), //
Rewind(0x21, "Rewind", PumpHistoryEntryGroup.Prime), //
ClearSettings(0x22, "ClearSettings", PumpHistoryEntryGroup.Configuration), // 8?
ChangeChildBlockEnable(0x23, "ChangeChildBlockEnable", PumpHistoryEntryGroup.Configuration), // 8?
ChangeMaxBolus(0x24, PumpHistoryEntryGroup.Configuration), // 8?
/**/EventUnknown_MM522_0x25(0x25, PumpHistoryEntryGroup.Unknown), // 8?
ToggleRemote(0x26, "EnableDisableRemote", PumpHistoryEntryGroup.Configuration, 2, 5, 14), // 2, 5, 14 V6:2,5,14
ChangeRemoteId(0x27, "ChangeRemoteID", PumpHistoryEntryGroup.Configuration), // ??
ChangeMeterId(0x36), //
EventUnknown_MM512_0x37(0x37), // V:MM512
EventUnknown_MM512_0x38(0x38), //
EventUnknown_MM512_0x39(0x39), //
EventUnknown_MM512_0x3b(0x3b), //
ChangeParadigmLinkID(0x3c, 2, 5, 14), // V3 ? V6: 2,5,14
ChangeMaxBasal(0x2c, PumpHistoryEntryGroup.Configuration), //
BolusWizardEnabled(0x2d, PumpHistoryEntryGroup.Configuration), // V3 ?
/**/EventUnknown_MM512_0x2e(0x2e, PumpHistoryEntryGroup.Unknown), //
/**/BolusWizard512(0x2f, PumpHistoryEntryGroup.Configuration), //
UnabsorbedInsulin512(0x30, PumpHistoryEntryGroup.Statistic), //
ChangeBGReminderOffset(0x31, PumpHistoryEntryGroup.Configuration), //
ChangeAlarmClockTime(0x32, PumpHistoryEntryGroup.Configuration), //
TempBasalRate(0x33, "Temp Basal Rate", PumpHistoryEntryGroup.Basal, 2, 5, 1), //
LowReservoir(0x34, PumpHistoryEntryGroup.Notification), //
ChangeAlarmClock(0x35, "Change Alarm Clock", PumpHistoryEntryGroup.Configuration), //
ChangeMeterId(0x36, PumpHistoryEntryGroup.Configuration), //
/**/EventUnknown_MM512_0x37(0x37, PumpHistoryEntryGroup.Unknown), // V:MM512
/**/EventUnknown_MM512_0x38(0x38, PumpHistoryEntryGroup.Unknown), //
BGReceived512(0x39, PumpHistoryEntryGroup.Glucose), //
SensorStatus(0x3b, PumpHistoryEntryGroup.Glucose), //
ChangeParadigmID(0x3c, PumpHistoryEntryGroup.Configuration, 2, 5, 14), // V3 ? V6: 2,5,14
BGReceived(0x3f, "BG Received", 2, 5, 3), // Ian3F
JournalEntryMealMarker(0x40, 2, 5, 2), //
JournalEntryExerciseMarker(0x41, 2, 5, 1), // ?? JournalEntryExerciseMarkerPumpEvent
JournalEntryInsulinMarker(0x42, 2, 5, 1), // ?? InsulinMarkerEvent
JournalEntryOtherMarker(0x43), //
EventUnknown_MM522_0x45(0x45, 2, 5, 1), //
EventUnknown_MM522_0x46(0x46, 2, 5, 1), //
EventUnknown_MM522_0x47(0x47, 2, 5, 1), //
EventUnknown_MM522_0x48(0x48, 2, 5, 1), //
EventUnknown_MM522_0x49(0x49, 2, 5, 1), //
EventUnknown_MM522_0x4a(0x4a, 2, 5, 1), //
EventUnknown_MM522_0x4b(0x4b, 2, 5, 1), //
EventUnknown_MM522_0x4c(0x4c, 2, 5, 1), //
EventUnknown_0x4d(0x4d), // V5: 512: 7, 522: 8 ????NS
EventUnknown_MM512_0x4e(0x4e), //
ChangeBolusWizardSetup(0x4f, 2, 5, 32), //
ChangeSensorSetup2(0x50, 2, 5, 30), // Ian50
RestoreMystery51(0x51), //
RestoreMystery52(0x52), //
ChangeSensorAlarmSilenceConfig(0x53, 2, 5, 1), // 8
RestoreMystery54(0x54), // Ian54
RestoreMystery55(0x55), //
ChangeSensorRateOfChangeAlertSetup(0x56, 2, 5, 5), // 12
ChangeBolusScrollStepSize(0x57), //
BGReceived(0x3f, "BG Received", PumpHistoryEntryGroup.Glucose, 2, 5, 3), // Ian3F
JournalEntryMealMarker(0x40, PumpHistoryEntryGroup.Bolus, 2, 5, 2), //
JournalEntryExerciseMarker(0x41, PumpHistoryEntryGroup.Bolus, 2, 5, 1), // ?? JournalEntryExerciseMarkerPumpEvent
JournalEntryInsulinMarker(0x42, PumpHistoryEntryGroup.Bolus, 2, 5, 1), // ?? InsulinMarkerEvent
JournalEntryOtherMarker(0x43, PumpHistoryEntryGroup.Bolus), //
EnableSensorAutoCal(0x44, PumpHistoryEntryGroup.Glucose), //
/**/EventUnknown_MM522_0x45(0x45, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
/**/EventUnknown_MM522_0x46(0x46, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
/**/EventUnknown_MM522_0x47(0x47, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
/**/EventUnknown_MM522_0x48(0x48, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
/**/EventUnknown_MM522_0x49(0x49, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
/**/EventUnknown_MM522_0x4a(0x4a, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
/**/EventUnknown_MM522_0x4b(0x4b, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
/**/EventUnknown_MM522_0x4c(0x4c, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
/**/EventUnknown_0x4d(0x4d, PumpHistoryEntryGroup.Unknown), // V5: 512: 7, 522: 8 ????NS
/**/EventUnknown_MM512_0x4e(0x4e, PumpHistoryEntryGroup.Unknown), // /**/
ChangeBolusWizardSetup(0x4f, PumpHistoryEntryGroup.Configuration, 2, 5, 32), //
ChangeSensorSetup2(0x50, PumpHistoryEntryGroup.Configuration, 2, 5, 30), // Ian50
/**/Sensor51(0x51, PumpHistoryEntryGroup.Unknown), //
/**/Sensor52(0x52, PumpHistoryEntryGroup.Unknown), //
ChangeSensorAlarmSilenceConfig(0x53, PumpHistoryEntryGroup.Configuration, 2, 5, 1), // 8 -
// ChangeSensorAlarmSilenceConfig
/**/Sensor54(0x54, PumpHistoryEntryGroup.Unknown), // Ian54
/**/Sensor55(0x55, PumpHistoryEntryGroup.Unknown), //
ChangeSensorRateOfChangeAlertSetup(0x56, PumpHistoryEntryGroup.Configuration, 2, 5, 5), // 12
// ChangeSensorRateOfChangeAlertSetup
ChangeBolusScrollStepSize(0x57, PumpHistoryEntryGroup.Configuration), //
// V4
// Andy58(0x58, "Unknown", 13, 5, 0), // TO DO is this one really there ???
BolusWizardChange(0x5a, "BolusWizard", 2, 5, 117), // V2: 522+[B=143]
BolusWizardBolusEstimate(0x5b, "BolusWizardBolusEstimate", 2, 5, 13), // 15 // V2: 523+[B=15]
UnabsorbedInsulin(0x5c, "UnabsorbedInsulinBolus", 5, 0, 0), // head[1] -> body length
SaveSettings(0x5d), //
ChangeVariableBolus(0x5e), //
ChangeAudioBolus(0x5f, "EasyBolusEnabled"), // V3 ?
ChangeBGReminderEnable(0x60), // questionable60
ChangeAlarmClockEnable(0x61), //
ChangeTempBasalType((byte)0x62), // ChangeTempBasalTypePumpEvent
ChangeAlarmNotifyMode(0x63), //
ChangeTimeFormat(0x64), //
ChangeReservoirWarningTime((byte)0x65), //
ChangeBolusReminderEnable(0x66, 2, 5, 2), // 9
ChangeBolusReminderTime((byte)0x67, 2, 5, 2), // 9
DeleteBolusReminderTime((byte)0x68, 2, 5, 2), // 9
BolusReminder(0x69, 2, 5, 0), // Ian69
DeleteAlarmClockTime(0x6a, "Delete Alarm Clock Time", 2, 5, 7), // 14
BolusWizardChange(0x5a, "BolusWizard", PumpHistoryEntryGroup.Configuration, 2, 5, 117), // V2: 522+[B=143]
BolusWizardBolusEstimate(0x5b, "BolusWizardBolusEstimate", PumpHistoryEntryGroup.Configuration, 2, 5, 13), // 15 //
UnabsorbedInsulin(0x5c, "UnabsorbedInsulinBolus", PumpHistoryEntryGroup.Statistic, 5, 0, 0), // head[1] -> body
// length
SaveSettings(0x5d, PumpHistoryEntryGroup.Configuration), //
ChangeVariableBolus(0x5e, PumpHistoryEntryGroup.Configuration), //
ChangeAudioBolus(0x5f, "EasyBolusEnabled", PumpHistoryEntryGroup.Configuration), // V3 ?
ChangeBGReminderEnable(0x60, PumpHistoryEntryGroup.Configuration), // questionable60
ChangeAlarmClockEnable(0x61, PumpHistoryEntryGroup.Configuration), //
ChangeTempBasalType((byte)0x62, PumpHistoryEntryGroup.Configuration), // ChangeTempBasalTypePumpEvent
ChangeAlarmNotifyMode(0x63, PumpHistoryEntryGroup.Configuration), //
ChangeTimeFormat(0x64, PumpHistoryEntryGroup.Configuration), //
ChangeReservoirWarningTime((byte)0x65, PumpHistoryEntryGroup.Configuration), //
ChangeBolusReminderEnable(0x66, PumpHistoryEntryGroup.Configuration, 2, 5, 2), // 9
ChangeBolusReminderTime((byte)0x67, PumpHistoryEntryGroup.Configuration, 2, 5, 2), // 9
DeleteBolusReminderTime((byte)0x68, PumpHistoryEntryGroup.Configuration, 2, 5, 2), // 9
BolusReminder(0x69, PumpHistoryEntryGroup.Configuration, 2, 5, 0), // Ian69
DeleteAlarmClockTime(0x6a, "Delete Alarm Clock Time", PumpHistoryEntryGroup.Configuration, 2, 5, 7), // 14
DailyTotals515(0x6c, "Daily Totals 515", 0, 0, 36), //
DailyTotals522(0x6d, "Daily Totals 522", 1, 2, 41), // // hack1(0x6d, "hack1", 46, 5, 0), // 1,2,41
DailyTotals523(0x6e, "Daily Totals 523", 1, 2, 49), // 1102014-03-17T00:00:00
ChangeCarbUnits((byte)0x6f), //
DailyTotals515(0x6c, "Daily Totals 515", PumpHistoryEntryGroup.Statistic, 0, 0, 36), //
DailyTotals522(0x6d, "Daily Totals 522", PumpHistoryEntryGroup.Statistic, 1, 2, 41), // // hack1(0x6d, "hack1", 46,
// 5, 0), // 1,2,41
DailyTotals523(0x6e, "Daily Totals 523", PumpHistoryEntryGroup.Statistic, 1, 2, 49), // 1102014-03-17T00:00:00
ChangeCarbUnits((byte)0x6f, PumpHistoryEntryGroup.Configuration), //
/**/EventUnknown_MM522_0x70((byte)0x70, PumpHistoryEntryGroup.Unknown, 2, 5, 1), //
EventUnknown_MM522_0x70((byte)0x70, 2, 5, 1), //
BasalProfileStart(0x7b, PumpHistoryEntryGroup.Basal, 2, 5, 3), // // 722
ChangeWatchdogEnable((byte)0x7c, PumpHistoryEntryGroup.Configuration), //
ChangeOtherDeviceID((byte)0x7d, PumpHistoryEntryGroup.Configuration, 2, 5, 30), //
BasalProfileStart(0x7b, 2, 5, 3), // // 722
ChangeWatchdogEnable((byte)0x7c), //
ChangeOtherDeviceID((byte)0x7d, 2, 5, 30), //
ChangeWatchdogMarriageProfile(0x81, PumpHistoryEntryGroup.Configuration, 2, 5, 5), // 12
DeleteOtherDeviceID(0x82, PumpHistoryEntryGroup.Configuration, 2, 5, 5), //
ChangeCaptureEventEnable(0x83, PumpHistoryEntryGroup.Configuration), //
// ChangeWatchdogMarriageProfile(0x81, 2, 5, 5), // 12
// DeleteOtherDeviceID(0x82, 2, 5, 5), //
// ChangeCaptureEventEnable(0x83), //
/**/EventUnknown_MM512_0x88(0x88, PumpHistoryEntryGroup.Unknown), //
EventUnknown_MM512_0x88(0x88), //
EventUnknown_MM512_0x94(0x94), //
/**/EventUnknown_MM512_0x94(0x94, PumpHistoryEntryGroup.Unknown), //
// IanA8(0xA8, "xx", 10, 5, 0), //
// Andy90(0x90, "Unknown", 7, 5, 0),
@ -163,21 +169,15 @@ public enum PumpHistoryEntryType // implements CodeEnum
// head[1],
// body[49] op[0x6e]
EventUnknown_MM522_0xE8(0xe8, 2, 5, 25), //
/**/EventUnknown_MM522_0xE8(0xe8, PumpHistoryEntryGroup.Unknown, 2, 5, 25), //
ReadOtherDevicesIDs(0xF0, ""), // ?
readCaptureEventEnabled(0xF1), // ?
changeCaptureEventEnable(0xF2), // ?
readOtherDevicesStatus(0xF3), // ?
ReadOtherDevicesIDs(0xf0, "", PumpHistoryEntryGroup.Configuration), // ?
ReadCaptureEventEnabled(0xf1, PumpHistoryEntryGroup.Configuration), // ?
ChangeCaptureEventEnable2(0xf2, PumpHistoryEntryGroup.Configuration), // ?
ReadOtherDevicesStatus(0xf3, PumpHistoryEntryGroup.Configuration), // ?
TempBasalCombined(0xFE, "TempBasalCombined"), //
UnknownBasePacket(0xFF, "Unknown Base Packet");
// private PumpHistoryEntryType(String description, List<Integer> opCode,
// byte length)
// {
//
// }
TempBasalCombined(0xfe, "TempBasalCombined", PumpHistoryEntryGroup.Basal), //
UnknownBasePacket(0xff, "Unknown Base Packet", PumpHistoryEntryGroup.Unknown);
private static Map<Integer, PumpHistoryEntryType> opCodeMap = new HashMap<Integer, PumpHistoryEntryType>();
@ -201,35 +201,62 @@ public enum PumpHistoryEntryType // implements CodeEnum
private List<SpecialRule> specialRulesHead;
private List<SpecialRule> specialRulesBody;
private boolean hasSpecialRules = false;
private PumpHistoryEntryGroup group = PumpHistoryEntryGroup.Unknown;
PumpHistoryEntryType(int opCode, String name) {
this(opCode, name, 2, 5, 0);
// @Deprecated
// PumpHistoryEntryType(int opCode, String name) {
// this(opCode, name, 2, 5, 0);
// }
PumpHistoryEntryType(int opCode, String name, PumpHistoryEntryGroup group) {
this(opCode, name, group, 2, 5, 0);
}
PumpHistoryEntryType(int opCode) {
this(opCode, null, 2, 5, 0);
// @Deprecated
// PumpHistoryEntryType(int opCode) {
// this(opCode, null, null, 2, 5, 0);
// }
PumpHistoryEntryType(int opCode, PumpHistoryEntryGroup group) {
this(opCode, null, group, 2, 5, 0);
}
PumpHistoryEntryType(int opCode, int head, int date, int body) {
this(opCode, null, head, date, body);
// @Deprecated
// PumpHistoryEntryType(int opCode, int head, int date, int body) {
// this(opCode, null, null, head, date, body);
// }
PumpHistoryEntryType(int opCode, PumpHistoryEntryGroup group, int head, int date, int body) {
this(opCode, null, group, head, date, body);
}
PumpHistoryEntryType(int opCode, String name, int head, DateFormat dateFormat, int body) {
this(opCode, name, head, dateFormat.getLength(), body);
}
// @Deprecated
// PumpHistoryEntryType(int opCode, String name, int head, DateFormat dateFormat, int body) {
// this(opCode, name, head, dateFormat.getLength(), body);
// }
// @Deprecated
// PumpHistoryEntryType(int opCode, String name, int head, int date, int body) {
// this.opCode = (byte)opCode;
// this.description = name;
// this.headLength = head;
// this.dateLength = date;
// this.bodyLength = body;
// this.totalLength = (head + date + body);
// }
PumpHistoryEntryType(int opCode, String name, int head, int date, int body) {
PumpHistoryEntryType(int opCode, String name, PumpHistoryEntryGroup group, int head, int date, int body) {
this.opCode = (byte)opCode;
this.description = name;
this.headLength = head;
this.dateLength = date;
this.bodyLength = body;
this.totalLength = (head + date + body);
this.group = group;
}
@ -284,7 +311,7 @@ public enum PumpHistoryEntryType // implements CodeEnum
entryType == PumpHistoryEntryType.ChangeTime || // Time Change
entryType == PumpHistoryEntryType.NewTimeSet || //
entryType == PumpHistoryEntryType.SelectBasalProfile || // Settings
entryType == PumpHistoryEntryType.ChangeBasalPattern || // Configuration
entryType == PumpHistoryEntryType.ClearSettings || //
entryType == PumpHistoryEntryType.SaveSettings || //
entryType == PumpHistoryEntryType.ChangeMaxBolus || //
@ -410,6 +437,12 @@ public enum PumpHistoryEntryType // implements CodeEnum
return size;
}
public PumpHistoryEntryGroup getGroup() {
return group;
}
enum DateFormat {
None(0), //
LongDate(5), //

View file

@ -4,10 +4,10 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.plugins.PumpCommon.utils.DateTimeUtil;
import info.nightscout.androidaps.plugins.PumpMedtronic.MedtronicPumpPlugin;
/**
@ -23,7 +23,7 @@ public class PumpHistoryResult {
private boolean searchFinished = false;
private PumpHistoryEntry searchEntry = null;
private LocalDateTime searchDate = null;
private Long searchDate = null;
private SearchType searchType = SearchType.None;
private List<PumpHistoryEntry> unprocessedEntries;
public List<PumpHistoryEntry> validEntries;
@ -31,11 +31,11 @@ public class PumpHistoryResult {
// private Object validValues;
public PumpHistoryResult(PumpHistoryEntry searchEntry, LocalDateTime targetDate) {
public PumpHistoryResult(PumpHistoryEntry searchEntry, Long targetDate) {
if (searchEntry != null) {
this.searchEntry = searchEntry;
this.searchType = SearchType.LastEntry;
LOG.debug("PumpHistoryResult. Search parameters: Last Entry: " + searchEntry.getLocalDateTime() + " type="
LOG.debug("PumpHistoryResult. Search parameters: Last Entry: " + searchEntry.atechDateTime + " type="
+ searchEntry.getEntryType().name());
} else if (targetDate != null) {
this.searchDate = targetDate;
@ -70,7 +70,7 @@ public class PumpHistoryResult {
Collections.sort(this.unprocessedEntries, new PumpHistoryEntry.Comparator());
LOG.debug("PumpHistoryResult. Search entry date: " + searchEntry.getLocalDateTime());
LOG.debug("PumpHistoryResult. Search entry date: " + searchEntry.atechDateTime);
for (PumpHistoryEntry unprocessedEntry : unprocessedEntries) {
@ -91,7 +91,7 @@ public class PumpHistoryResult {
if (unprocessedEntry.isAfter(this.searchDate)) {
this.validEntries.add(unprocessedEntry);
} else {
if (unprocessedEntry.getLocalDateTime().getYear() != 2000)
if (DateTimeUtil.getYear(unprocessedEntry.atechDateTime) != 2000)
olderEntries++;
}
}

View file

@ -2,11 +2,11 @@ package info.nightscout.androidaps.plugins.PumpMedtronic.data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -32,11 +32,14 @@ public class MedtronicHistoryData {
private List<PumpHistoryEntry> allHistory = null;
private List<PumpHistoryEntry> newHistory = null;
private LocalDateTime lastHistoryRecordTime;
// private LocalDateTime previousLastHistoryRecordTime;
private Long lastHistoryRecordTime;
private boolean isInit = false;
private static final int OLD_HISTORY_SIZE = 50;
private int basalProfileChangedInternally = 0;
public MedtronicHistoryData() {
this.allHistory = new ArrayList<>();
@ -67,32 +70,38 @@ public class MedtronicHistoryData {
}
public List<PumpHistoryEntry> getAllHistory() {
return this.allHistory;
}
public void filterNewEntries() {
List<PumpHistoryEntry> newHistory2 = new ArrayList<>();
List<PumpHistoryEntry> TBRs = new ArrayList<>();
LocalDateTime localDateTime = new LocalDateTime();
// LocalDateTime localDateTime = new LocalDateTime();
long atechDate = DateTimeUtil.toATechDate(new GregorianCalendar());
for (PumpHistoryEntry pumpHistoryEntry : newHistory) {
PumpHistoryEntryType type = pumpHistoryEntry.getEntryType();
if (PumpHistoryEntryType.isAAPSRelevantEntry(type)) {
// if (PumpHistoryEntryType.isAAPSRelevantEntry(type)) {
if (type == PumpHistoryEntryType.TempBasalRate || type == PumpHistoryEntryType.TempBasalDuration) {
TBRs.add(pumpHistoryEntry);
} else {
if (type == PumpHistoryEntryType.TempBasalRate || type == PumpHistoryEntryType.TempBasalDuration) {
TBRs.add(pumpHistoryEntry);
} else {
if (type == PumpHistoryEntryType.EndResultTotals) {
if (!DateTimeUtil.isSameDay(localDateTime, pumpHistoryEntry.getLocalDateTime())) {
newHistory2.add(pumpHistoryEntry);
}
} else {
if (type == PumpHistoryEntryType.EndResultTotals) {
if (!DateTimeUtil.isSameDay(atechDate, pumpHistoryEntry.atechDateTime)) {
newHistory2.add(pumpHistoryEntry);
}
} else {
newHistory2.add(pumpHistoryEntry);
}
}
// }
}
TBRs = processTBRs(TBRs);
@ -114,17 +123,26 @@ public class MedtronicHistoryData {
List<PumpHistoryEntry> filteredListByLastRecord = getFilteredListByLastRecord((PumpHistoryEntryType)null);
LOG.debug("New records: " + filteredListByLastRecord.size());
if (filteredListByLastRecord.size() == 0)
return;
List<PumpHistoryEntry> outList = new ArrayList<>();
if (allHistory.size() > OLD_HISTORY_SIZE) {
for (int i = 0; i < OLD_HISTORY_SIZE; i++) {
outList.add(allHistory.get(i));
}
}
// if (allHistory.size() > OLD_HISTORY_SIZE) {
// for (int i = 0; i < OLD_HISTORY_SIZE; i++) {
// outList.add(allHistory.get(i));
// }
// } else {
//
// }
// FIXME keep 24h only
LOG.debug("All History records (before): " + allHistory.size());
outList.addAll(this.allHistory);
outList.addAll(filteredListByLastRecord);
this.allHistory.clear();
@ -133,13 +151,15 @@ public class MedtronicHistoryData {
this.sort(this.allHistory);
LOG.debug("All History records (after): " + allHistory.size());
}
public boolean hasRelevantConfigurationChanged() {
return getStateFromFilteredList( //
PumpHistoryEntryType.SelectBasalProfile, //
PumpHistoryEntryType.ChangeBasalPattern, //
PumpHistoryEntryType.ClearSettings, //
PumpHistoryEntryType.SaveSettings, //
PumpHistoryEntryType.ChangeMaxBolus, //
@ -159,6 +179,8 @@ public class MedtronicHistoryData {
newAndAll.addAll(this.allHistory);
newAndAll.addAll(this.newHistory);
this.sort(newAndAll);
if (wasPumpSuspended == null) { // suspension status not known
List<PumpHistoryEntry> items = getFilteredItems(PumpHistoryEntryType.Bolus, //
@ -268,7 +290,7 @@ public class MedtronicHistoryData {
* entryType == PumpHistoryEntryType.ChangeTime || // Time Change
* entryType == PumpHistoryEntryType.NewTimeSet || //
*
* entryType == PumpHistoryEntryType.SelectBasalProfile || // Settings
* entryType == PumpHistoryEntryType.SelectBasalProfile || // Configuration
* entryType == PumpHistoryEntryType.ClearSettings || //
* entryType == PumpHistoryEntryType.SaveSettings || //
* entryType == PumpHistoryEntryType.ChangeMaxBolus || //
@ -285,7 +307,17 @@ public class MedtronicHistoryData {
public boolean hasBasalProfileChanged() {
return getStateFromFilteredList(PumpHistoryEntryType.ChangeBasalProfile_NewProfile);
List<PumpHistoryEntry> filteredItems = getFilteredItems(PumpHistoryEntryType.ChangeBasalProfile_NewProfile);
LOG.debug("Items: " + filteredItems);
boolean profileChanged = ((filteredItems.size() - basalProfileChangedInternally) > 0);
LOG.error("Profile changed:" + profileChanged);
this.basalProfileChangedInternally = 0;
return profileChanged;
}
@ -298,8 +330,9 @@ public class MedtronicHistoryData {
}
public void setLastHistoryRecordTime(LocalDateTime lastHistoryRecordTime) {
public void setLastHistoryRecordTime(Long lastHistoryRecordTime) {
// this.previousLastHistoryRecordTime = this.lastHistoryRecordTime;
this.lastHistoryRecordTime = lastHistoryRecordTime;
}
@ -343,11 +376,20 @@ public class MedtronicHistoryData {
}
// private List<PumpHistoryEntry> getFilteredListByPreviousLastRecord(PumpHistoryEntryType... entryTypes) {
// return getFilteredListByTime(this.previousLastHistoryRecordTime, entryTypes);
// }
private List<PumpHistoryEntry> getFilteredListByLastRecord(PumpHistoryEntryType... entryTypes) {
if (this.lastHistoryRecordTime == null) {
return getFilteredListByTime(this.lastHistoryRecordTime, entryTypes);
}
private List<PumpHistoryEntry> getFilteredListByTime(Long lastRecordTime, PumpHistoryEntryType... entryTypes) {
if (lastRecordTime == null) {
return getFilteredItems(entryTypes);
} else {
return getFilteredItems(this.lastHistoryRecordTime, entryTypes);
return getFilteredItems(lastRecordTime, entryTypes);
}
}
@ -358,12 +400,14 @@ public class MedtronicHistoryData {
} else {
List<PumpHistoryEntry> filteredItems = getFilteredItems(entryTypes);
LOG.debug("Items: " + filteredItems);
return filteredItems.size() > 0;
}
}
private List<PumpHistoryEntry> getFilteredItems(LocalDateTime dateTime, PumpHistoryEntryType... entryTypes) {
private List<PumpHistoryEntry> getFilteredItems(Long dateTime, PumpHistoryEntryType... entryTypes) {
PumpHistoryResult phr = new PumpHistoryResult(null, dateTime);
return getFilteredItems(phr.getValidEntries(), entryTypes);
@ -379,7 +423,7 @@ public class MedtronicHistoryData {
if (inList != null && inList.size() > 0) {
for (PumpHistoryEntry pumpHistoryEntry : inList) {
if (entryTypes != null) {
if (!isEmpty(entryTypes)) {
for (PumpHistoryEntryType pumpHistoryEntryType : entryTypes) {
if (pumpHistoryEntry.getEntryType() == pumpHistoryEntryType) {
@ -400,7 +444,17 @@ public class MedtronicHistoryData {
}
private boolean isEmpty(PumpHistoryEntryType... entryTypes) {
return (entryTypes == null || (entryTypes.length == 1 && entryTypes[0] == null));
}
public List<PumpHistoryEntry> getNewHistoryEntries() {
return this.newHistory;
}
public void setBasalProfileChanged() {
this.basalProfileChangedInternally++;
}
}

View file

@ -1,8 +1,6 @@
package info.nightscout.androidaps.plugins.PumpMedtronic.data.dto;
import org.joda.time.LocalDateTime;
import info.nightscout.androidaps.plugins.PumpCommon.utils.StringUtil;
import info.nightscout.androidaps.plugins.PumpCommon.utils.DateTimeUtil;
/**
* Created by andy on 18.05.15.
@ -22,9 +20,11 @@ public class BolusWizardDTO extends PumpTimeStampedRecord {
public Float correctionEstimate = 0.0f;
public Float foodEstimate = 0.0f;
public Float unabsorbedInsulin = 0.0f;
public LocalDateTime localDateTime;
// public LocalDateTime localDateTime;
// public long atechDateTime;
public String getValue() {
return String.format("BG=%d;CH=%d;CH_UNIT=%s;CH_INS_RATIO=%5.3f;BG_INS_RATIO=%5.3f;"
+ "BG_TARGET_LOW=%d;BG_TARGET_HIGH=%d;BOLUS_TOTAL=%5.3f;"
@ -35,6 +35,6 @@ public class BolusWizardDTO extends PumpTimeStampedRecord {
public String toString() {
return "BolusWizardDTO [dateTime=" + StringUtil.toDateTimeString(localDateTime) + ", " + getValue() + "]";
return "BolusWizardDTO [dateTime=" + DateTimeUtil.toString(atechDateTime) + ", " + getValue() + "]";
}
}

View file

@ -39,6 +39,7 @@ public class DailyTotalsDTO {
Double bolusTotal;
Double bolusFood;
Double bolusFoodAndCorr;
Double bolusCorrection;
Double bolusManual;
@ -47,20 +48,22 @@ public class DailyTotalsDTO {
// Integer bolusCountCorr;
Integer bolusCountFoodAndCorr;
Integer bolusCountManual;
private Integer bolusCountFood;
private Integer bolusCountCorr;
public DailyTotalsDTO(PumpHistoryEntryType entryType, byte[] data) {
switch (entryType) {
case DailyTotals515:
decodeData512(data);
decodeDailyTotals515(data);
break;
case DailyTotals522:
decodeData522(data);
decodeDailyTotals522(data);
break;
case DailyTotals523:
decodeData523(data);
decodeDailyTotals523(data);
break;
default:
@ -69,33 +72,45 @@ public class DailyTotalsDTO {
}
private void decodeData512(byte[] data) {
LOG.debug("Can't decode DailyTotals512: Body={}", ByteUtil.getHex(data));
private void testDecode(byte[] data) {
// Daily
byte body[] = data; // entry.getBody();
System.out.println("Totoals 522");
for (int i = 0; i < body.length - 2; i++) {
int j = ByteUtil.toInt(body[i], body[i + 1]);
int k = ByteUtil.toInt(body[i], body[i + 1], body[i + 2]);
int j1 = ByteUtil.toInt(body[i + 1], body[i]);
int k1 = ByteUtil.toInt(body[i + 2], body[i + 1], body[i]);
System.out.println(String.format(
"index: %d, number=%d, del/40=%.3f, del/10=%.3f, singular=%d, sing_hex=%s", i, j, j / 40.0d, j / 10.0d,
body[i], ByteUtil.getHex(body[i])));
System.out.println(String.format(" number[k,j1,k1]=%d / %d /%d, del/40=%.3f, del/40=%.3f, del/40=%.3f",
k, j1, k1, k / 40.0d, j1 / 40.0d, k1 / 40.0d));
}
}
// 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,
// Bolus=1.7[18,19], Fodd, Corr, Manual=1.7[27,28],
// Num bOlus=1, food/corr, Food+corr, manual bolus=1
private void decodeData522(byte[] data) {
private void decodeDailyTotals515(byte[] data) {
LOG.debug("Can't decode DailyTotals515: Body={}", ByteUtil.getHex(data));
// Double bgAvg;
// Double bgLow;
// Double bgHigh;
// Integer bgCount;
//
// Double sensorAvg;
// Double sensorMin;
// Double sensorMax;
// Integer sensorCalcCount;
// Integer sensorDataCount;
testDecode(data);
}
private void decodeDailyTotals522(byte[] data) {
this.insulinTotal = ByteUtil.toInt(data[8], data[9]) / 40.0d;
this.insulinBasal = ByteUtil.toInt(data[10], data[11]) / 40.0d;
this.insulinBolus = ByteUtil.toInt(data[13], data[14]) / 40.0d;
// Double insulinCarbs;
this.bolusTotal = ByteUtil.toInt(data[17], data[18], data[19]) / 40.0d;
this.bolusFood = ByteUtil.toInt(data[21], data[22]) / 40.0d;
@ -104,72 +119,45 @@ public class DailyTotalsDTO {
bolusCount = ByteUtil.asUINT8(data[30]);
bolusCountFoodOrCorr = ByteUtil.asUINT8(data[31]);
// Integer bolusCountCorr;
bolusCountFoodAndCorr = ByteUtil.asUINT8(data[32]);
bolusCountManual = ByteUtil.asUINT8(data[33]);
LOG.debug("{}", toString());
// 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,
// Bolus=1.7[18,19], Fodd, Corr, Manual=1.7[27,28],
// Num bOlus=1, food/corr, Food+corr, manual bolus=1
LOG.debug("522: {}", toString());
}
private void decodeData523(byte[] data) {
LOG.debug("Can't decode DailyTotals523: Body={}", ByteUtil.getHex(data));
private void decodeDailyTotals523(byte[] data) {
// 0x6E 0xB1 0x92
// 0x05 0x00 0x80 0x00 0x00 0x01 0x00 0x00 0x00 0x9A 0x00 0x50 0x34 0x00 0x4A 0x30 0x00 0x0B 0x00
// 0x24 0x00 0x00 0x00 0x00 0x00 0x26 0x01 0x00 0x00 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00 0x80 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
this.insulinTotal = ByteUtil.toInt(data[8], data[9]) / 40.0d;
this.insulinBasal = ByteUtil.toInt(data[10], data[11]) / 40.0d;
this.insulinBolus = ByteUtil.toInt(data[13], data[14]) / 40.0d;
this.insulinCarbs = ByteUtil.toInt(data[16], data[17]) * 1.0d;
// 0x05 0x00 0x80 0x00 0x00 0x01 0x00 0x00 0x00 0x9A 0x00 0x50 0x34 0x00 0x4A 0x30 0x00 0x0B 0x00
// 0x24 0x00 0x00 0x00 0x00 0x00 0x26 0x01 0x00 0x00
// 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
this.bolusFood = ByteUtil.toInt(data[18], data[19]) / 40.0d;
this.bolusCorrection = ByteUtil.toInt(data[20], data[21]) / 40.0d;
this.bolusFoodAndCorr = ByteUtil.toInt(data[22], data[23]) / 40.0d;
this.bolusManual = ByteUtil.toInt(data[24], data[25]) / 40.0d;
this.bolusCountFood = ByteUtil.asUINT8(data[26]);
this.bolusCountCorr = ByteUtil.asUINT8(data[27]);
this.bolusCountFoodAndCorr = ByteUtil.asUINT8(data[28]);
this.bolusCountManual = ByteUtil.asUINT8(data[29]); // +
// Delivery Stats: Carbs=11, Total Insulin=3.850, Basal=2.000
// Delivery Stats: Basal 52,Bolus 1.850, Bolus=48%o
// Delivery Stats: Food only=0.9, Food only#=1, Corr only = 0.0
// Delivery Stats: #Corr_only=0,Food+Corr=0.000, #Food+Corr=0
// Delivery Stats: Manual = 0.95, #Manual=5
LOG.debug("523: {}", toString());
// 19:31:40.314 [Thread-47]
// D/info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.MedtronicPumpHistoryDecoder:
// [MedtronicPumpHistoryDecoder.decodeDailyTotals():447]: PumpHistoryRecord [type=DailyTotals523 [110, 0x6E],
// DT: 16.11.2018 00:00:00, length=1,2,49(52), data={Raw Data=0x6E 0xB0 0x92 0x05 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00 0x00 0x55 0x00 0x55 0x64 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}]
// 19:31:40.318 [Thread-47] D/info.nightscout.androidaps.plugins.PumpMedtronic.data.dto.DailyTotalsDTO:
// [DailyTotalsDTO.decodeData523():117]: Can't decode DailyTotals523: Body=0x05 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00 0x00 0x55 0x00 0x55 0x64 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
// 19:31:40.320 [Thread-47]
// W/info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.MedtronicPumpHistoryDecoder:
// [MedtronicPumpHistoryDecoder.createRecords():181]: #0 WIP PumpHistoryRecord [type=DailyTotals523 [110, 0x6E],
// DT: 16.11.2018 00:00:00, length=1,2,49(52), data={Raw Data=0x6E 0xB0 0x92 0x05 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00 0x00 0x55 0x00 0x55 0x64 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}]
// 19:31:40.341 [Thread-47]
// D/info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.MedtronicPumpHistoryDecoder:
// [MedtronicPumpHistoryDecoder.decodeDateTime():793]: DT: 2018 11 17
// 19:31:40.342 [Thread-47]
// D/info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.MedtronicPumpHistoryDecoder:
// [MedtronicPumpHistoryDecoder.decodeDateTime():793]: DT: 2018 11 17
// 19:31:40.342 [Thread-47]
// D/info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.MedtronicPumpHistoryDecoder:
// [MedtronicPumpHistoryDecoder.decodeDailyTotals():446]: DailyTotals523 - 0x6E 0xB1 0x92 0x05 0x00 0x80 0x00
// 0x00 0x01 0x00 0x00 0x00 0x9A 0x00 0x50 0x34 0x00 0x4A 0x30 0x00 0x0B 0x00 0x24 0x00 0x00 0x00 0x00 0x00 0x26
// 0x01 0x00 0x00 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00
// 19:31:40.343 [Thread-47]
// D/info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.MedtronicPumpHistoryDecoder:
// [MedtronicPumpHistoryDecoder.decodeDailyTotals():447]: PumpHistoryRecord [type=DailyTotals523 [110, 0x6E],
// DT: 17.11.2018 00:00:00, length=1,2,49(52), data={Raw Data=0x6E 0xB1 0x92 0x05 0x00 0x80 0x00 0x00 0x01 0x00
// 0x00 0x00 0x9A 0x00 0x50 0x34 0x00 0x4A 0x30 0x00 0x0B 0x00 0x24 0x00 0x00 0x00 0x00 0x00 0x26 0x01 0x00 0x00
// 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}]
// 19:31:40.343 [Thread-47] D/info.nightscout.androidaps.plugins.PumpMedtronic.data.dto.DailyTotalsDTO:
// [DailyTotalsDTO.decodeData523():117]: Can't decode DailyTotals523: Body=0x05 0x00 0x80 0x00 0x00 0x01 0x00
// 0x00 0x00 0x9A 0x00 0x50 0x34 0x00 0x4A 0x30 0x00 0x0B 0x00 0x24 0x00 0x00 0x00 0x00 0x00 0x26 0x01 0x00 0x00
// 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
// 19:31:40.344 [Thread-47]
// W/info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.MedtronicPumpHistoryDecoder:
// [MedtronicPumpHistoryDecoder.createRecords():181]: #60 WIP PumpHistoryRecord [type=DailyTotals523 [110,
// 0x6E], DT: 17.11.2018 00:00:00, length=1,2,49(52), data={Raw Data=0x6E 0xB1 0x92 0x05 0x00 0x80 0x00 0x00
// 0x01 0x00 0x00 0x00 0x9A 0x00 0x50 0x34 0x00 0x4A 0x30 0x00 0x0B 0x00 0x24 0x00 0x00 0x00 0x00 0x00 0x26 0x01
// 0x00 0x00 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00
// 0x00}]
}
@ -196,7 +184,10 @@ public class DailyTotalsDTO {
.add("bolusCount", bolusCount) //
.add("bolusCountFoodOrCorr", bolusCountFoodOrCorr) //
.add("bolusCountFoodAndCorr", bolusCountFoodAndCorr) //
.add("bolusCountFood", bolusCountFood) //
.add("bolusCountCorr", bolusCountCorr) //
.add("bolusCountManual", bolusCountManual) //
.omitNullValues() //
.toString();
}
}

View file

@ -1,7 +1,5 @@
package info.nightscout.androidaps.plugins.PumpMedtronic.data.dto;
import org.joda.time.LocalDateTime;
import info.nightscout.androidaps.plugins.PumpCommon.utils.StringUtil;
/**
@ -10,20 +8,30 @@ import info.nightscout.androidaps.plugins.PumpCommon.utils.StringUtil;
@Deprecated
public class PumpTimeStampedRecord {
protected LocalDateTime localDateTime;
// protected LocalDateTime localDateTime;
protected int decimalPrecission = 2;
public long atechDateTime;
public LocalDateTime getLocalDateTime() {
return localDateTime;
public long getAtechDateTime() {
return this.atechDateTime;
}
public void setLocalDateTime(LocalDateTime ATechDate) {
this.localDateTime = ATechDate;
public void setAtechDateTime(long atechDateTime) {
this.atechDateTime = atechDateTime;
}
// public LocalDateTime getLocalDateTime() {
// return localDateTime;
// }
//
//
// public void setLocalDateTime(LocalDateTime ATechDate) {
// this.localDateTime = ATechDate;
// }
public String getFormattedDecimal(double value) {
return StringUtil.getFormatedValueUS(value, this.decimalPrecission);
}

View file

@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.PumpMedtronic.data.dto;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -144,17 +145,11 @@ public class TempBasalPair {
public String getDescription() {
String desc = "";
if (isPercent) {
desc = "Rate=" + insulinRate + "%";
return String.format(Locale.ENGLISH, "Rate=%.0f%%, Duration=%d min", insulinRate, durationMinutes);
} else {
desc = "Rate=" + insulinRate + " U";
return String.format(Locale.ENGLISH, "Rate=%.3f U, Duration=%d min", insulinRate, durationMinutes);
}
desc += ", Duration=" + durationMinutes + " min";
return desc;
}

View file

@ -4,6 +4,7 @@ import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.message.MessageBody;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.message.PumpAckMessageBody;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.message.UnknownMessageBody;
@ -43,14 +44,16 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
PushButton(0x5b, "Push Button", MinimedTargetType.ActionCommand, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters), // 91
RFPowerOn(93, "RF Power On", MinimedTargetType.InitCommand, MedtronicDeviceType.All, MinimedCommandParameterType.FixedParameters, getByteArray(
1, 10)), //
1, 10)), //
RFPowerOff(93, "RF Power Off", MinimedTargetType.InitCommand, MedtronicDeviceType.All, MinimedCommandParameterType.FixedParameters, getByteArray(
0, 0)), //
0, 0)), //
SetSuspend(77, "Set Suspend", MinimedTargetType.InitCommand, MedtronicDeviceType.All, MinimedCommandParameterType.FixedParameters, getByteArray(1)), //
// SetSuspend(77, "Set Suspend", MinimedTargetType.InitCommand, MedtronicDeviceType.All,
// MinimedCommandParameterType.FixedParameters, getByteArray(1)), //
CancelSuspend(77, "Cancel Suspend", MinimedTargetType.InitCommand, MedtronicDeviceType.All, MinimedCommandParameterType.FixedParameters, getByteArray(0)), //
// CancelSuspend(77, "Cancel Suspend", MinimedTargetType.InitCommand, MedtronicDeviceType.All,
// MinimedCommandParameterType.FixedParameters, getByteArray(0)), //
PumpState(131, "Pump State", MinimedTargetType.InitCommand, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters), //
@ -58,78 +61,98 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
// 511 (InitCommand = 2, Config 7, Data = 1(+3)
DetectBolus(75, "Detect Bolus", MinimedTargetType.InitCommand, MedtronicDeviceType.Medtronic_511, MinimedCommandParameterType.FixedParameters, getByteArray(
0, 0, 0)), //
0, 0, 0)), //
RemoteControlIds(118, "Remote Control Ids", MinimedTargetType.PumpConfiguration_NA, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters), //
// RemoteControlIds(118, "Remote Control Ids", MinimedTargetType.PumpConfiguration_NA, MedtronicDeviceType.All,
// MinimedCommandParameterType.NoParameters), //
FirmwareVersion(116, "Firmware Version", MinimedTargetType.InitCommand, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters), //
// FirmwareVersion(116, "Firmware Version", MinimedTargetType.InitCommand, MedtronicDeviceType.All,
// MinimedCommandParameterType.NoParameters), //
PumpId(113, "Pump Id", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters), // init
// PumpId(113, "Pump Id", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.All,
// MinimedCommandParameterType.NoParameters), // init
RealTimeClock(112, "Real Time Clock", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, 7), // 0x70
RealTimeClock(112, "Real Time Clock", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, //
7, R.string.medtronic_cmd_desc_get_time), // 0x70
GetBatteryStatus(0x72, "Get Battery Status", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters), //
// GetBattery((byte) 0x72), //
GetRemainingInsulin(0x73, "Read Remaining Insulin", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, 2), // 115
SetBolus(0x42, "Set Bolus", MinimedTargetType.PumpSetData, MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters), // 66
SetBolus(0x42, "Set Bolus", MedtronicDeviceType.All, MinimedCommandParameterType.NoParameters, //
0, R.string.medtronic_cmd_desc_set_bolus), // 66
// 512
ReadTemporaryBasal(0x98, "Read Temporary Basal", MinimedTargetType.InitCommand, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, 5), // 152
ReadTemporaryBasal(0x98, "Read Temporary Basal", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
5, R.string.medtronic_cmd_desc_get_tbr), // 152
SetTemporaryBasal(76, "Set Temp Basal Rate (bolus detection only)", MinimedTargetType.InitCommand, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, getByteArray(
0, 0, 0)),
// util.getCommand(MinimedCommand.SET_TEMPORARY_BASAL).allowedRetries
// = 0;
SetTemporaryBasal(76, "Set Temporay Basal", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
0, R.string.medtronic_cmd_desc_set_tbr),
// 512 Config
PumpModel(141, "Pump Model", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, 5), // 0x8D
PumpModel(141, "Pump Model", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
5, R.string.medtronic_cmd_desc_get_model), // 0x8D
BGTargets_512(140, "BG Targets", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512_712, MinimedCommandParameterType.NoParameters), //
// BGTargets_512(140, "BG Targets", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512_712,
// MinimedCommandParameterType.NoParameters), //
BGUnits(137, "BG Units", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), //
// BGUnits(137, "BG Units", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher,
// MinimedCommandParameterType.NoParameters), //
Language(134, "Language", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), //
// Language(134, "Language", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher,
// MinimedCommandParameterType.NoParameters), //
Settings_512(145, "Settings", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512_712, MinimedCommandParameterType.NoParameters), //
Settings_512(145, "Configuration", MedtronicDeviceType.Medtronic_512_712, MinimedCommandParameterType.NoParameters, //
64, 1, 0, R.string.medtronic_cmd_desc_get_settings), //
BGAlarmClocks(142, "BG Alarm Clocks", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), //
// BGAlarmClocks(142, "BG Alarm Clocks", MinimedTargetType.PumpConfiguration,
// MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), //
BGAlarmEnable(151, "BG Alarm Enable", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), //
// BGAlarmEnable(151, "BG Alarm Enable", MinimedTargetType.PumpConfiguration,
// MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), //
BGReminderEnable(144, "BG Reminder Enable", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), //
// BGReminderEnable(144, "BG Reminder Enable", MinimedTargetType.PumpConfiguration,
// MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), //
ReadInsulinSensitivities(0x8b, "Read Insulin Sensitivities", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), // 139
// ReadInsulinSensitivities(0x8b, "Read Insulin Sensitivities", MinimedTargetType.PumpConfiguration,
// MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters), // 139
// 512 Data
GetHistoryData(128, "History data", MinimedTargetType.PumpData, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.SubCommands, 1024, 36, 0), // 0x80
// new MinimedCommandHistoryData(36)
GetHistoryData(128, "Get History", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.SubCommands, //
1024, 16, 1024, R.string.medtronic_cmd_desc_get_history), // 0x80
GetBasalProfileSTD(146, "Get Profile Standard", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, 192, 1, 8, 1), // 146
GetBasalProfileSTD(146, "Get Profile Standard", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
64, 3, 192, R.string.medtronic_cmd_desc_get_basal_profile), // 146
GetBasalProfileA(147, "Get Profile A", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, 192, 1, 9), // 147
// FIXME
GetBasalProfileA(147, "Get Profile A", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
64, 3, 192, R.string.medtronic_cmd_desc_get_basal_profile),
GetBasalProfileB(148, "Get Profile B", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, 192, 1, 10), // 148
// FIXME
GetBasalProfileB(148, "Get Profile B", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
64, 3, 192, R.string.medtronic_cmd_desc_get_basal_profile), // 148
SetBasalProfileSTD(0x6f, "Set Profile Standard", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, 192, 1, 8), // 111
SetBasalProfileSTD(0x6f, "Set Profile Standard", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
64, 3, 192, R.string.medtronic_cmd_desc_set_basal_profile), // 111
SetBasalProfileA(0x30, "Set Profile A", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, 192, 1, 8), // 48
SetBasalProfileA(0x30, "Set Profile A", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
64, 3, 192, R.string.medtronic_cmd_desc_set_basal_profile), // 48
SetBasalProfileB(0x31, "Set Profile B", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, 192, 1, 8), // 49
SetBasalProfileB(0x31, "Set Profile B", MedtronicDeviceType.Medtronic_512andHigher, MinimedCommandParameterType.NoParameters, //
64, 3, 192, R.string.medtronic_cmd_desc_set_basal_profile), // 49
// 515
PumpStatus(206, "Pump Status", MinimedTargetType.InitCommand, MedtronicDeviceType.Medtronic_515andHigher, MinimedCommandParameterType.NoParameters), // PumpConfiguration
Settings(192, "Settings", MinimedTargetType.PumpConfiguration, MedtronicDeviceType.Medtronic_515andHigher, MinimedCommandParameterType.NoParameters), //
Settings(192, "Configuration", MedtronicDeviceType.Medtronic_515andHigher, MinimedCommandParameterType.NoParameters, //
64, 1, 0, R.string.medtronic_cmd_desc_get_settings), //
// 522
SensorSettings_522(153, "Sensor Settings", MedtronicDeviceType.Medtronic_522andHigher, MinimedCommandParameterType.NoParameters), //
SensorSettings_522(153, "Sensor Configuration", MedtronicDeviceType.Medtronic_522andHigher, MinimedCommandParameterType.NoParameters), //
GlucoseHistory(154, "Glucose History", MedtronicDeviceType.Medtronic_522andHigher, MinimedCommandParameterType.SubCommands, 1024, 32, 0, null), //
// 523
SensorSettings(207, "Sensor Settings", MinimedTargetType.CGMSConfiguration, MedtronicDeviceType.Medtronic_523andHigher, MinimedCommandParameterType.NoParameters), //
SensorSettings(207, "Sensor Configuration", MinimedTargetType.CGMSConfiguration, MedtronicDeviceType.Medtronic_523andHigher, MinimedCommandParameterType.NoParameters), //
// 553
// 554
@ -154,7 +177,7 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
// Fake Commands
CancelTBR(),;
CancelTBR(), ;
static Map<Byte, MedtronicCommandType> mapByCode;
@ -194,33 +217,33 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
MedtronicCommandType(int code, String description, MinimedTargetType targetType, MedtronicDeviceType devices,
MinimedCommandParameterType parameterType) {
MinimedCommandParameterType parameterType) {
this(code, description, targetType, devices, parameterType, 64, 1, 0, 0, 0, 0);
}
MedtronicCommandType(int code, String description, MinimedTargetType targetType, MedtronicDeviceType devices,
MinimedCommandParameterType parameterType, int expectedLength) {
MinimedCommandParameterType parameterType, int expectedLength) {
this(code, description, targetType, devices, parameterType, 64, 1, 0, 0, 0, expectedLength);
}
MedtronicCommandType(int code, String description, MinimedTargetType targetType, MedtronicDeviceType devices,
MinimedCommandParameterType parameterType, int recordLength, int maxRecords, int commandType) {
MinimedCommandParameterType parameterType, int recordLength, int maxRecords, int commandType) {
this(code, description, targetType, devices, parameterType, recordLength, maxRecords, 0, 0, commandType, 0);
}
MedtronicCommandType(int code, String description, MinimedTargetType targetType, MedtronicDeviceType devices,
MinimedCommandParameterType parameterType, int recordLength, int maxRecords, int commandType,
int expectedLength) {
MinimedCommandParameterType parameterType, int recordLength, int maxRecords, int commandType,
int expectedLength) {
this(code, description, targetType, devices, parameterType, recordLength, maxRecords, 0, 0, commandType,
expectedLength);
expectedLength);
}
MedtronicCommandType(int code, String description, MinimedTargetType targetType, MedtronicDeviceType devices,
MinimedCommandParameterType parameterType, byte[] cmd_params) {
MinimedCommandParameterType parameterType, byte[] cmd_params) {
this(code, description, targetType, devices, parameterType, 0, 1, 0, 0, 11, 0);
this.commandParameters = cmd_params;
@ -228,17 +251,16 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
}
MedtronicCommandType(int code, String description, MinimedTargetType targetType, MedtronicDeviceType devices,
MinimedCommandParameterType parameterType, byte[] cmd_params, int expectedLength) {
this(code, description, targetType, devices, parameterType, 0, 1, 0, 0, 11, expectedLength);
this.commandParameters = cmd_params;
this.commandParametersCount = cmd_params.length;
}
// MedtronicCommandType(int code, String description, MinimedTargetType targetType, MedtronicDeviceType devices,
// MinimedCommandParameterType parameterType, byte[] cmd_params, int expectedLength) {
// this(code, description, targetType, devices, parameterType, 0, 1, 0, 0, 11, expectedLength);
//
// this.commandParameters = cmd_params;
// this.commandParametersCount = cmd_params.length;
// }
MedtronicCommandType(int code, String description, MedtronicDeviceType devices, //
MinimedCommandParameterType parameterType) {
MinimedCommandParameterType parameterType) {
this(code, description, devices, parameterType, 64, 1, 0, null);
}
@ -246,31 +268,31 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
// NEW
MedtronicCommandType(int code, String description, MedtronicDeviceType devices,
MinimedCommandParameterType parameterType, int recordLength, int maxRecords, int commandType) {
MinimedCommandParameterType parameterType, int recordLength, int maxRecords, int commandType) {
this(code, description, devices, parameterType, recordLength, maxRecords, 0, null);
}
// NEW
MedtronicCommandType(int code, String description, MedtronicDeviceType devices, //
MinimedCommandParameterType parameterType, int expectedLength) {
MinimedCommandParameterType parameterType, int expectedLength) {
this(code, description, devices, parameterType, 64, 1, expectedLength, null);
}
// NEW
MedtronicCommandType(int code, String description, MedtronicDeviceType devices, //
MinimedCommandParameterType parameterType, int expectedLength, int resourceId) {
MinimedCommandParameterType parameterType, int expectedLength, int resourceId) {
this(code, description, devices, parameterType, 64, 1, expectedLength, resourceId);
}
// NEW
MedtronicCommandType(int code, String description,
MedtronicDeviceType devices, //
MinimedCommandParameterType parameterType, int recordLength, int max_recs, int expectedLength,
Integer resourceId) {
this.commandCode = (byte) code;
MedtronicDeviceType devices, //
MinimedCommandParameterType parameterType, int recordLength, int max_recs, int expectedLength,
Integer resourceId) {
this.commandCode = (byte)code;
this.commandDescription = description;
this.devices = devices;
this.recordLength = recordLength;
@ -285,15 +307,14 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
if (this.parameterType == MinimedCommandParameterType.SubCommands) {
this.minimalBufferSizeToStartReading = 200;
}
}
@Deprecated
MedtronicCommandType(int code, String description, MinimedTargetType targetType, MedtronicDeviceType devices, //
MinimedCommandParameterType parameterType, int recordLength, int max_recs, int addy, //
int addy_len, int cmd_type, int expectedLength) {
this.commandCode = (byte) code;
MinimedCommandParameterType parameterType, int recordLength, int max_recs, int addy, //
int addy_len, int cmd_type, int expectedLength) {
this.commandCode = (byte)code;
this.commandDescription = description;
this.targetType = targetType;
this.devices = devices;
@ -328,7 +349,7 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
byte[] array = new byte[data.length];
for (int i = 0; i < data.length; i++) {
array[i] = (byte) data[i];
array[i] = (byte)data[i];
}
return array;
@ -400,7 +421,7 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
*/
public String getFullCommandDescription() {
return "Command [name=" + this.name() + ", id=" + this.commandCode + ",description=" + this.commandDescription
+ "] ";
+ "] ";
}
@ -453,6 +474,7 @@ public enum MedtronicCommandType implements Serializable // , MinimedCommandType
return this.commandDescription;
}
public Integer getResourceId() {
return resourceId;
}

View file

@ -0,0 +1,237 @@
package info.nightscout.androidaps.plugins.PumpMedtronic.dialog;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
import info.nightscout.androidaps.plugins.PumpDanaRS.DanaRSPlugin;
import info.nightscout.androidaps.plugins.PumpMedtronic.MedtronicPumpPlugin;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.PumpHistoryEntry;
import info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump.PumpHistoryEntryGroup;
public class MedtronicHistoryActivity extends Activity {
private static Logger LOG = LoggerFactory.getLogger(L.PUMP);
private Handler mHandler;
static Profile profile = null;
Spinner historyTypeSpinner;
TextView statusView;
// Button reloadButton;
// Button syncButton;
RecyclerView recyclerView;
LinearLayoutManager llm;
static PumpHistoryEntryGroup showingType = PumpHistoryEntryGroup.All;
// List<PumpHistoryEntry> fullHistoryList = null;
List<PumpHistoryEntry> filteredHistoryList = new ArrayList<>();
// public static class TypeList {
//
// public byte type;
// String name;
//
//
// TypeList(byte type, String name) {
// this.type = type;
// this.name = name;
// }
//
//
// @Override
// public String toString() {
// return name;
// }
// }
public MedtronicHistoryActivity() {
super();
HandlerThread mHandlerThread = new HandlerThread(MedtronicHistoryActivity.class.getSimpleName());
mHandlerThread.start();
// this.fullHistoryList = MedtronicPumpPlugin.getPlugin().getMedtronicHistoryData().getAllHistory();
filterHistory(this.showingType);
this.mHandler = new Handler(mHandlerThread.getLooper());
}
private void filterHistory(PumpHistoryEntryGroup group) {
this.filteredHistoryList.clear();
List<PumpHistoryEntry> list = new ArrayList<>();
list.addAll(MedtronicPumpPlugin.getPlugin().getMedtronicHistoryData().getAllHistory());
LOG.debug("Items on full list: {}", list.size());
if (group == PumpHistoryEntryGroup.All) {
this.filteredHistoryList.addAll(list);
} else {
for (PumpHistoryEntry pumpHistoryEntry : list) {
if (pumpHistoryEntry.getEntryType().getGroup() == group) {
this.filteredHistoryList.add(pumpHistoryEntry);
}
}
}
LOG.debug("Items on filtered list: {}", filteredHistoryList.size());
}
@Override
protected void onResume() {
super.onResume();
MainApp.bus().register(this);
filterHistory(showingType);
}
@Override
protected void onPause() {
super.onPause();
MainApp.bus().unregister(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.medtronic_history_activity);
historyTypeSpinner = (Spinner)findViewById(R.id.medtronic_historytype);
statusView = (TextView)findViewById(R.id.medtronic_historystatus);
// reloadButton = (Button)findViewById(R.id.medtronic_historyreload);
// syncButton = (Button)findViewById(R.id.medtronic_historysync);
recyclerView = (RecyclerView)findViewById(R.id.medtronic_history_recyclerview);
recyclerView.setHasFixedSize(true);
llm = new LinearLayoutManager(this);
recyclerView.setLayoutManager(llm);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(filteredHistoryList);
recyclerView.setAdapter(adapter);
statusView.setVisibility(View.GONE);
boolean isKorean = DanaRKoreanPlugin.getPlugin().isEnabled(PluginType.PUMP);
boolean isRS = DanaRSPlugin.getPlugin().isEnabled(PluginType.PUMP);
// Types
// ArrayList<TypeList> typeList = new ArrayList<>();
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ALARM, MainApp.gs(R.string.danar_history_alarm)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BASALHOUR, MainApp.gs(R.string.danar_history_basalhours)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BOLUS, MainApp.gs(R.string.danar_history_bolus)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_CARBO, MainApp.gs(R.string.danar_history_carbohydrates)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_DAILY, MainApp.gs(R.string.danar_history_dailyinsulin)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_GLUCOSE, MainApp.gs(R.string.danar_history_glucose)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ERROR, MainApp.gs(R.string.danar_history_errors)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_PRIME, MainApp.gs(R.string.danar_history_prime)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_REFILL, MainApp.gs(R.string.danar_history_refill)));
// typeList.add(new TypeList(RecordTypes.RECORD_TYPE_SUSPEND, MainApp.gs(R.string.danar_history_syspend)));
ArrayAdapter<PumpHistoryEntryGroup> spinnerAdapter = new ArrayAdapter<>(this, R.layout.spinner_centered,
PumpHistoryEntryGroup.getList());
historyTypeSpinner.setAdapter(spinnerAdapter);
historyTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
PumpHistoryEntryGroup selected = (PumpHistoryEntryGroup)historyTypeSpinner.getSelectedItem();
showingType = selected;
filterHistory(selected);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
filterHistory(showingType);
}
});
}
public static class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.HistoryViewHolder> {
List<PumpHistoryEntry> historyList;
RecyclerViewAdapter(List<PumpHistoryEntry> historyList) {
this.historyList = historyList;
}
@Override
public HistoryViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.rileylink_status_history_item, //
viewGroup, false);
return new HistoryViewHolder(v);
}
@Override
public void onBindViewHolder(HistoryViewHolder holder, int position) {
PumpHistoryEntry record = historyList.get(position);
holder.timeView.setText(record.getDateTimeString());
holder.typeView.setText(record.getEntryType().getDescription());
holder.valueView.setText(record.getDisplayableValue());
}
@Override
public int getItemCount() {
return historyList.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
static class HistoryViewHolder extends RecyclerView.ViewHolder {
CardView cv;
TextView timeView;
TextView typeView;
TextView valueView;
HistoryViewHolder(View itemView) {
super(itemView);
// cv = (CardView)itemView.findViewById(R.id.rileylink_history_item);
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);
}
}
}
}

View file

@ -80,7 +80,7 @@ public class RileyLinkMedtronicService extends RileyLinkService {
@Override
public RileyLinkEncodingType getEncoding() {
return RileyLinkEncodingType.FourByteSixByte;
return RileyLinkEncodingType.FourByteSixByteLocal;
}

View file

@ -449,9 +449,10 @@ public class MedtronicUtil extends RileyLinkUtil {
}
public static int pageNumber;
public static int frameNumber;
public static Integer frameNumber;
public static void setCurrentCommand(MedtronicCommandType currentCommand, int pageNumber_, int frameNumber_) {
public static void setCurrentCommand(MedtronicCommandType currentCommand, int pageNumber_, Integer frameNumber_) {
pageNumber = pageNumber_;
frameNumber = frameNumber_;

View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".plugins.PumpMedtronic.dialog.MedtronicHistoryActivity">
<LinearLayout
android:id="@+id/medtronic_historytop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="20dp"
android:text="Type:"
android:textAppearance="?android:attr/textAppearanceSmall" />
<Spinner
android:id="@+id/medtronic_historytype"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="5dp"
android:layout_weight="1"
android:background="@drawable/pillborder"
android:gravity="center_horizontal"
android:text="DanaR History" />
</LinearLayout>
<TextView
android:id="@+id/medtronic_historystatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/medtronic_historytop"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal" />
<android.support.v7.widget.RecyclerView
android:id="@+id/medtronic_history_recyclerview"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/medtronic_historystatus" />
</RelativeLayout>

View file

@ -162,5 +162,15 @@
<item>@string/medtronic_pump_frequency_worldwide</item>
</string-array>
<string-array name="medtronicBolusDelay">
<item>5</item>
<item>10</item>
<item>15</item>
</string-array>
<string-array name="medtronicEncoding">
<item>@string/medtronic_pump_encoding_4b6b_local</item>
<item>@string/medtronic_pump_encoding_4b6b_rileylink</item>
</string-array>
</resources>

View file

@ -1224,15 +1224,18 @@
<string name="medtronic_name_short" translatable="false">MDT</string>
<string name="description_pump_medtronic">Pump integration for Medtronic, requires RileyLink device and specific Pump Model</string>
<!-- MDT Configuration -->
<string name="medtronic_serial_number">Pump Serial Number</string>
<string name="medtronic_pump_type">Pump Type</string>
<string name="medtronic_pump_frequency">Pump Frequency</string>
<string name="medtronic_pump_bolus_delay">Delay before Bolus is started (s)</string>
<string name="medtronic_pump_max_bolus">Max Bolus on Pump</string>
<string name="medtronic_pump_max_basal">Max Basal on Pump</string>
<string name="medtronic_pump_encoding">Medtronic Encoding</string>
<string name="medtronic_pump_frequency_us_ca">US &amp; Canada (916 MHz)</string>
<string name="medtronic_pump_frequency_worldwide">Worldwide (868 Mhz)</string>
<string name="medtronic_pump_encoding_4b6b_local">Local 4b6b Encoding</string>
<string name="medtronic_pump_encoding_4b6b_rileylink">RileyLink 4b6b Encoding</string>
<string name="rileylink_mac_address">RileyLink MAC Address</string>
<string name="rileylink_scanner_selected_device">Selected</string>
<string name="rileylink_scanner_scan">Scan</string>
@ -1302,6 +1305,14 @@
<string name="medtronic_error_pump_wrong_max_basal_set" formatted="false">Wrong Max Basal set on Pump (must be %.2f).</string>
<string name="xxx">xxx</string>
<!-- MDT History -->
<string name="medtronic_history_group_basal">Basals</string>
<string name="medtronic_history_group_configuration">Configurations</string>
<string name="medtronic_history_group_notification">Notifications</string>
<string name="medtronic_history_group_statistic">Statistics</string>
<string name="medtronic_history_group_unknown">Unknowns</string>
<string name="medtronic_history_group_all">All</string>
<!-- MDT Pump Status -->
<string name="medtronic_pump_status_never_contacted">Never contacted</string>
@ -1315,7 +1326,7 @@
<string name="medtronic_pump_status_sleeping">Sleeping</string>
<!-- <string name="medtronic_cmd_profile_not_set">Remote Basal profile setting is not supported. Please modify Basal profile on your pump manually.</string> -->
<string name="medtronic_cmd_cancel_bolus_not_supported">Remote cancel of Bolus is not supported. If you wish to cancel bolus, go to pump put it in suspend and then resume. This will cancel the bolus.</string>
<string name="medtronic_cmd_cancel_bolus_not_supported">You cancelled Bolus, after it was already sent to Pump. Since Medtronic Pumps don&#44;t support cancel, you need to get Pump and put it into Suspend mode and then do Resume. Application will pick up changes, on next update.</string>
<string name="medtronic_cmd_cant_read_tbr">Could not read current TBR.</string>
<string name="medtronic_cmd_cant_cancel_tbr_stop_op">Could not cancel current TBR. Stopping operation.</string>
<string name="medtronic_cmd_set_profile_pattern_overflow">Profile set failed, because following patterns, have too big basal rate: %1$s</string>
@ -1323,6 +1334,19 @@
<string name="medtronic_cmd_tbr_could_not_be_delivered">TBR could not be set.</string>
<string name="medtronic_cmd_cant_cancel_tbr">Could not cancel current TBR.</string>
<string name="medtronic_cmd_basal_profile_could_not_be_set">Basal profile could not be set.</string>
<string name="medtronic_cmd_basal_profile_not_set_is_same">Basal profile is the same, so it will not be set again.</string>
<string name="medtronic_cmd_desc_get_history">Get History - Page %1$d (%2$d/16)</string>
<string name="medtronic_cmd_desc_get_history_request">Get History - Page %1$d</string>
<string name="medtronic_cmd_desc_get_history_base">Get History - Page %1$d</string>
<string name="medtronic_cmd_desc_get_time">Get Pump Time</string>
<string name="medtronic_cmd_desc_get_settings">Get Settings</string>
<string name="medtronic_cmd_desc_get_model">Get Pump Model</string>
<string name="medtronic_cmd_desc_get_basal_profile">Get Basal Profile</string>
<string name="medtronic_cmd_desc_set_basal_profile">Set Basal Profile</string>
<string name="medtronic_cmd_desc_get_tbr">Get Temporary Basal</string>
<string name="medtronic_cmd_desc_set_tbr">Set Temporary Basal</string>
<string name="medtronic_cmd_desc_set_bolus">Set Bolus</string>
<string name="pump_no_connection_h">No connection for %1$d hour(s) %2$d min</string>

View file

@ -44,6 +44,22 @@
android:digits="0123456789."
android:title="@string/medtronic_pump_max_bolus" />
<ListPreference
android:defaultValue="10"
android:entries="@array/medtronicBolusDelay"
android:entryValues="@array/medtronicBolusDelay"
android:key="pref_medtronic_bolus_delay"
android:selectable="true"
android:title="@string/medtronic_pump_bolus_delay" />
<ListPreference
android:defaultValue="@string/medtronic_pump_encoding_4b6b_rileylink"
android:entries="@array/medtronicEncoding"
android:entryValues="@array/medtronicEncoding"
android:key="pref_medtronic_encoding"
android:selectable="true"
android:title="@string/medtronic_pump_encoding" />
<info.nightscout.androidaps.plugins.PumpCommon.ui.RileyLinkSelectPreference
android:id="@+id/rileylink_mac_address_mdt"
android:enabled="true"

View file

@ -10,6 +10,9 @@ import org.junit.runners.Parameterized;
import android.util.Log;
import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.ble.data.encoding.Encoding4b6bGeoff;
import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.ble.data.encoding.Encoding4b6bGo;
import info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.ble.data.encoding.Encoding4b6bLoop;
import info.nightscout.androidaps.plugins.PumpCommon.utils.ByteUtil;
/**
@ -62,6 +65,9 @@ public class RFToolsParametrizedUTest {
// @Test
public void testEncodeGeoff() {
Encoding4b6bGeoff decoder = new Encoding4b6bGeoff();
/*
* {0xa7} -> {0xa9, 0x60}
* {0xa7, 0x12} -> {0xa9, 0x6c, 0x72}
@ -84,7 +90,7 @@ public class RFToolsParametrizedUTest {
// LOG.error("test: compare failed.");
// }
// testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
byte[] bs = RFTools.encode4b6b(new byte[] { (byte)0xa7 });
byte[] bs = decoder.encode4b6b(new byte[] { (byte)0xa7 });
byte[] out = new byte[] { (byte)(0xa9), 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
@ -93,7 +99,7 @@ public class RFToolsParametrizedUTest {
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
bs = decoder.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
@ -102,7 +108,7 @@ public class RFToolsParametrizedUTest {
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
bs = decoder.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
@ -117,6 +123,9 @@ public class RFToolsParametrizedUTest {
// @Test
public void testEncodeGo() {
Encoding4b6bGo decoder = new Encoding4b6bGo();
/*
* {0xa7} -> {0xa9, 0x60}
* {0xa7, 0x12} -> {0xa9, 0x6c, 0x72}
@ -139,7 +148,7 @@ public class RFToolsParametrizedUTest {
// LOG.error("test: compare failed.");
// }
// testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
byte[] bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7 });
byte[] bs = decoder.encode4b6b(new byte[] { (byte)0xa7 });
byte[] out = new byte[] { (byte)(0xa9), 0x65 };
System.out.println("EncodeGo: " + ByteUtil.getHex(bs));
@ -152,7 +161,7 @@ public class RFToolsParametrizedUTest {
Assert.fail();
}
bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7, 0x12 });
bs = decoder.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
@ -162,7 +171,7 @@ public class RFToolsParametrizedUTest {
Assert.fail();
}
bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
bs = decoder.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
@ -176,10 +185,12 @@ public class RFToolsParametrizedUTest {
// @Test
public void testDecodeGo() {
public void testDecodeGo() throws Exception {
Encoding4b6bGo decoder = new Encoding4b6bGo();
// testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
byte[] bs = RFTools.encode4b6b(new byte[] { (byte)0xa7 });
byte[] bs = decoder.encode4b6b(new byte[] { (byte)0xa7 });
byte[] out = new byte[] { (byte)(0xa9), 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
@ -188,7 +199,7 @@ public class RFToolsParametrizedUTest {
+ ByteUtil.shortHexString(bs));
}
byte[] back = RFTools.decode4b6b(out);
byte[] back = decoder.decode4b6b(out);
if (ByteUtil.compare(back, bs) != 0) {
Log.e(
@ -198,7 +209,7 @@ public class RFToolsParametrizedUTest {
Assert.fail();
}
bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
bs = decoder.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
@ -207,7 +218,7 @@ public class RFToolsParametrizedUTest {
+ ByteUtil.shortHexString(bs));
}
back = RFTools.decode4b6b(out);
back = decoder.decode4b6b(out);
if (ByteUtil.compare(back, bs) != 0) {
Log.e(
@ -217,7 +228,7 @@ public class RFToolsParametrizedUTest {
Assert.fail();
}
bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
bs = decoder.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
@ -226,7 +237,7 @@ public class RFToolsParametrizedUTest {
+ ByteUtil.shortHexString(bs));
}
back = RFTools.decode4b6b(out);
back = decoder.decode4b6b(out);
if (ByteUtil.compare(back, bs) != 0) {
Log.e(
@ -258,7 +269,10 @@ public class RFToolsParametrizedUTest {
// @Test
public void testParametrizedGeoffEncode() {
byte[] encodedX = RFTools.encode4b6b(this.decoded);
Encoding4b6bGeoff decoder = new Encoding4b6bGeoff();
byte[] encodedX = decoder.encode4b6b(this.decoded);
// if (ByteUtil.compare(encodedX, this.encoded) != 0) {
// Assert.assertEquals(encodedX, encoded);
@ -269,8 +283,10 @@ public class RFToolsParametrizedUTest {
@Test
public void geoffDecode() {
byte[] decodedX = RFTools.decode4b6b(this.encoded);
public void geoffDecode() throws Exception {
Encoding4b6bGeoff decoder = new Encoding4b6bGeoff();
byte[] decodedX = decoder.decode4b6b(this.encoded);
Assert.assertArrayEquals(decoded, decodedX);
}
@ -278,31 +294,38 @@ public class RFToolsParametrizedUTest {
@Test
public void goDecode() {
RFTools.DecodeResponseDto decodeResponseDto = RFTools.decode4b6b_go(this.encoded);
Assert.assertNull(decodeResponseDto.errorData);
System.out.println("Result: " + ByteUtil.getHex(decodeResponseDto.data));
System.out.println("Expected: " + ByteUtil.getHex(decoded));
Assert.assertArrayEquals(decoded, decodeResponseDto.data);
// Encoding4b6bGo decoder = new Encoding4b6bGo();
//
// DecodeResponseDto decodeResponseDto = decoder.decode4b6b(this.encoded);
//
// Assert.assertNull(decodeResponseDto.errorData);
// System.out.println("Result: " + ByteUtil.getHex(decodeResponseDto.data));
// System.out.println("Expected: " + ByteUtil.getHex(decoded));
// Assert.assertArrayEquals(decoded, decodeResponseDto.data);
}
// @Test
public void loopDecode() {
byte[] data = RFTools.decode4b6b_loop(this.encoded);
// RFTools.DecodeResponseDto decodeResponseDto
// Assert.assertNull(decodeResponseDto.errorData);
System.out.println("Result: " + ByteUtil.getHex(data));
System.out.println("Expected: " + ByteUtil.getHex(decoded));
Assert.assertArrayEquals(decoded, data);
// Encoding4b6bLoop decoder = new Encoding4b6bLoop();
//
// byte[] data = decoder.decode4b6b(this.encoded);
//
// // RFTools.DecodeResponseDto decodeResponseDto
//
// // Assert.assertNull(decodeResponseDto.errorData);
// System.out.println("Result: " + ByteUtil.getHex(data));
// System.out.println("Expected: " + ByteUtil.getHex(decoded));
// Assert.assertArrayEquals(decoded, data);
}
@Test
public void geoffEncode() {
byte[] encodedX = RFTools.encode4b6b(this.decoded);
Encoding4b6bGeoff decoder = new Encoding4b6bGeoff();
byte[] encodedX = decoder.encode4b6b(this.decoded);
Assert.assertArrayEquals(encoded, encodedX);
}
@ -310,7 +333,9 @@ public class RFToolsParametrizedUTest {
@Test
public void goEncode() {
byte[] encodedX = RFTools.encode4b6b_go(this.decoded);
Encoding4b6bGo decoder = new Encoding4b6bGo();
byte[] encodedX = decoder.encode4b6b(this.decoded);
System.out.println("Result: " + ByteUtil.getHex(encodedX));
System.out.println("Expected: " + ByteUtil.getHex(encoded));
Assert.assertArrayEquals(encoded, encodedX);
@ -319,7 +344,9 @@ public class RFToolsParametrizedUTest {
@Test
public void loopEncode() {
byte[] encodedX = RFTools.encode4b6b_loop(this.decoded);
Encoding4b6bLoop decoder = new Encoding4b6bLoop();
byte[] encodedX = decoder.encode4b6b(this.decoded);
System.out.println("Result: " + ByteUtil.getHex(encodedX));
System.out.println("Expected: " + ByteUtil.getHex(encoded));
Assert.assertArrayEquals(encoded, encodedX);

View file

@ -1,13 +1,7 @@
package info.nightscout.androidaps.plugins.PumpCommon.hw.rileylink.ble;
import junit.framework.Assert;
import org.junit.Test;
import android.util.Log;
import info.nightscout.androidaps.plugins.PumpCommon.utils.ByteUtil;
/**
* Created by andy on 11/21/18.
*/
@ -19,115 +13,115 @@ public class RFToolsUTest {
@Test
public void testEncodeGeoff() {
/*
* {0xa7} -> {0xa9, 0x60}
* {0xa7, 0x12} -> {0xa9, 0x6c, 0x72}
* {0xa7, 0x12, 0xa7} -> {0xa9, 0x6c, 0x72, 0xa9, 0x60}
*/
/* test compare */
// byte[] s1 = { 0, 1, 2 };
// byte[] s2 = { 2, 1, 0, 3 };
// byte[] s3 = { 0, 1, 2, 3 };
// if (ByteUtil.compare(s1, s1) != 0) {
// LOG.error("test: compare failed.");
// /*
// * {0xa7} -> {0xa9, 0x60}
// * {0xa7, 0x12} -> {0xa9, 0x6c, 0x72}
// * {0xa7, 0x12, 0xa7} -> {0xa9, 0x6c, 0x72, 0xa9, 0x60}
// */
// /* test compare */
// // byte[] s1 = { 0, 1, 2 };
// // byte[] s2 = { 2, 1, 0, 3 };
// // byte[] s3 = { 0, 1, 2, 3 };
// // if (ByteUtil.compare(s1, s1) != 0) {
// // LOG.error("test: compare failed.");
// // }
// // if (ByteUtil.compare(s1, s2) >= 0) {
// // LOG.error("test: compare failed.");
// // }
// // if (ByteUtil.compare(s2, s1) <= 0) {
// // LOG.error("test: compare failed.");
// // }
// // if (ByteUtil.compare(s1, s3) >= 0) {
// // LOG.error("test: compare failed.");
// // }
// // testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
// byte[] bs = RFTools.encode4b6b(new byte[] { (byte)0xa7 });
// byte[] out = new byte[] { (byte)(0xa9), 0x65 };
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
// if (ByteUtil.compare(s1, s2) >= 0) {
// LOG.error("test: compare failed.");
// bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
// out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
// if (ByteUtil.compare(s2, s1) <= 0) {
// LOG.error("test: compare failed.");
// bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
// out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
// if (ByteUtil.compare(s1, s3) >= 0) {
// LOG.error("test: compare failed.");
// }
// testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
byte[] bs = RFTools.encode4b6b(new byte[] { (byte)0xa7 });
byte[] out = new byte[] { (byte)(0xa9), 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
}
@Test
public void testEncodeGo() {
/*
* {0xa7} -> {0xa9, 0x60}
* {0xa7, 0x12} -> {0xa9, 0x6c, 0x72}
* {0xa7, 0x12, 0xa7} -> {0xa9, 0x6c, 0x72, 0xa9, 0x60}
*/
/* test compare */
// byte[] s1 = { 0, 1, 2 };
// byte[] s2 = { 2, 1, 0, 3 };
// byte[] s3 = { 0, 1, 2, 3 };
// if (ByteUtil.compare(s1, s1) != 0) {
// LOG.error("test: compare failed.");
// /*
// * {0xa7} -> {0xa9, 0x60}
// * {0xa7, 0x12} -> {0xa9, 0x6c, 0x72}
// * {0xa7, 0x12, 0xa7} -> {0xa9, 0x6c, 0x72, 0xa9, 0x60}
// */
// /* test compare */
// // byte[] s1 = { 0, 1, 2 };
// // byte[] s2 = { 2, 1, 0, 3 };
// // byte[] s3 = { 0, 1, 2, 3 };
// // if (ByteUtil.compare(s1, s1) != 0) {
// // LOG.error("test: compare failed.");
// // }
// // if (ByteUtil.compare(s1, s2) >= 0) {
// // LOG.error("test: compare failed.");
// // }
// // if (ByteUtil.compare(s2, s1) <= 0) {
// // LOG.error("test: compare failed.");
// // }
// // if (ByteUtil.compare(s1, s3) >= 0) {
// // LOG.error("test: compare failed.");
// // }
// // testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
// byte[] bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7 });
// byte[] out = new byte[] { (byte)(0xa9), 0x65 };
//
// System.out.println("EncodeGo: " + ByteUtil.getHex(bs));
//
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
// if (ByteUtil.compare(s1, s2) >= 0) {
// LOG.error("test: compare failed.");
//
// bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7, 0x12 });
// out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
// if (ByteUtil.compare(s2, s1) <= 0) {
// LOG.error("test: compare failed.");
//
// bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
// out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
// if (ByteUtil.compare(s1, s3) >= 0) {
// LOG.error("test: compare failed.");
// }
// testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
byte[] bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7 });
byte[] out = new byte[] { (byte)(0xa9), 0x65 };
System.out.println("EncodeGo: " + ByteUtil.getHex(bs));
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7, 0x12 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
bs = RFTools.encode4b6b_go(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
}
@ -135,63 +129,63 @@ public class RFToolsUTest {
@Test
public void testDecodeGo() {
// testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
byte[] bs = RFTools.encode4b6b(new byte[] { (byte)0xa7 });
byte[] out = new byte[] { (byte)(0xa9), 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
}
byte[] back = RFTools.decode4b6b(out);
if (ByteUtil.compare(back, bs) != 0) {
Log.e(
TAG,
"decode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
}
back = RFTools.decode4b6b(out);
if (ByteUtil.compare(back, bs) != 0) {
Log.e(
TAG,
"decode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
if (ByteUtil.compare(bs, out) != 0) {
Log.e(
TAG,
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
}
back = RFTools.decode4b6b(out);
if (ByteUtil.compare(back, bs) != 0) {
Log.e(
TAG,
"decode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
+ ByteUtil.shortHexString(bs));
Assert.fail();
}
// // testCompose(new byte[] {(byte)0xa7, (byte)0xa7});
// byte[] bs = RFTools.encode4b6b(new byte[] { (byte)0xa7 });
// byte[] out = new byte[] { (byte)(0xa9), 0x65 };
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// }
//
// byte[] back = RFTools.decode4b6b(out);
//
// if (ByteUtil.compare(back, bs) != 0) {
// Log.e(
// TAG,
// "decode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
//
// bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12 });
// out = new byte[] { (byte)(0xa9), 0x6c, 0x72 };
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// }
//
// back = RFTools.decode4b6b(out);
//
// if (ByteUtil.compare(back, bs) != 0) {
// Log.e(
// TAG,
// "decode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
//
// bs = RFTools.encode4b6b(new byte[] { (byte)0xa7, 0x12, (byte)0xa7 });
// out = new byte[] { (byte)(0xa9), 0x6c, 0x72, (byte)0xa9, 0x65 };
// if (ByteUtil.compare(bs, out) != 0) {
// Log.e(
// TAG,
// "encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// }
//
// back = RFTools.decode4b6b(out);
//
// if (ByteUtil.compare(back, bs) != 0) {
// Log.e(
// TAG,
// "decode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
// + ByteUtil.shortHexString(bs));
// Assert.fail();
// }
return;
}
@ -200,25 +194,25 @@ public class RFToolsUTest {
@Test
public void ttt_decodeGo() {
RFTools.DecodeResponseDto decodeResponseDto = RFTools
.decode4b6b_go(new byte[] {
(byte)0xF9, (byte)0xE9, 0x63, (byte)0x9E, 0x7F, (byte)0xE6, 0x79, 0x5F, (byte)0xFF, (byte)0xCF,
(byte)0xF0 });
if (decodeResponseDto.errorData != null) {
Log.e(TAG, decodeResponseDto.errorData);
Assert.assertTrue(false);
} else {
Assert.assertTrue(true);
System.out.println("Response: " + ByteUtil.getHex(decodeResponseDto.data));
}
// RFTools.DecodeResponseDto decodeResponseDto = RFTools
// .decode4b6b_go(new byte[] {
// (byte)0xF9, (byte)0xE9, 0x63, (byte)0x9E, 0x7F, (byte)0xE6, 0x79, 0x5F, (byte)0xFF, (byte)0xCF,
// (byte)0xF0 });
//
// if (decodeResponseDto.errorData != null) {
// Log.e(TAG, decodeResponseDto.errorData);
// Assert.assertTrue(false);
// } else {
// Assert.assertTrue(true);
// System.out.println("Response: " + ByteUtil.getHex(decodeResponseDto.data));
// }
}
@Test
public void goTest() {
System.out.println(RFTools.hi(4, (short)0xa7));
// System.out.println(RFTools.hi(4, (short)0xa7));
}
}

View file

@ -1,6 +1,7 @@
package info.nightscout.androidaps.plugins.PumpMedtronic.comm.history.pump;
import org.junit.Before;
import org.junit.Test;
import info.nightscout.androidaps.plugins.PumpCommon.utils.ByteUtil;
@ -70,6 +71,52 @@ public class MedtronicPumpHistoryDecoderUTest {
}
@Test
public void decodeDailyTotals515() {
byte[] data = new byte[] {
0x6E, (byte)0xB1, (byte)0x92, 0x05, 0x00, (byte)0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, (byte)0x9A, 0x00,
0x50, 0x34, 0x00, 0x4A, 0x30, 0x00, 0x0B, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0x80, (byte)0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 };
// Carbs=11, total=3.850,basal=2.000, bolus=1.850, basal 52%, blus=48%, Manual=0.95, #manual=5,
// Food only=0.9, #Food Only=1,Corr Only =0, #Corr only=0,Food+Corr=0
// Delivery Stats: Carbs=11, Total Insulin=3.850, Basal=2.000
// Delivery Stats: Basal 52,Bolus 1.850, Bolus=48%o
// Delivery Stats: Food only=0.9, Food only#=1, Corr only = 0.0
// Delivery Stats: #Corr_only=0,Food+Corr=0.000, #Food+Corr=0
// Delivery Stats: Manual = 0.95, #Manual=5
testRecord(data);
}
@Test
public void decodeDailyTotals523() {
byte[] data = new byte[] {
0x6E, (byte)0xB1, (byte)0x92, 0x05, 0x00, (byte)0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, (byte)0x9A, 0x00,
0x50, 0x34, 0x00, 0x4A, 0x30, 0x00, 0x0B, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0x80, (byte)0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 };
// Carbs=11, total=3.850,basal=2.000, bolus=1.850, basal 52%, blus=48%, Manual=0.95, #manual=5,
// Food only=0.9, #Food Only=1,Corr Only =0, #Corr only=0,Food+Corr=0
// Delivery Stats: Carbs=11, Total Insulin=3.850, Basal=2.000
// Delivery Stats: Basal 52,Bolus 1.850, Bolus=48%o
// Delivery Stats: Food only=0.9, Food only#=1, Corr only = 0.0
// Delivery Stats: #Corr_only=0,Food+Corr=0.000, #Food+Corr=0
// Delivery Stats: Manual = 0.95, #Manual=5
testRecord(data);
}
private void testRecord(byte[] data) {
// byte[] data = new byte[] { 0x07, 0x00, 0x00, 0x05, (byte)0xFA, (byte)0xBF, 0x12 };