package com.dayu.general.bean.card
|
|
import com.dayu.baselibrary.tools.HexUtil
|
import com.dayu.general.tool.CardCommon.Companion.VALVE_TIME_CARD
|
import java.io.Serializable
|
|
/**
|
* 配置开关阀时间卡
|
* 主要用于内部生产调试用,设置开关阀时间
|
*/
|
class ValveTimeCard : BaseCard(), Serializable {
|
companion object {
|
const val CARD_TYPE = VALVE_TIME_CARD // 卡类型:配置开关阀时间卡
|
}
|
|
var valveTime: Int = 0 // 开关阀时间(秒)
|
|
/**
|
* 写卡完成后校验是否写卡成功
|
*/
|
fun equalsValveTimeCard(data: List<ByteArray>?): Boolean {
|
if (data == null || data.isEmpty()) {
|
return false
|
}
|
return data[0].contentEquals(getZeroBytes())
|
}
|
|
/**
|
* 通过byte转bean
|
*/
|
fun getBean(data: List<ByteArray>): ValveTimeCard? {
|
try {
|
val valveTimeCard = ValveTimeCard()
|
// 解析第0块
|
val zero = data[0]
|
|
// 验证卡类型(8位)
|
if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
|
return null
|
}
|
|
// 验证识别码(9-12位)
|
if (zero[9] != IDENTIFY_CODE_A0 ||
|
zero[10] != IDENTIFY_CODE_B1 ||
|
zero[11] != IDENTIFY_CODE_C2 ||
|
zero[12] != IDENTIFY_CODE_89) {
|
return null
|
}
|
|
// 解析开关阀时间(13-14位)
|
val timeBytes = byteArrayOf(zero[13], zero[14])
|
valveTimeCard.valveTime = HexUtil.get16To10LowHightByBytes(timeBytes)
|
|
return valveTimeCard
|
} catch (e: Exception) {
|
e.printStackTrace()
|
return null
|
}
|
}
|
|
/**
|
* 生成第0块数据
|
*/
|
inner class Zero : BaseCard() {
|
fun toBytes(): ByteArray {
|
val data = ByteArray(16)
|
try {
|
// 设置备用位(0-7位)
|
for (i in 0..7) {
|
data[i] = 0x00
|
}
|
|
// 设置卡类型(8位)
|
data[8] = HexUtil.hexToByte(CARD_TYPE)
|
|
// 设置识别码(9-12位)
|
data[9] = IDENTIFY_CODE_A0
|
data[10] = IDENTIFY_CODE_B1
|
data[11] = IDENTIFY_CODE_C2
|
data[12] = IDENTIFY_CODE_89
|
|
// 设置开关阀时间(13-14位),低位在前高位在后
|
val timeBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(valveTime))
|
if (timeBytes.size >= 2) {
|
data[13] = timeBytes[0] // 低位
|
data[14] = timeBytes[1] // 高位
|
}
|
|
// 设置校验和(15位)
|
data[15] = getByteSum(data)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return data
|
}
|
}
|
|
/**
|
* 验证开关阀时间是否有效
|
* @return true 如果时间有效,false 否则
|
*/
|
fun isValidValveTime(): Boolean {
|
return valveTime > 0 && valveTime <= 65535 // 两个字节最大值
|
}
|
|
/**
|
* 获取开关阀时间的十六进制字符串表示
|
* @return 十六进制字符串,如"0087"表示135秒
|
*/
|
fun getValveTimeHex(): String {
|
return String.format("%04X", valveTime)
|
}
|
|
fun getZeroBytes(): ByteArray = Zero().toBytes()
|
}
|