kopia lustrzana https://github.com/meshtastic/Meshtastic-Android
we now show real distances in the GUI
rodzic
3b89abe1ef
commit
6f39ba1331
|
@ -2,6 +2,8 @@ package com.geeksville.mesh
|
|||
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
import com.geeksville.mesh.ui.bearing
|
||||
import com.geeksville.mesh.ui.latLongToMeter
|
||||
|
||||
|
||||
// model objects that directly map to the corresponding protobufs
|
||||
|
@ -44,6 +46,12 @@ data class Position(val latitude: Double, val longitude: Double, val altitude: I
|
|||
) {
|
||||
}
|
||||
|
||||
/// @return distance in meters to some other node (or null if unknown)
|
||||
fun distance(o: Position) = latLongToMeter(latitude, longitude, o.latitude, o.longitude)
|
||||
|
||||
/// @return bearing to the other position in degrees
|
||||
fun bearing(o: Position) = bearing(latitude, longitude, o.latitude, o.longitude)
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.writeDouble(latitude)
|
||||
parcel.writeDouble(longitude)
|
||||
|
@ -80,6 +88,24 @@ data class NodeInfo(
|
|||
) {
|
||||
}
|
||||
|
||||
/// @return distance in meters to some other node (or null if unknown)
|
||||
fun distance(o: NodeInfo?): Double? {
|
||||
val p = position
|
||||
val op = o?.position
|
||||
return if (p != null && op != null)
|
||||
p.distance(op)
|
||||
else
|
||||
null
|
||||
}
|
||||
|
||||
/// @return a nice human readable string for the distance, or null for unknown
|
||||
fun distanceStr(o: NodeInfo?) = distance(o)?.let { dist ->
|
||||
if (dist < 1000)
|
||||
"%.0f m".format(dist)
|
||||
else
|
||||
"%.1f km".format(dist / 1000)
|
||||
}
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.writeInt(num)
|
||||
parcel.writeParcelable(user, flags)
|
||||
|
|
|
@ -96,7 +96,10 @@ fun addDistance(
|
|||
return doubleArrayOf(lat + dLat, longitude + dLong)
|
||||
}
|
||||
|
||||
fun LatLongToMeter(
|
||||
/**
|
||||
* @return distance in meters along the surface of the earth (ish)
|
||||
*/
|
||||
fun latLongToMeter(
|
||||
lat_a: Double,
|
||||
lng_a: Double,
|
||||
lat_b: Double,
|
||||
|
|
|
@ -36,7 +36,7 @@ val TimestampEmphasis = object : Emphasis {
|
|||
@Composable
|
||||
fun MessageCard(msg: TextMessage, modifier: Modifier = Modifier.None) {
|
||||
Row(modifier = modifier) {
|
||||
UserIcon(null)
|
||||
UserIcon(NodeDB.nodes.value[msg.from])
|
||||
|
||||
Column(modifier = LayoutPadding(left = 12.dp)) {
|
||||
Row {
|
||||
|
|
|
@ -9,6 +9,7 @@ import androidx.ui.material.MaterialTheme
|
|||
import androidx.ui.tooling.preview.Preview
|
||||
import com.geeksville.mesh.NodeInfo
|
||||
import com.geeksville.mesh.R
|
||||
import com.geeksville.mesh.model.NodeDB
|
||||
|
||||
/**
|
||||
* Show the user icon for a particular user with distance from the operator and a small pointer
|
||||
|
@ -22,7 +23,10 @@ fun UserIcon(user: NodeInfo? = null, modifier: Modifier = Modifier.None) {
|
|||
tint = palette.onSecondary,
|
||||
modifier = LayoutGravity.Center
|
||||
)
|
||||
Text("1.2 km", modifier = LayoutGravity.Center)
|
||||
val ourNodeInfo = NodeDB.ourNodeInfo
|
||||
val distance = ourNodeInfo.distanceStr(user)
|
||||
if (distance != null)
|
||||
Text(distance, modifier = LayoutGravity.Center)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,6 +35,6 @@ fun UserIcon(user: NodeInfo? = null, modifier: Modifier = Modifier.None) {
|
|||
fun previewUserIcon() {
|
||||
// another bug? It seems modaldrawerlayout not yet supported in preview
|
||||
MaterialTheme(colors = palette) {
|
||||
UserIcon()
|
||||
UserIcon(NodeDB.testNodes[1])
|
||||
}
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue