From 09f411e381f885619b32e05fc89cad26bb20824d Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期一, 01 三月 2021 14:27:56 +0800
Subject: [PATCH] Merge remote-tracking branch 'obdserver2/master'

---
 src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt |   49 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt b/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt
index 66ade0c..deadf89 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/impl/DataPackageDecoderImpl.kt
@@ -5,6 +5,7 @@
 import com.flightfeather.uav.socket.decoder.DataUnitDecoder
 import com.flightfeather.uav.socket.eunm.AirCommandUnit
 import java.util.*
+import kotlin.text.StringBuilder
 
 /**
  * @author riku
@@ -12,54 +13,78 @@
  */
 class DataPackageDecoderImpl : DataPackageDecoder {
 
+    companion object {
+        const val HEAD_BYTES = 1
+        const val COMMAND_UNIT_BYTES = 1
+        const val DEVICE_CODE_BYTES = 1
+        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()) {
-            b[0]
+            val s = StringBuilder()
+            repeat(HEAD_BYTES) {
+                s.append(b[it])
+            }
+            s.toString()
         } else {
             null
         }
     }
 
-    override fun getCommandUnit(b: List<String>): Int? = if (b.size >= 2) {
-        b[1].toIntOrNull(16)
+    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? {
-        return null
+    override fun getDeviceCode(b: List<String>): String? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES)) {
+        //2021/1/7 '0A'浠h〃杞﹁浇璁惧锛�'0B'浠h〃鏃犱汉鏈鸿澶�
+        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 2020/06/11  鐩墠鏁版嵁娴佷腑涓嶅寘鍚噰鏍锋椂闂达紝鎵�浠ラ噰鐢ㄦ湇鍔″櫒鎺ユ敹鏃堕棿浣滀负閲囨牱鏃堕棿
+        // FIXME: 2021/1/7 閲囨牱鏃堕棿鍜岀洃娴嬪洜瀛愪竴鍚屾斁鍦ㄤ簡鏁版嵁閮ㄥ垎锛屾澶勪笉鍐嶅仛瑙f瀽
         return Date()
     }
 
     override fun getDataLength(b: List<String>): Int {
-        if (b.size < 5) return 0
+        if (b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) return 0
 
-        val hexNum = b[2]
+        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 < 5) {
+        if (getDataLength(b) == 0 || b.size <= HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES + DATA_LENGTH) {
             return emptyList()
         }
 
         val unit = mutableListOf<String>()
-        for (i in 3..b.size - 3) {
+        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)
-                AirCommandUnit.AirData.value -> getAirData(unit)
+                AirCommandUnit.Confirm.value -> getAirConfirmData(unit, getDeviceCode(b))
+                AirCommandUnit.AirData.value -> getAirData(unit, getDeviceCode(b))
                 else -> emptyList()
             }
         }

--
Gitblit v1.9.3