package com.flightfeather.uav.socket.decoder.impl
|
|
import com.flightfeather.uav.socket.bean.AirData
|
import com.flightfeather.uav.socket.bean.AirDataPackage
|
import com.flightfeather.uav.socket.bean.AirTypeData
|
import com.flightfeather.uav.socket.decoder.DataUnitDecoder
|
import com.flightfeather.uav.socket.eunm.FactorType
|
import org.slf4j.LoggerFactory
|
import java.text.SimpleDateFormat
|
|
/**
|
* @author riku
|
* Date: 2019/9/15
|
*/
|
class DataUnitDecoderImpl : DataUnitDecoder {
|
|
private val logger = LoggerFactory.getLogger(javaClass.name)
|
|
private val types = mutableMapOf<String?, MutableList<AirTypeData>>()
|
|
override fun getAirConfirmData(b: List<String>, deviceCode: String?): List<AirTypeData> {
|
val resultList = mutableListOf<AirTypeData>()
|
b.forEach {
|
FactorType.getByIndex(it.toInt(16))?.let { f->
|
resultList.add(AirTypeData(f))
|
}
|
}
|
if (!types.containsKey(deviceCode)) {
|
types[deviceCode] = mutableListOf()
|
}
|
types[deviceCode]?.clear()
|
types[deviceCode]?.addAll(resultList)
|
|
return resultList
|
}
|
|
override fun getAirData(b: List<String>, deviceCode: String?): List<AirData> {
|
val resultList = mutableListOf<AirData>()
|
|
if (!types.containsKey(deviceCode)) {
|
return resultList
|
}
|
|
var i = 0
|
types[deviceCode]?.forEach {
|
if (i > b.size - it.factorType.byteLength) {
|
return@forEach
|
}
|
|
when (it.factorType) {
|
FactorType.LNG -> {
|
val valid = b[i].toInt(16).toChar()//经纬度是否有效(有效: A; 无效: V)
|
|
//经纬度原始值,例:121°30.0411′,其中 121 对应a1,30对应b1,04对应b2,11对应b3
|
val a1 = b[i + 1].toInt(16)//度
|
val b1 = b[i + 2].toInt(16)//分(整数)
|
var b2 = b[i + 3].toInt(16).toDouble()//分(小数部分前两位)
|
var b3 = b[i + 4].toInt(16).toDouble()//分(小数部分后两位)
|
|
// var b2 = "${b[i + 3]}${b[i + 4]}".toInt(16).toDouble()
|
b2 /= 100
|
b3 /= 10000
|
val lng = a1 + (b1 + b2 + b3) / 60
|
val s = b[i + 5].toInt(16).toChar()
|
|
resultList.add(AirData().apply {
|
factorId = it.factorType.value?.toString()
|
factorName = it.factorType.des
|
factorData = lng
|
statusList = listOf(valid.toString(), s.toString())
|
})
|
}
|
FactorType.LAT -> {
|
val a1 = b[i].toInt(16)
|
val b1 = b[i + 1].toInt(16)
|
var b2 = b[i + 2].toInt(16).toDouble()//分(小数部分前两位)
|
var b3 = b[i + 3].toInt(16).toDouble()//分(小数部分后两位)
|
|
b2 /= 100
|
b3 /= 10000
|
val lat = a1 + (b1 + b2 + b3) / 60
|
val s = b[i + 4].toInt(16).toChar()
|
resultList.add(AirData().apply {
|
factorId = it.factorType.value.toString()
|
factorName = it.factorType.des
|
factorData = lat
|
statusList = listOf(s.toString())
|
})
|
}
|
FactorType.TIME -> {
|
val year = b[i].toInt(16).toString().run { numberFormat(this) }
|
val month = b[i + 1].toInt(16).toString().run { numberFormat(this) }
|
val day = b[i + 2].toInt(16).toString().run { numberFormat(this) }
|
val hour = b[i + 3].toInt(16).toString().run { numberFormat(this) }
|
val minute = b[i + 4].toInt(16).toString().run { numberFormat(this) }
|
val second = b[i + 5].toInt(16).toString().run { numberFormat(this) }
|
val date = "20$year-$month-$day $hour:$minute:$second"
|
val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date).time
|
resultList.add(AirData().apply {
|
factorId = it.factorType.value.toString()
|
factorName = it.factorType.des
|
factorData = time.toDouble()
|
statusList = listOf(date)
|
})
|
}
|
else -> {
|
when (it.factorType.byteLength) {
|
AirDataPackage.FACTOR_BIT_LENGTH_2 -> {
|
val a1 = "${b[i]}${b[i + 1]}".toInt(16)
|
var b1 = b[i + 2].toInt(16).toDouble()
|
while (b1 >= 1) {
|
b1 /= 10
|
}
|
val data1 = a1 + b1
|
|
resultList.add(AirData().apply {
|
factorId = it.factorType.value?.toString()
|
factorName = it.factorType.des
|
factorData = data1
|
})
|
}
|
AirDataPackage.FACTOR_BIT_LENGTH_1 -> {
|
//数据实际值(3位字节表示)
|
val a1 = "${b[i]}${b[i + 1]}".toInt(16)
|
var b1 = b[i + 2].toInt(16).toDouble()
|
while (b1 >= 1) {
|
b1 /= 10
|
}
|
val data1 = a1 + b1
|
|
//数据物理量(3位字节表示)
|
val a2 = "${b[i+3]}${b[i + 4]}".toInt(16)
|
var b2 = b[i + 5].toInt(16).toDouble()
|
while (b2 >= 1) {
|
b2 /= 10
|
}
|
val data2 = a2 + b2
|
|
resultList.add(AirData().apply {
|
factorId = it.factorType.value?.toString()
|
factorName = it.factorType.des
|
factorData = data1
|
physicalQuantity = data2
|
})
|
}
|
AirDataPackage.FACTOR_BIT_LENGTH_3 -> {
|
val data = "${b[i]}${b[i + 1]}".toInt(16)
|
resultList.add(AirData().apply {
|
factorId = it.factorType.value.toString()
|
factorName = it.factorType.des
|
factorData = data.toDouble()
|
})
|
}
|
}
|
}
|
}
|
|
i += it.factorType.byteLength
|
}
|
|
return resultList
|
}
|
|
private fun numberFormat(num: String) =
|
if (num.length < 2) {
|
"0$num"
|
} else {
|
num
|
}
|
}
|