2019-12-24 16:07:17 +01:00
|
|
|
package info.nightscout.androidaps.receivers
|
|
|
|
|
|
|
|
import android.app.AlarmManager
|
|
|
|
import android.app.PendingIntent
|
|
|
|
import android.app.PendingIntent.CanceledException
|
|
|
|
import android.content.Context
|
|
|
|
import android.content.Intent
|
|
|
|
import android.os.PowerManager
|
|
|
|
import android.os.SystemClock
|
2019-12-30 00:53:44 +01:00
|
|
|
import dagger.android.DaggerBroadcastReceiver
|
2020-01-03 21:02:36 +01:00
|
|
|
import info.nightscout.androidaps.Config
|
|
|
|
import info.nightscout.androidaps.db.DatabaseHelper
|
2019-12-24 16:07:17 +01:00
|
|
|
import info.nightscout.androidaps.events.EventProfileNeedsUpdate
|
2019-12-30 00:53:44 +01:00
|
|
|
import info.nightscout.androidaps.logging.AAPSLogger
|
2020-01-06 15:22:28 +01:00
|
|
|
import info.nightscout.androidaps.logging.LTag
|
2020-01-03 01:45:26 +01:00
|
|
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
2019-12-30 00:53:44 +01:00
|
|
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
2019-12-24 16:07:17 +01:00
|
|
|
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
|
2019-12-30 00:53:44 +01:00
|
|
|
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction
|
2019-12-24 16:07:17 +01:00
|
|
|
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
|
|
|
import info.nightscout.androidaps.queue.commands.Command
|
|
|
|
import info.nightscout.androidaps.utils.DateUtil
|
|
|
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
|
|
|
import info.nightscout.androidaps.utils.LocalAlertUtils
|
|
|
|
import info.nightscout.androidaps.utils.T
|
2019-12-30 00:53:44 +01:00
|
|
|
import javax.inject.Inject
|
2019-12-24 16:07:17 +01:00
|
|
|
import kotlin.math.abs
|
|
|
|
|
2019-12-30 00:53:44 +01:00
|
|
|
class KeepAliveReceiver : DaggerBroadcastReceiver() {
|
|
|
|
@Inject lateinit var aapsLogger: AAPSLogger
|
|
|
|
@Inject lateinit var rxBus: RxBusWrapper
|
|
|
|
@Inject lateinit var configBuilderPlugin: ConfigBuilderPlugin
|
|
|
|
@Inject lateinit var profileFunction: ProfileFunction
|
2020-01-03 01:45:26 +01:00
|
|
|
@Inject lateinit var loopPlugin: LoopPlugin
|
2019-12-30 00:53:44 +01:00
|
|
|
|
2019-12-24 16:07:17 +01:00
|
|
|
private var lastReadStatus: Long = 0
|
|
|
|
private var lastRun: Long = 0
|
|
|
|
private var lastIobUpload: Long = 0
|
|
|
|
|
2019-12-30 00:53:44 +01:00
|
|
|
override fun onReceive(context: Context, intent: Intent) {
|
|
|
|
super.onReceive(context, intent)
|
2020-01-06 15:22:28 +01:00
|
|
|
aapsLogger.debug(LTag.CORE, "KeepAlive received");
|
2019-12-24 16:07:17 +01:00
|
|
|
val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
|
|
|
|
val wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AndroidAPS:KeepAliveReceiver")
|
|
|
|
wl.acquire(T.mins(2).msecs())
|
|
|
|
LocalAlertUtils.shortenSnoozeInterval()
|
|
|
|
LocalAlertUtils.checkStaleBGAlert()
|
|
|
|
checkPump()
|
|
|
|
checkAPS()
|
|
|
|
wl.release()
|
|
|
|
}
|
|
|
|
|
2020-01-06 15:22:28 +01:00
|
|
|
class KeepAliveManager @Inject constructor(val aapsLogger: AAPSLogger) {
|
2019-12-24 16:07:17 +01:00
|
|
|
//called by MainApp at first app start
|
|
|
|
fun setAlarm(context: Context) {
|
2020-01-06 15:22:28 +01:00
|
|
|
aapsLogger.debug(LTag.CORE, "KeepAlive scheduled")
|
2019-12-24 16:07:17 +01:00
|
|
|
SystemClock.sleep(5000) // wait for app initialization
|
|
|
|
LocalAlertUtils.shortenSnoozeInterval()
|
|
|
|
LocalAlertUtils.presnoozeAlarms()
|
|
|
|
val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
|
|
|
val i = Intent(context, KeepAliveReceiver::class.java)
|
|
|
|
val pi = PendingIntent.getBroadcast(context, 0, i, 0)
|
|
|
|
try {
|
|
|
|
pi.send()
|
|
|
|
} catch (e: CanceledException) {
|
|
|
|
}
|
|
|
|
am.cancel(pi)
|
|
|
|
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), KEEP_ALIVE_MILLISECONDS, pi)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun cancelAlarm(context: Context) {
|
2020-01-06 15:22:28 +01:00
|
|
|
aapsLogger.debug(LTag.CORE, "KeepAlive canceled")
|
2019-12-24 16:07:17 +01:00
|
|
|
val intent = Intent(context, KeepAliveReceiver::class.java)
|
|
|
|
val sender = PendingIntent.getBroadcast(context, 0, intent, 0)
|
|
|
|
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
|
|
|
alarmManager.cancel(sender)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-06 15:22:28 +01:00
|
|
|
companion object {
|
|
|
|
private val KEEP_ALIVE_MILLISECONDS = T.mins(5).msecs()
|
|
|
|
private val STATUS_UPDATE_FREQUENCY = T.mins(15).msecs()
|
|
|
|
private val IOB_UPDATE_FREQUENCY = T.mins(5).msecs()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-01-03 21:02:36 +01:00
|
|
|
// Usually devicestatus is uploaded through LoopPlugin after every loop cycle.
|
|
|
|
// if there is no BG available, we have to upload anyway to have correct
|
|
|
|
// IOB displayed in NS
|
2019-12-24 16:07:17 +01:00
|
|
|
private fun checkAPS() {
|
2019-12-30 00:53:44 +01:00
|
|
|
val usedAPS = configBuilderPlugin.activeAPS
|
2019-12-24 16:07:17 +01:00
|
|
|
var shouldUploadStatus = false
|
2020-01-03 21:02:36 +01:00
|
|
|
if (Config.NSCLIENT) return
|
|
|
|
if (Config.PUMPCONTROL) shouldUploadStatus = true
|
|
|
|
if (usedAPS == null || !loopPlugin.isEnabled() || DatabaseHelper.actualBg() == null)
|
|
|
|
shouldUploadStatus = true
|
2019-12-24 16:07:17 +01:00
|
|
|
else if (DateUtil.isOlderThan(usedAPS.lastAPSRun, 5)) shouldUploadStatus = true
|
|
|
|
if (DateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY) && shouldUploadStatus) {
|
|
|
|
lastIobUpload = DateUtil.now()
|
2020-01-03 21:02:36 +01:00
|
|
|
NSUpload.uploadDeviceStatus(loopPlugin)
|
2019-12-24 16:07:17 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun checkPump() {
|
2019-12-30 00:53:44 +01:00
|
|
|
val pump = configBuilderPlugin.activePump ?: return
|
|
|
|
val profile = profileFunction.getProfile() ?: return
|
|
|
|
val lastConnection = pump.lastDataTime()
|
|
|
|
val isStatusOutdated = lastConnection + STATUS_UPDATE_FREQUENCY < System.currentTimeMillis()
|
|
|
|
val isBasalOutdated = abs(profile.basal - pump.baseBasalRate) > pump.pumpDescription.basalStep
|
2020-01-06 15:22:28 +01:00
|
|
|
aapsLogger.debug(LTag.CORE, "Last connection: " + DateUtil.dateAndTimeString(lastConnection))
|
2019-12-30 00:53:44 +01:00
|
|
|
// sometimes keep alive broadcast stops
|
|
|
|
// as as workaround test if readStatus was requested before an alarm is generated
|
|
|
|
if (lastReadStatus != 0L && lastReadStatus > System.currentTimeMillis() - T.mins(5).msecs()) {
|
2020-01-03 01:45:26 +01:00
|
|
|
LocalAlertUtils.checkPumpUnreachableAlarm(lastConnection, isStatusOutdated, loopPlugin.isDisconnected)
|
2019-12-30 00:53:44 +01:00
|
|
|
}
|
|
|
|
if (!pump.isThisProfileSet(profile) && !configBuilderPlugin.commandQueue.isRunning(Command.CommandType.BASALPROFILE)) {
|
|
|
|
rxBus.send(EventProfileNeedsUpdate())
|
|
|
|
} else if (isStatusOutdated && !pump.isBusy) {
|
|
|
|
lastReadStatus = System.currentTimeMillis()
|
|
|
|
configBuilderPlugin.commandQueue.readStatus("KeepAlive. Status outdated.", null)
|
|
|
|
} else if (isBasalOutdated && !pump.isBusy) {
|
|
|
|
lastReadStatus = System.currentTimeMillis()
|
|
|
|
configBuilderPlugin.commandQueue.readStatus("KeepAlive. Basal outdated.", null)
|
2019-12-24 16:07:17 +01:00
|
|
|
}
|
|
|
|
if (lastRun != 0L && System.currentTimeMillis() - lastRun > T.mins(10).msecs()) {
|
2020-01-06 15:22:28 +01:00
|
|
|
aapsLogger.error(LTag.CORE, "KeepAlive fail")
|
2019-12-24 16:07:17 +01:00
|
|
|
FabricPrivacy.getInstance().logCustom("KeepAliveFail")
|
|
|
|
}
|
|
|
|
lastRun = System.currentTimeMillis()
|
|
|
|
}
|
|
|
|
}
|