diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/cmd/CalibrationCmd.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/cmd/CalibrationCmd.kt new file mode 100644 index 0000000..4adbe76 --- /dev/null +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/cmd/CalibrationCmd.kt @@ -0,0 +1,55 @@ +package com.yinuo.safetywatcher.watcher.port.cmd + +/** + * 校准命令 + * @param index 传感器编号 00 01 02 03 + * @param target 目标值 + */ +class CalibrationCmd(private val index: Int, private val target: Int) { + val ZERO = 0x87.toByte() + val SPAN = 0x88.toByte() + + fun buildZeroCmd(): ByteArray { + return build(ZERO) + } + + fun buildSPANCmd(): ByteArray { + return build(SPAN) + } + + private fun build(cmd: Byte): ByteArray { + var highBit: Byte = 0x00 + var lowBit: Byte = 0x00 + if (index != 0) { + highBit = (target shr 8 and FF).toByte() + lowBit = (target and FF).toByte() + } + return byteArrayOf( + 0xFF.toByte(), + index.toByte(), + cmd, + highBit, + lowBit, + 0x00, + 0x00, + 0x00 + ).calibrationSum() + } +} + +private fun ByteArray.calibrationSum(): ByteArray { + return this.plus(getCheckSum(this)) +} + +fun getCheckSum(packet: ByteArray): Byte { + var checksum = 0 + for (i in packet.indices) { + if (i in 1..7) { + checksum += packet[i] + } + } + checksum = 0xffff - checksum + checksum += 1 + return checksum.toByte() +} +