diff --git a/app/src/main/java/com/geeksville/mesh/model/DeviceHardware.kt b/app/src/main/java/com/geeksville/mesh/model/DeviceHardware.kt index ae0273056..eb137599e 100644 --- a/app/src/main/java/com/geeksville/mesh/model/DeviceHardware.kt +++ b/app/src/main/java/com/geeksville/mesh/model/DeviceHardware.kt @@ -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? = 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? = listOf(), val images: List? = 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 +} diff --git a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt index 4ac46c0e5..a27d8a83b 100644 --- a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt @@ -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 = emptyList(), val positionLogs: List = 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 + private var deviceHardwareList: List = 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 = 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>(json) + deviceHardwareList = Json.decodeFromString>(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 - } - } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/NodeDetail.kt b/app/src/main/java/com/geeksville/mesh/ui/NodeDetail.kt index f17ea7f93..8cdc483b9 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/NodeDetail.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/NodeDetail.kt @@ -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, ) }