package com.dayu.general.bean.card
|
|
import com.dayu.baselibrary.tools.HexUtil
|
import java.io.Serializable
|
|
/**
|
* 调试卡
|
* 主要用于安装调试用:
|
* 1. 第一次刷卡时开启水泵或阀门
|
* 2. 第二次刷卡关闭水泵或阀门
|
* 3. 刷卡开启后1分钟内没有刷卡关闭,则自动关闭水泵或阀门
|
*/
|
class DebugCard : BaseCard(), Serializable {
|
companion object {
|
const val CARD_TYPE = "B4" // 卡类型:调试卡
|
const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 识别码A0
|
const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 识别码B1
|
const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 识别码C2
|
const val IDENTIFY_CODE_89 = 0x89.toByte() // 识别码89
|
|
const val AUTO_CLOSE_TIMEOUT = 60_000L // 自动关闭超时时间(1分钟)
|
}
|
|
private var pumpOpenTime: Long = 0L // 水泵开启时间
|
private var isPumpOpen: Boolean = false // 水泵状态
|
|
/**
|
* 写卡完成后校验是否写卡成功
|
*/
|
fun equalsDebugCard(data: List<ByteArray>?): Boolean {
|
if (data == null || data.isEmpty()) {
|
return false
|
}
|
return data[0].contentEquals(getZeroBytes())
|
}
|
|
/**
|
* 通过byte转bean
|
*/
|
fun getBean(data: List<ByteArray>): DebugCard? {
|
try {
|
val debugCard = DebugCard()
|
// 解析第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
|
}
|
|
return debugCard
|
} 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位)
|
data[13] = 0x00
|
data[14] = 0x00
|
|
// 设置校验和(15位)
|
data[15] = getByteSum(data)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return data
|
}
|
}
|
|
/**
|
* 切换水泵状态
|
* @return 当前水泵状态
|
*/
|
fun togglePumpState(): Boolean {
|
val currentTime = System.currentTimeMillis()
|
|
if (!isPumpOpen) {
|
// 开启水泵
|
isPumpOpen = true
|
pumpOpenTime = currentTime
|
} else {
|
// 关闭水泵
|
isPumpOpen = false
|
pumpOpenTime = 0L
|
}
|
|
return isPumpOpen
|
}
|
|
/**
|
* 检查是否需要自动关闭水泵
|
* @return true 如果需要自动关闭,false 否则
|
*/
|
fun shouldAutoClose(): Boolean {
|
if (!isPumpOpen) return false
|
|
val currentTime = System.currentTimeMillis()
|
return currentTime - pumpOpenTime >= AUTO_CLOSE_TIMEOUT
|
}
|
|
/**
|
* 自动关闭水泵
|
*/
|
fun autoClosePump() {
|
isPumpOpen = false
|
pumpOpenTime = 0L
|
}
|
|
/**
|
* 获取水泵状态
|
*/
|
fun isPumpOpen(): Boolean = isPumpOpen
|
|
/**
|
* 获取水泵开启剩余时间(毫秒)
|
* @return 剩余时间,如果水泵关闭则返回0
|
*/
|
fun getRemainingTime(): Long {
|
if (!isPumpOpen) return 0L
|
|
val currentTime = System.currentTimeMillis()
|
val remainingTime = AUTO_CLOSE_TIMEOUT - (currentTime - pumpOpenTime)
|
return if (remainingTime > 0) remainingTime else 0L
|
}
|
|
fun getZeroBytes(): ByteArray = Zero().toBytes()
|
}
|