From 8fc27dba6719041402e3e3c099e2f3e01d9d52c7 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 16 七月 2025 17:30:56 +0800
Subject: [PATCH] 2025.7.16 1. 修改动态溯源异常判断逻辑
---
src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt | 99 +++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 90 insertions(+), 9 deletions(-)
diff --git a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt
index 8740c9c..27149c5 100644
--- a/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt
+++ b/src/main/kotlin/com/flightfeather/uav/socket/decoder/DataPackageDecoder.kt
@@ -16,22 +16,103 @@
* 2 鏁版嵁鍗曞厓闀垮害
* 鍊掓暟绗�2 鏍¢獙鐮�
*/
-interface DataPackageDecoder {
+class DataPackageDecoder {
- fun getHead(b: List<String>): String?
+ 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
+ }
- fun getCommandUnit(b: List<String>): Int?
+ private val dataUnitDecoder: DataUnitDecoder = DataUnitDecoder()
- fun getDeviceCode(b: List<String>): String?
- fun getDataTime(b: List<String>): Date
+ fun getHead(b: List<String>): String? {
+ return if (b.isNotEmpty()) {
+ val s = StringBuilder()
+ repeat(HEAD_BYTES) {
+ s.append(b[it])
+ }
+ s.toString()
+ } else {
+ null
+ }
+ }
- fun getDataLength(b: List<String>): Int
+ 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
+ }
- fun getDataUnit(b: List<String>): List<DataUnit>
+ fun getDeviceCode(b: List<String>): String? = if (b.size >= (HEAD_BYTES + COMMAND_UNIT_BYTES + DEVICE_CODE_BYTES)) {
+ //2021/1/7 '0A'浠h〃杞﹁浇璁惧锛�'0B'浠h〃鏃犱汉鏈鸿澶囷紝'0C'涓虹綉鏍煎寲鐩戞祴
+ val s = StringBuilder()
+ repeat(DEVICE_CODE_BYTES) {
+ s.append(b[HEAD_BYTES + COMMAND_UNIT_BYTES + it])
+ }
+ s.toString()
+ } else {
+ null
+ }
- fun getCheckCode(b: List<String>): Int?
+ fun getDataTime(b: List<String>): Date {
+ // FIXME: 2021/1/7 閲囨牱鏃堕棿鍜岀洃娴嬪洜瀛愪竴鍚屾斁鍦ㄤ簡鏁版嵁閮ㄥ垎锛屾澶勪笉鍐嶅仛瑙f瀽
+ return Date()
+ }
- fun toStringList(msg: String): List<String>
+ 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
+ }
+
+ 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()
+ }
+ }
+ }
+
+ 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
+ }
+ }
+
+ fun toStringList(msg: String): List<String> {
+ return msg.split(" ")
+ }
+
}
\ No newline at end of file
--
Gitblit v1.9.3