riku
2019-09-23 14ce5d2ccfae554497763da846ffb9eb39cd6d34
src/main/kotlin/com/flightfeather/obd/socket/decoder/impl/RealTimeDataDecoderImpl.kt
@@ -1,5 +1,6 @@
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
@@ -72,25 +73,31 @@
        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
@@ -108,11 +115,17 @@
            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
@@ -131,31 +144,37 @@
        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])
                    }
                }
            }
        }