Skip to content

Commit

Permalink
refactor: replace MyNodeInfo with MyNodeEntity (meshtastic#1277)
Browse files Browse the repository at this point in the history
  • Loading branch information
andrekir authored Oct 2, 2024
1 parent d89d4b7 commit c30ee2f
Show file tree
Hide file tree
Showing 14 changed files with 550 additions and 129 deletions.
458 changes: 458 additions & 0 deletions app/schemas/com.geeksville.mesh.database.MeshtasticDatabase/13.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.geeksville.mesh.database.MeshtasticDatabase
import com.geeksville.mesh.database.dao.NodeInfoDao
import com.geeksville.mesh.database.entity.MyNodeEntity
import com.geeksville.mesh.database.entity.NodeEntity
import com.geeksville.mesh.model.NodeSortOption
import kotlinx.coroutines.flow.first
Expand Down Expand Up @@ -35,9 +36,8 @@ class NodeInfoDaoTest {
latitude = 30.267153, longitude = -97.743057 // Austin
)

private val myNodeInfo: MyNodeInfo = MyNodeInfo(
private val myNodeInfo: MyNodeEntity = MyNodeEntity(
myNodeNum = ourNode.num,
hasGPS = false,
model = null,
firmwareVersion = null,
couldUpdate = false,
Expand All @@ -47,8 +47,6 @@ class NodeInfoDaoTest {
minAppVersion = 1,
maxChannels = 8,
hasWifi = false,
channelUtilization = 0f,
airUtilTx = 0f,
)

private val testPositions = arrayOf(
Expand Down
6 changes: 2 additions & 4 deletions app/src/androidTest/java/com/geeksville/mesh/PacketDaoTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.test.platform.app.InstrumentationRegistry
import com.geeksville.mesh.database.MeshtasticDatabase
import com.geeksville.mesh.database.dao.NodeInfoDao
import com.geeksville.mesh.database.dao.PacketDao
import com.geeksville.mesh.database.entity.MyNodeEntity
import com.geeksville.mesh.database.entity.Packet
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
Expand All @@ -22,9 +23,8 @@ class PacketDaoTest {
private lateinit var nodeInfoDao: NodeInfoDao
private lateinit var packetDao: PacketDao

private val myNodeInfo: MyNodeInfo = MyNodeInfo(
private val myNodeInfo: MyNodeEntity = MyNodeEntity(
myNodeNum = 42424242,
hasGPS = false,
model = null,
firmwareVersion = null,
couldUpdate = false,
Expand All @@ -34,8 +34,6 @@ class PacketDaoTest {
minAppVersion = 1,
maxChannels = 8,
hasWifi = false,
channelUtilization = 0f,
airUtilTx = 0f,
)

private val myNodeNum: Int get() = myNodeInfo.myNodeNum
Expand Down
9 changes: 0 additions & 9 deletions app/src/main/java/com/geeksville/mesh/MyNodeInfo.kt
Original file line number Diff line number Diff line change
@@ -1,20 +1,11 @@
package com.geeksville.mesh

import android.os.Parcelable
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.parcelize.Parcelize

/**
* Room [Entity] and [PrimaryKey] annotations and imports can be removed when only using the API.
* For details check the AIDL interface in [com.geeksville.mesh.IMeshService]
*/

// MyNodeInfo sent via special protobuf from radio
@Parcelize
@Entity(tableName = "MyNodeInfo")
data class MyNodeInfo(
@PrimaryKey(autoGenerate = false)
val myNodeNum: Int,
val hasGPS: Boolean,
val model: String?,
Expand Down
69 changes: 0 additions & 69 deletions app/src/main/java/com/geeksville/mesh/NodeInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,12 @@ package com.geeksville.mesh

import android.graphics.Color
import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.Embedded
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.geeksville.mesh.util.GPSFormat
import com.geeksville.mesh.util.bearing
import com.geeksville.mesh.util.latLongToMeter
import com.geeksville.mesh.util.anonymize
import kotlinx.parcelize.Parcelize

/**
* Room [Embedded], [Entity] and [PrimaryKey] annotations and imports, as well as any protobuf
* reference [MeshProtos], [TelemetryProtos], [ConfigProtos] can be removed when only using the API.
* For details check the AIDL interface in [com.geeksville.mesh.IMeshService]
*/

//
// model objects that directly map to the corresponding protobufs
//
Expand All @@ -29,7 +19,6 @@ data class MeshUser(
val shortName: String,
val hwModel: MeshProtos.HardwareModel,
val isLicensed: Boolean = false,
@ColumnInfo(name = "role", defaultValue = "0")
val role: Int = 0,
) : Parcelable {

Expand All @@ -53,16 +42,6 @@ data class MeshUser(
p.roleValue
)

fun toProto(): MeshProtos.User =
MeshProtos.User.newBuilder()
.setId(id)
.setLongName(longName)
.setShortName(shortName)
.setHwModel(hwModel)
.setIsLicensed(isLicensed)
.setRoleValue(role)
.build()

/** a string version of the hardware model, converted into pretty lowercase and changing _ to -, and p to dot
* or null if unset
* */
Expand Down Expand Up @@ -172,67 +151,19 @@ data class EnvironmentMetrics(
companion object {
fun currentTime() = (System.currentTimeMillis() / 1000).toInt()
}

/** Create our model object from a protobuf.
*/
constructor(t: TelemetryProtos.EnvironmentMetrics, telemetryTime: Int = currentTime()) : this(
telemetryTime,
t.temperature,
t.relativeHumidity,
t.barometricPressure,
t.gasResistance,
t.voltage,
t.current,
t.iaq,
)

fun getDisplayString(inFahrenheit: Boolean = false): String {
val temp = if (temperature != 0f) {
if (inFahrenheit) {
val fahrenheit = temperature * 1.8F + 32
String.format("%.1f°F", fahrenheit)
} else {
String.format("%.1f°C", temperature)
}
} else null
val humidity = if (relativeHumidity != 0f) String.format("%.0f%%", relativeHumidity) else null
val pressure = if (barometricPressure != 0f) String.format("%.1fhPa", barometricPressure) else null
val gas = if (gasResistance != 0f) String.format("%.0fMΩ", gasResistance) else null
val voltage = if (voltage != 0f) String.format("%.2fV", voltage) else null
val current = if (current != 0f) String.format("%.1fmA", current) else null
val iaq = if (iaq != 0) "IAQ: $iaq" else null

return listOfNotNull(
temp,
humidity,
pressure,
gas,
voltage,
current,
iaq,
).joinToString(" ")
}

}

@Parcelize
@Entity(tableName = "NodeInfo")
data class NodeInfo(
@PrimaryKey(autoGenerate = false)
val num: Int, // This is immutable, and used as a key
@Embedded(prefix = "user_")
var user: MeshUser? = null,
@Embedded(prefix = "position_")
var position: Position? = null,
var snr: Float = Float.MAX_VALUE,
var rssi: Int = Int.MAX_VALUE,
var lastHeard: Int = 0, // the last time we've seen this node in secs since 1970
@Embedded(prefix = "devMetrics_")
var deviceMetrics: DeviceMetrics? = null,
var channel: Int = 0,
@Embedded(prefix = "envMetrics_")
var environmentMetrics: EnvironmentMetrics? = null,
@ColumnInfo(name = "hopsAway", defaultValue = "0")
var hopsAway: Int = 0
) : Parcelable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,25 @@ package com.geeksville.mesh.database
import android.content.Context
import androidx.room.AutoMigration
import androidx.room.Database
import androidx.room.DeleteTable
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.geeksville.mesh.MyNodeInfo
import com.geeksville.mesh.NodeInfo
import androidx.room.migration.AutoMigrationSpec
import com.geeksville.mesh.database.dao.PacketDao
import com.geeksville.mesh.database.dao.MeshLogDao
import com.geeksville.mesh.database.dao.NodeInfoDao
import com.geeksville.mesh.database.dao.QuickChatActionDao
import com.geeksville.mesh.database.entity.ContactSettings
import com.geeksville.mesh.database.entity.MeshLog
import com.geeksville.mesh.database.entity.MyNodeEntity
import com.geeksville.mesh.database.entity.NodeEntity
import com.geeksville.mesh.database.entity.Packet
import com.geeksville.mesh.database.entity.QuickChatAction

@Database(
entities = [
MyNodeInfo::class,
NodeInfo::class,
MyNodeEntity::class,
NodeEntity::class,
Packet::class,
ContactSettings::class,
Expand All @@ -38,8 +38,9 @@ import com.geeksville.mesh.database.entity.QuickChatAction
AutoMigration (from = 9, to = 10),
AutoMigration (from = 10, to = 11),
AutoMigration (from = 11, to = 12),
AutoMigration(from = 12, to = 13, spec = AutoMigration12to13::class),
],
version = 12,
version = 13,
exportSchema = true,
)
@TypeConverters(Converters::class)
Expand All @@ -62,3 +63,9 @@ abstract class MeshtasticDatabase : RoomDatabase() {
}
}
}

@DeleteTable.Entries(
DeleteTable(tableName = "NodeInfo"),
DeleteTable(tableName = "MyNodeInfo")
)
class AutoMigration12to13 : AutoMigrationSpec
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,27 @@ import androidx.room.MapColumn
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Upsert
import com.geeksville.mesh.MyNodeInfo
import com.geeksville.mesh.database.entity.MyNodeEntity
import com.geeksville.mesh.database.entity.NodeEntity
import kotlinx.coroutines.flow.Flow

@Dao
interface NodeInfoDao {

@Query("SELECT * FROM MyNodeInfo")
fun getMyNodeInfo(): Flow<MyNodeInfo?>
@Query("SELECT * FROM my_node")
fun getMyNodeInfo(): Flow<MyNodeEntity?>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun setMyNodeInfo(myInfo: MyNodeInfo)
fun setMyNodeInfo(myInfo: MyNodeEntity)

@Query("DELETE FROM MyNodeInfo")
@Query("DELETE FROM my_node")
fun clearMyNodeInfo()

@Query(
"""
SELECT * FROM nodes
ORDER BY CASE
WHEN num = (SELECT myNodeNum FROM MyNodeInfo LIMIT 1) THEN 0
WHEN num = (SELECT myNodeNum FROM my_node LIMIT 1) THEN 0
ELSE 1
END,
last_heard DESC
Expand All @@ -39,15 +39,15 @@ interface NodeInfoDao {
WITH OurNode AS (
SELECT latitude, longitude
FROM nodes
WHERE num = (SELECT myNodeNum FROM MyNodeInfo LIMIT 1)
WHERE num = (SELECT myNodeNum FROM my_node LIMIT 1)
)
SELECT * FROM nodes
WHERE (:includeUnknown = 1 OR short_name IS NOT NULL)
AND (:filter = ''
OR (long_name LIKE '%' || :filter || '%'
OR short_name LIKE '%' || :filter || '%'))
ORDER BY CASE
WHEN num = (SELECT myNodeNum FROM MyNodeInfo LIMIT 1) THEN 0
WHEN num = (SELECT myNodeNum FROM my_node LIMIT 1) THEN 0
ELSE 1
END,
CASE
Expand Down
22 changes: 11 additions & 11 deletions app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ interface PacketDao {
@Query(
"""
SELECT * FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND port_num = :portNum
ORDER BY received_time ASC
"""
Expand All @@ -29,7 +29,7 @@ interface PacketDao {
@Query(
"""
SELECT * FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND port_num = 1
ORDER BY received_time DESC
"""
Expand All @@ -39,7 +39,7 @@ interface PacketDao {
@Query(
"""
SELECT COUNT(*) FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND port_num = 1 AND contact_key = :contact
"""
)
Expand All @@ -48,7 +48,7 @@ interface PacketDao {
@Query(
"""
SELECT COUNT(*) FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND port_num = 1 AND contact_key = :contact AND read = 0
"""
)
Expand All @@ -58,7 +58,7 @@ interface PacketDao {
"""
UPDATE packet
SET read = 1
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND port_num = 1 AND contact_key = :contact AND read = 0 AND received_time <= :timestamp
"""
)
Expand All @@ -70,7 +70,7 @@ interface PacketDao {
@Query(
"""
SELECT * FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND port_num = 1 AND contact_key = :contact
ORDER BY received_time DESC
"""
Expand All @@ -80,7 +80,7 @@ interface PacketDao {
@Query(
"""
SELECT * FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND data = :data
"""
)
Expand All @@ -92,7 +92,7 @@ interface PacketDao {
@Query(
"""
DELETE FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND contact_key IN (:contactList)
"""
)
Expand Down Expand Up @@ -124,7 +124,7 @@ interface PacketDao {
@Query(
"""
SELECT data FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
ORDER BY received_time ASC
"""
)
Expand All @@ -133,7 +133,7 @@ interface PacketDao {
@Query(
"""
SELECT * FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND packet_id = :requestId
ORDER BY received_time DESC
"""
Expand All @@ -147,7 +147,7 @@ interface PacketDao {
@Query(
"""
SELECT * FROM packet
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM MyNodeInfo))
WHERE (myNodeNum = 0 OR myNodeNum = (SELECT myNodeNum FROM my_node))
AND port_num = 8
ORDER BY received_time ASC
"""
Expand Down
Loading

0 comments on commit c30ee2f

Please sign in to comment.