Skip to content

Commit 64d9f79

Browse files
committed
stub for settemprate
1 parent b38a798 commit 64d9f79

File tree

14 files changed

+344
-4
lines changed

14 files changed

+344
-4
lines changed

cliparser/src/main/java/com/jwoglom/pumpx2/cliparser/Main.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,11 @@ private static Set<Characteristic> filterKnownPossibilities(String rawHex, int o
253253
) {
254254
possibilities = ImmutableSet.of(Characteristic.CURRENT_STATUS);
255255
} else if (
256-
(opCode == 37 && len == 148) // InitiateBolusRequest
256+
(opCode == 37 && len == 148) || // InitiateBolusRequest
257+
(opCode == -92 && len == 78) || // SetTempRateRequest
258+
(opCode == -91 && len == 70) || // SetTempRateResponse
259+
(opCode == -90 && len == 66) || // StopTempRateRequest
260+
(opCode == -89 && len == 68) // StopTempRateResponse
257261
) {
258262
possibilities = ImmutableSet.of(Characteristic.CONTROL);
259263
} else if (

messages/src/main/java/com/jwoglom/pumpx2/pump/messages/Messages.java

+6
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@
146146
import com.jwoglom.pumpx2.pump.messages.response.control.SetModesResponse;
147147
import com.jwoglom.pumpx2.pump.messages.request.control.SetSleepScheduleRequest;
148148
import com.jwoglom.pumpx2.pump.messages.response.control.SetSleepScheduleResponse;
149+
import com.jwoglom.pumpx2.pump.messages.request.control.SetTempRateRequest;
150+
import com.jwoglom.pumpx2.pump.messages.response.control.SetTempRateResponse;
151+
import com.jwoglom.pumpx2.pump.messages.request.control.StopTempRateRequest;
152+
import com.jwoglom.pumpx2.pump.messages.response.control.StopTempRateResponse;
149153
// IMPORT_END
150154
import com.jwoglom.pumpx2.shared.L;
151155

@@ -229,6 +233,8 @@ public enum Messages {
229233
UNKNOWN_MOBI_OPCODE_NEG124(UnknownMobiOpcodeNeg124Request.class, UnknownMobiOpcodeNeg124Response.class),
230234
SET_MODES(SetModesRequest.class, SetModesResponse.class),
231235
SET_SLEEP_SCHEDULE(SetSleepScheduleRequest.class, SetSleepScheduleResponse.class),
236+
SET_TEMP_RATE(SetTempRateRequest.class, SetTempRateResponse.class),
237+
STOP_TEMP_RATE(StopTempRateRequest.class, StopTempRateResponse.class),
232238
// MESSAGES_END
233239
;
234240

messages/src/main/java/com/jwoglom/pumpx2/pump/messages/bluetooth/TronMessageWrapper.java

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ public TronMessageWrapper(Message requestMessage, byte currentTxId) {
1919

2020
String authKey = "";
2121
if (requestMessage.signed()) {
22+
if (PumpStateSupplier.authenticationKey == null) {
23+
throw new RuntimeException("PumpStateSupplier.authenticationKey is not set, and a signed message was given to TronMessageWrapper");
24+
}
2225
authKey = PumpStateSupplier.authenticationKey.get();
2326
}
2427
this.packets = Packetize.packetize(requestMessage, authKey, currentTxId);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.jwoglom.pumpx2.pump.messages.request.control;
2+
3+
import com.google.common.base.Preconditions;
4+
import com.jwoglom.pumpx2.pump.messages.bluetooth.Characteristic;
5+
import com.jwoglom.pumpx2.pump.messages.helpers.Bytes;
6+
import com.jwoglom.pumpx2.pump.messages.Message;
7+
import com.jwoglom.pumpx2.pump.messages.MessageType;
8+
import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps;
9+
import com.jwoglom.pumpx2.pump.messages.models.KnownApiVersion;
10+
import com.jwoglom.pumpx2.pump.messages.models.SupportedDevices;
11+
import com.jwoglom.pumpx2.pump.messages.response.control.SetTempRateResponse;
12+
13+
@MessageProps(
14+
opCode=-92,
15+
size=6, // 30 with signed
16+
type=MessageType.REQUEST,
17+
characteristic=Characteristic.CONTROL,
18+
signed=true,
19+
minApi=KnownApiVersion.MOBI_API_V3_5,
20+
supportedDevices=SupportedDevices.MOBI_ONLY,
21+
response=SetTempRateResponse.class
22+
)
23+
public class SetTempRateRequest extends Message {
24+
25+
public SetTempRateRequest() {}
26+
27+
public SetTempRateRequest(byte[] raw) {
28+
parse(raw);
29+
30+
}
31+
32+
public void parse(byte[] raw) {
33+
raw = this.removeSignedRequestHmacBytes(raw);
34+
Preconditions.checkArgument(raw.length == props().size());
35+
this.cargo = raw;
36+
37+
}
38+
39+
40+
public static byte[] buildCargo(int rate) {
41+
return Bytes.combine(
42+
new byte[]{0,0,0,0,0,0}
43+
);
44+
}
45+
46+
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.jwoglom.pumpx2.pump.messages.request.control;
2+
3+
import com.google.common.base.Preconditions;
4+
import com.jwoglom.pumpx2.pump.messages.bluetooth.Characteristic;
5+
import com.jwoglom.pumpx2.pump.messages.helpers.Bytes;
6+
import com.jwoglom.pumpx2.pump.messages.Message;
7+
import com.jwoglom.pumpx2.pump.messages.MessageType;
8+
import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps;
9+
import com.jwoglom.pumpx2.pump.messages.models.KnownApiVersion;
10+
import com.jwoglom.pumpx2.pump.messages.models.SupportedDevices;
11+
import com.jwoglom.pumpx2.pump.messages.response.control.StopTempRateResponse;
12+
13+
@MessageProps(
14+
opCode=-90,
15+
size=0,
16+
type=MessageType.REQUEST,
17+
characteristic=Characteristic.CONTROL,
18+
signed=true,
19+
minApi=KnownApiVersion.MOBI_API_V3_5,
20+
supportedDevices=SupportedDevices.MOBI_ONLY,
21+
response=StopTempRateResponse.class
22+
)
23+
public class StopTempRateRequest extends Message {
24+
public StopTempRateRequest() {
25+
this.cargo = EMPTY;
26+
}
27+
28+
public void parse(byte[] raw) {
29+
raw = this.removeSignedRequestHmacBytes(raw);
30+
Preconditions.checkArgument(raw.length == props().size());
31+
this.cargo = raw;
32+
33+
}
34+
35+
36+
}

messages/src/main/java/com/jwoglom/pumpx2/pump/messages/request/template.j2

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public class {{requestName}} extends Message { {% for arg in requestArgs %}
3131
{% endfor %}{% endif %}
3232
}
3333

34-
public void parse(byte[] raw) {
34+
public void parse(byte[] raw) { {% if catUuid == "CONTROL" %}
35+
raw = this.removeSignedRequestHmacBytes(raw);{% endif %}
3536
Preconditions.checkArgument(raw.length == props().size());
3637
this.cargo = raw;
3738
{% for arg in requestArgs %}this.{{ arg.name }} = {% if arg.size == 1 %}raw[{{ arg.index }}]{% if arg.type == "boolean" %} != 0{% endif %};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.jwoglom.pumpx2.pump.messages.response.control;
2+
3+
import com.google.common.base.Preconditions;
4+
import com.jwoglom.pumpx2.pump.messages.bluetooth.Characteristic;
5+
import com.jwoglom.pumpx2.pump.messages.helpers.Bytes;
6+
import com.jwoglom.pumpx2.pump.messages.Message;
7+
import com.jwoglom.pumpx2.pump.messages.MessageType;
8+
import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps;
9+
import com.jwoglom.pumpx2.pump.messages.models.KnownApiVersion;
10+
import com.jwoglom.pumpx2.pump.messages.models.SupportedDevices;
11+
import com.jwoglom.pumpx2.pump.messages.request.control.SetTempRateRequest;
12+
13+
import java.math.BigInteger;
14+
15+
@MessageProps(
16+
opCode=-91,
17+
size=4,
18+
type=MessageType.RESPONSE,
19+
characteristic=Characteristic.CONTROL,
20+
signed=true,
21+
minApi=KnownApiVersion.MOBI_API_V3_5,
22+
supportedDevices=SupportedDevices.MOBI_ONLY,
23+
request=SetTempRateRequest.class
24+
)
25+
public class SetTempRateResponse extends Message {
26+
27+
28+
public SetTempRateResponse() {}
29+
30+
public SetTempRateResponse(byte[] raw) {
31+
this.cargo = buildCargo(raw);
32+
33+
}
34+
35+
public void parse(byte[] raw) {
36+
raw = this.removeSignedRequestHmacBytes(raw);
37+
Preconditions.checkArgument(raw.length == props().size());
38+
this.cargo = raw;
39+
40+
}
41+
42+
43+
public static byte[] buildCargo(byte[] raw) {
44+
return Bytes.combine(
45+
raw);
46+
}
47+
48+
49+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.jwoglom.pumpx2.pump.messages.response.control;
2+
3+
import com.google.common.base.Preconditions;
4+
import com.jwoglom.pumpx2.pump.messages.bluetooth.Characteristic;
5+
import com.jwoglom.pumpx2.pump.messages.helpers.Bytes;
6+
import com.jwoglom.pumpx2.pump.messages.Message;
7+
import com.jwoglom.pumpx2.pump.messages.MessageType;
8+
import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps;
9+
import com.jwoglom.pumpx2.pump.messages.models.KnownApiVersion;
10+
import com.jwoglom.pumpx2.pump.messages.models.SupportedDevices;
11+
import com.jwoglom.pumpx2.pump.messages.request.control.StopTempRateRequest;
12+
13+
import java.math.BigInteger;
14+
15+
@MessageProps(
16+
opCode=-89,
17+
size=3,
18+
type=MessageType.RESPONSE,
19+
characteristic=Characteristic.CONTROL,
20+
signed=true,
21+
minApi=KnownApiVersion.MOBI_API_V3_5,
22+
supportedDevices=SupportedDevices.MOBI_ONLY,
23+
request=StopTempRateRequest.class
24+
)
25+
public class StopTempRateResponse extends Message {
26+
27+
private int bit1;
28+
private int bit2;
29+
private int bit3;
30+
31+
public StopTempRateResponse() {
32+
}
33+
34+
public StopTempRateResponse(byte[] raw) {
35+
parse(raw);
36+
}
37+
38+
public void parse(byte[] raw) {
39+
raw = this.removeSignedRequestHmacBytes(raw);
40+
Preconditions.checkArgument(raw.length == props().size());
41+
this.cargo = raw;
42+
this.bit1 = raw[0];
43+
this.bit2 = raw[1];
44+
this.bit3 = raw[2];
45+
46+
}
47+
48+
public int getBit1() {
49+
return bit1;
50+
}
51+
52+
public int getBit2() {
53+
return bit2;
54+
}
55+
56+
public int getBit3() {
57+
return bit3;
58+
}
59+
}

messages/src/main/java/com/jwoglom/pumpx2/pump/messages/response/template.j2

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class {{responseName}} extends Message {
3535
{% endif %}{% endfor %}{% endif %}
3636
}
3737

38-
public void parse(byte[] raw) {{% if catUuid == "CONTROL" %}
38+
public void parse(byte[] raw) { {% if catUuid == "CONTROL" %}
3939
raw = this.removeSignedRequestHmacBytes(raw);{% endif %}
4040
Preconditions.checkArgument(raw.length == props().size());
4141
this.cargo = raw;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.jwoglom.pumpx2.pump.messages.request.control;
2+
3+
import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals;
4+
import static com.jwoglom.pumpx2.pump.messages.MessageTester.initPumpState;
5+
6+
import com.jwoglom.pumpx2.pump.messages.MessageTester;
7+
import com.jwoglom.pumpx2.pump.messages.PacketArrayList;
8+
import com.jwoglom.pumpx2.pump.messages.bluetooth.CharacteristicUUID;
9+
10+
import org.apache.commons.codec.DecoderException;
11+
import org.junit.Test;
12+
13+
public class SetTempRateRequestTest {
14+
@Test
15+
public void testSetTempRateRequest_95pct_15min() throws DecoderException {
16+
// TimeSinceResetResponse[currentTime=512443560,pumpTimeSinceReset=1906112,cargo={-88,68,-117,30,-64,21,29,0}]
17+
initPumpState(PacketArrayList.IGNORE_INVALID_HMAC, 1906112L);
18+
19+
// Temp Rate 95% for 15m
20+
SetTempRateRequest expected = new SetTempRateRequest(
21+
new byte[]{-96,-69,13,0,95,0}
22+
);
23+
24+
SetTempRateRequest parsedReq = (SetTempRateRequest) MessageTester.test(
25+
// Untitled_2_Live_-_Humans_iPhone 2
26+
// 2024-03-28T00:26:21.525000+00:00
27+
"0122a4221ea0bb0d005f001c998b1e37eacb5339",
28+
34,
29+
1,
30+
CharacteristicUUID.CONTROL_CHARACTERISTICS,
31+
expected,
32+
"00227c57675fc47f8c9bf5dec1f0d31d42a4b7"
33+
);
34+
35+
assertHexEquals(expected.getCargo(), parsedReq.getCargo());
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.jwoglom.pumpx2.pump.messages.request.control;
2+
3+
import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals;
4+
import static com.jwoglom.pumpx2.pump.messages.MessageTester.initPumpState;
5+
6+
import com.jwoglom.pumpx2.pump.messages.MessageTester;
7+
import com.jwoglom.pumpx2.pump.messages.PacketArrayList;
8+
import com.jwoglom.pumpx2.pump.messages.bluetooth.CharacteristicUUID;
9+
import com.jwoglom.pumpx2.pump.messages.request.control.StopTempRateRequest;
10+
11+
import org.apache.commons.codec.DecoderException;
12+
import org.junit.Test;
13+
14+
public class StopTempRateRequestTest {
15+
@Test
16+
public void testStopTempRateRequest() throws DecoderException {
17+
// TimeSinceResetResponse[currentTime=512443560,pumpTimeSinceReset=1906112,cargo={-88,68,-117,30,-64,21,29,0}]
18+
initPumpState(PacketArrayList.IGNORE_INVALID_HMAC, 1906112L);
19+
20+
// empty cargo
21+
StopTempRateRequest expected = new StopTempRateRequest();
22+
23+
StopTempRateRequest parsedReq = (StopTempRateRequest) MessageTester.test(
24+
"012ca62c182c998b1e92605660ce66863620411d",
25+
44,
26+
2,
27+
CharacteristicUUID.CONTROL_CHARACTERISTICS,
28+
expected,
29+
"002c0d420615066cb0f317766c"
30+
);
31+
32+
assertHexEquals(expected.getCargo(), parsedReq.getCargo());
33+
}
34+
}

messages/src/test/java/com/jwoglom/pumpx2/pump/messages/request/template.j2

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class {{requestName}}Test {
1919
"xxxx",
2020
3,
2121
1,
22-
CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS,
22+
CharacteristicUUID.{{catUuid}}_CHARACTERISTICS,
2323
expected
2424
);
2525

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.jwoglom.pumpx2.pump.messages.response.control;
2+
3+
import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals;
4+
import static com.jwoglom.pumpx2.pump.messages.MessageTester.initPumpState;
5+
6+
import com.jwoglom.pumpx2.pump.messages.MessageTester;
7+
import com.jwoglom.pumpx2.pump.messages.bluetooth.CharacteristicUUID;
8+
9+
import org.apache.commons.codec.DecoderException;
10+
import org.junit.Test;
11+
12+
public class SetTempRateResponseTest {
13+
@Test
14+
public void testSetTempRateResponse() throws DecoderException {
15+
initPumpState("authenticationKey", 0L);
16+
17+
SetTempRateResponse expected = new SetTempRateResponse(
18+
// byte[] raw
19+
);
20+
21+
SetTempRateResponse parsedRes = (SetTempRateResponse) MessageTester.test(
22+
"xxxx",
23+
3,
24+
1,
25+
CharacteristicUUID.CONTROL_CHARACTERISTICS,
26+
expected
27+
);
28+
29+
assertHexEquals(expected.getCargo(), parsedRes.getCargo());
30+
}
31+
}

0 commit comments

Comments
 (0)