From c329cffeb71e7a9fb49d88b5ab87cff4c2ce42cf Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Fri, 2 Aug 2024 23:28:56 +0200 Subject: [PATCH] feat: ETA --- app/src/main/java/eu/ztsh/garmin/Garmin.kt | 35 +++++++++++++++++++ .../java/eu/ztsh/garmin/data/DataCache.kt | 10 ++++++ .../java/eu/ztsh/garmin/data/MapboxMapper.kt | 8 +++++ .../main/java/eu/ztsh/garmin/data/Model.kt | 19 +++++++++- .../eu/ztsh/garmin/mapbox/RouteControl.kt | 11 +++--- 5 files changed, 77 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/eu/ztsh/garmin/Garmin.kt b/app/src/main/java/eu/ztsh/garmin/Garmin.kt index 1eedfb5..dc70096 100644 --- a/app/src/main/java/eu/ztsh/garmin/Garmin.kt +++ b/app/src/main/java/eu/ztsh/garmin/Garmin.kt @@ -6,6 +6,7 @@ import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothSocket import android.util.Log import com.mapbox.navigation.tripdata.maneuver.model.Maneuver +import com.mapbox.navigation.tripdata.progress.model.TripProgressUpdateValue import eu.ztsh.garmin.data.Arrows import eu.ztsh.garmin.data.DataCache import eu.ztsh.garmin.data.GarminMapper @@ -25,9 +26,11 @@ class Garmin( private lateinit var connection: ConnectThread private lateinit var maneuvers: ManeuverProcessingThread + private lateinit var trips: TripProgressProcessingThread private val cache = DataCache() private val maneuversPool = Executors.newFixedThreadPool(4) + private val tripPool = Executors.newFixedThreadPool(4) fun start() { connection = ConnectThread() @@ -35,6 +38,9 @@ class Garmin( maneuvers = ManeuverProcessingThread() maneuvers.start() + + trips = TripProgressProcessingThread() + trips.start() } fun close() { @@ -43,13 +49,42 @@ class Garmin( maneuvers.interrupt() maneuvers.join(0) + trips.interrupt() + trips.join(0) + maneuversPool.shutdown() + tripPool.shutdown() } fun process(maneuver: Maneuver) { maneuversPool.submit{maneuvers.enqueue(maneuver)} } + fun process(tripProgressUpdateValue: TripProgressUpdateValue) { + maneuversPool.submit{trips.enqueue(tripProgressUpdateValue)} + } + + private inner class TripProgressProcessingThread : ProcessingThread() { + + override fun mapAndSend(maybeItem: TripProgressUpdateValue?): TripProgressUpdateValue? { + if (maybeItem != null) { + // it is much simplier to parse and compare model object + val value = MapboxMapper.asEta(maybeItem) + if (cache.hasChanged(value)) { + // TODO: traffic + send(GarminMapper.setTime(value.hours, value.minutes)) + cache.update(value) + } + } + return null + } + + override fun updateCache(item: TripProgressUpdateValue) { + // won't be used + } + + } + private inner class ManeuverProcessingThread : ProcessingThread() { override fun mapAndSend(maybeItem: Maneuver?): Maneuver? { diff --git a/app/src/main/java/eu/ztsh/garmin/data/DataCache.kt b/app/src/main/java/eu/ztsh/garmin/data/DataCache.kt index 5235100..61bedfb 100644 --- a/app/src/main/java/eu/ztsh/garmin/data/DataCache.kt +++ b/app/src/main/java/eu/ztsh/garmin/data/DataCache.kt @@ -12,6 +12,7 @@ class DataCache { private var maneuverCache: Maneuver? = null private var locationCache: LocationMatcherResult? = null private var session: NavigationSessionState? = null + private var eta: Arrival? = null // maneuver fun hasChanged(guidance: Lane?): Boolean { @@ -30,6 +31,15 @@ class DataCache { maneuverCache = maneuver } + // eta + fun hasChanged(eta: Arrival): Boolean { + return this.eta.let { it == null || it != eta } + } + + fun update(eta: Arrival) { + this.eta = eta + } + // location fun hasChanged(locationMatcherResult: LocationMatcherResult): Boolean { return locationCache == null || locationCache!! != locationMatcherResult diff --git a/app/src/main/java/eu/ztsh/garmin/data/MapboxMapper.kt b/app/src/main/java/eu/ztsh/garmin/data/MapboxMapper.kt index 5658fc8..445cb40 100644 --- a/app/src/main/java/eu/ztsh/garmin/data/MapboxMapper.kt +++ b/app/src/main/java/eu/ztsh/garmin/data/MapboxMapper.kt @@ -2,6 +2,7 @@ package eu.ztsh.garmin.data import com.mapbox.navigation.tripdata.maneuver.model.Maneuver import com.mapbox.navigation.core.trip.session.LocationMatcherResult +import com.mapbox.navigation.tripdata.progress.model.TripProgressUpdateValue class MapboxMapper { @@ -111,6 +112,13 @@ class MapboxMapper { } + fun asEta(trip: TripProgressUpdateValue): Arrival { + val eta = trip.formatter + .getEstimatedTimeToArrival(trip.estimatedTimeToArrival) + .toString().split(":") + return Arrival(eta[0].toInt(), eta[1].toInt()) + } + } } diff --git a/app/src/main/java/eu/ztsh/garmin/data/Model.kt b/app/src/main/java/eu/ztsh/garmin/data/Model.kt index 0bea440..5b76a83 100644 --- a/app/src/main/java/eu/ztsh/garmin/data/Model.kt +++ b/app/src/main/java/eu/ztsh/garmin/data/Model.kt @@ -101,7 +101,24 @@ class Distance(val distance: Double, val unit: Unit) { class Speed(val speed: Int, val limit: Int) -class Arrival(val hours: Int, val minutes: Int) +class Arrival(val hours: Int, val minutes: Int) { + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Arrival + + if (hours != other.hours) return false + if (minutes != other.minutes) return false + + return true + } + + override fun hashCode(): Int { + return 61 * hours + minutes + } +} class Direction( var angle: OutAngle = OutAngle.AsDirection, diff --git a/app/src/main/java/eu/ztsh/garmin/mapbox/RouteControl.kt b/app/src/main/java/eu/ztsh/garmin/mapbox/RouteControl.kt index 37bd0d6..419fdfb 100644 --- a/app/src/main/java/eu/ztsh/garmin/mapbox/RouteControl.kt +++ b/app/src/main/java/eu/ztsh/garmin/mapbox/RouteControl.kt @@ -91,7 +91,7 @@ class RouteControl(private val mapControl: MapControl, ui: UI, private val conte PercentDistanceTraveledFormatter() ) .estimatedTimeToArrivalFormatter( - EstimatedTimeToArrivalFormatter(context, TimeFormat.NONE_SPECIFIED) + EstimatedTimeToArrivalFormatter(context, TimeFormat.TWENTY_FOUR_HOURS) ) .build() ) @@ -172,10 +172,11 @@ class RouteControl(private val mapControl: MapControl, ui: UI, private val conte } ) - // update bottom trip progress summary - mapControl.ui.tripProgressView.render( - tripProgressApi.getTripProgress(routeProgress) - ) + // update bottom trip progress summary and send to HUD + tripProgressApi.getTripProgress(routeProgress).let { + mapControl.ui.tripProgressView.render(it) + Garmin.instance.process(it) + } } /**