package com.flightfeather.uav.socket.decoder.impl
|
|
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.AirCommandUnit
|
import java.util.*
|
import kotlin.text.StringBuilder
|
|
/**
|
* @author riku
|
* Date: 2019/9/12
|
*/
|
class DataPackageDecoderImpl : DataPackageDecoder {
|
|
companion object {
|
// 数据头
|
const val HEAD_BYTES = 1
|
// 监测参数确认指令位
|
const val COMMAND_UNIT_BYTES = 1
|
// 设备类型
|
const val DEVICE_CODE_BYTES = 6
|
// 本次监测的空气因子数量
|
const val DATA_LENGTH = 1
|
// 校验
|
const val BCC_BYTES = 2
|
}
|
|
private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl()
|
|
|
override fun getHead(b: List<String>): String? {
|
return if (b.isNotEmpty()) {
|
val s = StringBuilder()
|
repeat(HEAD_BYTES) {
|
s.append(b[it])
|
}
|
s.toString()
|
} else {
|
null
|
}
|
}
|
|
override fun getCommandUnit(b: List<String>): Int? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES)) {
|
val s = StringBuilder()
|
repeat(COMMAND_UNIT_BYTES) {
|
s.append(b[HEAD_BYTES + it])
|
}
|
s.toString().toIntOrNull(16)
|
} else {
|
null
|
}
|
|
override fun getDeviceCode(b: List<String>): String? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES)) {
|
//2021/1/7 '0A'代表车载设备,'0B'代表无人机设备,'0C'为网格化监测
|
val s = StringBuilder()
|
repeat(DEVICE_CODE_BYTES) {
|
s.append(b[HEAD_BYTES + COMMAND_UNIT_BYTES + it])
|
}
|
s.toString()
|
} else {
|
null
|
}
|
|
override fun getDataTime(b: List<String>): Date {
|
// FIXME: 2021/1/7 采样时间和监测因子一同放在了数据部分,此处不再做解析
|
return Date()
|
}
|
|
override fun getDataLength(b: List<String>): Int {
|
if (b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) return 0
|
|
val hexNum = b[HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES]
|
|
return hexNum.toIntOrNull(16) ?: 0
|
}
|
|
override fun getDataUnit(b: List<String>): List<DataUnit> {
|
if (getDataLength(b) == 0 || b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) {
|
return emptyList()
|
}
|
|
val unit = mutableListOf<String>()
|
val start = HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH
|
for (i in start..b.size - 1 - BCC_BYTES) {
|
unit.add(b[i])
|
}
|
|
dataUnitDecoder.run {
|
return when (getCommandUnit(b)) {
|
AirCommandUnit.Confirm.value -> getAirConfirmData(unit, getDeviceCode(b))
|
AirCommandUnit.AirData.value -> getAirData(unit, getDeviceCode(b))
|
else -> emptyList()
|
}
|
}
|
}
|
|
override fun getCheckCode(b: List<String>): Int? {
|
return if (b.size >= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + BCC_BYTES) {
|
val hexNum = "${b[b.size - 2]}${b[b.size - 1]}"
|
|
hexNum.toIntOrNull(16)
|
} else {
|
null
|
}
|
}
|
|
override fun toStringList(msg: String): List<String> {
|
return msg.split(" ")
|
}
|
|
}
|