kopia lustrzana https://github.com/meshtastic/Meshtastic-Android
Merge remote-tracking branch 'root/master' into dev
commit
72128d1e39
|
@ -45,11 +45,16 @@ that environment.
|
||||||
## Analytics setup
|
## Analytics setup
|
||||||
|
|
||||||
* analytics are included but can be disabled by the user on the settings screen
|
* analytics are included but can be disabled by the user on the settings screen
|
||||||
* on dev devices "adb shell setprop debug.firebase.analytics.app com.geeksville.mesh"
|
|
||||||
|
* on dev devices
|
||||||
|
|
||||||
|
```shell
|
||||||
|
adb shell setprop debug.firebase.analytics.app com.geeksville.mesh
|
||||||
adb shell setprop log.tag.FirebaseCrashlytics DEBUG
|
adb shell setprop log.tag.FirebaseCrashlytics DEBUG
|
||||||
|
```
|
||||||
|
|
||||||
for verbose logging:
|
for verbose logging:
|
||||||
```aidl
|
```shell
|
||||||
adb shell setprop log.tag.FA VERBOSE
|
adb shell setprop log.tag.FA VERBOSE
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -858,7 +858,7 @@ class MainActivity : AppCompatActivity(), Logging,
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
R.id.connectStatusImage -> {
|
R.id.connectStatusImage -> {
|
||||||
Toast.makeText(this, item.title, Toast.LENGTH_SHORT).show()
|
Toast.makeText(applicationContext, item.title, Toast.LENGTH_SHORT).show()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
else -> super.onOptionsItemSelected(item)
|
else -> super.onOptionsItemSelected(item)
|
||||||
|
@ -869,7 +869,7 @@ class MainActivity : AppCompatActivity(), Logging,
|
||||||
try {
|
try {
|
||||||
val packageInfo: PackageInfo = packageManager.getPackageInfo(packageName, 0)
|
val packageInfo: PackageInfo = packageManager.getPackageInfo(packageName, 0)
|
||||||
val versionName = packageInfo.versionName
|
val versionName = packageInfo.versionName
|
||||||
Toast.makeText(this, versionName, Toast.LENGTH_LONG).show()
|
Toast.makeText(applicationContext, versionName, Toast.LENGTH_LONG).show()
|
||||||
} catch (e: PackageManager.NameNotFoundException) {
|
} catch (e: PackageManager.NameNotFoundException) {
|
||||||
errormsg("Can not find the version: ${e.message}")
|
errormsg("Can not find the version: ${e.message}")
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ data class Channel(
|
||||||
// Note: this string _SHOULD NOT BE LOCALIZED_ because it directly hashes to values used on the device for the default channel name.
|
// Note: this string _SHOULD NOT BE LOCALIZED_ because it directly hashes to values used on the device for the default channel name.
|
||||||
val defaultChannelName = "Default"
|
val defaultChannelName = "Default"
|
||||||
|
|
||||||
// These bytes must math the well known and not secret bytes used the default channel AES128 key device code
|
// These bytes must match the well known and not secret bytes used the default channel AES128 key device code
|
||||||
val channelDefaultKey = byteArrayOfInts(
|
val channelDefaultKey = byteArrayOfInts(
|
||||||
0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59,
|
0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59,
|
||||||
0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0xbf
|
0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0xbf
|
||||||
|
@ -32,7 +32,7 @@ data class Channel(
|
||||||
.setModemConfig(MeshProtos.ChannelSettings.ModemConfig.Bw125Cr45Sf128).build()
|
.setModemConfig(MeshProtos.ChannelSettings.ModemConfig.Bw125Cr45Sf128).build()
|
||||||
)
|
)
|
||||||
|
|
||||||
const val prefix = "https://www.meshtastic.org/c/"
|
const val prefix = "https://www.meshtastic.org/c/#"
|
||||||
|
|
||||||
private const val base64Flags = Base64.URL_SAFE + Base64.NO_WRAP
|
private const val base64Flags = Base64.URL_SAFE + Base64.NO_WRAP
|
||||||
|
|
||||||
|
|
|
@ -866,9 +866,10 @@ class MeshService : Service(), Logging {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update our DB of users based on someone sending out a Position subpacket
|
/// Update our DB of users based on someone sending out a Position subpacket
|
||||||
private fun handleReceivedPosition(fromNum: Int, p: MeshProtos.Position) {
|
private fun handleReceivedPosition(fromNum: Int, p: MeshProtos.Position, defaultTime: Int = Position.currentTime()) {
|
||||||
updateNodeInfo(fromNum) {
|
updateNodeInfo(fromNum) {
|
||||||
it.position = Position(p, it.position?.time ?: 0)
|
it.position = Position(p)
|
||||||
|
updateNodeInfoTime(it, defaultTime)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -942,22 +943,22 @@ class MeshService : Service(), Logging {
|
||||||
val p = packet.decoded
|
val p = packet.decoded
|
||||||
|
|
||||||
// If the rxTime was not set by the device (because device software was old), guess at a time
|
// If the rxTime was not set by the device (because device software was old), guess at a time
|
||||||
val rxTime = if (packet.rxTime == 0) packet.rxTime else currentSecond()
|
val rxTime = if (packet.rxTime != 0) packet.rxTime else currentSecond()
|
||||||
|
|
||||||
// Update last seen for the node that sent the packet, but also for _our node_ because anytime a packet passes
|
// Update last seen for the node that sent the packet, but also for _our node_ because anytime a packet passes
|
||||||
// through our node on the way to the phone that means that local node is also alive in the mesh
|
// through our node on the way to the phone that means that local node is also alive in the mesh
|
||||||
updateNodeInfo(fromNum) {
|
|
||||||
// Update our last seen based on any valid timestamps. If the device didn't provide a timestamp make one
|
|
||||||
val lastSeen = rxTime
|
|
||||||
|
|
||||||
it.position = it.position?.copy(time = lastSeen)
|
|
||||||
}
|
|
||||||
updateNodeInfo(myNodeNum) {
|
updateNodeInfo(myNodeNum) {
|
||||||
it.position = it.position?.copy(time = currentSecond())
|
it.position = it.position?.copy(time = currentSecond())
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.hasPosition())
|
if (p.hasPosition())
|
||||||
handleReceivedPosition(fromNum, p.position)
|
handleReceivedPosition(fromNum, p.position, rxTime)
|
||||||
|
else
|
||||||
|
updateNodeInfo(fromNum) {
|
||||||
|
// Update our last seen based on any valid timestamps. If the device didn't provide a timestamp make one
|
||||||
|
updateNodeInfoTime(it, rxTime)
|
||||||
|
}
|
||||||
|
|
||||||
if (p.hasData())
|
if (p.hasData())
|
||||||
handleReceivedData(packet)
|
handleReceivedData(packet)
|
||||||
|
@ -1620,3 +1621,8 @@ class MeshService : Service(), Logging {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public fun updateNodeInfoTime(it: NodeInfo, rxTime: Int) {
|
||||||
|
if (it.position?.time == null || it.position?.time!! < rxTime)
|
||||||
|
it.position = it.position?.copy(time = rxTime)
|
||||||
|
}
|
|
@ -14,5 +14,10 @@ class PositionTest {
|
||||||
Assert.assertEquals(Position.degD(Position.degI(-89.0)), -89.0, 0.01)
|
Assert.assertEquals(Position.degD(Position.degI(-89.0)), -89.0, 0.01)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenPositionCreatedWithoutTime_thenTimeIsSet() {
|
||||||
|
val position = Position(37.1, 121.1, 35)
|
||||||
|
Assert.assertTrue(position.time != 0)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.geeksville.mesh.service
|
||||||
|
|
||||||
|
import com.geeksville.mesh.MeshUser
|
||||||
|
import com.geeksville.mesh.NodeInfo
|
||||||
|
import com.geeksville.mesh.Position
|
||||||
|
import org.junit.Assert
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
|
||||||
|
class MeshServiceTest {
|
||||||
|
|
||||||
|
val nodeInfo = NodeInfo(4, MeshUser("+one", "User One", "U1"), Position(37.1, 121.1, 35, 10))
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenNodeInfo_whenUpdatingWithNewTime_thenPositionTimeIsUpdated() {
|
||||||
|
|
||||||
|
val newerTime = 20
|
||||||
|
updateNodeInfoTime(nodeInfo, newerTime)
|
||||||
|
Assert.assertEquals(newerTime, nodeInfo.position?.time)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenNodeInfo_whenUpdatingWithOldTime_thenPositionTimeIsNotUpdated() {
|
||||||
|
val olderTime = 5
|
||||||
|
val timeBeforeTryingToUpdate = nodeInfo.position?.time
|
||||||
|
updateNodeInfoTime(nodeInfo, olderTime)
|
||||||
|
Assert.assertEquals(timeBeforeTryingToUpdate, nodeInfo.position?.time)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue