diff --git a/app/src/main/java/eu/ztsh/garmin/Garmin.kt b/app/src/main/java/eu/ztsh/garmin/Garmin.kt index 587e68f..2974097 100644 --- a/app/src/main/java/eu/ztsh/garmin/Garmin.kt +++ b/app/src/main/java/eu/ztsh/garmin/Garmin.kt @@ -6,8 +6,10 @@ import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothSocket import android.util.Log import com.mapbox.navigation.tripdata.maneuver.model.Maneuver +import eu.ztsh.garmin.data.Arrows import eu.ztsh.garmin.data.DataCache import eu.ztsh.garmin.data.GarminMapper +import eu.ztsh.garmin.data.Lanes import eu.ztsh.garmin.data.MapboxMapper import java.io.IOException import java.util.* @@ -54,6 +56,14 @@ class Garmin( if (maybeItem != null) { Log.d(TAG, "mapAndSend (${currentThread().name}): got new") var changed = false + if (cache.hasChanged(maybeItem.primary)) { + changed = true + Log.d(TAG, "mapAndSend: primary") + send(GarminMapper.map(MapboxMapper.asDirection(maybeItem))) + if (maybeItem.laneGuidance == null) { + send(GarminMapper.map(Lanes(Arrows(setOf()), Arrows(setOf())))) + } + } if (cache.hasChanged(maybeItem.laneGuidance)) { changed = true Log.d(TAG, "mapAndSend: lanes") @@ -64,11 +74,6 @@ class Garmin( Log.d(TAG, "mapAndSend: stepDistance") send(GarminMapper.map(MapboxMapper.asDistance(maybeItem))) } - if (cache.hasChanged(maybeItem.primary)) { - changed = true - Log.d(TAG, "mapAndSend: primary") - send(GarminMapper.map(MapboxMapper.asDirection(maybeItem))) - } if (changed) { return maybeItem } 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 d9161c5..777b5a2 100644 --- a/app/src/main/java/eu/ztsh/garmin/data/MapboxMapper.kt +++ b/app/src/main/java/eu/ztsh/garmin/data/MapboxMapper.kt @@ -71,13 +71,25 @@ class MapboxMapper { } fun asLanes(maneuver: Maneuver): Lanes { - // TODO: implement + val laneIterator = Lane.iterator() + val outlines = mutableSetOf() + val lanes = mutableSetOf() maneuver.laneGuidance?.apply { - this.allLanes.apply { - println() + this.allLanes.reversed().let { + it.forEach{ indicator -> + val lane = if (laneIterator.hasNext()) laneIterator.next() else Lane.DotsLeft + if (lane == Lane.DotsLeft) { + outlines.add(Lane.DotsLeft) + } else { + outlines.add(lane) + if (indicator.isActive) { + lanes.add(lane) + } + } + } } } - return Lanes(Arrows(listOf()), Arrows(listOf())) + return Lanes(Arrows(lanes), Arrows(outlines)) } fun map(locationMatcherResult: LocationMatcherResult): GarminLocation { 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 ad6b205..9bfdbe7 100644 --- a/app/src/main/java/eu/ztsh/garmin/data/Model.kt +++ b/app/src/main/java/eu/ztsh/garmin/data/Model.kt @@ -47,11 +47,15 @@ enum class Lane(val value: Int) { InnerLeft(0x10), MiddleLeft(0x20), OuterLeft(0x40), - DotsLeft(0x80) + DotsLeft(0x80); + + companion object { + val iterator = {sortedSetOf(OuterRight, MiddleRight, InnerRight, InnerLeft, MiddleLeft, OuterLeft).iterator()} + } } -class Arrows(val lanes: List) { +class Arrows(val lanes: Set) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -151,7 +155,7 @@ class GarminManeuver : GarminModelItem { val empty: () -> GarminManeuver = { val manouver = GarminManeuver() - manouver.lanes = Lanes(Arrows(listOf()), Arrows(listOf())) + manouver.lanes = Lanes(Arrows(setOf()), Arrows(setOf())) manouver.direction = Direction(out = OutType.Off) manouver.distance = Distance(0.0, Unit.Any) manouver