整体调用案例(带称重,无需称重一样适用)

package com.wate.cellcabinet.data.serialport


import com.omgwate.cabinet.modbus.biz.BotuWeightManager
import com.omgwate.cabinet.modbus.biz.WeightRequest
import com.omgwate.cabinet.modbus.biz.WeightResponse
import com.omgwate.cabinet.serialport.biz.SienDoorEventListener
import com.omgwate.cabinet.serialport.biz.SienDoorManager
import com.omgwate.cabinet.serialport.biz.command.recv.RecvSienCheckDoors
import com.omgwate.cabinet.serialport.biz.command.recv.RecvSienInfoDoor
import com.omgwate.cabinet.serialport.biz.command.recv.RecvSienOpenDoor
import com.omgwate.cabinet.serialport.biz.command.send.SendSienCheckDoors
import com.omgwate.cabinet.serialport.biz.command.send.SendSienOpenDoor
import com.omgwate.cabinet.serialport.biz.command.send.SendSienOpenDoors
import com.omgwate.cabinet.serialport.core.Callback
import com.wate.cellcabinet.data.model.message.DoorStatusChangeInfo
import com.wate.cellcabinet.data.model.message.MessageEvent
import com.wate.cellcabinet.util.AppConstants
import com.wate.cellcabinet.util.LogUtil
import org.greenrobot.eventbus.EventBus

class CabinetSerialPort private constructor() : SienDoorEventListener {


companion object{
@JvmStatic
private var cabinetSerialPort:CabinetSerialPort? = null
@JvmStatic
fun getInstance():CabinetSerialPort{
if(cabinetSerialPort == null){
synchronized(CabinetSerialPort::class.java){
if(cabinetSerialPort == null){
cabinetSerialPort = CabinetSerialPort()
}
}
}
return cabinetSerialPort!!
}
}



/**
* 获取某一个货道的重量
*/
fun getCellWeight(cabinetAddress:Int, cellAddress:Int,success:(weight:Int) ->Unit,fail:(error:String) ->Unit){

LogUtil.printErr("test","称重 -- ${cabinetAddress} -- $cellAddress")

val ok = BotuWeightManager.get()
.sendCheckWeightCommand(WeightRequest(cabinetAddress, cellAddress), object : Callback<WeightResponse?> {
override fun onSuccess(weightResponse: WeightResponse?) {

if(weightResponse == null || weightResponse.data == null){
LogUtil.printErr("test","!!!!!! ${cabinetAddress} -- $cellAddress -- 称重结果返回null")
}

LogUtil.printErr("test","$cabinetAddress -- $cellAddress -- 重量:${weightResponse!!.data}")
success(weightResponse!!.data.toInt())
}

override fun onFailure(tr: Throwable) {
LogUtil.printErr("test","$cabinetAddress -- $cellAddress -- 重量获取失败,onFailure")
tr.message?.let {
fail(it)
}
}
})

if(!ok){
LogUtil.printErr("test","$cabinetAddress -- $cellAddress -- 重量获取失败,指令发送失败")
fail("硬件初始化错误")
}
}

/**
* 将某一个货道重量调0
* 暂时用不到
*/
@Deprecated("暂时用不到")
fun initWeightByDoorNum(doorNum:Int,success: () -> Unit,fail:(error:String) ->Unit){

}

/**
* 打开单个门
*/
@Deprecated("批量支持单个")
fun openDoor(cabinetAddress:Int, cellAddress:Int,success: () -> Unit,fail:(error:String) ->Unit){

val command = SendSienOpenDoor(cabinetAddress,cellAddress)

LogUtil.printErr("test","打开-- $cabinetAddress -- $cellAddress")

val ok = SienDoorManager.get().sendOpenDoorCommand(command, object : Callback<RecvSienOpenDoor>{
override fun onSuccess(recvCommand: RecvSienOpenDoor?) {
if(recvCommand == null){
fail("获取开门结果失败")
} else {
LogUtil.printErr("test","$cabinetAddress -- $cellAddress -- 打开成功")
if(recvCommand.result){
success()
} else{
fail("开门失败")
}
}
}

override fun onFailure(tr: Throwable) {
LogUtil.printErr("test",tr.toString())
LogUtil.printErr("test","$cabinetAddress -- $cellAddress -- 打开失败")
val message = if(tr.message == null) {
"打开失败"
} else {
tr.message!!
}
fail(message)
}
})

if(!ok){
fail("硬件初始化错误")
}
}

/**
* 批量打开1个柜的门
*/
fun batchOpenDoor(cabinetAddress:Int, cellAddressList:List<Int>, success: (result: Map<Int, Boolean>) -> Unit, fail:(error:String) ->Unit){
if(cellAddressList.size > 10) {
fail("请勿同时打开10个柜门以上!")
}
val command = SendSienOpenDoors(cabinetAddress, cellAddressList.toIntArray())
val ok = SienDoorManager.get().sendOpenDoorsCommand(command,object :Callback<RecvSienCheckDoors>{
override fun onSuccess(recvCommand: RecvSienCheckDoors?) {
val resultMap: Map<Int, Boolean> = recvCommand!!.getResultMap(AppConstants.getCellNumByCabinetAddress(recvCommand.address))
for(cellAddress: Int in cellAddressList) {
if(resultMap[cellAddress] != true) {
fail(AppConstants.convertCabinetAddressToName(cabinetAddress) + " " + cellAddress + "号打开失败")
return
}
}
success(resultMap)
}

override fun onFailure(tr: Throwable) {
val message = if(tr.message == null) {
"打开失败"
} else {
tr.message!!
}
fail(message)
}

})
if(!ok){
fail("硬件初始化错误")
}

}

/**
* 检查1个货柜所有门的打开状态
*/
fun checkDoorStatus(cabinetAddress:Int,success: (resultMap:Map<Int,Boolean>) -> Unit,fail:(error:String) ->Unit){


val command = SendSienCheckDoors(cabinetAddress)
val sendSuccess = SienDoorManager.get().sendCheckDoorsCommand(command,object : Callback<RecvSienCheckDoors>{
override fun onSuccess(recvSienCheckDoors: RecvSienCheckDoors?) {
val resultMap = HashMap<Int,Boolean>()
LogUtil.printErr("checkDoorStatus","查询柜门开关状态指令onSuccess")
for (i in 1..AppConstants.getCellNumByCabinetAddress(cabinetAddress)){
resultMap[i] = recvSienCheckDoors!!.getResult(i)
LogUtil.printErr("checkDoorStatus","$i -- ${recvSienCheckDoors.getResult(i)}")
//LogUtil.printErr("test")
}
//LogUtil.printErr("test","$cabinetAddress -- $cellAddress -- 打开成功")
success(resultMap)
}

override fun onFailure(tr: Throwable) {
LogUtil.printErr("checkDoorStatus","查询柜门开关状态指令onFailure")
val message = if(tr.message == null) {
"失败"
} else {
tr.message!!
}
fail(message)
}

})
if(!sendSuccess){
LogUtil.printErr("checkDoorStatus","查询柜门开关状态指令发送失败")
fail("查询柜门指令发送失败")
}

}




/**
* 初始化称重管理器
*/
fun initWeightManager(){
BotuWeightManager.get().initDevice(null)
BotuWeightManager.get().enableLog(true)
val cabinetAddressArray = AppConstants.getCabinetAddressArray()
var startIndex = 1
for((index,value) in cabinetAddressArray.withIndex()){
val cellNum = AppConstants.getCellNumByCabinetAddress(value)
BotuWeightManager.get().mapAddress(value, startIndex, cellNum)
startIndex += cellNum
}
}

/**
* 初始化门锁管理器
*/
fun initDoorManager(){
SienDoorManager.get().initDevice(null)
SienDoorManager.get().setDoorEventListener(this)
SienDoorManager.get().enableLog(true)
}

/**
* 释放称重管理器
*/
fun releaseWeightManager(){
BotuWeightManager.get().release()
}

/**
* 释放门锁管理器
*/
fun releaseDoorManager(){
SienDoorManager.get().release()
}


/**
* 获取到门锁状态回调
*/
override fun onReceiveState(p0: RecvSienInfoDoor?) {
p0?.let {
//result 关门为false
LogUtil.printErr("test","onReceiveState -- ${it.address} -- ${it.lockNum} -- ${it.result}")
val messageEvent = MessageEvent(MessageEvent.MSG_CELL_DOOR_STATUS_CHANGE)
val doorStatusChangeInfo = DoorStatusChangeInfo(!it.result,it.address,it.lockNum)
messageEvent.obj = doorStatusChangeInfo
EventBus.getDefault().post(messageEvent)
}
}
}