ENF: Handle issue with negative or 0 durations due to system time changes

With time synchronisation and can happen that timestamps in database are newer
than reported system time, which then can lead to reported exposure with
multiple measurements but negative or zero reported duration, resulting in
divide-by-zero and other issues in average RSSI calculation. This fixes the
issue, by ignoring new measurements of the same RPI when they are seemingly
older than a previous measurement.
This commit is contained in:
Marvin W 2022-01-14 10:46:59 +01:00
parent d16d438350
commit 110157dab8
No known key found for this signature in database
GPG Key ID: 072E9235DB996F2A
1 changed files with 1 additions and 1 deletions

View File

@ -184,7 +184,7 @@ class ExposureDatabase private constructor(private val context: Context) : SQLit
}
fun noteAdvertisement(rpi: ByteArray, aem: ByteArray, rssi: Int, timestamp: Long = Date().time) = writableDatabase.run {
val update = compileStatement("UPDATE $TABLE_ADVERTISEMENTS SET rssi = ((rssi * duration) + (? * (? - timestamp - duration))) / (? - timestamp), duration = (? - timestamp) WHERE rpi = ? AND timestamp > ? AND timestamp < ?").run {
val update = compileStatement("UPDATE $TABLE_ADVERTISEMENTS SET rssi = IFNULL(((rssi * duration) + (? * MIN(0, ? - timestamp - duration))) / MAX(duration, ? - timestamp), -100), duration = MAX(duration, ? - timestamp) WHERE rpi = ? AND timestamp > ? AND timestamp < ?").run {
bindLong(1, rssi.toLong())
bindLong(2, timestamp)
bindLong(3, timestamp)