Update VersionResponse

This commit is contained in:
Bart Sopers 2020-04-28 23:11:32 +02:00
parent 5d25e39dd1
commit b515fbae92
2 changed files with 65 additions and 31 deletions

View file

@ -7,45 +7,51 @@ import info.nightscout.androidaps.plugins.pump.omnipod.defs.MessageBlockType;
import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodProgressStatus; import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodProgressStatus;
public class VersionResponse extends MessageBlock { public class VersionResponse extends MessageBlock {
private static final int ASSIGN_ADDRESS_VERSION_RESPONSE_LENGTH = 0x15;
private static final int SETUP_POD_VERSION_RESPONSE_LENGTH = 0x1b;
private final PodProgressStatus podProgressStatus; private final PodProgressStatus podProgressStatus;
private final FirmwareVersion pmVersion; private final FirmwareVersion pmVersion;
private final FirmwareVersion piVersion; private final FirmwareVersion piVersion;
private final int lot; private final int lot;
private final int tid; private final int tid;
private Byte gain; // Only in the assign address version response
private Byte rssi; // Only in the assign address version response
private final int address; private final int address;
public VersionResponse(byte[] encodedData) { public VersionResponse(byte[] data) {
int length = ByteUtil.convertUnsignedByteToInt(encodedData[1]) + 2; int length = ByteUtil.convertUnsignedByteToInt(data[1]);
this.encodedData = ByteUtil.substring(encodedData, 2, length - 2); this.encodedData = ByteUtil.substring(data, 2, length);
boolean extraByte;
byte[] truncatedData;
switch (length) { switch (length) {
case 0x17: case ASSIGN_ADDRESS_VERSION_RESPONSE_LENGTH:
truncatedData = ByteUtil.substring(encodedData, 2); podProgressStatus = PodProgressStatus.fromByte(data[9]);
extraByte = true; pmVersion = new FirmwareVersion(data[2], data[3], data[4]);
piVersion = new FirmwareVersion(data[5], data[6], data[7]);
lot = ByteUtil.toInt((int) data[10], (int) data[11],
(int) data[12], (int) data[13], ByteUtil.BitConversion.BIG_ENDIAN);
tid = ByteUtil.toInt((int) data[14], (int) data[15],
(int) data[16], (int) data[17], ByteUtil.BitConversion.BIG_ENDIAN);
gain = (byte) ((data[18] & 0xc0) >>> 6);
rssi = (byte) (data[18] & 0x3f);
address = ByteUtil.toInt((int) data[19], (int) data[20],
(int) data[21], (int) data[22], ByteUtil.BitConversion.BIG_ENDIAN);
break; break;
case 0x1D: case SETUP_POD_VERSION_RESPONSE_LENGTH:
truncatedData = ByteUtil.substring(encodedData, 9); podProgressStatus = PodProgressStatus.fromByte(data[16]);
extraByte = false; pmVersion = new FirmwareVersion(data[9], data[10], data[11]);
piVersion = new FirmwareVersion(data[12], data[13], data[14]);
lot = ByteUtil.toInt((int) data[17], (int) data[18],
(int) data[19], (int) data[20], ByteUtil.BitConversion.BIG_ENDIAN);
tid = ByteUtil.toInt((int) data[21], (int) data[22],
(int) data[23], (int) data[24], ByteUtil.BitConversion.BIG_ENDIAN);
address = ByteUtil.toInt((int) data[25], (int) data[26],
(int) data[27], (int) data[28], ByteUtil.BitConversion.BIG_ENDIAN);
break; break;
default: default:
throw new IllegalArgumentException("Unrecognized VersionResponse message length: " + length); throw new IllegalArgumentException("Unrecognized VersionResponse message length: " + length);
} }
podProgressStatus = PodProgressStatus.fromByte(truncatedData[7]);
pmVersion = new FirmwareVersion(truncatedData[0], truncatedData[1], truncatedData[2]);
piVersion = new FirmwareVersion(truncatedData[3], truncatedData[4], truncatedData[5]);
lot = ByteUtil.toInt((int) truncatedData[8], (int) truncatedData[9],
(int) truncatedData[10], (int) truncatedData[11], ByteUtil.BitConversion.BIG_ENDIAN);
tid = ByteUtil.toInt((int) truncatedData[12], (int) truncatedData[13],
(int) truncatedData[14], (int) truncatedData[15], ByteUtil.BitConversion.BIG_ENDIAN);
int indexIncrement = extraByte ? 1 : 0;
address = ByteUtil.toInt((int) truncatedData[16 + indexIncrement], (int) truncatedData[17 + indexIncrement],
(int) truncatedData[18 + indexIncrement], (int) truncatedData[19 + indexIncrement], ByteUtil.BitConversion.BIG_ENDIAN);
} }
@Override @Override
@ -73,6 +79,22 @@ public class VersionResponse extends MessageBlock {
return tid; return tid;
} }
public Byte getGain() {
return gain;
}
public Byte getRssi() {
return rssi;
}
public boolean isAssignAddressVersionResponse() {
return encodedData.length == ASSIGN_ADDRESS_VERSION_RESPONSE_LENGTH;
}
public boolean isSetupPodVersionResponse() {
return encodedData.length == SETUP_POD_VERSION_RESPONSE_LENGTH;
}
public int getAddress() { public int getAddress() {
return address; return address;
} }

View file

@ -7,10 +7,14 @@ import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodProgressStatus;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public class VersionResponseTest { public class VersionResponseTest {
@Test @Test
public void testRawDataShortResponse() { public void testRawDataAssignAddressVersionResponse() {
byte[] encodedData = ByteUtil.fromHexString("011502070002070002020000a64000097c279c1f08ced2"); byte[] encodedData = ByteUtil.fromHexString("011502070002070002020000a64000097c279c1f08ced2");
VersionResponse versionResponse = new VersionResponse(encodedData); VersionResponse versionResponse = new VersionResponse(encodedData);
@ -18,7 +22,7 @@ public class VersionResponseTest {
} }
@Test @Test
public void testRawDataShortResponseWithLongerMessage() { public void testRawDataAssignAddressVersionResponseWithLongerMessage() {
byte[] encodedData = ByteUtil.fromHexString("011502070002070002020000a64000097c279c1f08ced201"); byte[] encodedData = ByteUtil.fromHexString("011502070002070002020000a64000097c279c1f08ced201");
byte[] expected = ByteUtil.fromHexString("011502070002070002020000a64000097c279c1f08ced2"); byte[] expected = ByteUtil.fromHexString("011502070002070002020000a64000097c279c1f08ced2");
@ -27,7 +31,7 @@ public class VersionResponseTest {
} }
@Test @Test
public void testRawDataLongResponse() { public void testRawDataSetupPodVersionResponse() {
byte[] encodedData = ByteUtil.fromHexString("011b13881008340a5002070002070002030000a3770003ab371f00ee87"); byte[] encodedData = ByteUtil.fromHexString("011b13881008340a5002070002070002030000a3770003ab371f00ee87");
VersionResponse versionResponse = new VersionResponse(encodedData); VersionResponse versionResponse = new VersionResponse(encodedData);
@ -36,7 +40,7 @@ public class VersionResponseTest {
} }
@Test @Test
public void testRawDataLongResponseWithLongerMessage() { public void testRawDataSetupPodVersionResponseWithLongerMessage() {
byte[] encodedData = ByteUtil.fromHexString("011b13881008340a5002070002070002030000a3770003ab371f00ee8701"); byte[] encodedData = ByteUtil.fromHexString("011b13881008340a5002070002070002030000a3770003ab371f00ee8701");
byte[] expected = ByteUtil.fromHexString("011b13881008340a5002070002070002030000a3770003ab371f00ee87"); byte[] expected = ByteUtil.fromHexString("011b13881008340a5002070002070002030000a3770003ab371f00ee87");
@ -45,25 +49,33 @@ public class VersionResponseTest {
} }
@Test @Test
public void testVersionResponse() { public void testAssignAddressVersionResponse() {
VersionResponse versionResponse = new VersionResponse(ByteUtil.fromHexString("011502070002070002020000a64000097c279c1f08ced2")); VersionResponse versionResponse = new VersionResponse(ByteUtil.fromHexString("011502070002070002020000a64000097c279c1f08ced2"));
assertTrue(versionResponse.isAssignAddressVersionResponse());
assertFalse(versionResponse.isSetupPodVersionResponse());
assertEquals(0x1f08ced2, versionResponse.getAddress()); assertEquals(0x1f08ced2, versionResponse.getAddress());
assertEquals(42560, versionResponse.getLot()); assertEquals(42560, versionResponse.getLot());
assertEquals(621607, versionResponse.getTid()); assertEquals(621607, versionResponse.getTid());
assertEquals("2.7.0", versionResponse.getPiVersion().toString()); assertEquals("2.7.0", versionResponse.getPiVersion().toString());
assertEquals("2.7.0", versionResponse.getPmVersion().toString()); assertEquals("2.7.0", versionResponse.getPmVersion().toString());
assertNotNull(versionResponse.getRssi());
assertNotNull(versionResponse.getGain());
} }
@Test @Test
public void testLongVersionResponse() { public void testSetupPodVersionResponse() {
VersionResponse versionResponse = new VersionResponse(ByteUtil.fromHexString("011b13881008340a5002070002070002030000a3770003ab371f00ee87")); VersionResponse versionResponse = new VersionResponse(ByteUtil.fromHexString("011b13881008340a5002070002070002030000a3770003ab371f00ee87"));
assertFalse(versionResponse.isAssignAddressVersionResponse());
assertTrue(versionResponse.isSetupPodVersionResponse());
assertEquals(0x1f00ee87, versionResponse.getAddress()); assertEquals(0x1f00ee87, versionResponse.getAddress());
assertEquals(41847, versionResponse.getLot()); assertEquals(41847, versionResponse.getLot());
assertEquals(240439, versionResponse.getTid()); assertEquals(240439, versionResponse.getTid());
assertEquals(PodProgressStatus.PAIRING_SUCCESS, versionResponse.getPodProgressStatus()); assertEquals(PodProgressStatus.PAIRING_SUCCESS, versionResponse.getPodProgressStatus());
assertEquals("2.7.0", versionResponse.getPiVersion().toString()); assertEquals("2.7.0", versionResponse.getPiVersion().toString());
assertEquals("2.7.0", versionResponse.getPmVersion().toString()); assertEquals("2.7.0", versionResponse.getPmVersion().toString());
assertNull(versionResponse.getRssi());
assertNull(versionResponse.getGain());
} }
} }