From a2b2c215da2bc411af3dedf1e909008a30fb17f3 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 21 Oct 2022 07:38:43 -0700 Subject: [PATCH] Handle GPS rollover (fix #414) --- app/src/main/java/org/traccar/client/Position.kt | 9 ++++++++- .../java/org/traccar/client/ProtocolFormatterTest.kt | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/traccar/client/Position.kt b/app/src/main/java/org/traccar/client/Position.kt index 94e2974..b158d39 100644 --- a/app/src/main/java/org/traccar/client/Position.kt +++ b/app/src/main/java/org/traccar/client/Position.kt @@ -37,7 +37,7 @@ data class Position( constructor(deviceId: String, location: Location, battery: BatteryStatus) : this( deviceId = deviceId, - time = Date(location.time), + time = Date(location.time.correctRollover()), latitude = location.latitude, longitude = location.longitude, altitude = location.altitude, @@ -60,3 +60,10 @@ data class Position( }, ) } + +private const val rolloverDate = 1554508800000L // April 6, 2019 +private const val rolloverOffset = 619315200000L // 1024 weeks + +private fun Long.correctRollover(): Long { + return if (this < rolloverDate) this + rolloverOffset else this +} diff --git a/app/src/test/java/org/traccar/client/ProtocolFormatterTest.kt b/app/src/test/java/org/traccar/client/ProtocolFormatterTest.kt index 5cb0344..cfc6458 100644 --- a/app/src/test/java/org/traccar/client/ProtocolFormatterTest.kt +++ b/app/src/test/java/org/traccar/client/ProtocolFormatterTest.kt @@ -17,21 +17,21 @@ class ProtocolFormatterTest { fun testFormatRequest() { val position = Position("123456789012345", Location("gps"), BatteryStatus()) val url = formatRequest("http://localhost:5055", position) - Assert.assertEquals("http://localhost:5055?id=123456789012345×tamp=0&lat=0.0&lon=0.0&speed=0.0&bearing=0.0&altitude=0.0&accuracy=0.0&batt=0.0", url) + Assert.assertEquals("http://localhost:5055?id=123456789012345×tamp=619315200&lat=0.0&lon=0.0&speed=0.0&bearing=0.0&altitude=0.0&accuracy=0.0&batt=0.0", url) } @Test fun testFormatPathPortRequest() { val position = Position("123456789012345", Location("gps"), BatteryStatus()) val url = formatRequest("http://localhost:8888/path", position) - Assert.assertEquals("http://localhost:8888/path?id=123456789012345×tamp=0&lat=0.0&lon=0.0&speed=0.0&bearing=0.0&altitude=0.0&accuracy=0.0&batt=0.0", url) + Assert.assertEquals("http://localhost:8888/path?id=123456789012345×tamp=619315200&lat=0.0&lon=0.0&speed=0.0&bearing=0.0&altitude=0.0&accuracy=0.0&batt=0.0", url) } @Test fun testFormatAlarmRequest() { val position = Position("123456789012345", Location("gps"), BatteryStatus()) val url = formatRequest("http://localhost:5055/path", position, "alert message") - Assert.assertEquals("http://localhost:5055/path?id=123456789012345×tamp=0&lat=0.0&lon=0.0&speed=0.0&bearing=0.0&altitude=0.0&accuracy=0.0&batt=0.0&alarm=alert%20message", url) + Assert.assertEquals("http://localhost:5055/path?id=123456789012345×tamp=619315200&lat=0.0&lon=0.0&speed=0.0&bearing=0.0&altitude=0.0&accuracy=0.0&batt=0.0&alarm=alert%20message", url) } }