├── .idea ├── .name ├── .gitignore ├── compiler.xml ├── vcs.xml ├── misc.xml └── gradle.xml ├── app ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── values │ │ │ ├── dimens.xml │ │ │ ├── colors.xml │ │ │ ├── request_message_list_options.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ ├── values-land │ │ │ └── dimens.xml │ │ ├── values-w1240dp │ │ │ └── dimens.xml │ │ ├── values-w600dp │ │ │ └── dimens.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── menu │ │ │ └── menu_main.xml │ │ ├── values-night │ │ │ └── themes.xml │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ └── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── lib └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── jwoglom │ │ │ └── pumpx2 │ │ │ ├── pump │ │ │ ├── events │ │ │ │ ├── Event.java │ │ │ │ ├── BTScanForPumpEvent.java │ │ │ │ ├── BTPermissionsGrantedEvent.java │ │ │ │ ├── BTConnectedToPumpEvent.java │ │ │ │ ├── SendPumpMessageEvent.java │ │ │ │ ├── TriggerConnectionInitEvent.java │ │ │ │ ├── BTConnStateChangedEvent.java │ │ │ │ ├── BTConnectToPumpEvent.java │ │ │ │ ├── BTRequestPermissionsEvent.java │ │ │ │ ├── BTProcessGattOperationEvent.java │ │ │ │ └── PumpResponseMessageEvent.java │ │ │ ├── messages │ │ │ │ ├── MessageType.java │ │ │ │ ├── UndefinedMessage.java │ │ │ │ ├── response │ │ │ │ │ ├── currentStatus │ │ │ │ │ │ ├── CurrentBatteryAbstractResponse.java │ │ │ │ │ │ ├── PumpFeaturesAbstractResponse.java │ │ │ │ │ │ ├── HistoryLogResponse.java │ │ │ │ │ │ ├── CGMHardwareInfoResponse.java │ │ │ │ │ │ └── CurrentBatteryV1Response.java │ │ │ │ │ ├── historyLog │ │ │ │ │ │ ├── HistoryLog.java │ │ │ │ │ │ ├── DateChangeResponse.java │ │ │ │ │ │ └── DateChangeHistoryLog.java │ │ │ │ │ └── authentication │ │ │ │ │ │ └── PumpChallengeResponse.java │ │ │ │ ├── helpers │ │ │ │ │ └── Dates.java │ │ │ │ ├── builders │ │ │ │ │ ├── CentralChallengeBuilder.java │ │ │ │ │ ├── PumpFeaturesBuilder.java │ │ │ │ │ ├── PumpChallengeBuilder.java │ │ │ │ │ └── CurrentBatteryBuilder.java │ │ │ │ ├── TransactionId.java │ │ │ │ ├── README.md │ │ │ │ ├── models │ │ │ │ │ ├── MinsTime.java │ │ │ │ │ └── MultiDay.java │ │ │ │ ├── request │ │ │ │ │ ├── currentStatus │ │ │ │ │ │ ├── ApiVersionRequest.java │ │ │ │ │ │ ├── AlarmStatusRequest.java │ │ │ │ │ │ ├── AlertStatusRequest.java │ │ │ │ │ │ ├── ControlIQIOBRequest.java │ │ │ │ │ │ ├── CGMHardwareInfoRequest.java │ │ │ │ │ │ ├── LastBGRequest.java │ │ │ │ │ │ ├── CGMStatusRequest.java │ │ │ │ │ │ ├── PumpGlobalsRequest.java │ │ │ │ │ │ ├── NonControlIQIOBRequest.java │ │ │ │ │ │ ├── TempRateRequest.java │ │ │ │ │ │ ├── PumpSettingsRequest.java │ │ │ │ │ │ ├── RemindersRequest.java │ │ │ │ │ │ ├── InsulinStatusRequest.java │ │ │ │ │ │ ├── PumpFeaturesV1Request.java │ │ │ │ │ │ ├── PumpVersionRequest.java │ │ │ │ │ │ ├── ControlIQInfoV1Request.java │ │ │ │ │ │ ├── CurrentBatteryV1Request.java │ │ │ │ │ │ ├── CurrentBatteryV2Request.java │ │ │ │ │ │ ├── CGMAlertStatusRequest.java │ │ │ │ │ │ ├── PumpFeaturesV2Request.java │ │ │ │ │ │ ├── ReminderStatusRequest.java │ │ │ │ │ │ ├── TimeSinceResetRequest.java │ │ │ │ │ │ ├── ControlIQInfoV2Request.java │ │ │ │ │ │ ├── CurrentBasalStatusRequest.java │ │ │ │ │ │ ├── CurrentBolusStatusRequest.java │ │ │ │ │ │ ├── CurrentEGVGuiDataRequest.java │ │ │ │ │ │ ├── BasalLimitSettingsRequest.java │ │ │ │ │ │ ├── CGMOORAlertSettingsRequest.java │ │ │ │ │ │ ├── ControlIQSleepScheduleRequest.java │ │ │ │ │ │ ├── CGMRateAlertSettingsRequest.java │ │ │ │ │ │ ├── GlobalMaxBolusSettingsRequest.java │ │ │ │ │ │ ├── CGMGlucoseAlertSettingsRequest.java │ │ │ │ │ │ ├── BasalIQStatusRequest.java │ │ │ │ │ │ ├── ProfileStatusRequest.java │ │ │ │ │ │ ├── BasalIQSettingsRequest.java │ │ │ │ │ │ ├── HistoryLogStatusRequest.java │ │ │ │ │ │ ├── HomeScreenMirrorRequest.java │ │ │ │ │ │ ├── ExtendedBolusStatusRequest.java │ │ │ │ │ │ ├── BasalIQAlertInfoRequest.java │ │ │ │ │ │ └── IDPSegmentRequest.java │ │ │ │ │ ├── NonexistentErrorRequest.java │ │ │ │ │ └── historyLog │ │ │ │ │ │ └── NonexistentHistoryLogStreamRequest.java │ │ │ │ └── annotations │ │ │ │ │ └── MessageProps.java │ │ │ └── bluetooth │ │ │ │ ├── PumpConfig.java │ │ │ │ ├── ServiceUUID.java │ │ │ │ └── models │ │ │ │ └── Packet.java │ │ │ ├── util │ │ │ └── timber │ │ │ │ └── DebugTree.java │ │ │ └── shared │ │ │ ├── EventService.java │ │ │ └── L.java │ └── AndroidManifest.xml │ ├── test │ └── java │ │ └── com │ │ └── jwoglom │ │ └── pumpx2 │ │ ├── ExampleUnitTest.java │ │ ├── JavaHelpersTest.java │ │ └── pump │ │ └── messages │ │ ├── request │ │ ├── currentStatus │ │ │ ├── ApiVersionRequestTest.java │ │ │ ├── AlertStatusRequestTest.java │ │ │ ├── ControlIQInfoV1RequestTest.java │ │ │ ├── PumpFeaturesV1RequestTest.java │ │ │ ├── PumpFeaturesV2RequestTest.java │ │ │ ├── LastBGRequestTest.java │ │ │ ├── BasalLimitSettingsRequestTest.java │ │ │ ├── TempRateRequestTest.java │ │ │ ├── CGMStatusRequestTest.java │ │ │ ├── RemindersRequestTest.java │ │ │ ├── HistoryLogRequestTest.java │ │ │ ├── IDPSegmentRequestTest.java │ │ │ ├── PumpVersionRequestTest.java │ │ │ ├── AlarmStatusRequestTest.java │ │ │ ├── PumpGlobalsRequestTest.java │ │ │ ├── PumpSettingsRequestTest.java │ │ │ ├── BasalIQStatusRequestTest.java │ │ │ ├── ControlIQIOBRequestTest.java │ │ │ ├── InsulinStatusRequestTest.java │ │ │ ├── ProfileStatusRequestTest.java │ │ │ ├── CGMAlertStatusRequestTest.java │ │ │ ├── ReminderStatusRequestTest.java │ │ │ ├── TimeSinceResetRequestTest.java │ │ │ ├── BasalIQSettingsRequestTest.java │ │ │ ├── BasalIQAlertInfoRequestTest.java │ │ │ ├── CGMHardwareInfoRequestTest.java │ │ │ ├── CurrentBatteryV1RequestTest.java │ │ │ ├── HistoryLogStatusRequestTest.java │ │ │ ├── HomeScreenMirrorRequestTest.java │ │ │ ├── CurrentEGVGuiDataRequestTest.java │ │ │ ├── CurrentBasalStatusRequestTest.java │ │ │ ├── CurrentBolusStatusRequestTest.java │ │ │ ├── CGMOORAlertSettingsRequestTest.java │ │ │ ├── ExtendedBolusStatusRequestTest.java │ │ │ ├── CGMRateAlertSettingsRequestTest.java │ │ │ ├── ControlIQInfoV2RequestTest.java │ │ │ ├── ControlIQSleepScheduleRequestTest.java │ │ │ ├── GlobalMaxBolusSettingsRequestTest.java │ │ │ ├── CGMGlucoseAlertSettingsRequestTest.java │ │ │ └── CurrentBatteryV2RequestTest.java │ │ ├── template.j2 │ │ └── authentication │ │ │ ├── CentralChallengeRequestTest.java │ │ │ └── PumpChallengeRequestTest.java │ │ ├── response │ │ ├── historyLog │ │ │ ├── template.j2 │ │ │ ├── BolexCompletedHistoryLogTest.java │ │ │ ├── BGHistoryLogTest.java │ │ │ ├── BolusCompletedHistoryLogTest.java │ │ │ ├── DateChangeHistoryLogTest.java │ │ │ ├── BolusRequestedMsg3HistoryLogTest.java │ │ │ └── TimeChangeHistoryLogTest.java │ │ ├── template.j2 │ │ ├── currentStatus │ │ │ ├── HistoryLogResponseTest.java │ │ │ ├── LastBGResponseTest.java │ │ │ ├── PumpFeaturesV2ResponseTest.java │ │ │ ├── ApiVersionResponseTest.java │ │ │ ├── BasalLimitSettingsResponseTest.java │ │ │ ├── CGMAlertStatusResponseTest.java │ │ │ ├── ReminderStatusResponseTest.java │ │ │ ├── TempRateResponseTest.java │ │ │ ├── CGMHardwareInfoResponseTest.java │ │ │ ├── InsulinStatusResponseTest.java │ │ │ ├── BasalIQAlertInfoResponseTest.java │ │ │ ├── BasalIQStatusResponseTest.java │ │ │ ├── CGMStatusResponseTest.java │ │ │ ├── BasalIQSettingsResponseTest.java │ │ │ ├── HistoryLogStatusResponseTest.java │ │ │ ├── CurrentBasalStatusResponseTest.java │ │ │ ├── GlobalMaxBolusSettingsResponseTest.java │ │ │ ├── CGMOORAlertSettingsResponseTest.java │ │ │ ├── ProfileStatusResponseTest.java │ │ │ ├── CurrentBolusStatusResponseTest.java │ │ │ ├── CurrentEGVGuiDataResponseTest.java │ │ │ ├── ExtendedBolusStatusResponseTest.java │ │ │ ├── PumpVersionResponseTest.java │ │ │ ├── PumpSettingsResponseTest.java │ │ │ ├── CurrentBatteryV2ResponseTest.java │ │ │ ├── ControlIQInfoV2ResponseTest.java │ │ │ ├── ControlIQIOBResponseTest.java │ │ │ ├── PumpFeaturesV1ResponseTest.java │ │ │ └── PumpGlobalsResponseTest.java │ │ ├── authentication │ │ │ ├── CentralChallengeResponseTest.java │ │ │ └── PumpChallengeResponseTest.java │ │ └── ErrorResponseTest.java │ │ ├── helpers │ │ └── BytesTest.java │ │ └── OpCodeFinderTest.java │ └── androidTest │ └── java │ └── com │ └── jwoglom │ └── pumpx2 │ └── ExampleInstrumentedTest.java ├── .gitattributes ├── .gitignore ├── settings.gradle ├── .github └── workflows │ └── code-coverage.yml ├── LICENSE.md └── gradle.properties /.idea/.name: -------------------------------------------------------------------------------- 1 | PumpX2 -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 48dp 3 | -------------------------------------------------------------------------------- /app/src/main/res/values-w1240dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 200dp 3 | -------------------------------------------------------------------------------- /app/src/main/res/values-w600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 48dp 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/Event.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | public class Event { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rifkyprayoga/pumpX2/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/MessageType.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages; 2 | 3 | public enum MessageType { 4 | REQUEST, 5 | RESPONSE 6 | } 7 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/BTScanForPumpEvent.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | public class BTScanForPumpEvent extends Event { 4 | public BTScanForPumpEvent() {} 5 | 6 | public String toString() { 7 | return "BTScanForPumpEvent()"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/BTPermissionsGrantedEvent.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | public class BTPermissionsGrantedEvent extends Event { 4 | public BTPermissionsGrantedEvent() {} 5 | 6 | public String toString() { 7 | return "BTPermissionsGrantedEvent()"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/UndefinedMessage.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages; 2 | 3 | import org.apache.commons.lang3.NotImplementedException; 4 | 5 | public class UndefinedMessage extends Message { 6 | public UndefinedMessage() {} 7 | 8 | @Override 9 | public void parse(byte[] raw) { 10 | throw new NotImplementedException(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/CurrentBatteryAbstractResponse.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | 5 | public abstract class CurrentBatteryAbstractResponse extends Message { 6 | public abstract int getCurrentBatteryAbc(); 7 | public abstract int getCurrentBatteryIbc(); 8 | } 9 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/bluetooth/PumpConfig.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.bluetooth; 2 | 3 | public class PumpConfig { 4 | 5 | public static String pumpSerial = "90556643"; 6 | public static String pumpMAC = "F7:9F:58:02:A9:3C"; 7 | 8 | public static String bluetoothName() { 9 | return "tslim X2 ***" + pumpSerial.substring(pumpSerial.length()-3); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/PumpFeaturesAbstractResponse.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | 5 | import java.util.Set; 6 | 7 | public abstract class PumpFeaturesAbstractResponse extends Message { 8 | public abstract Set getFeatures(); 9 | } 10 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/util/timber/DebugTree.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.util.timber; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import timber.log.Timber; 6 | 7 | public class DebugTree extends Timber.DebugTree { 8 | @Override 9 | public void log(int priority, String tag, @NonNull String message, Throwable t) { 10 | super.log(priority, "X2:"+tag, message, t); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /example/local.properties 5 | /.idea/caches 6 | /.idea/libraries 7 | /.idea/modules.xml 8 | /.idea/workspace.xml 9 | /.idea/navEditor.xml 10 | /.idea/assetWizardSettings.xml 11 | .DS_Store 12 | /build 13 | /example/build 14 | /captures 15 | /example/captures 16 | .externalNativeBuild 17 | .cxx 18 | local.properties 19 | PumpPrivateConfig.java 20 | 21 | # Ignore Gradle build output directory 22 | build 23 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 10 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /lib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/bluetooth/ServiceUUID.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.bluetooth; 2 | 3 | import java.util.UUID; 4 | 5 | public class ServiceUUID { 6 | // Pump-specific UUID used for all known functions 7 | public static final UUID PUMP_SERVICE_UUID = UUID.fromString("0000fdfb-0000-1000-8000-00805f9b34fb"); 8 | 9 | // Generic Bluetooth Device Information service (DIS) 10 | public static final UUID DIS_SERVICE_UUID = UUID.fromString("0000180A-0000-1000-8000-00805f9b34fb"); 11 | } 12 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/BTConnectedToPumpEvent.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | 4 | public class BTConnectedToPumpEvent { 5 | // private final RxBleDevice device; 6 | // 7 | // public BTConnectedToPumpEvent(RxBleDevice device) { 8 | // this.device = device; 9 | // } 10 | // 11 | // public RxBleDevice device() { 12 | // return device; 13 | // } 14 | // 15 | // public String toString() { 16 | // return "BTConnectedToPumpEvent(device="+device+")"; 17 | // } 18 | } 19 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/SendPumpMessageEvent.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | 5 | public class SendPumpMessageEvent { 6 | private final Message message; 7 | public SendPumpMessageEvent(Message message) { 8 | this.message = message; 9 | } 10 | 11 | public Message message() { 12 | return message; 13 | } 14 | 15 | public String toString() { 16 | return "SendPumpMessageEvent(message=" + message + ")"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/helpers/Dates.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.helpers; 2 | 3 | import java.time.Instant; 4 | import java.util.Date; 5 | import java.util.concurrent.TimeUnit; 6 | 7 | public class Dates { 8 | public static long fromJan12008ToUnixEpochSeconds(long seconds) { 9 | return seconds + 1199145600; 10 | } 11 | 12 | public static Instant fromJan12008EpochSecondsToDate(long seconds) { 13 | return Instant.ofEpochSecond(fromJan12008ToUnixEpochSeconds(seconds)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | maven { 7 | url 'https://jitpack.io' 8 | } 9 | } 10 | } 11 | dependencyResolutionManagement { 12 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 13 | repositories { 14 | google() 15 | mavenCentral() 16 | maven { 17 | url 'https://jitpack.io' 18 | } 19 | } 20 | } 21 | rootProject.name = "PumpX2" 22 | include ':app', ':lib' 23 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/TriggerConnectionInitEvent.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | import android.app.Activity; 4 | 5 | public class TriggerConnectionInitEvent { 6 | 7 | private final Activity activity; 8 | public TriggerConnectionInitEvent(Activity activity) { 9 | this.activity = activity; 10 | } 11 | 12 | public Activity activity() { 13 | return activity; 14 | } 15 | 16 | public String toString() { 17 | return "TriggerConnectionInitEvent(activity=" + activity + ")"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/builders/CentralChallengeBuilder.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.builders; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.helpers.Bytes; 4 | import com.jwoglom.pumpx2.pump.messages.request.authentication.CentralChallengeRequest; 5 | 6 | public class CentralChallengeBuilder { 7 | public static CentralChallengeRequest create(int appInstanceId) { 8 | byte[] centralChallenge = Bytes.getSecureRandom10Bytes(); 9 | return new CentralChallengeRequest(appInstanceId, centralChallenge); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/TransactionId.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages; 2 | 3 | public class TransactionId { 4 | private int txId = 0; 5 | 6 | public void set(int i) { 7 | if (i < 0 || i > 255) { 8 | i = 0; 9 | } 10 | txId = i; 11 | } 12 | 13 | public void increment() { 14 | set(txId + 1); 15 | } 16 | 17 | public byte get() { 18 | return (byte) txId; 19 | } 20 | 21 | public String toString() { 22 | return "TransactionId(txId="+txId+")"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/README.md: -------------------------------------------------------------------------------- 1 | ## t:slim X2 Bluetooth Protocol 2 | 3 | When the t:connect app initializes on first launch: 4 | 5 | * sends **CentralChallengeRequest** with centralChallenge random bytes 6 | * receives **CentralChallengeResponse** with new bytes 7 | 8 | 9 | * sends **PumpChallengeRequest** with pumpChallengeHash (hmac sha1 of the pump's Pairing Code) 10 | * receives **PumpChallengeResponse** with success status 11 | 12 | 13 | * sends **ApiVersionRequest** with empty cargo 14 | * receives **ApiVersionResponse** with major and minor bluetooth API version 15 | -------------------------------------------------------------------------------- /app/src/main/res/values/request_message_list_options.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | AlarmStatusRequest 5 | AlertStatusRequest 6 | CGMHardwareInfoRequest 7 | ControlIQIOBRequest 8 | NonControlIQIOBRequest 9 | PumpFeaturesRequest 10 | PumpGlobalsRequest 11 | PumpSettingsRequest 12 | CGMStatusRequest 13 | 14 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/shared/EventService.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.shared; 2 | 3 | 4 | import android.app.Service; 5 | import android.content.Intent; 6 | import android.os.IBinder; 7 | 8 | import androidx.annotation.Nullable; 9 | 10 | import com.google.common.base.Strings; 11 | 12 | public class EventService extends Service { 13 | public static String TAG = "X2-" + Strings.nullToEmpty(new Object(){}.getClass().getEnclosingClass().getSimpleName()); 14 | 15 | @Nullable 16 | @Override 17 | public IBinder onBind(Intent intent) { 18 | return null; 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | PumpX2 3 | Settings 4 | 5 | First Fragment 6 | Second Fragment 7 | Next 8 | Previous 9 | 10 | Hello first fragment 11 | Hello second fragment. Arg: %1$s 12 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/BTConnStateChangedEvent.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | public class BTConnStateChangedEvent { 4 | // private final RxBleConnection.RxBleConnectionState state; 5 | // public BTConnStateChangedEvent(RxBleConnection.RxBleConnectionState state) { 6 | // this.state = state; 7 | // } 8 | // 9 | // public RxBleConnection.RxBleConnectionState state() { 10 | // return state; 11 | // } 12 | // 13 | // public String toString() { 14 | // return "BTConnStateChangedEvent(state=" + state + ")"; 15 | // } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/BTConnectToPumpEvent.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | public class BTConnectToPumpEvent extends Event { 4 | private String deviceName; 5 | private String macAddress; 6 | 7 | public BTConnectToPumpEvent(String deviceName, String macAddress) { 8 | this.deviceName = deviceName; 9 | this.macAddress = macAddress; 10 | } 11 | 12 | public String deviceName() { return deviceName; } 13 | public String macAddress() { return macAddress; } 14 | 15 | public String toString() { 16 | return "BTConnectToPumpEvent(deviceName="+deviceName+", macAddress="+macAddress+")"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/events/BTRequestPermissionsEvent.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.events; 2 | 3 | import android.app.Activity; 4 | 5 | public class BTRequestPermissionsEvent { 6 | private int attempt; 7 | private final Activity activity; 8 | public BTRequestPermissionsEvent(int attempt, Activity activity) { 9 | this.attempt = attempt; 10 | this.activity = activity; 11 | } 12 | 13 | public int attempt() { 14 | return attempt; 15 | } 16 | 17 | public Activity activity() { 18 | return activity; 19 | } 20 | 21 | public String toString() { 22 | return "BTRequestPermissionsEvent(attempt="+attempt+", activity="+activity+")"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/models/MinsTime.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.models; 2 | 3 | /** 4 | * Used by ControlIQSleepScheduleResponse and RemindersResponse.Reminder 5 | */ 6 | public class MinsTime { 7 | private final int hour; 8 | private final int min; 9 | 10 | public MinsTime(int totalMins) { 11 | this.hour = totalMins / 60; 12 | this.min = totalMins % 60; 13 | } 14 | 15 | public MinsTime(int hour, int min) { 16 | this.hour = hour; 17 | this.min = min; 18 | } 19 | 20 | public int hour() { 21 | return hour; 22 | } 23 | 24 | public int min() { 25 | return min; 26 | } 27 | 28 | public int encode() { 29 | return hour*60 + min; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ApiVersionRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 6 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ApiVersionResponse; 7 | 8 | @MessageProps( 9 | opCode=32, 10 | size=0, 11 | type=MessageType.REQUEST, 12 | response=ApiVersionResponse.class 13 | ) 14 | public class ApiVersionRequest extends Message { 15 | public ApiVersionRequest() { 16 | this.cargo = EMPTY; 17 | } 18 | 19 | public void parse(byte[] raw) { 20 | this.cargo = raw; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/AlarmStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 6 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.AlarmStatusResponse; 7 | 8 | @MessageProps( 9 | opCode=70, 10 | size=0, 11 | type= MessageType.REQUEST, 12 | response= AlarmStatusResponse.class 13 | ) 14 | public class AlarmStatusRequest extends Message { 15 | public AlarmStatusRequest() { 16 | this.cargo = EMPTY; 17 | } 18 | 19 | public void parse(byte[] raw) { 20 | this.cargo = raw; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/AlertStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 6 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.AlertStatusResponse; 7 | 8 | @MessageProps( 9 | opCode=68, 10 | size=0, 11 | type= MessageType.REQUEST, 12 | response= AlertStatusResponse.class 13 | ) 14 | public class AlertStatusRequest extends Message { 15 | public AlertStatusRequest() { 16 | this.cargo = EMPTY; 17 | } 18 | 19 | public void parse(byte[] raw) { 20 | this.cargo = raw; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ControlIQIOBRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 6 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ControlIQIOBResponse; 7 | 8 | @MessageProps( 9 | opCode=108, 10 | size=0, 11 | type=MessageType.REQUEST, 12 | response= ControlIQIOBResponse.class 13 | ) 14 | public class ControlIQIOBRequest extends Message { 15 | public ControlIQIOBRequest() { 16 | this.cargo = EMPTY; 17 | } 18 | 19 | public void parse(byte[] raw) { 20 | this.cargo = raw; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMHardwareInfoRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 6 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CGMHardwareInfoResponse; 7 | 8 | @MessageProps( 9 | opCode=96, 10 | size=0, 11 | type= MessageType.REQUEST, 12 | response= CGMHardwareInfoResponse.class 13 | ) 14 | public class CGMHardwareInfoRequest extends Message { 15 | public CGMHardwareInfoRequest() { 16 | this.cargo = EMPTY; 17 | } 18 | 19 | public void parse(byte[] raw) { 20 | this.cargo = raw; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/LastBGRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.LastBGResponse; 8 | 9 | @MessageProps( 10 | opCode=50, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=LastBGResponse.class 14 | ) 15 | public class LastBGRequest extends Message { 16 | public LastBGRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /lib/src/androidTest/java/com/jwoglom/pumpx2/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("com.jwoglom.pumpx2.test", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CGMStatusResponse; 8 | 9 | @MessageProps( 10 | opCode=80, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CGMStatusResponse.class 14 | ) 15 | public class CGMStatusRequest extends Message { 16 | public CGMStatusRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpGlobalsRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.PumpGlobalsResponse; 8 | 9 | @MessageProps( 10 | opCode=86, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=PumpGlobalsResponse.class 14 | ) 15 | public class PumpGlobalsRequest extends Message { 16 | 17 | public PumpGlobalsRequest() { 18 | this.cargo = EMPTY; 19 | } 20 | 21 | public void parse(byte[] raw) { 22 | Preconditions.checkArgument(raw.length == props().size()); 23 | this.cargo = raw; 24 | } 25 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/NonControlIQIOBRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 6 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.NonControlIQIOBResponse; 7 | 8 | /** 9 | * ControlIQIOBRequest should be used instead if control IQ is supported 10 | */ 11 | @MessageProps( 12 | opCode=38, 13 | size=0, 14 | type=MessageType.REQUEST, 15 | response= NonControlIQIOBResponse.class 16 | ) 17 | public class NonControlIQIOBRequest extends Message { 18 | public NonControlIQIOBRequest() { 19 | this.cargo = EMPTY; 20 | } 21 | 22 | public void parse(byte[] raw) { 23 | this.cargo = raw; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/TempRateRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.TempRateResponse; 8 | 9 | @MessageProps( 10 | opCode=42, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=TempRateResponse.class 14 | ) 15 | public class TempRateRequest extends Message { 16 | public TempRateRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpSettingsRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.PumpSettingsResponse; 8 | 9 | @MessageProps( 10 | opCode=82, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=PumpSettingsResponse.class 14 | ) 15 | public class PumpSettingsRequest extends Message { 16 | 17 | public PumpSettingsRequest() { 18 | this.cargo = EMPTY; 19 | } 20 | 21 | public void parse(byte[] raw) { 22 | Preconditions.checkArgument(raw.length == props().size()); 23 | this.cargo = raw; 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/RemindersRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.RemindersResponse; 8 | 9 | @MessageProps( 10 | opCode=88, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=RemindersResponse.class 14 | ) 15 | public class RemindersRequest extends Message { 16 | public RemindersRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/InsulinStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.InsulinStatusResponse; 8 | 9 | @MessageProps( 10 | opCode=36, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=InsulinStatusResponse.class 14 | ) 15 | public class InsulinStatusRequest extends Message { 16 | public InsulinStatusRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpFeaturesV1Request.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.PumpFeaturesV1Response; 8 | 9 | @MessageProps( 10 | opCode=78, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=PumpFeaturesV1Response.class 14 | ) 15 | public class PumpFeaturesV1Request extends Message { 16 | 17 | 18 | public PumpFeaturesV1Request() { 19 | this.cargo = EMPTY; 20 | } 21 | 22 | public void parse(byte[] raw) { 23 | Preconditions.checkArgument(raw.length == props().size()); 24 | this.cargo = raw; 25 | } 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpVersionRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.PumpVersionResponse; 8 | 9 | @MessageProps( 10 | opCode=84, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=PumpVersionResponse.class 14 | ) 15 | public class PumpVersionRequest extends Message { 16 | public PumpVersionRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ControlIQInfoV1Request.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ControlIQInfoV1Response; 8 | 9 | @MessageProps( 10 | opCode=104, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response= ControlIQInfoV1Response.class 14 | ) 15 | public class ControlIQInfoV1Request extends Message { 16 | public ControlIQInfoV1Request() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/shared/L.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.shared; 2 | 3 | import android.util.Log; 4 | 5 | public class L { 6 | public static void w(String tag, String out) { 7 | try { 8 | Log.w(tag, out); 9 | } catch (RuntimeException e) { 10 | System.out.println("WARN: " + tag + ": " + out); 11 | } 12 | } 13 | 14 | public static void w(String tag, Throwable out) { 15 | try { 16 | Log.w(tag, out); 17 | } catch (RuntimeException e) { 18 | System.out.println("WARN: " + tag + ": " + out); 19 | } 20 | } 21 | 22 | private static boolean isJUnitTest() { 23 | for (StackTraceElement element : Thread.currentThread().getStackTrace()) { 24 | if (element.getClassName().startsWith("org.junit.")) { 25 | return true; 26 | } 27 | } 28 | return false; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentBatteryV1Request.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CurrentBatteryV1Response; 8 | 9 | @MessageProps( 10 | opCode=52, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CurrentBatteryV1Response.class 14 | ) 15 | public class CurrentBatteryV1Request extends Message { 16 | public CurrentBatteryV1Request() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentBatteryV2Request.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CurrentBatteryV2Response; 8 | 9 | @MessageProps( 10 | opCode=-112, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CurrentBatteryV2Response.class 14 | ) 15 | public class CurrentBatteryV2Request extends Message { 16 | public CurrentBatteryV2Request() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMAlertStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CGMAlertStatusResponse; 8 | 9 | @MessageProps( 10 | opCode=74, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CGMAlertStatusResponse.class 14 | ) 15 | public class CGMAlertStatusRequest extends Message { 16 | public CGMAlertStatusRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpFeaturesV2Request.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.PumpFeaturesV2Response; 8 | 9 | @MessageProps( 10 | opCode=-96, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=PumpFeaturesV2Response.class 14 | ) 15 | public class PumpFeaturesV2Request extends Message { 16 | public PumpFeaturesV2Request() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ReminderStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ReminderStatusResponse; 8 | 9 | @MessageProps( 10 | opCode=72, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=ReminderStatusResponse.class 14 | ) 15 | public class ReminderStatusRequest extends Message { 16 | public ReminderStatusRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/TimeSinceResetRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.TimeSinceResetResponse; 8 | 9 | @MessageProps( 10 | opCode=54, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=TimeSinceResetResponse.class 14 | ) 15 | public class TimeSinceResetRequest extends Message { 16 | public TimeSinceResetRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/annotations/MessageProps.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.annotations; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.UndefinedMessage; 6 | 7 | import java.lang.annotation.ElementType; 8 | import java.lang.annotation.Retention; 9 | import java.lang.annotation.RetentionPolicy; 10 | import java.lang.annotation.Target; 11 | 12 | @Target(ElementType.TYPE) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | public @interface MessageProps { 15 | int opCode(); 16 | int size() default 0; 17 | boolean variableSize() default false; 18 | boolean stream() default false; 19 | boolean signed() default false; 20 | MessageType type(); 21 | Class response() default UndefinedMessage.class; 22 | Class request() default UndefinedMessage.class; 23 | } 24 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/NonexistentErrorRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 6 | import com.jwoglom.pumpx2.pump.messages.response.ErrorResponse; 7 | 8 | /** 9 | * This message is used as a paired request message for responses which can occur 10 | * either in response to any request message (e.g. ErrorResponse). 11 | */ 12 | @MessageProps( 13 | opCode=-99999999, 14 | size=0, 15 | type=MessageType.REQUEST, 16 | response=ErrorResponse.class 17 | ) 18 | public class NonexistentErrorRequest extends Message { 19 | 20 | public NonexistentErrorRequest() { 21 | this.cargo = EMPTY; 22 | } 23 | 24 | public void parse(byte[] raw) { 25 | this.cargo = raw; 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ControlIQInfoV2Request.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ControlIQInfoV2Response; 8 | 9 | @MessageProps( 10 | opCode=-78, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=ControlIQInfoV2Response.class 14 | ) 15 | public class ControlIQInfoV2Request extends Message { 16 | public ControlIQInfoV2Request() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentBasalStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CurrentBasalStatusResponse; 8 | 9 | @MessageProps( 10 | opCode=40, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CurrentBasalStatusResponse.class 14 | ) 15 | public class CurrentBasalStatusRequest extends Message { 16 | public CurrentBasalStatusRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentBolusStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CurrentBolusStatusResponse; 8 | 9 | @MessageProps( 10 | opCode=44, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CurrentBolusStatusResponse.class 14 | ) 15 | public class CurrentBolusStatusRequest extends Message { 16 | public CurrentBolusStatusRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentEGVGuiDataRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CurrentEGVGuiDataResponse; 8 | 9 | @MessageProps( 10 | opCode=34, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CurrentEGVGuiDataResponse.class 14 | ) 15 | public class CurrentEGVGuiDataRequest extends Message { 16 | public CurrentEGVGuiDataRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/BasalLimitSettingsRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.BasalLimitSettingsResponse; 8 | 9 | @MessageProps( 10 | opCode=-118, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response= BasalLimitSettingsResponse.class 14 | ) 15 | public class BasalLimitSettingsRequest extends Message { 16 | public BasalLimitSettingsRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMOORAlertSettingsRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CGMOORAlertSettingsResponse; 8 | 9 | @MessageProps( 10 | opCode=94, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CGMOORAlertSettingsResponse.class 14 | ) 15 | public class CGMOORAlertSettingsRequest extends Message { 16 | public CGMOORAlertSettingsRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ControlIQSleepScheduleRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ControlIQSleepScheduleResponse; 8 | 9 | @MessageProps( 10 | opCode=106, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=ControlIQSleepScheduleResponse.class 14 | ) 15 | public class ControlIQSleepScheduleRequest extends Message { 16 | public ControlIQSleepScheduleRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMRateAlertSettingsRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CGMRateAlertSettingsResponse; 8 | 9 | @MessageProps( 10 | opCode=92, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CGMRateAlertSettingsResponse.class 14 | ) 15 | public class CGMRateAlertSettingsRequest extends Message { 16 | public CGMRateAlertSettingsRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/GlobalMaxBolusSettingsRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.GlobalMaxBolusSettingsResponse; 8 | 9 | @MessageProps( 10 | opCode=-116, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=GlobalMaxBolusSettingsResponse.class 14 | ) 15 | public class GlobalMaxBolusSettingsRequest extends Message { 16 | public GlobalMaxBolusSettingsRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMGlucoseAlertSettingsRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Message; 5 | import com.jwoglom.pumpx2.pump.messages.MessageType; 6 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CGMGlucoseAlertSettingsResponse; 8 | 9 | @MessageProps( 10 | opCode=90, 11 | size=0, 12 | type=MessageType.REQUEST, 13 | response=CGMGlucoseAlertSettingsResponse.class 14 | ) 15 | public class CGMGlucoseAlertSettingsRequest extends Message { 16 | public CGMGlucoseAlertSettingsRequest() { 17 | this.cargo = EMPTY; 18 | } 19 | 20 | public void parse(byte[] raw) { 21 | Preconditions.checkArgument(raw.length == props().size()); 22 | this.cargo = raw; 23 | 24 | } 25 | 26 | 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/response/historyLog/HistoryLog.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.historyLog; 2 | 3 | import android.os.Build; 4 | 5 | import androidx.annotation.RequiresApi; 6 | 7 | import com.google.common.collect.ImmutableSet; 8 | import com.jwoglom.pumpx2.shared.JavaHelpers; 9 | 10 | import java.util.HashSet; 11 | 12 | public abstract class HistoryLog { 13 | protected byte[] cargo = null; 14 | 15 | public abstract int typeId(); 16 | 17 | public abstract void parse(byte[] raw); 18 | 19 | public byte[] getCargo() { 20 | return this.cargo; 21 | } 22 | 23 | @RequiresApi(api = Build.VERSION_CODES.N) 24 | public String toString() { 25 | return JavaHelpers.autoToString(this, new HashSet<>()); 26 | } 27 | 28 | @RequiresApi(api = Build.VERSION_CODES.N) 29 | public String verboseToString() { 30 | return JavaHelpers.autoToStringVerbose(this, ImmutableSet.of("cargo")); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/builders/PumpFeaturesBuilder.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.builders; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.response.currentStatus.ApiVersionResponse.ApiVersion.V2_API; 4 | 5 | import android.content.Context; 6 | 7 | import com.jwoglom.pumpx2.pump.PumpState; 8 | import com.jwoglom.pumpx2.pump.messages.Message; 9 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.PumpFeaturesV1Request; 10 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.PumpFeaturesV2Request; 11 | 12 | /** 13 | * On a message; 11 | 12 | public PumpResponseMessageEvent(byte[] data) { 13 | this.data = data; 14 | this.message = Optional.absent(); 15 | } 16 | public PumpResponseMessageEvent(byte[] data, Message message) { 17 | this.data = data; 18 | this.message = Optional.of(message); 19 | } 20 | 21 | public byte[] data() { 22 | return data; 23 | } 24 | 25 | public Optional message() { 26 | return message; 27 | } 28 | 29 | public String toString() { 30 | return "PumpResponseMessageEvent(data=" + Hex.encodeHexString(data) + ", message=" + message + ")"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ExtendedBolusStatusRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.helpers.Bytes; 5 | import com.jwoglom.pumpx2.pump.messages.Message; 6 | import com.jwoglom.pumpx2.pump.messages.MessageType; 7 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 8 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ExtendedBolusStatusResponse; 9 | 10 | @MessageProps( 11 | opCode=46, 12 | size=0, 13 | type=MessageType.REQUEST, 14 | response=ExtendedBolusStatusResponse.class 15 | ) 16 | public class ExtendedBolusStatusRequest extends Message { 17 | public ExtendedBolusStatusRequest() { 18 | this.cargo = EMPTY; 19 | } 20 | 21 | public void parse(byte[] raw) { 22 | Preconditions.checkArgument(raw.length == props().size()); 23 | this.cargo = raw; 24 | 25 | } 26 | 27 | 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/JavaHelpersTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2; 2 | 3 | import static org.junit.Assert.assertFalse; 4 | import static org.junit.Assert.assertTrue; 5 | 6 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.ApiVersionRequest; 7 | import com.jwoglom.pumpx2.shared.JavaHelpers; 8 | 9 | import org.junit.Test; 10 | 11 | import java.util.List; 12 | 13 | public class JavaHelpersTest { 14 | 15 | @Test 16 | public void testGetClassNamesWithPackage() { 17 | // Ensure loaded 18 | ApiVersionRequest foo; 19 | List requestMessages = JavaHelpers.getClassNamesWithPackage("com.jwoglom.pumpx2.pump.messages.request"); 20 | assertFalse(requestMessages.isEmpty()); 21 | } 22 | 23 | @Test 24 | public void testGetAllPumpRequestMessages() { 25 | // Ensure loaded 26 | ApiVersionRequest foo; 27 | List requestMessages = JavaHelpers.getAllPumpRequestMessages(); 28 | assertFalse(requestMessages.isEmpty()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ApiVersionRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 4 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 5 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.ApiVersionRequest; 6 | 7 | import org.apache.commons.codec.DecoderException; 8 | import org.junit.Test; 9 | 10 | public class ApiVersionRequestTest { 11 | @Test 12 | public void testApiVersion() throws DecoderException { 13 | // empty cargo 14 | ApiVersionRequest expected = new ApiVersionRequest(); 15 | 16 | ApiVersionRequest parsedReq = (ApiVersionRequest) MessageTester.test( 17 | "0002200200382c", 18 | 2, 19 | 1, 20 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 21 | expected 22 | ); 23 | 24 | MessageTester.assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/AlertStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 4 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 5 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.AlertStatusRequest; 6 | 7 | import org.apache.commons.codec.DecoderException; 8 | import org.junit.Test; 9 | 10 | public class AlertStatusRequestTest { 11 | @Test 12 | public void testAlertStatusRequest() throws DecoderException { 13 | // empty cargo 14 | AlertStatusRequest expected = new AlertStatusRequest(); 15 | 16 | AlertStatusRequest parsedReq = (AlertStatusRequest) MessageTester.test( 17 | "0003440300a258", 18 | 3, 19 | 1, 20 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 21 | expected 22 | ); 23 | 24 | MessageTester.assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/template.j2: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.{{cat}}; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.{{cat}}.{{requestName}}; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class {{requestName}}Test { 13 | @Test 14 | public void test{{requestName}}() throws DecoderException { 15 | // empty cargo 16 | {{requestName}} expected = new {{requestName}}(); 17 | 18 | {{requestName}} parsedReq = ({{requestName}}) MessageTester.test( 19 | "xxxx", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/BasalIQAlertInfoRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.helpers.Bytes; 5 | import com.jwoglom.pumpx2.pump.messages.Message; 6 | import com.jwoglom.pumpx2.pump.messages.MessageType; 7 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 8 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.BasalIQAlertInfoResponse; 9 | 10 | /** 11 | * On a non-BasalIQ pump returns BAD_OPCODE 12 | */ 13 | @MessageProps( 14 | opCode=102, 15 | size=0, 16 | type=MessageType.REQUEST, 17 | response=BasalIQAlertInfoResponse.class 18 | ) 19 | public class BasalIQAlertInfoRequest extends Message { 20 | public BasalIQAlertInfoRequest() { 21 | this.cargo = EMPTY; 22 | } 23 | 24 | public void parse(byte[] raw) { 25 | Preconditions.checkArgument(raw.length == props().size()); 26 | this.cargo = raw; 27 | 28 | } 29 | 30 | 31 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ControlIQInfoV1RequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | 8 | import org.apache.commons.codec.DecoderException; 9 | import org.junit.Test; 10 | 11 | public class ControlIQInfoV1RequestTest { 12 | @Test 13 | public void testControlIQInfoRequest() throws DecoderException { 14 | // empty cargo 15 | ControlIQInfoV1Request expected = new ControlIQInfoV1Request(); 16 | 17 | ControlIQInfoV1Request parsedReq = (ControlIQInfoV1Request) MessageTester.test( 18 | "000368030005ab", 19 | 3, 20 | 1, 21 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 22 | expected 23 | ); 24 | 25 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 26 | } 27 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpFeaturesV1RequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | 8 | import org.apache.commons.codec.DecoderException; 9 | import org.junit.Test; 10 | 11 | public class PumpFeaturesV1RequestTest { 12 | @Test 13 | public void testPumpFeaturesRequest() throws DecoderException { 14 | // empty cargo 15 | PumpFeaturesV1Request expected = new PumpFeaturesV1Request(); 16 | 17 | PumpFeaturesV1Request parsedReq = (PumpFeaturesV1Request) MessageTester.test( 18 | "00034e0300639f", 19 | 3, 20 | 1, 21 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 22 | expected 23 | ); 24 | 25 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpFeaturesV2RequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | 8 | import org.apache.commons.codec.DecoderException; 9 | import org.junit.Test; 10 | 11 | public class PumpFeaturesV2RequestTest { 12 | @Test 13 | public void testPumpSupportedFeaturesRequest() throws DecoderException { 14 | // empty cargo 15 | PumpFeaturesV2Request expected = new PumpFeaturesV2Request(); 16 | 17 | PumpFeaturesV2Request parsedReq = (PumpFeaturesV2Request) MessageTester.test( 18 | "0003a003005324", 19 | 3, 20 | 1, 21 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 22 | expected 23 | ); 24 | 25 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 26 | } 27 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/request/historyLog/NonexistentHistoryLogStreamRequest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.historyLog; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.Message; 4 | import com.jwoglom.pumpx2.pump.messages.MessageType; 5 | import com.jwoglom.pumpx2.pump.messages.annotations.MessageProps; 6 | import com.jwoglom.pumpx2.pump.messages.response.ErrorResponse; 7 | import com.jwoglom.pumpx2.pump.messages.response.historyLog.HistoryLogStreamResponse; 8 | 9 | /** 10 | * This message is used as a paired request message for HistoryLogStreamResponse, 11 | * which does not have an originating request. 12 | */ 13 | @MessageProps( 14 | opCode=-99999998, 15 | size=0, 16 | type=MessageType.REQUEST, 17 | response=HistoryLogStreamResponse.class 18 | ) 19 | public class NonexistentHistoryLogStreamRequest extends Message { 20 | 21 | public NonexistentHistoryLogStreamRequest() { 22 | this.cargo = EMPTY; 23 | } 24 | 25 | public void parse(byte[] raw) { 26 | this.cargo = raw; 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/LastBGRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.LastBGRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class LastBGRequestTest { 13 | @Test 14 | public void testLastBGRequest() throws DecoderException { 15 | // empty cargo 16 | LastBGRequest expected = new LastBGRequest(); 17 | 18 | LastBGRequest parsedReq = (LastBGRequest) MessageTester.test( 19 | "00033203000a32", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/BasalLimitSettingsRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | 8 | import org.apache.commons.codec.DecoderException; 9 | import org.junit.Test; 10 | 11 | public class BasalLimitSettingsRequestTest { 12 | @Test 13 | public void testBasalLimitSettingsRequest() throws DecoderException { 14 | // empty cargo 15 | BasalLimitSettingsRequest expected = new BasalLimitSettingsRequest(); 16 | 17 | BasalLimitSettingsRequest parsedReq = (BasalLimitSettingsRequest) MessageTester.test( 18 | "00048a0400c3fc", 19 | 4, 20 | 1, 21 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 22 | expected 23 | ); 24 | 25 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 26 | } 27 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/TempRateRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.TempRateRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class TempRateRequestTest { 13 | @Test 14 | public void testTempRateRequest() throws DecoderException { 15 | // empty cargo 16 | TempRateRequest expected = new TempRateRequest(); 17 | 18 | TempRateRequest parsedReq = (TempRateRequest) MessageTester.test( 19 | "00032a0300c8d8", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CGMStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CGMStatusRequestTest { 13 | @Test 14 | public void testCGMStatusRequest() throws DecoderException { 15 | // empty cargo 16 | CGMStatusRequest expected = new CGMStatusRequest(); 17 | 18 | CGMStatusRequest parsedReq = (CGMStatusRequest) MessageTester.test( 19 | "000350030001c7", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/RemindersRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.RemindersRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class RemindersRequestTest { 13 | @Test 14 | public void testRemindersRequest() throws DecoderException { 15 | // empty cargo 16 | RemindersRequest expected = new RemindersRequest(); 17 | 18 | RemindersRequest parsedReq = (RemindersRequest) MessageTester.test( 19 | "0003580300a06e", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/HistoryLogRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.HistoryLogRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class HistoryLogRequestTest { 13 | @Test 14 | public void testHistoryLogRequest10Messages() throws DecoderException { 15 | HistoryLogRequest expected = new HistoryLogRequest(3950, 10); 16 | 17 | HistoryLogRequest parsedReq = (HistoryLogRequest) MessageTester.test( 18 | "00043c04056e0f00000a4247", 19 | 4, 20 | 1, 21 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 22 | expected 23 | ); 24 | 25 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 26 | } 27 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 James Woglom 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/IDPSegmentRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.IDPSegmentRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class IDPSegmentRequestTest { 13 | @Test 14 | public void testIDPSegmentRequest() throws DecoderException { 15 | // empty cargo 16 | IDPSegmentRequest expected = new IDPSegmentRequest(0, 0); 17 | 18 | IDPSegmentRequest parsedReq = (IDPSegmentRequest) MessageTester.test( 19 | "0004420402000076e0", 20 | 4, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpVersionRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.PumpVersionRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class PumpVersionRequestTest { 13 | @Test 14 | public void testPumpVersionRequest() throws DecoderException { 15 | // empty cargo 16 | PumpVersionRequest expected = new PumpVersionRequest(); 17 | 18 | PumpVersionRequest parsedReq = (PumpVersionRequest) MessageTester.test( 19 | "0003540300c11b", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/AlarmStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.AlarmStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class AlarmStatusRequestTest { 13 | @Test 14 | public void testAlarmStatusRequest() throws DecoderException { 15 | // empty cargo 16 | AlarmStatusRequest expected = new AlarmStatusRequest(); 17 | 18 | AlarmStatusRequest parsedReq = (AlarmStatusRequest) MessageTester.test( 19 | "0003460300c236", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpGlobalsRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.PumpGlobalsRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class PumpGlobalsRequestTest { 13 | @Test 14 | public void testPumpGlobalsRequest() throws DecoderException { 15 | // empty cargo 16 | PumpGlobalsRequest expected = new PumpGlobalsRequest(); 17 | 18 | PumpGlobalsRequest parsedReq = (PumpGlobalsRequest) MessageTester.test( 19 | "0003560300a175", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/PumpSettingsRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.PumpSettingsRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class PumpSettingsRequestTest { 13 | @Test 14 | public void testPumpSettingsRequest() throws DecoderException { 15 | // empty cargo 16 | PumpSettingsRequest expected = new PumpSettingsRequest(); 17 | 18 | PumpSettingsRequest parsedReq = (PumpSettingsRequest) MessageTester.test( 19 | "0004520400f630", 20 | 4, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/historyLog/template.j2: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.{{cat}}; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.{{cat}}.{{responseName}}; 8 | 9 | import com.google.common.collect.ImmutableList; 10 | import org.apache.commons.codec.DecoderException; 11 | import org.junit.Test; 12 | 13 | public class {{responseName}}Test { 14 | @Test 15 | public void test{{responseName}}() throws DecoderException { 16 | {{responseName}} expected = new {{responseName}}( 17 | // {% for arg in responseArgs %}{{ arg.type }} {{ arg.name }}{{ ", " if not loop.last else "" }}{% endfor %} 18 | ); 19 | 20 | {{responseName}} parsedRes = ({{responseName}}) HistoryLogMessageTester.testSingle( 21 | "xxxx", 22 | expected 23 | ); 24 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/BasalIQStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.BasalIQStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class BasalIQStatusRequestTest { 13 | @Test 14 | public void testBasalIQStatusRequest() throws DecoderException { 15 | // empty cargo 16 | BasalIQStatusRequest expected = new BasalIQStatusRequest(); 17 | 18 | BasalIQStatusRequest parsedReq = (BasalIQStatusRequest) MessageTester.test( 19 | "000570050061eb", 20 | 5, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ControlIQIOBRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.ControlIQIOBRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class ControlIQIOBRequestTest { 13 | @Test 14 | public void testControlIQIOBRequest() throws DecoderException { 15 | // empty cargo 16 | ControlIQIOBRequest expected = new ControlIQIOBRequest(); 17 | 18 | ControlIQIOBRequest parsedReq = (ControlIQIOBRequest) MessageTester.test( 19 | "00046c040052ee", 20 | 4, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/InsulinStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.InsulinStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class InsulinStatusRequestTest { 13 | @Test 14 | public void testInsulinStatusRequest() throws DecoderException { 15 | // empty cargo 16 | InsulinStatusRequest expected = new InsulinStatusRequest(); 17 | 18 | InsulinStatusRequest parsedReq = (InsulinStatusRequest) MessageTester.test( 19 | "00042404005e5a", 20 | 4, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ProfileStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.ProfileStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class ProfileStatusRequestTest { 13 | @Test 14 | public void testProfileStatusRequest() throws DecoderException { 15 | // empty cargo 16 | ProfileStatusRequest expected = new ProfileStatusRequest(); 17 | 18 | ProfileStatusRequest parsedReq = (ProfileStatusRequest) MessageTester.test( 19 | "00033e03006b47", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMAlertStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CGMAlertStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CGMAlertStatusRequestTest { 13 | @Test 14 | public void testCGMAlertStatusRequest() throws DecoderException { 15 | // empty cargo 16 | CGMAlertStatusRequest expected = new CGMAlertStatusRequest(); 17 | 18 | CGMAlertStatusRequest parsedReq = (CGMAlertStatusRequest) MessageTester.test( 19 | "00034a0300a343", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ReminderStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.ReminderStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class ReminderStatusRequestTest { 13 | @Test 14 | public void testReminderStatusRequest() throws DecoderException { 15 | // empty cargo 16 | ReminderStatusRequest expected = new ReminderStatusRequest(); 17 | 18 | ReminderStatusRequest parsedReq = (ReminderStatusRequest) MessageTester.test( 19 | "0003480300c32d", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/TimeSinceResetRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.TimeSinceResetRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class TimeSinceResetRequestTest { 13 | @Test 14 | public void testTimeSinceResetRequest() throws DecoderException { 15 | // empty cargo 16 | TimeSinceResetRequest expected = new TimeSinceResetRequest(); 17 | 18 | TimeSinceResetRequest parsedReq = (TimeSinceResetRequest) MessageTester.test( 19 | "0003360300caee", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_graph.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 17 | 18 | 23 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/BasalIQSettingsRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.BasalIQSettingsRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class BasalIQSettingsRequestTest { 13 | @Test 14 | public void testBasalIQSettingsRequest() throws DecoderException { 15 | // empty cargo 16 | BasalIQSettingsRequest expected = new BasalIQSettingsRequest(); 17 | 18 | BasalIQSettingsRequest parsedReq = (BasalIQSettingsRequest) MessageTester.test( 19 | "000462040053f5", 20 | 4, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/models/MultiDay.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.models; 2 | 3 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ControlIQSleepScheduleResponse; 4 | 5 | import java.util.HashSet; 6 | import java.util.Set; 7 | 8 | public enum MultiDay { 9 | MONDAY(1), 10 | TUESDAY(2), 11 | WEDNESDAY(4), 12 | THURSDAY(8), 13 | FRIDAY(16), 14 | SATURDAY(32), 15 | SUNDAY(64), 16 | ; 17 | 18 | private final int id; 19 | 20 | MultiDay(int id) { 21 | this.id = id; 22 | } 23 | 24 | public int id() { 25 | return id; 26 | } 27 | 28 | public static Set fromBitmask(int bitmask) { 29 | Set set = new HashSet<>(); 30 | for (MultiDay day : values()) { 31 | if (bitmask % day.id() == 0) { 32 | set.add(day); 33 | } 34 | } 35 | 36 | return set; 37 | } 38 | 39 | public static int toBitmask(MultiDay... days) { 40 | int mask = 0; 41 | for (MultiDay day : days) { 42 | mask += day.id(); 43 | } 44 | 45 | return mask; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/BasalIQAlertInfoRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.BasalIQAlertInfoRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class BasalIQAlertInfoRequestTest { 13 | @Test 14 | public void testBasalIQAlertInfoRequest() throws DecoderException { 15 | // empty cargo 16 | BasalIQAlertInfoRequest expected = new BasalIQAlertInfoRequest(); 17 | 18 | BasalIQAlertInfoRequest parsedReq = (BasalIQAlertInfoRequest) MessageTester.test( 19 | "000366030004b0", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMHardwareInfoRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CGMHardwareInfoRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CGMHardwareInfoRequestTest { 13 | @Test 14 | public void testCGMHardwareInfoRequest() throws DecoderException { 15 | // empty cargo 16 | CGMHardwareInfoRequest expected = new CGMHardwareInfoRequest(); 17 | 18 | CGMHardwareInfoRequest parsedReq = (CGMHardwareInfoRequest) MessageTester.test( 19 | "0004600400339b", 20 | 4, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentBatteryV1RequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CurrentBatteryV1Request; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CurrentBatteryV1RequestTest { 13 | @Test 14 | public void testCurrentBatteryV1Request() throws DecoderException { 15 | // empty cargo 16 | CurrentBatteryV1Request expected = new CurrentBatteryV1Request(); 17 | 18 | CurrentBatteryV1Request parsedReq = (CurrentBatteryV1Request) MessageTester.test( 19 | "0003340300aa80", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/HistoryLogStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.HistoryLogStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class HistoryLogStatusRequestTest { 13 | @Test 14 | public void testHistoryLogStatusRequest() throws DecoderException { 15 | // empty cargo 16 | HistoryLogStatusRequest expected = new HistoryLogStatusRequest(); 17 | 18 | HistoryLogStatusRequest parsedReq = (HistoryLogStatusRequest) MessageTester.test( 19 | "00033a0300ab9b", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/HomeScreenMirrorRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.HomeScreenMirrorRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class HomeScreenMirrorRequestTest { 13 | @Test 14 | public void testHomeScreenMirrorRequest() throws DecoderException { 15 | // empty cargo 16 | HomeScreenMirrorRequest expected = new HomeScreenMirrorRequest(); 17 | 18 | HomeScreenMirrorRequest parsedReq = (HomeScreenMirrorRequest) MessageTester.test( 19 | "0003380300cbf5", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentEGVGuiDataRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CurrentEGVGuiDataRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CurrentEGVGuiDataRequestTest { 13 | @Test 14 | public void testCurrentEGVGuiDataRequest() throws DecoderException { 15 | // empty cargo 16 | CurrentEGVGuiDataRequest expected = new CurrentEGVGuiDataRequest(); 17 | 18 | CurrentEGVGuiDataRequest parsedReq = (CurrentEGVGuiDataRequest) MessageTester.test( 19 | "00032203006971", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentBasalStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CurrentBasalStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CurrentBasalStatusRequestTest { 13 | @Test 14 | public void testCurrentBasalStatusRequest() throws DecoderException { 15 | // empty cargo 16 | CurrentBasalStatusRequest expected = new CurrentBasalStatusRequest(); 17 | 18 | CurrentBasalStatusRequest parsedReq = (CurrentBasalStatusRequest) MessageTester.test( 19 | "0003280300a8b6", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentBolusStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CurrentBolusStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CurrentBolusStatusRequestTest { 13 | @Test 14 | public void testCurrentBolusStatusRequest() throws DecoderException { 15 | // empty cargo 16 | CurrentBolusStatusRequest expected = new CurrentBolusStatusRequest(); 17 | 18 | CurrentBolusStatusRequest parsedReq = (CurrentBolusStatusRequest) MessageTester.test( 19 | "00032c0300686a", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/template.j2: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.{{cat}}; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.{{cat}}.{{responseName}}; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class {{responseName}}Test { 13 | @Test 14 | public void test{{responseName}}() throws DecoderException { 15 | {{responseName}} expected = new {{responseName}}( 16 | // {% for arg in responseArgs %}{{ arg.type }} {{ arg.name }}{{ ", " if not loop.last else "" }}{% endfor %} 17 | ); 18 | 19 | {{responseName}} parsedRes = ({{responseName}}) MessageTester.test( 20 | "xxxx", 21 | 3, 22 | 1, 23 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 24 | expected 25 | ); 26 | 27 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMOORAlertSettingsRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CGMOORAlertSettingsRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CGMOORAlertSettingsRequestTest { 13 | @Test 14 | public void testCGMOORAlertSettingsRequest() throws DecoderException { 15 | // empty cargo 16 | CGMOORAlertSettingsRequest expected = new CGMOORAlertSettingsRequest(); 17 | 18 | CGMOORAlertSettingsRequest parsedReq = (CGMOORAlertSettingsRequest) MessageTester.test( 19 | "00035e030000dc", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ExtendedBolusStatusRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.ExtendedBolusStatusRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class ExtendedBolusStatusRequestTest { 13 | @Test 14 | public void testExtendedBolusStatusRequest() throws DecoderException { 15 | // empty cargo 16 | ExtendedBolusStatusRequest expected = new ExtendedBolusStatusRequest(); 17 | 18 | ExtendedBolusStatusRequest parsedReq = (ExtendedBolusStatusRequest) MessageTester.test( 19 | "00062e0600fdfb", 20 | 6, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/HistoryLogResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.HistoryLogResponse; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class HistoryLogResponseTest { 13 | @Test 14 | public void testHistoryLogResponse() throws DecoderException { 15 | HistoryLogResponse expected = new HistoryLogResponse( 16 | // int status, int streamId 17 | 0, 1 18 | ); 19 | 20 | HistoryLogResponse parsedRes = (HistoryLogResponse) MessageTester.test( 21 | "00033d0302000105d9", 22 | 3, 23 | 1, 24 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 25 | expected 26 | ); 27 | 28 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 29 | } 30 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/LastBGResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.LastBGResponse; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class LastBGResponseTest { 13 | @Test 14 | public void testLastBGResponseEmpty() throws DecoderException { 15 | LastBGResponse expected = new LastBGResponse( 16 | // long bgTimestamp, int bgValue, int bgSource 17 | 0L, 0, 0 18 | ); 19 | 20 | LastBGResponse parsedRes = (LastBGResponse) MessageTester.test( 21 | "0003330307000000000000003117", 22 | 3, 23 | 1, 24 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 25 | expected 26 | ); 27 | 28 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 29 | } 30 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMRateAlertSettingsRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CGMRateAlertSettingsRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CGMRateAlertSettingsRequestTest { 13 | @Test 14 | public void testCGMRateAlertSettingsRequest() throws DecoderException { 15 | // empty cargo 16 | CGMRateAlertSettingsRequest expected = new CGMRateAlertSettingsRequest(); 17 | 18 | CGMRateAlertSettingsRequest parsedReq = (CGMRateAlertSettingsRequest) MessageTester.test( 19 | "00045c0400f72b", 20 | 4, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/helpers/BytesTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.helpers; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | import static org.junit.Assert.assertEquals; 5 | 6 | import com.google.common.collect.ImmutableList; 7 | 8 | import org.junit.Test; 9 | 10 | import java.util.Arrays; 11 | import java.util.List; 12 | 13 | public class BytesTest { 14 | @Test 15 | public void testFloats() { 16 | List tests = ImmutableList.of( 17 | 0.0F, 18 | 1.0F, 19 | 1.11F, 20 | 1.123F, 21 | -1.0F, 22 | -1.11F, 23 | -1.123F, 24 | 0.00000001F, 25 | -0.00000001F, 26 | 12345.54321F, 27 | -12345.54321F, 28 | Float.NaN 29 | ); 30 | 31 | tests.forEach(f -> { 32 | byte[] bytes = Bytes.toFloat(f); 33 | float read = Bytes.readFloat(bytes, 0); 34 | assertEquals(f, read, 0.00001); 35 | byte[] back = Bytes.toFloat(read); 36 | assertHexEquals(bytes, back); 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ControlIQInfoV2RequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.ControlIQInfoV2Request; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Ignore; 11 | import org.junit.Test; 12 | 13 | public class ControlIQInfoV2RequestTest { 14 | @Test 15 | @Ignore("need test input") 16 | public void testControlIQInfoV2Request() throws DecoderException { 17 | // empty cargo 18 | ControlIQInfoV2Request expected = new ControlIQInfoV2Request(); 19 | 20 | ControlIQInfoV2Request parsedReq = (ControlIQInfoV2Request) MessageTester.test( 21 | "xxxx", 22 | 3, 23 | 1, 24 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 25 | expected 26 | ); 27 | 28 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 29 | } 30 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/ControlIQSleepScheduleRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.ControlIQSleepScheduleRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class ControlIQSleepScheduleRequestTest { 13 | @Test 14 | public void testControlIQSleepScheduleRequest() throws DecoderException { 15 | // empty cargo 16 | ControlIQSleepScheduleRequest expected = new ControlIQSleepScheduleRequest(); 17 | 18 | ControlIQSleepScheduleRequest parsedReq = (ControlIQSleepScheduleRequest) MessageTester.test( 19 | "00036a030065c5", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/GlobalMaxBolusSettingsRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.GlobalMaxBolusSettingsRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class GlobalMaxBolusSettingsRequestTest { 13 | @Test 14 | public void testGlobalMaxBolusSettingsRequest() throws DecoderException { 15 | // empty cargo 16 | GlobalMaxBolusSettingsRequest expected = new GlobalMaxBolusSettingsRequest(); 17 | 18 | GlobalMaxBolusSettingsRequest parsedReq = (GlobalMaxBolusSettingsRequest) MessageTester.test( 19 | "00038c0300f4d7", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/PumpFeaturesV2ResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | 8 | import org.apache.commons.codec.DecoderException; 9 | import org.junit.Ignore; 10 | import org.junit.Test; 11 | 12 | public class PumpFeaturesV2ResponseTest { 13 | @Test 14 | @Ignore("needs to be run on a V2 pump") 15 | public void testPumpSupportedFeaturesResponse() throws DecoderException { 16 | PumpFeaturesV2Response expected = new PumpFeaturesV2Response( 17 | // int status, int supportedFeaturesIndex, long pumpFeaturesBitmask 18 | ); 19 | 20 | PumpFeaturesV2Response parsedRes = (PumpFeaturesV2Response) MessageTester.test( 21 | "xxxx", 22 | 3, 23 | 1, 24 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 25 | expected 26 | ); 27 | 28 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 29 | } 30 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CGMGlucoseAlertSettingsRequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CGMGlucoseAlertSettingsRequest; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CGMGlucoseAlertSettingsRequestTest { 13 | @Test 14 | public void testCGMGlucoseAlertSettingsRequest() throws DecoderException { 15 | // empty cargo 16 | CGMGlucoseAlertSettingsRequest expected = new CGMGlucoseAlertSettingsRequest(); 17 | 18 | CGMGlucoseAlertSettingsRequest parsedReq = (CGMGlucoseAlertSettingsRequest) MessageTester.test( 19 | "00035a0300c000", 20 | 3, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 27 | } 28 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/ApiVersionResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ApiVersionResponse; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class ApiVersionResponseTest { 13 | @Test 14 | public void testApiVersionResponse() throws DecoderException { 15 | // Control-IQ pump v7.3.1 16 | ApiVersionResponse expected = new ApiVersionResponse(2, 0); 17 | 18 | ApiVersionResponse parsedRes = (ApiVersionResponse) MessageTester.test( 19 | "00022102040200000077c8", 20 | 2, 21 | 1, 22 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 23 | expected 24 | ); 25 | 26 | assertEquals(expected.getMajorVersion(), parsedRes.getMajorVersion()); 27 | assertEquals(expected.getMinorVersion(), parsedRes.getMinorVersion()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/BasalLimitSettingsResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | 8 | import org.apache.commons.codec.DecoderException; 9 | import org.junit.Ignore; 10 | import org.junit.Test; 11 | 12 | public class BasalLimitSettingsResponseTest { 13 | @Test 14 | @Ignore("needs to be run on a V2 pump") 15 | public void testBasalLimitSettingsRequestResponse() throws DecoderException { 16 | BasalLimitSettingsResponse expected = new BasalLimitSettingsResponse( 17 | // long basalLimit, long basalLimitDefault 18 | ); 19 | 20 | BasalLimitSettingsResponse parsedRes = (BasalLimitSettingsResponse) MessageTester.test( 21 | "xxxx", 22 | 3, 23 | 1, 24 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 25 | expected 26 | ); 27 | 28 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 29 | } 30 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/request/currentStatus/CurrentBatteryV2RequestTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.request.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.request.currentStatus.CurrentBatteryV2Request; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.apache.commons.lang3.NotImplementedException; 11 | import org.junit.Test; 12 | 13 | public class CurrentBatteryV2RequestTest { 14 | @Test 15 | public void testCurrentBatteryV2Request() throws DecoderException { 16 | // empty cargo 17 | CurrentBatteryV2Request expected = new CurrentBatteryV2Request(); 18 | 19 | CurrentBatteryV2Request parsedReq = (CurrentBatteryV2Request) MessageTester.test( 20 | "0005900500504b", 21 | 5, 22 | 1, 23 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 24 | expected 25 | ); 26 | 27 | assertHexEquals(expected.getCargo(), parsedReq.getCargo()); 28 | } 29 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/CGMAlertStatusResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CGMAlertStatusResponse; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CGMAlertStatusResponseTest { 13 | @Test 14 | public void testCGMAlertStatusResponse() throws DecoderException { 15 | CGMAlertStatusResponse expected = new CGMAlertStatusResponse( 16 | // BigInteger cgmAlertBitmask 17 | 0L 18 | ); 19 | 20 | CGMAlertStatusResponse parsedRes = (CGMAlertStatusResponse) MessageTester.test( 21 | "00034b030800000000000000009ed2", 22 | 3, 23 | 1, 24 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 25 | expected 26 | ); 27 | 28 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 29 | } 30 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/bluetooth/models/Packet.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.bluetooth.models; 2 | 3 | import kotlin.collections.ArraysKt; 4 | 5 | public class Packet { 6 | private final byte packetsRemaining; 7 | private final byte transactionId; 8 | private final byte[] internalCargo; 9 | 10 | public Packet(byte packetsRemaining, byte transactionId, byte[] internalCargo) { 11 | this.packetsRemaining = packetsRemaining; 12 | this.transactionId = transactionId; 13 | this.internalCargo = internalCargo; 14 | } 15 | 16 | public byte[] build() { 17 | byte[] ret = new byte[internalCargo.length + 2]; 18 | ret[0] = (byte)packetsRemaining; 19 | ret[1] = transactionId; 20 | System.arraycopy(internalCargo, 0, ret, 2, internalCargo.length); 21 | return ret; 22 | } 23 | 24 | public byte transactionId() { 25 | return transactionId; 26 | } 27 | 28 | public byte[] internalCargo() { 29 | return internalCargo; 30 | } 31 | 32 | public Packet merge(Packet newPacket) { 33 | return new Packet(newPacket.packetsRemaining, transactionId, ArraysKt.plus(this.internalCargo, newPacket.internalCargo)); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/ReminderStatusResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.ReminderStatusResponse; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | import java.math.BigInteger; 13 | 14 | public class ReminderStatusResponseTest { 15 | @Test 16 | public void testReminderStatusResponseEmpty() throws DecoderException { 17 | ReminderStatusResponse expected = new ReminderStatusResponse( 18 | BigInteger.ZERO 19 | ); 20 | 21 | ReminderStatusResponse parsedRes = (ReminderStatusResponse) MessageTester.test( 22 | "000349030800000000000000002d72", 23 | 3, 24 | 1, 25 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 26 | expected 27 | ); 28 | 29 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 30 | } 31 | } -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/TempRateResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.TempRateResponse; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class TempRateResponseTest { 13 | @Test 14 | public void testTempRateResponseNotActive() throws DecoderException { 15 | TempRateResponse expected = new TempRateResponse( 16 | // boolean active, int percentage, long startTime, long duration 17 | false, 0, 0, 0 18 | ); 19 | 20 | TempRateResponse parsedRes = (TempRateResponse) MessageTester.test( 21 | "00032b030a0000000000000000000039c6", 22 | 3, 23 | 1, 24 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 25 | expected 26 | ); 27 | 28 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 29 | } 30 | } -------------------------------------------------------------------------------- /lib/src/main/java/com/jwoglom/pumpx2/pump/messages/builders/PumpChallengeBuilder.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.builders; 2 | 3 | import com.google.common.base.Preconditions; 4 | import com.jwoglom.pumpx2.pump.messages.Packetize; 5 | import com.jwoglom.pumpx2.pump.messages.request.authentication.PumpChallengeRequest; 6 | 7 | import java.nio.charset.Charset; 8 | 9 | public class PumpChallengeBuilder { 10 | public static PumpChallengeRequest create(int appInstanceId, String pairingCode, byte[] hmacKey) { 11 | String pairingChars = processPairingCode(pairingCode); 12 | Preconditions.checkArgument(pairingChars.length() == 16); 13 | return new PumpChallengeRequest( 14 | appInstanceId, 15 | Packetize.doHmacSha1(hmacKey, pairingChars.getBytes(Charset.forName("UTF-8")))); 16 | } 17 | 18 | // Remove all dashes and spaces 19 | private static String processPairingCode(String pairingCode) { 20 | String processed = ""; 21 | for (Character c : pairingCode.toCharArray()) { 22 | if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { 23 | processed += c; 24 | } 25 | } 26 | return processed; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/CGMHardwareInfoResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.CGMHardwareInfoResponse; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class CGMHardwareInfoResponseTest { 13 | @Test 14 | public void testCGMHardwareInfo() throws DecoderException { 15 | CGMHardwareInfoResponse expected = new CGMHardwareInfoResponse("8RR239", 0); 16 | 17 | CGMHardwareInfoResponse parsedRes = (CGMHardwareInfoResponse) MessageTester.test( 18 | "00036103113852523233390000000000000000000000a2a3", 19 | 3, 20 | 2, 21 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 22 | expected 23 | ); 24 | 25 | assertEquals(expected.getHardwareInfoString(), parsedRes.getHardwareInfoString()); 26 | assertEquals(expected.getLastByte(), parsedRes.getLastByte()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/src/test/java/com/jwoglom/pumpx2/pump/messages/response/currentStatus/InsulinStatusResponseTest.java: -------------------------------------------------------------------------------- 1 | package com.jwoglom.pumpx2.pump.messages.response.currentStatus; 2 | 3 | import static com.jwoglom.pumpx2.pump.messages.MessageTester.assertHexEquals; 4 | 5 | import com.jwoglom.pumpx2.pump.messages.MessageTester; 6 | import com.jwoglom.pumpx2.pump.bluetooth.CharacteristicUUID; 7 | import com.jwoglom.pumpx2.pump.messages.response.currentStatus.InsulinStatusResponse; 8 | 9 | import org.apache.commons.codec.DecoderException; 10 | import org.junit.Test; 11 | 12 | public class InsulinStatusResponseTest { 13 | @Test 14 | public void testInsulinStatusResponse() throws DecoderException { 15 | InsulinStatusResponse expected = new InsulinStatusResponse( 16 | // int currentInsulinAmount, int isEstimate, int insulinLowAmount 17 | 0, 0, 35 18 | ); 19 | 20 | InsulinStatusResponse parsedRes = (InsulinStatusResponse) MessageTester.test( 21 | "000425040400000023397d", 22 | 4, 23 | 1, 24 | CharacteristicUUID.CURRENT_STATUS_CHARACTERISTICS, 25 | expected 26 | ); 27 | 28 | assertHexEquals(expected.getCargo(), parsedRes.getCargo()); 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 21 | 22 |