Skip to content
Snippets Groups Projects
Commit d1ec382a authored by Volker Richert's avatar Volker Richert
Browse files

Merge branch 'feature/generic_send_message' into develop

parents 53733d32 7aba34b2
No related branches found
No related tags found
No related merge requests found
Showing
with 196 additions and 100 deletions
...@@ -82,9 +82,9 @@ public class MedtronicCnlReader { ...@@ -82,9 +82,9 @@ public class MedtronicCnlReader {
doRetry = false; doRetry = false;
try { try {
new ContourNextLinkCommandMessage(ContourNextLinkCommandMessage.ASCII.NAK) new ContourNextLinkCommandMessage(ContourNextLinkCommandMessage.ASCII.NAK)
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.EOT); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.EOT);
new ContourNextLinkCommandMessage(ContourNextLinkCommandMessage.ASCII.ENQ) new ContourNextLinkCommandMessage(ContourNextLinkCommandMessage.ASCII.ENQ)
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK);
} catch (UnexpectedMessageException e2) { } catch (UnexpectedMessageException e2) {
try { try {
new ContourNextLinkCommandMessage(ContourNextLinkCommandMessage.ASCII.EOT).send(mDevice); new ContourNextLinkCommandMessage(ContourNextLinkCommandMessage.ASCII.EOT).send(mDevice);
...@@ -99,21 +99,21 @@ public class MedtronicCnlReader { ...@@ -99,21 +99,21 @@ public class MedtronicCnlReader {
public void enterPassthroughMode() throws IOException, TimeoutException, UnexpectedMessageException, ChecksumException, EncryptionException { public void enterPassthroughMode() throws IOException, TimeoutException, UnexpectedMessageException, ChecksumException, EncryptionException {
Log.d(TAG, "Begin enterPasshtroughMode"); Log.d(TAG, "Begin enterPasshtroughMode");
new ContourNextLinkCommandMessage("W|") new ContourNextLinkCommandMessage("W|")
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK);
new ContourNextLinkCommandMessage("Q|") new ContourNextLinkCommandMessage("Q|")
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK);
new ContourNextLinkCommandMessage("1|") new ContourNextLinkCommandMessage("1|")
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK);
Log.d(TAG, "Finished enterPasshtroughMode"); Log.d(TAG, "Finished enterPasshtroughMode");
} }
public void openConnection() throws IOException, TimeoutException, NoSuchAlgorithmException, ChecksumException, EncryptionException { public void openConnection() throws IOException, TimeoutException, NoSuchAlgorithmException, ChecksumException, EncryptionException, UnexpectedMessageException {
Log.d(TAG, "Begin openConnection"); Log.d(TAG, "Begin openConnection");
new OpenConnectionRequestMessage(mPumpSession, mPumpSession.getHMAC()).send(mDevice); new OpenConnectionRequestMessage(mPumpSession, mPumpSession.getHMAC()).send(mDevice);
Log.d(TAG, "Finished openConnection"); Log.d(TAG, "Finished openConnection");
} }
public void requestReadInfo() throws IOException, TimeoutException, EncryptionException, ChecksumException { public void requestReadInfo() throws IOException, TimeoutException, EncryptionException, ChecksumException, UnexpectedMessageException {
Log.d(TAG, "Begin requestReadInfo"); Log.d(TAG, "Begin requestReadInfo");
ReadInfoResponseMessage response = new ReadInfoRequestMessage(mPumpSession).send(mDevice); ReadInfoResponseMessage response = new ReadInfoRequestMessage(mPumpSession).send(mDevice);
...@@ -125,7 +125,7 @@ public class MedtronicCnlReader { ...@@ -125,7 +125,7 @@ public class MedtronicCnlReader {
Log.d(TAG, String.format("Finished requestReadInfo. linkMAC = '%d', pumpMAC = '%d", linkMAC, pumpMAC)); Log.d(TAG, String.format("Finished requestReadInfo. linkMAC = '%d', pumpMAC = '%d", linkMAC, pumpMAC));
} }
public void requestLinkKey() throws IOException, TimeoutException, EncryptionException, ChecksumException { public void requestLinkKey() throws IOException, TimeoutException, EncryptionException, ChecksumException, UnexpectedMessageException {
Log.d(TAG, "Begin requestLinkKey"); Log.d(TAG, "Begin requestLinkKey");
RequestLinkKeyResponseMessage response = new RequestLinkKeyRequestMessage(mPumpSession).send(mDevice); RequestLinkKeyResponseMessage response = new RequestLinkKeyRequestMessage(mPumpSession).send(mDevice);
...@@ -169,7 +169,7 @@ public class MedtronicCnlReader { ...@@ -169,7 +169,7 @@ public class MedtronicCnlReader {
Log.d(TAG, "Finished beginEHSMSession"); Log.d(TAG, "Finished beginEHSMSession");
} }
public Date getPumpTime() throws EncryptionException, IOException, ChecksumException, TimeoutException { public Date getPumpTime() throws EncryptionException, IOException, ChecksumException, TimeoutException, UnexpectedMessageException {
Log.d(TAG, "Begin getPumpTime"); Log.d(TAG, "Begin getPumpTime");
// FIXME - throw if not in EHSM mode (add a state machine) // FIXME - throw if not in EHSM mode (add a state machine)
...@@ -191,7 +191,7 @@ public class MedtronicCnlReader { ...@@ -191,7 +191,7 @@ public class MedtronicCnlReader {
return pumpRecord; return pumpRecord;
} }
public void getBasalPatterns() throws EncryptionException, IOException, ChecksumException, TimeoutException { public void getBasalPatterns() throws EncryptionException, IOException, ChecksumException, TimeoutException, UnexpectedMessageException {
Log.d(TAG, "Begin getBasalPatterns"); Log.d(TAG, "Begin getBasalPatterns");
// FIXME - throw if not in EHSM mode (add a state machine) // FIXME - throw if not in EHSM mode (add a state machine)
...@@ -216,7 +216,7 @@ public class MedtronicCnlReader { ...@@ -216,7 +216,7 @@ public class MedtronicCnlReader {
Log.d(TAG, "Finished endEHSMSession"); Log.d(TAG, "Finished endEHSMSession");
} }
public void closeConnection() throws IOException, TimeoutException, ChecksumException, EncryptionException, NoSuchAlgorithmException { public void closeConnection() throws IOException, TimeoutException, ChecksumException, EncryptionException, NoSuchAlgorithmException, UnexpectedMessageException {
Log.d(TAG, "Begin closeConnection"); Log.d(TAG, "Begin closeConnection");
new CloseConnectionRequestMessage(mPumpSession, mPumpSession.getHMAC()).send(mDevice); new CloseConnectionRequestMessage(mPumpSession, mPumpSession.getHMAC()).send(mDevice);
Log.d(TAG, "Finished closeConnection"); Log.d(TAG, "Finished closeConnection");
...@@ -225,18 +225,18 @@ public class MedtronicCnlReader { ...@@ -225,18 +225,18 @@ public class MedtronicCnlReader {
public void endPassthroughMode() throws IOException, TimeoutException, UnexpectedMessageException, ChecksumException, EncryptionException { public void endPassthroughMode() throws IOException, TimeoutException, UnexpectedMessageException, ChecksumException, EncryptionException {
Log.d(TAG, "Begin endPassthroughMode"); Log.d(TAG, "Begin endPassthroughMode");
new ContourNextLinkCommandMessage("W|") new ContourNextLinkCommandMessage("W|")
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK);
new ContourNextLinkCommandMessage("Q|") new ContourNextLinkCommandMessage("Q|")
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK);
new ContourNextLinkCommandMessage("0|") new ContourNextLinkCommandMessage("0|")
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ACK);
Log.d(TAG, "Finished endPassthroughMode"); Log.d(TAG, "Finished endPassthroughMode");
} }
public void endControlMode() throws IOException, TimeoutException, UnexpectedMessageException, ChecksumException, EncryptionException { public void endControlMode() throws IOException, TimeoutException, UnexpectedMessageException, ChecksumException, EncryptionException {
Log.d(TAG, "Begin endControlMode"); Log.d(TAG, "Begin endControlMode");
new ContourNextLinkCommandMessage(ContourNextLinkCommandMessage.ASCII.EOT) new ContourNextLinkCommandMessage(ContourNextLinkCommandMessage.ASCII.EOT)
.send(mDevice).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ENQ); .send(mDevice, 500).checkControlMessage(ContourNextLinkCommandMessage.ASCII.ENQ);
Log.d(TAG, "Finished endControlMode"); Log.d(TAG, "Finished endControlMode");
} }
} }
...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -11,7 +11,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class BeginEHSMMessage extends MedtronicSendMessageRequestMessage { public class BeginEHSMMessage extends EHSMMessage {
public BeginEHSMMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public BeginEHSMMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.BEGIN_EHSM_SESSION, pumpSession, buildPayload()); super(SendMessageType.BEGIN_EHSM_SESSION, pumpSession, buildPayload());
} }
...@@ -20,11 +20,4 @@ public class BeginEHSMMessage extends MedtronicSendMessageRequestMessage { ...@@ -20,11 +20,4 @@ public class BeginEHSMMessage extends MedtronicSendMessageRequestMessage {
// Not sure what the payload of a null byte means, but it's the same every time. // Not sure what the payload of a null byte means, but it's the same every time.
return new byte[] { 0x00 }; return new byte[] { 0x00 };
} }
public void send(UsbHidDriver mDevice) throws IOException, TimeoutException {
sendMessage(mDevice);
// The Begin EHSM Session only has an 0x81 response
readMessage(mDevice);
}
} }
...@@ -15,13 +15,14 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -15,13 +15,14 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class ChannelNegotiateRequestMessage extends MedtronicRequestMessage { public class ChannelNegotiateRequestMessage extends MedtronicRequestMessage<ChannelNegotiateResponseMessage> {
private static final String TAG = ChannelNegotiateRequestMessage.class.getSimpleName(); private static final String TAG = ChannelNegotiateRequestMessage.class.getSimpleName();
public ChannelNegotiateRequestMessage(MedtronicCnlSession pumpSession) throws ChecksumException { public ChannelNegotiateRequestMessage(MedtronicCnlSession pumpSession) throws ChecksumException {
super(CommandType.SEND_MESSAGE, CommandAction.CHANNEL_NEGOTIATE, pumpSession, buildPayload(pumpSession)); super(CommandType.SEND_MESSAGE, CommandAction.CHANNEL_NEGOTIATE, pumpSession, buildPayload(pumpSession));
} }
@Override
public ChannelNegotiateResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, ChecksumException, EncryptionException { public ChannelNegotiateResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, ChecksumException, EncryptionException {
sendMessage(mDevice); sendMessage(mDevice);
...@@ -30,11 +31,16 @@ public class ChannelNegotiateRequestMessage extends MedtronicRequestMessage { ...@@ -30,11 +31,16 @@ public class ChannelNegotiateRequestMessage extends MedtronicRequestMessage {
readMessage(mDevice); readMessage(mDevice);
// The 0x80 message // The 0x80 message
Log.d(TAG, "negotiateChannel: Reading 0x80 message"); Log.d(TAG, "negotiateChannel: Reading 0x80 message");
ChannelNegotiateResponseMessage response = new ChannelNegotiateResponseMessage(mPumpSession, readMessage(mDevice)); ChannelNegotiateResponseMessage response = this.getResponse(readMessage(mDevice));
return response; return response;
} }
@Override
protected ChannelNegotiateResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException {
return new ChannelNegotiateResponseMessage(mPumpSession, payload);
}
protected static byte[] buildPayload( MedtronicCnlSession pumpSession ) { protected static byte[] buildPayload( MedtronicCnlSession pumpSession ) {
ByteBuffer payload = ByteBuffer.allocate(26); ByteBuffer payload = ByteBuffer.allocate(26);
payload.order(ByteOrder.LITTLE_ENDIAN); payload.order(ByteOrder.LITTLE_ENDIAN);
......
...@@ -12,17 +12,13 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -12,17 +12,13 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
* Created by volker on 10.12.2016. * Created by volker on 10.12.2016.
*/ */
public class CloseConnectionRequestMessage extends ContourNextLinkBinaryRequestMessage { public class CloseConnectionRequestMessage extends ContourNextLinkBinaryRequestMessage<CloseConnectionResponseMessage> {
public CloseConnectionRequestMessage(MedtronicCnlSession pumpSession, byte[] payload) throws ChecksumException { public CloseConnectionRequestMessage(MedtronicCnlSession pumpSession, byte[] payload) throws ChecksumException {
super(CommandType.CLOSE_CONNECTION, pumpSession, payload); super(CommandType.CLOSE_CONNECTION, pumpSession, payload);
} }
public CloseConnectionResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, EncryptionException, ChecksumException { @Override
sendMessage(mDevice); protected CloseConnectionResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException {
return new CloseConnectionResponseMessage(payload);
CloseConnectionResponseMessage response = new CloseConnectionResponseMessage(readMessage(mDevice));
// FIXME - We need to care what the response message is - wrong MAC and all that
return response;
} }
} }
...@@ -12,7 +12,7 @@ import info.nightscout.android.medtronic.exception.ChecksumException; ...@@ -12,7 +12,7 @@ import info.nightscout.android.medtronic.exception.ChecksumException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class ContourNextLinkBinaryRequestMessage extends ContourNextLinkRequestMessage { public abstract class ContourNextLinkBinaryRequestMessage<T> extends ContourNextLinkRequestMessage<T> {
private final static int ENVELOPE_SIZE = 33; private final static int ENVELOPE_SIZE = 33;
//protected ByteBuffer mBayerEnvelope; //protected ByteBuffer mBayerEnvelope;
......
...@@ -6,11 +6,12 @@ import java.util.concurrent.TimeoutException; ...@@ -6,11 +6,12 @@ import java.util.concurrent.TimeoutException;
import info.nightscout.android.USB.UsbHidDriver; import info.nightscout.android.USB.UsbHidDriver;
import info.nightscout.android.medtronic.exception.ChecksumException; import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException; import info.nightscout.android.medtronic.exception.EncryptionException;
import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class ContourNextLinkCommandMessage extends ContourNextLinkRequestMessage { public class ContourNextLinkCommandMessage extends ContourNextLinkRequestMessage<ContourNextLinkCommandResponse> {
public ContourNextLinkCommandMessage(ASCII command) { public ContourNextLinkCommandMessage(ASCII command) {
super(new byte[]{command.getValue()}); super(new byte[]{command.getValue()});
} }
...@@ -23,13 +24,9 @@ public class ContourNextLinkCommandMessage extends ContourNextLinkRequestMessage ...@@ -23,13 +24,9 @@ public class ContourNextLinkCommandMessage extends ContourNextLinkRequestMessage
super(command.getBytes()); super(command.getBytes());
} }
@Override
public ContourNextLinkCommandResponse send(UsbHidDriver mDevice) throws IOException, TimeoutException, EncryptionException, ChecksumException { protected ContourNextLinkCommandResponse getResponse(byte[] payload) throws ChecksumException {
sendMessage(mDevice); return new ContourNextLinkCommandResponse(payload);
ContourNextLinkCommandResponse response = new ContourNextLinkCommandResponse(readMessage(mDevice));
// FIXME - We need to care what the response message is - wrong MAC and all that
return response;
} }
} }
...@@ -8,12 +8,15 @@ import java.nio.ByteBuffer; ...@@ -8,12 +8,15 @@ import java.nio.ByteBuffer;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import info.nightscout.android.USB.UsbHidDriver; import info.nightscout.android.USB.UsbHidDriver;
import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException;
import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
import info.nightscout.android.utils.HexDump; import info.nightscout.android.utils.HexDump;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class ContourNextLinkMessage { public abstract class ContourNextLinkMessage {
private static final String TAG = ContourNextLinkMessage.class.getSimpleName(); private static final String TAG = ContourNextLinkMessage.class.getSimpleName();
private static final int USB_BLOCKSIZE = 64; private static final int USB_BLOCKSIZE = 64;
......
package info.nightscout.android.medtronic.message; package info.nightscout.android.medtronic.message;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import info.nightscout.android.USB.UsbHidDriver;
import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException;
import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
/** /**
* Created by volker on 12.12.2016. * Created by volker on 12.12.2016.
*/ */
public class ContourNextLinkRequestMessage extends ContourNextLinkMessage { public abstract class ContourNextLinkRequestMessage<T> extends ContourNextLinkMessage {
protected ContourNextLinkRequestMessage(byte[] bytes) { protected ContourNextLinkRequestMessage(byte[] bytes) {
super(bytes); super(bytes);
} }
public T send(UsbHidDriver mDevice) throws IOException, TimeoutException, EncryptionException, ChecksumException, UnexpectedMessageException {
return send(mDevice, 0);
}
public T send(UsbHidDriver mDevice, int millis) throws UnexpectedMessageException, EncryptionException, TimeoutException, ChecksumException, IOException {
sendMessage(mDevice);
if (millis > 0) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
T response = this.getResponse(readMessage(mDevice)); //new ContourNextLinkCommandResponse();
// FIXME - We need to care what the response message is - wrong MAC and all that
return response;
}
protected abstract <T> T getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException, UnexpectedMessageException, TimeoutException;
} }
...@@ -10,7 +10,7 @@ import info.nightscout.android.medtronic.exception.UnexpectedMessageException; ...@@ -10,7 +10,7 @@ import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class ContourNextLinkResponseMessage extends ContourNextLinkMessage { public abstract class ContourNextLinkResponseMessage extends ContourNextLinkMessage {
public ContourNextLinkResponseMessage(byte[] payload) throws ChecksumException { public ContourNextLinkResponseMessage(byte[] payload) throws ChecksumException {
super(payload); super(payload);
......
...@@ -12,15 +12,28 @@ import info.nightscout.android.medtronic.exception.UnexpectedMessageException; ...@@ -12,15 +12,28 @@ import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
* Created by volker on 10.12.2016. * Created by volker on 10.12.2016.
*/ */
public class DeviceInfoRequestCommandMessage extends ContourNextLinkRequestMessage { public class DeviceInfoRequestCommandMessage extends ContourNextLinkRequestMessage<DeviceInfoResponseCommandMessage> {
public DeviceInfoRequestCommandMessage() { public DeviceInfoRequestCommandMessage() {
super("X".getBytes()); super("X".getBytes());
} }
public DeviceInfoResponseCommandMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, EncryptionException, ChecksumException, UnexpectedMessageException { @Override
public DeviceInfoResponseCommandMessage send(UsbHidDriver mDevice, int millis) throws IOException, TimeoutException, EncryptionException, ChecksumException, UnexpectedMessageException {
sendMessage(mDevice); sendMessage(mDevice);
if (millis > 0) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
byte[] response1 = readMessage(mDevice); byte[] response1 = readMessage(mDevice);
if (millis > 0) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
byte[] response2 = readMessage(mDevice); byte[] response2 = readMessage(mDevice);
boolean doRetry = false; boolean doRetry = false;
...@@ -30,12 +43,12 @@ public class DeviceInfoRequestCommandMessage extends ContourNextLinkRequestMessa ...@@ -30,12 +43,12 @@ public class DeviceInfoRequestCommandMessage extends ContourNextLinkRequestMessa
try { try {
if (ASCII.EOT.equals(response1[0])) { if (ASCII.EOT.equals(response1[0])) {
// response 1 is the ASTM message // response 1 is the ASTM message
response = new DeviceInfoResponseCommandMessage(response1); response = this.getResponse(response1);
// ugly.... // ugly....
response.checkControlMessage(response2, ASCII.ENQ); response.checkControlMessage(response2, ASCII.ENQ);
} else { } else {
// response 2 is the ASTM message // response 2 is the ASTM message
response = new DeviceInfoResponseCommandMessage(response1); response = this.getResponse(response1);
// ugly, too.... // ugly, too....
response.checkControlMessage(response1, ASCII.ENQ); response.checkControlMessage(response1, ASCII.ENQ);
} }
...@@ -46,4 +59,9 @@ public class DeviceInfoRequestCommandMessage extends ContourNextLinkRequestMessa ...@@ -46,4 +59,9 @@ public class DeviceInfoRequestCommandMessage extends ContourNextLinkRequestMessa
return response; return response;
} }
@Override
protected DeviceInfoResponseCommandMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException, UnexpectedMessageException, TimeoutException {
return new DeviceInfoResponseCommandMessage(payload);
}
} }
package info.nightscout.android.medtronic.message;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import info.nightscout.android.USB.UsbHidDriver;
import info.nightscout.android.medtronic.MedtronicCnlSession;
import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException;
/**
* Created by volker on 22.12.2016.
*/
public class EHSMMessage extends MedtronicSendMessageRequestMessage<ContourNextLinkResponseMessage>{
protected EHSMMessage(SendMessageType sendMessageType, MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException {
super(sendMessageType, pumpSession, payload);
}
@Override
public ContourNextLinkResponseMessage send(UsbHidDriver mDevice, int millis) throws IOException, TimeoutException {
sendMessage(mDevice);
if (millis > 0) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
// The End EHSM Session only has an 0x81 response
readMessage(mDevice);
return null;
}
}
...@@ -7,11 +7,12 @@ import info.nightscout.android.USB.UsbHidDriver; ...@@ -7,11 +7,12 @@ import info.nightscout.android.USB.UsbHidDriver;
import info.nightscout.android.medtronic.MedtronicCnlSession; import info.nightscout.android.medtronic.MedtronicCnlSession;
import info.nightscout.android.medtronic.exception.ChecksumException; import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException; import info.nightscout.android.medtronic.exception.EncryptionException;
import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class EndEHSMMessage extends MedtronicSendMessageRequestMessage { public class EndEHSMMessage extends EHSMMessage {
public EndEHSMMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public EndEHSMMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.END_EHSM_SESSION, pumpSession, buildPayload()); super(SendMessageType.END_EHSM_SESSION, pumpSession, buildPayload());
} }
...@@ -21,10 +22,4 @@ public class EndEHSMMessage extends MedtronicSendMessageRequestMessage { ...@@ -21,10 +22,4 @@ public class EndEHSMMessage extends MedtronicSendMessageRequestMessage {
return new byte[] { 0x01 }; return new byte[] { 0x01 };
} }
public void send(UsbHidDriver mDevice) throws IOException, TimeoutException {
sendMessage(mDevice);
// The End EHSM Session only has an 0x81 response
readMessage(mDevice);
}
} }
...@@ -16,7 +16,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -16,7 +16,7 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class MedtronicRequestMessage extends ContourNextLinkBinaryRequestMessage { public abstract class MedtronicRequestMessage<T> extends ContourNextLinkBinaryRequestMessage<T> {
static int ENVELOPE_SIZE = 2; static int ENVELOPE_SIZE = 2;
static int CRC_SIZE = 2; static int CRC_SIZE = 2;
......
...@@ -3,14 +3,16 @@ package info.nightscout.android.medtronic.message; ...@@ -3,14 +3,16 @@ package info.nightscout.android.medtronic.message;
import info.nightscout.android.medtronic.MedtronicCnlSession; import info.nightscout.android.medtronic.MedtronicCnlSession;
import info.nightscout.android.medtronic.exception.ChecksumException; import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException; import info.nightscout.android.medtronic.exception.EncryptionException;
import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
/** /**
* Created by volker on 18.12.2016. * Created by volker on 18.12.2016.
*/ */
public class MedtronicSendMessageRequestMessage extends MedtronicRequestMessage { public abstract class MedtronicSendMessageRequestMessage<T> extends MedtronicRequestMessage<T> {
static int ENVELOPE_SIZE = 11; static int ENVELOPE_SIZE = 11;
static int ENCRYPTED_ENVELOPE_SIZE = 3; static int ENCRYPTED_ENVELOPE_SIZE = 3;
static int CRC_SIZE = 2; static int CRC_SIZE = 2;
...@@ -34,6 +36,11 @@ public class MedtronicSendMessageRequestMessage extends MedtronicRequestMessage ...@@ -34,6 +36,11 @@ public class MedtronicSendMessageRequestMessage extends MedtronicRequestMessage
super(CommandType.SEND_MESSAGE, CommandAction.PUMP_REQUEST, pumpSession, buildPayload(sendMessageType, pumpSession, payload)); super(CommandType.SEND_MESSAGE, CommandAction.PUMP_REQUEST, pumpSession, buildPayload(sendMessageType, pumpSession, payload));
} }
@Override
protected ContourNextLinkResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException, UnexpectedMessageException {
return null;
}
/** /**
* MedtronicSendMessage: * MedtronicSendMessage:
* +-----------------+------------------------------+--------------+-------------------+--------------------------------+ * +-----------------+------------------------------+--------------+-------------------+--------------------------------+
......
...@@ -12,17 +12,13 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -12,17 +12,13 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
* Created by volker on 10.12.2016. * Created by volker on 10.12.2016.
*/ */
public class OpenConnectionRequestMessage extends ContourNextLinkBinaryRequestMessage { public class OpenConnectionRequestMessage extends ContourNextLinkBinaryRequestMessage<OpenConnectionResponseMessage> {
public OpenConnectionRequestMessage(MedtronicCnlSession pumpSession, byte[] payload) throws ChecksumException { public OpenConnectionRequestMessage(MedtronicCnlSession pumpSession, byte[] payload) throws ChecksumException {
super(CommandType.OPEN_CONNECTION, pumpSession, payload); super(CommandType.OPEN_CONNECTION, pumpSession, payload);
} }
public OpenConnectionResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, EncryptionException, ChecksumException { @Override
sendMessage(mDevice); protected OpenConnectionResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException {
return new OpenConnectionResponseMessage(payload);
OpenConnectionResponseMessage response = new OpenConnectionResponseMessage(readMessage(mDevice));
// FIXME - We need to care what the response message is - wrong MAC and all that
return response;
} }
} }
...@@ -7,21 +7,18 @@ import info.nightscout.android.USB.UsbHidDriver; ...@@ -7,21 +7,18 @@ import info.nightscout.android.USB.UsbHidDriver;
import info.nightscout.android.medtronic.MedtronicCnlSession; import info.nightscout.android.medtronic.MedtronicCnlSession;
import info.nightscout.android.medtronic.exception.ChecksumException; import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException; import info.nightscout.android.medtronic.exception.EncryptionException;
import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class PumpBasalPatternRequestMessage extends MedtronicSendMessageRequestMessage { public class PumpBasalPatternRequestMessage extends MedtronicSendMessageRequestMessage<PumpBasalPatternResponseMessage> {
public PumpBasalPatternRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public PumpBasalPatternRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.READ_BASAL_PATTERN_REQUEST, pumpSession, null); super(SendMessageType.READ_BASAL_PATTERN_REQUEST, pumpSession, null);
} }
public PumpBasalPatternResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, ChecksumException, EncryptionException { @Override
sendMessage(mDevice); protected PumpBasalPatternResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException, UnexpectedMessageException {
return new PumpBasalPatternResponseMessage(mPumpSession, payload);
// Read the 0x81
PumpBasalPatternResponseMessage response = new PumpBasalPatternResponseMessage(mPumpSession, readMessage(mDevice));
return response;
} }
} }
...@@ -12,19 +12,34 @@ import info.nightscout.android.medtronic.exception.UnexpectedMessageException; ...@@ -12,19 +12,34 @@ import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class PumpStatusRequestMessage extends MedtronicSendMessageRequestMessage { public class PumpStatusRequestMessage extends MedtronicSendMessageRequestMessage<PumpStatusResponseMessage> {
public PumpStatusRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public PumpStatusRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.READ_PUMP_STATUS_REQUEST, pumpSession, null); super(SendMessageType.READ_PUMP_STATUS_REQUEST, pumpSession, null);
} }
public PumpStatusResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, ChecksumException, EncryptionException, UnexpectedMessageException { public PumpStatusResponseMessage send(UsbHidDriver mDevice, int millis) throws IOException, TimeoutException, ChecksumException, EncryptionException, UnexpectedMessageException {
sendMessage(mDevice); sendMessage(mDevice);
if (millis > 0) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
// Read the 0x81 // Read the 0x81
readMessage(mDevice); readMessage(mDevice);
if (millis > 0) {
PumpStatusResponseMessage response = new PumpStatusResponseMessage(mPumpSession, readMessage(mDevice)); try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
PumpStatusResponseMessage response = this.getResponse(readMessage(mDevice));
return response; return response;
} }
@Override
protected PumpStatusResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException, UnexpectedMessageException {
return new PumpStatusResponseMessage(mPumpSession, payload);
}
} }
...@@ -7,24 +7,41 @@ import info.nightscout.android.USB.UsbHidDriver; ...@@ -7,24 +7,41 @@ import info.nightscout.android.USB.UsbHidDriver;
import info.nightscout.android.medtronic.MedtronicCnlSession; import info.nightscout.android.medtronic.MedtronicCnlSession;
import info.nightscout.android.medtronic.exception.ChecksumException; import info.nightscout.android.medtronic.exception.ChecksumException;
import info.nightscout.android.medtronic.exception.EncryptionException; import info.nightscout.android.medtronic.exception.EncryptionException;
import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class PumpTimeRequestMessage extends MedtronicSendMessageRequestMessage { public class PumpTimeRequestMessage extends MedtronicSendMessageRequestMessage<PumpTimeResponseMessage> {
public PumpTimeRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public PumpTimeRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.TIME_REQUEST, pumpSession, null); super(SendMessageType.TIME_REQUEST, pumpSession, null);
} }
public PumpTimeResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, ChecksumException, EncryptionException { @Override
public PumpTimeResponseMessage send(UsbHidDriver mDevice, int millis) throws IOException, TimeoutException, ChecksumException, EncryptionException, UnexpectedMessageException {
sendMessage(mDevice); sendMessage(mDevice);
if (millis > 0) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
// Read the 0x81 // Read the 0x81
readMessage(mDevice); readMessage(mDevice);
if (millis > 0) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
}
}
// Read the 0x80 // Read the 0x80
PumpTimeResponseMessage response = new PumpTimeResponseMessage(mPumpSession, readMessage(mDevice)); PumpTimeResponseMessage response = this.getResponse(readMessage(mDevice));
return response; return response;
} }
@Override
protected PumpTimeResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException, UnexpectedMessageException {
return new PumpTimeResponseMessage(mPumpSession, payload);
}
} }
...@@ -12,7 +12,7 @@ import info.nightscout.android.medtronic.exception.UnexpectedMessageException; ...@@ -12,7 +12,7 @@ import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
/** /**
* Created by lgoedhart on 26/03/2016. * Created by lgoedhart on 26/03/2016.
*/ */
public class ReadHistoryInfoRequestMessage extends MedtronicSendMessageRequestMessage { public class ReadHistoryInfoRequestMessage extends MedtronicSendMessageRequestMessage<ReadHistoryInfoResponseMessage> {
public ReadHistoryInfoRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException { public ReadHistoryInfoRequestMessage(MedtronicCnlSession pumpSession) throws EncryptionException, ChecksumException {
super(SendMessageType.READ_BASAL_PATTERN_REQUEST, pumpSession, new byte[] { super(SendMessageType.READ_BASAL_PATTERN_REQUEST, pumpSession, new byte[] {
2, 2,
...@@ -30,12 +30,8 @@ public class ReadHistoryInfoRequestMessage extends MedtronicSendMessageRequestMe ...@@ -30,12 +30,8 @@ public class ReadHistoryInfoRequestMessage extends MedtronicSendMessageRequestMe
}); });
} }
public ReadHistoryInfoResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, ChecksumException, EncryptionException, UnexpectedMessageException { @Override
sendMessage(mDevice); protected ReadHistoryInfoResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException, UnexpectedMessageException {
return new ReadHistoryInfoResponseMessage(mPumpSession, payload);
// Read the 0x81
ReadHistoryInfoResponseMessage response = new ReadHistoryInfoResponseMessage(mPumpSession, readMessage(mDevice));
return response;
} }
} }
...@@ -12,16 +12,13 @@ import info.nightscout.android.medtronic.exception.EncryptionException; ...@@ -12,16 +12,13 @@ import info.nightscout.android.medtronic.exception.EncryptionException;
* Created by volker on 10.12.2016. * Created by volker on 10.12.2016.
*/ */
public class ReadInfoRequestMessage extends ContourNextLinkBinaryRequestMessage { public class ReadInfoRequestMessage extends ContourNextLinkBinaryRequestMessage<ReadInfoResponseMessage> {
public ReadInfoRequestMessage(MedtronicCnlSession pumpSession) throws ChecksumException { public ReadInfoRequestMessage(MedtronicCnlSession pumpSession) throws ChecksumException {
super(ContourNextLinkBinaryRequestMessage.CommandType.READ_INFO, pumpSession, null); super(ContourNextLinkBinaryRequestMessage.CommandType.READ_INFO, pumpSession, null);
} }
public ReadInfoResponseMessage send(UsbHidDriver mDevice) throws IOException, TimeoutException, EncryptionException, ChecksumException { @Override
sendMessage(mDevice); protected ReadInfoResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException {
return new ReadInfoResponseMessage(mPumpSession, payload);
ReadInfoResponseMessage response = new ReadInfoResponseMessage(mPumpSession, readMessage(mDevice));
return response;
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment