From 81e76bfc51ca89b92a027b1d4763ddac31dfcb13 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Thu, 4 Mar 2021 09:08:29 +0800 Subject: [PATCH] fix bugs found via simulator --- .../com/geeksville/mesh/IMeshService.aidl | 4 ++-- .../java/com/geeksville/mesh/MainActivity.kt | 11 +++++++---- .../java/com/geeksville/mesh/model/UIState.kt | 4 ++-- .../geeksville/mesh/service/MeshService.kt | 14 ++++++-------- .../geeksville/mesh/service/MockInterface.kt | 17 ++--------------- .../geeksville/mesh/ui/SettingsFragment.kt | 19 +++++++++++++++++++ 6 files changed, 38 insertions(+), 31 deletions(-) diff --git a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl index 03580804d..a9ee757d0 100644 --- a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl +++ b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl @@ -102,8 +102,8 @@ interface IMeshService { /// Returns true if the device address actually changed, or false if no change was needed boolean setDeviceAddress(String deviceAddr); - /// Get basic device hardware info about our connected radio. Will never return NULL. Will throw - /// RemoteException if no my node info is available + /// Get basic device hardware info about our connected radio. Will never return NULL. Will return NULL + /// if no my node info is available (i.e. it will not throw an exception) MyNodeInfo getMyNodeInfo(); /// Start updating the radios firmware diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 9171095d6..61127e5c6 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -846,8 +846,10 @@ class MainActivity : AppCompatActivity(), Logging, val allMsgs = service.oldMessages val msgs = allMsgs.filter { p -> p.dataType == Portnums.PortNum.TEXT_MESSAGE_APP_VALUE } - debug("Service provided ${msgs.size} messages and myNodeNum ${service.myNodeInfo?.myNodeNum}") - model.myNodeInfo.value = service.myNodeInfo + + model.myNodeInfo.value = service.myNodeInfo // Note: this could be NULL! + debug("Service provided ${msgs.size} messages and myNodeNum ${model.myNodeInfo.value?.myNodeNum}") + model.messagesState.setMessages(msgs) val connectionState = MeshService.ConnectionState.valueOf(service.connectionState()) @@ -857,7 +859,6 @@ class MainActivity : AppCompatActivity(), Logging, if (connectionState != MeshService.ConnectionState.CONNECTED) updateNodesFromDevice() - // We won't receive a notify for the initial state of connection, so we force an update here onMeshConnectionChanged(connectionState) } catch (ex: RemoteException) { @@ -866,9 +867,11 @@ class MainActivity : AppCompatActivity(), Logging, model.isConnected.value = MeshService.ConnectionState.valueOf(service.connectionState()) } + finally { + connectionJob = null + } debug("connected to mesh service, isConnected=${model.isConnected.value}") - connectionJob = null } } 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 91d78a4bd..63e569ba0 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -139,8 +139,8 @@ class UIViewModel(private val app: Application) : AndroidViewModel(app), Logging } } - /// hardware info about our local device - val myNodeInfo = object : MutableLiveData(null) {} + /// hardware info about our local device (can be null) + val myNodeInfo = object : MutableLiveData(null) {} override fun onCleared() { super.onCleared() 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 93aa32cec..013478776 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -765,6 +765,7 @@ class MeshService : Service(), Logging { if (fromNodeNum == myNodeNum) { when (a.variantCase) { AdminProtos.AdminMessage.VariantCase.GET_RADIO_RESPONSE -> { + debug("Admin: received radioConfig") radioConfig = a.getRadioResponse requestChannel(0) // Now start reading channels } @@ -774,19 +775,18 @@ class MeshService : Service(), Logging { if (mi != null) { val ch = a.getChannelResponse channels[ch.index] = ch - debug("Received channel ${ch.index}") + debug("Admin: Received channel ${ch.index}") if (ch.index + 1 < mi.maxChannels) { if(ch.hasSettings()) { // Not done yet, request next channel requestChannel(ch.index + 1) } - /* if(ch.index == 0) { - // We allow the app to start as soon as we've received the primary channel, we'll keep fetching other channels in the background + else { debug("We've received the primary channel, allowing rest of app to start...") onHasSettings() - } */ + } } else { - debug("Received all channels") + debug("Received max channels, starting app") onHasSettings() } } @@ -1629,9 +1629,7 @@ class MeshService : Service(), Logging { doFirmwareUpdate() } - override fun getMyNodeInfo(): MyNodeInfo = toRemoteExceptions { - this@MeshService.myNodeInfo ?: throw RadioNotConnectedException("No MyNodeInfo") - } + override fun getMyNodeInfo(): MyNodeInfo? = this@MeshService.myNodeInfo override fun getMyId() = toRemoteExceptions { myNodeID } diff --git a/app/src/main/java/com/geeksville/mesh/service/MockInterface.kt b/app/src/main/java/com/geeksville/mesh/service/MockInterface.kt index c83b0b00d..699734070 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MockInterface.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MockInterface.kt @@ -156,24 +156,11 @@ class MockInterface(private val service: RadioInterfaceService) : Logging, IRadi hwModel = "Sim" messageTimeoutMsec = 5 * 60 * 1000 firmwareVersion = service.getString(R.string.cur_firmware_version) + numBands = 13 + maxChannels = 8 }.build() }, - // RadioConfig - /* MeshProtos.FromRadio.newBuilder().apply { - radio = RadioConfigProtos.RadioConfig.newBuilder().apply { - - preferences = RadioConfigProtos.RadioConfig.UserPreferences.newBuilder().apply { - region = RadioConfigProtos.RegionCode.TW - // FIXME set critical times? - }.build() - - /* channel = ChannelProtos.ChannelSettings.newBuilder().apply { - // we just have an empty listing so that the default channel works - }.build() */ - }.build() - }, */ - // Fake NodeDB makeNodeInfo(MY_NODE, 32.776665, -96.796989), // dallas makeNodeInfo(MY_NODE + 1, 32.960758, -96.733521), // richardson diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index 86c20fc2c..89db0be82 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -19,6 +19,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo +import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.RadioButton import android.widget.Toast @@ -583,6 +584,22 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } } + private val regionSpinnerListener = object : AdapterView.OnItemSelectedListener{ + override fun onItemSelected( + parent: AdapterView<*>, + view: View, + position: Int, + id: Long + ) { + val item = parent.getItemAtPosition(position) + //TODO("Not yet implemented") + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + //TODO("Not yet implemented") + } + } + /// Setup the ui widgets unrelated to BLE scanning private fun initCommonUI() { @@ -592,6 +609,8 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { regionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) // spinner.adapter = regionAdapter + spinner.onItemSelectedListener = regionSpinnerListener + model.ownerName.observe(viewLifecycleOwner, { name -> binding.usernameEditText.setText(name) })