Skip to content

Commit

Permalink
ENF: Handle issue with negative or 0 durations due to system time cha…
Browse files Browse the repository at this point in the history
…nges

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.
  • Loading branch information
mar-v-in committed Jan 14, 2022
1 parent d16d438 commit 110157d
Showing 1 changed file with 1 addition and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 110157d

Please sign in to comment.