feat: speed

This commit is contained in:
Piotr Dec 2024-08-03 00:20:16 +02:00
parent c329cffeb7
commit a015ab2c5f
Signed by: stawros
GPG key ID: F89F27AD8F881A91
3 changed files with 38 additions and 7 deletions

View file

@ -5,6 +5,7 @@ import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothSocket
import android.util.Log
import com.mapbox.navigation.core.trip.session.LocationMatcherResult
import com.mapbox.navigation.tripdata.maneuver.model.Maneuver
import com.mapbox.navigation.tripdata.progress.model.TripProgressUpdateValue
import eu.ztsh.garmin.data.Arrows
@ -27,10 +28,10 @@ class Garmin(
private lateinit var connection: ConnectThread
private lateinit var maneuvers: ManeuverProcessingThread
private lateinit var trips: TripProgressProcessingThread
private lateinit var locations: LocationMatcherProcessingThread
private val cache = DataCache()
private val maneuversPool = Executors.newFixedThreadPool(4)
private val tripPool = Executors.newFixedThreadPool(4)
private val processingPool = Executors.newFixedThreadPool(8)
fun start() {
connection = ConnectThread()
@ -41,6 +42,9 @@ class Garmin(
trips = TripProgressProcessingThread()
trips.start()
locations = LocationMatcherProcessingThread()
locations.start()
}
fun close() {
@ -52,16 +56,38 @@ class Garmin(
trips.interrupt()
trips.join(0)
maneuversPool.shutdown()
tripPool.shutdown()
locations.interrupt()
locations.join(0)
processingPool.shutdown()
}
fun process(maneuver: Maneuver) {
maneuversPool.submit{maneuvers.enqueue(maneuver)}
processingPool.submit{maneuvers.enqueue(maneuver)}
}
fun process(tripProgressUpdateValue: TripProgressUpdateValue) {
maneuversPool.submit{trips.enqueue(tripProgressUpdateValue)}
processingPool.submit{trips.enqueue(tripProgressUpdateValue)}
}
fun process(locationMatcherResult: LocationMatcherResult) {
processingPool.submit{locations.enqueue(locationMatcherResult)}
}
private inner class LocationMatcherProcessingThread: ProcessingThread<LocationMatcherResult>() {
override fun mapAndSend(maybeItem: LocationMatcherResult?): LocationMatcherResult? {
if (maybeItem != null && cache.hasChanged(maybeItem)) {
send(GarminMapper.map(MapboxMapper.asSpeed(maybeItem)))
return maybeItem
}
return null
}
override fun updateCache(item: LocationMatcherResult) {
cache.update(item)
}
}
private inner class TripProgressProcessingThread : ProcessingThread<TripProgressUpdateValue>() {

View file

@ -42,7 +42,9 @@ class DataCache {
// location
fun hasChanged(locationMatcherResult: LocationMatcherResult): Boolean {
return locationCache == null || locationCache!! != locationMatcherResult
return locationCache.let { it == null
|| it.enhancedLocation.speed != locationMatcherResult.enhancedLocation.speed
|| it.speedLimitInfo.speed != locationMatcherResult.speedLimitInfo.speed }
}
fun update(locationMatcherResult: LocationMatcherResult) {

View file

@ -4,6 +4,7 @@ import com.mapbox.common.location.Location
import com.mapbox.navigation.core.trip.session.LocationMatcherResult
import com.mapbox.navigation.core.trip.session.LocationObserver
import com.mapbox.navigation.ui.maps.camera.transition.NavigationCameraTransitionOptions
import eu.ztsh.garmin.Garmin
class LocationObserver(private val mapControl: MapControl) : LocationObserver {
@ -31,6 +32,8 @@ class LocationObserver(private val mapControl: MapControl) : LocationObserver {
mapControl.viewportDataSource.onLocationChanged(enhancedLocation)
mapControl.viewportDataSource.evaluate()
Garmin.instance.process(locationMatcherResult)
// if this is the first location update the activity has received,
// it's best to immediately move the camera to the current user location
if (!firstLocationUpdateReceived) {