riku
2020-07-15 25d0f31f22f77a914a50bbc088902e00e28c4889
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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.*
 
/**
 * @author riku
 * Date: 2019/9/12
 */
class DataPackageDecoderImpl : DataPackageDecoder {
 
    private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoderImpl()
 
 
    override fun getHead(b: List<String>): String? {
        return if (b.isNotEmpty()) {
            b[0]
        } else {
            null
        }
    }
 
    override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 2) {
        b[1].toIntOrNull(16)
    } else {
        null
    }
 
    override fun getDeviceCode(b: List<String>): String? {
        return null
    }
 
    override fun getDataTime(b: List<String>): Date {
        //fixme 2020/06/11  目前数据流中不包含采样时间,所以采用服务器接收时间作为采样时间
        return Date()
    }
 
    override fun getDataLength(b: List<String>): Int {
        if (b.size < 5) return 0
 
        val hexNum = b[2]
 
        return hexNum.toIntOrNull(16) ?: 0
    }
 
    override fun getDataUnit(b: List<String>): List<DataUnit> {
        if (getDataLength(b) == 0 || b.size < 5) {
            return emptyList()
        }
 
        val unit = mutableListOf<String>()
        for (i in 3..b.size - 3) {
            unit.add(b[i])
        }
 
        dataUnitDecoder.run {
            return when (getCommandUnit(b)) {
                AirCommandUnit.Confirm.value -> getAirConfirmData(unit)
                AirCommandUnit.AirData.value -> getAirData(unit)
                else -> emptyList()
            }
        }
    }
 
    override fun getCheckCode(b: List<String>): Int? {
        return if (b.size >= 5) {
            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(" ")
    }
 
}