| | |
| | | package com.flightfeather.obd.socket.decoder.impl |
| | | |
| | | import com.flightfeather.obd.common.INVALID_DATA_4_BYTE |
| | | import com.flightfeather.obd.socket.bean.EngineDataStream |
| | | import com.flightfeather.obd.socket.bean.ObdInfo |
| | | import com.flightfeather.obd.socket.bean.SupplementDataStream |
| | |
| | | |
| | | return if (dataList.size >= 37) { |
| | | EngineDataStream(time, serialNum).apply { |
| | | obdSpeed = "${dataList[0]}${dataList[1]}".toIntOrNull(16)?.toDouble()?.times((1 / 256).toDouble()) |
| | | obdSpeed = "${dataList[0]}${dataList[1]}".toIntOrNull(16)?.toDouble()?.div(256) |
| | | obdAirPressure = dataList[2].toIntOrNull(16)?.toDouble()?.times(0.5) |
| | | obdEngineTorque = dataList[3].toIntOrNull(16)?.minus(125)?.toDouble()?.div(100) |
| | | obdFrictionTorque = dataList[4].toIntOrNull(16)?.minus(125)?.toDouble()?.div(100) |
| | | obdEngineRpm = "${dataList[5]}${dataList[6]}".toIntOrNull(16)?.toDouble()?.times(0.125) |
| | | obdEngineFuelFlow = "${dataList[7]}${dataList[8]}".toIntOrNull(16)?.toDouble()?.times(0.05) |
| | | obdScrUpstreamNox = "${dataList[9]}${dataList[10]}".toIntOrNull(16)?.minus(200)?.toDouble()?.times(0.05) |
| | | obdScrDownstreamNox = "${dataList[11]}${dataList[12]}".toIntOrNull(16)?.minus(200)?.toDouble()?.times(0.05) |
| | | obdScrUpstreamNox = "${dataList[9]}${dataList[10]}".toIntOrNull(16)?.times(0.05)?.minus(200) |
| | | obdScrDownstreamNox = "${dataList[11]}${dataList[12]}".toIntOrNull(16)?.times(0.05)?.minus(200) |
| | | obdRemainReactant = dataList[13].toIntOrNull(16)?.toDouble()?.times(0.4)?.div(100) |
| | | obdAirInput = "${dataList[14]}${dataList[15]}".toIntOrNull(16)?.toDouble()?.times(0.05) |
| | | obdScrInputTemp = "${dataList[16]}${dataList[17]}".toIntOrNull(16)?.minus(273)?.toDouble()?.times(0.03125) |
| | | obdScrOutputTemp = "${dataList[18]}${dataList[19]}".toIntOrNull(16)?.minus(273)?.toDouble()?.times(0.03125) |
| | | obdScrInputTemp = "${dataList[16]}${dataList[17]}".toIntOrNull(16)?.times(0.03125)?.minus(273) |
| | | obdScrOutputTemp = "${dataList[18]}${dataList[19]}".toIntOrNull(16)?.times(0.03125)?.minus(273) |
| | | obdDpf = "${dataList[20]}${dataList[21]}".toIntOrNull(16)?.toDouble()?.times(0.1) |
| | | obdEngineCoolantTemp = dataList[22].toIntOrNull(16)?.minus(40)?.toDouble() |
| | | obdFuelLevel = dataList[23].toIntOrNull(16)?.toDouble()?.times(0.4) |
| | | obdLocationStatus = dataList[24].toIntOrNull(16) |
| | | obdLong = "${dataList[25]}${dataList[26]}${dataList[27]}${dataList[28]}".toIntOrNull(16)?.toDouble()?.times(0.000001) |
| | | obdLat = "${dataList[29]}${dataList[30]}${dataList[31]}${dataList[32]}".toIntOrNull(16)?.toDouble()?.times(0.000001) |
| | | obdTotalMileage = "${dataList[33]}${dataList[34]}${dataList[35]}${dataList[36]}".toIntOrNull(16)?.toDouble()?.times(0.1) |
| | | with("${dataList[25]}${dataList[26]}${dataList[27]}${dataList[28]}") { |
| | | obdLong = if (toUpperCase() == INVALID_DATA_4_BYTE) { -1.0 } else { toBigIntegerOrNull(16)?.toDouble()?.times(0.000001) } |
| | | } |
| | | with("${dataList[29]}${dataList[30]}${dataList[31]}${dataList[32]}") { |
| | | obdLat = if (toUpperCase() == INVALID_DATA_4_BYTE) { -1.0 } else { toBigIntegerOrNull(16)?.toDouble()?.times(0.000001) } |
| | | } |
| | | with("${dataList[33]}${dataList[34]}${dataList[35]}${dataList[36]}") { |
| | | obdTotalMileage = if (toUpperCase() == INVALID_DATA_4_BYTE) { -1.0 } else { toBigIntegerOrNull(16)?.toDouble()?.times(0.1) } |
| | | } |
| | | } |
| | | } else { |
| | | null |
| | |
| | | SupplementDataStream(time, serialNum).apply { |
| | | obdEngineTorqueMode = dataList[0].toIntOrNull(16) |
| | | obdAcceleratorPedal = dataList[1].toIntOrNull(16)?.toDouble()?.times(0.4)?.div(100) |
| | | obdTotalOilConsumption = "${dataList[2]}${dataList[3]}${dataList[4]}${dataList[5]}".toIntOrNull(16)?.toDouble()?.times(0.5) |
| | | with("${dataList[2]}${dataList[3]}${dataList[4]}${dataList[5]}") { |
| | | obdTotalOilConsumption = if (toUpperCase() == INVALID_DATA_4_BYTE) -1.0 else toBigIntegerOrNull(16)?.toDouble()?.times(0.5) |
| | | } |
| | | obdUreaBoxTemp = dataList[6].toIntOrNull(16)?.toDouble()?.minus(40) |
| | | obdUreaVolume = "${dataList[7]}${dataList[8]}${dataList[9]}${dataList[10]}".toIntOrNull(16)?.toDouble()?.times(0.01) |
| | | obdTotalUreaConsume = "${dataList[11]}${dataList[12]}${dataList[13]}${dataList[14]}".toIntOrNull(16)?.toDouble() |
| | | obdDpfTemp = "${dataList[15]}${dataList[16]}".toIntOrNull(16)?.minus(273)?.toDouble()?.times(0.03125) |
| | | with("${dataList[7]}${dataList[8]}${dataList[9]}${dataList[10]}") { |
| | | obdUreaVolume = if (toUpperCase() == INVALID_DATA_4_BYTE) -1.0 else toBigIntegerOrNull(16)?.toDouble()?.times(0.01) |
| | | } |
| | | with("${dataList[11]}${dataList[12]}${dataList[13]}${dataList[14]}") { |
| | | obdTotalUreaConsume = if (toUpperCase() == INVALID_DATA_4_BYTE) -1.0 else toBigIntegerOrNull(16)?.toDouble() |
| | | } |
| | | obdDpfTemp = "${dataList[15]}${dataList[16]}".toIntOrNull(16)?.times(0.03125)?.minus(273) |
| | | } |
| | | } else { |
| | | null |
| | |
| | | when (list[0].toIntOrNull(16)) { |
| | | ObdDataType.ObdData.value -> { |
| | | |
| | | //从起始字节 1 开始,固定有97个字节的数据 |
| | | for (i in 1..96) { |
| | | resultList.add(list[i]) |
| | | } |
| | | |
| | | val faultCodeNum = list[96].toIntOrNull() ?: 0//故障码总数 |
| | | //根据故障码总数,每个故障码4个字节,得到故障码总字节数 |
| | | if (faultCodeNum in 0..253) { |
| | | for (i in 97..(96 + faultCodeNum * 4)) { |
| | | if (list.size >= 97) { |
| | | //从起始字节 1 开始,固定有96个字节的数据 |
| | | for (i in 1..96) { |
| | | resultList.add(list[i]) |
| | | } |
| | | |
| | | val faultCodeNum = list[96].toIntOrNull() ?: 0//故障码总数 |
| | | //根据故障码总数,每个故障码4个字节,得到故障码总字节数 |
| | | if (faultCodeNum in 0..253) { |
| | | for (i in 97..(96 + faultCodeNum * 4)) { |
| | | resultList.add(list[i]) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | ObdDataType.EngineDataFlow.value -> { |
| | | |
| | | //从起始字节 1 开始,固定有37个字节的数据 |
| | | for (i in 1..37) { |
| | | resultList.add(list[i]) |
| | | if (list.size >= 38) { |
| | | //从起始字节 1 开始,固定有37个字节的数据 |
| | | for (i in 1..37) { |
| | | resultList.add(list[i]) |
| | | } |
| | | } |
| | | } |
| | | ObdDataType.SupplementDataFlow.value -> { |
| | | |
| | | //从起始字节 1 开始,固定有17个字节的数据 |
| | | for (i in 1..17) { |
| | | resultList.add(list[i]) |
| | | if (list.size>= 18) { |
| | | //从起始字节 1 开始,固定有17个字节的数据 |
| | | for (i in 1..17) { |
| | | resultList.add(list[i]) |
| | | } |
| | | } |
| | | } |
| | | } |