From 0c783dfbff346f557ff5f7025329aff81631a0c8 Mon Sep 17 00:00:00 2001 From: Andre K Date: Tue, 15 Nov 2022 22:00:29 -0300 Subject: [PATCH] add fields for position fixed (#524) --- .../com/geeksville/mesh/IMeshService.aidl | 2 +- .../java/com/geeksville/mesh/model/UIState.kt | 4 +- .../geeksville/mesh/service/MeshService.kt | 14 +++---- .../geeksville/mesh/ui/PreferenceItemList.kt | 41 ++++++++++++++++++- .../com/geeksville/mesh/ui/UsersFragment.kt | 2 +- .../mesh/ui/components/RegularPreference.kt | 4 +- 6 files changed, 53 insertions(+), 14 deletions(-) diff --git a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl index 82177476d..532a1510d 100644 --- a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl +++ b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl @@ -80,7 +80,7 @@ interface IMeshService { void setChannel(in byte []payload); /// Send position packet with wantResponse to nodeNum - void requestPosition(in int idNum); + void requestPosition(in int idNum, in double lat, in double lon, in int alt); /// Send Shutdown admin packet to nodeNum void requestShutdown(in int idNum); diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 90d62275f..fdb44a647 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -157,9 +157,9 @@ class UIViewModel @Inject constructor( } } - fun requestPosition(destNum: Int) { + fun requestPosition(destNum: Int, lat: Double = 0.0, lon: Double = 0.0, alt: Int = 0) { try { - meshService?.requestPosition(destNum) + meshService?.requestPosition(destNum, lat, lon, alt) } catch (ex: RemoteException) { errormsg("Request position error: ${ex.message}") } diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt index 2ce3e3762..6cdf9b6ad 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -1353,10 +1353,6 @@ class MeshService : Service(), Logging { }) } - private fun requestPosition(idNum: Int) { - sendPosition(time = 0, destNum = idNum, wantResponse = true) - } - private fun requestShutdown(idNum: Int) { sendToRadio(newMeshPacketTo(idNum).buildAdminPacket { shutdownSeconds = 5 @@ -1697,9 +1693,13 @@ class MeshService : Service(), Logging { stopLocationRequests() } - override fun requestPosition(idNum: Int) = toRemoteExceptions { - this@MeshService.requestPosition(idNum) - } + override fun requestPosition(idNum: Int, lat: Double, lon: Double, alt: Int) = + toRemoteExceptions { + // request position + if (idNum != 0) sendPosition(time = 0, destNum = idNum, wantResponse = true) + // set local node's fixed position + else sendPosition(time = 0, destNum = null, lat = lat, lon = lon, alt = alt) + } override fun requestShutdown(idNum: Int) = toRemoteExceptions { this@MeshService.requestShutdown(idNum) diff --git a/app/src/main/java/com/geeksville/mesh/ui/PreferenceItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/PreferenceItemList.kt index 3f75d2cc7..e70f642e2 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/PreferenceItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/PreferenceItemList.kt @@ -42,6 +42,7 @@ fun PreferenceItemList(viewModel: UIViewModel) { val localConfig by viewModel.localConfig.collectAsState() val ourNodeInfo by viewModel.nodeDB.ourNodeInfo.observeAsState() var userInput by remember(ourNodeInfo?.user) { mutableStateOf(ourNodeInfo?.user) } + var positionInfo by remember(ourNodeInfo?.position) { mutableStateOf(ourNodeInfo?.position) } // Temporary [ConfigProtos.Config] state holders var deviceInput by remember(localConfig.device) { mutableStateOf(localConfig.device) } @@ -197,6 +198,38 @@ fun PreferenceItemList(viewModel: UIViewModel) { } item { Divider() } + if (positionInput.fixedPosition) { + item { + EditTextPreference(title = "Latitude", + value = positionInfo?.latitude ?: 0.0, + enabled = connected, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { value -> + if (value >= -180 && value <= 180.0) + positionInfo?.let { positionInfo = it.copy(latitude = value) } + }) + } + item { + EditTextPreference(title = "Longitude", + value = positionInfo?.longitude ?: 0.0, + enabled = connected, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { value -> + if (value >= -90 && value <= 90.0) + positionInfo?.let { positionInfo = it.copy(longitude = value) } + }) + } + item { + EditTextPreference(title = "Altitude", + value = positionInfo?.altitude ?: 0, + enabled = connected, + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }), + onValueChanged = { value -> + positionInfo?.let { positionInfo = it.copy(altitude = value) } + }) + } + } + item { SwitchPreference(title = "GPS enabled", checked = positionInput.gpsEnabled, @@ -235,14 +268,18 @@ fun PreferenceItemList(viewModel: UIViewModel) { item { PreferenceFooter( - enabled = positionInput != localConfig.position, + enabled = positionInput != localConfig.position || positionInfo != ourNodeInfo?.position, onCancelClicked = { focusManager.clearFocus() positionInput = localConfig.position + positionInfo = ourNodeInfo?.position }, onSaveClicked = { focusManager.clearFocus() - viewModel.updatePositionConfig { positionInput } + if (positionInfo != ourNodeInfo?.position && positionInput.fixedPosition) positionInfo?.let { + viewModel.requestPosition(0, it.latitude, it.longitude, it.altitude) + } + if (positionInput != localConfig.position) viewModel.updatePositionConfig { positionInput } }) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt index 9b16c73cd..cff205b46 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt @@ -221,7 +221,7 @@ class UsersFragment : ScreenFragment("Users"), Logging { holder.coordsView.visibility = View.INVISIBLE } - val ourNodeInfo = model.nodeDB.ourNodeInfo.value + val ourNodeInfo = model.nodeDB.nodes.value?.get(model.nodeDB.myId.value) val distance = ourNodeInfo?.distanceStr(n) if (distance != null) { holder.distanceView.text = distance diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt index e0638cd0f..6900e35be 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt @@ -76,7 +76,9 @@ fun RegularPreference( trailingIcon, "trailingIcon", modifier = modifier .fillMaxWidth() - .wrapContentWidth(Alignment.End) + .wrapContentWidth(Alignment.End), + tint = if (!enabled) MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled) + else MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium), ) } }