package com.flightfeather.obd.socket.decoder.impl
|
|
import com.flightfeather.obd.socket.bean.DataUnit
|
import com.flightfeather.obd.socket.decoder.DataPackageDecoder
|
import com.flightfeather.obd.socket.decoder.DataUnitDecoder
|
import com.flightfeather.obd.socket.eunm.ObdCommandUnit
|
|
/**
|
* @author riku
|
* Date: 2019/9/12
|
*/
|
class DataPackageDecoderImpl : DataPackageDecoder {
|
|
private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl()
|
|
//fixme 2019.9.12: 现在有两种情况,1:接收到的字符串是byte转码前的,那么其就表示字符的ASCII码;2:另一种就是接收到的是转码后的字符串。目前待定
|
|
override fun getHead(b: List<String>): String? {
|
return if (b.size >= 2) {
|
"${b[0]}${b[1]}"
|
} else {
|
null
|
}
|
}
|
|
override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 3) {
|
b[2].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 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 getDataLength(b: List<String>): Int {
|
if (b.size < 24) return 0
|
|
val hexNum = "${b[22]}${b[23]}"
|
|
return hexNum.toIntOrNull(16) ?: 0
|
}
|
|
override fun getDataUnit(b: List<String>): List<DataUnit> {
|
if (getDataLength(b) == 0 || b.size < 26) {
|
return emptyList()
|
}
|
|
val unit = mutableListOf<String>()
|
for (i in 24..b.size - 2) {
|
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)
|
else -> emptyList()
|
}
|
}
|
}
|
|
override fun getCheckCode(b: List<String>): Int? {
|
return if (b.isNotEmpty()) {
|
b[b.size - 1].toIntOrNull(16)
|
} else {
|
null
|
}
|
}
|
|
override fun toStringList(msg: String): List<String> {
|
return msg.split(" ")
|
}
|
|
}
|