ByteUtil -> kt
This commit is contained in:
parent
6ad2559caf
commit
120f1d4e03
|
@ -29,7 +29,7 @@ import info.nightscout.interfaces.pump.PumpSync
|
|||
import info.nightscout.interfaces.pump.WarnColors
|
||||
import info.nightscout.interfaces.queue.Callback
|
||||
import info.nightscout.interfaces.queue.CommandQueue
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState
|
||||
import info.nightscout.rx.AapsSchedulers
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.rx.events.EventExtendedBolusChange
|
||||
|
|
|
@ -34,8 +34,8 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil.Comp
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil.Companion.getByteArrayFromUnsignedShort
|
||||
import info.nightscout.core.utils.DateTimeUtil
|
||||
import info.nightscout.interfaces.pump.defs.PumpType
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import org.joda.time.LocalDateTime
|
||||
import java.util.Calendar
|
||||
|
@ -78,7 +78,8 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
fun onInit() {
|
||||
// we can't do this in the constructor, as sp only gets injected after the constructor has returned
|
||||
medtronicPumpStatus.previousConnection = sp.getLong(
|
||||
RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L)
|
||||
RileyLinkConst.Prefs.LastGoodDeviceCommunicationTime, 0L
|
||||
)
|
||||
}
|
||||
|
||||
override fun createResponseMessage(payload: ByteArray): PumpMessage {
|
||||
|
@ -127,8 +128,10 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
|
||||
// check connection
|
||||
val pumpMsgContent = createPumpMessageContent(RLMessageType.ReadSimpleData) // simple
|
||||
val rfSpyResponse = rfspy.transmitThenReceive(RadioPacket(injector, pumpMsgContent), 0.toByte(), 200.toByte(),
|
||||
0.toByte(), 0.toByte(), 25000, 0.toByte())
|
||||
val rfSpyResponse = rfspy.transmitThenReceive(
|
||||
RadioPacket(injector, pumpMsgContent), 0.toByte(), 200.toByte(),
|
||||
0.toByte(), 0.toByte(), 25000, 0.toByte()
|
||||
)
|
||||
aapsLogger.info(LTag.PUMPCOMM, "wakeup: raw response is " + ByteUtil.shortHexString(rfSpyResponse.raw))
|
||||
if (rfSpyResponse.wasTimeout()) {
|
||||
aapsLogger.error(LTag.PUMPCOMM, "isDeviceReachable. Failed to find pump (timeout).")
|
||||
|
@ -140,8 +143,11 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
val pumpResponse = createResponseMessage(radioResponse.payload)
|
||||
if (!pumpResponse.isValid) {
|
||||
aapsLogger.warn(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Response is invalid ! [interrupted=%b, timeout=%b]", rfSpyResponse.wasInterrupted(),
|
||||
rfSpyResponse.wasTimeout()))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "Response is invalid ! [interrupted=%b, timeout=%b]", rfSpyResponse.wasInterrupted(),
|
||||
rfSpyResponse.wasTimeout()
|
||||
)
|
||||
)
|
||||
} else {
|
||||
|
||||
// radioResponse.rssi;
|
||||
|
@ -153,8 +159,11 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
medtronicUtil.isModelSet = true
|
||||
}
|
||||
aapsLogger.debug(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "isDeviceReachable. PumpModel is %s - Valid: %b (rssi=%d)", medtronicUtil.medtronicPumpModel, valid,
|
||||
radioResponse.rssi))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "isDeviceReachable. PumpModel is %s - Valid: %b (rssi=%d)", medtronicUtil.medtronicPumpModel, valid,
|
||||
radioResponse.rssi
|
||||
)
|
||||
)
|
||||
if (valid) {
|
||||
if (state === PumpDeviceState.PumpUnreachable)
|
||||
medtronicPumpStatus.pumpDeviceState = PumpDeviceState.WakingUp
|
||||
|
@ -169,12 +178,14 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
} else {
|
||||
aapsLogger.warn(
|
||||
LTag.PUMPCOMM, "isDeviceReachable. Failed to parse radio response: "
|
||||
+ ByteUtil.shortHexString(rfSpyResponse.raw))
|
||||
+ ByteUtil.shortHexString(rfSpyResponse.raw)
|
||||
)
|
||||
}
|
||||
} catch (e: RileyLinkCommunicationException) {
|
||||
aapsLogger.warn(
|
||||
LTag.PUMPCOMM, "isDeviceReachable. Failed to decode radio response: "
|
||||
+ ByteUtil.shortHexString(rfSpyResponse.raw))
|
||||
+ ByteUtil.shortHexString(rfSpyResponse.raw)
|
||||
)
|
||||
}
|
||||
} else {
|
||||
aapsLogger.warn(LTag.PUMPCOMM, "isDeviceReachable. Unknown response: " + ByteUtil.shortHexString(rfSpyResponse.raw))
|
||||
|
@ -230,8 +241,11 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
if (rval.commandType !== MedtronicCommandType.CommandACK) {
|
||||
aapsLogger.error(LTag.PUMPCOMM, "runCommandWithFrames: Pump did not ACK frame #$frameNr")
|
||||
aapsLogger.error(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Run command with Frames FAILED (command=%s, response=%s)", commandType.name,
|
||||
rval.toString()))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "Run command with Frames FAILED (command=%s, response=%s)", commandType.name,
|
||||
rval.toString()
|
||||
)
|
||||
)
|
||||
return PumpMessage(aapsLogger, "No ACK after frame #$frameNr")
|
||||
} else {
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Run command with Frames: Got ACK response for frame #$frameNr")
|
||||
|
@ -250,8 +264,10 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
for (pageNumber in 0..4) {
|
||||
val rawHistoryPage = RawHistoryPage(aapsLogger)
|
||||
// wakeUp(receiverDeviceAwakeForMinutes, false);
|
||||
val getHistoryMsg = makePumpMessage(MedtronicCommandType.GetHistoryData,
|
||||
GetHistoryPageCarelinkMessageBody(pageNumber))
|
||||
val getHistoryMsg = makePumpMessage(
|
||||
MedtronicCommandType.GetHistoryData,
|
||||
GetHistoryPageCarelinkMessageBody(pageNumber)
|
||||
)
|
||||
aapsLogger.info(LTag.PUMPCOMM, "getPumpHistory: Page $pageNumber")
|
||||
// aapsLogger.info(LTag.PUMPCOMM,"getPumpHistoryPage("+pageNumber+"): "+ByteUtil.shortHexString(getHistoryMsg.getTxData()));
|
||||
// Ask the pump to transfer history (we get first frame?)
|
||||
|
@ -293,8 +309,10 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
rawHistoryPage.appendData(currentResponse.frameData)
|
||||
// RileyLinkMedtronicService.getInstance().announceProgress(((100 / 16) *
|
||||
// currentResponse.getFrameNumber() + 1));
|
||||
medtronicUtil.setCurrentCommand(MedtronicCommandType.GetHistoryData, pageNumber,
|
||||
currentResponse.frameNumber)
|
||||
medtronicUtil.setCurrentCommand(
|
||||
MedtronicCommandType.GetHistoryData, pageNumber,
|
||||
currentResponse.frameNumber
|
||||
)
|
||||
aapsLogger.info(LTag.PUMPCOMM, String.format(Locale.ENGLISH, "getPumpHistory: Got frame %d of Page %d", currentResponse.frameNumber, pageNumber))
|
||||
// Do we need to ask for the next frame?
|
||||
if (expectedFrameNum < 16) { // This number may not be correct for pumps other than 522/722
|
||||
|
@ -311,8 +329,11 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
failures++
|
||||
if (failures == 6) {
|
||||
aapsLogger.error(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "getPumpHistory: 6 failures in attempting to download frame %d of page %d, giving up.",
|
||||
expectedFrameNum, pageNumber))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "getPumpHistory: 6 failures in attempting to download frame %d of page %d, giving up.",
|
||||
expectedFrameNum, pageNumber
|
||||
)
|
||||
)
|
||||
done = true // failure completion.
|
||||
doneWithError = true
|
||||
}
|
||||
|
@ -338,7 +359,8 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
if (rawHistoryPage.length != 1024) {
|
||||
aapsLogger.warn(
|
||||
LTag.PUMPCOMM, "getPumpHistory: short page. Expected length of 1024, found length of "
|
||||
+ rawHistoryPage.length)
|
||||
+ rawHistoryPage.length
|
||||
)
|
||||
doneWithError = true
|
||||
}
|
||||
if (!rawHistoryPage.isChecksumOK) {
|
||||
|
@ -451,8 +473,11 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
private inline fun checkResponseRawContent(rawContent: ByteArray?, commandType: MedtronicCommandType, errorCase: () -> Unit) {
|
||||
if (rawContent?.isEmpty() != false && commandType != MedtronicCommandType.PumpModel) {
|
||||
aapsLogger.warn(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Content is empty or too short, no data to convert (type=%s,isNull=%b,length=%s)",
|
||||
commandType.name, rawContent == null, rawContent?.size ?: "-"))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "Content is empty or too short, no data to convert (type=%s,isNull=%b,length=%s)",
|
||||
commandType.name, rawContent == null, rawContent?.size ?: "-"
|
||||
)
|
||||
)
|
||||
errorCase.invoke()
|
||||
} else {
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Raw response before convert: " + ByteUtil.shortHexString(rawContent))
|
||||
|
@ -473,7 +498,8 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
} else {
|
||||
val responseData = String.format(
|
||||
"%s: Cannot return data. Data is too short [expected=%s, received=%s].", method, ""
|
||||
+ expectedLength, "" + contents.size)
|
||||
+ expectedLength, "" + contents.size
|
||||
)
|
||||
aapsLogger.warn(LTag.PUMPCOMM, responseData)
|
||||
responseData
|
||||
}
|
||||
|
@ -564,7 +590,8 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
private fun checkIfWeHaveMoreData(commandType: MedtronicCommandType, response: PumpMessage, data: ByteArray): Boolean {
|
||||
if (commandType === MedtronicCommandType.GetBasalProfileSTD || //
|
||||
commandType === MedtronicCommandType.GetBasalProfileA || //
|
||||
commandType === MedtronicCommandType.GetBasalProfileB) {
|
||||
commandType === MedtronicCommandType.GetBasalProfileB
|
||||
) {
|
||||
val responseRaw = response.rawContentOfFrame
|
||||
val last = responseRaw.size - 1
|
||||
aapsLogger.debug(LTag.PUMPCOMM, "Length: " + data.size)
|
||||
|
@ -652,8 +679,11 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
try {
|
||||
if (doWakeUpBeforeCommand) wakeUp(false)
|
||||
if (debugSetCommands) aapsLogger.debug(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "%s: Body - %s", commandType.commandDescription,
|
||||
ByteUtil.getHex(body)))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "%s: Body - %s", commandType.commandDescription,
|
||||
ByteUtil.getHex(body)
|
||||
)
|
||||
)
|
||||
val msg = makePumpMessage(commandType, CarelinkLongMessageBody(body))
|
||||
val pumpMessage = runCommandWithArgs(msg)
|
||||
if (debugSetCommands) aapsLogger.debug(LTag.PUMPCOMM, String.format(Locale.ENGLISH, "%s: %s", commandType.commandDescription, pumpMessage.responseContent))
|
||||
|
@ -684,14 +714,25 @@ class MedtronicCommunicationManager // This empty constructor must be kept, oth
|
|||
for (retries in 0..MAX_COMMAND_TRIES) {
|
||||
var responseMessage: PumpMessage? = null
|
||||
try {
|
||||
responseMessage = runCommandWithFrames(MedtronicCommandType.SetBasalProfileSTD,
|
||||
basalProfileFrames)
|
||||
responseMessage = runCommandWithFrames(
|
||||
MedtronicCommandType.SetBasalProfileSTD,
|
||||
basalProfileFrames
|
||||
)
|
||||
if (responseMessage!!.commandType === MedtronicCommandType.CommandACK) return true
|
||||
} catch (e: RileyLinkCommunicationException) {
|
||||
aapsLogger.warn(LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Error getting response from RileyLink (error=%s, retry=%d)", e.message, retries + 1))
|
||||
}
|
||||
if (responseMessage != null) aapsLogger.warn(LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Set Basal Profile: Invalid response: commandType=%s,rawData=%s", responseMessage.commandType, ByteUtil.shortHexString(responseMessage.rawContent))) else aapsLogger.warn(
|
||||
LTag.PUMPCOMM, "Set Basal Profile: Null response.")
|
||||
if (responseMessage != null) aapsLogger.warn(
|
||||
LTag.PUMPCOMM,
|
||||
String.format(
|
||||
Locale.ENGLISH,
|
||||
"Set Basal Profile: Invalid response: commandType=%s,rawData=%s",
|
||||
responseMessage.commandType,
|
||||
ByteUtil.shortHexString(responseMessage.rawContent)
|
||||
)
|
||||
) else aapsLogger.warn(
|
||||
LTag.PUMPCOMM, "Set Basal Profile: Null response."
|
||||
)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm
|
||||
|
||||
import info.nightscout.interfaces.pump.defs.PumpType
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BasalProfile
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BatteryStatusDTO
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.PumpSettingDTO
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceType
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpConfigurationGroup
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.interfaces.pump.defs.PumpType
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import org.joda.time.IllegalFieldValueException
|
||||
|
@ -112,8 +112,11 @@ class MedtronicConverter @Inject constructor(
|
|||
LocalDateTime(year, month, day, hours, minutes, seconds)
|
||||
} catch (e: IllegalFieldValueException) {
|
||||
aapsLogger.error(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "decodeTime: Failed to parse pump time value: year=%d, month=%d, hours=%d, minutes=%d, seconds=%d",
|
||||
year, month, day, hours, minutes, seconds))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "decodeTime: Failed to parse pump time value: year=%d, month=%d, hours=%d, minutes=%d, seconds=%d",
|
||||
year, month, day, hours, minutes, seconds
|
||||
)
|
||||
)
|
||||
null
|
||||
}
|
||||
}
|
||||
|
@ -124,10 +127,16 @@ class MedtronicConverter @Inject constructor(
|
|||
addSettingToMap(
|
||||
"PCFG_MAX_BASAL", ""
|
||||
+ decodeBasalInsulin(
|
||||
ByteUtil.makeUnsignedShort(rd[settingIndexMaxBasal].toInt(),
|
||||
rd[settingIndexMaxBasal + 1].toInt())), PumpConfigurationGroup.Basal, map)
|
||||
addSettingToMap("CFG_BASE_CLOCK_MODE", if (rd[settingIndexTimeDisplayFormat].toInt() == 0) "12h" else "24h",
|
||||
PumpConfigurationGroup.General, map)
|
||||
ByteUtil.makeUnsignedShort(
|
||||
rd[settingIndexMaxBasal].toInt(),
|
||||
rd[settingIndexMaxBasal + 1].toInt()
|
||||
)
|
||||
), PumpConfigurationGroup.Basal, map
|
||||
)
|
||||
addSettingToMap(
|
||||
"CFG_BASE_CLOCK_MODE", if (rd[settingIndexTimeDisplayFormat].toInt() == 0) "12h" else "24h",
|
||||
PumpConfigurationGroup.General, map
|
||||
)
|
||||
addSettingToMap("PCFG_BASAL_PROFILES_ENABLED", parseResultEnable(rd[10].toInt()), PumpConfigurationGroup.Basal, map)
|
||||
if (rd[10].toInt() == 1) {
|
||||
val patt: String
|
||||
|
@ -156,25 +165,37 @@ class MedtronicConverter @Inject constructor(
|
|||
}
|
||||
addSettingToMap("PCFG_AUDIO_BOLUS_ENABLED", parseResultEnable(rd[2].toInt()), PumpConfigurationGroup.Bolus, map)
|
||||
if (rd[2].toInt() == 1) {
|
||||
addSettingToMap("PCFG_AUDIO_BOLUS_STEP_SIZE", "" + decodeBolusInsulin(ByteUtil.asUINT8(rd[3])),
|
||||
PumpConfigurationGroup.Bolus, map)
|
||||
addSettingToMap(
|
||||
"PCFG_AUDIO_BOLUS_STEP_SIZE", "" + decodeBolusInsulin(ByteUtil.asUINT8(rd[3])),
|
||||
PumpConfigurationGroup.Bolus, map
|
||||
)
|
||||
}
|
||||
addSettingToMap("PCFG_VARIABLE_BOLUS_ENABLED", parseResultEnable(rd[4].toInt()), PumpConfigurationGroup.Bolus, map)
|
||||
addSettingToMap("PCFG_MAX_BOLUS", "" + decodeMaxBolus(rd), PumpConfigurationGroup.Bolus, map)
|
||||
addSettingToMap(
|
||||
"PCFG_MAX_BASAL", ""
|
||||
+ decodeBasalInsulin(
|
||||
ByteUtil.makeUnsignedShort(rd[settingIndexMaxBasal].toInt(),
|
||||
rd[settingIndexMaxBasal + 1].toInt())), PumpConfigurationGroup.Basal, map)
|
||||
addSettingToMap("CFG_BASE_CLOCK_MODE", if (rd[settingIndexTimeDisplayFormat].toInt() == 0) "12h" else "24h",
|
||||
PumpConfigurationGroup.General, map)
|
||||
ByteUtil.makeUnsignedShort(
|
||||
rd[settingIndexMaxBasal].toInt(),
|
||||
rd[settingIndexMaxBasal + 1].toInt()
|
||||
)
|
||||
), PumpConfigurationGroup.Basal, map
|
||||
)
|
||||
addSettingToMap(
|
||||
"CFG_BASE_CLOCK_MODE", if (rd[settingIndexTimeDisplayFormat].toInt() == 0) "12h" else "24h",
|
||||
PumpConfigurationGroup.General, map
|
||||
)
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.medtronicPumpModel, MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
addSettingToMap("PCFG_INSULIN_CONCENTRATION", "" + if (rd[9].toInt() == 0) 50 else 100, PumpConfigurationGroup.Insulin,
|
||||
map)
|
||||
addSettingToMap(
|
||||
"PCFG_INSULIN_CONCENTRATION", "" + if (rd[9].toInt() == 0) 50 else 100, PumpConfigurationGroup.Insulin,
|
||||
map
|
||||
)
|
||||
// LOG.debug("Insulin concentration: " + rd[9]);
|
||||
} else {
|
||||
addSettingToMap("PCFG_INSULIN_CONCENTRATION", "" + if (rd[9].toInt() != 0) 50 else 100, PumpConfigurationGroup.Insulin,
|
||||
map)
|
||||
addSettingToMap(
|
||||
"PCFG_INSULIN_CONCENTRATION", "" + if (rd[9].toInt() != 0) 50 else 100, PumpConfigurationGroup.Insulin,
|
||||
map
|
||||
)
|
||||
// LOG.debug("Insulin concentration: " + rd[9]);
|
||||
}
|
||||
addSettingToMap("PCFG_BASAL_PROFILES_ENABLED", parseResultEnable(rd[10].toInt()), PumpConfigurationGroup.Basal, map)
|
||||
|
@ -205,16 +226,25 @@ class MedtronicConverter @Inject constructor(
|
|||
|
||||
fun decodeSettings(rd: ByteArray): Map<String, PumpSettingDTO> {
|
||||
val map = decodeSettings512(rd)
|
||||
addSettingToMap("PCFG_MM_RESERVOIR_WARNING_TYPE_TIME", if (rd[18].toInt() != 0) "PCFG_MM_RESERVOIR_WARNING_TYPE_TIME" else "PCFG_MM_RESERVOIR_WARNING_TYPE_UNITS", PumpConfigurationGroup.Other, map)
|
||||
addSettingToMap("PCFG_MM_SRESERVOIR_WARNING_POINT", "" + ByteUtil.asUINT8(rd[19]),
|
||||
PumpConfigurationGroup.Other, map)
|
||||
addSettingToMap(
|
||||
"PCFG_MM_RESERVOIR_WARNING_TYPE_TIME",
|
||||
if (rd[18].toInt() != 0) "PCFG_MM_RESERVOIR_WARNING_TYPE_TIME" else "PCFG_MM_RESERVOIR_WARNING_TYPE_UNITS",
|
||||
PumpConfigurationGroup.Other,
|
||||
map
|
||||
)
|
||||
addSettingToMap(
|
||||
"PCFG_MM_SRESERVOIR_WARNING_POINT", "" + ByteUtil.asUINT8(rd[19]),
|
||||
PumpConfigurationGroup.Other, map
|
||||
)
|
||||
addSettingToMap("CFG_MM_KEYPAD_LOCKED", parseResultEnable(rd[20].toInt()), PumpConfigurationGroup.Other, map)
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.medtronicPumpModel, MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
addSettingToMap("PCFG_BOLUS_SCROLL_STEP_SIZE", "" + rd[21], PumpConfigurationGroup.Bolus, map)
|
||||
addSettingToMap("PCFG_CAPTURE_EVENT_ENABLE", parseResultEnable(rd[22].toInt()), PumpConfigurationGroup.Other, map)
|
||||
addSettingToMap("PCFG_OTHER_DEVICE_ENABLE", parseResultEnable(rd[23].toInt()), PumpConfigurationGroup.Other, map)
|
||||
addSettingToMap("PCFG_OTHER_DEVICE_PAIRED_STATE", parseResultEnable(rd[24].toInt()), PumpConfigurationGroup.Other,
|
||||
map)
|
||||
addSettingToMap(
|
||||
"PCFG_OTHER_DEVICE_PAIRED_STATE", parseResultEnable(rd[24].toInt()), PumpConfigurationGroup.Other,
|
||||
map
|
||||
)
|
||||
}
|
||||
return map
|
||||
}
|
||||
|
@ -234,8 +264,10 @@ class MedtronicConverter @Inject constructor(
|
|||
// 512
|
||||
private fun decodeInsulinActionSetting(ai: ByteArray, map: MutableMap<String, PumpSettingDTO>) {
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.medtronicPumpModel, MedtronicDeviceType.Medtronic_512_712)) {
|
||||
addSettingToMap("PCFG_INSULIN_ACTION_TYPE", if (ai[17].toInt() != 0) "Regular" else "Fast",
|
||||
PumpConfigurationGroup.Insulin, map)
|
||||
addSettingToMap(
|
||||
"PCFG_INSULIN_ACTION_TYPE", if (ai[17].toInt() != 0) "Regular" else "Fast",
|
||||
PumpConfigurationGroup.Insulin, map
|
||||
)
|
||||
} else {
|
||||
val i = ai[17].toInt()
|
||||
val s: String
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.history
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import org.apache.commons.lang3.StringUtils
|
||||
|
@ -14,9 +13,9 @@ import org.apache.commons.lang3.StringUtils
|
|||
*
|
||||
* Author: Andy {andy.rozman@gmail.com}
|
||||
*/
|
||||
abstract class MedtronicHistoryDecoder<T : MedtronicHistoryEntry?>(var aapsLogger: AAPSLogger,
|
||||
var medtronicUtil: MedtronicUtil,
|
||||
var bitUtils: ByteUtil
|
||||
abstract class MedtronicHistoryDecoder<T : MedtronicHistoryEntry?>(
|
||||
var aapsLogger: AAPSLogger,
|
||||
var medtronicUtil: MedtronicUtil
|
||||
) : MedtronicHistoryDecoderInterface<T> {
|
||||
|
||||
// STATISTICS (remove at later time or not)
|
||||
|
|
|
@ -2,8 +2,8 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm.history
|
|||
|
||||
import com.google.gson.annotations.Expose
|
||||
import info.nightscout.core.utils.DateTimeUtil
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
|
||||
/**
|
||||
* This file was taken from GGC - GNU Gluco Control (ggc.sourceforge.net), application for diabetes
|
||||
|
|
|
@ -2,7 +2,7 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm.history
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.CRC
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import java.util.Arrays
|
||||
|
@ -36,8 +36,11 @@ class RawHistoryPage(private val aapsLogger: AAPSLogger) {
|
|||
val crcStored = ByteUtil.toInt(data[1022].toInt(), data[1023].toInt())
|
||||
if (crcCalculated != crcStored) {
|
||||
aapsLogger.error(
|
||||
LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "Stored CRC (%d) is different than calculated (%d), but ignored for now.", crcStored,
|
||||
crcCalculated))
|
||||
LTag.PUMPBTCOMM, String.format(
|
||||
Locale.ENGLISH, "Stored CRC (%d) is different than calculated (%d), but ignored for now.", crcStored,
|
||||
crcCalculated
|
||||
)
|
||||
)
|
||||
} else {
|
||||
if (MedtronicUtil.isLowLevelDebug) aapsLogger.debug(LTag.PUMPBTCOMM, "CRC ok.")
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm.history.cgms
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.MedtronicHistoryEntry
|
||||
import info.nightscout.core.utils.DateTimeUtil
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import org.apache.commons.lang3.StringUtils
|
||||
import org.joda.time.LocalDateTime
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.RecordDeco
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.cgms.CGMSHistoryEntryType.Companion.getByCode
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.core.utils.DateTimeUtil
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import org.joda.time.LocalDateTime
|
||||
|
@ -20,9 +19,8 @@ import java.util.Arrays
|
|||
*/
|
||||
class MedtronicCGMSHistoryDecoder constructor(
|
||||
aapsLogger: AAPSLogger,
|
||||
medtronicUtil: MedtronicUtil,
|
||||
bitUtils: ByteUtil
|
||||
) : MedtronicHistoryDecoder<CGMSHistoryEntry>(aapsLogger, medtronicUtil, bitUtils) {
|
||||
medtronicUtil: MedtronicUtil
|
||||
) : MedtronicHistoryDecoder<CGMSHistoryEntry>(aapsLogger, medtronicUtil) {
|
||||
|
||||
override fun decodeRecord(record: CGMSHistoryEntry): RecordDecodeStatus? {
|
||||
return try {
|
||||
|
@ -172,8 +170,10 @@ class MedtronicCGMSHistoryDecoder constructor(
|
|||
if (!entry.entryType.hasDate()) return null
|
||||
val data = entry.datetime
|
||||
return if (entry.entryType.dateType === CGMSHistoryEntryType.DateType.MinuteSpecific) {
|
||||
val atechDateTime = DateTimeUtil.toATechDate(parseYear(data[3].toInt()), parseMonths(data[0].toInt(), data[1].toInt()),
|
||||
parseDay(data[2].toInt()), parseHours(data[0].toInt()), parseMinutes(data[1].toInt()), 0)
|
||||
val atechDateTime = DateTimeUtil.toATechDate(
|
||||
parseYear(data[3].toInt()), parseMonths(data[0].toInt(), data[1].toInt()),
|
||||
parseDay(data[2].toInt()), parseHours(data[0].toInt()), parseMinutes(data[1].toInt()), 0
|
||||
)
|
||||
entry.atechDateTime = atechDateTime
|
||||
atechDateTime
|
||||
} else if (entry.entryType.dateType === CGMSHistoryEntryType.DateType.SecondSpecific) {
|
||||
|
|
|
@ -12,7 +12,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceTyp
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpBolusType
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.core.utils.DateTimeUtil
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import java.util.Locale
|
||||
|
@ -30,9 +30,8 @@ import kotlin.experimental.and
|
|||
@Singleton
|
||||
class MedtronicPumpHistoryDecoder @Inject constructor(
|
||||
aapsLogger: AAPSLogger,
|
||||
medtronicUtil: MedtronicUtil,
|
||||
bitUtils: ByteUtil
|
||||
) : MedtronicHistoryDecoder<PumpHistoryEntry>(aapsLogger, medtronicUtil, bitUtils) {
|
||||
medtronicUtil: MedtronicUtil
|
||||
) : MedtronicHistoryDecoder<PumpHistoryEntry>(aapsLogger, medtronicUtil) {
|
||||
|
||||
//private var tbrPreviousRecord: PumpHistoryEntry? = null
|
||||
private var changeTimeRecord: PumpHistoryEntry? = null
|
||||
|
@ -78,7 +77,8 @@ class MedtronicPumpHistoryDecoder @Inject constructor(
|
|||
val listRawData: MutableList<Byte> = ArrayList()
|
||||
listRawData.add(opCode.toByte())
|
||||
if (entryType === PumpHistoryEntryType.UnabsorbedInsulin
|
||||
|| entryType === PumpHistoryEntryType.UnabsorbedInsulin512) {
|
||||
|| entryType === PumpHistoryEntryType.UnabsorbedInsulin512
|
||||
) {
|
||||
val elements: Int = dataClearInput[counter].toInt()
|
||||
listRawData.add(elements.toByte())
|
||||
counter++
|
||||
|
@ -98,7 +98,8 @@ class MedtronicPumpHistoryDecoder @Inject constructor(
|
|||
} catch (ex: Exception) {
|
||||
aapsLogger.error(
|
||||
LTag.PUMPBTCOMM, "OpCode: " + ByteUtil.shortHexString(opCode.toByte()) + ", Invalid package: "
|
||||
+ ByteUtil.getHex(listRawData))
|
||||
+ ByteUtil.getHex(listRawData)
|
||||
)
|
||||
// throw ex;
|
||||
incompletePacket = true
|
||||
break
|
||||
|
@ -204,12 +205,15 @@ class MedtronicPumpHistoryDecoder @Inject constructor(
|
|||
|
||||
PumpHistoryEntryType.UnabsorbedInsulin,
|
||||
PumpHistoryEntryType.UnabsorbedInsulin512 -> RecordDecodeStatus.Ignored
|
||||
|
||||
PumpHistoryEntryType.DailyTotals522,
|
||||
PumpHistoryEntryType.DailyTotals523,
|
||||
PumpHistoryEntryType.DailyTotals515,
|
||||
PumpHistoryEntryType.EndResultTotals -> decodeDailyTotals(entry)
|
||||
|
||||
PumpHistoryEntryType.ChangeBasalProfile_OldProfile,
|
||||
PumpHistoryEntryType.ChangeBasalProfile_NewProfile -> decodeBasalProfile(entry)
|
||||
|
||||
PumpHistoryEntryType.BasalProfileStart -> decodeBasalProfileStart(entry)
|
||||
|
||||
PumpHistoryEntryType.ChangeTime -> {
|
||||
|
@ -253,6 +257,7 @@ class MedtronicPumpHistoryDecoder @Inject constructor(
|
|||
PumpHistoryEntryType.ChangeMaxBasal,
|
||||
PumpHistoryEntryType.ClearSettings,
|
||||
PumpHistoryEntryType.SaveSettings -> RecordDecodeStatus.OK
|
||||
|
||||
PumpHistoryEntryType.BolusWizard -> decodeBolusWizard(entry)
|
||||
PumpHistoryEntryType.BolusWizard512 -> decodeBolusWizard512(entry)
|
||||
|
||||
|
@ -425,16 +430,20 @@ class MedtronicPumpHistoryDecoder @Inject constructor(
|
|||
val bolus: BolusDTO?
|
||||
val data = entry.head
|
||||
if (MedtronicDeviceType.isSameDevice(medtronicUtil.medtronicPumpModel, MedtronicDeviceType.Medtronic_523andHigher)) {
|
||||
bolus = BolusDTO(atechDateTime = entry.atechDateTime,
|
||||
bolus = BolusDTO(
|
||||
atechDateTime = entry.atechDateTime,
|
||||
requestedAmount = ByteUtil.toInt(data.get(0), data.get(1)) / 40.0,
|
||||
deliveredAmount = ByteUtil.toInt(data.get(2), data.get(3)) / 40.0,
|
||||
duration = data.get(6) * 30)
|
||||
duration = data.get(6) * 30
|
||||
)
|
||||
bolus.insulinOnBoard = ByteUtil.toInt(data.get(4), data.get(5)) / 40.0
|
||||
} else {
|
||||
bolus = BolusDTO(atechDateTime = entry.atechDateTime,
|
||||
bolus = BolusDTO(
|
||||
atechDateTime = entry.atechDateTime,
|
||||
requestedAmount = ByteUtil.asUINT8(data.get(0)) / 10.0,
|
||||
deliveredAmount = ByteUtil.asUINT8(data.get(1)) / 10.0,
|
||||
duration = ByteUtil.asUINT8(data.get(2)) * 30)
|
||||
duration = ByteUtil.asUINT8(data.get(2)) * 30
|
||||
)
|
||||
}
|
||||
bolus.bolusType = if (bolus.duration > 0) PumpBolusType.Extended else PumpBolusType.Normal
|
||||
entry.addDecodedData("Object", bolus)
|
||||
|
@ -459,7 +468,8 @@ class MedtronicPumpHistoryDecoder @Inject constructor(
|
|||
tbrRate.head.get(0),
|
||||
tbrRate.body.get(0),
|
||||
tbrDuration!!.head.get(0).toInt(),
|
||||
ByteUtil.asUINT8(tbrRate.datetime.get(4)) shr 3 == 0)
|
||||
ByteUtil.asUINT8(tbrRate.datetime.get(4)) shr 3 == 0
|
||||
)
|
||||
|
||||
entry.addDecodedData("Object", tbr)
|
||||
entry.displayableValue = tbr.description
|
||||
|
@ -495,8 +505,11 @@ class MedtronicPumpHistoryDecoder @Inject constructor(
|
|||
//LOG.debug("DT: {} {} {}", year, month, dayOfMonth);
|
||||
if (dayOfMonth == 32) {
|
||||
aapsLogger.warn(
|
||||
LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "Entry: Day 32 %s = [%s] %s", entry.entryType.name,
|
||||
ByteUtil.getHex(entry.rawData), entry))
|
||||
LTag.PUMPBTCOMM, String.format(
|
||||
Locale.ENGLISH, "Entry: Day 32 %s = [%s] %s", entry.entryType.name,
|
||||
ByteUtil.getHex(entry.rawData), entry
|
||||
)
|
||||
)
|
||||
}
|
||||
if (isEndResults(entry.entryType)) {
|
||||
hour = 23
|
||||
|
|
|
@ -4,8 +4,8 @@ import com.google.gson.annotations.Expose
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.MedtronicHistoryEntry
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.data.dto.BolusDTO
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceType
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
import java.util.Objects
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.message
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import kotlin.experimental.and
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.comm.message
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
|
||||
/**
|
||||
* Created by geoff on 5/29/16.
|
||||
|
|
|
@ -2,7 +2,7 @@ package info.nightscout.androidaps.plugins.pump.medtronic.comm.message
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RLMessage
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import kotlin.math.min
|
||||
|
@ -61,8 +61,10 @@ class PumpMessage : RLMessage {
|
|||
}
|
||||
}
|
||||
if (rxData.size > 5) {
|
||||
messageBody = MedtronicCommandType.constructMessageBody(commandType,
|
||||
ByteUtil.substring(rxData, 5, rxData.size - 5))
|
||||
messageBody = MedtronicCommandType.constructMessageBody(
|
||||
commandType,
|
||||
ByteUtil.substring(rxData, 5, rxData.size - 5)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicUIRespons
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.events.EventMedtronicPumpValuesChanged
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
|
@ -106,8 +106,10 @@ class MedtronicUITask {
|
|||
}
|
||||
|
||||
MedtronicCommandType.GetHistoryData -> {
|
||||
result = communicationManager.getPumpHistory(parameters!![0] as PumpHistoryEntry?,
|
||||
parameters!![1] as LocalDateTime?)
|
||||
result = communicationManager.getPumpHistory(
|
||||
parameters!![0] as PumpHistoryEntry?,
|
||||
parameters!![1] as LocalDateTime?
|
||||
)
|
||||
}
|
||||
|
||||
else -> {
|
||||
|
@ -127,9 +129,11 @@ class MedtronicUITask {
|
|||
}
|
||||
|
||||
private fun getTbrSettings(): TempBasalPair {
|
||||
return TempBasalPair(getDoubleFromParameters(0)!!, //
|
||||
return TempBasalPair(
|
||||
getDoubleFromParameters(0)!!, //
|
||||
false, //
|
||||
getIntegerFromParameters(1))
|
||||
getIntegerFromParameters(1)
|
||||
)
|
||||
}
|
||||
|
||||
private fun getFloatFromParameters(index: Int): Float {
|
||||
|
@ -153,13 +157,19 @@ class MedtronicUITask {
|
|||
postprocessor.postProcessData(this)
|
||||
}
|
||||
if (responseType === MedtronicUIResponseType.Invalid) {
|
||||
rxBus.send(EventRileyLinkDeviceStatusChange(
|
||||
rxBus.send(
|
||||
EventRileyLinkDeviceStatusChange(
|
||||
PumpDeviceState.ErrorWhenCommunicating,
|
||||
"Unsupported command in MedtronicUITask"))
|
||||
"Unsupported command in MedtronicUITask"
|
||||
)
|
||||
)
|
||||
} else if (responseType === MedtronicUIResponseType.Error) {
|
||||
rxBus.send(EventRileyLinkDeviceStatusChange(
|
||||
rxBus.send(
|
||||
EventRileyLinkDeviceStatusChange(
|
||||
PumpDeviceState.ErrorWhenCommunicating,
|
||||
errorDescription))
|
||||
errorDescription
|
||||
)
|
||||
)
|
||||
} else {
|
||||
rxBus.send(EventMedtronicPumpValuesChanged())
|
||||
medtronicPumpStatus.setLastCommunicationToNow()
|
||||
|
|
|
@ -32,7 +32,7 @@ import info.nightscout.pump.common.sync.PumpDbEntryBolus
|
|||
import info.nightscout.pump.common.sync.PumpDbEntryCarbs
|
||||
import info.nightscout.pump.common.sync.PumpDbEntryTBR
|
||||
import info.nightscout.pump.common.sync.PumpSyncStorage
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.data.dto
|
||||
|
||||
import com.google.gson.annotations.Expose
|
||||
import info.nightscout.interfaces.pump.defs.PumpType
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.interfaces.pump.defs.PumpType
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import org.joda.time.Instant
|
||||
|
@ -102,8 +102,11 @@ class BasalProfile {
|
|||
val startString = entry.startTime!!.toString("HH:mm")
|
||||
// this doesn't work
|
||||
aapsLogger.debug(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Entry %d, rate=%.3f (%s), start=%s (0x%02X)", i + 1, entry.rate,
|
||||
ByteUtil.getHex(entry.rate_raw), startString, entry.startTime_raw))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "Entry %d, rate=%.3f (%s), start=%s (0x%02X)", i + 1, entry.rate,
|
||||
ByteUtil.getHex(entry.rate_raw), startString, entry.startTime_raw
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -142,8 +145,11 @@ class BasalProfile {
|
|||
val entries = getEntries()
|
||||
if (entries.size == 0) {
|
||||
aapsLogger.warn(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "getEntryForTime(%s): table is empty",
|
||||
`when`.toDateTime().toLocalTime().toString("HH:mm")))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "getEntryForTime(%s): table is empty",
|
||||
`when`.toDateTime().toLocalTime().toString("HH:mm")
|
||||
)
|
||||
)
|
||||
return rval
|
||||
}
|
||||
// Log.w(TAG,"Assuming first entry");
|
||||
|
@ -159,8 +165,11 @@ class BasalProfile {
|
|||
val entry = entries[i]
|
||||
if (DEBUG_BASALPROFILE) {
|
||||
aapsLogger.debug(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "Comparing 'now'=%s to entry 'start time'=%s", `when`.toDateTime().toLocalTime()
|
||||
.toString("HH:mm"), entry.startTime!!.toString("HH:mm")))
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "Comparing 'now'=%s to entry 'start time'=%s", `when`.toDateTime().toLocalTime()
|
||||
.toString("HH:mm"), entry.startTime!!.toString("HH:mm")
|
||||
)
|
||||
)
|
||||
}
|
||||
if (localMillis >= entry.startTime!!.millisOfDay) {
|
||||
rval = entry
|
||||
|
@ -177,9 +186,12 @@ class BasalProfile {
|
|||
}
|
||||
if (DEBUG_BASALPROFILE) {
|
||||
aapsLogger.debug(
|
||||
LTag.PUMPCOMM, String.format(Locale.ENGLISH, "getEntryForTime(%s): Returning entry: rate=%.3f (%s), start=%s (%d)", `when`
|
||||
LTag.PUMPCOMM, String.format(
|
||||
Locale.ENGLISH, "getEntryForTime(%s): Returning entry: rate=%.3f (%s), start=%s (%d)", `when`
|
||||
.toDateTime().toLocalTime().toString("HH:mm"), rval.rate, ByteUtil.getHex(rval.rate_raw),
|
||||
rval.startTime!!.toString("HH:mm"), rval.startTime_raw))
|
||||
rval.startTime!!.toString("HH:mm"), rval.startTime_raw
|
||||
)
|
||||
)
|
||||
}
|
||||
return rval
|
||||
}// readUnsignedByte(mRawData[i]);
|
||||
|
|
|
@ -2,7 +2,7 @@ package info.nightscout.androidaps.plugins.pump.medtronic.data.dto
|
|||
|
||||
import com.google.gson.annotations.Expose
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.PumpBolusType
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
|
||||
/**
|
||||
* Application: GGC - GNU Gluco Control
|
||||
|
@ -30,7 +30,8 @@ import info.nightscout.pump.core.utils.StringUtil
|
|||
*
|
||||
* Author: Andy {andy@atech-software.com}
|
||||
*/
|
||||
class BolusDTO constructor(atechDateTime: Long,
|
||||
class BolusDTO constructor(
|
||||
atechDateTime: Long,
|
||||
@Expose var requestedAmount: Double,
|
||||
@Expose var deliveredAmount: Double,
|
||||
@Expose var duration: Int = 0
|
||||
|
@ -56,11 +57,15 @@ class BolusDTO constructor(atechDateTime: Long,
|
|||
get() = if (bolusType === PumpBolusType.Normal || bolusType === PumpBolusType.Audio) {
|
||||
getFormattedDecimal(deliveredAmount)
|
||||
} else if (bolusType === PumpBolusType.Extended) {
|
||||
String.format("AMOUNT_SQUARE=%s;DURATION=%s", getFormattedDecimal(deliveredAmount),
|
||||
durationString)
|
||||
String.format(
|
||||
"AMOUNT_SQUARE=%s;DURATION=%s", getFormattedDecimal(deliveredAmount),
|
||||
durationString
|
||||
)
|
||||
} else {
|
||||
String.format("AMOUNT=%s;AMOUNT_SQUARE=%s;DURATION=%s", getFormattedDecimal(immediateAmount!!),
|
||||
getFormattedDecimal(deliveredAmount), durationString)
|
||||
String.format(
|
||||
"AMOUNT=%s;AMOUNT_SQUARE=%s;DURATION=%s", getFormattedDecimal(immediateAmount!!),
|
||||
getFormattedDecimal(deliveredAmount), durationString
|
||||
)
|
||||
}
|
||||
|
||||
val displayableValue: String
|
||||
|
|
|
@ -4,8 +4,8 @@ package info.nightscout.androidaps.plugins.pump.medtronic.data.dto
|
|||
import com.google.gson.annotations.Expose
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntryType
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder
|
||||
import java.util.Locale
|
||||
|
||||
|
@ -64,8 +64,10 @@ class DailyTotalsDTO(var entry: PumpHistoryEntry) {
|
|||
}
|
||||
|
||||
private fun decodeEndResultsTotals(entry: PumpHistoryEntry) {
|
||||
val totals = ByteUtil.toInt(entry.head[0].toInt(), entry.head[1].toInt(), entry.head[2].toInt(),
|
||||
entry.head[3].toInt(), ByteUtil.BitConversion.BIG_ENDIAN) * 0.025
|
||||
val totals = ByteUtil.toInt(
|
||||
entry.head[0].toInt(), entry.head[1].toInt(), entry.head[2].toInt(),
|
||||
entry.head[3].toInt(), ByteUtil.BitConversion.BIG_ENDIAN
|
||||
) * 0.025
|
||||
insulinTotal = totals
|
||||
entry.addDecodedData("Totals", totals)
|
||||
}
|
||||
|
@ -79,11 +81,19 @@ class DailyTotalsDTO(var entry: PumpHistoryEntry) {
|
|||
val k: Int = ByteUtil.toInt(data[i], data[i + 1], data[i + 2])
|
||||
val j1 = ByteUtil.toInt(data[i + 1], data[i])
|
||||
val k1: Int = ByteUtil.toInt(data[i + 2], data[i + 1], data[i])
|
||||
println(String.format(Locale.ENGLISH,
|
||||
println(
|
||||
String.format(
|
||||
Locale.ENGLISH,
|
||||
"index: %d, number=%d, del/40=%.3f, del/10=%.3f, singular=%d, sing_hex=%s", i, j, j / 40.0, j / 10.0,
|
||||
data[i], ByteUtil.shortHexString(data[i])))
|
||||
println(String.format(Locale.ENGLISH, " number[k,j1,k1]=%d / %d /%d, del/40=%.3f, del/40=%.3f, del/40=%.3f",
|
||||
k, j1, k1, k / 40.0, j1 / 40.0, k1 / 40.0))
|
||||
data[i], ByteUtil.shortHexString(data[i])
|
||||
)
|
||||
)
|
||||
println(
|
||||
String.format(
|
||||
Locale.ENGLISH, " number[k,j1,k1]=%d / %d /%d, del/40=%.3f, del/40=%.3f, del/40=%.3f",
|
||||
k, j1, k1, k / 40.0, j1 / 40.0, k1 / 40.0
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.data.dto
|
||||
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
|
||||
/**
|
||||
* Created by andy on 6/2/18.
|
||||
|
|
|
@ -2,7 +2,7 @@ package info.nightscout.androidaps.plugins.pump.medtronic.data.dto
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.pump.common.defs.TempBasalPair
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import java.util.Locale
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.medtronic.di
|
||||
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.android.ContributesAndroidInjector
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicFragment
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.MedtronicCommunicationManager
|
||||
|
@ -9,7 +8,6 @@ import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUIComm
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.comm.ui.MedtronicUITask
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.dialog.MedtronicHistoryActivity
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.service.RileyLinkMedtronicService
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
|
||||
@Module
|
||||
@Suppress("unused")
|
||||
|
@ -26,10 +24,4 @@ abstract class MedtronicModule {
|
|||
abstract fun medtronicCommunicationManagerProvider(): MedtronicCommunicationManager
|
||||
@ContributesAndroidInjector abstract fun medtronicUITaskProvider(): MedtronicUITask
|
||||
@ContributesAndroidInjector abstract fun medtronicUICommProvider(): MedtronicUIComm
|
||||
|
||||
companion object {
|
||||
|
||||
@Provides
|
||||
fun byteUtilProvider(): ByteUtil = ByteUtil()
|
||||
}
|
||||
}
|
|
@ -11,8 +11,8 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicConst
|
|||
import info.nightscout.annotations.OpenForTesting
|
||||
import info.nightscout.interfaces.pump.defs.PumpType
|
||||
import info.nightscout.pump.common.data.PumpStatus
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState
|
||||
import info.nightscout.pump.common.sync.PumpDbEntryTBR
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.shared.interfaces.ResourceHelper
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
|
|
|
@ -17,8 +17,8 @@ import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceTyp
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicConst
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
|
|
@ -13,7 +13,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceTyp
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicNotificationType
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus
|
||||
import info.nightscout.interfaces.ui.UiInteraction
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.rx.events.EventDismissNotification
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
|
@ -21,6 +21,7 @@ import info.nightscout.rx.logging.LTag
|
|||
import info.nightscout.shared.interfaces.ResourceHelper
|
||||
import java.nio.ByteBuffer
|
||||
import java.nio.ByteOrder
|
||||
import java.security.InvalidParameterException
|
||||
import java.util.Locale
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
@ -45,8 +46,10 @@ class MedtronicUtil @Inject constructor(
|
|||
//private MedtronicDeviceType medtronicPumpModel;
|
||||
private var currentCommand: MedtronicCommandType? = null
|
||||
var settings: Map<String, PumpSettingDTO>? = null
|
||||
|
||||
@Suppress("PrivatePropertyName")
|
||||
private val BIG_FRAME_LENGTH = 65
|
||||
|
||||
//private val doneBit = 1 shl 7
|
||||
var pumpTime: ClockDTO? = null
|
||||
var gsonInstance: Gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
|
||||
|
@ -89,7 +92,7 @@ class MedtronicUtil @Inject constructor(
|
|||
scrollRate = 1
|
||||
}
|
||||
val strokes = (amount * (strokesPerUnit * 1.0 / (scrollRate * 1.0))).toInt() * scrollRate
|
||||
return ByteUtil.fromHexString(String.format("%02x%0" + 2 * length + "x", length, strokes))
|
||||
return ByteUtil.fromHexString(String.format("%02x%0" + 2 * length + "x", length, strokes)) ?: throw InvalidParameterException()
|
||||
}
|
||||
|
||||
// fun createCommandBody(input: ByteArray): ByteArray {
|
||||
|
@ -169,7 +172,7 @@ class MedtronicUtil @Inject constructor(
|
|||
|
||||
// System.out.println("Subarray: " + ByteUtil.getCompactString(substring));
|
||||
// System.out.println("Subarray Lenths: " + substring.length);
|
||||
val frameData = ByteUtil.getListFromByteArray(substring)
|
||||
val frameData = ByteUtil.getListFromByteArray(substring).toMutableList()
|
||||
if (isEmptyFrame(frameData)) {
|
||||
var b = frame.toByte()
|
||||
// b |= 0x80;
|
||||
|
|
|
@ -10,7 +10,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
|||
import info.nightscout.interfaces.plugin.ActivePlugin
|
||||
import info.nightscout.interfaces.pump.PumpSync
|
||||
import info.nightscout.pump.common.sync.PumpSyncStorage
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.shared.interfaces.ResourceHelper
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
import info.nightscout.sharedtests.TestBase
|
||||
|
|
|
@ -13,7 +13,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpSta
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.database.impl.serialisation.SealedClassHelper
|
||||
import info.nightscout.interfaces.ui.UiInteraction
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mock
|
||||
|
|
|
@ -6,7 +6,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicDeviceTyp
|
|||
import info.nightscout.androidaps.plugins.pump.medtronic.driver.MedtronicPumpStatus
|
||||
import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil
|
||||
import info.nightscout.interfaces.ui.UiInteraction
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
|
@ -14,7 +16,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.Po
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception.CrcMismatchException;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception.MessageDecodingException;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception.NotEnoughDataException;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.rx.logging.AAPSLogger;
|
||||
import info.nightscout.rx.logging.LTag;
|
||||
|
||||
|
@ -41,20 +43,20 @@ public class OmnipodMessage {
|
|||
throw new NotEnoughDataException(data);
|
||||
}
|
||||
|
||||
int address = ByteUtil.toInt((int) data[0], (int) data[1], (int) data[2],
|
||||
int address = ByteUtil.INSTANCE.toInt((int) data[0], (int) data[1], (int) data[2],
|
||||
(int) data[3], ByteUtil.BitConversion.BIG_ENDIAN);
|
||||
byte b9 = data[4];
|
||||
int bodyLength = ByteUtil.convertUnsignedByteToInt(data[5]);
|
||||
int bodyLength = ByteUtil.INSTANCE.convertUnsignedByteToInt(data[5]);
|
||||
if (data.length - 8 < bodyLength) {
|
||||
throw new NotEnoughDataException(data);
|
||||
}
|
||||
int sequenceNumber = (((int) b9 >> 2) & 0b11111);
|
||||
int crc = ByteUtil.toInt(data[data.length - 2], data[data.length - 1]);
|
||||
int calculatedCrc = OmnipodCrc.crc16(ByteUtil.substring(data, 0, data.length - 2));
|
||||
int crc = ByteUtil.INSTANCE.toInt(data[data.length - 2], data[data.length - 1]);
|
||||
int calculatedCrc = OmnipodCrc.crc16(ByteUtil.INSTANCE.substring(data, 0, data.length - 2));
|
||||
if (crc != calculatedCrc) {
|
||||
throw new CrcMismatchException(calculatedCrc, crc);
|
||||
}
|
||||
List<MessageBlock> blocks = decodeBlocks(ByteUtil.substring(data, 6, data.length - 6 - 2));
|
||||
List<MessageBlock> blocks = decodeBlocks(ByteUtil.INSTANCE.substring(data, 6, data.length - 6 - 2));
|
||||
if (blocks.size() == 0) {
|
||||
throw new MessageDecodingException("No blocks decoded");
|
||||
}
|
||||
|
@ -68,7 +70,7 @@ public class OmnipodMessage {
|
|||
while (index < data.length) {
|
||||
try {
|
||||
MessageBlockType blockType = MessageBlockType.fromByte(data[index]);
|
||||
MessageBlock block = blockType.decode(ByteUtil.substring(data, index));
|
||||
MessageBlock block = blockType.decode(ByteUtil.INSTANCE.substring(data, index));
|
||||
blocks.add(block);
|
||||
int blockLength = block.getRawData().length;
|
||||
index += blockLength;
|
||||
|
@ -83,17 +85,17 @@ public class OmnipodMessage {
|
|||
public byte[] getEncoded() {
|
||||
byte[] encodedData = new byte[0];
|
||||
for (MessageBlock messageBlock : messageBlocks) {
|
||||
encodedData = ByteUtil.concat(encodedData, messageBlock.getRawData());
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, messageBlock.getRawData());
|
||||
}
|
||||
|
||||
byte[] header = new byte[0];
|
||||
//right before the message blocks we have 6 bits of seqNum and 10 bits of length
|
||||
header = ByteUtil.concat(header, ByteUtil.getBytesFromInt(address));
|
||||
header = ByteUtil.concat(header, (byte) (((sequenceNumber & 0x1F) << 2) + ((encodedData.length >> 8) & 0x03)));
|
||||
header = ByteUtil.concat(header, (byte) (encodedData.length & 0xFF));
|
||||
encodedData = ByteUtil.concat(header, encodedData);
|
||||
header = ByteUtil.INSTANCE.concat(header, ByteUtil.INSTANCE.getBytesFromInt(address));
|
||||
header = ByteUtil.INSTANCE.concat(header, (byte) (((sequenceNumber & 0x1F) << 2) + ((encodedData.length >> 8) & 0x03)));
|
||||
header = ByteUtil.INSTANCE.concat(header, (byte) (encodedData.length & 0xFF));
|
||||
encodedData = ByteUtil.INSTANCE.concat(header, encodedData);
|
||||
int crc = OmnipodCrc.crc16(encodedData);
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.substring(ByteUtil.getBytesFromInt(crc), 2, 2));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.substring(ByteUtil.INSTANCE.getBytesFromInt(crc), 2, 2));
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
|
@ -160,12 +162,12 @@ public class OmnipodMessage {
|
|||
return messageBlocks.size() >= 1 && messageBlocks.get(0).getType() == MessageBlockType.CANCEL_DELIVERY;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull @Override
|
||||
public String toString() {
|
||||
return "OmnipodMessage{" +
|
||||
"address=" + address +
|
||||
", messageBlocks=" + messageBlocks +
|
||||
", encoded=" + ByteUtil.shortHexStringWithoutSpaces(getEncoded()) +
|
||||
", encoded=" + ByteUtil.INSTANCE.shortHexStringWithoutSpaces(getEncoded()) +
|
||||
", sequenceNumber=" + sequenceNumber +
|
||||
'}';
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.Om
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PacketType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception.CrcMismatchException;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception.IllegalPacketTypeException;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
/**
|
||||
* Created by andy on 6/1/18.
|
||||
|
@ -21,7 +21,7 @@ public class OmnipodPacket implements RLMessage {
|
|||
if (encoded.length < 7) {
|
||||
return;
|
||||
}
|
||||
this.packetAddress = ByteUtil.toInt((int) encoded[0], (int) encoded[1],
|
||||
this.packetAddress = ByteUtil.INSTANCE.toInt((int) encoded[0], (int) encoded[1],
|
||||
(int) encoded[2], (int) encoded[3], ByteUtil.BitConversion.BIG_ENDIAN);
|
||||
try {
|
||||
this.packetType = PacketType.fromByte((byte) (((int) encoded[4] & 0xFF) >> 5));
|
||||
|
@ -29,11 +29,11 @@ public class OmnipodPacket implements RLMessage {
|
|||
throw new IllegalPacketTypeException(null, null);
|
||||
}
|
||||
this.sequenceNumber = (encoded[4] & 0b11111);
|
||||
byte crc = OmnipodCrc.crc8(ByteUtil.substring(encoded, 0, encoded.length - 1));
|
||||
byte crc = OmnipodCrc.crc8(ByteUtil.INSTANCE.substring(encoded, 0, encoded.length - 1));
|
||||
if (crc != encoded[encoded.length - 1]) {
|
||||
throw new CrcMismatchException(crc, encoded[encoded.length - 1]);
|
||||
}
|
||||
this.encodedMessage = ByteUtil.substring(encoded, 5, encoded.length - 1 - 5);
|
||||
this.encodedMessage = ByteUtil.INSTANCE.substring(encoded, 5, encoded.length - 1 - 5);
|
||||
valid = true;
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,7 @@ public class OmnipodPacket implements RLMessage {
|
|||
this.sequenceNumber = packetNumber;
|
||||
this.encodedMessage = encodedMessage;
|
||||
if (encodedMessage.length > packetType.getMaxBodyLength()) {
|
||||
this.encodedMessage = ByteUtil.substring(encodedMessage, 0, packetType.getMaxBodyLength());
|
||||
this.encodedMessage = ByteUtil.INSTANCE.substring(encodedMessage, 0, packetType.getMaxBodyLength());
|
||||
}
|
||||
this.valid = true;
|
||||
}
|
||||
|
@ -67,10 +67,10 @@ public class OmnipodPacket implements RLMessage {
|
|||
@Override
|
||||
public byte[] getTxData() {
|
||||
byte[] output = new byte[0];
|
||||
output = ByteUtil.concat(output, ByteUtil.getBytesFromInt(this.packetAddress));
|
||||
output = ByteUtil.concat(output, (byte) ((this.packetType.getValue() << 5) + (sequenceNumber & 0b11111)));
|
||||
output = ByteUtil.concat(output, encodedMessage);
|
||||
output = ByteUtil.concat(output, OmnipodCrc.crc8(output));
|
||||
output = ByteUtil.INSTANCE.concat(output, ByteUtil.INSTANCE.getBytesFromInt(this.packetAddress));
|
||||
output = ByteUtil.INSTANCE.concat(output, (byte) ((this.packetType.getValue() << 5) + (sequenceNumber & 0b11111)));
|
||||
output = ByteUtil.INSTANCE.concat(output, encodedMessage);
|
||||
output = ByteUtil.INSTANCE.concat(output, OmnipodCrc.crc8(output));
|
||||
return output;
|
||||
}
|
||||
|
||||
|
@ -85,7 +85,7 @@ public class OmnipodPacket implements RLMessage {
|
|||
"packetAddress=" + packetAddress +
|
||||
", packetType=" + packetType +
|
||||
", sequenceNumber=" + sequenceNumber +
|
||||
", encodedMessage=" + ByteUtil.shortHexStringWithoutSpaces(encodedMessage) +
|
||||
", encodedMessage=" + ByteUtil.INSTANCE.shortHexStringWithoutSpaces(encodedMessage) +
|
||||
", valid=" + valid +
|
||||
'}';
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.AlertSet;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.AlertSlot;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class AcknowledgeAlertsCommand extends NonceResyncableMessageBlock {
|
||||
|
||||
|
@ -31,8 +31,8 @@ public class AcknowledgeAlertsCommand extends NonceResyncableMessageBlock {
|
|||
}
|
||||
|
||||
private void encode() {
|
||||
encodedData = ByteUtil.getBytesFromInt(nonce);
|
||||
encodedData = ByteUtil.concat(encodedData, alerts.getRawValue());
|
||||
encodedData = ByteUtil.INSTANCE.getBytesFromInt(nonce);
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, alerts.getRawValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -12,7 +12,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.Me
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.BasalSchedule;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.RateEntry;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class BasalScheduleExtraCommand extends MessageBlock {
|
||||
private final boolean acknowledgementBeep;
|
||||
|
@ -73,11 +73,11 @@ public class BasalScheduleExtraCommand extends MessageBlock {
|
|||
currentEntryIndex
|
||||
};
|
||||
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt16((int) Math.round(remainingPulses * 10)));
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt((int) Math.round(delayUntilNextTenthOfPulseInSeconds * 1000 * 1000)));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt16((int) Math.round(remainingPulses * 10)));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt((int) Math.round(delayUntilNextTenthOfPulseInSeconds * 1000 * 1000)));
|
||||
|
||||
for (RateEntry entry : rateEntries) {
|
||||
encodedData = ByteUtil.concat(encodedData, entry.getRawData());
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, entry.getRawData());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ import org.joda.time.Duration;
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.MessageBlock;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.BeepConfigType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class BeepConfigCommand extends MessageBlock {
|
||||
private final BeepConfigType beepType;
|
||||
|
@ -34,9 +34,9 @@ public class BeepConfigCommand extends MessageBlock {
|
|||
|
||||
private void encode() {
|
||||
encodedData = new byte[]{beepType.getValue()};
|
||||
encodedData = ByteUtil.concat(encodedData, (byte) ((basalCompletionBeep ? (1 << 6) : 0) + (basalIntervalBeep.getStandardMinutes() & 0x3f)));
|
||||
encodedData = ByteUtil.concat(encodedData, (byte) ((tempBasalCompletionBeep ? (1 << 6) : 0) + (tempBasalIntervalBeep.getStandardMinutes() & 0x3f)));
|
||||
encodedData = ByteUtil.concat(encodedData, (byte) ((bolusCompletionBeep ? (1 << 6) : 0) + (bolusIntervalBeep.getStandardMinutes() & 0x3f)));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, (byte) ((basalCompletionBeep ? (1 << 6) : 0) + (basalIntervalBeep.getStandardMinutes() & 0x3f)));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, (byte) ((tempBasalCompletionBeep ? (1 << 6) : 0) + (tempBasalIntervalBeep.getStandardMinutes() & 0x3f)));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, (byte) ((bolusCompletionBeep ? (1 << 6) : 0) + (bolusIntervalBeep.getStandardMinutes() & 0x3f)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -5,7 +5,7 @@ import org.joda.time.Duration;
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.MessageBlock;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class BolusExtraCommand extends MessageBlock {
|
||||
private final boolean acknowledgementBeep;
|
||||
|
@ -48,11 +48,11 @@ public class BolusExtraCommand extends MessageBlock {
|
|||
int squareWavePulseCountCountX10 = (int) Math.round(squareWaveUnits * 200);
|
||||
int timeBetweenExtendedPulses = squareWavePulseCountCountX10 > 0 ? (int) squareWaveDuration.getMillis() * 100 / squareWavePulseCountCountX10 : 0;
|
||||
|
||||
encodedData = ByteUtil.concat(encodedData, beepOptions);
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt16((int) Math.round(units * 200)));
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt((int) timeBetweenPulses.getMillis() * 100));
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt16(squareWavePulseCountCountX10));
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt(timeBetweenExtendedPulses));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, beepOptions);
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt16((int) Math.round(units * 200)));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt((int) timeBetweenPulses.getMillis() * 100));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt16(squareWavePulseCountCountX10));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt(timeBetweenExtendedPulses));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -6,7 +6,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.BeepType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.DeliveryType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class CancelDeliveryCommand extends NonceResyncableMessageBlock {
|
||||
|
||||
|
@ -32,7 +32,7 @@ public class CancelDeliveryCommand extends NonceResyncableMessageBlock {
|
|||
|
||||
private void encode() {
|
||||
encodedData = new byte[5];
|
||||
System.arraycopy(ByteUtil.getBytesFromInt(nonce), 0, encodedData, 0, 4);
|
||||
System.arraycopy(ByteUtil.INSTANCE.getBytesFromInt(nonce), 0, encodedData, 0, 4);
|
||||
byte beepTypeValue = beepType.getValue();
|
||||
if (beepTypeValue > 8) {
|
||||
beepTypeValue = 0;
|
||||
|
|
|
@ -7,7 +7,7 @@ import java.util.List;
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.NonceResyncableMessageBlock;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.AlertConfiguration;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class ConfigureAlertsCommand extends NonceResyncableMessageBlock {
|
||||
private final List<AlertConfiguration> configurations;
|
||||
|
@ -25,9 +25,9 @@ public class ConfigureAlertsCommand extends NonceResyncableMessageBlock {
|
|||
}
|
||||
|
||||
private void encode() {
|
||||
encodedData = ByteUtil.getBytesFromInt(nonce);
|
||||
encodedData = ByteUtil.INSTANCE.getBytesFromInt(nonce);
|
||||
for (AlertConfiguration config : configurations) {
|
||||
encodedData = ByteUtil.concat(encodedData, config.getRawData());
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, config.getRawData());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.NonceResyncableMessageBlock;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class DeactivatePodCommand extends NonceResyncableMessageBlock {
|
||||
private int nonce;
|
||||
|
@ -20,7 +20,7 @@ public class DeactivatePodCommand extends NonceResyncableMessageBlock {
|
|||
}
|
||||
|
||||
private void encode() {
|
||||
encodedData = ByteUtil.getBytesFromInt(nonce);
|
||||
encodedData = ByteUtil.INSTANCE.getBytesFromInt(nonce);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.NonceResyncableMessageBlock;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class FaultConfigCommand extends NonceResyncableMessageBlock {
|
||||
private final byte tab5sub16;
|
||||
|
@ -20,9 +20,9 @@ public class FaultConfigCommand extends NonceResyncableMessageBlock {
|
|||
}
|
||||
|
||||
private void encode() {
|
||||
encodedData = ByteUtil.getBytesFromInt(nonce);
|
||||
encodedData = ByteUtil.concat(encodedData, tab5sub16);
|
||||
encodedData = ByteUtil.concat(encodedData, tab5sub17);
|
||||
encodedData = ByteUtil.INSTANCE.getBytesFromInt(nonce);
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, tab5sub16);
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, tab5sub17);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -11,7 +11,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.sc
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.BolusDeliverySchedule;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.DeliverySchedule;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.TempBasalDeliverySchedule;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class SetInsulinScheduleCommand extends NonceResyncableMessageBlock {
|
||||
|
||||
|
@ -65,10 +65,10 @@ public class SetInsulinScheduleCommand extends NonceResyncableMessageBlock {
|
|||
}
|
||||
|
||||
private void encode() {
|
||||
encodedData = ByteUtil.getBytesFromInt(nonce);
|
||||
encodedData = ByteUtil.concat(encodedData, schedule.getType().getValue());
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt16(schedule.getChecksum()));
|
||||
encodedData = ByteUtil.concat(encodedData, schedule.getRawData());
|
||||
encodedData = ByteUtil.INSTANCE.getBytesFromInt(nonce);
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, schedule.getType().getValue());
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt16(schedule.getChecksum()));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, schedule.getRawData());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -4,7 +4,7 @@ import org.joda.time.DateTime;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.MessageBlock;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class SetupPodCommand extends MessageBlock {
|
||||
|
||||
|
@ -30,8 +30,8 @@ public class SetupPodCommand extends MessageBlock {
|
|||
|
||||
private void encode() {
|
||||
encodedData = new byte[0];
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt(address));
|
||||
encodedData = ByteUtil.concat(encodedData, new byte[]{ //
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt(address));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, new byte[]{ //
|
||||
(byte) 0x14, // unknown
|
||||
PACKET_TIMEOUT_LIMIT, //
|
||||
(byte) date.monthOfYear().get(), //
|
||||
|
@ -40,8 +40,8 @@ public class SetupPodCommand extends MessageBlock {
|
|||
(byte) date.hourOfDay().get(), //
|
||||
(byte) date.minuteOfHour().get() //
|
||||
});
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt(lot));
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt(tid));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt(lot));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt(tid));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -9,7 +9,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.RateEntry;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class TempBasalExtraCommand extends MessageBlock {
|
||||
private final boolean acknowledgementBeep;
|
||||
|
@ -55,15 +55,15 @@ public class TempBasalExtraCommand extends MessageBlock {
|
|||
(byte) 0x00
|
||||
};
|
||||
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt16((int) Math.round(remainingPulses * 10)));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt16((int) Math.round(remainingPulses * 10)));
|
||||
if (remainingPulses == 0) {
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt((int) (delayUntilNextPulse * 1000 * 100) * 10));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt((int) (delayUntilNextPulse * 1000 * 100) * 10));
|
||||
} else {
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt((int) (delayUntilNextPulse * 1000 * 100)));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt((int) (delayUntilNextPulse * 1000 * 100)));
|
||||
}
|
||||
|
||||
for (RateEntry entry : rateEntries) {
|
||||
encodedData = ByteUtil.concat(encodedData, entry.getRawData());
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, entry.getRawData());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.FaultEventCode;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class ErrorResponse extends MessageBlock {
|
||||
public static final byte ERROR_RESPONSE_CODE_BAD_NONCE = (byte) 0x14;
|
||||
|
@ -24,12 +24,12 @@ public class ErrorResponse extends MessageBlock {
|
|||
if (encodedData.length < MESSAGE_LENGTH) {
|
||||
throw new IllegalArgumentException("Not enough data");
|
||||
}
|
||||
this.encodedData = ByteUtil.substring(encodedData, 2, MESSAGE_LENGTH - 2);
|
||||
this.encodedData = ByteUtil.INSTANCE.substring(encodedData, 2, MESSAGE_LENGTH - 2);
|
||||
|
||||
errorResponseCode = encodedData[2];
|
||||
|
||||
if (errorResponseCode == ERROR_RESPONSE_CODE_BAD_NONCE) {
|
||||
nonceSearchKey = ByteUtil.makeUnsignedShort(encodedData[3], encodedData[4]);
|
||||
nonceSearchKey = ByteUtil.INSTANCE.makeUnsignedShort(encodedData[3], encodedData[4]);
|
||||
|
||||
faultEventCode = null;
|
||||
podProgressStatus = null;
|
||||
|
|
|
@ -11,7 +11,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.De
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class StatusResponse extends MessageBlock implements StatusUpdatableResponse {
|
||||
private static final int MESSAGE_LENGTH = 10;
|
||||
|
@ -30,25 +30,25 @@ public class StatusResponse extends MessageBlock implements StatusUpdatableRespo
|
|||
if (encodedData.length < MESSAGE_LENGTH) {
|
||||
throw new IllegalArgumentException("Not enough data");
|
||||
}
|
||||
this.encodedData = ByteUtil.substring(encodedData, 1, MESSAGE_LENGTH - 1);
|
||||
this.encodedData = ByteUtil.INSTANCE.substring(encodedData, 1, MESSAGE_LENGTH - 1);
|
||||
|
||||
deliveryStatus = DeliveryStatus.fromByte((byte) (ByteUtil.convertUnsignedByteToInt(encodedData[1]) >>> 4));
|
||||
deliveryStatus = DeliveryStatus.fromByte((byte) (ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[1]) >>> 4));
|
||||
podProgressStatus = PodProgressStatus.fromByte((byte) (encodedData[1] & 0x0F));
|
||||
|
||||
int minutes = ((encodedData[7] & 0x7F) << 6) | ((encodedData[8] & 0xFC) >>> 2);
|
||||
timeActive = Duration.standardMinutes(minutes);
|
||||
|
||||
int highInsulinBits = (encodedData[2] & 0xF) << 9;
|
||||
int middleInsulinBits = ByteUtil.convertUnsignedByteToInt(encodedData[3]) << 1;
|
||||
int lowInsulinBits = ByteUtil.convertUnsignedByteToInt(encodedData[4]) >>> 7;
|
||||
int middleInsulinBits = ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[3]) << 1;
|
||||
int lowInsulinBits = ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[4]) >>> 7;
|
||||
ticksDelivered = (highInsulinBits | middleInsulinBits | lowInsulinBits);
|
||||
insulinDelivered = OmnipodConstants.POD_PULSE_SIZE * ticksDelivered;
|
||||
podMessageCounter = (byte) ((encodedData[4] >>> 3) & 0xf);
|
||||
|
||||
bolusNotDelivered = OmnipodConstants.POD_PULSE_SIZE * (((encodedData[4] & 0x03) << 8) | ByteUtil.convertUnsignedByteToInt(encodedData[5]));
|
||||
unacknowledgedAlerts = new AlertSet((byte) (((encodedData[6] & 0x7f) << 1) | (ByteUtil.convertUnsignedByteToInt(encodedData[7]) >>> 7)));
|
||||
bolusNotDelivered = OmnipodConstants.POD_PULSE_SIZE * (((encodedData[4] & 0x03) << 8) | ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[5]));
|
||||
unacknowledgedAlerts = new AlertSet((byte) (((encodedData[6] & 0x7f) << 1) | (ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[7]) >>> 7)));
|
||||
|
||||
double reservoirValue = (((encodedData[8] & 0x3) << 8) + ByteUtil.convertUnsignedByteToInt(encodedData[9])) * OmnipodConstants.POD_PULSE_SIZE;
|
||||
double reservoirValue = (((encodedData[8] & 0x3) << 8) + ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[9])) * OmnipodConstants.POD_PULSE_SIZE;
|
||||
if (reservoirValue > OmnipodConstants.MAX_RESERVOIR_READING) {
|
||||
reservoirLevel = null;
|
||||
} else {
|
||||
|
@ -120,7 +120,7 @@ public class StatusResponse extends MessageBlock implements StatusUpdatableRespo
|
|||
", bolusNotDelivered=" + bolusNotDelivered +
|
||||
", podMessageCounter=" + podMessageCounter +
|
||||
", unacknowledgedAlerts=" + unacknowledgedAlerts +
|
||||
", encodedData=" + ByteUtil.shortHexStringWithoutSpaces(encodedData) +
|
||||
", encodedData=" + ByteUtil.INSTANCE.shortHexStringWithoutSpaces(encodedData) +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.FirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class VersionResponse extends MessageBlock {
|
||||
private static final int ASSIGN_ADDRESS_VERSION_RESPONSE_LENGTH = 0x15;
|
||||
|
@ -15,38 +15,38 @@ public class VersionResponse extends MessageBlock {
|
|||
private final FirmwareVersion piVersion;
|
||||
private final int lot;
|
||||
private final int tid;
|
||||
private final int address;
|
||||
private Byte gain; // Only in the assign address version response
|
||||
private Byte rssi; // Only in the assign address version response
|
||||
private final int address;
|
||||
|
||||
public VersionResponse(byte[] data) {
|
||||
int length = ByteUtil.convertUnsignedByteToInt(data[1]);
|
||||
this.encodedData = ByteUtil.substring(data, 2, length);
|
||||
int length = ByteUtil.INSTANCE.convertUnsignedByteToInt(data[1]);
|
||||
this.encodedData = ByteUtil.INSTANCE.substring(data, 2, length);
|
||||
|
||||
switch (length) {
|
||||
case ASSIGN_ADDRESS_VERSION_RESPONSE_LENGTH:
|
||||
podProgressStatus = PodProgressStatus.fromByte(data[9]);
|
||||
pmVersion = new FirmwareVersion(data[2], data[3], data[4]);
|
||||
piVersion = new FirmwareVersion(data[5], data[6], data[7]);
|
||||
lot = ByteUtil.toInt((int) data[10], (int) data[11],
|
||||
lot = ByteUtil.INSTANCE.toInt((int) data[10], (int) data[11],
|
||||
(int) data[12], (int) data[13], ByteUtil.BitConversion.BIG_ENDIAN);
|
||||
tid = ByteUtil.toInt((int) data[14], (int) data[15],
|
||||
tid = ByteUtil.INSTANCE.toInt((int) data[14], (int) data[15],
|
||||
(int) data[16], (int) data[17], ByteUtil.BitConversion.BIG_ENDIAN);
|
||||
gain = (byte) ((data[18] & 0xc0) >>> 6);
|
||||
rssi = (byte) (data[18] & 0x3f);
|
||||
address = ByteUtil.toInt((int) data[19], (int) data[20],
|
||||
address = ByteUtil.INSTANCE.toInt((int) data[19], (int) data[20],
|
||||
(int) data[21], (int) data[22], ByteUtil.BitConversion.BIG_ENDIAN);
|
||||
break;
|
||||
case SETUP_POD_VERSION_RESPONSE_LENGTH:
|
||||
podProgressStatus = PodProgressStatus.fromByte(data[16]);
|
||||
pmVersion = new FirmwareVersion(data[9], data[10], data[11]);
|
||||
piVersion = new FirmwareVersion(data[12], data[13], data[14]);
|
||||
lot = ByteUtil.toInt((int) data[17], (int) data[18],
|
||||
lot = ByteUtil.INSTANCE.toInt((int) data[17], (int) data[18],
|
||||
(int) data[19], (int) data[20], ByteUtil.BitConversion.BIG_ENDIAN);
|
||||
tid = ByteUtil.toInt((int) data[21], (int) data[22],
|
||||
tid = ByteUtil.INSTANCE.toInt((int) data[21], (int) data[22],
|
||||
(int) data[23], (int) data[24], ByteUtil.BitConversion.BIG_ENDIAN);
|
||||
|
||||
address = ByteUtil.toInt((int) data[25], (int) data[26],
|
||||
address = ByteUtil.INSTANCE.toInt((int) data[25], (int) data[26],
|
||||
(int) data[27], (int) data[28], ByteUtil.BitConversion.BIG_ENDIAN);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -8,7 +8,7 @@ import java.util.List;
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.AlertSlot;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodInfoType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class PodInfoActiveAlerts extends PodInfo {
|
||||
private static final int MINIMUM_MESSAGE_LENGTH = 11;
|
||||
|
@ -23,13 +23,13 @@ public class PodInfoActiveAlerts extends PodInfo {
|
|||
throw new IllegalArgumentException("Not enough data");
|
||||
}
|
||||
|
||||
word278 = ByteUtil.substring(encodedData, 1, 2);
|
||||
word278 = ByteUtil.INSTANCE.substring(encodedData, 1, 2);
|
||||
|
||||
alertActivations = new ArrayList<>();
|
||||
|
||||
for (AlertSlot alertSlot : AlertSlot.values()) {
|
||||
int valueHighBits = ByteUtil.convertUnsignedByteToInt(encodedData[3 + alertSlot.getValue() * 2]);
|
||||
int valueLowBits = ByteUtil.convertUnsignedByteToInt(encodedData[4 + alertSlot.getValue() * 2]);
|
||||
int valueHighBits = ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[3 + alertSlot.getValue() * 2]);
|
||||
int valueLowBits = ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[4 + alertSlot.getValue() * 2]);
|
||||
int value = (valueHighBits << 8) | valueLowBits;
|
||||
if (value != 0) {
|
||||
alertActivations.add(new AlertActivation(alertSlot, value));
|
||||
|
@ -53,7 +53,7 @@ public class PodInfoActiveAlerts extends PodInfo {
|
|||
@Override
|
||||
public String toString() {
|
||||
return "PodInfoActiveAlerts{" +
|
||||
"word278=" + ByteUtil.shortHexString(word278) +
|
||||
"word278=" + ByteUtil.INSTANCE.shortHexString(word278) +
|
||||
", alertActivations=" + alertActivations +
|
||||
'}';
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ import java.util.List;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.FaultEventCode;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodInfoType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class PodInfoDataLog extends PodInfo {
|
||||
private static final int MINIMUM_MESSAGE_LENGTH = 8;
|
||||
|
@ -27,8 +27,8 @@ public class PodInfoDataLog extends PodInfo {
|
|||
}
|
||||
|
||||
faultEventCode = FaultEventCode.fromByte(encodedData[1]);
|
||||
timeFaultEvent = Duration.standardMinutes(ByteUtil.toInt(encodedData[2], encodedData[3]));
|
||||
timeSinceActivation = Duration.standardMinutes(ByteUtil.toInt(encodedData[4], encodedData[5]));
|
||||
timeFaultEvent = Duration.standardMinutes(ByteUtil.INSTANCE.toInt(encodedData[2], encodedData[3]));
|
||||
timeSinceActivation = Duration.standardMinutes(ByteUtil.INSTANCE.toInt(encodedData[4], encodedData[5]));
|
||||
dataChunkSize = encodedData[6];
|
||||
maximumNumberOfDwords = encodedData[7];
|
||||
|
||||
|
@ -36,7 +36,7 @@ public class PodInfoDataLog extends PodInfo {
|
|||
|
||||
int numberOfDwords = (bodyLength - 8) / 4;
|
||||
for (int i = 0; i < numberOfDwords; i++) {
|
||||
dwords.add(ByteUtil.substring(encodedData, 8 + (4 * i), 4));
|
||||
dwords.add(ByteUtil.INSTANCE.substring(encodedData, 8 + (4 * i), 4));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.Fa
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodInfoType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class PodInfoDetailedStatus extends PodInfo implements StatusUpdatableResponse {
|
||||
private static final int MINIMUM_MESSAGE_LENGTH = 21;
|
||||
|
@ -42,13 +42,13 @@ public class PodInfoDetailedStatus extends PodInfo implements StatusUpdatableRes
|
|||
|
||||
podProgressStatus = PodProgressStatus.fromByte(encodedData[1]);
|
||||
deliveryStatus = DeliveryStatus.fromByte(encodedData[2]);
|
||||
bolusNotDelivered = OmnipodConstants.POD_PULSE_SIZE * ByteUtil.toInt(encodedData[3], encodedData[4]);
|
||||
bolusNotDelivered = OmnipodConstants.POD_PULSE_SIZE * ByteUtil.INSTANCE.toInt(encodedData[3], encodedData[4]);
|
||||
podMessageCounter = encodedData[5];
|
||||
ticksDelivered = ByteUtil.toInt(encodedData[6], encodedData[7]);
|
||||
ticksDelivered = ByteUtil.INSTANCE.toInt(encodedData[6], encodedData[7]);
|
||||
insulinDelivered = OmnipodConstants.POD_PULSE_SIZE * ticksDelivered;
|
||||
faultEventCode = FaultEventCode.fromByte(encodedData[8]);
|
||||
|
||||
int minutesSinceActivation = ByteUtil.toInt(encodedData[9], encodedData[10]);
|
||||
int minutesSinceActivation = ByteUtil.INSTANCE.toInt(encodedData[9], encodedData[10]);
|
||||
if (minutesSinceActivation == 0xffff) {
|
||||
faultEventTime = null;
|
||||
} else {
|
||||
|
@ -56,14 +56,14 @@ public class PodInfoDetailedStatus extends PodInfo implements StatusUpdatableRes
|
|||
}
|
||||
|
||||
double reservoirValue = ((encodedData[11] & 0x03) << 8) +
|
||||
ByteUtil.convertUnsignedByteToInt(encodedData[12]) * OmnipodConstants.POD_PULSE_SIZE;
|
||||
ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[12]) * OmnipodConstants.POD_PULSE_SIZE;
|
||||
if (reservoirValue > OmnipodConstants.MAX_RESERVOIR_READING) {
|
||||
reservoirLevel = null;
|
||||
} else {
|
||||
reservoirLevel = reservoirValue;
|
||||
}
|
||||
|
||||
int minutesActive = ByteUtil.toInt(encodedData[13], encodedData[14]);
|
||||
int minutesActive = ByteUtil.INSTANCE.toInt(encodedData[13], encodedData[14]);
|
||||
timeActive = Duration.standardMinutes(minutesActive);
|
||||
|
||||
unacknowledgedAlerts = new AlertSet(encodedData[15]);
|
||||
|
@ -74,14 +74,14 @@ public class PodInfoDetailedStatus extends PodInfo implements StatusUpdatableRes
|
|||
} else {
|
||||
errorEventInfo = ErrorEventInfo.fromByte(rawErrorEventInfo);
|
||||
}
|
||||
receiverLowGain = (byte) (ByteUtil.convertUnsignedByteToInt(encodedData[18]) >>> 6);
|
||||
receiverLowGain = (byte) (ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[18]) >>> 6);
|
||||
radioRSSI = (byte) (encodedData[18] & 0x3f);
|
||||
if (ByteUtil.convertUnsignedByteToInt(encodedData[19]) == 0xff) { // this byte is not valid (no fault has occurred)
|
||||
if (ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[19]) == 0xff) { // this byte is not valid (no fault has occurred)
|
||||
previousPodProgressStatus = null;
|
||||
} else {
|
||||
previousPodProgressStatus = PodProgressStatus.fromByte((byte) (encodedData[19] & 0x0f));
|
||||
}
|
||||
unknownValue = ByteUtil.substring(encodedData, 20, 2);
|
||||
unknownValue = ByteUtil.INSTANCE.substring(encodedData, 20, 2);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -183,7 +183,7 @@ public class PodInfoDetailedStatus extends PodInfo implements StatusUpdatableRes
|
|||
", receiverLowGain=" + receiverLowGain +
|
||||
", radioRSSI=" + radioRSSI +
|
||||
", previousPodProgressStatus=" + previousPodProgressStatus +
|
||||
", unknownValue=" + ByteUtil.shortHexString(unknownValue) +
|
||||
", unknownValue=" + ByteUtil.INSTANCE.shortHexString(unknownValue) +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodInfoType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class PodInfoOlderPulseLog extends PodInfo {
|
||||
private static final int MINIMUM_MESSAGE_LENGTH = 3;
|
||||
|
@ -23,9 +23,9 @@ public class PodInfoOlderPulseLog extends PodInfo {
|
|||
|
||||
dwords = new ArrayList<>();
|
||||
|
||||
int numberOfDwordLogEntries = ByteUtil.toInt(encodedData[1], encodedData[2]);
|
||||
int numberOfDwordLogEntries = ByteUtil.INSTANCE.toInt(encodedData[1], encodedData[2]);
|
||||
for (int i = 0; numberOfDwordLogEntries > i; i++) {
|
||||
byte[] dword = ByteUtil.substring(encodedData, 3 + (4 * i), 4);
|
||||
byte[] dword = ByteUtil.INSTANCE.substring(encodedData, 3 + (4 * i), 4);
|
||||
dwords.add(dword);
|
||||
}
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ public class PodInfoOlderPulseLog extends PodInfo {
|
|||
|
||||
List<String> hexDwords = new ArrayList<>();
|
||||
for (byte[] dword : dwords) {
|
||||
hexDwords.add(ByteUtil.shortHexStringWithoutSpaces(dword));
|
||||
hexDwords.add(ByteUtil.INSTANCE.shortHexStringWithoutSpaces(dword));
|
||||
}
|
||||
out += TextUtils.join(", ", hexDwords);
|
||||
out += "]}";
|
||||
|
|
|
@ -7,7 +7,7 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodInfoType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class PodInfoRecentPulseLog extends PodInfo {
|
||||
private static final int MINIMUM_MESSAGE_LENGTH = 3;
|
||||
|
@ -23,13 +23,13 @@ public class PodInfoRecentPulseLog extends PodInfo {
|
|||
throw new IllegalArgumentException("Not enough data");
|
||||
}
|
||||
|
||||
lastEntryIndex = ByteUtil.toInt(encodedData[1], encodedData[2]);
|
||||
lastEntryIndex = ByteUtil.INSTANCE.toInt(encodedData[1], encodedData[2]);
|
||||
dwords = new ArrayList<>();
|
||||
|
||||
int numberOfDwords = (bodyLength - 3) / 4;
|
||||
|
||||
for (int i = 0; numberOfDwords > i; i++) {
|
||||
byte[] dword = ByteUtil.substring(encodedData, 3 + (4 * i), 4);
|
||||
byte[] dword = ByteUtil.INSTANCE.substring(encodedData, 3 + (4 * i), 4);
|
||||
dwords.add(dword);
|
||||
}
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ public class PodInfoRecentPulseLog extends PodInfo {
|
|||
|
||||
List<String> hexDwords = new ArrayList<>();
|
||||
for (byte[] dword : dwords) {
|
||||
hexDwords.add(ByteUtil.shortHexStringWithoutSpaces(dword));
|
||||
hexDwords.add(ByteUtil.INSTANCE.shortHexStringWithoutSpaces(dword));
|
||||
}
|
||||
out += TextUtils.join(", ", hexDwords);
|
||||
out += "]}";
|
||||
|
|
|
@ -3,16 +3,16 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communicatio
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.MessageBlock;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.MessageBlockType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodInfoType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class PodInfoResponse extends MessageBlock {
|
||||
private final PodInfoType subType;
|
||||
private final PodInfo podInfo;
|
||||
|
||||
public PodInfoResponse(byte[] encodedData) {
|
||||
int bodyLength = ByteUtil.convertUnsignedByteToInt(encodedData[1]);
|
||||
int bodyLength = ByteUtil.INSTANCE.convertUnsignedByteToInt(encodedData[1]);
|
||||
|
||||
this.encodedData = ByteUtil.substring(encodedData, 2, bodyLength);
|
||||
this.encodedData = ByteUtil.INSTANCE.substring(encodedData, 2, bodyLength);
|
||||
subType = PodInfoType.fromByte(encodedData[2]);
|
||||
podInfo = subType.decode(this.encodedData, bodyLength);
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
|
|||
|
||||
import org.joda.time.Duration;
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class AlertConfiguration {
|
||||
private final AlertType alertType;
|
||||
|
@ -66,14 +66,14 @@ public class AlertConfiguration {
|
|||
|
||||
if (alertTrigger instanceof UnitsRemainingAlertTrigger) {
|
||||
int ticks = (int) (((UnitsRemainingAlertTrigger) alertTrigger).getValue() / OmnipodConstants.POD_PULSE_SIZE / 2);
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt16(ticks));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt16(ticks));
|
||||
} else if (alertTrigger instanceof TimerAlertTrigger) {
|
||||
int durationInMinutes = (int) ((TimerAlertTrigger) alertTrigger).getValue().getStandardMinutes();
|
||||
encodedData = ByteUtil.concat(encodedData, ByteUtil.getBytesFromInt16(durationInMinutes));
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, ByteUtil.INSTANCE.getBytesFromInt16(durationInMinutes));
|
||||
}
|
||||
|
||||
encodedData = ByteUtil.concat(encodedData, beepRepeat.getValue());
|
||||
encodedData = ByteUtil.concat(encodedData, beepType.getValue());
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, beepRepeat.getValue());
|
||||
encodedData = ByteUtil.INSTANCE.concat(encodedData, beepType.getValue());
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition;
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public final class ErrorEventInfo {
|
||||
private final boolean insulinStateTableCorruption;
|
||||
|
@ -16,7 +16,7 @@ public final class ErrorEventInfo {
|
|||
}
|
||||
|
||||
public static ErrorEventInfo fromByte(byte faultEventInfo) {
|
||||
int loggedFaultEventInfo = ByteUtil.convertUnsignedByteToInt(faultEventInfo);
|
||||
int loggedFaultEventInfo = ByteUtil.INSTANCE.convertUnsignedByteToInt(faultEventInfo);
|
||||
boolean insulinStateTableCorruption = (loggedFaultEventInfo & 0x80) == 0x80;
|
||||
byte internalVariable = (byte) ((loggedFaultEventInfo >>> 5) & 0x03);
|
||||
boolean immediateBolusInProgress = (loggedFaultEventInfo & 0x10) == 0x10;
|
||||
|
|
|
@ -3,7 +3,7 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.s
|
|||
import androidx.annotation.NonNull;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.IRawRepresentable;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class BasalDeliverySchedule extends DeliverySchedule implements IRawRepresentable {
|
||||
|
||||
|
@ -23,11 +23,11 @@ public class BasalDeliverySchedule extends DeliverySchedule implements IRawRepre
|
|||
@Override
|
||||
public byte[] getRawData() {
|
||||
byte[] rawData = new byte[0];
|
||||
rawData = ByteUtil.concat(rawData, currentSegment);
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt16(secondsRemaining << 3));
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt16(pulsesRemaining));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, currentSegment);
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt16(secondsRemaining << 3));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt16(pulsesRemaining));
|
||||
for (BasalTableEntry entry : basalTable.getEntries()) {
|
||||
rawData = ByteUtil.concat(rawData, entry.getRawData());
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, entry.getRawData());
|
||||
}
|
||||
return rawData;
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ public class BasalDeliverySchedule extends DeliverySchedule implements IRawRepre
|
|||
int checksum = 0;
|
||||
byte[] rawData = getRawData();
|
||||
for (int i = 0; i < rawData.length && i < 5; i++) {
|
||||
checksum += ByteUtil.convertUnsignedByteToInt(rawData[i]);
|
||||
checksum += ByteUtil.INSTANCE.convertUnsignedByteToInt(rawData[i]);
|
||||
}
|
||||
for (BasalTableEntry entry : basalTable.getEntries()) {
|
||||
checksum += entry.getChecksum();
|
||||
|
|
|
@ -3,7 +3,7 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.s
|
|||
import androidx.annotation.NonNull;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.IRawRepresentable;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class BasalTableEntry implements IRawRepresentable {
|
||||
|
||||
|
@ -28,7 +28,7 @@ public class BasalTableEntry implements IRawRepresentable {
|
|||
}
|
||||
|
||||
public int getChecksum() {
|
||||
int checksumPerSegment = ByteUtil.convertUnsignedByteToInt((byte) pulses) + (pulses >>> 8);
|
||||
int checksumPerSegment = ByteUtil.INSTANCE.convertUnsignedByteToInt((byte) pulses) + (pulses >>> 8);
|
||||
return (checksumPerSegment * segments + (alternateSegmentPulse ? segments / 2 : 0));
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import org.joda.time.Duration;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.IRawRepresentable;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class BolusDeliverySchedule extends DeliverySchedule implements IRawRepresentable {
|
||||
|
||||
|
@ -31,9 +31,9 @@ public class BolusDeliverySchedule extends DeliverySchedule implements IRawRepre
|
|||
int multiplier = (int) timeBetweenPulses.getStandardSeconds() * 8;
|
||||
int fieldA = pulseCount * multiplier;
|
||||
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt16(fieldA));
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt16(pulseCount));
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt16(pulseCount));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt16(fieldA));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt16(pulseCount));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt16(pulseCount));
|
||||
return rawData;
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ public class BolusDeliverySchedule extends DeliverySchedule implements IRawRepre
|
|||
int checksum = 0;
|
||||
byte[] rawData = getRawData();
|
||||
for (int i = 0; i < rawData.length && i < 7; i++) {
|
||||
checksum += ByteUtil.convertUnsignedByteToInt(rawData[i]);
|
||||
checksum += ByteUtil.INSTANCE.convertUnsignedByteToInt(rawData[i]);
|
||||
}
|
||||
return checksum;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.s
|
|||
|
||||
import static info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants.BASAL_STEP_DURATION;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.joda.time.Duration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -9,7 +11,7 @@ import java.util.List;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.IRawRepresentable;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class RateEntry implements IRawRepresentable {
|
||||
|
||||
|
@ -67,16 +69,16 @@ public class RateEntry implements IRawRepresentable {
|
|||
@Override
|
||||
public byte[] getRawData() {
|
||||
byte[] rawData = new byte[0];
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt16((int) Math.round(totalPulses * 10)));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt16((int) Math.round(totalPulses * 10)));
|
||||
if (totalPulses == 0) {
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt((int) (delayBetweenPulsesInSeconds * 1000 * 1000)));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt((int) (delayBetweenPulsesInSeconds * 1000 * 1000)));
|
||||
} else {
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt((int) (delayBetweenPulsesInSeconds * 1000 * 100)));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt((int) (delayBetweenPulsesInSeconds * 1000 * 100)));
|
||||
}
|
||||
return rawData;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull @Override
|
||||
public String toString() {
|
||||
return "RateEntry{" +
|
||||
"totalPulses=" + totalPulses +
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.IRawRepresentable;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class TempBasalDeliverySchedule extends DeliverySchedule implements IRawRepresentable {
|
||||
|
||||
|
@ -18,11 +18,11 @@ public class TempBasalDeliverySchedule extends DeliverySchedule implements IRawR
|
|||
@Override
|
||||
public byte[] getRawData() {
|
||||
byte[] rawData = new byte[0];
|
||||
rawData = ByteUtil.concat(rawData, basalTable.numSegments());
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt16(secondsRemaining << 3));
|
||||
rawData = ByteUtil.concat(rawData, ByteUtil.getBytesFromInt16(firstSegmentPulses));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, basalTable.numSegments());
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt16(secondsRemaining << 3));
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, ByteUtil.INSTANCE.getBytesFromInt16(firstSegmentPulses));
|
||||
for (BasalTableEntry entry : basalTable.getEntries()) {
|
||||
rawData = ByteUtil.concat(rawData, entry.getRawData());
|
||||
rawData = ByteUtil.INSTANCE.concat(rawData, entry.getRawData());
|
||||
}
|
||||
return rawData;
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class TempBasalDeliverySchedule extends DeliverySchedule implements IRawR
|
|||
int checksum = 0;
|
||||
byte[] rawData = getRawData();
|
||||
for (int i = 0; i < rawData.length && i < 5; i++) {
|
||||
checksum += ByteUtil.convertUnsignedByteToInt(rawData[i]);
|
||||
checksum += ByteUtil.INSTANCE.convertUnsignedByteToInt(rawData[i]);
|
||||
}
|
||||
for (BasalTableEntry entry : basalTable.getEntries()) {
|
||||
checksum += entry.getChecksum();
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception;
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class NotEnoughDataException extends OmnipodException {
|
||||
private final byte[] data;
|
||||
|
||||
public NotEnoughDataException(byte[] data) {
|
||||
super("Not enough data: " + ByteUtil.shortHexString(data), false);
|
||||
super("Not enough data: " + ByteUtil.INSTANCE.shortHexString(data), false);
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ import info.nightscout.interfaces.pump.PumpSync;
|
|||
import info.nightscout.interfaces.pump.defs.PumpType;
|
||||
import info.nightscout.interfaces.ui.UiInteraction;
|
||||
import info.nightscout.pump.common.defs.TempBasalPair;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.rx.AapsSchedulers;
|
||||
import info.nightscout.rx.bus.RxBus;
|
||||
import info.nightscout.rx.events.Event;
|
||||
|
@ -150,6 +150,23 @@ public class AapsOmnipodErosManager {
|
|||
reloadSettings();
|
||||
}
|
||||
|
||||
public static BasalSchedule mapProfileToBasalSchedule(Profile profile) {
|
||||
if (profile == null) {
|
||||
throw new IllegalArgumentException("Profile can not be null");
|
||||
}
|
||||
Profile.ProfileValue[] basalValues = profile.getBasalValues();
|
||||
if (basalValues == null) {
|
||||
throw new IllegalArgumentException("Basal values can not be null");
|
||||
}
|
||||
List<BasalScheduleEntry> entries = new ArrayList<>();
|
||||
for (Profile.ProfileValue basalValue : basalValues) {
|
||||
entries.add(new BasalScheduleEntry(PumpType.OMNIPOD_EROS.determineCorrectBasalSize(basalValue.getValue()),
|
||||
Duration.standardSeconds(basalValue.getTimeAsSeconds())));
|
||||
}
|
||||
|
||||
return new BasalSchedule(entries);
|
||||
}
|
||||
|
||||
public void reloadSettings() {
|
||||
basalBeepsEnabled = sp.getBoolean(OmnipodErosStorageKeys.Preferences.BASAL_BEEPS_ENABLED, true);
|
||||
bolusBeepsEnabled = sp.getBoolean(OmnipodErosStorageKeys.Preferences.BOLUS_BEEPS_ENABLED, true);
|
||||
|
@ -251,7 +268,6 @@ public class AapsOmnipodErosManager {
|
|||
return new PumpEnactResult(injector).success(true).enacted(false);
|
||||
}
|
||||
|
||||
|
||||
public PumpEnactResult getPodStatus() {
|
||||
StatusResponse statusResponse;
|
||||
|
||||
|
@ -960,7 +976,7 @@ public class AapsOmnipodErosManager {
|
|||
|
||||
private String createPodFaultErrorMessage(FaultEventCode faultEventCode) {
|
||||
return getStringResource(R.string.omnipod_eros_error_pod_fault,
|
||||
ByteUtil.convertUnsignedByteToInt(faultEventCode.getValue()), faultEventCode.name());
|
||||
ByteUtil.INSTANCE.convertUnsignedByteToInt(faultEventCode.getValue()), faultEventCode.name());
|
||||
}
|
||||
|
||||
private void sendEvent(Event event) {
|
||||
|
@ -991,23 +1007,6 @@ public class AapsOmnipodErosManager {
|
|||
return rh.gs(id, args);
|
||||
}
|
||||
|
||||
public static BasalSchedule mapProfileToBasalSchedule(Profile profile) {
|
||||
if (profile == null) {
|
||||
throw new IllegalArgumentException("Profile can not be null");
|
||||
}
|
||||
Profile.ProfileValue[] basalValues = profile.getBasalValues();
|
||||
if (basalValues == null) {
|
||||
throw new IllegalArgumentException("Basal values can not be null");
|
||||
}
|
||||
List<BasalScheduleEntry> entries = new ArrayList<>();
|
||||
for (Profile.ProfileValue basalValue : basalValues) {
|
||||
entries.add(new BasalScheduleEntry(PumpType.OMNIPOD_EROS.determineCorrectBasalSize(basalValue.getValue()),
|
||||
Duration.standardSeconds(basalValue.getTimeAsSeconds())));
|
||||
}
|
||||
|
||||
return new BasalSchedule(entries);
|
||||
}
|
||||
|
||||
private void uploadCareportalEvent(long date, DetailedBolusInfo.EventType event) {
|
||||
pumpSync.insertTherapyEventIfNewWithTimestamp(date, event, null, null, PumpType.OMNIPOD_EROS, Integer.toString(podStateManager.getAddress()));
|
||||
}
|
||||
|
|
|
@ -41,8 +41,8 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception.Ril
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception.RileyLinkUnexpectedException;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.exception.RileyLinkUnreachableException;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.manager.ErosPodStateManager;
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.rx.logging.LTag;
|
||||
|
||||
/**
|
||||
|
@ -230,7 +230,7 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
|
|||
byte[] encodedMessageInPacket = packet.getEncodedMessage();
|
||||
|
||||
// getting the data remaining to be sent
|
||||
encodedMessage = ByteUtil.substring(encodedMessage, encodedMessageInPacket.length, encodedMessage.length - encodedMessageInPacket.length);
|
||||
encodedMessage = ByteUtil.INSTANCE.substring(encodedMessage, encodedMessageInPacket.length, encodedMessage.length - encodedMessageInPacket.length);
|
||||
firstPacket = false;
|
||||
|
||||
try {
|
||||
|
@ -257,7 +257,7 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
|
|||
byte[] receivedMessageData = response.getEncodedMessage();
|
||||
while (receivedMessage == null) {
|
||||
try {
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Attempting to decode message: {}", ByteUtil.shortHexStringWithoutSpaces(receivedMessageData));
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, "Attempting to decode message: {}", ByteUtil.INSTANCE.shortHexStringWithoutSpaces(receivedMessageData));
|
||||
receivedMessage = OmnipodMessage.decodeMessage(receivedMessageData);
|
||||
if (receivedMessage.getAddress() != message.getAddress()) {
|
||||
throw new IllegalMessageAddressException(message.getAddress(), receivedMessage.getAddress());
|
||||
|
@ -276,7 +276,7 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
|
|||
if (conPacket.getPacketType() != PacketType.CON) {
|
||||
throw new IllegalPacketTypeException(PacketType.CON, conPacket.getPacketType());
|
||||
}
|
||||
receivedMessageData = ByteUtil.concat(receivedMessageData, conPacket.getEncodedMessage());
|
||||
receivedMessageData = ByteUtil.INSTANCE.concat(receivedMessageData, conPacket.getEncodedMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -305,7 +305,7 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication
|
|||
if (messageAddress == null) {
|
||||
messageAddress = podStateManager.getAddress();
|
||||
}
|
||||
return new OmnipodPacket(packetAddress, PacketType.ACK, podStateManager.getPacketNumber(), ByteUtil.getBytesFromInt(messageAddress));
|
||||
return new OmnipodPacket(packetAddress, PacketType.ACK, podStateManager.getPacketNumber(), ByteUtil.INSTANCE.getBytesFromInt(messageAddress));
|
||||
}
|
||||
|
||||
private void ackUntilQuiet(ErosPodStateManager podStateManager, Integer packetAddress, Integer messageAddress) {
|
||||
|
|
|
@ -19,7 +19,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugi
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.rileylink.manager.OmnipodRileyLinkCommunicationManager;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.util.AapsOmnipodUtil;
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState;
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState;
|
||||
import info.nightscout.rx.logging.LTag;
|
||||
|
||||
|
||||
|
@ -30,12 +30,10 @@ import info.nightscout.rx.logging.LTag;
|
|||
public class RileyLinkOmnipodService extends RileyLinkService {
|
||||
|
||||
private static final String REGEX_MAC = "([\\da-fA-F]{1,2}(?::|$)){6}";
|
||||
|
||||
private final IBinder mBinder = new LocalBinder();
|
||||
@Inject OmnipodErosPumpPlugin omnipodErosPumpPlugin;
|
||||
@Inject AapsOmnipodUtil aapsOmnipodUtil;
|
||||
@Inject OmnipodRileyLinkCommunicationManager omnipodRileyLinkCommunicationManager;
|
||||
|
||||
private final IBinder mBinder = new LocalBinder();
|
||||
private boolean rileyLinkAddressChanged = false;
|
||||
private boolean inPreInit = true;
|
||||
private String rileyLinkAddress;
|
||||
|
@ -89,18 +87,12 @@ public class RileyLinkOmnipodService extends RileyLinkService {
|
|||
return errorDescription;
|
||||
}
|
||||
|
||||
public class LocalBinder extends Binder {
|
||||
public RileyLinkOmnipodService getServiceInstance() {
|
||||
return RileyLinkOmnipodService.this;
|
||||
}
|
||||
}
|
||||
|
||||
/* private functions */
|
||||
|
||||
public boolean isInitialized() {
|
||||
return rileyLinkServiceData.getRileyLinkServiceState().isReady();
|
||||
}
|
||||
|
||||
/* private functions */
|
||||
|
||||
@Override
|
||||
public boolean verifyConfiguration(boolean forceRileyLinkAddressRenewal) {
|
||||
try {
|
||||
|
@ -153,4 +145,10 @@ public class RileyLinkOmnipodService extends RileyLinkService {
|
|||
|
||||
return reconfigureService(false);
|
||||
}
|
||||
|
||||
public class LocalBinder extends Binder {
|
||||
public RileyLinkOmnipodService getServiceInstance() {
|
||||
return RileyLinkOmnipodService.this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import java.util.List;
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.BasalSchedule;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.BasalScheduleEntry;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.RateEntry;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class BasalScheduleExtraCommandTest {
|
||||
@Test
|
||||
|
@ -164,6 +164,6 @@ class BasalScheduleExtraCommandTest {
|
|||
}
|
||||
|
||||
private double extractDelayUntilNextPulseInSeconds(byte[] message) {
|
||||
return ByteUtil.toInt((int) message[6], (int) message[7], (int) message[8], (int) message[9], ByteUtil.BitConversion.BIG_ENDIAN) / 1_000_000.0;
|
||||
return ByteUtil.INSTANCE.toInt((int) message[6], (int) message[7], (int) message[8], (int) message[9], ByteUtil.BitConversion.BIG_ENDIAN) / 1_000_000.0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import org.junit.jupiter.api.Assertions;
|
|||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.BeepConfigType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class BeepConfigCommandTest {
|
||||
@Test
|
||||
|
|
|
@ -4,7 +4,7 @@ import org.joda.time.Duration;
|
|||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class BolusExtraCommandTest {
|
||||
@Test
|
||||
|
|
|
@ -7,9 +7,11 @@ import java.util.EnumSet;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.BeepType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.DeliveryType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
/** @noinspection SpellCheckingInspection*/
|
||||
/**
|
||||
* @noinspection SpellCheckingInspection
|
||||
*/
|
||||
class CancelDeliveryCommandTest {
|
||||
|
||||
@Test
|
||||
|
|
|
@ -14,7 +14,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.Be
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.BeepType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.TimerAlertTrigger;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.UnitsRemainingAlertTrigger;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class ConfigureAlertsCommandTest {
|
||||
@Test
|
||||
|
|
|
@ -4,7 +4,7 @@ import org.junit.jupiter.api.Assertions;
|
|||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodInfoType;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class GetStatusCommandTest {
|
||||
@Test
|
||||
|
|
|
@ -11,7 +11,7 @@ import java.util.List;
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.BasalSchedule;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.BasalScheduleEntry;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.schedule.BolusDeliverySchedule;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class SetInsulinScheduleCommandTest {
|
||||
@Test
|
||||
|
|
|
@ -4,7 +4,7 @@ import org.joda.time.DateTime;
|
|||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class SetupPodCommandTest {
|
||||
@Test
|
||||
|
|
|
@ -4,7 +4,7 @@ import org.joda.time.Duration;
|
|||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class TempBasalExtraCommandTest {
|
||||
@Test
|
||||
|
|
|
@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.FaultEventCode;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class ErrorResponseTest {
|
||||
@Test
|
||||
|
|
|
@ -2,14 +2,14 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communicatio
|
|||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import org.joda.time.Duration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.AlertSlot;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.DeliveryStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
|
||||
import org.joda.time.Duration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class StatusResponseTest {
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import org.junit.jupiter.api.Assertions;
|
|||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class VersionResponseTest {
|
||||
@Test
|
||||
|
|
|
@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class PodInfoActiveAlertsTest {
|
||||
@Test
|
||||
|
|
|
@ -4,8 +4,9 @@ import static com.google.common.truth.Truth.assertThat;
|
|||
|
||||
import org.joda.time.Duration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.FaultEventCode;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class PodInfoDataLogTest {
|
||||
@Test
|
||||
|
|
|
@ -2,13 +2,14 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communicatio
|
|||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import org.joda.time.Duration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.DeliveryStatus;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.ErrorEventInfo;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.FaultEventCode;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import org.joda.time.Duration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
/**
|
||||
* @noinspection SpellCheckingInspection
|
||||
|
|
|
@ -2,12 +2,13 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communicatio
|
|||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.FaultEventCode;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import org.joda.time.DateTime;
|
||||
import org.joda.time.Duration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.FaultEventCode;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class PodInfoFaultAndInitializationTimeTest {
|
||||
@Test
|
||||
void testDecoding() {
|
||||
|
|
|
@ -3,7 +3,7 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communicatio
|
|||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
class PodInfoRecentPulseLogTest {
|
||||
@Test
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.communication.message.response.podinfo
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodInfoType
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.pump.core.defs
|
||||
package info.nightscout.pump.common.defs
|
||||
|
||||
import info.nightscout.pump.common.R
|
||||
|
|
@ -0,0 +1,401 @@
|
|||
package info.nightscout.pump.common.utils
|
||||
|
||||
import java.nio.ByteBuffer
|
||||
import java.util.Locale
|
||||
import kotlin.math.min
|
||||
|
||||
/**
|
||||
* Created by geoff on 4/28/15.
|
||||
*/
|
||||
object ByteUtil {
|
||||
|
||||
private val HEX_DIGITS = charArrayOf(
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
|
||||
)
|
||||
private const val HEX_DIGITS_STR = "0123456789ABCDEF"
|
||||
|
||||
/** @noinspection SpellCheckingInspection
|
||||
*/
|
||||
fun asUINT8(b: Byte): Int {
|
||||
return if (b < 0) b + 256 else b.toInt()
|
||||
}
|
||||
|
||||
fun getBytesFromInt16(value: Int): ByteArray {
|
||||
val array = getBytesFromInt(value)
|
||||
return byteArrayOf(array[2], array[3])
|
||||
}
|
||||
|
||||
fun getBytesFromInt(value: Int): ByteArray {
|
||||
return ByteBuffer.allocate(4).putInt(value).array()
|
||||
}
|
||||
|
||||
/* For Reference: static void System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) */
|
||||
fun concat(a: ByteArray, b: ByteArray?): ByteArray {
|
||||
if (b == null) {
|
||||
return a
|
||||
}
|
||||
val aLen = a.size
|
||||
val bLen = b.size
|
||||
val c = ByteArray(aLen + bLen)
|
||||
System.arraycopy(a, 0, c, 0, aLen)
|
||||
System.arraycopy(b, 0, c, aLen, bLen)
|
||||
return c
|
||||
}
|
||||
|
||||
fun concat(a: ByteArray, b: Byte): ByteArray {
|
||||
val aLen = a.size
|
||||
val c = ByteArray(aLen + 1)
|
||||
System.arraycopy(a, 0, c, 0, aLen)
|
||||
c[aLen] = b
|
||||
return c
|
||||
}
|
||||
|
||||
fun substring(a: ByteArray, start: Int, len: Int): ByteArray {
|
||||
val rVal = ByteArray(len)
|
||||
System.arraycopy(a, start, rVal, 0, len)
|
||||
return rVal
|
||||
}
|
||||
|
||||
fun substring(a: List<Byte>, start: Int, len: Int): ByteArray {
|
||||
val rVal = ByteArray(len)
|
||||
var i = start
|
||||
var j = 0
|
||||
while (i < start + len) {
|
||||
rVal[j] = a[i]
|
||||
i++
|
||||
j++
|
||||
}
|
||||
return rVal
|
||||
}
|
||||
|
||||
fun substring(a: ByteArray, start: Int): ByteArray {
|
||||
val len = a.size - start
|
||||
val rVal = ByteArray(len)
|
||||
System.arraycopy(a, start, rVal, 0, len)
|
||||
return rVal
|
||||
}
|
||||
|
||||
fun shortHexString(ra: ByteArray?): String {
|
||||
val rVal = StringBuilder()
|
||||
if (ra == null) {
|
||||
return rVal.toString()
|
||||
}
|
||||
if (ra.isEmpty()) {
|
||||
return rVal.toString()
|
||||
}
|
||||
for (i in ra.indices) {
|
||||
rVal.append(HEX_DIGITS[ra[i].toInt() and 0xF0 shr 4])
|
||||
rVal.append(HEX_DIGITS[ra[i].toInt() and 0x0F])
|
||||
if (i < ra.size - 1) {
|
||||
rVal.append(" ")
|
||||
}
|
||||
}
|
||||
return rVal.toString()
|
||||
}
|
||||
|
||||
fun shortHexString(list: List<Byte>): String {
|
||||
val aByte0 = getByteArrayFromList(list)
|
||||
return shortHexString(aByte0)
|
||||
}
|
||||
|
||||
fun shortHexString(`val`: Byte): String {
|
||||
return getHexCompact(`val`)
|
||||
}
|
||||
|
||||
fun shortHexStringWithoutSpaces(byteArray: ByteArray?): String {
|
||||
val hexString = StringBuilder()
|
||||
if (byteArray == null) {
|
||||
return hexString.toString()
|
||||
}
|
||||
for (b in byteArray) {
|
||||
hexString.append(HEX_DIGITS[b.toInt() and 0xF0 shr 4])
|
||||
hexString.append(HEX_DIGITS[b.toInt() and 0x0F])
|
||||
}
|
||||
return hexString.toString()
|
||||
}
|
||||
|
||||
fun fromHexString(src: String): ByteArray? {
|
||||
val s = src.uppercase(Locale.getDefault())
|
||||
var rVal = byteArrayOf()
|
||||
if (s.length % 2 != 0) {
|
||||
// invalid hex string!
|
||||
return null
|
||||
}
|
||||
var i = 0
|
||||
while (i < s.length) {
|
||||
val highNibbleOrd = HEX_DIGITS_STR.indexOf(s[i])
|
||||
if (highNibbleOrd < 0) {
|
||||
// Not a hex digit.
|
||||
return null
|
||||
}
|
||||
val lowNibbleOrd = HEX_DIGITS_STR.indexOf(s[i + 1])
|
||||
if (lowNibbleOrd < 0) {
|
||||
// Not a hex digit
|
||||
return null
|
||||
}
|
||||
rVal = concat(rVal, (highNibbleOrd * 16 + lowNibbleOrd).toByte())
|
||||
i += 2
|
||||
}
|
||||
return rVal
|
||||
}
|
||||
|
||||
fun getListFromByteArray(array: ByteArray): List<Byte> {
|
||||
val listOut: MutableList<Byte> = ArrayList()
|
||||
for (`val` in array) {
|
||||
listOut.add(`val`)
|
||||
}
|
||||
return listOut
|
||||
}
|
||||
|
||||
fun getByteArrayFromList(list: List<Byte>): ByteArray {
|
||||
val out = ByteArray(list.size)
|
||||
for (i in list.indices) {
|
||||
out[i] = list[i]
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// compares byte strings like strcmp
|
||||
fun compare(s1: ByteArray, s2: ByteArray): Int {
|
||||
val len1 = s1.size
|
||||
val len2 = s2.size
|
||||
if (len1 > len2) {
|
||||
return 1
|
||||
}
|
||||
if (len2 > len1) {
|
||||
return -1
|
||||
}
|
||||
var acc = 0
|
||||
var i = 0
|
||||
while (i < len1) {
|
||||
acc += s1[i].toInt()
|
||||
acc -= s2[i].toInt()
|
||||
if (acc != 0) {
|
||||
return acc
|
||||
}
|
||||
i++
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts 4 (or less) ints into int. (Shorts are objects, so you can send null if you have less parameters)
|
||||
*
|
||||
* @param b1 short 1
|
||||
* @param b2 short 2
|
||||
* @param b3 short 3
|
||||
* @param b4 short 4
|
||||
* @param flag Conversion Flag (Big Endian, Little endian)
|
||||
* @return int value
|
||||
*/
|
||||
fun toInt(b1: Int, b2: Int?, b3: Int?, b4: Int?, flag: BitConversion?): Int {
|
||||
return when (flag) {
|
||||
BitConversion.LITTLE_ENDIAN -> {
|
||||
if (b4 != null) {
|
||||
b4 and 0xff shl 24 or (b3!! and 0xff shl 16) or (b2!! and 0xff shl 8) or (b1 and 0xff)
|
||||
} else if (b3 != null) {
|
||||
b3 and 0xff shl 16 or (b2!! and 0xff shl 8) or (b1 and 0xff)
|
||||
} else if (b2 != null) {
|
||||
b2 and 0xff shl 8 or (b1 and 0xff)
|
||||
} else {
|
||||
b1 and 0xff
|
||||
}
|
||||
}
|
||||
|
||||
BitConversion.BIG_ENDIAN -> {
|
||||
if (b4 != null) {
|
||||
b1 and 0xff shl 24 or (b2!! and 0xff shl 16) or (b3!! and 0xff shl 8) or (b4 and 0xff)
|
||||
} else if (b3 != null) {
|
||||
b1 and 0xff shl 16 or (b2!! and 0xff shl 8) or (b3 and 0xff)
|
||||
} else if (b2 != null) {
|
||||
b1 and 0xff shl 8 or (b2 and 0xff)
|
||||
} else {
|
||||
b1 and 0xff
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
if (b4 != null) {
|
||||
b1 and 0xff shl 24 or (b2!! and 0xff shl 16) or (b3!! and 0xff shl 8) or (b4 and 0xff)
|
||||
} else if (b3 != null) {
|
||||
b1 and 0xff shl 16 or (b2!! and 0xff shl 8) or (b3 and 0xff)
|
||||
} else if (b2 != null) {
|
||||
b1 and 0xff shl 8 or (b2 and 0xff)
|
||||
} else {
|
||||
b1 and 0xff
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts 4 (or less) ints into int. (Shorts are objects, so you can send null if you have less parameters)
|
||||
*
|
||||
* @param b1 short 1
|
||||
* @param b2 short 2
|
||||
* @param b3 short 3
|
||||
* @param b4 short 4
|
||||
* @param flag Conversion Flag (Big Endian, Little endian)
|
||||
* @return int value
|
||||
*/
|
||||
fun toInt(b1: Byte, b2: Byte?, b3: Byte?, b4: Byte?, flag: BitConversion?): Int {
|
||||
return when (flag) {
|
||||
BitConversion.LITTLE_ENDIAN -> {
|
||||
if (b4 != null) {
|
||||
b4.toInt() and 0xff shl 24 or (b3!!.toInt() and 0xff shl 16) or (b2!!.toInt() and 0xff shl 8) or (b1.toInt() and 0xff)
|
||||
} else if (b3 != null) {
|
||||
b3.toInt() and 0xff shl 16 or (b2!!.toInt() and 0xff shl 8) or (b1.toInt() and 0xff)
|
||||
} else if (b2 != null) {
|
||||
b2.toInt() and 0xff shl 8 or (b1.toInt() and 0xff)
|
||||
} else {
|
||||
b1.toInt() and 0xff
|
||||
}
|
||||
}
|
||||
|
||||
BitConversion.BIG_ENDIAN -> {
|
||||
if (b4 != null) {
|
||||
b1.toInt() and 0xff shl 24 or (b2!!.toInt() and 0xff shl 16) or (b3!!.toInt() and 0xff shl 8) or (b4.toInt() and 0xff)
|
||||
} else if (b3 != null) {
|
||||
b1.toInt() and 0xff shl 16 or (b2!!.toInt() and 0xff shl 8) or (b3.toInt() and 0xff)
|
||||
} else if (b2 != null) {
|
||||
b1.toInt() and 0xff shl 8 or (b2.toInt() and 0xff)
|
||||
} else {
|
||||
b1.toInt() and 0xff
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
if (b4 != null) {
|
||||
b1.toInt() and 0xff shl 24 or (b2!!.toInt() and 0xff shl 16) or (b3!!.toInt() and 0xff shl 8) or (b4.toInt() and 0xff)
|
||||
} else if (b3 != null) {
|
||||
b1.toInt() and 0xff shl 16 or (b2!!.toInt() and 0xff shl 8) or (b3.toInt() and 0xff)
|
||||
} else if (b2 != null) {
|
||||
b1.toInt() and 0xff shl 8 or (b2.toInt() and 0xff)
|
||||
} else {
|
||||
b1.toInt() and 0xff
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun toInt(b1: Int, b2: Int): Int {
|
||||
return toInt(b1, b2, null, null, BitConversion.BIG_ENDIAN)
|
||||
}
|
||||
|
||||
fun toInt(b1: Int, b2: Int, flag: BitConversion?): Int {
|
||||
return toInt(b1, b2, null, null, flag)
|
||||
}
|
||||
|
||||
fun toInt(b1: Byte, b2: Byte): Int {
|
||||
return toInt(b1, b2, null, null, BitConversion.BIG_ENDIAN)
|
||||
}
|
||||
|
||||
fun toInt(b1: Int, b2: Int, b3: Int): Int {
|
||||
return toInt(b1, b2, b3, null, BitConversion.BIG_ENDIAN)
|
||||
}
|
||||
|
||||
fun toInt(b1: Byte, b2: Byte, b3: Byte): Int {
|
||||
return toInt(b1, b2, b3, null, BitConversion.BIG_ENDIAN)
|
||||
}
|
||||
|
||||
fun makeUnsignedShort(i: Int, j: Int): Int {
|
||||
return i and 0xff shl 8 or (j and 0xff)
|
||||
}
|
||||
|
||||
fun getCorrectHexValue(inp: Byte): String? {
|
||||
val hx = Integer.toHexString(Char(inp.toUShort()).code)
|
||||
when (hx.length) {
|
||||
1 -> return "0$hx"
|
||||
2 -> return hx
|
||||
4 -> return hx.substring(2)
|
||||
|
||||
else -> {
|
||||
println("Hex Error: $inp")
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
fun getHex(aByte0: ByteArray?): String? {
|
||||
return if (aByte0 != null) getHex(aByte0, aByte0.size) else null
|
||||
}
|
||||
|
||||
fun getHex(aByte0: ByteArray?, i: Int): String {
|
||||
var index = i
|
||||
val sb = StringBuilder()
|
||||
if (aByte0 != null) {
|
||||
index = min(index, aByte0.size)
|
||||
for (j in 0 until index) {
|
||||
sb.append(shortHexString(aByte0[j]))
|
||||
if (j < index - 1) {
|
||||
sb.append(" ")
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
fun getHex(list: List<Byte>): String {
|
||||
val aByte0 = getByteArrayFromList(list)
|
||||
return getHex(aByte0, aByte0.size)
|
||||
}
|
||||
|
||||
fun getHex(byte0: Byte): String {
|
||||
val s = if (byte0.toInt() != -1) "0x" else ""
|
||||
return s + getHexCompact(byte0)
|
||||
}
|
||||
|
||||
fun getHexCompact(byte0: Byte): String {
|
||||
val i = if (byte0.toInt() != -1) convertUnsignedByteToInt(byte0) else byte0.toInt()
|
||||
return getHexCompact(i)
|
||||
}
|
||||
|
||||
fun convertUnsignedByteToInt(data: Byte): Int {
|
||||
return data.toInt() and 0xff
|
||||
}
|
||||
|
||||
fun getHexCompact(l: Int): String {
|
||||
val s = java.lang.Long.toHexString(l.toLong()).uppercase(Locale.getDefault())
|
||||
val s1 = if (isOdd(s.length)) "0" else ""
|
||||
return if (l.toLong() != -1L) s1 + s else "-1"
|
||||
}
|
||||
|
||||
fun isEven(i: Int): Boolean {
|
||||
return i % 2 == 0
|
||||
}
|
||||
|
||||
fun isOdd(i: Int): Boolean {
|
||||
return !isEven(i)
|
||||
}
|
||||
|
||||
// 00 03 00 05 01 00 C8 00 A0
|
||||
fun createByteArrayFromString(dataFull: String): ByteArray {
|
||||
val data = dataFull.replace(" ", "")
|
||||
return createByteArrayFromCompactString(data, 0, data.length)
|
||||
}
|
||||
|
||||
fun createByteArrayFromHexString(dataFull: String): ByteArray {
|
||||
var data = dataFull.replace(" 0x", "")
|
||||
data = data.replace("0x", "")
|
||||
return createByteArrayFromCompactString(data, 0, data.length)
|
||||
}
|
||||
|
||||
// 000300050100C800A0
|
||||
fun createByteArrayFromCompactString(dataFull: String, startIndex: Int = 0, length: Int = dataFull.length): ByteArray {
|
||||
var data = dataFull.substring(startIndex)
|
||||
data = data.substring(0, length)
|
||||
val len = data.length
|
||||
val outArray = ByteArray(len / 2)
|
||||
var i = 0
|
||||
while (i < len) {
|
||||
outArray[i / 2] = ((data[i].digitToInt(16) shl 4) + data[i + 1].digitToInt(16)).toByte()
|
||||
i += 2
|
||||
}
|
||||
return outArray
|
||||
}
|
||||
|
||||
enum class BitConversion {
|
||||
LITTLE_ENDIAN, // 20 0 0 0 = reverse
|
||||
BIG_ENDIAN // 0 0 0 20 = normal - java
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.pump.core.utils;
|
||||
package info.nightscout.pump.common.utils;
|
||||
|
||||
import org.joda.time.LocalDateTime;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package info.nightscout.pump.core.utils;
|
||||
package info.nightscout.pump.common.utils;
|
||||
|
||||
/**
|
||||
* Created by geoff on 5/27/16.
|
|
@ -1,449 +0,0 @@
|
|||
package info.nightscout.pump.core.utils;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by geoff on 4/28/15.
|
||||
*/
|
||||
public class ByteUtil {
|
||||
|
||||
private final static char[] HEX_DIGITS = {
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||
|
||||
private final static String HEX_DIGITS_STR = "0123456789ABCDEF";
|
||||
|
||||
|
||||
/** @noinspection SpellCheckingInspection*/
|
||||
public static int asUINT8(byte b) {
|
||||
return (b < 0) ? b + 256 : b;
|
||||
}
|
||||
|
||||
public static byte[] getBytesFromInt16(int value) {
|
||||
byte[] array = getBytesFromInt(value);
|
||||
return new byte[]{array[2], array[3]};
|
||||
}
|
||||
|
||||
public static byte[] getBytesFromInt(int value) {
|
||||
return ByteBuffer.allocate(4).putInt(value).array();
|
||||
}
|
||||
|
||||
/* For Reference: static void System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) */
|
||||
|
||||
public static byte[] concat(byte[] a, byte[] b) {
|
||||
|
||||
if (b == null) {
|
||||
return a;
|
||||
}
|
||||
|
||||
int aLen = a.length;
|
||||
int bLen = b.length;
|
||||
byte[] c = new byte[aLen + bLen];
|
||||
System.arraycopy(a, 0, c, 0, aLen);
|
||||
System.arraycopy(b, 0, c, aLen, bLen);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
public static byte[] concat(byte[] a, byte b) {
|
||||
int aLen = a.length;
|
||||
byte[] c = new byte[aLen + 1];
|
||||
System.arraycopy(a, 0, c, 0, aLen);
|
||||
c[aLen] = b;
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
public static byte[] concat(byte a, byte[] b) {
|
||||
int aLen = b.length;
|
||||
byte[] c = new byte[aLen + 1];
|
||||
c[0] = a;
|
||||
System.arraycopy(b, 0, c, 1, aLen);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
public static byte[] substring(byte[] a, int start, int len) {
|
||||
byte[] rVal = new byte[len];
|
||||
System.arraycopy(a, start, rVal, 0, len);
|
||||
return rVal;
|
||||
}
|
||||
|
||||
public static byte[] substring(List<Byte> a, int start, int len) {
|
||||
byte[] rVal = new byte[len];
|
||||
|
||||
for (int i = start, j = 0; i < start + len; i++, j++) {
|
||||
rVal[j] = a.get(i);
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
|
||||
|
||||
public static byte[] substring(byte[] a, int start) {
|
||||
int len = a.length - start;
|
||||
byte[] rVal = new byte[len];
|
||||
System.arraycopy(a, start, rVal, 0, len);
|
||||
return rVal;
|
||||
}
|
||||
|
||||
|
||||
public static String shortHexString(byte[] ra) {
|
||||
StringBuilder rVal = new StringBuilder();
|
||||
if (ra == null) {
|
||||
return rVal.toString();
|
||||
}
|
||||
if (ra.length == 0) {
|
||||
return rVal.toString();
|
||||
}
|
||||
for (int i = 0; i < ra.length; i++) {
|
||||
rVal.append(HEX_DIGITS[(ra[i] & 0xF0) >> 4]);
|
||||
rVal.append(HEX_DIGITS[(ra[i] & 0x0F)]);
|
||||
if (i < ra.length - 1) {
|
||||
rVal.append(" ");
|
||||
}
|
||||
}
|
||||
return rVal.toString();
|
||||
}
|
||||
|
||||
public static String shortHexStringWithoutSpaces(byte[] byteArray) {
|
||||
StringBuilder hexString = new StringBuilder();
|
||||
if (byteArray == null) {
|
||||
return hexString.toString();
|
||||
}
|
||||
for (byte b : byteArray) {
|
||||
hexString.append(HEX_DIGITS[(b & 0xF0) >> 4]);
|
||||
hexString.append(HEX_DIGITS[(b & 0x0F)]);
|
||||
}
|
||||
return hexString.toString();
|
||||
}
|
||||
|
||||
public static String shortHexString(List<Byte> list) {
|
||||
|
||||
byte[] aByte0 = getByteArrayFromList(list);
|
||||
|
||||
return shortHexString(aByte0);
|
||||
}
|
||||
|
||||
|
||||
public static String shortHexString(byte val) {
|
||||
return getHexCompact(val);
|
||||
}
|
||||
|
||||
|
||||
public static byte[] fromHexString(String src) {
|
||||
String s = src.toUpperCase();
|
||||
byte[] rVal = new byte[]{};
|
||||
if ((s.length() % 2) != 0) {
|
||||
// invalid hex string!
|
||||
return null;
|
||||
}
|
||||
for (int i = 0; i < s.length(); i += 2) {
|
||||
int highNibbleOrd = HEX_DIGITS_STR.indexOf(s.charAt(i));
|
||||
if (highNibbleOrd < 0) {
|
||||
// Not a hex digit.
|
||||
return null;
|
||||
}
|
||||
int lowNibbleOrd = HEX_DIGITS_STR.indexOf(s.charAt(i + 1));
|
||||
if (lowNibbleOrd < 0) {
|
||||
// Not a hex digit
|
||||
return null;
|
||||
}
|
||||
rVal = concat(rVal, (byte) (highNibbleOrd * 16 + lowNibbleOrd));
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
|
||||
|
||||
public static List<Byte> getListFromByteArray(byte[] array) {
|
||||
List<Byte> listOut = new ArrayList<>();
|
||||
|
||||
for (byte val : array) {
|
||||
listOut.add(val);
|
||||
}
|
||||
|
||||
return listOut;
|
||||
}
|
||||
|
||||
|
||||
public static byte[] getByteArrayFromList(List<Byte> list) {
|
||||
byte[] out = new byte[list.size()];
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
out[i] = list.get(i);
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
// compares byte strings like strcmp
|
||||
public static int compare(byte[] s1, byte[] s2) {
|
||||
int i;
|
||||
int len1 = s1.length;
|
||||
int len2 = s2.length;
|
||||
if (len1 > len2) {
|
||||
return 1;
|
||||
}
|
||||
if (len2 > len1) {
|
||||
return -1;
|
||||
}
|
||||
int acc = 0;
|
||||
for (i = 0; i < len1; i++) {
|
||||
acc += s1[i];
|
||||
acc -= s2[i];
|
||||
if (acc != 0) {
|
||||
return acc;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Converts 4 (or less) ints into int. (Shorts are objects, so you can send null if you have less parameters)
|
||||
*
|
||||
* @param b1 short 1
|
||||
* @param b2 short 2
|
||||
* @param b3 short 3
|
||||
* @param b4 short 4
|
||||
* @param flag Conversion Flag (Big Endian, Little endian)
|
||||
* @return int value
|
||||
*/
|
||||
public static int toInt(Integer b1, Integer b2, Integer b3, Integer b4, BitConversion flag) {
|
||||
switch (flag) {
|
||||
case LITTLE_ENDIAN: {
|
||||
if (b4 != null) {
|
||||
return (b4 & 0xff) << 24 | (b3 & 0xff) << 16 | (b2 & 0xff) << 8 | b1 & 0xff;
|
||||
} else if (b3 != null) {
|
||||
return (b3 & 0xff) << 16 | (b2 & 0xff) << 8 | b1 & 0xff;
|
||||
} else if (b2 != null) {
|
||||
return (b2 & 0xff) << 8 | b1 & 0xff;
|
||||
} else {
|
||||
return b1 & 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
case BIG_ENDIAN: {
|
||||
if (b4 != null) {
|
||||
return (b1 & 0xff) << 24 | (b2 & 0xff) << 16 | (b3 & 0xff) << 8 | b4 & 0xff;
|
||||
} else if (b3 != null) {
|
||||
return (b1 & 0xff) << 16 | (b2 & 0xff) << 8 | b3 & 0xff;
|
||||
} else if (b2 != null) {
|
||||
return (b1 & 0xff) << 8 | b2 & 0xff;
|
||||
} else {
|
||||
return b1 & 0xff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Converts 4 (or less) ints into int. (Shorts are objects, so you can send null if you have less parameters)
|
||||
*
|
||||
* @param b1 short 1
|
||||
* @param b2 short 2
|
||||
* @param b3 short 3
|
||||
* @param b4 short 4
|
||||
* @param flag Conversion Flag (Big Endian, Little endian)
|
||||
* @return int value
|
||||
*/
|
||||
public static int toInt(Byte b1, Byte b2, Byte b3, Byte b4, BitConversion flag) {
|
||||
switch (flag) {
|
||||
case LITTLE_ENDIAN: {
|
||||
if (b4 != null) {
|
||||
return (b4 & 0xff) << 24 | (b3 & 0xff) << 16 | (b2 & 0xff) << 8 | b1 & 0xff;
|
||||
} else if (b3 != null) {
|
||||
return (b3 & 0xff) << 16 | (b2 & 0xff) << 8 | b1 & 0xff;
|
||||
} else if (b2 != null) {
|
||||
return (b2 & 0xff) << 8 | b1 & 0xff;
|
||||
} else {
|
||||
return b1 & 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
case BIG_ENDIAN: {
|
||||
if (b4 != null) {
|
||||
return (b1 & 0xff) << 24 | (b2 & 0xff) << 16 | (b3 & 0xff) << 8 | b4 & 0xff;
|
||||
} else if (b3 != null) {
|
||||
return (b1 & 0xff) << 16 | (b2 & 0xff) << 8 | b3 & 0xff;
|
||||
} else if (b2 != null) {
|
||||
return (b1 & 0xff) << 8 | b2 & 0xff;
|
||||
} else {
|
||||
return b1 & 0xff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static int toInt(int b1, int b2) {
|
||||
return toInt(b1, b2, null, null, BitConversion.BIG_ENDIAN);
|
||||
}
|
||||
|
||||
public static int toInt(Byte b1, Byte b2) {
|
||||
return toInt(b1, b2, null, null, BitConversion.BIG_ENDIAN);
|
||||
}
|
||||
|
||||
|
||||
public static int toInt(int b1, int b2, int b3) {
|
||||
return toInt(b1, b2, b3, null, BitConversion.BIG_ENDIAN);
|
||||
}
|
||||
|
||||
public static int toInt(Byte b1, Byte b2, Byte b3) {
|
||||
return toInt(b1, b2, b3, null, BitConversion.BIG_ENDIAN);
|
||||
}
|
||||
|
||||
public static int toInt(int b1, int b2, BitConversion flag) {
|
||||
return toInt(b1, b2, null, null, flag);
|
||||
}
|
||||
|
||||
|
||||
public static int makeUnsignedShort(int i, int j) {
|
||||
return (i & 0xff) << 8 | j & 0xff;
|
||||
}
|
||||
|
||||
|
||||
public static String getCorrectHexValue(byte inp) {
|
||||
String hx = Integer.toHexString((char) inp);
|
||||
|
||||
if (hx.length() == 1)
|
||||
return "0" + hx;
|
||||
else if (hx.length() == 2)
|
||||
return hx;
|
||||
else if (hx.length() == 4)
|
||||
return hx.substring(2);
|
||||
else {
|
||||
System.out.println("Hex Error: " + inp);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static String getHex(byte[] aByte0) {
|
||||
return aByte0 != null ? getHex(aByte0, aByte0.length) : null;
|
||||
}
|
||||
|
||||
|
||||
public static String getString(short[] aByte0) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
for (short i : aByte0) {
|
||||
sb.append(i);
|
||||
sb.append(" ");
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
public static String getHex(List<Byte> list) {
|
||||
|
||||
byte[] aByte0 = getByteArrayFromList(list);
|
||||
|
||||
return getHex(aByte0, aByte0.length);
|
||||
}
|
||||
|
||||
|
||||
public static String getHex(byte[] aByte0, int i) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (aByte0 != null) {
|
||||
i = Math.min(i, aByte0.length);
|
||||
for (int j = 0; j < i; j++) {
|
||||
sb.append(shortHexString(aByte0[j]));
|
||||
if (j < i - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return new String(sb);
|
||||
}
|
||||
|
||||
|
||||
public static String getHex(byte byte0) {
|
||||
String s = byte0 != -1 ? "0x" : "";
|
||||
return s + getHexCompact(byte0);
|
||||
}
|
||||
|
||||
|
||||
public static String getHexCompact(byte byte0) {
|
||||
int i = byte0 != -1 ? convertUnsignedByteToInt(byte0) : (int) byte0;
|
||||
return getHexCompact(i);
|
||||
}
|
||||
|
||||
|
||||
public static int convertUnsignedByteToInt(byte data) {
|
||||
return data & 0xff;
|
||||
}
|
||||
|
||||
|
||||
public static String getHexCompact(int l) {
|
||||
String s = Long.toHexString(l).toUpperCase();
|
||||
String s1 = isOdd(s.length()) ? "0" : "";
|
||||
return l != -1L ? s1 + s : "-1";
|
||||
}
|
||||
|
||||
|
||||
public static boolean isEven(int i) {
|
||||
return i % 2 == 0;
|
||||
}
|
||||
|
||||
|
||||
public static boolean isOdd(int i) {
|
||||
return !isEven(i);
|
||||
}
|
||||
|
||||
public enum BitConversion {
|
||||
LITTLE_ENDIAN, // 20 0 0 0 = reverse
|
||||
BIG_ENDIAN // 0 0 0 20 = normal - java
|
||||
}
|
||||
|
||||
|
||||
// 000300050100C800A0
|
||||
public static byte[] createByteArrayFromCompactString(String dataFull) {
|
||||
return createByteArrayFromCompactString(dataFull, 0, dataFull.length());
|
||||
}
|
||||
|
||||
|
||||
// 00 03 00 05 01 00 C8 00 A0
|
||||
public static byte[] createByteArrayFromString(String dataFull) {
|
||||
|
||||
String data = dataFull.replace(" ", "");
|
||||
|
||||
return createByteArrayFromCompactString(data, 0, data.length());
|
||||
}
|
||||
|
||||
|
||||
public static byte[] createByteArrayFromHexString(String dataFull) {
|
||||
|
||||
String data = dataFull.replace(" 0x", "");
|
||||
data = data.replace("0x", "");
|
||||
|
||||
return createByteArrayFromCompactString(data, 0, data.length());
|
||||
}
|
||||
|
||||
|
||||
public static byte[] createByteArrayFromCompactString(String dataFull, int startIndex, int length) {
|
||||
|
||||
String data = dataFull.substring(startIndex);
|
||||
|
||||
data = data.substring(0, length);
|
||||
|
||||
int len = data.length();
|
||||
byte[] outArray = new byte[len / 2];
|
||||
for (int i = 0; i < len; i += 2) {
|
||||
outArray[i / 2] = (byte) ((Character.digit(data.charAt(i), 16) << 4) + Character.digit(data.charAt(i + 1),
|
||||
16));
|
||||
}
|
||||
|
||||
return outArray;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
package info.nightscout.pump.common.utils
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
internal class ByteUtilTest {
|
||||
|
||||
@Test fun asUINT8() {
|
||||
assertThat(ByteUtil.asUINT8(-1)).isEqualTo(255)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getBytesFromInt16() {
|
||||
assertThat(ByteUtil.getBytesFromInt16(0x0102)[0]).isEqualTo(1)
|
||||
assertThat(ByteUtil.getBytesFromInt16(0x0102)[1]).isEqualTo(2)
|
||||
assertThat(ByteUtil.getBytesFromInt16(0x0102)).hasLength(2)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getBytesFromInt() {
|
||||
assertThat(ByteUtil.getBytesFromInt(0x01020304)[0]).isEqualTo(1)
|
||||
assertThat(ByteUtil.getBytesFromInt(0x01020304)[1]).isEqualTo(2)
|
||||
assertThat(ByteUtil.getBytesFromInt(0x01020304)[2]).isEqualTo(3)
|
||||
assertThat(ByteUtil.getBytesFromInt(0x01020304)[3]).isEqualTo(4)
|
||||
assertThat(ByteUtil.getBytesFromInt(0x0102)).hasLength(4)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun concat() {
|
||||
assertThat(ByteUtil.concat(byteArrayOf(1), null)).hasLength(1)
|
||||
assertThat(ByteUtil.concat(byteArrayOf(1), byteArrayOf(2))).hasLength(2)
|
||||
assertThat(ByteUtil.concat(byteArrayOf(1), byteArrayOf(2))[1]).isEqualTo(2)
|
||||
|
||||
assertThat(ByteUtil.concat(byteArrayOf(1), 2.toByte())).hasLength(2)
|
||||
assertThat(ByteUtil.concat(byteArrayOf(1), 2.toByte())[1]).isEqualTo(2)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun substring() {
|
||||
assertThat(ByteUtil.substring(byteArrayOf(0x01, 0x02, 0x03), 1, 2)).hasLength(2)
|
||||
assertThat(ByteUtil.substring(byteArrayOf(0x01, 0x02, 0x03), 1, 2)[1]).isEqualTo(3)
|
||||
|
||||
assertThat(ByteUtil.substring(arrayListOf(0x01.toByte(), 0x02.toByte(), 0x03.toByte()), 1, 2)).hasLength(2)
|
||||
assertThat(ByteUtil.substring(arrayListOf(0x01.toByte(), 0x02.toByte(), 0x03.toByte()), 1, 2)[1]).isEqualTo(3)
|
||||
|
||||
assertThat(ByteUtil.substring(byteArrayOf(0x01, 0x02, 0x03), 1)).hasLength(2)
|
||||
assertThat(ByteUtil.substring(byteArrayOf(0x01, 0x02, 0x03), 1)[1]).isEqualTo(3)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun shortHexString() {
|
||||
assertThat(ByteUtil.shortHexString(null as ByteArray?)).isEqualTo("")
|
||||
assertThat(ByteUtil.shortHexString(byteArrayOf())).isEqualTo("")
|
||||
assertThat(ByteUtil.shortHexString(byteArrayOf(0x01, 0x02, 0x03))).isEqualTo("01 02 03")
|
||||
assertThat(ByteUtil.shortHexString(arrayListOf(0x01.toByte(), 0x02.toByte(), 0x03.toByte()))).isEqualTo("01 02 03")
|
||||
|
||||
assertThat(ByteUtil.shortHexString(0x01.toByte())).isEqualTo("01")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun shortHexStringWithoutSpaces() {
|
||||
assertThat(ByteUtil.shortHexStringWithoutSpaces(null as ByteArray?)).isEqualTo("")
|
||||
assertThat(ByteUtil.shortHexStringWithoutSpaces(byteArrayOf())).isEqualTo("")
|
||||
assertThat(ByteUtil.shortHexStringWithoutSpaces(byteArrayOf(0x01, 0x02, 0x03))).isEqualTo("010203")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun fromHexString() {
|
||||
assertThat(ByteUtil.fromHexString("1")).isEqualTo(null)
|
||||
assertThat(ByteUtil.fromHexString("GA")).isEqualTo(null)
|
||||
assertThat(ByteUtil.fromHexString("AG")).isEqualTo(null)
|
||||
assertThat(ByteUtil.fromHexString("0102")?.get(0)).isEqualTo(1)
|
||||
assertThat(ByteUtil.fromHexString("0102")?.get(1)).isEqualTo(2)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getListFromByteArray() {
|
||||
assertThat(ByteUtil.getListFromByteArray(byteArrayOf(0x01, 0x02, 0x03))).hasSize(3)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun compare() {
|
||||
assertThat(ByteUtil.compare(byteArrayOf(0x01, 0x02), byteArrayOf(0x01))).isEqualTo(1)
|
||||
assertThat(ByteUtil.compare(byteArrayOf(0x01), byteArrayOf(0x01, 0x02))).isEqualTo(-1)
|
||||
assertThat(ByteUtil.compare(byteArrayOf(0x01, 0x02), byteArrayOf(0x01, 0x02))).isEqualTo(0)
|
||||
assertThat(ByteUtil.compare(byteArrayOf(0x01, 0x02), byteArrayOf(0x02, 0x01))).isEqualTo(-1)
|
||||
assertThat(ByteUtil.compare(byteArrayOf(0x02, 0x01), byteArrayOf(0x01, 0x02))).isEqualTo(1)
|
||||
}
|
||||
|
||||
@Suppress("RemoveRedundantCallsOfConversionMethods")
|
||||
@Test
|
||||
fun toInt() {
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt(), 0x03.toInt(), 0x04.toInt(), ByteUtil.BitConversion.LITTLE_ENDIAN)).isEqualTo(0x04030201)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt(), 0x03.toInt(), null, ByteUtil.BitConversion.LITTLE_ENDIAN)).isEqualTo(0x030201)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt(), null, null, ByteUtil.BitConversion.LITTLE_ENDIAN)).isEqualTo(0x0201)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), null, null, null, ByteUtil.BitConversion.LITTLE_ENDIAN)).isEqualTo(0x01)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt(), 0x03.toInt(), 0x04.toInt(), ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x01020304)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt(), 0x03.toInt(), null, ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x010203)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt(), null, null, ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x0102)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), null, null, null, ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x01)
|
||||
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), 0x02.toByte(), 0x03.toByte(), 0x04.toByte(), ByteUtil.BitConversion.LITTLE_ENDIAN)).isEqualTo(0x04030201)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), 0x02.toByte(), 0x03.toByte(), null, ByteUtil.BitConversion.LITTLE_ENDIAN)).isEqualTo(0x030201)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), 0x02.toByte(), null, null, ByteUtil.BitConversion.LITTLE_ENDIAN)).isEqualTo(0x0201)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), null, null, null, ByteUtil.BitConversion.LITTLE_ENDIAN)).isEqualTo(0x01)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), 0x02.toByte(), 0x03.toByte(), 0x04.toByte(), ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x01020304)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), 0x02.toByte(), 0x03.toByte(), null, ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x010203)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), 0x02.toByte(), null, null, ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x0102)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), null, null, null, ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x01)
|
||||
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt())).isEqualTo(0x0102)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt(), ByteUtil.BitConversion.BIG_ENDIAN)).isEqualTo(0x0102)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), 0x02.toByte())).isEqualTo(0x0102)
|
||||
assertThat(ByteUtil.toInt(0x01.toByte(), 0x02.toByte(), 0x03.toByte())).isEqualTo(0x010203)
|
||||
assertThat(ByteUtil.toInt(0x01.toInt(), 0x02.toInt(), 0x03.toInt())).isEqualTo(0x010203)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun makeUnsignedShort() {
|
||||
assertThat(ByteUtil.makeUnsignedShort(0xF1, 0xF2)).isEqualTo(61938)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getCorrectHexValue() {
|
||||
assertThat(ByteUtil.getCorrectHexValue(0x1.toByte())).isEqualTo("01")
|
||||
assertThat(ByteUtil.getCorrectHexValue(0xF1.toByte())).isEqualTo("f1")
|
||||
assertThat(ByteUtil.getCorrectHexValue(0xABF1.toByte())).isEqualTo("f1")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getHex() {
|
||||
assertThat(ByteUtil.getHex(null as ByteArray?)).isEqualTo(null)
|
||||
assertThat(ByteUtil.getHex(byteArrayOf(0xF1.toByte(), 0xDB.toByte()))).isEqualTo("F1 DB")
|
||||
assertThat(ByteUtil.getHex(byteArrayOf(0xF1.toByte(), 0xDB.toByte(), 0xAB.toByte()), 2)).isEqualTo("F1 DB")
|
||||
|
||||
assertThat(ByteUtil.getHex(arrayListOf(0xF1.toByte(), 0xDB.toByte(), 0xAB.toByte()))).isEqualTo("F1 DB AB")
|
||||
|
||||
assertThat(ByteUtil.getHex((-1).toByte())).isEqualTo("-1")
|
||||
assertThat(ByteUtil.getHex((11).toByte())).isEqualTo("0x0B")
|
||||
assertThat(ByteUtil.getHex((0xFA).toByte())).isEqualTo("0xFA")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun createByteArrayFromCompactString() {
|
||||
assertThat(ByteUtil.createByteArrayFromCompactString("C800A0")[0]).isEqualTo(-56)
|
||||
assertThat(ByteUtil.createByteArrayFromCompactString("C800A0")[2]).isEqualTo(-96)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun createByteArrayFromString() {
|
||||
assertThat(ByteUtil.createByteArrayFromString("C8 00 A0")[0]).isEqualTo(-56)
|
||||
assertThat(ByteUtil.createByteArrayFromString("C8 00 A0")[2]).isEqualTo(-96)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun createByteArrayFromHexString() {
|
||||
assertThat(ByteUtil.createByteArrayFromHexString("0xC800A0")[0]).isEqualTo(-56)
|
||||
assertThat(ByteUtil.createByteArrayFromHexString("0xC800A0")[2]).isEqualTo(-96)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testCreateByteArrayFromCompactString() {
|
||||
assertThat(ByteUtil.createByteArrayFromCompactString("FFC800A0", 2, 6)[0]).isEqualTo(-56)
|
||||
assertThat(ByteUtil.createByteArrayFromCompactString("FFC800A0", 2, 6)[2]).isEqualTo(-96)
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@ import android.content.Context
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState
|
||||
import info.nightscout.rx.events.EventStatus
|
||||
|
||||
open class EventRileyLinkDeviceStatusChange : EventStatus {
|
||||
|
|
|
@ -21,8 +21,8 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.WakeAndTuneTask;
|
||||
import info.nightscout.interfaces.plugin.ActivePlugin;
|
||||
import info.nightscout.interfaces.utils.Round;
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.rx.logging.AAPSLogger;
|
||||
import info.nightscout.rx.logging.LTag;
|
||||
import info.nightscout.shared.sharedPreferences.SP;
|
||||
|
@ -33,6 +33,8 @@ import info.nightscout.shared.sharedPreferences.SP;
|
|||
* Created by andy on 5/10/18.
|
||||
*/
|
||||
public abstract class RileyLinkCommunicationManager<T extends RLMessage> {
|
||||
private final int SCAN_TIMEOUT = 1500;
|
||||
private final int ALLOWED_PUMP_UNREACHABLE = 10 * 60 * 1000; // 10 minutes
|
||||
@Inject protected AAPSLogger aapsLogger;
|
||||
@Inject protected SP sp;
|
||||
@Inject protected RileyLinkServiceData rileyLinkServiceData;
|
||||
|
@ -40,10 +42,6 @@ public abstract class RileyLinkCommunicationManager<T extends RLMessage> {
|
|||
@Inject protected RFSpy rfspy;
|
||||
@Inject protected HasAndroidInjector injector;
|
||||
@Inject protected ActivePlugin activePlugin;
|
||||
|
||||
private final int SCAN_TIMEOUT = 1500;
|
||||
private final int ALLOWED_PUMP_UNREACHABLE = 10 * 60 * 1000; // 10 minutes
|
||||
|
||||
protected int receiverDeviceAwakeForMinutes = 1; // override this in constructor of specific implementation
|
||||
protected String receiverDeviceID; // String representation of receiver device (ex. Pump (xxxxxx) or Pod (yyyyyy))
|
||||
protected long lastGoodReceiverCommunicationTime = 0;
|
||||
|
@ -74,7 +72,7 @@ public abstract class RileyLinkCommunicationManager<T extends RLMessage> {
|
|||
// internal flag
|
||||
boolean showPumpMessages = true;
|
||||
if (showPumpMessages) {
|
||||
aapsLogger.info(LTag.PUMPBTCOMM, "Sent:" + ByteUtil.shortHexString(msg.getTxData()));
|
||||
aapsLogger.info(LTag.PUMPBTCOMM, "Sent:" + ByteUtil.INSTANCE.shortHexString(msg.getTxData()));
|
||||
}
|
||||
|
||||
RFSpyResponse rfSpyResponse = rfspy.transmitThenReceive(new RadioPacket(injector, msg.getTxData()),
|
||||
|
@ -112,7 +110,7 @@ public abstract class RileyLinkCommunicationManager<T extends RLMessage> {
|
|||
}
|
||||
|
||||
if (showPumpMessages) {
|
||||
aapsLogger.info(LTag.PUMPBTCOMM, "Received:" + ByteUtil.shortHexString(rfSpyResponse.getRadioResponse(injector).getPayload()));
|
||||
aapsLogger.info(LTag.PUMPBTCOMM, "Received:" + ByteUtil.INSTANCE.shortHexString(rfSpyResponse.getRadioResponse(injector).getPayload()));
|
||||
}
|
||||
|
||||
return response;
|
||||
|
@ -153,7 +151,7 @@ public abstract class RileyLinkCommunicationManager<T extends RLMessage> {
|
|||
byte[] pumpMsgContent = createPumpMessageContent(RLMessageType.ReadSimpleData); // simple
|
||||
RFSpyResponse resp = rfspy.transmitThenReceive(new RadioPacket(injector, pumpMsgContent), (byte) 0, (byte) 200,
|
||||
(byte) 0, (byte) 0, 25000, (byte) 0);
|
||||
aapsLogger.info(LTag.PUMPBTCOMM, "wakeup: raw response is " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.info(LTag.PUMPBTCOMM, "wakeup: raw response is " + ByteUtil.INSTANCE.shortHexString(resp.getRaw()));
|
||||
|
||||
// FIXME wakeUp successful !!!!!!!!!!!!!!!!!!
|
||||
|
||||
|
@ -170,7 +168,7 @@ public abstract class RileyLinkCommunicationManager<T extends RLMessage> {
|
|||
// byte[] pumpMsgContent = createPumpMessageContent(RLMessageType.PowerOn);
|
||||
// RFSpyResponse resp = rfspy.transmitThenReceive(new RadioPacket(pumpMsgContent), (byte) 0, (byte) 200, (byte)
|
||||
// 0, (byte) 0, 15000, (byte) 0);
|
||||
// LOG.info("wakeup: raw response is " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
// LOG.info("wakeup: raw response is " + ByteUtil.INSTANCE.shortHexString(resp.getRaw()));
|
||||
// } else {
|
||||
// LOG.trace("Last pump communication was recent, not waking pump.");
|
||||
// }
|
||||
|
@ -247,17 +245,17 @@ public abstract class RileyLinkCommunicationManager<T extends RLMessage> {
|
|||
trial.rssiList.add(rssi);
|
||||
trial.successes++;
|
||||
} else {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Failed to parse radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Failed to parse radio response: " + ByteUtil.INSTANCE.shortHexString(resp.getRaw()));
|
||||
trial.rssiList.add(-99);
|
||||
}
|
||||
|
||||
} catch (RileyLinkCommunicationException rle) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Failed to decode radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Failed to decode radio response: " + ByteUtil.INSTANCE.shortHexString(resp.getRaw()));
|
||||
trial.rssiList.add(-99);
|
||||
}
|
||||
|
||||
} else {
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "scanForPump: raw response is " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "scanForPump: raw response is " + ByteUtil.INSTANCE.shortHexString(resp.getRaw()));
|
||||
trial.rssiList.add(-99);
|
||||
}
|
||||
trial.tries++;
|
||||
|
@ -332,11 +330,11 @@ public abstract class RileyLinkCommunicationManager<T extends RLMessage> {
|
|||
return calculateRssi(radioResponse.rssi);
|
||||
} else {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "tune_tryFrequency: invalid radio response:"
|
||||
+ ByteUtil.shortHexString(radioResponse.getPayload()));
|
||||
+ ByteUtil.INSTANCE.shortHexString(radioResponse.getPayload()));
|
||||
}
|
||||
|
||||
} catch (RileyLinkCommunicationException e) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Failed to decode radio response: " + ByteUtil.shortHexString(resp.getRaw()));
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, "Failed to decode radio response: " + ByteUtil.INSTANCE.shortHexString(resp.getRaw()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,9 +31,9 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.Rile
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations.BLECommOperationResult;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.core.utils.StringUtil;
|
||||
import info.nightscout.pump.core.utils.ThreadUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.StringUtil;
|
||||
import info.nightscout.pump.common.utils.ThreadUtil;
|
||||
import info.nightscout.rx.bus.RxBus;
|
||||
import info.nightscout.rx.events.EventRefreshOverview;
|
||||
import info.nightscout.rx.logging.AAPSLogger;
|
||||
|
@ -49,26 +49,23 @@ public class RFSpy {
|
|||
private static final long DEFAULT_BATTERY_CHECK_INTERVAL_MILLIS = 30 * 60 * 1_000L; // 30 minutes;
|
||||
private static final long LOW_BATTERY_BATTERY_CHECK_INTERVAL_MILLIS = 10 * 60 * 1_000L; // 10 minutes;
|
||||
private static final int LOW_BATTERY_PERCENTAGE_THRESHOLD = 20;
|
||||
|
||||
private static final long RILEYLINK_FREQ_XTAL = 24000000;
|
||||
private static final int EXPECTED_MAX_BLUETOOTH_LATENCY_MS = 7500; // 1500
|
||||
private final HasAndroidInjector injector;
|
||||
private final RileyLinkBLE rileyLinkBle;
|
||||
private final UUID radioServiceUUID = UUID.fromString(GattAttributes.SERVICE_RADIO);
|
||||
private final UUID radioDataUUID = UUID.fromString(GattAttributes.CHARA_RADIO_DATA);
|
||||
private final UUID radioVersionUUID = UUID.fromString(GattAttributes.CHARA_RADIO_VERSION);
|
||||
private final UUID batteryServiceUUID = UUID.fromString(GattAttributes.SERVICE_BATTERY);
|
||||
private final UUID batteryLevelUUID = UUID.fromString(GattAttributes.CHARA_BATTERY_LEVEL);
|
||||
public int notConnectedCount = 0;
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject ResourceHelper rh;
|
||||
@Inject SP sp;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
@Inject RxBus rxBus;
|
||||
|
||||
private final HasAndroidInjector injector;
|
||||
|
||||
private static final long RILEYLINK_FREQ_XTAL = 24000000;
|
||||
private static final int EXPECTED_MAX_BLUETOOTH_LATENCY_MS = 7500; // 1500
|
||||
public int notConnectedCount = 0;
|
||||
private final RileyLinkBLE rileyLinkBle;
|
||||
private RFSpyReader reader;
|
||||
private final UUID radioServiceUUID = UUID.fromString(GattAttributes.SERVICE_RADIO);
|
||||
private final UUID radioDataUUID = UUID.fromString(GattAttributes.CHARA_RADIO_DATA);
|
||||
private final UUID radioVersionUUID = UUID.fromString(GattAttributes.CHARA_RADIO_VERSION);
|
||||
private final UUID batteryServiceUUID = UUID.fromString(GattAttributes.SERVICE_BATTERY);
|
||||
private final UUID batteryLevelUUID = UUID.fromString(GattAttributes.CHARA_BATTERY_LEVEL);
|
||||
private String bleVersion; // We don't use it so no need of sofisticated logic
|
||||
private Double currentFrequencyMHz;
|
||||
private long nextBatteryCheck = 0;
|
||||
|
@ -79,6 +76,25 @@ public class RFSpy {
|
|||
this.rileyLinkBle = rileyLinkBle;
|
||||
}
|
||||
|
||||
static RileyLinkFirmwareVersion getFirmwareVersion(AAPSLogger aapsLogger, String bleVersion, String cc1110Version) {
|
||||
if (cc1110Version != null) {
|
||||
RileyLinkFirmwareVersion version = RileyLinkFirmwareVersion.getByVersionString(cc1110Version);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "Firmware Version string: %s, resolved to %s.", cc1110Version, version));
|
||||
|
||||
if (version != RileyLinkFirmwareVersion.UnknownVersion) {
|
||||
return version;
|
||||
}
|
||||
}
|
||||
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "Firmware Version can't be determined. Checking with BLE Version [%s].", bleVersion));
|
||||
|
||||
if (bleVersion.contains(" 2.")) {
|
||||
return RileyLinkFirmwareVersion.Version_2_0;
|
||||
}
|
||||
|
||||
return RileyLinkFirmwareVersion.UnknownVersion;
|
||||
}
|
||||
|
||||
@Inject
|
||||
public void onInit() {
|
||||
//aapsLogger.debug("RileyLinkServiceData:" + rileyLinkServiceData);
|
||||
|
@ -155,7 +171,7 @@ public class RFSpy {
|
|||
byte[] getVersionRaw = getByteArray(RileyLinkCommandType.GetVersion.code);
|
||||
byte[] response = writeToDataRaw(getVersionRaw, 5000);
|
||||
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "Firmware Version. GetVersion [response=%s]", ByteUtil.shortHexString(response)));
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "Firmware Version. GetVersion [response=%s]", ByteUtil.INSTANCE.shortHexString(response)));
|
||||
|
||||
if (response != null) { // && response[0] == (byte) 0xDD) {
|
||||
|
||||
|
@ -173,25 +189,6 @@ public class RFSpy {
|
|||
return null;
|
||||
}
|
||||
|
||||
static RileyLinkFirmwareVersion getFirmwareVersion(AAPSLogger aapsLogger, String bleVersion, String cc1110Version) {
|
||||
if (cc1110Version != null) {
|
||||
RileyLinkFirmwareVersion version = RileyLinkFirmwareVersion.getByVersionString(cc1110Version);
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "Firmware Version string: %s, resolved to %s.", cc1110Version, version));
|
||||
|
||||
if (version != RileyLinkFirmwareVersion.UnknownVersion) {
|
||||
return version;
|
||||
}
|
||||
}
|
||||
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "Firmware Version can't be determined. Checking with BLE Version [%s].", bleVersion));
|
||||
|
||||
if (bleVersion.contains(" 2.")) {
|
||||
return RileyLinkFirmwareVersion.Version_2_0;
|
||||
}
|
||||
|
||||
return RileyLinkFirmwareVersion.UnknownVersion;
|
||||
}
|
||||
|
||||
private byte[] writeToDataRaw(byte[] bytes, int responseTimeout_ms) {
|
||||
SystemClock.sleep(100);
|
||||
// FIXME drain read queue?
|
||||
|
@ -199,14 +196,14 @@ public class RFSpy {
|
|||
|
||||
while (junkInBuffer != null) {
|
||||
aapsLogger.warn(LTag.PUMPBTCOMM, ThreadUtil.sig() + "writeToData: draining read queue, found this: "
|
||||
+ ByteUtil.shortHexString(junkInBuffer));
|
||||
+ ByteUtil.INSTANCE.shortHexString(junkInBuffer));
|
||||
junkInBuffer = reader.poll(0);
|
||||
}
|
||||
|
||||
// prepend length, and send it.
|
||||
byte[] prepended = ByteUtil.concat(new byte[]{(byte) (bytes.length)}, bytes);
|
||||
byte[] prepended = ByteUtil.INSTANCE.concat(new byte[]{(byte) (bytes.length)}, bytes);
|
||||
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "writeToData (raw=%s)", ByteUtil.shortHexString(prepended)));
|
||||
aapsLogger.debug(LTag.PUMPBTCOMM, String.format(Locale.ENGLISH, "writeToData (raw=%s)", ByteUtil.INSTANCE.shortHexString(prepended)));
|
||||
|
||||
BLECommOperationResult writeCheck = rileyLinkBle.writeCharacteristicBlocking(radioServiceUUID, radioDataUUID,
|
||||
prepended);
|
||||
|
|
|
@ -4,8 +4,8 @@ import android.os.SystemClock
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkEncodingType
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations.BLECommOperationResult
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.core.utils.ThreadUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ThreadUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import java.util.UUID
|
||||
|
|
|
@ -28,8 +28,8 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLin
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData
|
||||
import info.nightscout.interfaces.Config
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.core.utils.ThreadUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ThreadUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
|
@ -54,6 +54,7 @@ class RileyLinkBLE @Inject constructor(
|
|||
private val orangeLink: OrangeLinkImpl,
|
||||
private val config: Config
|
||||
) {
|
||||
|
||||
private val gattDebugEnabled = true
|
||||
private var manualDisconnect = false
|
||||
|
||||
|
|
|
@ -10,12 +10,10 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.Radi
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkCommandType;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
public class SendAndListen extends RileyLinkCommand {
|
||||
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
|
||||
private final byte sendChannel;
|
||||
private final byte repeatCount;
|
||||
private final int delayBetweenPackets_ms;
|
||||
|
@ -24,6 +22,7 @@ public class SendAndListen extends RileyLinkCommand {
|
|||
private final byte retryCount;
|
||||
private final Integer preambleExtension_ms;
|
||||
private final RadioPacket packetToSend;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
|
||||
|
||||
public SendAndListen(HasAndroidInjector injector, byte sendChannel, byte repeatCount, byte delayBetweenPackets_ms, byte listenChannel,
|
||||
|
@ -66,7 +65,7 @@ public class SendAndListen extends RileyLinkCommand {
|
|||
boolean isPacketV2 = rileyLinkServiceData.firmwareVersion == null || rileyLinkServiceData.firmwareVersion
|
||||
.isSameVersion(RileyLinkFirmwareVersion.Version2AndHigher);
|
||||
|
||||
ArrayList<Byte> bytes = new ArrayList<Byte>();
|
||||
ArrayList<Byte> bytes = new ArrayList<>();
|
||||
bytes.add(this.getCommandType().code);
|
||||
bytes.add(this.sendChannel);
|
||||
bytes.add(this.repeatCount);
|
||||
|
@ -96,7 +95,7 @@ public class SendAndListen extends RileyLinkCommand {
|
|||
bytes.add(preambleBuf[3]);
|
||||
}
|
||||
|
||||
return ByteUtil.concat(ByteUtil.getByteArrayFromList(bytes), packetToSend.getEncoded());
|
||||
return ByteUtil.INSTANCE.concat(ByteUtil.INSTANCE.getByteArrayFromList(bytes), packetToSend.getEncoded());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import javax.inject.Inject;
|
|||
import dagger.android.HasAndroidInjector;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.CRC;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
/**
|
||||
* Created by geoff on 5/22/16.
|
||||
|
@ -15,9 +15,8 @@ import info.nightscout.pump.core.utils.ByteUtil;
|
|||
|
||||
public class RadioPacket {
|
||||
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
|
||||
private final byte[] pkt;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
|
||||
|
||||
public RadioPacket(HasAndroidInjector injector, byte[] pkt) {
|
||||
|
@ -32,8 +31,7 @@ public class RadioPacket {
|
|||
|
||||
|
||||
private byte[] getWithCRC() {
|
||||
byte[] withCRC = ByteUtil.concat(pkt, CRC.crc8(pkt));
|
||||
return withCRC;
|
||||
return ByteUtil.INSTANCE.concat(pkt, CRC.crc8(pkt));
|
||||
}
|
||||
|
||||
|
||||
|
@ -48,7 +46,7 @@ public class RadioPacket {
|
|||
byte[] withCRC = getWithCRC();
|
||||
|
||||
byte[] encoded = rileyLinkUtil.getEncoding4b6b().encode4b6b(withCRC);
|
||||
return ByteUtil.concat(encoded, (byte) 0);
|
||||
return ByteUtil.INSTANCE.concat(encoded, (byte) 0);
|
||||
}
|
||||
|
||||
case FourByteSixByteRileyLink: {
|
||||
|
|
|
@ -13,7 +13,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.Rile
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData;
|
||||
import info.nightscout.androidaps.plugins.pump.common.utils.CRC;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.rx.logging.AAPSLogger;
|
||||
import info.nightscout.rx.logging.LTag;
|
||||
|
||||
|
@ -23,12 +23,11 @@ import info.nightscout.rx.logging.LTag;
|
|||
public class RadioResponse {
|
||||
|
||||
|
||||
public int rssi;
|
||||
@Inject AAPSLogger aapsLogger;
|
||||
@Inject RileyLinkServiceData rileyLinkServiceData;
|
||||
@Inject RileyLinkUtil rileyLinkUtil;
|
||||
|
||||
private boolean decodedOK = false;
|
||||
public int rssi;
|
||||
private int responseNumber;
|
||||
private byte[] decodedPayload = new byte[0];
|
||||
private byte receivedCRC;
|
||||
|
@ -75,11 +74,11 @@ public class RadioResponse {
|
|||
byte[] encodedPayload;
|
||||
|
||||
if (rileyLinkServiceData.firmwareVersion.isSameVersion(RileyLinkFirmwareVersion.Version2AndHigher)) {
|
||||
encodedPayload = ByteUtil.substring(rxData, 3, rxData.length - 3);
|
||||
encodedPayload = ByteUtil.INSTANCE.substring(rxData, 3, rxData.length - 3);
|
||||
rssi = rxData[1];
|
||||
responseNumber = rxData[2];
|
||||
} else {
|
||||
encodedPayload = ByteUtil.substring(rxData, 2, rxData.length - 2);
|
||||
encodedPayload = ByteUtil.INSTANCE.substring(rxData, 2, rxData.length - 2);
|
||||
rssi = rxData[0];
|
||||
responseNumber = rxData[1];
|
||||
}
|
||||
|
@ -111,7 +110,7 @@ public class RadioResponse {
|
|||
if (decodeThis != null && decodeThis.length > 2) {
|
||||
decodedOK = true;
|
||||
|
||||
decodedPayload = ByteUtil.substring(decodeThis, 0, decodeThis.length - 1);
|
||||
decodedPayload = ByteUtil.INSTANCE.substring(decodeThis, 0, decodeThis.length - 1);
|
||||
receivedCRC = decodeThis[decodeThis.length - 1];
|
||||
byte calculatedCRC = CRC.crc8(decodedPayload);
|
||||
if (receivedCRC != calculatedCRC) {
|
||||
|
@ -130,7 +129,7 @@ public class RadioResponse {
|
|||
}
|
||||
} catch (NumberFormatException e) {
|
||||
decodedOK = false;
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Failed to decode radio data: " + ByteUtil.shortHexString(encodedPayload));
|
||||
aapsLogger.error(LTag.PUMPBTCOMM, "Failed to decode radio data: " + ByteUtil.INSTANCE.shortHexString(encodedPayload));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.encoding;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkCommunicationException;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.rx.logging.AAPSLogger;
|
||||
|
||||
|
||||
|
@ -22,12 +22,20 @@ public abstract class Encoding4b6bAbstract implements Encoding4b6b {
|
|||
|
||||
// 21, 49, 50, 35, 52, 37, 38, 22, 26, 25, 42, 11, 44, 13, 14, 28
|
||||
|
||||
/* O(n) lookup. Run on an O(n) translation of a byte-stream, gives O(n**2) performance. Sigh. */
|
||||
public static int encode4b6bListIndex(byte b) {
|
||||
for (int i = 0; i < encode4b6bList.length; i++) {
|
||||
if (b == encode4b6bList[i]) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override public abstract byte[] encode4b6b(byte[] data);
|
||||
|
||||
|
||||
@Override public abstract byte[] decode4b6b(byte[] data) throws RileyLinkCommunicationException;
|
||||
|
||||
|
||||
protected short convertUnsigned(byte x) {
|
||||
short ss = x;
|
||||
|
||||
|
@ -38,18 +46,6 @@ public abstract class Encoding4b6bAbstract implements Encoding4b6b {
|
|||
return ss;
|
||||
}
|
||||
|
||||
|
||||
/* O(n) lookup. Run on an O(n) translation of a byte-stream, gives O(n**2) performance. Sigh. */
|
||||
public static int encode4b6bListIndex(byte b) {
|
||||
for (int i = 0; i < encode4b6bList.length; i++) {
|
||||
if (b == encode4b6bList[i]) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
public void writeError(AAPSLogger aapsLogger, byte[] raw, String errorData) {
|
||||
|
||||
aapsLogger.error(String.format("\n" +
|
||||
|
@ -58,7 +54,7 @@ public abstract class Encoding4b6bAbstract implements Encoding4b6b {
|
|||
" encodedPayload: %s\n" +
|
||||
" errors: %s\n" +
|
||||
"=============================================================================", //
|
||||
ByteUtil.getHex(raw), errorData));
|
||||
ByteUtil.INSTANCE.getHex(raw), errorData));
|
||||
|
||||
//FabricUtil.createEvent("MedtronicDecode4b6bError", null);
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import java.util.Locale;
|
|||
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLinkCommunicationException;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkBLEError;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
import info.nightscout.rx.logging.AAPSLogger;
|
||||
|
||||
/**
|
||||
|
@ -26,7 +26,7 @@ public class Encoding4b6bGeoff extends Encoding4b6bAbstract {
|
|||
// LOG.error("Warning: data is odd number of bytes");
|
||||
// }
|
||||
// use arraylists because byte[] is annoying.
|
||||
List<Byte> inData = ByteUtil.getListFromByteArray(data);
|
||||
List<Byte> inData = ByteUtil.INSTANCE.getListFromByteArray(data);
|
||||
List<Byte> outData = new ArrayList<>();
|
||||
|
||||
int acc = 0;
|
||||
|
@ -65,7 +65,7 @@ public class Encoding4b6bGeoff extends Encoding4b6bAbstract {
|
|||
}
|
||||
|
||||
// convert back to byte[]
|
||||
byte[] rval = ByteUtil.getByteArrayFromList(outData);
|
||||
byte[] rval = ByteUtil.INSTANCE.getByteArrayFromList(outData);
|
||||
|
||||
return rval;
|
||||
|
||||
|
@ -83,7 +83,7 @@ public class Encoding4b6bGeoff extends Encoding4b6bAbstract {
|
|||
|
||||
StringBuilder errorMessageBuilder = new StringBuilder();
|
||||
|
||||
errorMessageBuilder.append("Input data: " + ByteUtil.shortHexString(raw) + "\n");
|
||||
errorMessageBuilder.append("Input data: " + ByteUtil.INSTANCE.shortHexString(raw) + "\n");
|
||||
|
||||
if ((raw.length % 2) != 0) {
|
||||
errorMessageBuilder.append("Warn: odd number of bytes.\n");
|
||||
|
@ -94,7 +94,7 @@ public class Encoding4b6bGeoff extends Encoding4b6bAbstract {
|
|||
int codingErrors = 0;
|
||||
int x = 0;
|
||||
// Log.w(TAG,"decode4b6b: untested code");
|
||||
// Log.w(TAG,String.format("Decoding %d bytes: %s",raw.length,ByteUtil.shortHexString(raw)));
|
||||
// Log.w(TAG,String.format("Decoding %d bytes: %s",raw.length,ByteUtil.INSTANCE.shortHexString(raw)));
|
||||
for (int i = 0; i < raw.length; i++) {
|
||||
int unsignedValue = raw[i];
|
||||
if (unsignedValue < 0) {
|
||||
|
@ -112,14 +112,14 @@ public class Encoding4b6bGeoff extends Encoding4b6bAbstract {
|
|||
// special case at end of transmission on uneven boundaries:
|
||||
if ((highIndex >= 0) && (lowIndex >= 0)) {
|
||||
byte decoded = (byte) ((highIndex << 4) + lowIndex);
|
||||
rval = ByteUtil.concat(rval, decoded);
|
||||
rval = ByteUtil.INSTANCE.concat(rval, decoded);
|
||||
/*
|
||||
* LOG.debug(String.format(
|
||||
* "i=%d,x=0x%08X,0x%02X->0x%02X, 0x%02X->0x%02X, result: 0x%02X, %d bits remaining, errors %d, bytes remaining: %s"
|
||||
* ,
|
||||
* i,x,highcode,highIndex, lowcode,
|
||||
* lowIndex,decoded,availableBits,codingErrors,ByteUtil.shortHexString
|
||||
* (ByteUtil.substring(raw,i+1,raw.length-i-1))));
|
||||
* lowIndex,decoded,availableBits,codingErrors,ByteUtil.INSTANCE.shortHexString
|
||||
* (ByteUtil.INSTANCE.substring(raw,i+1,raw.length-i-1))));
|
||||
*/
|
||||
} else {
|
||||
// LOG.debug(String.format("i=%d,x=%08X, coding error: highcode=0x%02X, lowcode=0x%02X, %d bits remaining",i,x,highcode,lowcode,availableBits));
|
||||
|
@ -179,7 +179,7 @@ public class Encoding4b6bGeoff extends Encoding4b6bAbstract {
|
|||
// int codingErrors = 0;
|
||||
// int x = 0;
|
||||
// // Log.w(TAG,"decode4b6b: untested code");
|
||||
// // Log.w(TAG,String.format("Decoding %d bytes: %s",raw.length,ByteUtil.shortHexString(raw)));
|
||||
// // Log.w(TAG,String.format("Decoding %d bytes: %s",raw.length,ByteUtil.INSTANCE.shortHexString(raw)));
|
||||
// for (int i = 0; i < raw.length; i++) {
|
||||
// int unsignedValue = raw[i];
|
||||
// if (unsignedValue < 0) {
|
||||
|
@ -197,15 +197,15 @@ public class Encoding4b6bGeoff extends Encoding4b6bAbstract {
|
|||
// // special case at end of transmission on uneven boundaries:
|
||||
// if ((highIndex >= 0) && (lowIndex >= 0)) {
|
||||
// byte decoded = (byte)((highIndex << 4) + lowIndex);
|
||||
// rval = ByteUtil.concat(rval, decoded);
|
||||
// rval = ByteUtil.INSTANCE.concat(rval, decoded);
|
||||
// /*
|
||||
// * LOG.debug(String.format(
|
||||
// *
|
||||
// "i=%d,x=0x%08X,0x%02X->0x%02X, 0x%02X->0x%02X, result: 0x%02X, %d bits remaining, errors %d, bytes remaining: %s"
|
||||
// * ,
|
||||
// * i,x,highcode,highIndex, lowcode,
|
||||
// * lowIndex,decoded,availableBits,codingErrors,ByteUtil.shortHexString
|
||||
// * (ByteUtil.substring(raw,i+1,raw.length-i-1))));
|
||||
// * lowIndex,decoded,availableBits,codingErrors,ByteUtil.INSTANCE.shortHexString
|
||||
// * (ByteUtil.INSTANCE.substring(raw,i+1,raw.length-i-1))));
|
||||
// */
|
||||
// } else {
|
||||
// //
|
||||
|
|
|
@ -14,7 +14,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.RileyLink
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations.BLECommOperationResult
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData
|
||||
import info.nightscout.pump.core.utils.ByteUtil
|
||||
import info.nightscout.pump.common.utils.ByteUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
|
|
|
@ -5,7 +5,7 @@ import org.joda.time.LocalDateTime;
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState;
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice;
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState;
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState;
|
||||
import info.nightscout.shared.interfaces.ResourceHelper;
|
||||
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLin
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData
|
||||
import info.nightscout.interfaces.plugin.ActivePlugin
|
||||
import info.nightscout.pump.core.utils.StringUtil
|
||||
import info.nightscout.pump.common.utils.StringUtil
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.shared.interfaces.ResourceHelper
|
||||
import info.nightscout.shared.sharedPreferences.SP
|
||||
|
|
|
@ -12,7 +12,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.databinding.RileylinkStatusHistoryBinding
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.databinding.RileylinkStatusHistoryItemBinding
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState
|
||||
import info.nightscout.shared.interfaces.ResourceHelper
|
||||
import info.nightscout.shared.utils.DateUtil
|
||||
import javax.inject.Inject
|
||||
|
|
|
@ -15,7 +15,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.Rile
|
|||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState
|
||||
import info.nightscout.interfaces.plugin.ActivePlugin
|
||||
import info.nightscout.pump.core.defs.PumpDeviceState
|
||||
import info.nightscout.pump.common.defs.PumpDeviceState
|
||||
import info.nightscout.rx.bus.RxBus
|
||||
import info.nightscout.rx.logging.AAPSLogger
|
||||
import info.nightscout.rx.logging.LTag
|
||||
|
|
|
@ -10,7 +10,7 @@ import java.util.Arrays;
|
|||
import java.util.Collection;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.encoding.Encoding4b6bGeoff;
|
||||
import info.nightscout.pump.core.utils.ByteUtil;
|
||||
import info.nightscout.pump.common.utils.ByteUtil;
|
||||
|
||||
/**
|
||||
* Created by andy on 11/21/18.
|
||||
|
@ -19,7 +19,11 @@ import info.nightscout.pump.core.utils.ByteUtil;
|
|||
public class RFToolsParametrizedUTest {
|
||||
|
||||
private static final String TAG = "RFToolsUTest";
|
||||
|
||||
@Parameterized.Parameter
|
||||
// first data value (0) is default
|
||||
public/* NOT private */ byte[] decoded;
|
||||
@Parameterized.Parameter(1)
|
||||
public/* NOT private */ byte[] encoded;
|
||||
|
||||
@Parameterized.Parameters
|
||||
public static Collection<Object[]> data() {
|
||||
|
@ -52,14 +56,6 @@ public class RFToolsParametrizedUTest {
|
|||
});
|
||||
}
|
||||
|
||||
@Parameterized.Parameter
|
||||
// first data value (0) is default
|
||||
public/* NOT private */ byte[] decoded;
|
||||
|
||||
@Parameterized.Parameter(1)
|
||||
public/* NOT private */ byte[] encoded;
|
||||
|
||||
|
||||
/**
|
||||
* @noinspection JUnit3StyleTestMethodInJUnit4Class, unused
|
||||
*/ // @Test
|
||||
|
@ -94,8 +90,8 @@ public class RFToolsParametrizedUTest {
|
|||
if (ByteUtil.compare(bs, out) != 0) {
|
||||
Log.e(
|
||||
TAG,
|
||||
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
|
||||
+ ByteUtil.shortHexString(bs));
|
||||
"encode Data failed: expected " + ByteUtil.INSTANCE.shortHexString(out) + " but got "
|
||||
+ ByteUtil.INSTANCE.shortHexString(bs));
|
||||
Assert.fail();
|
||||
}
|
||||
bs = decoder.encode4b6b(new byte[]{(byte) 0xa7, 0x12});
|
||||
|
@ -103,8 +99,8 @@ public class RFToolsParametrizedUTest {
|
|||
if (ByteUtil.compare(bs, out) != 0) {
|
||||
Log.e(
|
||||
TAG,
|
||||
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
|
||||
+ ByteUtil.shortHexString(bs));
|
||||
"encode Data failed: expected " + ByteUtil.INSTANCE.shortHexString(out) + " but got "
|
||||
+ ByteUtil.INSTANCE.shortHexString(bs));
|
||||
Assert.fail();
|
||||
}
|
||||
bs = decoder.encode4b6b(new byte[]{(byte) 0xa7, 0x12, (byte) 0xa7});
|
||||
|
@ -112,8 +108,8 @@ public class RFToolsParametrizedUTest {
|
|||
if (ByteUtil.compare(bs, out) != 0) {
|
||||
Log.e(
|
||||
TAG,
|
||||
"encode Data failed: expected " + ByteUtil.shortHexString(out) + " but got "
|
||||
+ ByteUtil.shortHexString(bs));
|
||||
"encode Data failed: expected " + ByteUtil.INSTANCE.shortHexString(out) + " but got "
|
||||
+ ByteUtil.INSTANCE.shortHexString(bs));
|
||||
Assert.fail();
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue