refactor: add DTO mapper for `DeviceHardware`

pull/1455/head
andrekir 2024-12-10 12:19:33 -03:00
rodzic 165f5a2b49
commit 1a67ea8ad4
3 zmienionych plików z 72 dodań i 52 usunięć

Wyświetl plik

@ -17,10 +17,24 @@
package com.geeksville.mesh.model
import com.geeksville.mesh.MeshProtos.HardwareModel
import com.geeksville.mesh.R
import kotlinx.serialization.Serializable
@Serializable
data class DeviceHardware(
val hwModel: Int,
val hwModelSlug: String,
val architecture: String,
val activelySupported: Boolean,
val supportLevel: Int? = null,
val displayName: String,
val tags: List<String>? = listOf(),
val image: Int,
val requiresDfu: Boolean? = null,
)
@Serializable
data class DeviceHardwareDto(
val hwModel: Int,
val hwModelSlug: String,
val platformioTarget: String,
@ -30,5 +44,54 @@ data class DeviceHardware(
val displayName: String,
val tags: List<String>? = listOf(),
val images: List<String>? = listOf(),
val requiresDfu: Boolean? = null
)
val requiresDfu: Boolean? = null,
) {
fun toDeviceHardware() = DeviceHardware(
hwModel = hwModel,
hwModelSlug = hwModelSlug,
architecture = architecture,
activelySupported = activelySupported,
supportLevel = supportLevel,
displayName = displayName,
tags = tags,
image = HardwareModel.forNumber(hwModel).getDeviceVectorImage(),
requiresDfu = requiresDfu
)
}
@Suppress("CyclomaticComplexMethod")
private fun HardwareModel.getDeviceVectorImage(): Int = when (this) {
HardwareModel.DIY_V1 -> R.drawable.hw_diy
HardwareModel.HELTEC_HT62 -> R.drawable.hw_heltec_ht62_esp32c3_sx1262
HardwareModel.HELTEC_MESH_NODE_T114 -> R.drawable.hw_heltec_mesh_node_t114
HardwareModel.HELTEC_V3 -> R.drawable.hw_heltec_v3
HardwareModel.HELTEC_VISION_MASTER_E213 -> R.drawable.hw_heltec_vision_master_e213
HardwareModel.HELTEC_VISION_MASTER_E290 -> R.drawable.hw_heltec_vision_master_e290
HardwareModel.HELTEC_VISION_MASTER_T190 -> R.drawable.hw_heltec_vision_master_t190
HardwareModel.HELTEC_WIRELESS_PAPER -> R.drawable.hw_heltec_wireless_paper
HardwareModel.HELTEC_WIRELESS_TRACKER -> R.drawable.hw_heltec_wireless_tracker
HardwareModel.HELTEC_WIRELESS_TRACKER_V1_0 -> R.drawable.hw_heltec_wireless_tracker_v1_0
HardwareModel.HELTEC_WSL_V3 -> R.drawable.hw_heltec_wsl_v3
HardwareModel.NANO_G2_ULTRA -> R.drawable.hw_nano_g2_ultra
HardwareModel.RPI_PICO -> R.drawable.hw_pico
HardwareModel.NRF52_PROMICRO_DIY -> R.drawable.hw_promicro
HardwareModel.RAK11310 -> R.drawable.hw_rak11310
HardwareModel.RAK4631 -> R.drawable.hw_rak4631
HardwareModel.RPI_PICO2 -> R.drawable.hw_rpipicow
HardwareModel.SENSECAP_INDICATOR -> R.drawable.hw_seeed_sensecap_indicator
HardwareModel.SEEED_XIAO_S3 -> R.drawable.hw_seeed_xiao_s3
HardwareModel.STATION_G2 -> R.drawable.hw_station_g2
HardwareModel.T_DECK -> R.drawable.hw_t_deck
HardwareModel.T_ECHO -> R.drawable.hw_t_echo
HardwareModel.T_WATCH_S3 -> R.drawable.hw_t_watch_s3
HardwareModel.TBEAM -> R.drawable.hw_tbeam
HardwareModel.LILYGO_TBEAM_S3_CORE -> R.drawable.hw_tbeam_s3_core
HardwareModel.TLORA_C6 -> R.drawable.hw_tlora_c6
HardwareModel.TLORA_T3_S3 -> R.drawable.hw_tlora_t3s3_v1
HardwareModel.TLORA_V2_1_1P6 -> R.drawable.hw_tlora_v2_1_1_6
HardwareModel.TLORA_V2_1_1P8 -> R.drawable.hw_tlora_v2_1_1_8
HardwareModel.TRACKER_T1000_E -> R.drawable.hw_tracker_t1000_e
HardwareModel.WIO_WM1110 -> R.drawable.hw_wio_tracker_wm1110
HardwareModel.WISMESH_TAP -> R.drawable.hw_rak_wismeshtap
else -> R.drawable.hw_unknown
}

Wyświetl plik

@ -20,7 +20,6 @@ package com.geeksville.mesh.model
import android.app.Application
import android.content.SharedPreferences
import android.net.Uri
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
@ -80,7 +79,6 @@ data class MetricsState(
val tracerouteResults: List<MeshPacket> = emptyList(),
val positionLogs: List<Position> = emptyList(),
val deviceHardware: DeviceHardware? = null,
@DrawableRes val deviceImageRes: Int = R.drawable.hw_unknown,
) {
fun hasDeviceMetrics() = deviceMetrics.isNotEmpty()
fun hasEnvironmentMetrics() = environmentMetrics.isNotEmpty()
@ -213,6 +211,8 @@ class MetricsViewModel @Inject constructor(
private val _timeFrame = MutableStateFlow(TimeFrame.TWENTY_FOUR_HOURS)
val timeFrame: StateFlow<TimeFrame> = _timeFrame
private var deviceHardwareList: List<DeviceHardware> = listOf()
init {
@OptIn(ExperimentalCoroutinesApi::class)
radioConfigRepository.nodeDBbyNum
@ -222,10 +222,7 @@ class MetricsViewModel @Inject constructor(
_state.update { state -> state.copy(node = node) }
node?.user?.hwModel?.let { hwModel ->
_state.update { state ->
state.copy(
deviceHardware = getDeviceHardwareFromHardwareModel(hwModel),
deviceImageRes = getDeviceVectorImageFromHardwareModel(hwModel)
)
state.copy(deviceHardware = getDeviceHardwareFromHardwareModel(hwModel))
}
}
}
@ -333,7 +330,6 @@ class MetricsViewModel @Inject constructor(
}
}
private var deviceHardwareList: List<DeviceHardware> = listOf()
private fun getDeviceHardwareFromHardwareModel(
hwModel: HardwareModel
): DeviceHardware? {
@ -341,50 +337,12 @@ class MetricsViewModel @Inject constructor(
try {
val json =
app.assets.open("device_hardware.json").bufferedReader().use { it.readText() }
deviceHardwareList = Json.decodeFromString<List<DeviceHardware>>(json)
deviceHardwareList = Json.decodeFromString<List<DeviceHardwareDto>>(json)
.map { it.toDeviceHardware() }
} catch (ex: IOException) {
errormsg("Can't read device_hardware.json error: ${ex.message}")
}
}
return deviceHardwareList.find { it.hwModel == hwModel.number }
}
@Suppress("CyclomaticComplexMethod")
private fun getDeviceVectorImageFromHardwareModel(hwModel: HardwareModel): Int {
return when (hwModel) {
HardwareModel.DIY_V1 -> R.drawable.hw_diy
HardwareModel.HELTEC_HT62 -> R.drawable.hw_heltec_ht62_esp32c3_sx1262
HardwareModel.HELTEC_MESH_NODE_T114 -> R.drawable.hw_heltec_mesh_node_t114
HardwareModel.HELTEC_V3 -> R.drawable.hw_heltec_v3
HardwareModel.HELTEC_VISION_MASTER_E213 -> R.drawable.hw_heltec_vision_master_e213
HardwareModel.HELTEC_VISION_MASTER_E290 -> R.drawable.hw_heltec_vision_master_e290
HardwareModel.HELTEC_VISION_MASTER_T190 -> R.drawable.hw_heltec_vision_master_t190
HardwareModel.HELTEC_WIRELESS_PAPER -> R.drawable.hw_heltec_wireless_paper
HardwareModel.HELTEC_WIRELESS_TRACKER -> R.drawable.hw_heltec_wireless_tracker
HardwareModel.HELTEC_WIRELESS_TRACKER_V1_0 -> R.drawable.hw_heltec_wireless_tracker_v1_0
HardwareModel.HELTEC_WSL_V3 -> R.drawable.hw_heltec_wsl_v3
HardwareModel.NANO_G2_ULTRA -> R.drawable.hw_nano_g2_ultra
HardwareModel.RPI_PICO -> R.drawable.hw_pico
HardwareModel.NRF52_PROMICRO_DIY -> R.drawable.hw_promicro
HardwareModel.RAK11310 -> R.drawable.hw_rak11310
HardwareModel.RAK4631 -> R.drawable.hw_rak4631
HardwareModel.RPI_PICO2 -> R.drawable.hw_rpipicow
HardwareModel.SENSECAP_INDICATOR -> R.drawable.hw_seeed_sensecap_indicator
HardwareModel.SEEED_XIAO_S3 -> R.drawable.hw_seeed_xiao_s3
HardwareModel.STATION_G2 -> R.drawable.hw_station_g2
HardwareModel.T_DECK -> R.drawable.hw_t_deck
HardwareModel.T_ECHO -> R.drawable.hw_t_echo
HardwareModel.T_WATCH_S3 -> R.drawable.hw_t_watch_s3
HardwareModel.TBEAM -> R.drawable.hw_tbeam
HardwareModel.LILYGO_TBEAM_S3_CORE -> R.drawable.hw_tbeam_s3_core
HardwareModel.TLORA_C6 -> R.drawable.hw_tlora_c6
HardwareModel.TLORA_T3_S3 -> R.drawable.hw_tlora_t3s3_v1
HardwareModel.TLORA_V2_1_1P6 -> R.drawable.hw_tlora_v2_1_1_6
HardwareModel.TLORA_V2_1_1P8 -> R.drawable.hw_tlora_v2_1_1_8
HardwareModel.TRACKER_T1000_E -> R.drawable.hw_tracker_t1000_e
HardwareModel.WIO_WM1110 -> R.drawable.hw_wio_tracker_wm1110
HardwareModel.WISMESH_TAP -> R.drawable.hw_rak_wismeshtap
else -> R.drawable.hw_unknown
}
}
}

Wyświetl plik

@ -217,7 +217,6 @@ private fun DeviceDetailsContent(
) {
val node = state.node ?: return
val deviceHardware = state.deviceHardware ?: return
val deviceImageRes = state.deviceImageRes
val hwModelName = deviceHardware.displayName
val isSupported = deviceHardware.activelySupported
Box(
@ -233,7 +232,7 @@ private fun DeviceDetailsContent(
) {
Image(
modifier = Modifier.padding(16.dp),
imageVector = ImageVector.vectorResource(deviceImageRes),
imageVector = ImageVector.vectorResource(deviceHardware.image),
contentDescription = hwModelName,
)
}