riku
2020-06-11 585fb9b67dc81f9e14f2cbf59f1c3a02eb4fe98f
src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt
@@ -3,7 +3,8 @@
import com.flightfeather.uav.socket.bean.DataUnit
import com.flightfeather.uav.socket.decoder.DataPackageDecoder
import com.flightfeather.uav.socket.decoder.DataUnitDecoder
import com.flightfeather.uav.socket.eunm.ObdCommandUnit
import com.flightfeather.uav.socket.eunm.AirCommandUnit
import java.util.*
/**
 * @author riku
@@ -13,79 +14,62 @@
    private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl()
    // 接收到的字符串是byte转码前的,其就表示字符的ASCII码;
    override fun getHead(b: List<String>): String? {
        return if (b.size >= 2) {
            "${b[0]}${b[1]}"
        return if (b.isNotEmpty()) {
            b[0]
        } else {
            null
        }
    }
    override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 3) {
        b[2].toIntOrNull(16)
    override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 2) {
        b[1].toIntOrNull(16)
    } else {
        null
    }
    override fun getVinCode(b: List<String>): String? {
        if (b.size < 20) return null
        //fixme 应该是需要将b当作ASCII码,再获取转换后的字符串
        val s = StringBuilder()
        for (i in 3..19) {
            s.append(b[i].toIntOrNull(16)?.toChar())
        }
        return s.toString()
    override fun getDeviceCode(b: List<String>): String? {
        return null
    }
    override fun getSoftwareVersion(b: List<String>): Int? = if (b.size >= 21) {
        b[20].toIntOrNull(16)
    } else {
        null
    }
    override fun getEncryptionWay(b: List<String>): Int? = if (b.size >= 21) {
        b[21].toIntOrNull(16)
    } else {
        null
    override fun getDataTime(b: List<String>): Date {
        //fixme 2020/06/11  目前数据流中不包含采样时间,所以采用服务器接收时间作为采样时间
        return Date()
    }
    override fun getDataLength(b: List<String>): Int {
        if (b.size < 24) return 0
        if (b.size < 5) return 0
        val hexNum = "${b[22]}${b[23]}"
        val hexNum = b[2]
        return hexNum.toIntOrNull(16) ?: 0
    }
    override fun getDataUnit(b: List<String>): List<DataUnit> {
        if (getDataLength(b) == 0 || b.size < 26) {
        if (getDataLength(b) == 0 || b.size < 5) {
            return emptyList()
        }
        val unit = mutableListOf<String>()
        for (i in 24..b.size - 2) {
        for (i in 3..b.size - 3) {
            unit.add(b[i])
        }
        dataUnitDecoder.run {
            return when (getCommandUnit(b)) {
                ObdCommandUnit.CarRegister.value -> getCarRegisterData(unit)
                ObdCommandUnit.RealTimeData.value -> getRealTimeData(unit)
                ObdCommandUnit.ReplacementData.value -> getReplacementData(unit)
                ObdCommandUnit.CarLogOut.value -> getCarLogOutData(unit)
                ObdCommandUnit.TimeCalibration.value -> getTimeCalibrationData(unit)
                AirCommandUnit.Confirm.value -> getAirConfirmData(unit)
                AirCommandUnit.AirData.value -> getAirData(unit)
                else -> emptyList()
            }
        }
    }
    override fun getCheckCode(b: List<String>): Int? {
        return if (b.isNotEmpty()) {
            b[b.size - 1].toIntOrNull(16)
        return if (b.size >= 5) {
            val hexNum = "${b[b.size - 2]}${b[b.size - 1]}"
            hexNum.toIntOrNull(16)
        } else {
            null
        }